onto-mcp 0.4.11 → 0.4.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/.onto/authority/core-lexicon.yaml +1 -1
  2. package/.onto/authority/supported-models.yaml +153 -0
  3. package/.onto/domains/accounting-kr/competency_qs.md +153 -153
  4. package/.onto/processes/reconstruct/obligation-coverage-ledger.yaml +842 -0
  5. package/.onto/processes/reconstruct/obligation-coverage-recorded.yaml +225 -0
  6. package/.onto/processes/reconstruct/ontology-seeding-and-maturation-design.md +93 -54
  7. package/.onto/processes/reconstruct/reconstruct-contract-registry.yaml +202 -49
  8. package/.onto/processes/reconstruct/reconstruct-execution-ux-contract.md +72 -1
  9. package/.onto/processes/reconstruct/source-profiles/spreadsheet.md +35 -0
  10. package/.onto/processes/review/nesting-batch-worker-contract.md +1 -1
  11. package/.onto/processes/review/productized-live-path.md +9 -5
  12. package/.onto/processes/review/prompt-execution-runner-contract.md +32 -8
  13. package/.onto/processes/review/review-target-profile-contract.md +47 -4
  14. package/.onto/processes/shared/pipeline-execution-ledger-contract.md +11 -0
  15. package/.onto/processes/shared/target-material-kind-contract.md +1 -1
  16. package/README.md +64 -1
  17. package/dist/cli.js +11 -1
  18. package/dist/core-api/reconstruct-api.js +679 -18
  19. package/dist/core-api/review-api.js +70 -5
  20. package/dist/core-api/review-progress.js +7 -0
  21. package/dist/core-api/runtime-observation.js +7 -0
  22. package/dist/core-runtime/artifact-io.js +131 -0
  23. package/dist/core-runtime/cli/claude-code-review-unit-executor.js +21 -9
  24. package/dist/core-runtime/cli/claude-nesting-batch-worker.js +4 -2
  25. package/dist/core-runtime/cli/materialize-review-prompt-packets.js +68 -14
  26. package/dist/core-runtime/cli/prepare-review-session.js +34 -1
  27. package/dist/core-runtime/cli/render-review-final-output.js +2 -1
  28. package/dist/core-runtime/cli/run-review-prompt-execution.js +758 -48
  29. package/dist/core-runtime/cli/run-seats.js +18 -0
  30. package/dist/core-runtime/cli/runtime-submit-context.js +10 -2
  31. package/dist/core-runtime/cli/unit-resubmit.js +269 -0
  32. package/dist/core-runtime/cli/worker-structured-output.js +80 -2
  33. package/dist/core-runtime/discovery/host-detection.js +71 -22
  34. package/dist/core-runtime/discovery/review-cert-assemble.js +208 -0
  35. package/dist/core-runtime/discovery/review-cert-record.js +442 -0
  36. package/dist/core-runtime/discovery/review-execution-units.js +22 -0
  37. package/dist/core-runtime/discovery/seat-inventory.js +167 -0
  38. package/dist/core-runtime/discovery/settings-chain.js +311 -52
  39. package/dist/core-runtime/discovery/supported-models.js +289 -25
  40. package/dist/core-runtime/discovery/synthesize-cert-assemble.js +197 -0
  41. package/dist/core-runtime/discovery/synthesize-cert-capsule.js +399 -0
  42. package/dist/core-runtime/discovery/synthesize-cert-judge.js +340 -0
  43. package/dist/core-runtime/discovery/synthesize-cert-loop.js +234 -0
  44. package/dist/core-runtime/discovery/synthesize-cert-mutation.js +117 -0
  45. package/dist/core-runtime/discovery/synthesize-cert-packet.js +182 -0
  46. package/dist/core-runtime/discovery/synthesize-cert-record.js +831 -0
  47. package/dist/core-runtime/discovery/synthesize-cert-sampler.js +336 -0
  48. package/dist/core-runtime/effort-calibration-ingest.js +326 -0
  49. package/dist/core-runtime/effort-calibration-reconstruct.js +47 -0
  50. package/dist/core-runtime/effort-calibration-review.js +22 -0
  51. package/dist/core-runtime/effort-calibration-sweep.js +110 -0
  52. package/dist/core-runtime/effort-frontier.js +134 -0
  53. package/dist/core-runtime/llm/claude-bin.js +77 -0
  54. package/dist/core-runtime/llm/dispatch-breaker.js +412 -0
  55. package/dist/core-runtime/llm/dispatch-fallback-adapter-capabilities.js +33 -0
  56. package/dist/core-runtime/llm/llm-caller.js +316 -35
  57. package/dist/core-runtime/llm/mock-llm-realization.js +35 -4
  58. package/dist/core-runtime/llm/model-switcher.js +1 -1
  59. package/dist/core-runtime/llm/openai-responses-incomplete-error.js +46 -0
  60. package/dist/core-runtime/llm/sealed-dispatch-capability.js +359 -0
  61. package/dist/core-runtime/llm/structured-dispatch-error.js +15 -0
  62. package/dist/core-runtime/onboard/claude-profile-scan.js +65 -0
  63. package/dist/core-runtime/onboard/cli-host.js +5 -2
  64. package/dist/core-runtime/onboard/configure-provider.js +33 -1
  65. package/dist/core-runtime/onboard/host-target.js +28 -3
  66. package/dist/core-runtime/onboard/register.js +54 -12
  67. package/dist/core-runtime/pipeline-execution-ledger.js +10 -0
  68. package/dist/core-runtime/reconstruct/artifact-types.js +37 -0
  69. package/dist/core-runtime/reconstruct/benchmark-evidence.js +16 -0
  70. package/dist/core-runtime/reconstruct/claim-projection-validation.js +19 -5
  71. package/dist/core-runtime/reconstruct/competency-projection-contract.js +63 -0
  72. package/dist/core-runtime/reconstruct/comprehension-artifact.js +321 -0
  73. package/dist/core-runtime/reconstruct/comprehension-reduce.js +367 -0
  74. package/dist/core-runtime/reconstruct/comprehension-semantic-map.js +771 -0
  75. package/dist/core-runtime/reconstruct/contract-registry.js +20 -0
  76. package/dist/core-runtime/reconstruct/directive-validation.js +4 -3
  77. package/dist/core-runtime/reconstruct/dispatch-fallback-artifacts.js +640 -0
  78. package/dist/core-runtime/reconstruct/execution-telemetry.js +84 -9
  79. package/dist/core-runtime/reconstruct/final-output-sections.js +89 -0
  80. package/dist/core-runtime/reconstruct/governing-snapshot.js +36 -1
  81. package/dist/core-runtime/reconstruct/leaf-reader.js +305 -0
  82. package/dist/core-runtime/reconstruct/llm-dispatch-failure.js +270 -0
  83. package/dist/core-runtime/reconstruct/llm-touch-fingerprint.js +94 -0
  84. package/dist/core-runtime/reconstruct/material-admission-validation.js +20 -5
  85. package/dist/core-runtime/reconstruct/material-profile-validation.js +24 -6
  86. package/dist/core-runtime/reconstruct/materialize-preparation.js +380 -23
  87. package/dist/core-runtime/reconstruct/maturation-validation.js +1522 -67
  88. package/dist/core-runtime/reconstruct/mock-llm-realization.js +120 -1
  89. package/dist/core-runtime/reconstruct/obligation-assertion.js +18 -0
  90. package/dist/core-runtime/reconstruct/ontology-seed-validation.js +39 -7
  91. package/dist/core-runtime/reconstruct/output-budget.js +6 -0
  92. package/dist/core-runtime/reconstruct/pipeline-execution-ledger.js +112 -5
  93. package/dist/core-runtime/reconstruct/post-seed-validation.js +122 -11
  94. package/dist/core-runtime/reconstruct/proof-authority-validation.js +2 -6
  95. package/dist/core-runtime/reconstruct/purpose-authority-validation.js +119 -7
  96. package/dist/core-runtime/reconstruct/record.js +49 -3
  97. package/dist/core-runtime/reconstruct/registry-verification-validation.js +41 -5
  98. package/dist/core-runtime/reconstruct/run-control-validation.js +1019 -37
  99. package/dist/core-runtime/reconstruct/run.js +5409 -517
  100. package/dist/core-runtime/reconstruct/seed-authoring-readiness-validation.js +56 -8
  101. package/dist/core-runtime/reconstruct/semantic-quality-gate.js +112 -7
  102. package/dist/core-runtime/reconstruct/source-observation-delta-validation.js +53 -5
  103. package/dist/core-runtime/reconstruct/source-observations.js +166 -0
  104. package/dist/core-runtime/reconstruct/source-safety-validation.js +77 -188
  105. package/dist/core-runtime/reconstruct/source-scout-pack-validation.js +50 -6
  106. package/dist/core-runtime/reconstruct/terminal-validation.js +145 -13
  107. package/dist/core-runtime/review/continuation-plan.js +12 -5
  108. package/dist/core-runtime/review/issue-artifact-runtime.js +4 -1
  109. package/dist/core-runtime/review/materializers.js +100 -11
  110. package/dist/core-runtime/review/nesting-batch.js +6 -2
  111. package/dist/core-runtime/review/obligation-shardability.js +138 -0
  112. package/dist/core-runtime/review/pipeline-execution-ledger.js +42 -2
  113. package/dist/core-runtime/review/review-artifact-utils.js +219 -7
  114. package/dist/core-runtime/review/review-execution-steps.js +32 -8
  115. package/dist/core-runtime/review/review-progress-contract.js +8 -0
  116. package/dist/core-runtime/review/review-prompt-budget.js +97 -0
  117. package/dist/core-runtime/review/semantic-quality-gate.js +33 -7
  118. package/dist/core-runtime/review/spreadsheet-review-disposition.js +94 -0
  119. package/dist/core-runtime/route-identity.js +182 -0
  120. package/dist/core-runtime/spreadsheet-header-escalation.js +204 -0
  121. package/dist/core-runtime/spreadsheet-structure-observer.js +2689 -0
  122. package/dist/core-runtime/target-material-kind.js +58 -0
  123. package/dist/mcp/server.js +27 -5
  124. package/dist/mcp/tool-schemas.js +8 -0
  125. package/dist/tui/app.js +167 -0
  126. package/dist/tui/data/event-follower.js +116 -0
  127. package/dist/tui/data/node-detail.js +42 -0
  128. package/dist/tui/data/projection-poll.js +26 -0
  129. package/dist/tui/data/session-discovery.js +65 -0
  130. package/dist/tui/index.js +108 -0
  131. package/dist/tui/screens/log.js +25 -0
  132. package/dist/tui/screens/node-detail.js +17 -0
  133. package/dist/tui/screens/session-selector.js +26 -0
  134. package/dist/tui/screens/workflow-tree.js +90 -0
  135. package/dist/tui/view-model/reconstruct-adapter.js +162 -0
  136. package/dist/tui/view-model/review-adapter.js +270 -0
  137. package/dist/tui/view-model/tree-view-model.js +19 -0
  138. package/package.json +20 -3
  139. package/settings.example.json +77 -16
