Files
Oliver Kieselbach 127d5c1173 Diagnosis: the page answers what happened, for every status with a verdict (D-356, D-357)
The diagnosis page is rebuilt on the server headline instead of rule
confidence: a verdict card per status and cause (culprit tiles, ESP
phases, what an unfinished enrollment still waits for), the
circumstances around it, the steps of the finding that explains it,
where the time went, all open findings grouped by role, team notes and
the deduplicated errors and warnings. It reuses the session page's hook
set, refetches the headline on live activity and opens for Failed,
Stalled, AwaitingUser, Incomplete and Succeeded with open findings, also
from read-only and cross-tenant views.

Rule text: lib/ruleText.ts prunes a finding's explanation and steps like
the notifications do (shared cases in tests/fixtures/rule-text-display,
also run by RuleTemplateInterpolator.InterpolateForNotification), then
parses the markdown and fills values into text nodes only. The session
page's analysis section, the rule card and the dry run render through it;
components/findings/EvidenceChips replaces the two evidence-link copies
and covers correlation pairs.

Vocabularies: DiagnosisPrerequisites names the engine's completion
prerequisites (manifest diagnosis.prerequisites, parity fact against
DecisionEngine.CompletionPrerequisites); the page's texts for every
diagnosis vocabulary are exhaustive over the manifest types.

Fixed on the way: useSessionSignalR held the first render's callbacks,
so ruleResultsReady was lost on an already connected hub; a deep link to
an event dropped its hash before the event loaded; the global analyze
rule update answered 500 for an invalid presentation (now 400); the
rule editor kept the presentation block on create and in JSON mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 02:30:29 +02:00

56 lines
2.1 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cases": [
{
"name": "a list item whose token was not recorded is dropped",
"text": "Facts:\n\n- **Reason:** `{{reason}}`\n- **ESP error code:** `{{errorCode}}`",
"matchedConditions": { "sig": { "field": "reason", "value": "esp_terminal_failure" } },
"expected": "Facts:\n\n- **Reason:** `esp_terminal_failure`"
},
{
"name": "a token in running text that was not recorded shows a dash",
"text": "The sweep closed this session after `{{timeoutHours}}` hour(s) of inactivity.",
"matchedConditions": {},
"expected": "The sweep closed this session after `–` hour(s) of inactivity."
},
{
"name": "a sentence about literal placeholders is removed, the rest of the line stays",
"text": "Check the app. Any field still shown as `{{…}}` was not recorded.",
"matchedConditions": {},
"expected": "Check the app."
},
{
"name": "blank runs left by a dropped item collapse and the text is trimmed",
"text": "First.\n\n- item {{x}}\n\n\nLast.\n",
"matchedConditions": {},
"expected": "First.\n\nLast."
},
{
"name": "numbered items are list items too",
"text": "1. Open {{appName}} in Intune\n2. Retry the enrollment",
"matchedConditions": {},
"expected": "2. Retry the enrollment"
},
{
"name": "recorded values fill list items and running text",
"text": "{{appName}} failed.\n\n- Starts: {{retry.count}}\n- Code: `{{errorCode}}`",
"matchedConditions": {
"failed": { "field": "appName", "value": "Contoso Notes", "errorCode": "0x80070652" },
"retry": { "count": 4 }
},
"expected": "Contoso Notes failed.\n\n- Starts: 4\n- Code: `0x80070652`"
},
{
"name": "windows line endings are normalized",
"text": "A.\r\nB {{x}}.",
"matchedConditions": {},
"expected": "A.\nB –."
},
{
"name": "a text without tokens passes unchanged",
"text": "**Bold** and `code`.\n\n- one\n- two",
"matchedConditions": null,
"expected": "**Bold** and `code`.\n\n- one\n- two"
}
]
}