onto-mcp 0.4.12 → 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 (128) hide show
  1. package/.onto/authority/core-lexicon.yaml +1 -1
  2. package/.onto/authority/supported-models.yaml +137 -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 +169 -8
  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/productized-live-path.md +9 -5
  11. package/.onto/processes/review/prompt-execution-runner-contract.md +32 -8
  12. package/.onto/processes/review/review-target-profile-contract.md +47 -4
  13. package/.onto/processes/shared/pipeline-execution-ledger-contract.md +11 -0
  14. package/.onto/processes/shared/target-material-kind-contract.md +1 -1
  15. package/README.md +64 -1
  16. package/dist/cli.js +11 -1
  17. package/dist/core-api/reconstruct-api.js +575 -24
  18. package/dist/core-api/review-api.js +70 -5
  19. package/dist/core-api/review-progress.js +7 -0
  20. package/dist/core-api/runtime-observation.js +7 -0
  21. package/dist/core-runtime/artifact-io.js +75 -3
  22. package/dist/core-runtime/cli/claude-code-review-unit-executor.js +19 -8
  23. package/dist/core-runtime/cli/materialize-review-prompt-packets.js +68 -14
  24. package/dist/core-runtime/cli/prepare-review-session.js +34 -1
  25. package/dist/core-runtime/cli/render-review-final-output.js +2 -1
  26. package/dist/core-runtime/cli/run-review-prompt-execution.js +758 -48
  27. package/dist/core-runtime/cli/run-seats.js +18 -0
  28. package/dist/core-runtime/cli/runtime-submit-context.js +10 -2
  29. package/dist/core-runtime/cli/unit-resubmit.js +269 -0
  30. package/dist/core-runtime/cli/worker-structured-output.js +80 -2
  31. package/dist/core-runtime/discovery/host-detection.js +71 -22
  32. package/dist/core-runtime/discovery/review-cert-assemble.js +208 -0
  33. package/dist/core-runtime/discovery/review-cert-record.js +442 -0
  34. package/dist/core-runtime/discovery/review-execution-units.js +22 -0
  35. package/dist/core-runtime/discovery/seat-inventory.js +167 -0
  36. package/dist/core-runtime/discovery/settings-chain.js +311 -52
  37. package/dist/core-runtime/discovery/supported-models.js +282 -29
  38. package/dist/core-runtime/discovery/synthesize-cert-assemble.js +197 -0
  39. package/dist/core-runtime/discovery/synthesize-cert-capsule.js +399 -0
  40. package/dist/core-runtime/discovery/synthesize-cert-judge.js +340 -0
  41. package/dist/core-runtime/discovery/synthesize-cert-loop.js +234 -0
  42. package/dist/core-runtime/discovery/synthesize-cert-mutation.js +117 -0
  43. package/dist/core-runtime/discovery/synthesize-cert-packet.js +182 -0
  44. package/dist/core-runtime/discovery/synthesize-cert-record.js +831 -0
  45. package/dist/core-runtime/discovery/synthesize-cert-sampler.js +336 -0
  46. package/dist/core-runtime/effort-calibration-ingest.js +135 -0
  47. package/dist/core-runtime/llm/dispatch-breaker.js +412 -0
  48. package/dist/core-runtime/llm/dispatch-fallback-adapter-capabilities.js +33 -0
  49. package/dist/core-runtime/llm/llm-caller.js +188 -47
  50. package/dist/core-runtime/llm/mock-llm-realization.js +35 -4
  51. package/dist/core-runtime/llm/model-switcher.js +1 -1
  52. package/dist/core-runtime/llm/openai-responses-incomplete-error.js +46 -0
  53. package/dist/core-runtime/llm/sealed-dispatch-capability.js +359 -0
  54. package/dist/core-runtime/llm/structured-dispatch-error.js +15 -0
  55. package/dist/core-runtime/onboard/claude-profile-scan.js +65 -0
  56. package/dist/core-runtime/onboard/cli-host.js +5 -2
  57. package/dist/core-runtime/onboard/configure-provider.js +33 -1
  58. package/dist/core-runtime/onboard/host-target.js +28 -3
  59. package/dist/core-runtime/onboard/register.js +54 -12
  60. package/dist/core-runtime/pipeline-execution-ledger.js +10 -0
  61. package/dist/core-runtime/reconstruct/artifact-types.js +35 -0
  62. package/dist/core-runtime/reconstruct/claim-projection-validation.js +17 -0
  63. package/dist/core-runtime/reconstruct/competency-projection-contract.js +63 -0
  64. package/dist/core-runtime/reconstruct/comprehension-artifact.js +321 -0
  65. package/dist/core-runtime/reconstruct/comprehension-reduce.js +367 -0
  66. package/dist/core-runtime/reconstruct/comprehension-semantic-map.js +771 -0
  67. package/dist/core-runtime/reconstruct/contract-registry.js +20 -0
  68. package/dist/core-runtime/reconstruct/dispatch-fallback-artifacts.js +640 -0
  69. package/dist/core-runtime/reconstruct/execution-telemetry.js +83 -9
  70. package/dist/core-runtime/reconstruct/final-output-sections.js +89 -0
  71. package/dist/core-runtime/reconstruct/governing-snapshot.js +36 -1
  72. package/dist/core-runtime/reconstruct/leaf-reader.js +305 -0
  73. package/dist/core-runtime/reconstruct/llm-dispatch-failure.js +270 -0
  74. package/dist/core-runtime/reconstruct/llm-touch-fingerprint.js +94 -0
  75. package/dist/core-runtime/reconstruct/material-admission-validation.js +18 -0
  76. package/dist/core-runtime/reconstruct/material-profile-validation.js +14 -0
  77. package/dist/core-runtime/reconstruct/materialize-preparation.js +304 -18
  78. package/dist/core-runtime/reconstruct/maturation-validation.js +1231 -53
  79. package/dist/core-runtime/reconstruct/mock-llm-realization.js +107 -3
  80. package/dist/core-runtime/reconstruct/obligation-assertion.js +18 -0
  81. package/dist/core-runtime/reconstruct/ontology-seed-validation.js +27 -0
  82. package/dist/core-runtime/reconstruct/output-budget.js +6 -0
  83. package/dist/core-runtime/reconstruct/pipeline-execution-ledger.js +87 -3
  84. package/dist/core-runtime/reconstruct/post-seed-validation.js +118 -5
  85. package/dist/core-runtime/reconstruct/purpose-authority-validation.js +117 -2
  86. package/dist/core-runtime/reconstruct/record.js +42 -0
  87. package/dist/core-runtime/reconstruct/registry-verification-validation.js +16 -0
  88. package/dist/core-runtime/reconstruct/run-control-validation.js +1011 -34
  89. package/dist/core-runtime/reconstruct/run.js +5198 -536
  90. package/dist/core-runtime/reconstruct/seed-authoring-readiness-validation.js +54 -3
  91. package/dist/core-runtime/reconstruct/semantic-quality-gate.js +105 -2
  92. package/dist/core-runtime/reconstruct/source-observation-delta-validation.js +41 -0
  93. package/dist/core-runtime/reconstruct/source-observations.js +166 -0
  94. package/dist/core-runtime/reconstruct/source-safety-validation.js +71 -183
  95. package/dist/core-runtime/reconstruct/source-scout-pack-validation.js +37 -1
  96. package/dist/core-runtime/reconstruct/terminal-validation.js +132 -2
  97. package/dist/core-runtime/review/continuation-plan.js +12 -5
  98. package/dist/core-runtime/review/issue-artifact-runtime.js +4 -1
  99. package/dist/core-runtime/review/materializers.js +100 -11
  100. package/dist/core-runtime/review/nesting-batch.js +6 -2
  101. package/dist/core-runtime/review/obligation-shardability.js +138 -0
  102. package/dist/core-runtime/review/pipeline-execution-ledger.js +42 -2
  103. package/dist/core-runtime/review/review-artifact-utils.js +217 -5
  104. package/dist/core-runtime/review/review-execution-steps.js +32 -8
  105. package/dist/core-runtime/review/review-progress-contract.js +8 -0
  106. package/dist/core-runtime/review/review-prompt-budget.js +97 -0
  107. package/dist/core-runtime/review/semantic-quality-gate.js +33 -7
  108. package/dist/core-runtime/review/spreadsheet-review-disposition.js +94 -0
  109. package/dist/core-runtime/route-identity.js +182 -0
  110. package/dist/core-runtime/spreadsheet-header-escalation.js +204 -0
  111. package/dist/core-runtime/spreadsheet-structure-observer.js +2689 -0
  112. package/dist/core-runtime/target-material-kind.js +58 -0
  113. package/dist/mcp/server.js +12 -5
  114. package/dist/tui/app.js +167 -0
  115. package/dist/tui/data/event-follower.js +116 -0
  116. package/dist/tui/data/node-detail.js +42 -0
  117. package/dist/tui/data/projection-poll.js +26 -0
  118. package/dist/tui/data/session-discovery.js +65 -0
  119. package/dist/tui/index.js +108 -0
  120. package/dist/tui/screens/log.js +25 -0
  121. package/dist/tui/screens/node-detail.js +17 -0
  122. package/dist/tui/screens/session-selector.js +26 -0
  123. package/dist/tui/screens/workflow-tree.js +90 -0
  124. package/dist/tui/view-model/reconstruct-adapter.js +162 -0
  125. package/dist/tui/view-model/review-adapter.js +270 -0
  126. package/dist/tui/view-model/tree-view-model.js +19 -0
  127. package/package.json +18 -3
  128. package/settings.example.json +77 -16
