onto-mcp 0.3.2 → 0.4.1

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 (300) hide show
  1. package/.onto/processes/reconstruct/actionable-ontology-seed-recomposition-design.md +447 -0
  2. package/.onto/processes/reconstruct/foundry-style-ontology-seed-contract.md +934 -0
  3. package/.onto/processes/reconstruct/reconstruct-boundary-contract.md +303 -725
  4. package/.onto/processes/reconstruct/reconstruct-contract-registry.yaml +1645 -0
  5. package/.onto/processes/reconstruct/reconstruct-execution-ux-contract.md +26 -22
  6. package/.onto/processes/reconstruct/source-profile-contract.md +49 -23
  7. package/.onto/processes/reconstruct/source-profiles/code.md +6 -3
  8. package/.onto/processes/reconstruct/source-profiles/database.md +5 -2
  9. package/.onto/processes/reconstruct/source-profiles/document.md +5 -2
  10. package/.onto/processes/reconstruct/source-profiles/spreadsheet.md +5 -4
  11. package/.onto/processes/review/review-execution-ux-contract.md +40 -0
  12. package/.onto/processes/shared/pipeline-execution-ledger-contract.md +26 -10
  13. package/.onto/processes/shared/target-material-kind-contract.md +29 -16
  14. package/AGENTS.md +6 -4
  15. package/README.md +149 -76
  16. package/dist/cli.js +8 -8
  17. package/dist/core-api/reconstruct-api.js +117 -31
  18. package/dist/core-api/review-api.js +47 -0
  19. package/dist/core-runtime/cli/codex-review-unit-executor.js +39 -2
  20. package/dist/core-runtime/cli/complete-review-session.js +2 -2
  21. package/dist/core-runtime/cli/mock-review-unit-executor.js +1 -1
  22. package/dist/core-runtime/cli/review-invoke.js +9 -9
  23. package/dist/core-runtime/cli/run-review-prompt-execution.js +39 -5
  24. package/dist/core-runtime/cli/spawn-watcher.js +266 -47
  25. package/dist/core-runtime/cli/start-review-session.js +3 -3
  26. package/dist/core-runtime/llm/llm-caller.js +11 -0
  27. package/dist/core-runtime/llm/llm-tool-loop.js +2 -0
  28. package/dist/core-runtime/observability/runtime-stream-observation.js +118 -0
  29. package/dist/core-runtime/onboard/cli-host.js +174 -0
  30. package/dist/core-runtime/onboard/host-target.js +22 -0
  31. package/dist/core-runtime/onboard/json-config-host.js +122 -0
  32. package/dist/core-runtime/onboard/path-scan.js +26 -0
  33. package/dist/core-runtime/onboard/prompt.js +51 -0
  34. package/dist/core-runtime/onboard/register.js +214 -0
  35. package/dist/core-runtime/onboard/types.js +27 -0
  36. package/dist/core-runtime/reconstruct/actionable-seed-validation.js +1777 -0
  37. package/dist/core-runtime/reconstruct/artifact-types.js +10 -4
  38. package/dist/core-runtime/reconstruct/contract-registry.js +623 -0
  39. package/dist/core-runtime/reconstruct/domain-id.js +10 -0
  40. package/dist/core-runtime/reconstruct/governing-snapshot.js +716 -0
  41. package/dist/core-runtime/reconstruct/material-profile-validation.js +191 -0
  42. package/dist/core-runtime/reconstruct/materialize-preparation.js +49 -11
  43. package/dist/core-runtime/reconstruct/pipeline-execution-ledger.js +269 -79
  44. package/dist/core-runtime/reconstruct/post-seed-validation.js +1194 -51
  45. package/dist/core-runtime/reconstruct/record.js +104 -20
  46. package/dist/core-runtime/reconstruct/run.js +2107 -413
  47. package/dist/core-runtime/reconstruct/seed-claim-projections.js +268 -0
  48. package/dist/core-runtime/reconstruct/source-profiles.js +93 -4
  49. package/dist/core-runtime/reconstruct/terminal-validation.js +807 -0
  50. package/dist/core-runtime/review/review-invocation-runner.js +4 -4
  51. package/dist/mcp/server.js +110 -38
  52. package/dist/mcp/tool-schemas.js +20 -6
  53. package/package.json +8 -17
  54. package/scripts/onto-review-watch.sh +486 -0
  55. package/scripts/onto-runtime-watch.sh +122 -0
  56. package/scripts/postinstall-hint.js +22 -0
  57. package/.onto/processes/reconstruct/top-level-concept-discovery-contract.md +0 -387
  58. package/dist/core-runtime/cli/bootstrap-review-binding.js +0 -186
  59. package/dist/core-runtime/cli/codex-nested-dispatch.test.js +0 -390
  60. package/dist/core-runtime/cli/codex-nested-teamlead-executor.test.js +0 -335
  61. package/dist/core-runtime/cli/coordinator-helpers.js +0 -583
  62. package/dist/core-runtime/cli/coordinator-state-machine-deliberation.test.js +0 -167
  63. package/dist/core-runtime/cli/coordinator-state-machine.js +0 -794
  64. package/dist/core-runtime/cli/e2e-codex-multi-agent-fixes.test.js +0 -615
  65. package/dist/core-runtime/cli/e2e-start-review-session.test.js +0 -312
  66. package/dist/core-runtime/cli/health.js +0 -44
  67. package/dist/core-runtime/cli/inline-http-review-unit-executor.test.js +0 -567
  68. package/dist/core-runtime/cli/materialize-review-execution-preparation.js +0 -104
  69. package/dist/core-runtime/cli/migrate-session-roots.js +0 -118
  70. package/dist/core-runtime/cli/repo-layout-migration-replace.smoke.test.js +0 -106
  71. package/dist/core-runtime/cli/review-invoke-auto-resolution.test.js +0 -268
  72. package/dist/core-runtime/cli/review-invoke-coordinator-topology.test.js +0 -136
  73. package/dist/core-runtime/cli/review-invoke-resolver-caching.test.js +0 -201
  74. package/dist/core-runtime/cli/review-invoke-topology-dispatch.test.js +0 -192
  75. package/dist/core-runtime/cli/session-root-guard.js +0 -168
  76. package/dist/core-runtime/cli/spawn-watcher.test.js +0 -457
  77. package/dist/core-runtime/cli/strip-wrapping-code-fence.test.js +0 -79
  78. package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.js +0 -412
  79. package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.test.js +0 -351
  80. package/dist/core-runtime/cli/topology-executor-mapping.js +0 -139
  81. package/dist/core-runtime/cli/topology-executor-mapping.test.js +0 -173
  82. package/dist/core-runtime/cli/write-review-interpretation.js +0 -81
  83. package/dist/core-runtime/config/onto-config-cli.js +0 -278
  84. package/dist/core-runtime/config/onto-config-key-path.js +0 -288
  85. package/dist/core-runtime/config/onto-config-key-path.test.js +0 -195
  86. package/dist/core-runtime/config/onto-config-preview.js +0 -108
  87. package/dist/core-runtime/config/onto-config-preview.test.js +0 -132
  88. package/dist/core-runtime/discovery/config-chain.js +0 -118
  89. package/dist/core-runtime/discovery/config-chain.test.js +0 -103
  90. package/dist/core-runtime/discovery/config-profile.js +0 -199
  91. package/dist/core-runtime/discovery/config-profile.test.js +0 -233
  92. package/dist/core-runtime/discovery/host-detection.test.js +0 -186
  93. package/dist/core-runtime/discovery/installation-paths.test.js +0 -65
  94. package/dist/core-runtime/discovery/lens-registry.test.js +0 -81
  95. package/dist/core-runtime/discovery/path-normalization.test.js +0 -22
  96. package/dist/core-runtime/discovery/plugin-path.js +0 -72
  97. package/dist/core-runtime/discovery/plugin-path.test.js +0 -95
  98. package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.js +0 -344
  99. package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.test.js +0 -915
  100. package/dist/core-runtime/evolve/adapters/code-product/compile/compile.js +0 -564
  101. package/dist/core-runtime/evolve/adapters/code-product/compile/compile.test.js +0 -708
  102. package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.js +0 -165
  103. package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.test.js +0 -227
  104. package/dist/core-runtime/evolve/adapters/code-product/validators/validate.js +0 -59
  105. package/dist/core-runtime/evolve/adapters/code-product/validators/validate.test.js +0 -205
  106. package/dist/core-runtime/evolve/adapters/methodology/adapter.js +0 -16
  107. package/dist/core-runtime/evolve/adapters/methodology/adapter.test.js +0 -9
  108. package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.js +0 -298
  109. package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.test.js +0 -70
  110. package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.js +0 -46
  111. package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.test.js +0 -73
  112. package/dist/core-runtime/evolve/adapters/registry.js +0 -47
  113. package/dist/core-runtime/evolve/adapters/registry.test.js +0 -67
  114. package/dist/core-runtime/evolve/cli.js +0 -256
  115. package/dist/core-runtime/evolve/commands/align.js +0 -194
  116. package/dist/core-runtime/evolve/commands/align.test.js +0 -82
  117. package/dist/core-runtime/evolve/commands/apply.js +0 -161
  118. package/dist/core-runtime/evolve/commands/apply.test.js +0 -138
  119. package/dist/core-runtime/evolve/commands/close.js +0 -39
  120. package/dist/core-runtime/evolve/commands/close.test.js +0 -99
  121. package/dist/core-runtime/evolve/commands/defer.js +0 -40
  122. package/dist/core-runtime/evolve/commands/defer.test.js +0 -134
  123. package/dist/core-runtime/evolve/commands/draft.js +0 -323
  124. package/dist/core-runtime/evolve/commands/draft.test.js +0 -178
  125. package/dist/core-runtime/evolve/commands/e2e-evolve-full-cycle.test.js +0 -208
  126. package/dist/core-runtime/evolve/commands/error-messages.js +0 -125
  127. package/dist/core-runtime/evolve/commands/error-messages.test.js +0 -167
  128. package/dist/core-runtime/evolve/commands/propose-align.js +0 -222
  129. package/dist/core-runtime/evolve/commands/propose-align.test.js +0 -136
  130. package/dist/core-runtime/evolve/commands/reconstruct.js +0 -330
  131. package/dist/core-runtime/evolve/commands/reconstruct.test.js +0 -278
  132. package/dist/core-runtime/evolve/commands/shared.js +0 -22
  133. package/dist/core-runtime/evolve/commands/stale-check.js +0 -103
  134. package/dist/core-runtime/evolve/commands/stale-check.test.js +0 -84
  135. package/dist/core-runtime/evolve/commands/start.js +0 -887
  136. package/dist/core-runtime/evolve/commands/start.test.js +0 -396
  137. package/dist/core-runtime/evolve/config/project-config.js +0 -99
  138. package/dist/core-runtime/evolve/config/project-config.test.js +0 -170
  139. package/dist/core-runtime/evolve/renderers/align-packet.js +0 -280
  140. package/dist/core-runtime/evolve/renderers/align-packet.test.js +0 -332
  141. package/dist/core-runtime/evolve/renderers/draft-packet.js +0 -303
  142. package/dist/core-runtime/evolve/renderers/draft-packet.test.js +0 -377
  143. package/dist/core-runtime/evolve/renderers/format.js +0 -5
  144. package/dist/core-runtime/evolve/renderers/scope-md.js +0 -237
  145. package/dist/core-runtime/evolve/renderers/scope-md.test.js +0 -306
  146. package/dist/core-runtime/govern/cli.js +0 -369
  147. package/dist/core-runtime/govern/cli.test.js +0 -314
  148. package/dist/core-runtime/govern/drift-engine.js +0 -103
  149. package/dist/core-runtime/govern/drift-engine.test.js +0 -319
  150. package/dist/core-runtime/govern/promote-principle.js +0 -206
  151. package/dist/core-runtime/govern/promote-principle.test.js +0 -368
  152. package/dist/core-runtime/govern/queue.js +0 -81
  153. package/dist/core-runtime/govern/types.js +0 -16
  154. package/dist/core-runtime/install/cli.js +0 -530
  155. package/dist/core-runtime/install/detect.js +0 -128
  156. package/dist/core-runtime/install/detect.test.js +0 -155
  157. package/dist/core-runtime/install/gitignore-update.js +0 -74
  158. package/dist/core-runtime/install/gitignore-update.test.js +0 -64
  159. package/dist/core-runtime/install/install-integration.test.js +0 -373
  160. package/dist/core-runtime/install/prompts.js +0 -389
  161. package/dist/core-runtime/install/prompts.test.js +0 -293
  162. package/dist/core-runtime/install/types.js +0 -26
  163. package/dist/core-runtime/install/validation.js +0 -295
  164. package/dist/core-runtime/install/validation.test.js +0 -313
  165. package/dist/core-runtime/install/writer.js +0 -254
  166. package/dist/core-runtime/install/writer.test.js +0 -218
  167. package/dist/core-runtime/learning/extractor.js +0 -461
  168. package/dist/core-runtime/learning/feedback.js +0 -179
  169. package/dist/core-runtime/learning/health-report.js +0 -165
  170. package/dist/core-runtime/learning/health-report.test.js +0 -169
  171. package/dist/core-runtime/learning/loader.js +0 -388
  172. package/dist/core-runtime/learning/loader.test.js +0 -102
  173. package/dist/core-runtime/learning/promote/apply-state.js +0 -240
  174. package/dist/core-runtime/learning/promote/audit-obligation.js +0 -195
  175. package/dist/core-runtime/learning/promote/collector.js +0 -432
  176. package/dist/core-runtime/learning/promote/degraded-state.js +0 -125
  177. package/dist/core-runtime/learning/promote/domain-doc-proposer.js +0 -166
  178. package/dist/core-runtime/learning/promote/e2e-promote.test.js +0 -6385
  179. package/dist/core-runtime/learning/promote/health-snapshot.js +0 -150
  180. package/dist/core-runtime/learning/promote/insight-reclassifier.js +0 -544
  181. package/dist/core-runtime/learning/promote/judgment-auditor.js +0 -517
  182. package/dist/core-runtime/learning/promote/panel-reviewer.js +0 -1158
  183. package/dist/core-runtime/learning/promote/promote-executor.js +0 -1675
  184. package/dist/core-runtime/learning/promote/promoter.js +0 -307
  185. package/dist/core-runtime/learning/promote/retirement.js +0 -122
  186. package/dist/core-runtime/learning/promote/types.js +0 -23
  187. package/dist/core-runtime/learning/prompt-sections.js +0 -51
  188. package/dist/core-runtime/learning/shared/artifact-registry-init.js +0 -45
  189. package/dist/core-runtime/learning/shared/artifact-registry.js +0 -254
  190. package/dist/core-runtime/learning/shared/audit-obligation-kernel.js +0 -73
  191. package/dist/core-runtime/learning/shared/audit-state.js +0 -99
  192. package/dist/core-runtime/learning/shared/duplicate-check.js +0 -28
  193. package/dist/core-runtime/learning/shared/llm-caller.js +0 -831
  194. package/dist/core-runtime/learning/shared/llm-caller.test.js +0 -601
  195. package/dist/core-runtime/learning/shared/llm-tool-loop.js +0 -393
  196. package/dist/core-runtime/learning/shared/mode.js +0 -25
  197. package/dist/core-runtime/learning/shared/paths.js +0 -84
  198. package/dist/core-runtime/learning/shared/paths.test.js +0 -79
  199. package/dist/core-runtime/learning/shared/patterns.js +0 -37
  200. package/dist/core-runtime/learning/shared/recoverability.js +0 -355
  201. package/dist/core-runtime/learning/shared/recovery-context.js +0 -374
  202. package/dist/core-runtime/learning/shared/scope.js +0 -1
  203. package/dist/core-runtime/learning/shared/semantic-classifier.js +0 -94
  204. package/dist/core-runtime/learning/shared/specs/apply-execution-state-spec.js +0 -42
  205. package/dist/core-runtime/learning/shared/specs/audit-state-spec.js +0 -37
  206. package/dist/core-runtime/learning/shared/specs/backup-metadata-spec.js +0 -39
  207. package/dist/core-runtime/learning/shared/specs/emergency-log-spec.js +0 -41
  208. package/dist/core-runtime/learning/shared/specs/layout-version-spec.js +0 -38
  209. package/dist/core-runtime/learning/shared/specs/promote-decisions-spec.js +0 -43
  210. package/dist/core-runtime/learning/shared/specs/promote-report-spec.js +0 -113
  211. package/dist/core-runtime/learning/shared/specs/prune-log-spec.js +0 -36
  212. package/dist/core-runtime/learning/shared/specs/recovery-resolution-spec.js +0 -48
  213. package/dist/core-runtime/learning/shared/specs/restore-manifest-spec.js +0 -43
  214. package/dist/core-runtime/learning/shared/specs/spec-helpers.js +0 -64
  215. package/dist/core-runtime/learning/usage-tracker.js +0 -190
  216. package/dist/core-runtime/learning/usage-tracker.test.js +0 -176
  217. package/dist/core-runtime/onboard/detect-review-axes.js +0 -122
  218. package/dist/core-runtime/onboard/detect-review-axes.test.js +0 -127
  219. package/dist/core-runtime/onboard/write-review-block.js +0 -188
  220. package/dist/core-runtime/onboard/write-review-block.test.js +0 -240
  221. package/dist/core-runtime/readers/brownfield-builder.js +0 -150
  222. package/dist/core-runtime/readers/brownfield-builder.test.js +0 -136
  223. package/dist/core-runtime/readers/code-chunk-collector.js +0 -53
  224. package/dist/core-runtime/readers/code-chunk-collector.test.js +0 -136
  225. package/dist/core-runtime/readers/file-utils.js +0 -240
  226. package/dist/core-runtime/readers/file-utils.test.js +0 -146
  227. package/dist/core-runtime/readers/lexicon-citation-check.js +0 -93
  228. package/dist/core-runtime/readers/lexicon-citation-check.test.js +0 -77
  229. package/dist/core-runtime/readers/mcp-figma.js +0 -30
  230. package/dist/core-runtime/readers/mcp-figma.test.js +0 -82
  231. package/dist/core-runtime/readers/mcp-generic.js +0 -31
  232. package/dist/core-runtime/readers/mcp-generic.test.js +0 -76
  233. package/dist/core-runtime/readers/ontology-index.js +0 -148
  234. package/dist/core-runtime/readers/ontology-index.test.js +0 -245
  235. package/dist/core-runtime/readers/ontology-query.js +0 -168
  236. package/dist/core-runtime/readers/ontology-query.test.js +0 -311
  237. package/dist/core-runtime/readers/ontology-resolve.js +0 -48
  238. package/dist/core-runtime/readers/ontology-resolve.test.js +0 -48
  239. package/dist/core-runtime/readers/patterns/index.js +0 -7
  240. package/dist/core-runtime/readers/review-log.js +0 -213
  241. package/dist/core-runtime/readers/review-log.test.js +0 -313
  242. package/dist/core-runtime/readers/scan-local.js +0 -102
  243. package/dist/core-runtime/readers/scan-local.test.js +0 -102
  244. package/dist/core-runtime/readers/scan-tarball.js +0 -121
  245. package/dist/core-runtime/readers/scan-tarball.test.js +0 -283
  246. package/dist/core-runtime/readers/scan-vault.js +0 -34
  247. package/dist/core-runtime/readers/scan-vault.test.js +0 -81
  248. package/dist/core-runtime/readers/types.js +0 -42
  249. package/dist/core-runtime/readers/types.test.js +0 -94
  250. package/dist/core-runtime/readers/viewpoint-collectors.js +0 -229
  251. package/dist/core-runtime/reconstruct/seed-candidate-validation.js +0 -385
  252. package/dist/core-runtime/review/citation-audit.test.js +0 -165
  253. package/dist/core-runtime/review/execution-plan-resolver.js +0 -247
  254. package/dist/core-runtime/review/execution-plan-resolver.test.js +0 -243
  255. package/dist/core-runtime/review/execution-topology-resolver-axis-first.test.js +0 -246
  256. package/dist/core-runtime/review/execution-topology-resolver.js +0 -401
  257. package/dist/core-runtime/review/execution-topology-resolver.test.js +0 -315
  258. package/dist/core-runtime/review/inline-context-embedder.test.js +0 -154
  259. package/dist/core-runtime/review/legacy-mode-policy.js +0 -88
  260. package/dist/core-runtime/review/materializers-effort-persist.test.js +0 -79
  261. package/dist/core-runtime/review/ontology-path-classifier.js +0 -179
  262. package/dist/core-runtime/review/ontology-path-classifier.test.js +0 -216
  263. package/dist/core-runtime/review/packet-boundary-policy.test.js +0 -107
  264. package/dist/core-runtime/review/participating-lens-paths.test.js +0 -73
  265. package/dist/core-runtime/review/review-config-legacy-translate.js +0 -244
  266. package/dist/core-runtime/review/review-config-legacy-translate.test.js +0 -161
  267. package/dist/core-runtime/review/review-config-validator.js +0 -289
  268. package/dist/core-runtime/review/review-config-validator.test.js +0 -236
  269. package/dist/core-runtime/review/shape-pipeline-audit.test.js +0 -311
  270. package/dist/core-runtime/review/shape-to-topology-id.js +0 -117
  271. package/dist/core-runtime/review/shape-to-topology-id.test.js +0 -132
  272. package/dist/core-runtime/review/topology-shape-derivation.js +0 -155
  273. package/dist/core-runtime/review/topology-shape-derivation.test.js +0 -195
  274. package/dist/core-runtime/scope-runtime/constants.js +0 -12
  275. package/dist/core-runtime/scope-runtime/constraint-pool.js +0 -166
  276. package/dist/core-runtime/scope-runtime/constraint-pool.test.js +0 -674
  277. package/dist/core-runtime/scope-runtime/domain-validation-log.js +0 -135
  278. package/dist/core-runtime/scope-runtime/domain-validation-log.test.js +0 -156
  279. package/dist/core-runtime/scope-runtime/eval-persistence.js +0 -65
  280. package/dist/core-runtime/scope-runtime/eval-persistence.test.js +0 -84
  281. package/dist/core-runtime/scope-runtime/event-pipeline.js +0 -64
  282. package/dist/core-runtime/scope-runtime/event-pipeline.test.js +0 -450
  283. package/dist/core-runtime/scope-runtime/event-store.js +0 -39
  284. package/dist/core-runtime/scope-runtime/event-store.test.js +0 -95
  285. package/dist/core-runtime/scope-runtime/gate-guard.js +0 -348
  286. package/dist/core-runtime/scope-runtime/gate-guard.test.js +0 -1047
  287. package/dist/core-runtime/scope-runtime/hash.js +0 -4
  288. package/dist/core-runtime/scope-runtime/hash.test.js +0 -33
  289. package/dist/core-runtime/scope-runtime/id.js +0 -4
  290. package/dist/core-runtime/scope-runtime/id.test.js +0 -17
  291. package/dist/core-runtime/scope-runtime/reducer.js +0 -297
  292. package/dist/core-runtime/scope-runtime/reducer.test.js +0 -759
  293. package/dist/core-runtime/scope-runtime/scope-manager.js +0 -161
  294. package/dist/core-runtime/scope-runtime/state-machine.js +0 -309
  295. package/dist/core-runtime/scope-runtime/state-machine.test.js +0 -704
  296. package/dist/core-runtime/scope-runtime/types.js +0 -116
  297. package/dist/core-runtime/scope-runtime/types.test.js +0 -69
  298. package/dist/core-runtime/translate/render-for-user.js +0 -169
  299. package/dist/core-runtime/translate/render-for-user.test.js +0 -122
  300. package/dist/providers/capability-contract.js +0 -1