@@ -0,0 +1,842 @@
1
+ # Obligation-coverage PENDING ledger (G(a) / INV-OBLIGATION-COVERAGE-1).
2
+ # Generated; the parked backlog of active (validator_id, obligation_id) pairs not yet RECORDED
3
+ # (no asserted_obligation_ids instrumentation in this slice). The ratchet proves this legacy set
4
+ # is monotone non-increasing.
5
+ #
6
+ # tier — what the pending status means for THIS pair:
7
+ # flat : a flat obligation not yet instrumented for recording.
8
+ # activation_gated_dormant : a conditional obligation whose runtime is genuinely unwired
9
+ # (its enforcement is dormant; activation_condition unmet).
10
+ # enforced_pending_instrumentation: the pair IS live-enforced today, but its asserted_obligation_ids
11
+ # RECORDING is deferred to a later slice (see the row's `note`).
12
+ # Parked ≠ unwired for this tier — only the recording is pending.
13
+ #
14
+ # Some `flat` rows carry a `note` from a per-validator enforcement AUDIT explaining why they remain
15
+ # parked (no distinct enforcement site located, or enforcement overlaps an already-recorded
16
+ # obligation) — a surfaced declared≠wired finding, not merely "not yet stamped". The honest rule for
17
+ # RECORDING a pair is that an enforcement-binding test proves a violating input trips a real violation;
18
+ # pairs that fail that bar stay parked rather than being laundered into recorded.
19
+ pending:
20
+ - validator_id: actionability-matrix-validator
21
+ obligation_id: reject_matrix_rows_without_baseline_row_or_applicable_validated_expansion_ref
22
+ coverage_status: pending
23
+ tier: flat
24
+ note: "slice-3 audit (2026-06-22): the validator strictly requires exactly one resolvable baseline_row_ref per row (the strict check is recorded under baseline-actionability-matrix-validator/reject_matrix_rows_without_baseline_row_ref); the 'OR applicable validated expansion ref' ALTERNATIVE in this current-mode name is NOT implemented — no path admits an expansion-only row. Recording deferred pending that alternative being built or the name reconciled with the strict check."
25
+ - validator_id: actionability-matrix-validator
26
+ obligation_id: require_blocker_and_high_rows_to_be_l4_limitation_backed_or_continuation_blocking
27
+ coverage_status: pending
28
+ tier: flat
29
+ note: "slice-3 audit (2026-06-22): NO enforcement found in validateActionabilityMatrix — there is no check that blocker/high materiality rows are L4, limitation_backed, or continuation-blocking. A surfaced declared≠wired gap; may be enforced by maturation-continuation-decision-validator / actionable-ontology-validator (owner decision: add here, or re-attribute in the registry)."
30
+ - validator_id: actionability-matrix-validator
31
+ obligation_id: support_zero_delta_baseline_only_matrix_when_no_maturation_deltas_exist
32
+ coverage_status: pending
33
+ tier: flat
34
+ note: "slice-3 audit (2026-06-22): a 'support' (non-rejection) obligation — satisfied by the ABSENCE of a violation when a matrix mirrors the baseline with no deltas, so there is no bindable violation code to anchor a recording. Stays parked (recording would require an explicit affirmative check)."
35
+ - validator_id: actionability-matrix-validator
36
+ obligation_id: validate_maturity_level_against_supporting_refs_blocking_questions_and_limitations
37
+ coverage_status: pending
38
+ tier: flat
39
+ note: "slice-3 audit (2026-06-22): enforcement is DISTRIBUTED across regions already owned by other recorded obligations — the member_readiness gate (limitations), the maturity-upgrade citation (supporting_refs; recorded as validate_matrix_rows_derive_from_validated_baseline_and_any_applicable_validated_deltas), and the blocking-question validation (recorded as validate_blocking_question_refs_against_validated_question_frontier). No distinct owner region; recording deferred pending a decision on whether this is a composite obligation or maps to the member_readiness gate specifically."
40
+ - validator_id: actionable-ontology-validator
41
+ obligation_id: reject_actionable_ready_when_material_blocker_or_high_question_remains
42
+ coverage_status: pending
43
+ tier: flat
44
+ note: "slice-17 audit (2026-06-23): DELEGATED/NOT_FOUND in this validator. validateActionableOntology directly rejects actionable_ready when final re-question convergence is unproven (recorded separately as reject_actionable_ready_until_final_requestion_convergence_is_proven) and requires the claim to match the continuation decision_state, but it never directly checks that no material blocker/high QUESTION remains open — that closure is enforced by validateMaturationContinuationDecision / the convergence ledger (both required valid here via prior_validation_invalid). Recording deferred pending a direct remaining-blocker/high-question check here, or re-attribution to the continuation-decision validator."
45
+ - validator_id: actionable-ontology-validator
46
+ obligation_id: require_static_kinetic_dynamic_surfaces_to_be_closed_or_limitation_excluded
47
+ coverage_status: pending
48
+ tier: flat
49
+ note: "slice-17 audit (2026-06-23): NOT_FOUND for the named per-surface scope. The validator checks per-ROW closure (included projected rows must have matrixRow.member_readiness == closed, ~4996) and full per-row coverage (every matrix row projected exactly once, ~5024), but there is no per-SURFACE check that each of static_surface / kinetic_surface / dynamic_surface is independently closed-or-limitation-excluded (contract: design §Actionability Matrix ~533 'each surface must be independently closed'; continuation-state table ~1116). Surface-level maturity is validated upstream by the actionability-matrix validator, not rechecked here. Recording deferred pending a per-surface closed-or-excluded check (or re-attribution to the matrix validator)."
50
+ - validator_id: actionable-ontology-validator
51
+ obligation_id: validate_applicable_proof_authorities_before_projecting_runtime_query_visualization_or_graph_claims
52
+ coverage_status: pending
53
+ tier: flat
54
+ note: "slice-17 audit (2026-06-23): BLANKET-REJECT, not a proof-authority validation. The code rejects ANY downstream_claims value != not_claimed (invalid_enum ~4947-4955), so the active projection can never claim query/visualization/graph-exploration proof. Contract (design ~896-901) says actionable-ontology-validation 'rechecks the same proof authority before projecting' — i.e. it should VALIDATE the applicable proof authority when a downstream surface is claimed, but no proof-authority recheck is implemented (the gate forbids the claim outright rather than validating it). Recording deferred pending real proof-authority rechecking (this is the deferred-capability sibling of the convergence ready-gate)."
55
+ - validator_id: answer-support-ledger-validator
56
+ obligation_id: require_contradictions_to_be_recorded_and_bounded
57
+ coverage_status: pending
58
+ tier: flat
59
+ note: "slice-21 audit (2026-06-23): DELEGATED. validateAnswerSupportLedger never reads contradiction_refs. The contract clause (Answer Support Rules: contradictions must prevent answer-claim validation unless the claim records how the contradiction is bounded) is enforced downstream in validateMaturationAnswerClaims (contradictory-cluster -> limitation_refs check), not in this validator. Recording deferred to the answer-claims validator that owns the bounded check."
60
+ - validator_id: answer-support-ledger-validator
61
+ obligation_id: require_frontier_triggered_evidence_to_resolve_to_valid_lineage_index_validation
62
+ coverage_status: pending
63
+ tier: flat
64
+ note: "slice-21 audit (2026-06-23): PARTIAL. The valid-lineage-index-validation requirement is an UNSCOPED global precondition (fires when a lineage index validation is present-and-invalid, or when lineage-marked evidence lacks one) rather than scoped to the obligation's frontier_triggered discriminator (membership in the lineage index added_observation_ids). The frontier_triggered scope is read only for the re-entry obligation (recorded); there is no dedicated frontier-triggered-scoped lineage-index-validation enforcement here. Recording deferred."
65
+ - validator_id: answer-support-ledger-validator
66
+ obligation_id: validate_external_or_runtime_authority_support_mode
67
+ coverage_status: pending
68
+ tier: flat
69
+ note: "slice-21 audit (2026-06-23): PARTIAL. runtime_proof is presence-only (proof_refs non-empty; the contract's validated query/test/formula/execution/artifact proof that demonstrates the answer is not checked) and authority_response checks response_status == provided but delegates answers-a-closure-frontier-authority-request to maturation-authority-response validation. No distinct name-matching enforcement of the support-mode authority beyond presence/status. Recording deferred."
70
+ - validator_id: answer-support-ledger-validator
71
+ obligation_id: validate_support_mode_required_refs
72
+ coverage_status: pending
73
+ tier: flat
74
+ note: "slice-21 audit (2026-06-23): AMBIGUOUS/overlapping. The generic required-refs-per-support-mode check is distributed across the per-mode support_mode_missing_authority guards and overlaps the modes owned by validate_user_confirmation_support_mode (user_confirmation) and validate_external_or_runtime_authority_support_mode (runtime_proof/authority_response); only direct_authority's evidence_refs guard is un-owned, but the generic obligation name is not 1:1 with that single mode and cannot be bound non-overlappingly without laundering the others. Recording deferred (would need a dedicated direct-authority-required-refs obligation or a single generic violation code)."
75
+ - validator_id: answer-support-ledger-validator
76
+ obligation_id: validate_user_confirmation_support_mode
77
+ coverage_status: pending
78
+ tier: flat
79
+ note: "slice-21 R1 audit (2026-06-23, codex P2): PARTIAL / presence-only. The user_confirmation branch only requires user_confirmation_refs to be non-empty AND a globally-valid purpose-confirmation-validation; it never resolves the cited refs to the confirmation authority, so an arbitrary ref (e.g. ghost-confirmation) passes whenever any valid purpose-confirmation exists. Contrast authority_response, which resolves authority_response_refs to provided responses. Recording deferred pending ref-resolution of user_confirmation_refs against the confirmation authority (WIRE candidate)."
80
+ - validator_id: baseline-actionability-matrix-validator
81
+ obligation_id: preserve_frontier_seed_state_before_question_frontier_authoring
82
+ coverage_status: pending
83
+ tier: flat
84
+ note: "slice-3 audit (2026-06-22): a defensive (non-mutation) obligation — satisfied by the ABSENCE of post-frontier inputs in baseline mode, with no bindable violation code. Stays parked."
85
+ - validator_id: baseline-actionability-matrix-validator
86
+ obligation_id: support_zero_delta_baseline_only_matrix_before_maturation_deltas_exist
87
+ coverage_status: pending
88
+ tier: flat
89
+ note: "slice-3 audit (2026-06-22): a 'support' (non-rejection) obligation with no bindable violation code (the baseline-mode sibling of the current-mode support rule). Stays parked."
90
+ - validator_id: candidate-disposition-validator
91
+ obligation_id: require_deferred_or_source_gap_disposition_to_cite_limitation_or_frontier
92
+ coverage_status: pending
93
+ tier: flat
94
+ note: "slice-20 audit (2026-06-23): NOT_FOUND — validateCandidateDisposition never inspects whether a deferred/source_gap disposition cites a limitation or frontier. It checks disposition_id against the registry and requires rationale+evidence, but has no deferred/source_gap-specific limitation/frontier-citation check. Owner: wire the deferred-disposition limitation/frontier requirement."
95
+ - validator_id: candidate-disposition-validator
96
+ obligation_id: require_exactly_one_disposition_for_each_salient_candidate
97
+ coverage_status: pending
98
+ tier: flat
99
+ note: "slice-20 audit (2026-06-23): AMBIGUOUS (salience-blind) — the validator enforces exactly-one disposition for EVERY candidate (duplicate_disposition + missing_candidate_disposition), a SUPERSET of the obligation's salient scope, but never reads the `salience` field (ReconstructCandidateInventoryCandidate.salience is a real high/medium/low field, and the contract scopes this to HIGH-salience candidates). Because the validator is salience-blind, it does not validate the obligation's scope discriminator; the named scope has no dedicated enforcer. Recording deferred pending a salience-aware check (or a contract decision to make the requirement salience-agnostic)."
100
+ - validator_id: candidate-disposition-validator
101
+ obligation_id: require_high_salience_non_rejected_candidates_to_carry_surface_and_purpose_element_refs
102
+ coverage_status: pending
103
+ tier: flat
104
+ note: "slice-20 audit (2026-06-23): NOT_FOUND — the validator never inspects candidate salience, actionability_surface_refs, or purpose_element_refs, so it cannot require high-salience non-rejected candidates to carry surface+purpose-element refs."
105
+ - validator_id: candidate-disposition-validator
106
+ obligation_id: validate_candidate_actionability_surface_refs_against_registry_surface_values
107
+ coverage_status: pending
108
+ tier: flat
109
+ note: "slice-20 audit (2026-06-23): NOT_FOUND — the validator never inspects actionability_surface_refs nor validates them against any registry surface catalog. (registryCandidateKindIds/registryCandidateDispositionIds are read, but no surface-value catalog is consulted.)"
110
+ - validator_id: candidate-disposition-validator
111
+ obligation_id: validate_candidate_purpose_element_refs_against_selected_purpose_frame
112
+ coverage_status: pending
113
+ tier: activation_gated_dormant
114
+ note: "slice-20 audit (2026-06-23): NOT_FOUND + activation_gated_dormant — registry marks this conditional on activation_condition source_purpose_candidate_runtime_is_implemented, and validateCandidateDisposition takes no purpose-frame input (no source-purpose-candidates-validation arg), so it never validates purpose_element_refs against a selected purpose frame. Stays dormant until that runtime + input wiring exist."
115
+ - validator_id: claim-projection-validator
116
+ obligation_id: validate_broader_operated_system_release_health_and_incident_governance_are_bounded
117
+ coverage_status: pending
118
+ tier: flat
119
+ note: "slice-23 audit (2026-06-23): PARTIAL. The name requires BOTH operated_system_release_health AND incident governance to be bounded, but the gate (~913-923, broader_governance_scope_unbounded) only validates governance_scope.operated_system_release_health; the sibling field governance_scope.rollback_quota_incident_governance is never validated anywhere in the validator. Recording deferred pending the gate also bounding rollback_quota_incident_governance."
120
+ - validator_id: claim-projection-validator
121
+ obligation_id: validate_material_kind_support_profile_supported_requires_valid_target_material_profile_validation
122
+ coverage_status: pending
123
+ tier: flat
124
+ note: "slice-23 audit (2026-06-23): GATED + INDIRECT. The validity requirement is enforced only as a side-effect: materialKindSupportMemberRows/materialKindSupportProjectionStatus downgrade support to unsupported/blocked when target_material_profile_validation.validation_status != valid (~178/207), and the member-row lineage match (~755-772) compares support_claim. There is no dedicated 'if profile_supported && validation invalid -> violation' check, and the whole block is gated on the optional `args.targetMaterialProfile && args.targetMaterialProfileValidation` (~706) which the validator has no internal guarantee receives. Recording deferred pending a direct, ungated validity check."
125
+ - validator_id: claim-projection-validator
126
+ obligation_id: validate_member_capability_rows_preserve_target_ref_profile_snapshot_definition_hash_source_refs_validation_ref_readiness_effect_and_next_action
127
+ coverage_status: pending
128
+ tier: flat
129
+ note: "slice-23 audit (2026-06-23): GATED on optional authority args. The field-by-field preservation check (~755-772, member_capability_lineage_mismatch) is comprehensive and name-matching but only fires inside the `if (args.targetMaterialProfile && args.targetMaterialProfileValidation)` block (~706); both are optional args with no internal guarantee they are supplied (slice-18/22 caller-supplied-optional principle). Recording deferred pending an internal guarantee the target-profile authority is always present (or a conditional-stamp + self-test design)."
130
+ - validator_id: claim-projection-validator
131
+ obligation_id: require_blocked_projection_to_have_limitation_or_recovery_refs
132
+ coverage_status: pending
133
+ tier: flat
134
+ note: "slice-23 R1 audit (2026-06-23, codex P2): subset of named scope. The unconditional guard (~924-934, blocked_projection_missing_recovery_ref) keys only on claim_level=='blocked', but material_kind_support rows express blocked via machine_status=='blocked' while keeping claim_level=='not_applicable'. Their blocked-recovery check (~893-912) is gated on the optional requiredValidationStatuses arg, so when it is absent a blocked material-support row can drop its limitation refs and pass. Recording deferred pending the unconditional check also covering material_kind_support machine_status=='blocked'."
135
+ - validator_id: claim-projection-validator
136
+ obligation_id: require_each_projection_row_to_cite_runtime_validation_authorities
137
+ coverage_status: pending
138
+ tier: flat
139
+ note: "slice-23 R1 audit (2026-06-23, codex P2): presence-only proxy. The unconditional check (~861-867, required_validation_ref_missing) only requires required_validation_refs to be non-empty; arbitrary strings (e.g. ghost-validation.yaml) pass. Whether the refs are the ACTUAL runtime validation authorities is checked only when the optional expectedRequiredValidationRefs is supplied (~868-892), which the validator does not internally derive. Recording deferred pending a mandatory/derived authority-set match (cf. slice-21 user_confirmation presence-only park)."
140
+ - validator_id: claim-projection-validator
141
+ obligation_id: validate_all_public_and_downstream_projection_surfaces_are_present
142
+ coverage_status: pending
143
+ tier: flat
144
+ note: "slice-23 R1 audit (2026-06-23, codex P2): presence-only, not one-per-surface. The check (~949-956, missing_required_surface) verifies each PROJECTION_SURFACE appears at least once, but the contract (design ~1172) requires every status/result/API/MCP/handoff/material-kind-support claim to consume ONE pre-publication projection row. A duplicate surface (two rows, unique ids) passes the presence check. The one-row-per-surface guarantee is enforced only via the gated expectedClaimProjection derived-match. Recording deferred pending an unconditional one-row-per-surface check."
145
+ - validator_id: claim-projection-validator
146
+ obligation_id: validate_claim_level_decision_state_and_actionability_claim_alignment
147
+ coverage_status: pending
148
+ tier: flat
149
+ note: "slice-23 R1 audit (2026-06-23, codex P2): one-directional. The unconditional checks (~829-860) enforce decision_state=>actionability_claim (actionable_ready=>ready, actionable_limited=>limited) and claim_level actionable_ready=>actionable_ready decision, but NOT the reverse: a row with decision_state=='continue', claim_level=='maturation_in_progress', actionability_claim=='ready' is accepted. Full alignment is enforced only via the gated expectedClaimProjection derived-match. Recording deferred pending bidirectional alignment (actionability_claim=='ready' requires actionable_ready decision_state)."
150
+ - validator_id: competency-question-assessment-validator
151
+ obligation_id: validate_answer_status_against_active_answerability_contract
152
+ coverage_status: pending
153
+ tier: flat
154
+ note: "slice-12 audit (2026-06-22): AMBIGUOUS — structure-only, content judgment is blind. The validator checks answer_status enum validity (invalid_enum) + per-status STRUCTURAL requirements (answerable→evidence_refs + required_seed_refs; unsupported/deferred→missing_source_or_confirmation), but never verifies the answer_status reflects actual answerability from evidence CONTENT — that judgment is the content-blind host-LLM assessment step (see contract-runtime-gap-ledger silent-defect #1), not validated here. The per-status structural rules are real but the name (\"active answerability contract\") implies the content/answerability semantics the validator does not check. Recording deferred pending content-aware answerability validation or name reconciliation."
155
+ - validator_id: competency-question-assessment-validator
156
+ obligation_id: validate_answerability_trace_refs_close_against_seed_evidence_limitations_and_proofs
157
+ coverage_status: pending
158
+ tier: flat
159
+ note: "slice-12 audit (2026-06-22): NOT_FOUND for the named arms. The assessment artifact has no answerability_trace_refs, limitation_refs, or proof_refs fields. The validator closes evidence_refs (unknown_observation_ref) and required_seed_refs (recorded separately as validate_required_seed_refs_close_against_question_seed_refs) and linked_claim_ids against the question, but NEVER against limitations or proofs (proofs are separate query/visualization/graph-exploration-proofs artifacts). Of the four named arms (seed, evidence, limitations, proofs) only seed+evidence are closed, and there is no trace_refs field. Recording deferred pending limitation/proof closure (or name reconciliation; the seed arm is already covered)."
160
+ - validator_id: competency-questions-validator
161
+ obligation_id: emit_required_evidence_scope_runtime_projection
162
+ coverage_status: pending
163
+ tier: flat
164
+ note: "slice-27 audit (2026-06-23): PROJECTION_ONLY — the validator derives derivedRequiredEvidenceScope(question) per question and emits it to required_evidence_scope_projection[] in the return (post-seed-validation.ts ~1451), with NO violation. A value derived/exposed in the output with no breaching binding is unrecordable (slice-24 projection-only kind); the consumer that acts on the projection would own any enforcement."
165
+ - validator_id: competency-questions-validator
166
+ obligation_id: enforce_p3_diagnostic_or_claim_based_admission_disposition_rule
167
+ coverage_status: pending
168
+ tier: flat
169
+ note: "slice-27 audit (2026-06-23): NOT_FOUND — the validator has no code enforcing a P3/diagnostic admission-disposition rule (no priority or diagnostic-disposition field is read against the trace-ref membership). The admitted-disposition enforcement that IS wired is the exactly-one-per-admitted-id rule (recorded as enforce_admitted_domain_competency_disposition_rule). No bindable violation for the P3-diagnostic arm; recording deferred pending implementation."
170
+ - validator_id: competency-questions-validator
171
+ obligation_id: validate_classification_level_axis_facet_coverage
172
+ coverage_status: pending
173
+ tier: flat
174
+ note: "slice-27 audit (2026-06-23): NOT_FOUND — the per-question loop never reads a classification_level_axis_facets[] field; no such field exists on the competency-question schema (classification_level_axis_refs[] exists only on ontology-seed.classification_mapping, not on questions). declared≠wired; recording deferred pending the field being added and read."
175
+ - validator_id: competency-questions-validator
176
+ obligation_id: validate_hidden_label_facet_coverage
177
+ coverage_status: pending
178
+ tier: flat
179
+ note: "slice-27 audit (2026-06-23): NOT_FOUND — the per-question loop never reads a hidden_label_facets[] field; the contract (§15) folds hidden-label/search-label policy into terminology coverage (terminology_facets[], recorded as validate_terminology_facet_coverage). No separate hidden_label field exists or is read; recording deferred pending name reconciliation or a dedicated field."
180
+ - validator_id: competency-questions-validator
181
+ obligation_id: validate_query_visualization_graph_contract_refs_when_applicable
182
+ coverage_status: pending
183
+ tier: flat
184
+ note: "slice-27 audit (2026-06-23) + codex #142: PARTIAL/presence-only — the validator resolves PRESENT query_access/visualization/graph_exploration_contract_refs against the registry (unknown_id), but never enforces the '_when_applicable' arm: when a seed makes a query/visualization/graph contract applicable, the matching refs must be present (or limitation-backed), and an empty applicable array is silently accepted. The ref-resolution half is wired but the applicability-presence half is not, so the named scope is not fully enforced. Recording deferred pending the presence check (a behavior change beyond instrumentation)."
185
+ - validator_id: competency-questions-validator
186
+ obligation_id: validate_reasoning_formalism_facet_coverage
187
+ coverage_status: pending
188
+ tier: flat
189
+ note: "slice-27 audit + codex #142 R2: PARTIAL/presence-only — the validator only validateRefArray-resolves the PRESENT reasoning_or_formalism_facets refs against the registry (unknown_id); it never enforces the contract '_coverage' arm (when ontology_handoff_axis_refs includes reasoning_or_formalism_profile, the question must cover or limitation-back the reasoning facets). The conditional facet-presence requirement is unwired, so the named coverage scope is not enforced. Recording deferred pending the per-axis facet-presence check."
190
+ - validator_id: competency-questions-validator
191
+ obligation_id: validate_entity_identity_facet_coverage
192
+ coverage_status: pending
193
+ tier: flat
194
+ note: "slice-27 audit + codex #142 R2: PARTIAL/presence-only — only resolves PRESENT entity_identity_facets refs (unknown_id); never enforces the conditional facet-presence requirement when the entity_identity axis is applicable. Same presence-only gap as the sibling *_facet_coverage obligations. Recording deferred."
195
+ - validator_id: competency-questions-validator
196
+ obligation_id: validate_instance_assertion_facet_coverage
197
+ coverage_status: pending
198
+ tier: flat
199
+ note: "slice-27 audit + codex #142 R2: PARTIAL/presence-only — only resolves PRESENT instance_assertion_facets refs (unknown_id); never enforces the conditional facet-presence requirement when the instance_assertion axis is applicable. Recording deferred."
200
+ - validator_id: competency-questions-validator
201
+ obligation_id: validate_terminology_facet_coverage
202
+ coverage_status: pending
203
+ tier: flat
204
+ note: "slice-27 audit + codex #142 R2: PARTIAL/presence-only — only resolves PRESENT terminology_facets refs (unknown_id); never enforces the conditional facet-presence requirement when the terminology axis is applicable. Recording deferred."
205
+ - validator_id: competency-questions-validator
206
+ obligation_id: validate_relation_type_facet_coverage
207
+ coverage_status: pending
208
+ tier: flat
209
+ note: "slice-27 audit + codex #142 R2: PARTIAL/presence-only — only resolves PRESENT relation_type_facets refs (unknown_id); never enforces the conditional facet-presence requirement when the relation_typing axis is applicable. Recording deferred."
210
+ - validator_id: competency-questions-validator
211
+ obligation_id: validate_classification_facet_coverage
212
+ coverage_status: pending
213
+ tier: flat
214
+ note: "slice-27 audit + codex #142 R2: PARTIAL/presence-only — only resolves PRESENT classification_facets refs (unknown_id); never enforces the conditional facet-presence requirement when the classification axis is applicable. Recording deferred."
215
+ - validator_id: competency-questions-validator
216
+ obligation_id: validate_constraint_facet_coverage
217
+ coverage_status: pending
218
+ tier: flat
219
+ note: "slice-27 audit + codex #142 R2: PARTIAL/presence-only — only resolves PRESENT constraint_facets refs (unknown_id); never enforces the conditional facet-presence requirement when the constraints axis is applicable. Recording deferred."
220
+ - validator_id: competency-questions-validator
221
+ obligation_id: validate_modeling_concern_facet_coverage
222
+ coverage_status: pending
223
+ tier: flat
224
+ note: "slice-27 audit + codex #142 R2: PARTIAL — the per-question modeling_concern_facets check is presence-only (resolves present refs, unknown_id), and the post-loop required-concern coverage check (requiredModelingConcerns must be covered) populates coveredModelingConcerns from ANY question regardless of lifecycle_status, so an inactive/unsupported question counts as coverage (same inactive-coverage gap codex flagged for the required-axis obligation). Neither arm fully enforces the named coverage scope. Recording deferred."
225
+ - validator_id: competency-questions-validator
226
+ obligation_id: validate_required_ontology_handoff_axis_coverage_or_limitation_backed_disposition
227
+ coverage_status: pending
228
+ tier: flat
229
+ note: "slice-27 audit + codex #142 R2: PARTIAL — coveredOntologyHandoffAxes is populated from EVERY question's ontology_handoff_axis_refs before any lifecycle/disposition filtering, so a required axis mentioned only by an inactive (lifecycle_status=unsupported_candidate) or non-limitation-backed question still satisfies the post-loop coverage check. The obligation requires representation by an ACTIVE question OR an unsupported/deferred limitation-backed disposition; that active/limitation-backed filter is unwired. Recording deferred."
230
+ - validator_id: failure-classification-validator
231
+ obligation_id: classify_missing_or_failed_active_validation_artifact_as_required_gate_failure
232
+ coverage_status: pending
233
+ tier: flat
234
+ note: "slice-13 audit (2026-06-22, codex PR #123): UNWIRED ON THIS VALIDATOR (not a re-attribution). The obligation is registered on failure-classification-validator and design.md:3275-3280 says failure-classification VALIDATION must consume the failed-gate validation artifacts (and per the failure_classification_gate required_when predicate, runtime-halt / unresolved-work evidence such as reconstruct-metrics.yaml, not only missing/failed validations). But validateFailureClassification (post-seed-validation.ts) takes only failure_classification + competency-question-assessment + seed-confirmation-validation and validates authored rows structurally (duplicate_id / failure_kind invalid_enum / question_id+claim_id unknown_id / rationale_missing — none a registered obligation); it never reads the gate validation artifacts to detect missing/failed/halted state and classify them as required-gate failures. Backlog: wire this consumption INTO this validator; the AUTHORITATIVE input set is the registry record's input_authority_refs + dynamic_input_authority_rule + the gate's required_when predicate (do not rely on this note's prose as the spec — read the registry). Recording deferred."
235
+ - validator_id: failure-classification-validator
236
+ obligation_id: classify_missing_or_failed_promoted_maturation_validation_artifact_as_required_gate_failure
237
+ coverage_status: pending
238
+ tier: flat
239
+ note: "slice-13 audit (2026-06-22, codex PR #123): UNWIRED ON THIS VALIDATOR. The registry binds the promoted/requested validations to this validator via conditional_input_authority_refs + the dynamic_input_authority_rule, but validateFailureClassification receives none of them and performs no promoted-gate missing/failed classification. Backlog: wire INTO this validator over the registry-declared promoted-authority set (the registry's conditional_input_authority_refs/dynamic rule is the authoritative list — do not enumerate from this note). Recording deferred."
240
+ - validator_id: failure-classification-validator
241
+ obligation_id: derive_planned_gate_failure_inputs_from_registry_gate_catalogs_not_hand_maintained_lists
242
+ coverage_status: pending
243
+ tier: flat
244
+ note: "slice-13 audit (2026-06-22, codex PR #123): UNWIRED ON THIS VALIDATOR. The registry's dynamic_input_authority_rule explicitly assigns THIS validator to 'consume every validation_artifact_ref from validation_gate_catalog and planned_validation_gate_catalog whose required_when is true … hand-maintained conditional_input_authority_refs are non-authoritative cache hints only' (design.md:2336-2340). validateFailureClassification never receives the registry/catalogs and does no required_when-driven derivation. Backlog: wire the catalog-driven derivation INTO this validator. Recording deferred."
245
+ - validator_id: failure-classification-validator
246
+ obligation_id: validate_failure_trigger_against_active_runtime_validation_authorities
247
+ coverage_status: pending
248
+ tier: flat
249
+ note: "slice-13 audit (2026-06-22, codex PR #123): AMBIGUOUS — name broader than code. The validator resolves failure.question_id against the competency-question-assessment and failure.claim_id against the seed-confirmation-validation (unknown_id) — the failure's SUBJECT refs, not its TRIGGER (the missing/failed gate validation artifact the contract names). The registry declares the active runtime VALIDATION-artifact authorities for this validator (a subset of input_authority_refs — NOT the authored failure-classification.yaml, run-manifest, or registry metadata refs); the function reads only two of them. Backlog: wire a trigger check over the registry-declared active validation-artifact authorities (read the registry for the exact refs). Recording deferred."
250
+ - validator_id: failure-classification-validator
251
+ obligation_id: validate_failure_trigger_against_promoted_planned_validation_authorities
252
+ coverage_status: pending
253
+ tier: flat
254
+ note: "slice-13 audit (2026-06-22, codex PR #123): UNWIRED ON THIS VALIDATOR over the promoted/requested authority set. validateFailureClassification receives none of the promoted-planned validation authorities. Backlog: wire the trigger check over the AUTHORITATIVE promoted-authority set = the registry record's conditional_input_authority_refs whose consumed_for lists this obligation, resolved via the dynamic_input_authority_rule (read the registry for the exact refs — this note deliberately does not enumerate them, since the registry is the SSOT and a prose list drifts). Recording deferred."
255
+ - validator_id: handoff-decision-validator
256
+ obligation_id: consume_all_requested_or_promoted_planned_gate_statuses_emitted_by_runtime
257
+ coverage_status: pending
258
+ tier: flat
259
+ note: "slice-19 audit (2026-06-23): NOT_FOUND — depends on planned_validation_gate_catalog, which is declared in the registry YAML but NEVER loaded into the runtime ReconstructContractRegistry (the loader does not parse it; grep: zero references to planned_validation_gate_catalog in src/core-runtime/reconstruct). projectGateStatusesOnce iterates contractRegistry.validation_gate_catalog (active gates) only, so requested/promoted planned gate statuses are never consumed. This is a genuine declared-but-unwired surfacing (owner: load planned gates into the registry, or re-scope the obligation)."
260
+ - validator_id: handoff-decision-validator
261
+ obligation_id: derive_terminal_planned_gate_inputs_from_registry_gate_catalogs_not_hand_maintained_lists
262
+ coverage_status: pending
263
+ tier: flat
264
+ note: "slice-19 audit (2026-06-23): NOT_FOUND — same root cause as consume-planned: planned_validation_gate_catalog is never loaded, so terminal planned gate inputs are not derived from any registry catalog. The active gate projection derives from validation_gate_catalog, but the planned-gate derivation this obligation names does not exist in the runtime."
265
+ - validator_id: handoff-decision-validator
266
+ obligation_id: do_not_require_failure_or_revision_artifacts_for_clean_stop_decisions
267
+ coverage_status: pending
268
+ tier: flat
269
+ note: "slice-19 audit (2026-06-23): defensive NEGATIVE obligation — the validator does not require failure-classification/revision-proposal artifacts for a clean stop (those gates are conditional via registry required_when predicates, skipped when not_applicable). There is no positive bindable violation for 'do not require' (a clean stop simply clears); the property is delegated to the registry predicate catalog, not a distinct enforcer in validateHandoffDecision. Recording deferred (no non-vacuous breaching binding)."
270
+ - validator_id: handoff-decision-validator
271
+ obligation_id: project_missing_required_promoted_or_requested_planned_gate_validation_artifact_as_blocked
272
+ coverage_status: pending
273
+ tier: flat
274
+ note: "slice-19 audit (2026-06-23): NOT_FOUND — depends on planned_validation_gate_catalog (never loaded). Missing planned gate validation artifacts are never consulted or projected as blocked; only missing ACTIVE artifacts are (recorded as project_missing_active_validation_artifact_as_blocked)."
275
+ - validator_id: handoff-decision-validator
276
+ obligation_id: validate_accepted_maturation_execution_minimum_output_gates_are_terminal_projected
277
+ coverage_status: pending
278
+ tier: flat
279
+ note: "slice-19 audit (2026-06-23): AMBIGUOUS — no distinct 'accepted maturation execution minimum output gates' selection exists. projectGateStatusesOnce terminal-projects ALL applicable active gates from validation_gate_catalog, but there is no maturation-minimum filter or maturation-context gate selection naming this obligation, and the planned/maturation gates it implies are unloaded. No name-matching enforcer."
280
+ - validator_id: handoff-decision-validator
281
+ obligation_id: validate_failure_classification_covers_failed_or_missing_requested_planned_gates
282
+ coverage_status: pending
283
+ tier: flat
284
+ note: "slice-19 audit (2026-06-23): NOT_FOUND — depends on planned_validation_gate_catalog (never loaded). The validator consumes failureClassificationValidation only as metadata (material_failure_count) and for predicate evaluation; it never validates that failure classification COVERS failed/missing planned gates."
285
+ - validator_id: material-admission-ledger-validator
286
+ obligation_id: validate_phase_scoped_input_kind_disposition_and_snapshot_refs
287
+ coverage_status: pending
288
+ tier: flat
289
+ note: "slice-15 audit (2026-06-23): AMBIGUOUS — multi-facet name, one facet unenforced. The name binds THREE facets: phase-scoped input_kind, phase-scoped disposition, and snapshot_refs. Two are enforced — phase→input_kind (invalid_phase_input_kind: pre_seed_purpose_element→purpose_adequacy_element, pre_seed_material_value→material_value, post_cq_domain_competency→domain_competency_question) and input_kind→snapshot_ref (missing_snapshot_ref per input_kind). But the DISPOSITION facet is NOT enforced: the code only validates disposition against the global enum (invalid_enum), never restricting disposition VALUES by input_kind/admission_phase. The contract (ontology-seeding-and-maturation-design.md §Material value and domain competency admission, the admit-when table) restricts dispositions per input_kind (material_value ⊆ {admitted_material, trace_audit_only, out_of_scope, deferred_authority, rejected_ambiguous}; domain_competency_question ⊆ {required_blocking, supporting_material, diagnostic_only, deferred_product_decision, out_of_scope}), so e.g. a material_value row carrying required_blocking passes uncaught. Recording deferred pending a per-input_kind disposition allow-set check (or the name reconciled to drop the disposition facet)."
290
+ - validator_id: maturation-answer-claims-validator
291
+ obligation_id: require_partial_answers_to_have_limitation_or_frontier_refs
292
+ coverage_status: pending
293
+ tier: flat
294
+ note: "slice-4 audit (2026-06-22): validateMaturationAnswerClaims enforces 'partially_answered → limitation_refs' (missing_required_ref), but the 'OR frontier' alternative is unrepresentable — ReconstructMaturationAnswerClaim has no frontier_refs field. Name/artifact mismatch; recording deferred pending the frontier alternative being added or the name reconciled with the limitation-only check."
295
+ - validator_id: maturation-answer-claims-validator
296
+ obligation_id: validate_answer_claim_surface_dimension_and_purpose_element_refs
297
+ coverage_status: pending
298
+ tier: flat
299
+ note: "slice-4 audit (2026-06-22): all three ref arrays are presence-validated (missing_required_coverage) and target_surface_refs are resolved against the question (conflicting_state), but target_dimension_refs and purpose_element_refs are NOT resolved against the question — only presence-checked. Recording deferred pending dimension/purpose resolution checks or an owner decision (partial enforcement)."
300
+ - validator_id: maturation-answer-claims-validator
301
+ obligation_id: validate_support_mode_against_valid_evidence_cluster_or_authority
302
+ coverage_status: pending
303
+ tier: flat
304
+ note: "slice-4 audit (2026-06-22): support_mode is validated against evidence clusters (invalid_enum, conflicting_state on cluster-mode mismatch, support_mode_missing_authority when no cluster is cited), but the 'OR authority' alternative branch is not implemented — there is no validation path against an authority artifact. Recording deferred pending the authority branch or name reconciliation."
305
+ - validator_id: maturation-authority-response-validator
306
+ obligation_id: preserve_unavailable_or_rejected_authority_as_blocked_or_limitation_state
307
+ coverage_status: pending
308
+ tier: flat
309
+ note: "slice-14 audit (2026-06-22): NOT_FOUND in validateMaturationAuthorityResponse (maturation-validation.ts). unavailable/deferred responses are only COUNTED into unavailable_response_count (return field); no violation fires when an unavailable/rejected/deferred/contradicted response fails to be preserved as a blocked/limitation state (no limitation_refs requirement). Preserving the gap as blocked/limitation is a downstream continuation/closure-decision consumer's job. Recording deferred pending a validator-side preservation check."
310
+ - validator_id: maturation-authority-response-validator
311
+ obligation_id: reject_authority_response_that_claims_source_support_without_source_observation_refs
312
+ coverage_status: pending
313
+ tier: flat
314
+ note: "slice-14 audit (2026-06-22, codex PR #124): a substring PROXY, not resolution. The only check is supporting_refs.some(ref => ref.includes('source-observations')) (support_mode_missing_authority) — it never loads source-observations.yaml or resolves observation ids, and a misleading ref such as 'not-source-observations' satisfies the substring while citing no real source observation. A breaching input (claims source support, no real source-observation ref) escapes, so this is not contract-complete. Recording deferred pending resolution against source-observations.yaml."
315
+ - validator_id: maturation-authority-response-validator
316
+ obligation_id: validate_authority_identity_and_snapshot_refs_are_recorded
317
+ coverage_status: pending
318
+ tier: flat
319
+ note: "slice-14 audit (2026-06-22): AMBIGUOUS — only the identity arm is enforced. The validator requires authority_identity.authority_id/label/role to be non-empty (missing_required_ref), but never checks authority_snapshot_ref or authority_version_or_timestamp are recorded. Name says 'identity AND snapshot refs'; the snapshot arm is unenforced. Recording deferred pending a snapshot-ref recorded check."
320
+ - validator_id: maturation-authority-response-validator
321
+ obligation_id: validate_authority_response_refs_against_maturation_closure_frontier_authority_requests
322
+ coverage_status: pending
323
+ tier: flat
324
+ note: "slice-14 audit (2026-06-22, codex PR #124): the validator does resolve authority_request_ref against maturationClosureFrontier.authority_requests (unknown_id) + kind match (conflicting_state), but recording it is unsafe on two counts. (1) The validator record under-declares its inputs — it lists maturation-authority-response.yaml + maturation-closure-frontier-VALIDATION.yaml + registry, but NOT maturation-closure-frontier.yaml, the artifact whose authority_requests the check needs; a registry-driven consumer would not provide it (declared≠wired). (2) No cross-artifact binding: the validator resolves against whichever frontier the caller passes and never checks response.closure_frontier_ref or frontier-validation.maturation_closure_frontier_ref name that same frontier, so a reused authority-response from another frontier validates against a mismatched frontier with matching ids (same class as the #100 matrix cross-artifact-binding follow-up). Recording deferred pending the frontier-artifact input declaration + response↔frontier↔frontier-validation binding."
325
+ - validator_id: maturation-authority-response-validator
326
+ obligation_id: validate_authority_response_status_and_scope
327
+ coverage_status: pending
328
+ tier: flat
329
+ note: "slice-14 audit (2026-06-22): AMBIGUOUS — name broader than code. The only status-specific enforcement is response_status=='provided' requiring supporting_refs or response_source_ref (missing_required_ref); the other statuses (unavailable/rejected/deferred/contradicted) carry no status validation, and there is no explicit 'scope' check (the authority_kind match belongs to validate_authority_response_refs_against_maturation_closure_frontier_authority_requests). Recording deferred pending full status/scope validation."
330
+ - validator_id: maturation-baseline-validator
331
+ obligation_id: preserve_immutable_source_seed_and_validation_refs_used_to_compute_baseline
332
+ coverage_status: pending
333
+ tier: flat
334
+ note: "slice-2 audit (2026-06-22): validateMaturationBaseline copies the source seed/validation refs into its validation artifact but enforces no immutability/tamper check on them — no distinct enforcement site located. Recording deferred pending an added enforcement check or an owner decision (the obligation may be enforced by a downstream validator and mis-attributed here)."
335
+ - validator_id: maturation-baseline-validator
336
+ obligation_id: validate_baseline_rows_cover_static_kinetic_dynamic_surfaces_and_maturity_dimensions
337
+ coverage_status: pending
338
+ tier: flat
339
+ note: "slice-2 audit (2026-06-22): no enforcement site DISTINCT from the already-recorded required-element tuple coverage (validate_baseline_rows_cover_selected_purpose_frame_required_elements) was located; the per-row surface/dimension checks validate present-row validity, not full static/kinetic/dynamic surface coverage. Recording deferred pending a distinct site or an owner decision to fold this into the recorded coverage obligation."
340
+ - validator_id: maturation-baseline-validator
341
+ obligation_id: validate_baseline_rows_trace_to_seed_refs_limitations_or_validated_assessment_gaps
342
+ coverage_status: pending
343
+ tier: flat
344
+ note: "slice-2 audit (2026-06-22): validateMaturationBaseline validates purpose_element_ref resolution but enforces no per-row trace-to-seed_refs/limitations/validated-assessment-gaps check — no distinct enforcement site located. Recording deferred pending an added enforcement check or an owner decision."
345
+ - validator_id: maturation-closure-frontier-validator
346
+ obligation_id: reject_duplicate_or_already_observed_source_requests
347
+ coverage_status: pending
348
+ tier: flat
349
+ note: "slice-25 R1 audit (2026-06-23, codex P2): PARTIAL. The validator de-dupes source_request_id and rejects already-observed refs, but two requests with DISTINCT ids targeting the same unobserved requested_source_ref both enter accepted_source_request_ids. In a real run that passes validation and then the re-entry observer throws on the second accepted id (run.ts ~9870-9884). Contract (design ~1372-1373) requires rejecting duplicate source requests (same target). Recording deferred pending same-target-ref duplicate rejection."
350
+ - validator_id: maturation-closure-frontier-validator
351
+ obligation_id: reject_unsupported_material_refs
352
+ coverage_status: pending
353
+ tier: flat
354
+ note: "slice-25 R1 audit (2026-06-23, codex P2): PARTIAL. The validator treats ANY inventory row as supported and only rejects a missing row; rows with exists:false, scan_status:skipped, or a non-concrete kind still validate and are accepted. The runtime then builds a detection and buildReconstructSourceObservation returns null for non-existent/non-concrete refs, throwing (materialize-preparation.ts ~434-436; run.ts ~9908-9911). Recording deferred pending rejection of skipped/non-existent/non-concrete inventory entries."
355
+ - validator_id: maturation-closure-frontier-validator
356
+ obligation_id: validate_closure_frontier_question_refs_against_material_unanswered_questions
357
+ coverage_status: pending
358
+ tier: flat
359
+ note: "slice-25 R1 audit (2026-06-23, codex P2): PARTIAL + declared≠wired. (a) An empty source-request question_refs array fires no violation, so a request resolves to zero material questions and still validates. (b) The check reads questions/materialQuestions from the maturation-question-frontier ARTIFACT, but the registry input_authority_refs (registry ~2613-2619) declares only maturation-question-frontier-validation.yaml, not the artifact — a registry-driven consumer cannot supply it (slice-14 pattern). Recording deferred pending non-empty-refs enforcement + the frontier artifact declared as an input."
360
+ - validator_id: maturation-closure-frontier-validator
361
+ obligation_id: validate_closure_frontier_source_requests_preserve_member_and_cross_material_lineage
362
+ coverage_status: pending
363
+ tier: flat
364
+ note: "slice-25 R1 audit (2026-06-23, codex P2): dead discriminator. The mixed-lineage check fires only when an individual source request has target_material_kind === 'mixed', but real mixed targets are an aggregate detection while inventory units / source requests carry concrete per-ref kinds (materialize-preparation.ts ~46-56, ~729-732) that exclude 'mixed'. A mixed target requesting a concrete member source (e.g. code) with empty lineage validates anyway. Contract (design ~1374-1376) requires lineage for mixed-material source requests. Recording deferred pending enforcement keyed on the real (aggregate) mixed-target signal or the target profile."
365
+ - validator_id: maturation-closure-frontier-validator
366
+ obligation_id: validate_authority_request_question_refs_against_material_unanswered_questions
367
+ coverage_status: pending
368
+ tier: flat
369
+ note: "slice-25 R1 audit (2026-06-23, codex P2): PARTIAL + declared≠wired. Same two issues as the source-request question_refs obligation: an empty authority-request question_refs array fires no violation, and the materiality check reads the maturation-question-frontier ARTIFACT which the registry does not declare as an input authority (registry ~2613-2619). Recording deferred pending non-empty-refs enforcement + the frontier artifact declared as an input."
370
+ - validator_id: maturation-closure-frontier-validator
371
+ obligation_id: validate_authority_request_blocking_semantics_against_question_materiality
372
+ coverage_status: pending
373
+ tier: flat
374
+ note: "slice-25 R1 audit (2026-06-23, codex P2): declared≠wired. The blocker-must-block check reads question.materiality from the maturation-question-frontier ARTIFACT, but the registry input_authority_refs (registry ~2613-2619) declares only maturation-question-frontier-validation.yaml, not the artifact — a registry-driven consumer cannot reproduce the check (slice-14 pattern). Recording deferred pending the frontier artifact declared as an input authority."
375
+ - validator_id: maturation-closure-frontier-validator
376
+ obligation_id: reject_duplicate_authority_requests_for_same_question_authority_kind_and_scope
377
+ coverage_status: pending
378
+ tier: flat
379
+ note: "slice-25 R1 audit (2026-06-23, codex P2): scope-too-coarse. The dedupe keys on the ENTIRE sorted question_refs array, so a request covering [q1,q2] and another covering [q1] with the same authority kind and scope both validate even though they duplicate the same (question, kind, scope) for q1. Contract (design ~1379-1380) is per-question. Recording deferred pending per-question dedupe."
380
+ - validator_id: maturation-continuation-decision-validator
381
+ obligation_id: validate_continuation_state_against_validated_actionability_matrix_and_frontier_state
382
+ coverage_status: pending
383
+ tier: flat
384
+ note: "slice-22 audit (2026-06-23): AMBIGUOUS. The name is broad ('continuation_state against validated matrix AND frontier_state') and its intent is split across three non-overlapping enforcement regions with no single block that matches it 1:1: the blanket prior-validation loop (requires all 8 upstream validations valid, of which matrix/question-frontier/closure-frontier are three), the claim_scope partition recompute (decision included/excluded refs must equal the matrix closed/non-closed rows — overlaps the actionable_limited row-scope obligation), and the material-open-rows gate (overlaps reject_actionable_ready_when_material_blocker_or_high_row_remains_unclosed). Recording deferred (would need splitting into narrower obligations e.g. require_prior_validation_status_valid / validate_claim_scope_partition_against_matrix, or absorbing into the existing recorded gates)."
385
+ - validator_id: maturation-continuation-decision-validator
386
+ obligation_id: validate_continue_ask_user_or_blocked_state_against_available_next_authority
387
+ coverage_status: pending
388
+ tier: flat
389
+ note: "slice-22 audit (2026-06-23): PARTIAL. The validator enforces continue (requires >=1 next_frontier_ref) and ask_user (requires >=1 authority_request_ref), but the named `blocked` state has NO enforcement against next-authority availability. Contract (design ~1539: deferred_external_authority projects ask_user/blocked/limitation depending on availability) expects blocked to be validated against unavailability, but no such check exists. Recording deferred pending a `blocked`-state enforcer."
390
+ - validator_id: maturation-continuation-decision-validator
391
+ obligation_id: bind_revision_proposal_validation_to_consumed_revision_proposal
392
+ coverage_status: pending
393
+ tier: flat
394
+ note: "slice-22 R1 audit (2026-06-23, codex P2): caller-supplied-optional-arg gate. The binding check (revisionProposalValidation.revision_proposal_ref must match the consumed proposal) only runs when the caller supplies the optional `revisionProposalRef`; the validator has no internal guarantee it is provided, so for direct/pure calls the obligation is advertised but the check is inert. Same disposition as slice-18 expectedRegistrySha256 (run-control slice-10 principle). Recording deferred pending an internal guarantee that the consumed proposal ref is always present."
395
+ - validator_id: maturation-continuation-decision-validator
396
+ obligation_id: reject_actionable_ready_when_material_blocker_or_high_row_remains_unclosed
397
+ coverage_status: pending
398
+ tier: flat
399
+ note: "slice-22 R1 audit (2026-06-23, codex P2): subset of named scope. The gate builds materialOpenRows from blocker/high rows with member_readiness=='frontier_required' only, but the obligation names 'unclosed' which also covers 'limitation_backed' (a distinct non-closed member_readiness value). A hand-edited actionable_ready decision with a limitation_backed blocker/high row therefore bypasses the gate. Recording deferred pending the gate covering all non-closed material rows (frontier_required + limitation_backed)."
400
+ - validator_id: maturation-continuation-decision-validator
401
+ obligation_id: validate_limitation_refs_and_row_scope_for_actionable_limited_state
402
+ coverage_status: pending
403
+ tier: flat
404
+ note: "slice-22 R2 audit (2026-06-23, codex P2): name-broader-than-code. The validator firmly enforces the row_scope facet (actionable_limited requires >=1 included_row_ref) but the limitation-ref facet is only a weak presence check (requires excluded_row_refs OR limitation_refs to be non-empty). An actionable_limited decision that excludes a limitation_backed matrix row but DROPS that row's limitation_refs still passes (satisfied by the excluded row alone). Only candidate-limitation and revision-blocker preservation are enforced (separate obligations); per-row limitation_backed limitation_refs are not preserved. Recording deferred pending row-level limitation-ref preservation."
405
+ - validator_id: maturation-convergence-ledger-validator
406
+ obligation_id: preserve_remaining_frontier_refs_without_ready_projection
407
+ coverage_status: pending
408
+ tier: flat
409
+ note: "slice-16 audit (2026-06-23): AMBIGUOUS — composite name, only the resolution sub-check is enforced. The code validates remaining_frontier_refs resolve to frontier questions (unknown_id, maturation-validation.ts ~3874) = the FIRST clause of contract bullet (h) (design §convergence-ledger must-prove). But the 'without ready projection' framing references the ready-projection terminal gate that contract (h) explicitly DEFERS ('becomes a stronger terminal projection gate WHEN actionable ontology projection is implemented'); this validator has no ready-projection logic and no enforcer ties remaining-frontier preservation to a ready gate. A breaching input binds only the resolution check, not the composite. Recording deferred pending the ready-projection gate, or re-attribution as a plain resolve-remaining-frontier-refs obligation."
410
+ - validator_id: maturation-convergence-ledger-validator
411
+ obligation_id: reject_actionable_ready_until_final_requestion_convergence_is_proven
412
+ coverage_status: pending
413
+ tier: flat
414
+ note: "slice-16 audit (2026-06-23): NOT_FOUND in this validator — DEFERRED gate. The convergence validator only REPORTS final_requestion_pass_status (it surfaces it on the output) and checks the pass-status/new-material-ref consistency; it never gates an actionable_ready projection. Contract bullet (h) states the ready gate 'becomes a stronger terminal projection gate WHEN actionable ontology projection is implemented' — i.e. rejecting actionable_ready until convergence is proven is owned by the actionable-ontology / continuation-decision projection, not here. Recording deferred pending that projection."
415
+ - validator_id: maturation-convergence-ledger-validator
416
+ obligation_id: reject_trace_audit_or_authority_request_rows_as_positive_semantic_support
417
+ coverage_status: pending
418
+ tier: flat
419
+ note: "slice-16 audit (2026-06-23): AMBIGUOUS — no name-matching positive-support enforcer. The closure-disposition enum has no 'authority_request' value (closest: deferred_external_authority), and the validator never rejects trace_audit_only or deferred rows from being counted as positive semantic support. The nearest check (conflicting_state ~3839) forbids trace_audit_only rows from citing expansions or closing blocker/high questions = contract bullet (d), a DIFFERENT rule. positiveSupportRefs (~3799) is computed and consumed only by the answered_no_semantic_change branch, not by a trace/authority exclusion gate. Recording deferred pending an explicit positive-support exclusion check (or name reconciliation against the trace_audit_only rule that IS enforced)."
420
+ - validator_id: maturation-convergence-ledger-validator
421
+ obligation_id: require_every_blocker_or_high_question_to_have_answer_expansion_blocked_or_frontier_closure
422
+ coverage_status: pending
423
+ tier: flat
424
+ note: "slice-16 audit (2026-06-23, codex PR #127): PARK — the recorded enforcer would be a weak proxy. Contract bullet (a) requires every blocker/high question to be closed, CARRIED FORWARD, or blocked WITH REFS. The code (missing_required_coverage, maturation-validation.ts ~3763) only checks the question id appears in some closure_rows[].question_refs: it (1) rejects the contract-permitted carried-forward-via-remaining_frontier_refs path, and (2) accepts a dummy out_of_scope/low closure row with no refs as 'closure' — it never validates the permitted dispositions or refs. Recording would let G10 treat the full closed/carried-forward/blocked-with-refs contract as covered. Recording deferred pending a check that validates the permitted closure dispositions + refs (and accepts carry-forward)."
425
+ - validator_id: maturation-convergence-ledger-validator
426
+ obligation_id: validate_each_source_observation_delta_row_has_convergence_closure_disposition
427
+ coverage_status: pending
428
+ tier: flat
429
+ note: "slice-16 audit (2026-06-23, codex PR #127): PARK — two gaps. (1) The closure-coverage enforcer (missing_required_coverage ~3710) is INSIDE the per-round loop; a source-observation-delta artifact with delta rows but an empty rounds[] array enforces nothing, so a stamp gated only on sourceObservationDelta presence would launder the zero-round shape. (2) Contract bullet (g) requires each consumed delta row to appear in exactly one source_observation_closure_rows[] row WITH A DISPOSITION, but the source-closure branch never reads sourceClosure.closure_disposition — a missing/out-of-enum disposition still passes. Recording deferred pending (a) gating on a reached source-delta round and (b) validating the closure_disposition field."
430
+ - validator_id: maturation-convergence-ledger-validator
431
+ obligation_id: validate_prior_maturation_validations_are_valid
432
+ coverage_status: pending
433
+ tier: flat
434
+ note: "slice-16 audit (2026-06-23, codex PR #127): PARK — incomplete prior-validation scope. The code checks the validation_status of the question-frontier, actionability-matrix, answer-support, answer-claims, and ontology-expansion validations (prior_validation_invalid ~3500-3538). But the registry declares rounds/<round-id>/source-observation-delta-validation.yaml as an input authority for delta-backed rounds, and this validator never receives or checks that validation artifact's status — an invalid source-observation-delta validation can be referenced while the obligation claims prior validations were proven. (Separately, actionability-matrix-validation is checked by code but NOT declared in the registry input_authority_refs — an inverse declared≠wired the owner may reconcile.) Recording deferred pending the source-delta validation status being added to the gate (or recording gated to non-delta runs)."
435
+ - validator_id: maturation-question-frontier-validator
436
+ obligation_id: validate_authority_need_rows_are_first_class_and_scope_to_questions
437
+ coverage_status: pending
438
+ tier: flat
439
+ note: "slice-6 audit (2026-06-22): validateMaturationQuestionFrontier reads question.authority_need only as part of the blocker/high closure check (recorded as require_blocker_and_high_questions_...); there is NO independent enforcement that authority_need rows are first-class or scoped to questions (authority_scope / expected_response_kind / blocking semantics are not validated here). A surfaced declared≠wired gap (may be enforced by maturation-closure-frontier-validator). Recording deferred."
440
+ - validator_id: maturation-question-frontier-validator
441
+ obligation_id: validate_competency_question_assessment_and_domain_trace_refs
442
+ coverage_status: pending
443
+ tier: flat
444
+ note: "slice-6 audit (2026-06-22): NO enforcement found — competency_question_refs / competency_assessment_refs / domain_competency_trace_refs are not accessed or resolved in validateMaturationQuestionFrontier. A surfaced declared≠wired gap. Recording deferred pending an added check or registry re-attribution."
445
+ - validator_id: maturation-question-frontier-validator
446
+ obligation_id: validate_question_materiality_surface_dimension_and_answer_status_enums
447
+ coverage_status: pending
448
+ tier: flat
449
+ note: "slice-6 audit (2026-06-22): materiality (invalid_enum) and surface/dimension non-emptiness (missing_required_coverage) ARE enforced, but the named answer_status enum clause is NOT — question.current_answer_status is never validated as an enum here. Partial; recording deferred pending the answer_status check or name reconciliation."
450
+ - validator_id: maturation-question-frontier-validator
451
+ obligation_id: validate_question_refs_against_baseline_seed_and_limitation_authorities
452
+ coverage_status: pending
453
+ tier: flat
454
+ note: "slice-6 audit (2026-06-22): baseline_row_refs ARE resolved against the maturation baseline (unknown_id) and purpose_element preservation is checked, but the named SEED and LIMITATION authority clauses are NOT enforced — seed_ref_refs are not accessed and limitation_refs are only checked for non-emptiness (as part of the closure obligation), never resolved against an authority. Partial; recording deferred."
455
+ - validator_id: ontology-expansion-validator
456
+ obligation_id: prevent_in_place_seed_authority_rewrite
457
+ coverage_status: pending
458
+ tier: flat
459
+ note: "slice-9 audit (2026-06-22, codex PR #119 finding): the contract clause is unscoped ('no expansion rewrites seed authority in place'), but the check only rejects refs whose path.basename(ref) === 'ontology-seed.yaml' (seed_authority_rewrite_attempt). target_seed_or_ontology_refs are LLM-authored free strings with no normalization (run.ts stringArray), so an anchored ref such as 'ontology-seed.yaml#semantic_layer/object-new' or 'ontology-seed.yaml:semantic_layer' has a different basename and bypasses the check while still naming the seed authority in place — narrower than the contract. Recording deferred pending a broadened seed-target match + enforcement binding (a dedicated hardening change, out of Track A recording scope)."
460
+ - validator_id: ontology-expansion-validator
461
+ obligation_id: validate_expansion_evidence_refs_against_valid_answer_support_ledger_or_seed_authority
462
+ coverage_status: pending
463
+ tier: flat
464
+ note: "slice-9 audit (2026-06-22): expansion evidence_refs ARE validated (unknown_id when not carried from cited answer claims; missing_required_ref when add/refine drops carried evidence), but against a PROXY — the cited answer claims' carried supporting_evidence_refs — not against the answer-support-ledger artifact or seed authority the name names. Neither is resolved in this validator. Partial/proxy; recording deferred pending direct ledger/seed-authority resolution or name reconciliation."
465
+ - validator_id: ontology-seed-validator
466
+ obligation_id: require_mixed_purpose_frame_projection_elements_to_preserve_member_source_and_cross_material_lineage_or_limitation
467
+ coverage_status: pending
468
+ tier: flat
469
+ note: "slice-26 audit (2026-06-23): NOT_FOUND in validateOntologySeed — the function never reads the named member-lineage fields (member_scope_refs / member_target_material_kind / member_source_refs / cross_material_ref_refs) on purpose_adequacy_frame.required_elements, and never discriminates on a `mixed` target. The mixed-target authority (target-material-profile-validation.yaml) is a registry-declared input_authority_ref but is NOT in this validator's function signature (declared≠wired). The analogous mixed-lineage enforcement is RECORDED on source-purpose-candidates-validator (require_mixed_purpose_frame_elements_to_carry_...). Recording deferred until the fields are read here."
470
+ - validator_id: ontology-seed-validator
471
+ obligation_id: validate_dynamic_boundaries_have_unique_ids_and_close_target_refs
472
+ coverage_status: pending
473
+ tier: flat
474
+ note: "slice-26 audit (2026-06-23): NOT_FOUND — validateOntologySeed never reads dynamic_layer.dynamic_boundaries[]; no uniqueness, boundary_kind enum, target_ref resolution, evidence_refs, or limitation_refs check exists for boundary rows. No bindable violation. Recording deferred pending implementation of dynamic-boundary validation."
475
+ - validator_id: ontology-seed-validator
476
+ obligation_id: validate_purpose_adequacy_frame_projection_equivalence_against_selected_validated_frame
477
+ coverage_status: pending
478
+ tier: activation_gated_dormant
479
+ note: "slice-26 audit (2026-06-23): activation_gated_dormant — gated on source_purpose_candidate_runtime_is_implemented; its conditional input (source-purpose-candidates-validation.yaml) is not received by validateOntologySeed's signature. No active enforcement; PARK until the source-purpose-candidate runtime is wired."
480
+ - validator_id: ontology-seed-validator
481
+ obligation_id: validate_required_element_closure_status_consistent_with_seed_evidence_and_limitation_refs
482
+ coverage_status: pending
483
+ tier: flat
484
+ note: "slice-26 audit (2026-06-23): PARTIAL — the validator enforces a PROXY (each required_element must cite seed_ref_refs OR limitation_refs, and those refs are resolved) but never reads the named `closure_status` field, so it cannot enforce the contract's status-specific consistency (modeled ⇒ seed+evidence; limitation_backed/frontier_required ⇒ limitation refs). Scope-discriminator (closure_status) unread → PARK."
485
+ - validator_id: ontology-seed-validator
486
+ obligation_id: validate_required_element_surface_dimension_closure
487
+ coverage_status: pending
488
+ tier: flat
489
+ note: "slice-26 audit (2026-06-23): NOT_FOUND — the required_elements loop reads element_id/element_kind/description/seed_ref_refs/limitation_refs/evidence_refs but never the named actionability_surface_refs[] or maturity_dimension_refs[] fields, so the surface/dimension closure enum-resolution the contract (operational-ontology-seed-contract §5.2) requires is unenforced. No bindable violation. PARK."
490
+ - validator_id: ontology-seed-validator
491
+ obligation_id: validate_seed_purpose_confirmation_projection_against_purpose_confirmation_validation
492
+ coverage_status: pending
493
+ tier: activation_gated_dormant
494
+ note: "slice-26 audit (2026-06-23): activation_gated_dormant — gated on purpose_confirmation_runtime_is_implemented; its conditional input (purpose-confirmation-validation.yaml) is not received by validateOntologySeed's signature. No active enforcement; PARK until the purpose-confirmation runtime is wired."
495
+ - validator_id: ontology-seed-validator
496
+ obligation_id: validate_seed_purpose_projection_equivalence_against_selected_source_purpose_candidate
497
+ coverage_status: pending
498
+ tier: activation_gated_dormant
499
+ note: "slice-26 audit (2026-06-23): activation_gated_dormant — gated on source_purpose_candidate_runtime_is_implemented; its conditional input (source-purpose-candidates-validation.yaml) is not received by validateOntologySeed's signature. No active enforcement; PARK until the source-purpose-candidate runtime is wired."
500
+ # slice-28 audit (2026-06-23; codex #143 R1): validateReconstructRunManifest delegates all 27
501
+ # governing_snapshot obligations to validateReconstructRunGoverningSnapshot, which rebuilds the
502
+ # EXPECTED snapshot from live authority and enforces each recorded snapshot field via ONE stableJson
503
+ # equality (subject_id = governing_snapshot.<field>; stamped at the checks loop, past the early-returns).
504
+ # RECORDED only the 4 reference-standard / pattern-catalog ID + VERSION obligations that map 1:1 to a
505
+ # NON-shared per-field equality whose authority-projection embodies the named scope (selected ids ==
506
+ # registry ids → resolve; version/snapshot map has an entry per selected id → recorded). The 23 below
507
+ # stay PARKED: most share a per-field equality with 2-6 sibling obligations (no isolated breaching
508
+ # binding), the "allowed/supported/contains-required-fields" constraints are enforced at snapshot-build
509
+ # time (the recorded-vs-rebuild equality passes if the authority itself omits a field), the canonical-URI
510
+ # obligation names a registry canonical_uri_policy the rebuild never reads (it uses a fixed URN
511
+ # convention; codex #143 R1 Finding 2), and a few named quantities are not compared snapshot fields at
512
+ # all (NOT_FOUND).
513
+ - validator_id: pre-handoff-run-manifest-validator
514
+ obligation_id: active_contract_hashes_match_active_contract_refs
515
+ coverage_status: pending
516
+ tier: flat
517
+ note: "slice-28 audit (2026-06-23): PARK (shared-field). Enforced only via the single governing_snapshot.active_contracts stableJson equality (the rebuild computes each contract sha256 from its ref via sha256File), a field shared by obls active_contract_migration_status_values_are_allowed / active_contract_snapshots_contain_version_policy_required_fields / active_contract_snapshots_match_active_contract_refs_by_contract_id_and_ref — no isolated per-obligation breaching binding for the hashes-match-refs facet. DEFER to the registry input_authority_refs for the authoritative input set."
518
+ - validator_id: pre-handoff-run-manifest-validator
519
+ obligation_id: active_contract_migration_status_values_are_allowed
520
+ coverage_status: pending
521
+ tier: flat
522
+ note: "slice-28 audit (2026-06-23): PARK. The 'values are allowed' allow-list is enforced at snapshot-build time, not by the recorded-vs-rebuild equality (which only requires recorded.active_contracts to byte-equal the rebuild); the active_contracts field is also shared with obls 1/3/4 — not bindable in isolation."
523
+ - validator_id: pre-handoff-run-manifest-validator
524
+ obligation_id: active_contract_snapshots_contain_version_policy_required_fields
525
+ coverage_status: pending
526
+ tier: flat
527
+ note: "slice-28 audit (2026-06-23): PARK. 'contains version-policy required fields' is a build-time schema property; the equality passes if the rebuilt authority itself omits a field, so it does not independently enforce field presence. active_contracts field shared with obls 1/2/4."
528
+ - validator_id: pre-handoff-run-manifest-validator
529
+ obligation_id: active_contract_snapshots_match_active_contract_refs_by_contract_id_and_ref
530
+ coverage_status: pending
531
+ tier: flat
532
+ note: "slice-28 audit (2026-06-23): PARK (shared-field). Enforced via the governing_snapshot.active_contracts equality shared with obls 1/2/3; no isolated breaching binding for the contract_id+ref match facet."
533
+ - validator_id: pre-handoff-run-manifest-validator
534
+ obligation_id: admitted_domain_competency_snapshots_contain_version_policy_required_fields
535
+ coverage_status: pending
536
+ tier: flat
537
+ note: "slice-28 audit (2026-06-23): PARK. 'contains version-policy required fields' is a build-time schema property (equality passes if the authority omits a field); the governing_snapshot.admitted_domain_competency_snapshots field is also shared with split_merged_replaced_competency_ids_close_against_admitted_domain_competency_snapshot."
538
+ - validator_id: pre-handoff-run-manifest-validator
539
+ obligation_id: competency_id_migration_mappings_contain_required_policy_fields
540
+ coverage_status: pending
541
+ tier: flat
542
+ note: "slice-28 audit (2026-06-23): PARK. Field-isolated on governing_snapshot.competency_id_migration_mappings, but 'contains required policy fields' is an internal-schema property guaranteed at snapshot build (buildAdmittedDomainSnapshots), not by the recorded-vs-rebuild equality, which passes if the authority itself omits a field."
543
+ - validator_id: pre-handoff-run-manifest-validator
544
+ obligation_id: competency_id_migration_status_values_are_allowed
545
+ coverage_status: pending
546
+ tier: flat
547
+ note: "slice-28 audit (2026-06-23): PARK. The competency-id migration-status allow-list is enforced at snapshot-build time, not by the recorded-vs-rebuild equality of the competency_id_migration_mappings field (which only requires byte-equality to the rebuild)."
548
+ - validator_id: pre-handoff-run-manifest-validator
549
+ obligation_id: governed_seed_fields_close_against_selected_reference_and_pattern_refs
550
+ coverage_status: pending
551
+ tier: flat
552
+ note: "slice-28 audit (2026-06-23): PARK (NOT_FOUND). Governed seed fields are not a governing_snapshot compared field; validateReconstructRunGoverningSnapshot performs no seed-vs-reference/pattern closure. The closure named here is not inspected by this validator."
553
+ - validator_id: pre-handoff-run-manifest-validator
554
+ obligation_id: non_null_selected_source_profile_definition_refs_match_definition_sha256
555
+ coverage_status: pending
556
+ tier: flat
557
+ note: "slice-28 audit (2026-06-23): PARK (shared-field). The governing_snapshot.selected_source_profiles equality is shared by obls 9/12/23/24/25/26 (six source-profile obligations) and carries no isolated breaching binding for the definition_ref↔definition_sha256 match facet."
558
+ - validator_id: pre-handoff-run-manifest-validator
559
+ obligation_id: p2_and_p3_competencies_remain_priority_metadata_until_explicit_downstream_promotion_policy_exists
560
+ coverage_status: pending
561
+ tier: flat
562
+ note: "slice-28 audit (2026-06-23): PARK (AMBIGUOUS). Field-isolated on governing_snapshot.admitted_competency_priorities, but the equality only compares recorded priorities to the rebuild; it does not enforce the named non-promotion TEMPORAL policy (p2/p3 remain priority metadata until an explicit downstream promotion policy exists). No bindable violation for the policy clause."
563
+ - validator_id: pre-handoff-run-manifest-validator
564
+ obligation_id: previous_competency_ids_resolve_to_current_id_or_explicit_replacement_disposition
565
+ coverage_status: pending
566
+ tier: flat
567
+ note: "slice-28 audit (2026-06-23): PARK (NOT_FOUND). Previous competency ids and their current-id/replacement disposition are not a compared governing_snapshot field; the rebuild does not resolve previous→current ids, so the named resolution is not inspected here."
568
+ - validator_id: pre-handoff-run-manifest-validator
569
+ obligation_id: previous_source_profile_snapshots_validate_old_to_current_profile_mappings
570
+ coverage_status: pending
571
+ tier: flat
572
+ note: "slice-28 audit (2026-06-23): PARK (shared-field). The old→current profile-mapping validation is not a distinct check; the governing_snapshot.selected_source_profiles equality (shared with obls 9/23/24/25/26) is the only enforcement, with no isolated binding."
573
+ - validator_id: pre-handoff-run-manifest-validator
574
+ obligation_id: required_admitted_competency_ids_derive_all_p1_from_admitted_domain_competency_snapshot
575
+ coverage_status: pending
576
+ tier: flat
577
+ note: "slice-28 audit (2026-06-23): PARK. The p1-derivation is a build property (the rebuild flattens required_admitted_competency_ids from the snapshots); the governing_snapshot.required_admitted_competency_ids equality only compares the resulting id set and is shared with required_admitted_competency_ids_match_admitted_domain_competency_snapshot — no isolated binding for the derive-all-p1 facet."
578
+ - validator_id: pre-handoff-run-manifest-validator
579
+ obligation_id: required_admitted_competency_ids_match_admitted_domain_competency_snapshot
580
+ coverage_status: pending
581
+ tier: flat
582
+ note: "slice-28 audit (2026-06-23): PARK (shared-field). Enforced via the governing_snapshot.required_admitted_competency_ids equality shared with required_admitted_competency_ids_derive_all_p1_from_admitted_domain_competency_snapshot; no isolated per-obligation breaching binding."
583
+ - validator_id: pre-handoff-run-manifest-validator
584
+ obligation_id: selected_pattern_catalog_canonical_uris_satisfy_reference_pattern_catalog_registry_policy
585
+ coverage_status: pending
586
+ tier: flat
587
+ note: "slice-28 audit (2026-06-23, codex #143 R1 P2): PARK (name-broader-than-code, policy not read). The field-isolated governing_snapshot.selected_pattern_catalog_canonical_uris equality compares the recorded URIs against a rebuild that derives each URI from a FIXED URN convention of the pattern_catalog_ref_id (selectedPatternCatalogCanonicalUri) and never reads the registry's declared canonical_uri_policy. The registry policy (reconstruct-contract-registry.yaml: canonical_uri_policy=selected_run_manifest_value_required + canonical_uri_validation_rule) explicitly says the registry does NOT compare against a symbolic URI literal and requires the run-manifest-recorded value bound to ref_id+version_or_snapshot_id — the opposite of what the code enforces. So 'satisfy registry policy' is not enforced here; PARK until a policy-reading check exists."
588
+ - validator_id: pre-handoff-run-manifest-validator
589
+ obligation_id: selected_reference_and_pattern_migration_status_is_supported
590
+ coverage_status: pending
591
+ tier: flat
592
+ note: "slice-28 audit (2026-06-23): PARK (NOT_FOUND). Reference/pattern migration status is not a distinct compared field — governing_snapshot.migration_status_values holds only source_profile + contract value sets — and 'is supported' is a build-time policy, not enforced by the recorded-vs-rebuild equality."
593
+ - validator_id: pre-handoff-run-manifest-validator
594
+ obligation_id: selected_registry_hash_matches_reconstruct_contract_registry
595
+ coverage_status: pending
596
+ tier: flat
597
+ note: "slice-28 audit (2026-06-23): PARK (AMBIGUOUS, mode-dependent). The dedicated registry_sha256 early-return (governing-snapshot.ts ~836) is not isolatable: a wrong-hash mutation is also caught by the governing_snapshot.registry field equality, and the breach overlaps selected_registry_snapshot_contains_registry_ref_and_hash; in historical_replay mode the hash-match falls back to a presence-only shape check. No single isolated breaching binding."
598
+ - validator_id: pre-handoff-run-manifest-validator
599
+ obligation_id: selected_registry_snapshot_contains_registry_ref_and_hash
600
+ coverage_status: pending
601
+ tier: flat
602
+ note: "slice-28 audit (2026-06-23): PARK. In live mode the registry ref+hash presence is enforced only via the governing_snapshot.registry field equality, which overlaps the hash-match early return (obl selected_registry_hash_matches_reconstruct_contract_registry); the dedicated presence shape check runs only in the historical_replay fallback. Not an isolatable live check."
603
+ - validator_id: pre-handoff-run-manifest-validator
604
+ obligation_id: selected_source_profile_migration_fields_are_recorded
605
+ coverage_status: pending
606
+ tier: flat
607
+ note: "slice-28 audit (2026-06-23): PARK. 'migration fields are recorded' is a build-time/presence property; enforcement is the governing_snapshot.selected_source_profiles equality shared with obls 9/12/24/25/26 — no isolated binding."
608
+ - validator_id: pre-handoff-run-manifest-validator
609
+ obligation_id: selected_source_profile_snapshots_contain_version_policy_required_fields
610
+ coverage_status: pending
611
+ tier: flat
612
+ note: "slice-28 audit (2026-06-23): PARK. 'contains version-policy required fields' is a build-time schema property (equality passes if the authority omits a field); governing_snapshot.selected_source_profiles field shared with obls 9/12/23/25/26."
613
+ - validator_id: pre-handoff-run-manifest-validator
614
+ obligation_id: selected_source_profile_snapshots_match_source_profile_records_by_profile_id_and_target_material_kind
615
+ coverage_status: pending
616
+ tier: flat
617
+ note: "slice-28 audit (2026-06-23): PARK (shared-field). Enforced via the governing_snapshot.selected_source_profiles equality shared with obls 9/12/23/24/26; no isolated breaching binding for the profile_id+target_material_kind match facet."
618
+ - validator_id: pre-handoff-run-manifest-validator
619
+ obligation_id: source_profile_migration_refs_resolve_to_source_profile_records_or_prior_snapshots
620
+ coverage_status: pending
621
+ tier: flat
622
+ note: "slice-28 audit (2026-06-23): PARK (shared-field). The migration-ref resolution is not a distinct check; the governing_snapshot.selected_source_profiles equality (shared with obls 9/12/23/24/25) is the only enforcement, with no isolated binding."
623
+ - validator_id: pre-handoff-run-manifest-validator
624
+ obligation_id: split_merged_replaced_competency_ids_close_against_admitted_domain_competency_snapshot
625
+ coverage_status: pending
626
+ tier: flat
627
+ note: "slice-28 audit (2026-06-23): PARK (shared-field). Closure of split/merged/replaced competency ids is not a distinct check; the governing_snapshot.admitted_domain_competency_snapshots equality (shared with admitted_domain_competency_snapshots_contain_version_policy_required_fields) is the only enforcement, with no isolated binding."
628
+ - validator_id: purpose-confirmation-validator
629
+ obligation_id: require_revised_confirmation_to_preserve_source_conflict_or_trigger_purpose_discovery_rerun
630
+ coverage_status: pending
631
+ tier: flat
632
+ note: "slice-11 audit (2026-06-22): AMBIGUOUS — two-armed name, only one arm enforced. The rerun arm IS enforced (revised_pending_evidence_check → seed_readiness_effect must_rerun_purpose_discovery + conflicting_state, purpose-authority-validation.ts), but the 'preserve source conflict' arm is never checked: the validator never reads source_conflict_policy (or the confirmation's revised_statement vs source conflict) — only the rerun side-effect of revised_pending_evidence_check is realized. Recording deferred pending a source-conflict-preservation check."
633
+ - validator_id: purpose-confirmation-validator
634
+ obligation_id: validate_confirmation_status_against_source_purpose_candidate_status_and_validation_confirmation_required
635
+ coverage_status: pending
636
+ tier: flat
637
+ note: "slice-11 audit (2026-06-22): AMBIGUOUS — name broader than code. The validator reads sourceValidation.validation_status (conflicting_state when not valid) and sourceValidation.confirmation_required (the gate branch), but never the candidate's own purpose_source_status (explicit_source_declared/convergent_inferred/limitation_backed/unresolved) the name references. Per the contract confirmation_required is the only authoritative gate input, so the candidate-status arm is intentionally not read here — name names a quantity this validator does not inspect. Recording deferred pending name reconciliation (the confirmation_required arm is already recorded via require_confirmation_for_inferred_or_limitation_backed_purpose)."
638
+ - validator_id: reconstruct-run-control-validator
639
+ obligation_id: preserve_post_write_hash_observation_without_claiming_atomic_commit_when_writer_did_not_prove_atomic_rename
640
+ coverage_status: pending
641
+ tier: flat
642
+ note: "slice-10 audit (2026-06-22): NOT_FOUND in validateReconstructRunControl. The contract (design.md §run-control 'committed through an atomic write method or truthfully marked as observed_file_hash') governs commit_method, but the validator's write-transaction block (run-control-validation.ts) never reads commit_method — it checks only artifact_ref/owner_attempt_id presence and committed→committed_hash. Distinguishing atomic_rename from observed_file_hash and preventing an observed-hash transaction from claiming atomic commit is the writer's truthful-marking responsibility (recordReconstructRunControlTransactions), not validated. Recording deferred pending a validator-side commit_method check."
643
+ - validator_id: reconstruct-run-control-validator
644
+ obligation_id: reject_conflicting_request_fingerprints_before_semantic_artifacts_are_consumed
645
+ coverage_status: pending
646
+ tier: flat
647
+ note: "slice-10 audit (2026-06-22): AMBIGUOUS — name broader than the validator's check. The validator rejects request rows already MARKED duplicate_conflict/rejected_conflict (conflicting_request) and is the stage-0 gate consumed before semantic artifacts, but it never compares request_fingerprint values; fingerprint conflict DETECTION lives in the writer (initializeReconstructRunControl). The validator trusts the recorded request_status enum. Recording deferred pending a validator-side fingerprint comparison or name reconciliation."
648
+ - validator_id: reconstruct-run-control-validator
649
+ obligation_id: validate_current_attempt_and_session_root_lock_ownership
650
+ coverage_status: pending
651
+ tier: flat
652
+ note: "slice-10 audit (2026-06-22): AMBIGUOUS — name broader than code. The validator checks presence of an active attempt (active_attempt_missing), presence of a session_root lock (session_lock_missing), and rejects recorded conflicting locks (conflicting_lock), but it never cross-checks the lock row's owner_attempt_id against the current attempt's attempt_id. The named 'ownership' linkage is unverified — concurrency conflicts are trusted via the recorded lock_status enum. Recording deferred pending an owner_attempt_id linkage check."
653
+ - validator_id: reconstruct-run-control-validator
654
+ obligation_id: validate_session_root_request_fingerprint_target_signature_runtime_version_and_idempotency_are_replayable
655
+ coverage_status: pending
656
+ tier: flat
657
+ note: "slice-10 audit (2026-06-22): AMBIGUOUS — compound obligation, only 1 of 5 named quantities validated. Of session_root, request_fingerprint, target signature, runtime version, and idempotency key, the validator validates only session_root (session_root_missing presence + expected-root match); request_fingerprint, target_signature_ref, runtime_version, and idempotency_key_hash are never inspected, and validateReconstructRunControl's signature accepts no expected values for them. Recording deferred pending validation of the remaining four replayable quantities."
658
+ - validator_id: registry-verification-evidence-validator
659
+ obligation_id: validate_registry_snapshot_hash_matches_current_registry_file
660
+ coverage_status: pending
661
+ tier: flat
662
+ note: "slice-18 audit (2026-06-23): AMBIGUOUS — the hash-matches-current-file check (registry_hash_mismatch) is gated on the caller-supplied optional expectedRegistrySha256. validateRegistryVerificationEvidence never derives the on-disk registry hash itself, so it carries no internal 'matches current file' guarantee; the match is enforced only when the caller supplies sha256File(registryPath) (writeRegistryVerificationEvidenceValidationArtifact does so at the production call site, but the validator function does not). Recording deferred pending an internal hash-vs-file derivation. The validator's other 7 obligations are recorded (structural, unconditional). DEFER to the registry record's input_authority_refs for the authoritative input set."
663
+ - validator_id: seed-authoring-readiness-validator
664
+ obligation_id: validate_actor_action_state_scout_rows_do_not_replace_purpose_required_elements
665
+ coverage_status: pending
666
+ tier: flat
667
+ note: "deferred-7 slice-4 audit (2026-06-24): PARK (presence-only + material-source unchecked). The required boundary note 'Actor-action-state scout rows are prioritization evidence, not selected-purpose required elements.' is enforced presence-only (semantic_authority_boundary_missing). closure_row_dangling_required_element rejects closure rows whose required_element_ref is not a selected-purpose element, but never verifies a row's material is purpose-derived rather than scout-derived — a scout-sourced row labeled with a valid required_element_ref passes. 'do not replace' is not fully enforced."
668
+ - validator_id: seed-authoring-readiness-validator
669
+ obligation_id: validate_frontier_required_preserves_exploration_budget_state_without_declaring_source_insufficiency
670
+ coverage_status: pending
671
+ tier: flat
672
+ note: "deferred-7 slice-4 audit (2026-06-24): PARK (compound, only one half enforced). validateSeedAuthoringReadiness recompute-compares source_sufficiency_state (source_sufficiency_state_mismatch), so the 'without declaring source insufficiency' half is enforced; but exploration_budget_state is COPIED from the artifact into the validation output and never compared to the recomputed expected, so the 'preserves exploration_budget_state' half is unenforced. Recording deferred pending an exploration_budget_state comparison."
673
+ - validator_id: seed-authoring-readiness-validator
674
+ obligation_id: validate_only_seed_ready_or_limited_seed_possible_allows_seed_authoring
675
+ coverage_status: pending
676
+ tier: flat
677
+ note: "deferred-7 slice-4 audit (2026-06-24): PARK (DELEGATED). The allow/deny gate is enforced by the sibling assertSeedAuthoringReadinessAllowsSeed (throws unless readiness_classification is seed_ready or limited_seed_possible), NOT by validateSeedAuthoringReadiness — which returns validation_status=valid for frontier_required/blocked classifications (see test 'projects frontier_required without making validation invalid'). asserted_obligation_ids telemetry is on the validator's return, so the delegated gate cannot be recorded here."
678
+ - validator_id: seed-authoring-readiness-validator
679
+ obligation_id: validate_ontology_domain_required_category_rows_only_when_selected_purpose_closure_rows_resolve_to_domain_categories
680
+ coverage_status: pending
681
+ tier: flat
682
+ note: "deferred-7 slice-4 audit (2026-06-24): PARK (asymmetric 'only when'). The validator checks only the expected→actual direction (every recomputed ontology domain category id must be present, ontology_domain_category_missing). It never loops actual→expected to reject spurious/orphan category rows, so domain category rows present when the selected-purpose closure does not resolve to them are not rejected — the 'only when ... resolve to domain categories' direction is unenforced."
683
+ - validator_id: seed-authoring-readiness-validator
684
+ obligation_id: validate_readiness_consumes_pre_seed_source_scout_validation_snapshot
685
+ coverage_status: pending
686
+ tier: flat
687
+ note: "deferred-7 slice-4 audit (2026-06-24, codex #150 R1 P2): PARK (gated-on-optional-arg). The three source_scout_pre_seed_identity_mismatch checks (validation-ref basename + scout_pack_ref basename + concrete pre-seed sibling) are all conditional on args.sourceScoutPackValidationRef / args.sourceScoutPackValidation being present; an absent/null snapshot is handled by the validation-gap mechanism (validationGapSubjects → blocked_validation_gap), not the identity check. An unconditional top-of-function stamp would therefore over-claim pre-seed snapshot consumption for gap-only executions that never consume or verify a snapshot. Recording deferred pending a stamp gated on an actual snapshot-consumption check."
688
+ - validator_id: seed-authoring-readiness-validator
689
+ obligation_id: validate_readiness_projection_uses_validated_input_refs_only
690
+ coverage_status: pending
691
+ tier: flat
692
+ note: "deferred-7 slice-4 audit (2026-06-24): PARK (field never compared + shared mechanism). The closure-row validated_upstream_refs / llm_authority_refs projection fields are populated by the build but never compared in validateSeedAuthoringReadiness (only closure_state and material_admission_row_ref are). The only enforcement that gates on input validation status is the validation-gap mechanism, whose binding is readiness_classification_mismatch — already recorded for validate_blocked_validation_gap_is_projection_not_semantic_decision (no distinct binding for 'uses validated input refs only')."
693
+ - validator_id: seed-authoring-readiness-validator
694
+ obligation_id: validate_selected_purpose_required_elements_have_closure_rows
695
+ coverage_status: pending
696
+ tier: flat
697
+ note: "deferred-7 slice-4 audit (2026-06-24, codex #150 R1 P2): PARK (duplicate-element_id Map collapse). validateSeedAuthoringReadiness keys both expected and actual closure rows by required_element_ref in a Map; if a selected purpose frame contains two required elements with the same element_id (source-purpose validation enforces non-empty element_id but does NOT reject duplicates), the duplicates collapse and a single closure row satisfies both, so closure_row_missing is never raised for the omitted duplicate. 'every selected-purpose required element has a closure row' is not fully enforced. Recording deferred pending duplicate-element_id rejection or per-occurrence coverage."
698
+ - validator_id: source-observation-delta-validator
699
+ obligation_id: validate_delta_frontier_kind_is_supported
700
+ coverage_status: pending
701
+ tier: flat
702
+ note: "slice-5 audit (2026-06-22): normalizeFrontierForDelta validates kind-vs-artifact CONSISTENCY (frontier_kind_mismatch when the frontier artifact does not match the declared source_frontier / maturation_closure_frontier kind), but does NOT validate that the frontier_kind value itself is in a supported enumeration — an unsupported kind branches to the maturation_closure path without an explicit unsupported-kind violation. Recording deferred pending an explicit supported-kind check or name reconciliation."
703
+ - validator_id: source-observation-lineage-index-validator
704
+ obligation_id: require_each_lineage_row_delta_validation_to_be_valid
705
+ coverage_status: pending
706
+ tier: flat
707
+ note: "deferred-7 slice-3 audit (2026-06-23, codex #149 R1 P2): PARK (null-read false-pass). A delta-validation ref pointing at an EXISTING EMPTY/null YAML makes readYamlDocument return null WITHOUT throwing, so the catch (lineage_delta_validation_missing, ~728-734) never fires AND the validity check (~769: `if (deltaValidation && status!=='valid')`) is skipped — the row passes valid with a non-valid/absent delta validation. Not fully enforced until non-object reads are rejected."
708
+ - validator_id: source-observation-lineage-index-validator
709
+ obligation_id: require_each_lineage_row_reentry_validation_to_be_valid
710
+ coverage_status: pending
711
+ tier: flat
712
+ note: "deferred-7 slice-3 audit (2026-06-23, codex #149 R1 P2): PARK (null-read false-pass). Same as the delta-validation obligation: an existing empty/null re-entry-validation YAML returns null without throwing, so lineage_reentry_validation_missing (~742-747) never fires and the `if (reentryValidation && status!=='valid')` check (~817) is skipped. Not fully enforced until non-object reads are rejected."
713
+ - validator_id: source-observation-lineage-index-validator
714
+ obligation_id: validate_each_lineage_added_observation_exists_in_source_observations
715
+ coverage_status: pending
716
+ tier: flat
717
+ note: "deferred-7 slice-3 audit (2026-06-23, codex #149 R1 P2): PARK (caller-supplied authority). The check (~884-890 → lineage_observation_missing) verifies each added id is present in the PASSED sourceObservations object, but never binds that object/ref or session to the delta/re-entry chain's source_observations_ref. A wrong or stale source-observations file containing the same ids therefore passes and is trusted downstream as the validated observations authority. Not fully enforced until the observations authority is bound to the chain."
718
+ - validator_id: source-observation-lineage-index-validator
719
+ obligation_id: validate_each_lineage_added_observation_was_reentered_by_its_validation
720
+ coverage_status: pending
721
+ tier: flat
722
+ note: "deferred-7 slice-3 audit (2026-06-23): PARK (shared violation code). The reentered-membership check (~891-897: reentryValidation && !reentered.has(observationId)) emits the SAME lineage_added_observation_mismatch code as validate_lineage_added_observation_ids_match_delta_added_observation_ids (set-equality, ~862-867). They fire from distinct sites but share one code, so this obligation has no distinct breaching binding (slice-21). It is also subject to the null-read false-pass (an empty re-entry-validation file skips the check). Record deferred pending a dedicated reentered-mismatch code and non-object-read rejection."
723
+ - validator_id: source-observation-lineage-index-validator
724
+ obligation_id: validate_each_lineage_row_delta_ref_is_readable_and_session_matching
725
+ coverage_status: pending
726
+ tier: flat
727
+ note: "deferred-7 slice-3 audit (2026-06-23, codex #149 R1 P2): PARK (null-read false-pass). 'readable' is not enforced: a delta ref pointing at an existing empty/null YAML returns null without throwing, so lineage_delta_missing (~716-720) never fires and the session/round/frontier matches (~748-767, all gated on `if (delta && ...)`) are skipped — an empty-but-present delta file passes. Not fully enforced until non-object reads are rejected."
728
+ - validator_id: source-observation-lineage-index-validator
729
+ obligation_id: validate_lineage_added_observation_ids_match_delta_added_observation_ids
730
+ coverage_status: pending
731
+ tier: flat
732
+ note: "deferred-7 slice-3 audit (2026-06-23, codex #149 R1 P2): PARK (null-read false-pass). The set-equality match (~862-867 → lineage_added_observation_mismatch) is gated on `if (delta)`; an existing empty/null delta YAML returns null without throwing, so the match is skipped and arbitrary added_observation_ids pass. Not fully enforced until non-object reads are rejected."
733
+ - validator_id: source-purpose-candidates-validator
734
+ obligation_id: derive_confirmation_required_from_selected_purpose_source_status
735
+ coverage_status: pending
736
+ tier: flat
737
+ note: "slice-24 audit (2026-06-23): PROJECTION-ONLY. The validator derives confirmation_required (~420-423: selected.purpose_source_status != explicit_source_declared) and emits it in the return object (~434); there is no violation and no breaching input that trips one, so there is no non-vacuous enforcement binding to record. Contract design.md:405 frames it as a derived runtime predicate field, not a check. Recording deferred pending a downstream consumer-validator that gates on it (cf. purpose-confirmation slice-11, which records consuming confirmation_required)."
738
+ - validator_id: source-purpose-candidates-validator
739
+ obligation_id: expose_selected_purpose_candidate_id_and_frame_id_for_seed_projection_equivalence
740
+ coverage_status: pending
741
+ tier: flat
742
+ note: "slice-24 audit (2026-06-23): PROJECTION-ONLY. selected_purpose_candidate_id and selected_purpose_frame_id are computed and emitted in the return object (~420,432-433) with no violation; nothing a breaching input trips. Contract design.md:408 asks that they be 'explicit so seed validation can prove projection equivalence' — the equivalence check belongs to seed validation, not here. Recording deferred to the seed-validation consumer."
743
+ - validator_id: source-purpose-candidates-validator
744
+ obligation_id: require_exactly_one_primary_purpose_candidate_when_selected
745
+ coverage_status: pending
746
+ tier: flat
747
+ note: "slice-24 audit (2026-06-23): superset-blind-to-discriminator (slice-20 pattern). The code enforces exactly-one-primary UNCONDITIONALLY (~173-186: missing_primary_purpose if 0, multiple_primary_purpose if >1), but the contract (design.md:390) scopes the rule to 'exactly one primary candidate WHEN THE PURPOSE IS SELECTED'. The validator never reads the selected/not-selected discriminator and has no dedicated when-selected violation code, so it validates a broader unconditional rule rather than the obligation's named scope. Recording deferred pending a selected-scoped enforcer (or contract re-scoping to unconditional)."
748
+ - validator_id: source-purpose-candidates-validator
749
+ obligation_id: require_purpose_candidate_status_field_to_be_purpose_source_status
750
+ coverage_status: pending
751
+ tier: flat
752
+ note: "slice-24 audit (2026-06-23): PARTIAL. The only enforcement is the artifact-level alias-field rejection (~153-160, alias_field_present: rejects source_purpose_status/inference_status keys). There is no per-candidate check that candidate.purpose_source_status is a valid enum value (PURPOSE_SOURCE_STATUSES), which the obligation name ('candidate status field to be purpose_source_status') implies. Recording deferred pending per-candidate purpose_source_status enum validation."
753
+ - validator_id: source-safety-ledger-validator
754
+ obligation_id: preserve_prompt_context_evidence_support_public_output_replay_and_material_claim_consumption_boundaries
755
+ coverage_status: pending
756
+ tier: flat
757
+ note: "deferred-7 slice-1 audit (2026-06-23): PARK (overlapping). The only enforcement is the per-row intended_consumption enum (invalid_enum, ~520-526) plus the per-observation-per-consumption required-row presence — and that presence check is itself a weak proxy (see validate_every_observation...). There is no independent check that one consumption row may not substitute for another's authority, so this obligation cannot bind a non-overlapping breaching input. Record deferred pending a dedicated no-substitution enforcer."
758
+ - validator_id: source-safety-ledger-validator
759
+ obligation_id: validate_every_observation_has_source_safety_rows_for_each_intended_consumption
760
+ coverage_status: pending
761
+ tier: flat
762
+ note: "deferred-7 slice-1 audit (2026-06-23, codex #147 P1): PARK (weak proxy). The required-row check (requiredSafetyRowIds per observation × INTENDED_CONSUMPTIONS, ~414-420/541-549 → source_observation_safety_row_missing) only proves each source_safety:<observation_id>:<intended_consumption> ID STRING is present; it never binds that ID's consumption suffix to the row's visibility_derivation.intended_consumption — the field deriveSourceSafetyVisibilityTier actually consumes. So with every required ID present, a public_output/material_claim-ID row can carry prompt_context as its derivation consumption and a derived consumption_allowed tier, pass this validator, and mislead downstream consumers that look up the tier by row ID. Record deferred pending an ID-suffix to intended_consumption binding."
763
+ - validator_id: source-scout-pack-post-maturation-validator
764
+ obligation_id: validate_post_maturation_scout_snapshot_is_immutable_audit_authority
765
+ coverage_status: pending
766
+ tier: flat
767
+ note: "deferred-7 slice-5 audit (2026-06-24): PARK (immutability/audit-authority not enforced). The shared validateSourceScoutPack checks INPUT-artifact snapshot hashes (source-observations/safety match current files = freshness) but never pins the snapshot's own content hash nor checks any audit-authority state, so a mutated post-maturation snapshot re-hashed to current inputs passes."
768
+ - validator_id: source-scout-pack-post-maturation-validator
769
+ obligation_id: validate_prompt_visible_rows_have_source_safety_validation_refs
770
+ coverage_status: pending
771
+ tier: flat
772
+ note: "deferred-7 slice-5 audit (2026-06-24): PARK (named per-row field unread). The named per-row field source_safety_ledger_validation_ref is built but never read by validateSourceScoutPack; it checks source_safety_row_id (ledger row) + global validation_status + consumption_allowed tier instead. A prompt-visible row with a valid source_safety_row_id but null/wrong source_safety_ledger_validation_ref passes → the named validation-ref field is unenforced."
773
+ - validator_id: source-scout-pack-post-maturation-validator
774
+ obligation_id: validate_snapshot_lineage_validation_ref_and_hash_match_current_lineage_authority
775
+ coverage_status: pending
776
+ tier: flat
777
+ note: "deferred-7 slice-5 audit (2026-06-24): PARK (slice-3 null-read + caller-authority). source_observation_lineage_index_validation_ref/hash match is checked, but sha256File(null)=null so a null lineage ref + null pack snapshot hash passes without a violation, and the 'current lineage authority' is the caller-supplied ref (not derived from the chain). Lineage validation is a required pre/post input, so the null-pass is a false-pass."
778
+ - validator_id: source-scout-pack-post-maturation-validator
779
+ obligation_id: validate_snapshot_scope_derives_from_target_material_profile_validation
780
+ coverage_status: pending
781
+ tier: flat
782
+ note: "deferred-7 slice-5 audit (2026-06-24): PARK (not derived from validation). scout_scope is copied from the pack; validateSourceScoutPack only checks internal consistency (unsupported_scope_overclaimed: scope_state vs the scout's own target_ref_count/material_kind) and the validation's validation_status=valid. It never recomputes/derives scout_scope from the target-material-profile-validation content (scoutScopeState() exists but is unused in the validator)."
783
+ - validator_id: source-scout-pack-pre-seed-validator
784
+ obligation_id: validate_pre_seed_scout_snapshot_is_immutable_consumed_authority
785
+ coverage_status: pending
786
+ tier: flat
787
+ note: "deferred-7 slice-5 audit (2026-06-24): PARK (immutability/consumed-authority not enforced). The shared validateSourceScoutPack checks INPUT-artifact snapshot hashes (source-observations/safety match current files = freshness) but never pins the snapshot's own content hash nor checks any consumed-authority state, so a mutated pre-seed snapshot re-hashed to current inputs passes."
788
+ - validator_id: source-scout-pack-pre-seed-validator
789
+ obligation_id: validate_prompt_visible_rows_have_source_safety_validation_refs
790
+ coverage_status: pending
791
+ tier: flat
792
+ note: "deferred-7 slice-5 audit (2026-06-24): PARK (named per-row field unread). The named per-row field source_safety_ledger_validation_ref is built but never read by validateSourceScoutPack; it checks source_safety_row_id (ledger row) + global validation_status + consumption_allowed tier instead. A prompt-visible row with a valid source_safety_row_id but null/wrong source_safety_ledger_validation_ref passes → the named validation-ref field is unenforced."
793
+ - validator_id: source-scout-pack-pre-seed-validator
794
+ obligation_id: validate_snapshot_lineage_validation_ref_and_hash_match_current_lineage_authority
795
+ coverage_status: pending
796
+ tier: flat
797
+ note: "deferred-7 slice-5 audit (2026-06-24): PARK (slice-3 null-read + caller-authority). source_observation_lineage_index_validation_ref/hash match is checked, but sha256File(null)=null so a null lineage ref + null pack snapshot hash passes without a violation, and the 'current lineage authority' is the caller-supplied ref (not derived from the chain). Lineage validation is a required pre/post input, so the null-pass is a false-pass."
798
+ - validator_id: source-scout-pack-pre-seed-validator
799
+ obligation_id: validate_snapshot_scope_derives_from_target_material_profile_validation
800
+ coverage_status: pending
801
+ tier: flat
802
+ note: "deferred-7 slice-5 audit (2026-06-24): PARK (not derived from validation). scout_scope is copied from the pack; validateSourceScoutPack only checks internal consistency (unsupported_scope_overclaimed) and the validation's validation_status=valid. It never recomputes/derives scout_scope from the target-material-profile-validation content (scoutScopeState() exists but is unused in the validator)."
803
+ - validator_id: source-scout-pack-validator
804
+ obligation_id: validate_group_and_coverage_refs_resolve
805
+ coverage_status: pending
806
+ tier: flat
807
+ note: "deferred-7 slice-5 audit (2026-06-24): PARK (compound, 'group' half has no enforcement surface). Only coverage_slot→signal_row resolution (coverage_slot_signal_missing) is checked; there is no 'group' structure in the scout-pack artifact (the word appears nowhere in the validator), so the 'group ... refs resolve' half is unenforced."
808
+ - validator_id: source-scout-pack-validator
809
+ obligation_id: validate_prompt_visible_rows_have_source_safety_validation_refs
810
+ coverage_status: pending
811
+ tier: flat
812
+ note: "deferred-7 slice-5 audit (2026-06-24): PARK (named per-row field unread). The named per-row field source_safety_ledger_validation_ref is built but never read by validateSourceScoutPack; it checks source_safety_row_id (ledger row) + global validation_status + consumption_allowed tier instead. A prompt-visible row with a valid source_safety_row_id but null/wrong source_safety_ledger_validation_ref passes → the named validation-ref field is unenforced."
813
+ - validator_id: source-scout-pack-validator
814
+ obligation_id: validate_scout_pack_is_profile_local_and_contains_no_selected_purpose_required_element_refs
815
+ coverage_status: pending
816
+ tier: flat
817
+ note: "deferred-7 slice-5 audit (2026-06-24): PARK (compound, 'profile-local' half unchecked + substring proxy). validateNoSelectedPurposeLeak is a JSON.stringify().includes('purpose_required_element_ref') substring search (no-purpose-leak half, fragile to field-name variants); the 'profile-local' half is never checked by the validator."
818
+ - validator_id: source-scout-pack-validator
819
+ obligation_id: validate_scout_scope_derives_from_target_material_profile_validation
820
+ coverage_status: pending
821
+ tier: flat
822
+ note: "deferred-7 slice-5 audit (2026-06-24): PARK (not derived from validation). scout_scope is copied from the pack; validateSourceScoutPack only checks internal consistency (unsupported_scope_overclaimed) and the validation's validation_status=valid. It never recomputes/derives scout_scope from the target-material-profile-validation content (scoutScopeState() exists but is unused in the validator)."
823
+ - validator_id: target-material-profile-validator
824
+ obligation_id: mixed_targets_preserve_member_to_aggregate_purpose_requirement_mapping_or_limitation
825
+ coverage_status: pending
826
+ tier: flat
827
+ note: "deferred-7 slice-2 audit (2026-06-23): PARK (NOT_FOUND). The mixed branch (~154-178) only checks that the selected profiles include the registry mixed row and one per candidate kind (mixed_candidate_profile_missing); there is no member→aggregate purpose-requirement mapping or limitation check, and ReconstructSelectedSourceProfileRef carries no purpose_requirement / purpose_mapping / limitation_refs field. The named mapping is not inspected here."
828
+ - validator_id: target-material-profile-validator
829
+ obligation_id: mixed_targets_preserve_per_member_selected_profile_id_contract_status_runtime_implementation_status_and_support_state
830
+ coverage_status: pending
831
+ tier: flat
832
+ note: "deferred-7 slice-2 audit (2026-06-23): PARK (PARTIAL, scope + missing facet). contract_status and runtime_implementation_status ARE match-checked against the registry (~241-246 → selected_profile_registry_mismatch), but that check runs for ALL selected profiles, not the named mixed_targets/per_member scope (the validator never gates this on target_material_kind=='mixed'), and the named support_state facet is not a field on ReconstructSelectedSourceProfileRef / ReconstructSourceProfileRecord at all. The mixed-scoped per-member preservation is not the enforced quantity (slice-20 scope-discriminator pattern)."
833
+ - validator_id: target-material-profile-validator
834
+ obligation_id: mixed_targets_preserve_per_member_source_profile_snapshot_ref_definition_hash_and_source_refs
835
+ coverage_status: pending
836
+ tier: flat
837
+ note: "deferred-7 slice-2 audit (2026-06-23): PARK (PARTIAL, scope + missing facet). definition_sha256 and profile_ref ARE match-checked against the registry (~241-246), but unscoped (all selected profiles, not the named mixed scope), and the named source_refs facet is not a field on the selected-profile snapshot (scan_targets exists but is neither source_refs nor a required/matched field). The mixed-scoped per-member preservation is not the enforced quantity."
838
+ - validator_id: target-material-profile-validator
839
+ obligation_id: partial_composite_member_support_limits_aggregate_ready_projection
840
+ coverage_status: pending
841
+ tier: flat
842
+ note: "deferred-7 slice-2 audit (2026-06-23): PARK (NOT_FOUND). support_status is an aggregate field on the target-material-profile artifact, not on the selected members; the validator checks only that a supported/partial/composite aggregate selects ≥1 profile (~180-193 → selected_profile_missing). There is no check that a partial_composite MEMBER's support state downgrades/limits the aggregate ready projection. The member→aggregate support-limiting rule is not inspected here."