@@ -67,11 +67,11 @@ source_profile_records:
67
67
  target_material_kind: spreadsheet
68
68
  is_default_for_kind: true
69
69
  definition_ref: .onto/processes/reconstruct/source-profiles/spreadsheet.md
70
- definition_sha256: 35fa949f3fc680b52f3e8ff78eeb9754b86d068e6b20dca51f4107ba881b868f
70
+ definition_sha256: 6b543ab5621ef169312c1632fa6e446950a72621a974c29130695039cea7b51b
71
71
  contract_status: active
72
- runtime_implementation_status: planned
72
+ runtime_implementation_status: partially_wired
73
73
  schema_version: 1
74
- profile_version: 2
74
+ profile_version: 3
75
75
  migration_status: current
76
76
  supersedes: []
77
77
  replaced_by: []
@@ -872,6 +872,11 @@ artifact_authorities:
872
872
  reconstruct_run_control_validation:
873
873
  authority_ref: reconstruct-run-control-validation.yaml
874
874
  validation_ref: null
875
+ llm_dispatch_failures:
876
+ authority_ref: llm-dispatch-failures/*.yaml
877
+ validation_ref: reconstruct-run-control-validation.yaml
878
+ registry_ref: src/core-runtime/reconstruct/llm-dispatch-failure.ts
879
+ projection_policy: runtime_owned_provider_incomplete_evidence_projected_only_through_bounded_failed_status
875
880
  reconstruct_run_control_pre_publication_validation:
876
881
  authority_ref: reconstruct-run-control.pre-publication-validation.yaml
877
882
  validation_ref: null
@@ -900,10 +905,40 @@ artifact_authorities:
900
905
  source_observations:
901
906
  authority_ref: source-observations.yaml
902
907
  validation_ref: source-observation-directive-validation.yaml
908
+ seed_stage_prompt_source_observations:
909
+ authority_ref: seed-stage-prompt-source-observations.yaml
910
+ validation_ref: null
911
+ projection_policy: pre_maturation_seed_stage_projected_observation_snapshot_for_resume_truncation_conservation
912
+ dispatch_incomplete:
913
+ authority_ref: dispatch-incomplete.yaml
914
+ validation_ref: semantic-map-resume-validation.yaml
915
+ projection_policy: full_batch_dispatch_partition_for_stage_local_semantic_map_recovery
916
+ semantic_map_census:
917
+ authority_ref: comprehension/semantic-map-census.yaml
918
+ validation_ref: null
919
+ projection_policy: semantic_map_observation_partition_and_spend_census
920
+ semantic_map_sidecar:
921
+ authority_ref: comprehension/semantic-map.yaml
922
+ validation_ref: null
923
+ projection_policy: semantic_map_projection_sidecar_for_map_present_observations
924
+ semantic_map_resume_validation:
925
+ authority_ref: semantic-map-resume-validation.yaml
926
+ validation_ref: null
927
+ projection_policy: runtime_owned_validation_of_same_batch_semantic_map_recovery_frontier
928
+ dispatch_fallback_activation:
929
+ authority_ref: dispatch-fallback-activation.yaml
930
+ validation_ref: null
931
+ registry_ref: src/core-runtime/reconstruct/dispatch-fallback-artifacts.ts
932
+ projection_policy: create_once_lineage_claim_for_originating_initial_semantic_map_rate_limit_fallback
933
+ dispatch_fallback_outcome:
934
+ authority_ref: dispatch-fallback-outcome.yaml
935
+ validation_ref: null
936
+ registry_ref: src/core-runtime/reconstruct/dispatch-fallback-artifacts.ts
937
+ projection_policy: terminal_commit_marker_for_one_same_call_exact_incomplete_fallback_pass
903
938
  source_safety_ledger:
904
939
  authority_ref: source-safety-ledger.yaml
905
940
  validation_ref: source-safety-ledger-validation.yaml
906
- projection_policy: six_axis_source_safety_and_derived_visibility_by_observation_id_and_intended_consumption
941
+ projection_policy: four_axis_source_safety_and_derived_visibility_by_observation_id_and_intended_consumption
907
942
  source_safety_ledger_validation:
908
943
  authority_ref: source-safety-ledger-validation.yaml
909
944
  validation_ref: null
@@ -1273,6 +1308,9 @@ validation_gate_catalog:
1273
1308
  - gate_id: source_scout_pack_post_maturation_gate
1274
1309
  validation_artifact_ref: source-scout-pack-validation.post-maturation.yaml
1275
1310
  required_when: source_scout_pack_post_maturation_snapshot_exists
1311
+ - gate_id: semantic_map_resume_gate
1312
+ validation_artifact_ref: semantic-map-resume-validation.yaml
1313
+ required_when: semantic_map_resume_validation_exists
1276
1314
  - gate_id: source_purpose_candidates_gate
1277
1315
  validation_artifact_ref: source-purpose-candidates-validation.yaml
1278
1316
  required_when: seed_validity_or_seed_iteration_readiness_is_projected
@@ -1443,6 +1481,11 @@ required_when_predicate_catalog:
1443
1481
  truth_expression: "artifact_exists(source-scout-pack.post-maturation.yaml)"
1444
1482
  unknown_projection: blocked
1445
1483
  explanation_template: "An immutable post-maturation SourceScoutPack snapshot exists and requires snapshot-scoped validation before post-maturation audit or replay use."
1484
+ - predicate_id: semantic_map_resume_validation_exists
1485
+ input_authority_refs: [semantic-map-resume-validation.yaml]
1486
+ truth_expression: "artifact_exists(semantic-map-resume-validation.yaml)"
1487
+ unknown_projection: blocked
1488
+ explanation_template: "A semantic-map resume validation artifact exists and must be valid before handoff consumption."
1446
1489
  - predicate_id: source_frontier_observation_delta
1447
1490
  gate_instance_scope: per_round
1448
1491
  input_authority_refs: [rounds/<round-id>/source-observation-delta.yaml]
@@ -1979,6 +2022,16 @@ readiness_projection:
1979
2022
  conflict_rule: When supporting artifacts project different canonical values, choose the first value in strictness_order_high_to_low that appears among contributing artifacts; lower list index is stricter and wins. Cite every contributing artifact.
1980
2023
 
1981
2024
  validator_records:
2025
+ - validator_id: semantic-map-resume-validator
2026
+ gate_ids: [semantic_map_resume_gate]
2027
+ validator_version: 1
2028
+ input_authority_refs:
2029
+ - dispatch-incomplete.yaml
2030
+ - comprehension/semantic-map-census.yaml
2031
+ - comprehension/semantic-map.yaml
2032
+ - source-observations.yaml
2033
+ validation_obligations: []
2034
+ output_ref: semantic-map-resume-validation.yaml
1982
2035
  - validator_id: reconstruct-run-control-validator
1983
2036
  gate_ids: [reconstruct_run_control_gate]
1984
2037
  validator_version: 1
@@ -2097,10 +2150,9 @@ validator_records:
2097
2150
  - source-observations.yaml
2098
2151
  - reconstruct-contract-registry.yaml
2099
2152
  validation_obligations:
2100
- - validate_exactly_six_canonical_source_safety_axes
2153
+ - validate_exactly_four_canonical_source_safety_axes
2101
2154
  - validate_every_observation_has_source_safety_rows_for_each_intended_consumption
2102
2155
  - validate_visibility_tier_is_derived_not_independent_authority
2103
- - fail_when_nested_redaction_evidence_contradicts_top_level_axis_state
2104
2156
  - validate_source_safety_subject_refs_against_observed_source_refs
2105
2157
  - preserve_prompt_context_evidence_support_public_output_replay_and_material_claim_consumption_boundaries
2106
2158
  output_ref: source-safety-ledger-validation.yaml
@@ -2527,7 +2579,7 @@ validator_records:
2527
2579
  - validator_id: revision-proposal-validator
2528
2580
  gate_ids: [revision_proposal_gate]
2529
2581
  validator_version: 1
2530
- input_authority_refs: [revision-proposal.yaml, failure-classification.yaml, failure-classification-validation.yaml, reconstruct-contract-registry.yaml]
2582
+ input_authority_refs: [revision-proposal.yaml, failure-classification.yaml, failure-classification-validation.yaml, ontology-seed.yaml, reconstruct-contract-registry.yaml]
2531
2583
  output_ref: revision-proposal-validation.yaml
2532
2584
  - validator_id: maturation-baseline-validator
2533
2585
  gate_ids: [maturation_baseline_gate]
@@ -2564,6 +2616,7 @@ validator_records:
2564
2616
  - reject_matrix_rows_without_baseline_row_ref
2565
2617
  - validate_matrix_row_ids_are_stable_and_baseline_row_refs_close
2566
2618
  - preserve_frontier_seed_state_before_question_frontier_authoring
2619
+ - reject_blocking_question_refs_before_question_frontier_authoring
2567
2620
  output_ref: baseline-actionability-matrix-validation.yaml
2568
2621
  - validator_id: actionability-matrix-validator
2569
2622
  gate_ids: [actionability_matrix_gate]
@@ -2575,6 +2628,8 @@ validator_records:
2575
2628
  - maturation-answer-claims-validation.yaml
2576
2629
  - ontology-expansion.yaml
2577
2630
  - ontology-expansion-validation.yaml
2631
+ - maturation-question-frontier.yaml
2632
+ - maturation-question-frontier-validation.yaml
2578
2633
  - reconstruct-contract-registry.yaml
2579
2634
  validation_obligations:
2580
2635
  - support_zero_delta_baseline_only_matrix_when_no_maturation_deltas_exist
@@ -2583,6 +2638,7 @@ validator_records:
2583
2638
  - validate_matrix_row_ids_are_stable_and_baseline_row_refs_close
2584
2639
  - validate_maturity_level_against_supporting_refs_blocking_questions_and_limitations
2585
2640
  - require_blocker_and_high_rows_to_be_l4_limitation_backed_or_continuation_blocking
2641
+ - validate_blocking_question_refs_against_validated_question_frontier
2586
2642
  output_ref: actionability-matrix-validation.yaml
2587
2643
  - validator_id: maturation-question-frontier-validator
2588
2644
  gate_ids: [maturation_question_frontier_gate]
@@ -2670,7 +2726,7 @@ validator_records:
2670
2726
  output_ref: answer-support-ledger-validation.yaml
2671
2727
  - validator_id: maturation-answer-claims-validator
2672
2728
  gate_ids: [maturation_answer_claim_gate]
2673
- validator_version: 1
2729
+ validator_version: 2
2674
2730
  input_authority_refs:
2675
2731
  - maturation-answer-claims.yaml
2676
2732
  - answer-support-ledger-validation.yaml
@@ -2756,6 +2812,8 @@ validator_records:
2756
2812
  - maturation-authority-response-validation.yaml
2757
2813
  - ontology-expansion-validation.yaml
2758
2814
  - maturation-convergence-ledger-validation.yaml
2815
+ - revision-proposal.yaml
2816
+ - revision-proposal-validation.yaml
2759
2817
  - reconstruct-contract-registry.yaml
2760
2818
  validation_obligations:
2761
2819
  - validate_continuation_state_against_validated_actionability_matrix_and_frontier_state
@@ -2763,6 +2821,10 @@ validator_records:
2763
2821
  - validate_continue_ask_user_or_blocked_state_against_available_next_authority
2764
2822
  - validate_limitation_refs_and_row_scope_for_actionable_limited_state
2765
2823
  - reject_actionable_ready_until_final_requestion_convergence_is_proven
2824
+ - validate_revision_blocker_limitation_refs_against_validated_revision_proposal
2825
+ - require_revision_blocker_refs_in_continuation_limitation_refs
2826
+ - reject_actionable_ready_when_unresolved_revision_blockers_remain
2827
+ - bind_revision_proposal_validation_to_consumed_revision_proposal
2766
2828
  output_ref: maturation-continuation-decision-validation.yaml
2767
2829
  - validator_id: actionable-ontology-validator
2768
2830
  gate_ids: [actionable_ontology_gate]
@@ -3188,3 +3250,102 @@ version_policy:
3188
3250
  - query access contract registry changes
3189
3251
  - readiness projection changes
3190
3252
  - validator record changes
3253
+
3254
+ # G(b) prompt-projection field-parity (INV-SCHEMA-1). Declares the EXACT field/budget
3255
+ # surface of each governed runtime prompt projection so a registry-shape drift (a field or
3256
+ # budget added or dropped in the runtime contract without a registry home, or vice versa) is
3257
+ # caught in CI. Runtime SSOT for the competency-question assessment contract is
3258
+ # src/core-runtime/reconstruct/competency-projection-contract.ts; the parity guard
3259
+ # scripts/check-prompt-projection-parity.ts asserts this node equals that module's contract
3260
+ # surface (exact-set on payload_fields/policy_fields, exact-value on budget_fields) and that
3261
+ # run.ts consumes the extracted module rather than a duplicated local copy. Every element
3262
+ # declared here is guard-checked (no unguarded declared data).
3263
+ prompt_projection_contracts:
3264
+ competency_question_assessment:
3265
+ # Top-level keys of competencyQuestionAssessmentProjectionContract().
3266
+ payload_fields:
3267
+ - projection_kind
3268
+ - projection_contract_version
3269
+ - semantic_authority
3270
+ - prompt_char_limit
3271
+ - question_projection
3272
+ - evidence_projection
3273
+ - source_evidence_projection
3274
+ - source_evidence_excerpt_char_limit
3275
+ - source_evidence_reserve_derivation
3276
+ - validation_projection
3277
+ - claim_realization_projection
3278
+ - runtime_derivations
3279
+ - batching_policy
3280
+ - fail_loud_policy
3281
+ # Keys of the nested batching_policy object.
3282
+ policy_fields:
3283
+ - mode
3284
+ - order
3285
+ - build_budget_reserve_chars
3286
+ - single_question_overflow
3287
+ # The named budget constants the contract OUTPUT embeds (NOT the internal
3288
+ # EVIDENCE_CANDIDATE_LIMIT runaway guard, which never enters the contract surface).
3289
+ budget_fields:
3290
+ prompt_char_limit: 50000
3291
+ source_evidence_excerpt_char_limit: 4000
3292
+ build_budget_reserve_chars: 1000
3293
+
3294
+ # G(c) final-output append-section parity (INV-SCHEMA-1). Declares the canonical identity of
3295
+ # every section the reconstruct final output emits — section_id (hyphen; also the load-bearing
3296
+ # required_fragments text), heading (the provenance gate's match key), prompt_policy_id (the
3297
+ # underscore id in deterministic_runtime_append_sections; null for conditional sections),
3298
+ # emit_owner (emission surface: always_section vs conditional_markdown — distinct from the
3299
+ # binding flag), provenance_binding_required (whether the final-output provenance gate checks
3300
+ # it), and activation. Runtime SSOT is src/core-runtime/reconstruct/final-output-sections.ts;
3301
+ # the parity guard scripts/check-final-output-sections-parity.ts (G9) asserts this node equals
3302
+ # that module exactly and that run.ts consumes the module rather than inline heading literals.
3303
+ final_output_append_sections:
3304
+ - section_id: seed-answerability
3305
+ heading: Seed Answerability
3306
+ prompt_policy_id: seed_answerability
3307
+ emit_owner: always_section
3308
+ provenance_binding_required: true
3309
+ activation: always
3310
+ - section_id: artifact-truth
3311
+ heading: Artifact Truth
3312
+ prompt_policy_id: artifact_truth
3313
+ emit_owner: always_section
3314
+ provenance_binding_required: true
3315
+ activation: always
3316
+ - section_id: claim-projection
3317
+ heading: Claim Projection
3318
+ prompt_policy_id: claim_projection
3319
+ emit_owner: always_section
3320
+ provenance_binding_required: true
3321
+ activation: always
3322
+ - section_id: runtime-artifact-truth-footer
3323
+ heading: Runtime Artifact Truth Footer
3324
+ prompt_policy_id: provenance_footer
3325
+ emit_owner: always_section
3326
+ provenance_binding_required: true
3327
+ activation: always
3328
+ - section_id: runtime-provenance-bindings
3329
+ heading: Runtime Provenance Bindings
3330
+ prompt_policy_id: provenance_bindings
3331
+ emit_owner: always_section
3332
+ provenance_binding_required: true
3333
+ activation: always
3334
+ - section_id: source-projection-truncation
3335
+ heading: Source Projection Truncation
3336
+ prompt_policy_id: null
3337
+ emit_owner: conditional_markdown
3338
+ provenance_binding_required: false
3339
+ activation: document_projection_truncation_nonempty
3340
+ - section_id: workbook-inventory-projection-truncation
3341
+ heading: Workbook Inventory Projection Truncation
3342
+ prompt_policy_id: null
3343
+ emit_owner: conditional_markdown
3344
+ provenance_binding_required: false
3345
+ activation: workbook_inventory_projection_truncation_nonempty
3346
+ - section_id: unresolved-revision-proposals
3347
+ heading: Unresolved Revision Proposals
3348
+ prompt_policy_id: null
3349
+ emit_owner: conditional_markdown
3350
+ provenance_binding_required: false
3351
+ activation: disclosed_revision_proposals_nonempty
@@ -161,9 +161,78 @@ If a run halts, the output should still be useful:
161
161
 
162
162
  A halted run may provide candidate Seed content only if the corresponding
163
163
  artifact and validation refs exist. It may not imply seed confirmation, CQ
164
- assessment, failure classification, revision proposal, terminal seed iteration readiness, or
164
+ assessment, failure classification, revision proposal, terminal seed iteration readiness, or
165
165
  final ontology direction unless those artifacts exist.
166
166
 
167
+ ### 6.1 Provider output-ceiling failure
168
+
169
+ When an OpenAI Responses direct-API semantic-author call ends with
170
+ `incomplete_details.reason=max_output_tokens`, the runtime does not parse,
171
+ repair, continue, or accept the partial output. It persists the provider evidence
172
+ under `llm-dispatch-failures/*.yaml`, links that source artifact to the owning
173
+ attempt through a committed run-control transaction, marks the attempt `failed`,
174
+ and releases the session lock.
175
+
176
+ The headroom route is pinned to the public OpenAI Responses endpoint. A custom
177
+ actor `base_url` is rejected before dispatch, and ambient `OPENAI_BASE_URL` does
178
+ not redirect this route. Failure publication is serialized with every other
179
+ run-control mutation. It writes and fsyncs a scratch file, atomically promotes
180
+ it to a hash-prefixed pending file, records the prepared transaction, publishes
181
+ the canonical sidecar, and commits the transaction/failed attempt/released lock.
182
+ A valid untracked pending file may be adopted only when its bytes, hash-prefix,
183
+ session, attempt, and held owner lock all match. Scratch, malformed, truncated,
184
+ ambiguous, wrong-prefix, wrong-owner, or wrong-hash remnants abandon the current
185
+ attempt, release its lock, and require `blocked_partial_write` recovery.
186
+
187
+ `onto_reconstruct`, `onto_reconstruct_read`, the compatibility status/result
188
+ tools, and the Core API must return a record-less discriminated branch when the
189
+ run-control validator trusts the latest failed terminal. A latest trusted failed
190
+ attempt supersedes an older non-terminal preparation record. The branch has
191
+ `status: failed`, `reconstructRecord: null`, run-control and validation refs, the
192
+ failure artifact ref, stage progress, and a bounded failure summary. The summary
193
+ may expose the stable failure code, stage/artifact identity, provider status and
194
+ incomplete reason, base/headroom/effective output caps, provider token counts,
195
+ and request-count observability. Provider request/response ids, endpoint, and
196
+ partial-output hash remain source-artifact-only fields; raw partial output is not
197
+ persisted.
198
+
199
+ Failed progress does not infer semantic counts from the existence of a sidecar:
200
+ `failureCount` is `null`. Run-control and run-control-validation are completed
201
+ control stages. The failed semantic stage is halted. Other stages are completed
202
+ only when a committed transaction owned by the latest failed attempt still
203
+ matches the current regular-file bytes inside the real session root; otherwise
204
+ they remain pending. `reusableArtifactRefs` contains only that same bounded,
205
+ hash-verified latest-owner set, excludes the failure sidecar, and may be empty.
206
+
207
+ ### 6.2 Semantic-map provider fallback
208
+
209
+ `reconstruct.execution.dispatch_fallback` is an explicit default-off capability
210
+ for the spreadsheet semantic-map stage. It may activate only in the originating
211
+ fresh initial attempt after a sealed direct SDK route supplies structured
212
+ rate-limit evidence and the current attempt still owns the held session lock.
213
+ Arbitrary diagnostic text is not trigger evidence.
214
+
215
+ An activated run writes the direct-child
216
+ `dispatch-fallback-activation.yaml` claim before alternate-provider work. It
217
+ then reuses the existing semantic-map stage for exactly the persisted incomplete
218
+ observation set, with one fallback pass and one physical SDK request per logical
219
+ dispatch. Retained primary observations are not sent again.
220
+
221
+ `dispatch-fallback-outcome.yaml` is the terminal commit marker after the final
222
+ `dispatch-incomplete.yaml`, semantic-map census, and semantic-map sidecar have
223
+ been securely published and indexed in run control. A completed outcome is
224
+ projected into the completed reconstruct record and semantic-map manifest step.
225
+ A halted outcome is disclosed through the current breaker error and does not
226
+ create a completed record or manifest. Any session lineage with an activation,
227
+ including a crash between activation and outcome, requires a new session for a
228
+ later entry. A `running` attempt with a `held` session lock cannot be taken over
229
+ based on `lease_expires_at` alone.
230
+
231
+ The TypeScript schema, validators, path constructors, secure publishers, and
232
+ record projection for both artifacts are owned by
233
+ `src/core-runtime/reconstruct/dispatch-fallback-artifacts.ts`; prose and the
234
+ contract registry do not duplicate their machine schema.
235
+
167
236
  ## 7. Runtime Payload Expectations
168
237
 
169
238
  Future status/result payloads should expose enough facts for the host LLM to
@@ -175,6 +244,8 @@ render this contract without scraping prose:
175
244
  - stage state: pending, running, completed, skipped, or halted
176
245
  - skipped/deferred stage reason and `authority_impact`
177
246
  - stage artifact refs and owner
247
+ - record-less trusted provider failure status, bounded failure summary, and
248
+ failure/run-control refs
178
249
  - liveness state and recommended polling interval
179
250
  - deterministic count summaries from the latest completed artifacts
180
251
  - latest source frontier summary and reusable trusted observation refs
@@ -30,6 +30,10 @@ Workbook, sheet, named range, table, or used range.
30
30
  - named ranges
31
31
  - hidden rows and columns
32
32
  - macros or VBA presence
33
+ - protected ranges and sheet protection
34
+ - filters and auto-filter state
35
+ - charts, images, and object anchors
36
+ - external links and data connections to other workbooks or sources
33
37
 
34
38
  ## Correct Observation Examples
35
39
 
@@ -47,6 +51,18 @@ Workbook, sheet, named range, table, or used range.
47
51
 
48
52
  > The formula is a cost-recognition policy.
49
53
 
54
+ > The `#REF!` in `B2` is a bug caused by a deleted column.
55
+
56
+ > The date in `C5` is stored as text, so it is wrong.
57
+
58
+ ## Static Inspection Boundary
59
+
60
+ Static structural inspection reveals how formulas and structure were written, but
61
+ it cannot prove computed results. Record an observed formula or value as structure
62
+ inspected only; do not assert that a formula's output is correct unless an engine
63
+ recalculated it. Note unresolved external data, links, or connections as
64
+ unresolved rather than assuming their current values.
65
+
50
66
  ## Detail Location Format
51
67
 
52
68
  ```text
@@ -93,6 +109,19 @@ outside this list, record it in the `PurposeAdequacyFrame` with evidence and
93
109
  promote it to this profile only after repeated real-source runs justify the
94
110
  refinement.
95
111
 
112
+ ## Large Workbook Inspection Strategy
113
+
114
+ Inspect structure before converting the workbook to another format. Do not flatten
115
+ a workbook into a single table or dataframe before checking whether structure --
116
+ formulas, merged ranges, named ranges, and cross-sheet references -- carries
117
+ meaning.
118
+
119
+ For large workbooks, prefer narrow, targeted reads around the relevant ranges over
120
+ loading every sheet in full. Read the workbook's own structural index first -- the
121
+ sheet list, per-sheet dimensions, named ranges, and table definitions -- and use a
122
+ read-only or streaming inspection path so the used range and formula cells can be
123
+ observed without materializing the entire workbook.
124
+
96
125
  ## Scan Targets
97
126
 
98
127
  - sheet list and used range per sheet
@@ -104,3 +133,9 @@ refinement.
104
133
  - data validation rules
105
134
  - macro/VBA presence
106
135
  - external data connections
136
+ - protected ranges and sheet protection
137
+ - filters and auto-filter state
138
+ - charts, images, and object anchors
139
+ - external links to other workbooks
140
+ - formula-error cells, recorded as literal tokens such as `#REF!`, `#N/A`, or `#VALUE!`
141
+ - structural-risk signals recorded literally and without diagnosis: cross-sheet references whose target sheet or range is absent, dates stored as text, empty cells inside a calculation chain, and lookup keys whose stored type differs from the target column
@@ -198,17 +198,21 @@ canonical requirement:
198
198
  현재 repo-local TS bounded path에서 실행 가능한 `ReviewExecutionProfile` mode는 아래다.
199
199
 
200
200
  - `main-workers`: main이 teamlead 역할을 수행하고 worker가 lens를 실행한다.
201
+ - `nested-workers`: external OAuth worker executor(`codex` 또는 `claude_code`)가
202
+ outer seat에서 ready unit batch를 fan-out하고, 각 inner unit은 flat 경로와
203
+ 동일한 unit-executor CLI/seat/검증 계약을 따른다. `direct_call` executor와
204
+ 조합되면 outer worker seat가 없으므로 fail-closed한다.
201
205
  - `synthesize.llm`: deliberation 이후 별도 synthesize unit에 적용된다. synthesize는 모든 lens output, issue artifacts, deliberation, problem framing을 통합하므로 높은 effort가 기본적으로 적합하다.
202
206
 
203
- `nested-workers`는 concept/profile shape로 남아 있지만 현재 active live path에서는
204
- pre-dispatch에서 fail-loud한다. 기존 nested bridge sidecar structured output,
205
- read-only lens execution, settings-owned bounded dispatch를 강제하지 못하기 때문이다.
206
- mode는 inner lens 실행이 동일한 structured runner 계약을 따를 때만 다시 실행
207
- 가능한 경로가 될 수 있다.
207
+ `nested-workers`의 canonical 계약은 `nesting-batch-worker-contract.md`가 소유한다.
208
+ 과거 raw provider-CLI inner bridge retired 경로이며, 현재 runtime path는
209
+ sidecar structured output, read-only unit execution, settings-owned bounded dispatch를
210
+ 동일 unit executor 공유로 보존한다.
208
211
 
209
212
  worker executor는 profile resolution에서 아래 중 하나로 고정된다.
210
213
 
211
214
  - `codex`: host-bound OAuth 또는 Codex worker path.
215
+ - `claude_code`: host-bound Claude Code worker path.
212
216
  - `direct_call`: `api_key` 또는 `local` provider path.
213
217
 
214
218
  중요한 점은 host-specific naming이 아니라:
@@ -60,7 +60,7 @@ runtime은 아래만 한다.
60
60
  - `prompt-packets/synthesis/{issue_id}.prompt.md`
61
61
  9. executor realization
62
62
  - `worker`
63
- - `direct-call`
63
+ - `direct_call`
64
64
  10. host runtime
65
65
  - `codex`
66
66
  - `openai`
@@ -108,6 +108,9 @@ runtime은 아래만 한다.
108
108
  9. `execution-result.yaml`
109
109
  10. `review-run-manifest.yaml`
110
110
  11. `error-log.md`
111
+ 12. `dispatch-incomplete.yaml` — dispatch breaker가 켜진 배치(lens/issue-stance)의
112
+ end state (완료/dead-letter/미완료 집합). 트립이든 완주든 기록하며, OFF에서는
113
+ 쓰지 않는다
111
114
 
112
115
  원칙:
113
116
 
@@ -121,6 +124,22 @@ runtime은 아래만 한다.
121
124
  - `execution-result.yaml`은 actual execution truth의 canonical seat다
122
125
  - `execution-result.yaml`과 `review-run-manifest.yaml`은 effective retry policy를 기록해야 한다
123
126
  - `lens-completion-barrier.yaml`은 downstream stage 진입 gate다
127
+ - `review.execution.retry.dispatch_breaker`(opt-in)가 켜지면 lens/issue-stance
128
+ fan-out 풀의 **flat per-unit 루프**는 유닛의 최종 outcome을 계통 실패 분류
129
+ (rate_limit/auth/transport)로 관찰하고, 서로 다른 유닛에 걸친 연속 계통 실패가
130
+ 임계에 닿으면 잔여 유닛을 디스패치하지 않고 halt한다 (`halt_reason` prefix
131
+ `dispatch_breaker:`, lens 풀은 `halt_phase=lens_dispatch_breaker`). 미완료
132
+ 집합은 `dispatch-incomplete.yaml`이 회복 계약(재디스패치 집합 == 미완료 집합)
133
+ 으로 영속하며, 트립 halt의 execution-result는 완료 유닛 행을 보존한다.
134
+ nested-workers 1차 배치가 실행된 스테이지도 breaker가 적용된다(§4-1): 배치-창
135
+ SUCCESS는 실 디스패치가 아니므로 완료로만 집계돼 계통 streak을 리셋하지 않고,
136
+ 배치-창 FAILURE는 flat 경로처럼 실패로 분류된다(item-local→dead-letter, 계통→
137
+ 회복 미완료 집합). 배치-실패 유닛의 flat 재시도가 계통 실패를 직접 관찰·구동
138
+ 한다. lens/issue-stance 풀의 실제 dispatch width가 2 이상이면 runner가
139
+ breaker policy를 내부적으로 `concurrent:true`로 투영해 완료순서가 poison-vs-outage
140
+ 회복 집합을 결정하지 못하게 한다. 이 값은 사용자 설정 키가 아니라 runtime-owned
141
+ execution projection이다. OFF(기본)는 현행 halt/배리어 동작이며 nested 경로도
142
+ 무변경이다
124
143
  - degraded case / partial failure는 `error-log.md`에 기록해야 한다
125
144
  - runtime unavailable completion으로 root unit이 completed가 된 경우에도 원 실패는 child unit result로 보존하고 degradation evidence에 포함해야 한다
126
145
  - `error-log.md`는 최소 한 번 `EffectiveBoundaryState`를 기록해야 한다
@@ -168,13 +187,18 @@ evidence로 쓰지 않는다.
168
187
 
169
188
  현재 구현에서 prompt execution runner를 통해 실행되는 execution profile:
170
189
 
171
- - `worker + codex` (Codex CLI 경로)
172
- - `worker + direct-call` (API/local provider 경로)
173
-
174
- `nested-workers` mode는 현재 runner에서 pre-dispatch structured failure로
175
- 차단한다. inner lens worker가 runtime submit-tool serialization,
176
- read-only sandbox, `execution-plan.max_concurrent_lenses` 기반 bounded dispatch를
177
- 같은 방식으로 보장하기 전에는 active product path아니다.
190
+ - `main-workers + codex|claude_code` (Codex CLI 또는 Claude Code CLI 경로)
191
+ - `main-workers + direct_call` (API/local provider 경로)
192
+ - `nested-workers + codex|claude_code` (outer OAuth worker가 ready unit batch를
193
+ fan-out하고, inner unit은 flat 경로와 동일한 unit-executor CLI/seat/검증 계약을
194
+ 따른다)
195
+
196
+ `nested-workers + direct_call`은 outer worker seat없으므로
197
+ `nested_workers_executor_unsupported` structured failure로 fail-closed한다. raw
198
+ provider-CLI inner bridge는 retired 경로이며, active nested path의 계약은
199
+ `nesting-batch-worker-contract.md`가 소유한다. mock-backed nested harness는 wiring,
200
+ schema, artifact contract, route/failure 검증 evidence이며 product semantic
201
+ completion 또는 semantic quality evidence로 승격하지 않는다.
178
202
 
179
203
  원칙:
180
204
 
@@ -93,8 +93,8 @@ material_profile:
93
93
  target_material_kind: code
94
94
  target_material_kind_candidates:
95
95
  - code
96
- support_status: partial
97
- unsupported_reason: review records target material kind, but material-specific validation is not implemented yet
96
+ support_status: supported
97
+ unsupported_reason: null
98
98
  detection:
99
99
  owner: runtime_heuristic
100
100
  confidence: 0.92
@@ -157,8 +157,51 @@ This axis must stay separate from:
157
157
  - `medium`: a cross-product reference and learning frame
158
158
 
159
159
  The current runtime records material kind and detection confidence as a bounded
160
- heuristic. It must not claim material-specific validation until per-material
161
- validators or adapters are implemented.
160
+ heuristic. Per-material review handling is implemented for **spreadsheet** through a
161
+ **single per-ref disposition** (`computeSpreadsheetDisposition`, the SSOT): every
162
+ spreadsheet honesty surface — `support_status`, `target_refs[].inspectable`/`.sha256`,
163
+ the `review_goal` obligations, the prompt `material_kind_obligations`, and the render
164
+ notes — **projects from one record computed once over the shared observation**, instead
165
+ of each surface re-deriving its claim from a different proxy. The structural inventory is
166
+ rendered into `materialized-input.md` with detail (formula text, named-range references,
167
+ data-validation rules incl. operator + formula bounds, protections, risk signals) —
168
+ **structure inspected only, not recalculated**.
169
+
170
+ Two distinct axes, deliberately not coupled:
171
+
172
+ - **`inspectable`** — the workbook was read (`unsupported_reason === null`) AND has
173
+ renderable structure, *including plain tabular data* (columns / per-column cardinality /
174
+ distinct-value counts). The aggregate-only rule is NARROWED, not preserved: the single
175
+ value-bearing field is `data_validations[].members` — bounded DECLARED type=list enum labels
176
+ parsed from a formula1 literal (never observed/free/high-cardinality cell values).
177
+ A clean CSV or a formula-free data `.xlsx` is `inspectable` and stays
178
+ `support_status: supported`. It is NOT coupled to whether any obligation is backed.
179
+ - **`backed_goals`** — the POSITIVE subset of the six obligations whose specific evidence
180
+ exists in that ref's inventory; this drives `review_goal`. `review_goal` therefore
181
+ carries **only the backed subset, not always all six**: a plain-data CSV backs none
182
+ (and so carries no spreadsheet obligation while remaining `supported`); a macro-only or
183
+ protection-only workbook backs only `access_and_protection_hygiene`. `structural_risk_signals`
184
+ is backed by genuine structural risk only — `unreadable_sheet_part` (an observation-failure
185
+ marker) and the `macro_present` / `external_links_present` signals (owned by other goals)
186
+ do not back it.
187
+
188
+ `support_status` runs the gate over the **union of resolved and materialized** spreadsheet
189
+ refs the prompt renders — **regardless of the resolved material kind**, so a `code`-resolved
190
+ target carrying a materialized workbook the observer could not read degrades to `partial`
191
+ (it is not gated only when the resolved kind is spreadsheet). If **any** rendered spreadsheet
192
+ ref is uninspectable the target is `partial`, with a reason naming each uninspected ref by
193
+ its full resolved path and actual cause; obligations are dropped only when **no** ref is
194
+ inspectable. A `supported`/`null` profile is never emitted for a workbook the render shows as
195
+ `unsupported`. The render emits obligation-backing detail **before** the per-sheet bodies so
196
+ the prompt embed cut cannot strip an obligation's evidence, and protected/hidden sheets beyond
197
+ the render cap are disclosed by count. Observation bounds the number of sheets read
198
+ (`max_sheets_observed`, conservatively high) and a CSV/workbook whose decode or parse throws
199
+ degrades to an honest `unsupported` inventory rather than aborting review prep.
200
+
201
+ `code`, `document`, `database`, and `unknown` retain their prior support states
202
+ until their per-material review adapters land. A spreadsheet inside a `mixed`
203
+ bundle does not yet receive spreadsheet obligations (a known limitation,
204
+ consistent with the `mixed` support state).
162
205
 
163
206
  ---
164
207
 
@@ -81,6 +81,7 @@ interface PipelineExecutionLedgerUnitEntry {
81
81
  lastFailureMessage: string | null;
82
82
  upstreamUnitIds: string[];
83
83
  downstreamUnitIds: string[];
84
+ resolution?: "demoted";
84
85
  executionTelemetry?: PipelineUnitExecutionTelemetry | null;
85
86
  }
86
87
 
@@ -170,6 +171,16 @@ Execution telemetry rules:
170
171
  competency-question assessment) so batching changes stay attributable.
171
172
  - Units that made no LLM call carry no telemetry field; absence is not a
172
173
  failure signal.
174
+ - `resolution: "demoted"` marks terminal resolution outside the trusted-output
175
+ path (bounded resubmit exhausted, complete-with-failure): the downstream
176
+ stage product consumed and disclosed the gap (review: issue-stance-matrix
177
+ `validation.missing_stances`), so the unit owes no further dispatch — it
178
+ must not reappear on the frontier, block convergence, or block downstream
179
+ upstream-trust. `status`/`lastFailureMessage` keep the audit truth
180
+ (typically `failed`); a resolved unit contributes no preserved artifacts.
181
+ Frontier/convergence consumers use `isResolvedLedgerUnit`
182
+ (trusted-or-resolved); artifact-preservation consumers keep
183
+ `isTrustedLedgerUnit`.
173
184
  - Current population status: `reconstruct` populates telemetry from its run
174
185
  manifest steps. `review` does not populate it yet.
175
186
 
@@ -81,7 +81,7 @@ the lexicon.
81
81
 
82
82
  | Process | Required alignment |
83
83
  |---|---|
84
- | `review` | `review-target-profile.yaml` records `target_material_kind`; review must not claim material-aware validation before per-material validators exist. |
84
+ | `review` | `review-target-profile.yaml` records `target_material_kind` and provides a per-material review adapter for `spreadsheet` via a **single per-ref disposition** (`computeSpreadsheetDisposition`): every honesty surface (`support_status`, `target_refs[].inspectable`, `review_goal`, prompt obligations, render notes) projects from one record. `inspectable` (the workbook was read and has renderable structure, *including plain tabular data*) drives `support_status`; the **positive** `backed_goals` subset drives `review_goal`, so `review_goal` carries only the backed obligations — a plain CSV is `supported`/`inspectable` yet backs none, and a macro/protection-only workbook backs only `access_and_protection_hygiene`. `support_status` degrades to `partial` when **any** rendered ref across the resolved∪materialized union is uninspectable (unsupported format .xls/.xlsb/.ods, unreadable/oversized/empty, or a corrupt shell), and the gate runs regardless of the resolved kind (a code target carrying a materialized uninspectable workbook also degrades). `code` stays `supported`, `document`/`database` stay `partial`, `mixed` stays `partial_composite`, and `unknown` stays `unknown` until their adapters land (precise per-kind states owned by `review-target-profile-contract.md` §6). Review `support_status` and reconstruct `runtime_implementation_status` are **independent per-process axes over the same shared inventory backing**: review `supported` does not imply the reconstruct seed pipeline is fully wired (it remains `partially_wired`). |
85
85
  | `reconstruct` | Source profiles, source adapters, source observations, and directive validation must be keyed by `target_material_kind`. |
86
86
  | `evolve` | Future adapters must not assume code-product inputs; adapter selection should start from `target_material_kind` as defined in `.onto/processes/evolve/material-kind-adapter-contract.md`. |
87
87