@@ -1,517 +0,0 @@
1
- /**
2
- * Phase 3 Promote — Judgment Auditor (Step 8b).
3
- *
4
- * Design authority:
5
- * - learn-phase3-design-v4.md DD-13 (P-14 sequencing)
6
- * - learn-phase3-design-v6.md DD-17 (obligation ledger lifecycle)
7
- * - learn-phase3-design-v9.md DD-17 (carry-forward + expired_unattended ingress)
8
- * - learn-phase3-design-v7.md DD-21 (AuditObligation encapsulation — this
9
- * module transitions obligations exclusively through AuditObligation.transition())
10
- * - .onto/processes/learn/promote.md Step 8 (judgment re-verification threshold)
11
- *
12
- * Responsibility:
13
- * - DD-13 P-14 pre-step: determine eligible agents for judgment audit
14
- * (count_threshold OR outstanding obligation).
15
- * - For each eligible agent, LLM-evaluate the `[judgment]`-type items in
16
- * their global learnings file against the current context.
17
- * - Emit AuditOutcome per item (retain | modify | delete | audit_to_conflict_proposal).
18
- * - Transition matching AuditObligations through their lifecycle
19
- * (pending → in_progress → fulfilled | blocked | no_eligible_agents).
20
- * - Return a compact AuditSummary consumable by PromoteReport assembly.
21
- *
22
- * Scope boundary:
23
- * - Phase A only. No file mutation; audit outcomes are proposals that flow
24
- * into PromoteReport for user approval before Phase B applies them.
25
- * - ConflictProposal emission for `audit_to_conflict_proposal` outcomes is
26
- * handled by the orchestrator (promoter.ts) — this module returns raw
27
- * outcomes and leaves proposal assembly to the caller, which holds the
28
- * origin/lineage context (DD-19).
29
- *
30
- * Failure model:
31
- * - LLM unreachable → obligation transitions in_progress → blocked.
32
- * Next promote will re-enter pending (audit-state.ts processCarryForward).
33
- * - Malformed LLM JSON → blocked (treated the same as unreachable).
34
- * - No eligible items for an obligation's affected_agents → in_progress →
35
- * no_eligible_agents (terminal).
36
- */
37
- import { callLlm, hashPrompt } from "../shared/llm-caller.js";
38
- // ---------------------------------------------------------------------------
39
- // Policy
40
- // ---------------------------------------------------------------------------
41
- export const DEFAULT_AUDIT_POLICY = {
42
- judgment_threshold: 10, // promote.md §8
43
- obligation_max_carry_forward: 3,
44
- };
45
- // ---------------------------------------------------------------------------
46
- // Eligibility determination — DD-13 pre-step
47
- // ---------------------------------------------------------------------------
48
- /**
49
- * Count `[judgment]`-type items per agent across the given item pool.
50
- *
51
- * The caller supplies global_items from CollectionResult. Judgment audit runs
52
- * only against global items because audit is a re-verification of already-
53
- * promoted judgments — project-level items are the promote panel's domain.
54
- */
55
- function countJudgmentsByAgent(items) {
56
- const counts = new Map();
57
- for (const item of items) {
58
- if (item.type !== "judgment")
59
- continue;
60
- counts.set(item.agent_id, (counts.get(item.agent_id) ?? 0) + 1);
61
- }
62
- return counts;
63
- }
64
- /**
65
- * DD-13 pre-step: resolve which agents are eligible for audit in this promote
66
- * session.
67
- *
68
- * Two trigger paths:
69
- * 1. count_threshold — an agent holds >= policy.judgment_threshold judgment
70
- * items in its global file (promote.md §8).
71
- * 2. obligation — an active obligation whose `affected_agents` list names
72
- * the agent (DD-17 carry-forward path).
73
- *
74
- * When both paths fire for the same agent the obligation path wins so the
75
- * audit explicitly fulfills the ledger entry.
76
- */
77
- export function determineAuditEligibility(globalItems, state, policy = DEFAULT_AUDIT_POLICY) {
78
- const counts = countJudgmentsByAgent(globalItems);
79
- const eligibility = [];
80
- const handledAgents = new Set();
81
- // Obligation-triggered eligibility first (higher priority)
82
- for (const ob of state.obligations) {
83
- if (ob.status !== "pending")
84
- continue;
85
- for (const agent of ob.affected_agents) {
86
- if (handledAgents.has(agent))
87
- continue;
88
- handledAgents.add(agent);
89
- eligibility.push({
90
- agent_id: agent,
91
- obligation_id: ob.obligation_id,
92
- reason: `obligation ${ob.obligation_id}: ${ob.reason}`,
93
- judgment_count: counts.get(agent) ?? 0,
94
- trigger: "obligation",
95
- });
96
- }
97
- }
98
- // Count-threshold eligibility (only for agents not already covered)
99
- for (const [agent, count] of counts) {
100
- if (handledAgents.has(agent))
101
- continue;
102
- if (count < policy.judgment_threshold)
103
- continue;
104
- handledAgents.add(agent);
105
- eligibility.push({
106
- agent_id: agent,
107
- obligation_id: null,
108
- reason: `count_threshold: ${count} >= ${policy.judgment_threshold} judgment items`,
109
- judgment_count: count,
110
- trigger: "count_threshold",
111
- });
112
- }
113
- return eligibility;
114
- }
115
- // ---------------------------------------------------------------------------
116
- // Prompt building
117
- // ---------------------------------------------------------------------------
118
- const AUDIT_SYSTEM_PROMPT = `You are re-verifying previously promoted [judgment]-type learnings for an agent. For each item, decide whether it is still contextually valid.
119
-
120
- Output ONE JSON object with an "outcomes" array. For each item output:
121
-
122
- {
123
- "item_index": <0-based integer matching the input order>,
124
- "decision": "retain" | "modify" | "delete" | "audit_to_conflict_proposal",
125
- "reason": "<one-sentence justification>",
126
- "modified_content": "<required only when decision == modify, otherwise null>"
127
- }
128
-
129
- Decision rules:
130
- - "retain" — item remains valid as written; no action needed.
131
- - "modify" — the core insight still holds but wording needs update; provide modified_content.
132
- - "delete" — the judgment is no longer valid and should be retired.
133
- - "audit_to_conflict_proposal" — the item conflicts with another global item;
134
- a formal conflict proposal will be created for operator review.
135
-
136
- Coherence rules:
137
- - Return exactly one outcome per input item, in order.
138
- - modified_content MUST be set when decision is "modify", and MUST be null otherwise.
139
-
140
- Respond ONLY with valid JSON (no markdown fences):
141
- {"outcomes": [...]}
142
- `;
143
- function buildAuditUserPrompt(agentId, items) {
144
- const itemBlock = items
145
- .map((item, i) => `${i}. tags=[${item.applicability_tags.join(" ")}] role=${item.role ?? "<no-role>"}\n content: ${item.content}`)
146
- .join("\n");
147
- return `Agent: ${agentId}
148
- Judgment items to re-verify: ${items.length}
149
- ${itemBlock}
150
-
151
- Respond with {"outcomes":[...]}.`;
152
- }
153
- function parseAuditResponse(text) {
154
- let cleaned = text.trim();
155
- if (cleaned.startsWith("```")) {
156
- cleaned = cleaned.replace(/^```(?:json)?\s*/, "").replace(/```\s*$/, "");
157
- }
158
- const parsed = JSON.parse(cleaned);
159
- if (!parsed || !Array.isArray(parsed.outcomes)) {
160
- throw new Error(`audit response missing "outcomes" array (got keys: ${Object.keys(parsed ?? {}).join(",")})`);
161
- }
162
- return { outcomes: parsed.outcomes };
163
- }
164
- const VALID_DECISIONS = [
165
- "retain",
166
- "modify",
167
- "delete",
168
- "audit_to_conflict_proposal",
169
- ];
170
- function normalizeOutcomes(raw, items, agentId) {
171
- const outcomes = [];
172
- const failures = [];
173
- const seen = new Set();
174
- for (const r of raw) {
175
- if (typeof r.item_index !== "number") {
176
- failures.push(`item_index missing/non-numeric`);
177
- continue;
178
- }
179
- const idx = r.item_index;
180
- if (idx < 0 || idx >= items.length) {
181
- failures.push(`item_index ${idx} out of range 0..${items.length - 1}`);
182
- continue;
183
- }
184
- if (seen.has(idx)) {
185
- failures.push(`item_index ${idx} duplicated`);
186
- continue;
187
- }
188
- seen.add(idx);
189
- const decision = r.decision;
190
- if (!VALID_DECISIONS.includes(decision)) {
191
- failures.push(`item ${idx}: invalid decision "${String(r.decision)}"`);
192
- continue;
193
- }
194
- const outcome = {
195
- agent_id: agentId,
196
- item: items[idx],
197
- decision,
198
- reason: typeof r.reason === "string" ? r.reason : "",
199
- };
200
- if (decision === "modify") {
201
- if (typeof r.modified_content !== "string" || !r.modified_content) {
202
- failures.push(`item ${idx}: decision is modify but modified_content missing`);
203
- continue;
204
- }
205
- outcome.modified_content = r.modified_content;
206
- }
207
- else if (r.modified_content !== undefined &&
208
- r.modified_content !== null) {
209
- failures.push(`item ${idx}: decision is ${decision} but modified_content supplied`);
210
- continue;
211
- }
212
- outcomes.push(outcome);
213
- }
214
- for (let i = 0; i < items.length; i++) {
215
- if (!seen.has(i)) {
216
- failures.push(`item ${i}: no outcome returned`);
217
- }
218
- }
219
- return { outcomes, failures };
220
- }
221
- /**
222
- * Maximum items per batched LLM call.
223
- *
224
- * Chunking keeps each prompt and response within a bounded size window and
225
- * lets per-chunk failures be isolated rather than failing the whole agent.
226
- */
227
- const AUDIT_BATCH_SIZE = 12;
228
- /**
229
- * Slice items into batches of `size` each. The constant AUDIT_BATCH_SIZE is
230
- * a positive number; the dead `size <= 0` defensive branch was removed in
231
- * the N-2 cleanup. If a future caller needs a configurable batch size and
232
- * passes 0, the for-loop's `i += 0` would infinite-loop — that's an
233
- * obviously broken contract that doesn't need silent special-casing.
234
- */
235
- function chunk(items, size) {
236
- const chunks = [];
237
- for (let i = 0; i < items.length; i += size) {
238
- chunks.push(items.slice(i, i + size));
239
- }
240
- return chunks;
241
- }
242
- async function auditAgent(config) {
243
- const judgmentItems = config.globalItems.filter((item) => item.agent_id === config.agentId && item.type === "judgment");
244
- if (judgmentItems.length === 0) {
245
- return {
246
- kind: "no_eligible_items",
247
- outcomes: [],
248
- llm_calls: 0,
249
- judgment_count_total: 0,
250
- failed_chunks_count: 0,
251
- };
252
- }
253
- // Chunk into batches so large agents (37+ items) don't blow the LLM
254
- // timeout window. Each chunk gets its own LLM call with the same
255
- // 1-retry-on-validation-error pattern. Per-chunk provider errors are
256
- // isolated so a single transient failure doesn't lose the whole agent.
257
- const batches = chunk(judgmentItems, AUDIT_BATCH_SIZE);
258
- let llmCalls = 0;
259
- const allOutcomes = [];
260
- const failureReasons = [];
261
- const tryOnce = async (batchItems, retryFeedback) => {
262
- let userPrompt = buildAuditUserPrompt(config.agentId, batchItems);
263
- if (retryFeedback && retryFeedback.length > 0) {
264
- userPrompt +=
265
- "\n\nPrevious attempt was rejected. Validator feedback:\n" +
266
- retryFeedback.map((f) => ` - ${f}`).join("\n") +
267
- "\nFix these issues and respond again.";
268
- }
269
- let llmText;
270
- try {
271
- const result = await callLlm(AUDIT_SYSTEM_PROMPT, userPrompt, {
272
- max_tokens: config.maxTokens ?? 4096,
273
- ...(config.modelId ? { model_id: config.modelId } : {}),
274
- });
275
- llmText = result.text;
276
- }
277
- catch (error) {
278
- return {
279
- kind: "provider_error",
280
- outcomes: [],
281
- failureReason: error instanceof Error ? error.message : String(error),
282
- };
283
- }
284
- let parsed;
285
- try {
286
- parsed = parseAuditResponse(llmText);
287
- }
288
- catch (error) {
289
- return {
290
- kind: "blocked",
291
- outcomes: [],
292
- failureReason: `malformed JSON: ${error instanceof Error ? error.message : String(error)}`,
293
- };
294
- }
295
- const normalized = normalizeOutcomes(parsed.outcomes, batchItems, config.agentId);
296
- if (normalized.failures.length > 0) {
297
- return {
298
- kind: "blocked",
299
- outcomes: normalized.outcomes,
300
- failureReason: normalized.failures.join("; "),
301
- };
302
- }
303
- return { kind: "success", outcomes: normalized.outcomes };
304
- };
305
- for (let i = 0; i < batches.length; i++) {
306
- const batch = batches[i];
307
- const first = await tryOnce(batch);
308
- llmCalls += 1;
309
- if (first.kind === "success") {
310
- allOutcomes.push(...first.outcomes);
311
- continue;
312
- }
313
- if (first.kind === "provider_error") {
314
- failureReasons.push(`batch ${i + 1}/${batches.length} (${batch.length} items): ` +
315
- `provider error: ${first.failureReason ?? "unknown"}`);
316
- // Provider errors skip retry and skip the batch entirely.
317
- continue;
318
- }
319
- // first.kind === "blocked" (validation error) — retry the batch
320
- const second = await tryOnce(batch, first.failureReason !== undefined ? [first.failureReason] : undefined);
321
- llmCalls += 1;
322
- if (second.kind === "success") {
323
- allOutcomes.push(...second.outcomes);
324
- continue;
325
- }
326
- failureReasons.push(`batch ${i + 1}/${batches.length} (${batch.length} items): ` +
327
- `${second.failureReason ?? first.failureReason ?? "unknown"}`);
328
- }
329
- const failedChunksCount = failureReasons.length;
330
- if (failedChunksCount === 0) {
331
- return {
332
- kind: "success",
333
- outcomes: allOutcomes,
334
- llm_calls: llmCalls,
335
- judgment_count_total: judgmentItems.length,
336
- failed_chunks_count: 0,
337
- };
338
- }
339
- if (allOutcomes.length === 0) {
340
- return {
341
- kind: "blocked",
342
- outcomes: [],
343
- llm_calls: llmCalls,
344
- failure_reason: failureReasons.join(" | "),
345
- judgment_count_total: judgmentItems.length,
346
- failed_chunks_count: failedChunksCount,
347
- };
348
- }
349
- // Some batches succeeded, some failed — partial success. The operator
350
- // sees the partial outcomes plus the failure reasons for the missing
351
- // batches in failed_agents.
352
- return {
353
- kind: "partial",
354
- outcomes: allOutcomes,
355
- llm_calls: llmCalls,
356
- failure_reason: failureReasons.join(" | "),
357
- judgment_count_total: judgmentItems.length,
358
- failed_chunks_count: failedChunksCount,
359
- };
360
- }
361
- /**
362
- * DD-13 + DD-17 entry point.
363
- *
364
- * Lifecycle contract:
365
- * 1. Determine eligibility from global_items and state.obligations.
366
- * 2. Mark each eligible obligation in_progress (via transition()).
367
- * 3. For each eligible agent, call the LLM and collect outcomes.
368
- * 4. Transition the obligation according to the result:
369
- * - success → fulfilled
370
- * - blocked (transient) → blocked
371
- * - no_eligible_items → no_eligible_agents
372
- * 5. Emit ObligationProcessed entries so PromoteReport preserves the
373
- * canonical pre/post transition record (DD-17 CONCISENESS-02).
374
- *
375
- * Mutation note: `state.obligations[*]` are AuditObligation class instances.
376
- * This function MUTATES their status via the class API — callers are
377
- * expected to saveAuditState() after Phase A completes so the ledger reflects
378
- * this pass's transitions.
379
- */
380
- export async function runJudgmentAudit(config) {
381
- const policy = config.policy ?? DEFAULT_AUDIT_POLICY;
382
- const eligibility = determineAuditEligibility(config.globalItems, config.state, policy);
383
- // Index obligations by id for quick lookup.
384
- const obligationById = new Map(config.state.obligations.map((o) => [o.obligation_id, o]));
385
- const obligationsSeen = new Set();
386
- const obligationsProcessed = [];
387
- // Transition pending → in_progress for each obligation being picked up.
388
- // We capture the starting status for the ObligationProcessed record.
389
- const startingStatus = new Map();
390
- for (const e of eligibility) {
391
- if (!e.obligation_id)
392
- continue;
393
- if (obligationsSeen.has(e.obligation_id))
394
- continue;
395
- obligationsSeen.add(e.obligation_id);
396
- const ob = obligationById.get(e.obligation_id);
397
- if (!ob)
398
- continue;
399
- startingStatus.set(ob.obligation_id, ob.status);
400
- if (ob.status === "pending") {
401
- ob.transition("in_progress", `P-14 picked up in session ${config.sessionId}`, { session_id: config.sessionId });
402
- }
403
- }
404
- const allOutcomes = [];
405
- const auditedAgents = [];
406
- const failedAgents = [];
407
- let llmCalls = 0;
408
- // Run audits per eligible agent.
409
- for (const e of eligibility) {
410
- const agentConfig = {
411
- agentId: e.agent_id,
412
- globalItems: config.globalItems,
413
- };
414
- if (config.maxTokens !== undefined) {
415
- agentConfig.maxTokens = config.maxTokens;
416
- }
417
- if (config.modelId !== undefined) {
418
- agentConfig.modelId = config.modelId;
419
- }
420
- const result = await auditAgent(agentConfig);
421
- llmCalls += result.llm_calls;
422
- if (result.kind === "success") {
423
- auditedAgents.push(e.agent_id);
424
- allOutcomes.push(...result.outcomes);
425
- if (e.obligation_id) {
426
- const ob = obligationById.get(e.obligation_id);
427
- if (ob && ob.status === "in_progress") {
428
- ob.transition("fulfilled", `P-14 completed for ${e.agent_id}`, {
429
- session_id: config.sessionId,
430
- });
431
- }
432
- }
433
- continue;
434
- }
435
- if (result.kind === "partial") {
436
- // Partial success: some chunks succeeded, some failed. The agent is
437
- // counted as audited (its outcomes are real) but also recorded in
438
- // failed_agents so the operator sees the missing chunks. Obligation
439
- // transitions to blocked because the audit isn't complete.
440
- auditedAgents.push(e.agent_id);
441
- allOutcomes.push(...result.outcomes);
442
- failedAgents.push({
443
- agent_id: e.agent_id,
444
- reason: `partial: ${result.failure_reason ?? "unknown"}`,
445
- judgment_count_total: result.judgment_count_total,
446
- failed_chunks_count: result.failed_chunks_count,
447
- });
448
- if (e.obligation_id) {
449
- const ob = obligationById.get(e.obligation_id);
450
- if (ob && ob.status === "in_progress") {
451
- ob.transition("blocked", `P-14 partial failure: ${result.failure_reason ?? "unknown"}`, { session_id: config.sessionId });
452
- }
453
- }
454
- continue;
455
- }
456
- if (result.kind === "no_eligible_items") {
457
- if (e.obligation_id) {
458
- const ob = obligationById.get(e.obligation_id);
459
- if (ob && ob.status === "in_progress") {
460
- ob.transition("no_eligible_agents", `no judgment items found for ${e.agent_id}`, { session_id: config.sessionId });
461
- }
462
- }
463
- continue;
464
- }
465
- // result.kind === "blocked" — fully failed, surface as failed_agent
466
- failedAgents.push({
467
- agent_id: e.agent_id,
468
- reason: result.failure_reason ?? "unknown failure",
469
- judgment_count_total: result.judgment_count_total,
470
- failed_chunks_count: result.failed_chunks_count,
471
- });
472
- if (e.obligation_id) {
473
- const ob = obligationById.get(e.obligation_id);
474
- if (ob && ob.status === "in_progress") {
475
- ob.transition("blocked", `P-14 transient failure: ${result.failure_reason ?? "unknown"}`, { session_id: config.sessionId });
476
- }
477
- }
478
- }
479
- // Build ObligationProcessed records from captured start/end status pairs.
480
- for (const [obligationId, from] of startingStatus) {
481
- const ob = obligationById.get(obligationId);
482
- if (!ob)
483
- continue;
484
- obligationsProcessed.push({
485
- obligation_id: obligationId,
486
- transition: { from, to: ob.status },
487
- });
488
- }
489
- const outcomesTally = {
490
- retain: 0,
491
- modify: 0,
492
- delete: 0,
493
- audit_to_conflict_proposal: 0,
494
- };
495
- for (const o of allOutcomes) {
496
- outcomesTally[o.decision] += 1;
497
- }
498
- const summary = {
499
- policy,
500
- obligations_processed: obligationsProcessed,
501
- eligibility,
502
- execution: {
503
- audited_agents: auditedAgents,
504
- audited_items_count: allOutcomes.length,
505
- llm_calls: llmCalls,
506
- },
507
- outcomes: outcomesTally,
508
- failed_agents: failedAgents,
509
- };
510
- return { summary, outcomes: allOutcomes };
511
- }
512
- // ---------------------------------------------------------------------------
513
- // Prompt hash helper — exported for audit trail tests
514
- // ---------------------------------------------------------------------------
515
- export function hashAuditPrompt(agentId, items) {
516
- return hashPrompt(AUDIT_SYSTEM_PROMPT + "\n" + buildAuditUserPrompt(agentId, items));
517
- }