{"numTotalTestSuites":54,"numPassedTestSuites":54,"numFailedTestSuites":0,"numPendingTestSuites":0,"numTotalTests":93,"numPassedTests":93,"numFailedTests":0,"numPendingTests":0,"numTodoTests":0,"snapshot":{"added":0,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0,"didUpdate":false},"startTime":1774529732949,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":["assistant answer encoding sanitizer"],"fullName":"assistant answer encoding sanitizer filters mojibake in explainable answer and falls back to readable reasoning","status":"passed","title":"filters mojibake in explainable answer and falls back to readable reasoning","duration":3.1196999999999946,"failureMessages":[],"meta":{}}],"startTime":1774529734212,"endTime":1774529734215.1196,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantAnswerEncodingSanitizer.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant answer leakage guard"],"fullName":"assistant answer leakage guard removes raw technical refs from assistant reply but keeps structured refs in answer structure","status":"passed","title":"removes raw technical refs from assistant reply but keeps structured refs in answer structure","duration":4.40979999999999,"failureMessages":[],"meta":{}}],"startTime":1774529734216,"endTime":1774529734220.41,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantAnswerLeakageGuard.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant answer policy v1.1"],"fullName":"assistant answer policy v1.1 keeps focused grounded answer direct and useful","status":"passed","title":"keeps focused grounded answer direct and useful","duration":432.7373,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant answer policy v1.1"],"fullName":"assistant answer policy v1.1 renders broad partial answer with explicit limitations and concrete next steps","status":"passed","title":"renders broad partial answer with explicit limitations and concrete next steps","duration":88.6262999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant answer policy v1.1"],"fullName":"assistant answer policy v1.1 uses domain-specific clarification prompts when support is insufficient","status":"passed","title":"uses domain-specific clarification prompts when support is insufficient","duration":72.67829999999981,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant answer policy v1.1"],"fullName":"assistant answer policy v1.1 does not fabricate mechanism when mechanism_note is unresolved","status":"passed","title":"does not fabricate mechanism when mechanism_note is unresolved","duration":0.5777000000000498,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant answer policy v1.1"],"fullName":"assistant answer policy v1.1 preserves legacy reply path when policy flag is OFF","status":"passed","title":"preserves legacy reply path when policy flag is OFF","duration":118.42880000000014,"failureMessages":[],"meta":{}}],"startTime":1774529733996,"endTime":1774529734708.4287,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantAnswerPolicyV11.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant broad guard"],"fullName":"assistant broad guard keeps focused queries from degrading under broad guard","status":"passed","title":"keeps focused queries from degrading under broad guard","duration":442.40610000000004,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant broad guard"],"fullName":"assistant broad guard degrades broad ranking output to partial instead of deceptively strong factual","status":"passed","title":"degrades broad ranking output to partial instead of deceptively strong factual","duration":88.59960000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant broad guard"],"fullName":"assistant broad guard returns clarification when broad query has insufficient support","status":"passed","title":"returns clarification when broad query has insufficient support","duration":73.13150000000019,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant broad guard"],"fullName":"assistant broad guard supports legacy behavior when broad guard flags are OFF","status":"passed","title":"supports legacy behavior when broad guard flags are OFF","duration":55.441299999999956,"failureMessages":[],"meta":{}}],"startTime":1774529733987,"endTime":1774529734646.4414,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantBroadGuard.test.ts"},{"assertionResults":[{"ancestorTitles":["stage1 contract scaffolding"],"fullName":"stage1 contract scaffolding provides rubric v0.1 for accountant-facing metrics","status":"passed","title":"provides rubric v0.1 for accountant-facing metrics","duration":1.2985999999999933,"failureMessages":[],"meta":{}},{"ancestorTitles":["stage1 contract scaffolding"],"fullName":"stage1 contract scaffolding updates investigation_state with bounded fields","status":"passed","title":"updates investigation_state with bounded fields","duration":1.309299999999979,"failureMessages":[],"meta":{}}],"startTime":1774529734248,"endTime":1774529734250.3093,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantContracts.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant mode API"],"fullName":"assistant mode API processes message and returns assistant response with debug payload","status":"passed","title":"processes message and returns assistant response with debug payload","duration":82.71239999999989,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant mode API"],"fullName":"assistant mode API keeps session-scoped history and returns it via session endpoint","status":"passed","title":"keeps session-scoped history and returns it via session endpoint","duration":18.65379999999982,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant mode API"],"fullName":"assistant mode API executes factual retrieval for routed fragments","status":"passed","title":"executes factual retrieval for routed fragments","duration":66.1574999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant mode API"],"fullName":"assistant mode API keeps in-domain translit queries in scope and routed","status":"passed","title":"keeps in-domain translit queries in scope and routed","duration":16.381599999999935,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant mode API"],"fullName":"assistant mode API avoids false route mismatch when supported evidence exists for bounded answer","status":"passed","title":"avoids false route mismatch when supported evidence exists for bounded answer","duration":17.568700000000035,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant mode API"],"fullName":"assistant mode API blocks answer when critical domain token is not grounded","status":"passed","title":"blocks answer when critical domain token is not grounded","duration":23.158999999999878,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant mode API"],"fullName":"assistant mode API applies semantic narrowing profile for hybrid retrieval without GUID","status":"passed","title":"applies semantic narrowing profile for hybrid retrieval without GUID","duration":60.22769999999991,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant mode API"],"fullName":"assistant mode API writes one persistent JSON log file per session","status":"passed","title":"writes one persistent JSON log file per session","duration":43.47759999999994,"failureMessages":[],"meta":{}}],"startTime":1774529734350,"endTime":1774529734679.4775,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantEndpoint.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant Stage 1 eval harness"],"fullName":"assistant Stage 1 eval harness runs assistant_stage1 harness and returns raw metrics + rubric bands","status":"passed","title":"runs assistant_stage1 harness and returns raw metrics + rubric bands","duration":531.7759,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant Stage 1 eval harness"],"fullName":"assistant Stage 1 eval harness loads canonical suite metadata and keeps it stable","status":"passed","title":"loads canonical suite metadata and keeps it stable","duration":135.70039999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant Stage 1 eval harness"],"fullName":"assistant Stage 1 eval harness handles follow-up cases as dedicated subset","status":"passed","title":"handles follow-up cases as dedicated subset","duration":82.78279999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant Stage 1 eval harness"],"fullName":"assistant Stage 1 eval harness builds comparison artifact from baseline and current runs","status":"passed","title":"builds comparison artifact from baseline and current runs","duration":211.33899999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant Stage 1 eval harness"],"fullName":"assistant Stage 1 eval harness keeps legacy eval path unchanged by default","status":"passed","title":"keeps legacy eval path unchanged by default","duration":880.4197999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant Stage 1 eval harness"],"fullName":"assistant Stage 1 eval harness respects accountant eval feature flag OFF/ON","status":"passed","title":"respects accountant eval feature flag OFF/ON","duration":154.45389999999998,"failureMessages":[],"meta":{}}],"startTime":1774529733984,"endTime":1774529735980.4539,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantEvalHarness.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant follow-up state binding"],"fullName":"assistant follow-up state binding applies investigation_state binding in follow-up flow when flags are ON","status":"passed","title":"applies investigation_state binding in follow-up flow when flags are ON","duration":511.03639999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant follow-up state binding"],"fullName":"assistant follow-up state binding does not apply follow-up binding when binding flag is OFF","status":"passed","title":"does not apply follow-up binding when binding flag is OFF","duration":104.83919999999989,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant follow-up state binding"],"fullName":"assistant follow-up state binding keeps legacy-like behavior when investigation state flag is OFF","status":"passed","title":"keeps legacy-like behavior when investigation state flag is OFF","duration":47.85770000000002,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant follow-up state binding"],"fullName":"assistant follow-up state binding applies problem continuity hints only when continuity flag is ON and follow-up has no strong new anchors","status":"passed","title":"applies problem continuity hints only when continuity flag is ON and follow-up has no strong new anchors","duration":116.91009999999983,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant follow-up state binding"],"fullName":"assistant follow-up state binding does not apply follow-up continuity when user gives strong new anchors","status":"passed","title":"does not apply follow-up continuity when user gives strong new anchors","duration":66.9813999999999,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant follow-up state binding"],"fullName":"assistant follow-up state binding keeps UTF-8 follow-up period refinement in-scope with soft continuity hints","status":"passed","title":"keeps UTF-8 follow-up period refinement in-scope with soft continuity hints","duration":71.82369999999992,"failureMessages":[],"meta":{}}],"startTime":1774529733985,"endTime":1774529734904.8237,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantFollowupStateBinding.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant lifecycle-aware answer mode v1"],"fullName":"assistant lifecycle-aware answer mode v1 promotes stage3 lifecycle mode when lifecycle answer flag is enabled","status":"passed","title":"promotes stage3 lifecycle mode when lifecycle answer flag is enabled","duration":2.8553000000000566,"failureMessages":[],"meta":{}}],"startTime":1774529733985,"endTime":1774529733987.8552,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantLifecycleAwareAnswerV1.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant problem-centric answer mode v1"],"fullName":"assistant problem-centric answer mode v1 uses problem-centric answer mode on problem-heavy case when flag is ON","status":"passed","title":"uses problem-centric answer mode on problem-heavy case when flag is ON","duration":3.0338999999999032,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant problem-centric answer mode v1"],"fullName":"assistant problem-centric answer mode v1 falls back to Stage 1 path for the same case when problem-centric flag is OFF","status":"passed","title":"falls back to Stage 1 path for the same case when problem-centric flag is OFF","duration":1.0547000000000253,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant problem-centric answer mode v1"],"fullName":"assistant problem-centric answer mode v1 keeps focused grounded case on Stage 1 path even when problem-centric flag is ON","status":"passed","title":"keeps focused grounded case on Stage 1 path even when problem-centric flag is ON","duration":0.3220999999999776,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant problem-centric answer mode v1"],"fullName":"assistant problem-centric answer mode v1 enables problem-centric mode on mixed focused case when weak mechanism signals are present","status":"passed","title":"enables problem-centric mode on mixed focused case when weak mechanism signals are present","duration":0.24890000000004875,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant problem-centric answer mode v1"],"fullName":"assistant problem-centric answer mode v1 does not expose raw technical refs in primary problem-centric text","status":"passed","title":"does not expose raw technical refs in primary problem-centric text","duration":0.23930000000007112,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant problem-centric answer mode v1"],"fullName":"assistant problem-centric answer mode v1 produces limited answer for weak problem units without false overclaim","status":"passed","title":"produces limited answer for weak problem units without false overclaim","duration":0.6579000000000406,"failureMessages":[],"meta":{}}],"startTime":1774529733985,"endTime":1774529733990.658,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantProblemCentricAnswerV1.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant problem-unit continuity state"],"fullName":"assistant problem-unit continuity state stores bounded problem_unit_state in investigation snapshot and session state","status":"passed","title":"stores bounded problem_unit_state in investigation snapshot and session state","duration":517.8632,"failureMessages":[],"meta":{}}],"startTime":1774529734002,"endTime":1774529734519.8633,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantProblemUnitContinuityState.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant problem-unit runtime rollout"],"fullName":"assistant problem-unit runtime rollout emits problem-unit layer on problem-heavy scenarios when flag is ON","status":"passed","title":"emits problem-unit layer on problem-heavy scenarios when flag is ON","duration":535.8198000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant problem-unit runtime rollout"],"fullName":"assistant problem-unit runtime rollout does not emit problem-unit layer when flag is OFF","status":"passed","title":"does not emit problem-unit layer when flag is OFF","duration":96.6395,"failureMessages":[],"meta":{}}],"startTime":1774529733987,"endTime":1774529734619.6394,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantProblemUnitRuntimeRollout.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant stage2 duplicate collapse probe suite"],"fullName":"assistant stage2 duplicate collapse probe suite loads supplemental probe suite and confirms duplicate collapse signal","status":"passed","title":"loads supplemental probe suite and confirms duplicate collapse signal","duration":2.4647999999999683,"failureMessages":[],"meta":{}}],"startTime":1774529734010,"endTime":1774529734012.4648,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantStage2DuplicateCollapseProbe.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant Stage 2 eval harness"],"fullName":"assistant Stage 2 eval harness runs assistant_stage2 harness and returns Stage 2 raw metrics + rubric bands","status":"passed","title":"runs assistant_stage2 harness and returns Stage 2 raw metrics + rubric bands","duration":535.4872,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant Stage 2 eval harness"],"fullName":"assistant Stage 2 eval harness loads Stage 2 canonical suite metadata and keeps it stable","status":"passed","title":"loads Stage 2 canonical suite metadata and keeps it stable","duration":134.64620000000014,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant Stage 2 eval harness"],"fullName":"assistant Stage 2 eval harness handles follow-up subset and keeps subset denominator explicit","status":"passed","title":"handles follow-up subset and keeps subset denominator explicit","duration":88.82950000000005,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant Stage 2 eval harness"],"fullName":"assistant Stage 2 eval harness builds Stage 2 comparison artifact from baseline and current runs","status":"passed","title":"builds Stage 2 comparison artifact from baseline and current runs","duration":200.32939999999985,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant Stage 2 eval harness"],"fullName":"assistant Stage 2 eval harness keeps legacy eval path unchanged by default","status":"passed","title":"keeps legacy eval path unchanged by default","duration":881.4143000000001,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant Stage 2 eval harness"],"fullName":"assistant Stage 2 eval harness respects Stage 2 eval feature flag OFF/ON","status":"passed","title":"respects Stage 2 eval feature flag OFF/ON","duration":159.77339999999958,"failureMessages":[],"meta":{}}],"startTime":1774529733985,"endTime":1774529735985.7734,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/assistantStage2EvalHarness.test.ts"},{"assertionResults":[{"ancestorTitles":["POST /api/eval/run"],"fullName":"POST /api/eval/run runs v2 eval using inline rawQuestions batch","status":"passed","title":"runs v2 eval using inline rawQuestions batch","duration":66.82389999999987,"failureMessages":[],"meta":{}}],"startTime":1774529734349,"endTime":1774529734415.824,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/evalEndpoint.test.ts"},{"assertionResults":[{"ancestorTitles":["investigation_state flow scaffolding"],"fullName":"investigation_state flow scaffolding keeps bounded investigation_state across follow-up turns","status":"passed","title":"keeps bounded investigation_state across follow-up turns","duration":113.99570000000017,"failureMessages":[],"meta":{}}],"startTime":1774529734350,"endTime":1774529734463.9956,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/investigationStateFlow.test.ts"},{"assertionResults":[{"ancestorTitles":["stage3 lifecycle registry and resolver wave2"],"fullName":"stage3 lifecycle registry and resolver wave2 exposes all lifecycle domains in the registry","status":"passed","title":"exposes all lifecycle domains in the registry","duration":1.856899999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["stage3 lifecycle registry and resolver wave2"],"fullName":"stage3 lifecycle registry and resolver wave2 infers lifecycle domain for all covered stage3 domains","status":"passed","title":"infers lifecycle domain for all covered stage3 domains","duration":2.1909999999999172,"failureMessages":[],"meta":{}},{"ancestorTitles":["stage3 lifecycle registry and resolver wave2"],"fullName":"stage3 lifecycle registry and resolver wave2 normalizes unknown explicit states against registry and records limitations","status":"passed","title":"normalizes unknown explicit states against registry and records limitations","duration":0.7679000000000542,"failureMessages":[],"meta":{}},{"ancestorTitles":["stage3 lifecycle registry and resolver wave2"],"fullName":"stage3 lifecycle registry and resolver wave2 infers missing transition from registry transition path","status":"passed","title":"infers missing transition from registry transition path","duration":0.2717000000000098,"failureMessages":[],"meta":{}},{"ancestorTitles":["stage3 lifecycle registry and resolver wave2"],"fullName":"stage3 lifecycle registry and resolver wave2 builds previous state chain from registry model","status":"passed","title":"builds previous state chain from registry model","duration":0.19309999999995853,"failureMessages":[],"meta":{}}],"startTime":1774529734002,"endTime":1774529734007.2717,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/lifecycleRegistryResolverWave2.test.ts"},{"assertionResults":[{"ancestorTitles":["lifecycle runtime stage3"],"fullName":"lifecycle runtime stage3 resolves stale missing transition for bank settlement chains","status":"passed","title":"resolves stale missing transition for bank settlement chains","duration":2.582899999999995,"failureMessages":[],"meta":{}},{"ancestorTitles":["lifecycle runtime stage3"],"fullName":"lifecycle runtime stage3 classifies cross-branch conflicts for VAT flow","status":"passed","title":"classifies cross-branch conflicts for VAT flow","duration":0.77049999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["lifecycle runtime stage3"],"fullName":"lifecycle runtime stage3 sorts lifecycle-ranked units by lifecycle severity and ranking score","status":"passed","title":"sorts lifecycle-ranked units by lifecycle severity and ranking score","duration":0.6156999999999471,"failureMessages":[],"meta":{}}],"startTime":1774529734002,"endTime":1774529734006.6157,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/lifecycleRuntime.test.ts"},{"assertionResults":[{"ancestorTitles":["POST /api/normalize"],"fullName":"POST /api/normalize returns normalized v1 payload in mock mode","status":"passed","title":"returns normalized v1 payload in mock mode","duration":59.557000000000016,"failureMessages":[],"meta":{}},{"ancestorTitles":["POST /api/normalize"],"fullName":"POST /api/normalize returns normalized v2 payload in mock mode","status":"passed","title":"returns normalized v2 payload in mock mode","duration":30.397199999999884,"failureMessages":[],"meta":{}},{"ancestorTitles":["POST /api/normalize"],"fullName":"POST /api/normalize returns normalized v2.0.1 payload in mock mode with execution_readiness","status":"passed","title":"returns normalized v2.0.1 payload in mock mode with execution_readiness","duration":23.579899999999952,"failureMessages":[],"meta":{}},{"ancestorTitles":["POST /api/normalize"],"fullName":"POST /api/normalize returns normalized v2.0.2 payload in mock mode with route_status and no_route_reason","status":"passed","title":"returns normalized v2.0.2 payload in mock mode with route_status and no_route_reason","duration":38.4366,"failureMessages":[],"meta":{}}],"startTime":1774529734349,"endTime":1774529734501.4365,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/normalizeEndpoint.test.ts"},{"assertionResults":[{"ancestorTitles":["problemUnitAssembler scaffold"],"fullName":"problemUnitAssembler scaffold groups candidate evidence by route/source/pattern signature","status":"passed","title":"groups candidate evidence by route/source/pattern signature","duration":2.0336999999999534,"failureMessages":[],"meta":{}},{"ancestorTitles":["problemUnitAssembler scaffold"],"fullName":"problemUnitAssembler scaffold detects baseline problem unit type from anomaly hints","status":"passed","title":"detects baseline problem unit type from anomaly hints","duration":0.44399999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["problemUnitAssembler scaffold"],"fullName":"problemUnitAssembler scaffold collapses duplicate problem units by signature","status":"passed","title":"collapses duplicate problem units by signature","duration":0.7237999999999829,"failureMessages":[],"meta":{}},{"ancestorTitles":["problemUnitAssembler scaffold"],"fullName":"problemUnitAssembler scaffold assembles problem units and summary with bounded scaffold fields","status":"passed","title":"assembles problem units and summary with bounded scaffold fields","duration":1.2396999999999707,"failureMessages":[],"meta":{}}],"startTime":1774529734010,"endTime":1774529734015.2397,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/problemUnitAssembler.test.ts"},{"assertionResults":[{"ancestorTitles":["promptBuilder"],"fullName":"promptBuilder loads default prompts","status":"passed","title":"loads default prompts","duration":1.9529999999999745,"failureMessages":[],"meta":{}},{"ancestorTitles":["promptBuilder"],"fullName":"promptBuilder exposes v1, v1.1, v1.1.1, v1.1.2, v1.1.2.1, v2, v2.0.1 and v2.0.2 builtin presets","status":"passed","title":"exposes v1, v1.1, v1.1.1, v1.1.2, v1.1.2.1, v2, v2.0.1 and v2.0.2 builtin presets","duration":2.2586000000000013,"failureMessages":[],"meta":{}},{"ancestorTitles":["promptBuilder"],"fullName":"promptBuilder merges user prompt values","status":"passed","title":"merges user prompt values","duration":0.4474999999999909,"failureMessages":[],"meta":{}}],"startTime":1774529733996,"endTime":1774529734000.4475,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/promptBuilder.test.ts"},{"assertionResults":[{"ancestorTitles":["retrieval lifecycle runtime rollout"],"fullName":"retrieval lifecycle runtime rollout keeps Stage 2 payload when lifecycle runtime flag is OFF","status":"passed","title":"keeps Stage 2 payload when lifecycle runtime flag is OFF","duration":91.53019999999992,"failureMessages":[],"meta":{}},{"ancestorTitles":["retrieval lifecycle runtime rollout"],"fullName":"retrieval lifecycle runtime rollout adds lifecycle fields to problem units when lifecycle runtime flag is ON","status":"passed","title":"adds lifecycle fields to problem units when lifecycle runtime flag is ON","duration":21.009999999999877,"failureMessages":[],"meta":{}}],"startTime":1774529733930,"endTime":1774529734043.01,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/retrievalLifecycleRuntimeRollout.test.ts"},{"assertionResults":[{"ancestorTitles":["retrieval dual payload compatibility for problem units"],"fullName":"retrieval dual payload compatibility for problem units keeps legacy payload intact when FEATURE_ASSISTANT_PROBLEM_UNITS_V1 is OFF","status":"passed","title":"keeps legacy payload intact when FEATURE_ASSISTANT_PROBLEM_UNITS_V1 is OFF","duration":108.50869999999998,"failureMessages":[],"meta":{}},{"ancestorTitles":["retrieval dual payload compatibility for problem units"],"fullName":"retrieval dual payload compatibility for problem units adds Stage 2 dual payload fields when FEATURE_ASSISTANT_PROBLEM_UNITS_V1 is ON","status":"passed","title":"adds Stage 2 dual payload fields when FEATURE_ASSISTANT_PROBLEM_UNITS_V1 is ON","duration":26.94829999999979,"failureMessages":[],"meta":{}}],"startTime":1774529733911,"endTime":1774529734045.9482,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/retrievalProblemUnitDualPayload.test.ts"},{"assertionResults":[{"ancestorTitles":["retrieval evidence enrichment"],"fullName":"retrieval evidence enrichment builds deterministic canonical source_ref from pointer/source","status":"passed","title":"builds deterministic canonical source_ref from pointer/source","duration":120.22249999999997,"failureMessages":[],"meta":{}},{"ancestorTitles":["retrieval evidence enrichment"],"fullName":"retrieval evidence enrichment uses honest weak-evidence fallback when mechanism is not reliable","status":"passed","title":"uses honest weak-evidence fallback when mechanism is not reliable","duration":5.199299999999994,"failureMessages":[],"meta":{}},{"ancestorTitles":["retrieval evidence enrichment"],"fullName":"retrieval evidence enrichment maps explicit limitation to reason-coded structure","status":"passed","title":"maps explicit limitation to reason-coded structure","duration":4.922700000000077,"failureMessages":[],"meta":{}},{"ancestorTitles":["retrieval evidence enrichment"],"fullName":"retrieval evidence enrichment keeps legacy inferred mechanism when enrichment flag is OFF","status":"passed","title":"keeps legacy inferred mechanism when enrichment flag is OFF","duration":16.84999999999991,"failureMessages":[],"meta":{}}],"startTime":1774529733920,"endTime":1774529734067.85,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/retrievalResultEvidenceEnrichment.test.ts"},{"assertionResults":[{"ancestorTitles":["routeHintAdapter"],"fullName":"routeHintAdapter builds v1 route hint summary","status":"passed","title":"builds v1 route hint summary","duration":1.2176000000000613,"failureMessages":[],"meta":{}},{"ancestorTitles":["routeHintAdapter"],"fullName":"routeHintAdapter builds v2 deterministic route simulation","status":"passed","title":"builds v2 deterministic route simulation","duration":0.41039999999998145,"failureMessages":[],"meta":{}},{"ancestorTitles":["routeHintAdapter"],"fullName":"routeHintAdapter builds router input contract for v1","status":"passed","title":"builds router input contract for v1","duration":0.14589999999998327,"failureMessages":[],"meta":{}},{"ancestorTitles":["routeHintAdapter"],"fullName":"routeHintAdapter keeps v2.0.1 soft assumptions executable in deterministic routing","status":"passed","title":"keeps v2.0.1 soft assumptions executable in deterministic routing","duration":0.17640000000005784,"failureMessages":[],"meta":{}},{"ancestorTitles":["routeHintAdapter"],"fullName":"routeHintAdapter uses explicit v2.0.2 route_status/no_route_reason contract","status":"passed","title":"uses explicit v2.0.2 route_status/no_route_reason contract","duration":0.22630000000003747,"failureMessages":[],"meta":{}}],"startTime":1774529734002,"endTime":1774529734004.2263,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/routeHintAdapter.test.ts"},{"assertionResults":[{"ancestorTitles":["schemaValidator"],"fullName":"schemaValidator passes valid normalized payload","status":"passed","title":"passes valid normalized payload","duration":33.13810000000012,"failureMessages":[],"meta":{}},{"ancestorTitles":["schemaValidator"],"fullName":"schemaValidator fails invalid payload","status":"passed","title":"fails invalid payload","duration":0.3888000000001739,"failureMessages":[],"meta":{}},{"ancestorTitles":["schemaValidator"],"fullName":"schemaValidator passes valid normalized v2 payload","status":"passed","title":"passes valid normalized v2 payload","duration":31.34979999999996,"failureMessages":[],"meta":{}},{"ancestorTitles":["schemaValidator"],"fullName":"schemaValidator fails invalid v2 payload","status":"passed","title":"fails invalid v2 payload","duration":0.2535000000000309,"failureMessages":[],"meta":{}},{"ancestorTitles":["schemaValidator"],"fullName":"schemaValidator passes valid normalized v2.0.1 payload","status":"passed","title":"passes valid normalized v2.0.1 payload","duration":19.48349999999982,"failureMessages":[],"meta":{}},{"ancestorTitles":["schemaValidator"],"fullName":"schemaValidator passes valid normalized v2.0.2 payload","status":"passed","title":"passes valid normalized v2.0.2 payload","duration":19.263299999999845,"failureMessages":[],"meta":{}}],"startTime":1774529734025,"endTime":1774529734129.2632,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/schemaValidator.test.ts"},{"assertionResults":[{"ancestorTitles":["assistant session backward compatibility"],"fullName":"assistant session backward compatibility lazy-upgrades legacy session objects without investigation_state","status":"passed","title":"lazy-upgrades legacy session objects without investigation_state","duration":1.3711000000000126,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant session backward compatibility"],"fullName":"assistant session backward compatibility normalizes malformed legacy sessions with missing items array","status":"passed","title":"normalizes malformed legacy sessions with missing items array","duration":0.22010000000000218,"failureMessages":[],"meta":{}},{"ancestorTitles":["assistant session backward compatibility"],"fullName":"assistant session backward compatibility preserves optional stage2 problem_unit_state in session clone flow","status":"passed","title":"preserves optional stage2 problem_unit_state in session clone flow","duration":0.5704000000000065,"failureMessages":[],"meta":{}}],"startTime":1774529734258,"endTime":1774529734259.5703,"status":"passed","message":"","name":"X:/1C/NDC_1C/llm_normalizer/backend/tests/sessionBackwardCompat.test.ts"}]}