onto-mcp 0.3.0

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 (447) hide show
  1. package/.onto/authority/core-lens-registry.yaml +134 -0
  2. package/.onto/authority/core-lexicon.yaml +1562 -0
  3. package/.onto/authority/diagnostic-codes.yaml +94 -0
  4. package/.onto/domains/accounting/competency_qs.md +384 -0
  5. package/.onto/domains/accounting/concepts.md +186 -0
  6. package/.onto/domains/accounting/conciseness_rules.md +160 -0
  7. package/.onto/domains/accounting/dependency_rules.md +239 -0
  8. package/.onto/domains/accounting/domain_scope.md +213 -0
  9. package/.onto/domains/accounting/extension_cases.md +416 -0
  10. package/.onto/domains/accounting/logic_rules.md +226 -0
  11. package/.onto/domains/accounting/structure_spec.md +298 -0
  12. package/.onto/domains/accounting-kr/competency_qs.md +562 -0
  13. package/.onto/domains/accounting-kr/concepts.md +187 -0
  14. package/.onto/domains/accounting-kr/conciseness_rules.md +125 -0
  15. package/.onto/domains/accounting-kr/dependency_rules.md +93 -0
  16. package/.onto/domains/accounting-kr/domain_scope.md +140 -0
  17. package/.onto/domains/accounting-kr/extension_cases.md +343 -0
  18. package/.onto/domains/accounting-kr/logic_rules.md +160 -0
  19. package/.onto/domains/accounting-kr/structure_spec.md +85 -0
  20. package/.onto/domains/business/competency_qs.md +263 -0
  21. package/.onto/domains/business/concepts.md +200 -0
  22. package/.onto/domains/business/conciseness_rules.md +135 -0
  23. package/.onto/domains/business/dependency_rules.md +113 -0
  24. package/.onto/domains/business/domain_scope.md +240 -0
  25. package/.onto/domains/business/extension_cases.md +249 -0
  26. package/.onto/domains/business/logic_rules.md +134 -0
  27. package/.onto/domains/business/structure_spec.md +114 -0
  28. package/.onto/domains/finance/competency_qs.md +362 -0
  29. package/.onto/domains/finance/concepts.md +194 -0
  30. package/.onto/domains/finance/conciseness_rules.md +155 -0
  31. package/.onto/domains/finance/dependency_rules.md +171 -0
  32. package/.onto/domains/finance/domain_scope.md +215 -0
  33. package/.onto/domains/finance/extension_cases.md +350 -0
  34. package/.onto/domains/finance/logic_rules.md +191 -0
  35. package/.onto/domains/finance/structure_spec.md +182 -0
  36. package/.onto/domains/llm-native-development/competency_qs.md +430 -0
  37. package/.onto/domains/llm-native-development/concepts.md +242 -0
  38. package/.onto/domains/llm-native-development/conciseness_rules.md +163 -0
  39. package/.onto/domains/llm-native-development/dependency_rules.md +216 -0
  40. package/.onto/domains/llm-native-development/domain_scope.md +197 -0
  41. package/.onto/domains/llm-native-development/extension_cases.md +474 -0
  42. package/.onto/domains/llm-native-development/logic_rules.md +123 -0
  43. package/.onto/domains/llm-native-development/prompt_interface.md +49 -0
  44. package/.onto/domains/llm-native-development/structure_spec.md +245 -0
  45. package/.onto/domains/market-intelligence/competency_qs.md +274 -0
  46. package/.onto/domains/market-intelligence/concepts.md +233 -0
  47. package/.onto/domains/market-intelligence/conciseness_rules.md +165 -0
  48. package/.onto/domains/market-intelligence/dependency_rules.md +197 -0
  49. package/.onto/domains/market-intelligence/domain_scope.md +231 -0
  50. package/.onto/domains/market-intelligence/extension_cases.md +425 -0
  51. package/.onto/domains/market-intelligence/logic_rules.md +247 -0
  52. package/.onto/domains/market-intelligence/structure_spec.md +209 -0
  53. package/.onto/domains/ontology/competency_qs.md +394 -0
  54. package/.onto/domains/ontology/concepts.md +172 -0
  55. package/.onto/domains/ontology/conciseness_rules.md +134 -0
  56. package/.onto/domains/ontology/dependency_rules.md +125 -0
  57. package/.onto/domains/ontology/domain_scope.md +114 -0
  58. package/.onto/domains/ontology/extension_cases.md +501 -0
  59. package/.onto/domains/ontology/logic_rules.md +114 -0
  60. package/.onto/domains/ontology/problem_framing_profile.md +67 -0
  61. package/.onto/domains/ontology/structure_spec.md +115 -0
  62. package/.onto/domains/palantir-foundry/RESEARCH_NOTES.md +911 -0
  63. package/.onto/domains/palantir-foundry/competency_qs.md +191 -0
  64. package/.onto/domains/palantir-foundry/competitive_comparison.md +329 -0
  65. package/.onto/domains/palantir-foundry/concepts.md +197 -0
  66. package/.onto/domains/palantir-foundry/conciseness_rules.md +245 -0
  67. package/.onto/domains/palantir-foundry/dependency_rules.md +135 -0
  68. package/.onto/domains/palantir-foundry/domain_scope.md +395 -0
  69. package/.onto/domains/palantir-foundry/extension_cases.md +210 -0
  70. package/.onto/domains/palantir-foundry/logic_rules.md +172 -0
  71. package/.onto/domains/palantir-foundry/structure_spec.md +291 -0
  72. package/.onto/domains/software-engineering/competency_qs.md +538 -0
  73. package/.onto/domains/software-engineering/concepts.md +238 -0
  74. package/.onto/domains/software-engineering/conciseness_rules.md +167 -0
  75. package/.onto/domains/software-engineering/dependency_rules.md +216 -0
  76. package/.onto/domains/software-engineering/domain_scope.md +183 -0
  77. package/.onto/domains/software-engineering/extension_cases.md +551 -0
  78. package/.onto/domains/software-engineering/logic_rules.md +240 -0
  79. package/.onto/domains/software-engineering/problem_framing_profile.md +68 -0
  80. package/.onto/domains/software-engineering/structure_spec.md +185 -0
  81. package/.onto/domains/ui-design/competency_qs.md +567 -0
  82. package/.onto/domains/ui-design/concepts.md +194 -0
  83. package/.onto/domains/ui-design/conciseness_rules.md +190 -0
  84. package/.onto/domains/ui-design/dependency_rules.md +323 -0
  85. package/.onto/domains/ui-design/domain_scope.md +340 -0
  86. package/.onto/domains/ui-design/extension_cases.md +563 -0
  87. package/.onto/domains/ui-design/logic_rules.md +349 -0
  88. package/.onto/domains/ui-design/structure_spec.md +252 -0
  89. package/.onto/domains/visual-design/competency_qs.md +472 -0
  90. package/.onto/domains/visual-design/concepts.md +147 -0
  91. package/.onto/domains/visual-design/conciseness_rules.md +186 -0
  92. package/.onto/domains/visual-design/dependency_rules.md +282 -0
  93. package/.onto/domains/visual-design/domain_scope.md +290 -0
  94. package/.onto/domains/visual-design/extension_cases.md +480 -0
  95. package/.onto/domains/visual-design/logic_rules.md +232 -0
  96. package/.onto/domains/visual-design/structure_spec.md +213 -0
  97. package/.onto/principles/llm-native-development-guideline.md +401 -0
  98. package/.onto/principles/llm-runtime-interface-principles.md +665 -0
  99. package/.onto/principles/non-specialist-communication-guideline.md +74 -0
  100. package/.onto/principles/ontology-as-code-guideline.md +243 -0
  101. package/.onto/principles/ontology-as-code-naming-charter.md +130 -0
  102. package/.onto/principles/product-locality-principle.md +129 -0
  103. package/.onto/principles/productization-charter.md +569 -0
  104. package/.onto/processes/evolve/material-kind-adapter-contract.md +113 -0
  105. package/.onto/processes/reconstruct/reconstruct-boundary-contract.md +366 -0
  106. package/.onto/processes/reconstruct/source-profile-contract.md +107 -0
  107. package/.onto/processes/reconstruct/source-profiles/code.md +72 -0
  108. package/.onto/processes/reconstruct/source-profiles/database.md +74 -0
  109. package/.onto/processes/reconstruct/source-profiles/document.md +71 -0
  110. package/.onto/processes/reconstruct/source-profiles/spreadsheet.md +79 -0
  111. package/.onto/processes/review/binding-contract.md +270 -0
  112. package/.onto/processes/review/execution-preparation-artifacts.md +281 -0
  113. package/.onto/processes/review/interpretation-contract.md +245 -0
  114. package/.onto/processes/review/issue-stance-deliberation-contract.md +761 -0
  115. package/.onto/processes/review/lens-prompt-contract.md +402 -0
  116. package/.onto/processes/review/lens-registry.md +127 -0
  117. package/.onto/processes/review/pre-dispatch-contracts.md +428 -0
  118. package/.onto/processes/review/productized-live-path.md +398 -0
  119. package/.onto/processes/review/prompt-execution-runner-contract.md +187 -0
  120. package/.onto/processes/review/record-contract.md +427 -0
  121. package/.onto/processes/review/record-field-mapping.md +337 -0
  122. package/.onto/processes/review/review-context-manifest-contract.md +356 -0
  123. package/.onto/processes/review/review-execution-ux-contract.md +809 -0
  124. package/.onto/processes/review/review-target-profile-contract.md +259 -0
  125. package/.onto/processes/review/shared-phenomenon-contract.md +129 -0
  126. package/.onto/processes/review/synthesize-prompt-contract.md +343 -0
  127. package/.onto/processes/shared/target-material-kind-contract.md +198 -0
  128. package/.onto/roles/axiology.md +81 -0
  129. package/.onto/roles/conciseness.md +36 -0
  130. package/.onto/roles/coverage.md +34 -0
  131. package/.onto/roles/dependency.md +37 -0
  132. package/.onto/roles/evolution.md +35 -0
  133. package/.onto/roles/logic.md +104 -0
  134. package/.onto/roles/pragmatics.md +32 -0
  135. package/.onto/roles/semantics.md +36 -0
  136. package/.onto/roles/structure.md +33 -0
  137. package/.onto/roles/synthesize.md +92 -0
  138. package/AGENTS.md +240 -0
  139. package/CLAUDE.md +39 -0
  140. package/README.md +287 -0
  141. package/bin/onto +92 -0
  142. package/dist/cli.js +101 -0
  143. package/dist/core-api/reconstruct-api.js +222 -0
  144. package/dist/core-api/review-api.js +1271 -0
  145. package/dist/core-runtime/cli/assemble-review-record.js +431 -0
  146. package/dist/core-runtime/cli/bootstrap-review-binding.js +186 -0
  147. package/dist/core-runtime/cli/codex-nested-dispatch.js +226 -0
  148. package/dist/core-runtime/cli/codex-nested-dispatch.test.js +390 -0
  149. package/dist/core-runtime/cli/codex-nested-teamlead-executor.js +464 -0
  150. package/dist/core-runtime/cli/codex-nested-teamlead-executor.test.js +335 -0
  151. package/dist/core-runtime/cli/codex-review-unit-executor.js +228 -0
  152. package/dist/core-runtime/cli/complete-review-session.js +64 -0
  153. package/dist/core-runtime/cli/complexity-assessment.js +153 -0
  154. package/dist/core-runtime/cli/coordinator-helpers.js +583 -0
  155. package/dist/core-runtime/cli/coordinator-state-machine-deliberation.test.js +167 -0
  156. package/dist/core-runtime/cli/coordinator-state-machine.js +794 -0
  157. package/dist/core-runtime/cli/e2e-codex-multi-agent-fixes.test.js +615 -0
  158. package/dist/core-runtime/cli/e2e-start-review-session.test.js +312 -0
  159. package/dist/core-runtime/cli/health.js +44 -0
  160. package/dist/core-runtime/cli/inline-http-review-unit-executor.js +656 -0
  161. package/dist/core-runtime/cli/inline-http-review-unit-executor.test.js +567 -0
  162. package/dist/core-runtime/cli/materialize-review-execution-preparation.js +104 -0
  163. package/dist/core-runtime/cli/materialize-review-prompt-packets.js +952 -0
  164. package/dist/core-runtime/cli/migrate-session-roots.js +118 -0
  165. package/dist/core-runtime/cli/mock-review-unit-executor.js +285 -0
  166. package/dist/core-runtime/cli/onto-tools.js +369 -0
  167. package/dist/core-runtime/cli/prepare-review-session.js +272 -0
  168. package/dist/core-runtime/cli/render-review-final-output.js +350 -0
  169. package/dist/core-runtime/cli/repo-layout-migration-replace.smoke.test.js +106 -0
  170. package/dist/core-runtime/cli/review-invoke-auto-resolution.test.js +268 -0
  171. package/dist/core-runtime/cli/review-invoke-coordinator-topology.test.js +136 -0
  172. package/dist/core-runtime/cli/review-invoke-resolver-caching.test.js +201 -0
  173. package/dist/core-runtime/cli/review-invoke-topology-dispatch.test.js +192 -0
  174. package/dist/core-runtime/cli/review-invoke.js +2030 -0
  175. package/dist/core-runtime/cli/run-review-prompt-execution.js +2152 -0
  176. package/dist/core-runtime/cli/session-root-guard.js +168 -0
  177. package/dist/core-runtime/cli/spawn-watcher.js +173 -0
  178. package/dist/core-runtime/cli/spawn-watcher.test.js +457 -0
  179. package/dist/core-runtime/cli/start-review-session.js +68 -0
  180. package/dist/core-runtime/cli/strip-wrapping-code-fence.js +56 -0
  181. package/dist/core-runtime/cli/strip-wrapping-code-fence.test.js +79 -0
  182. package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.js +412 -0
  183. package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.test.js +351 -0
  184. package/dist/core-runtime/cli/topology-executor-mapping.js +139 -0
  185. package/dist/core-runtime/cli/topology-executor-mapping.test.js +173 -0
  186. package/dist/core-runtime/cli/write-review-interpretation.js +81 -0
  187. package/dist/core-runtime/config/onto-config-cli.js +278 -0
  188. package/dist/core-runtime/config/onto-config-key-path.js +288 -0
  189. package/dist/core-runtime/config/onto-config-key-path.test.js +195 -0
  190. package/dist/core-runtime/config/onto-config-preview.js +108 -0
  191. package/dist/core-runtime/config/onto-config-preview.test.js +132 -0
  192. package/dist/core-runtime/discovery/config-chain.js +118 -0
  193. package/dist/core-runtime/discovery/config-chain.test.js +103 -0
  194. package/dist/core-runtime/discovery/config-profile.js +199 -0
  195. package/dist/core-runtime/discovery/config-profile.test.js +233 -0
  196. package/dist/core-runtime/discovery/host-detection.js +33 -0
  197. package/dist/core-runtime/discovery/host-detection.test.js +186 -0
  198. package/dist/core-runtime/discovery/installation-paths.js +21 -0
  199. package/dist/core-runtime/discovery/installation-paths.test.js +65 -0
  200. package/dist/core-runtime/discovery/lens-registry.js +60 -0
  201. package/dist/core-runtime/discovery/lens-registry.test.js +81 -0
  202. package/dist/core-runtime/discovery/onto-home.js +71 -0
  203. package/dist/core-runtime/discovery/path-normalization.js +28 -0
  204. package/dist/core-runtime/discovery/path-normalization.test.js +22 -0
  205. package/dist/core-runtime/discovery/plugin-path.js +72 -0
  206. package/dist/core-runtime/discovery/plugin-path.test.js +95 -0
  207. package/dist/core-runtime/discovery/project-root.js +47 -0
  208. package/dist/core-runtime/discovery/settings-chain.js +353 -0
  209. package/dist/core-runtime/discovery/walk-up.js +17 -0
  210. package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.js +344 -0
  211. package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.test.js +915 -0
  212. package/dist/core-runtime/evolve/adapters/code-product/compile/compile.js +564 -0
  213. package/dist/core-runtime/evolve/adapters/code-product/compile/compile.test.js +708 -0
  214. package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.js +165 -0
  215. package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.test.js +227 -0
  216. package/dist/core-runtime/evolve/adapters/code-product/validators/validate.js +59 -0
  217. package/dist/core-runtime/evolve/adapters/code-product/validators/validate.test.js +205 -0
  218. package/dist/core-runtime/evolve/adapters/methodology/adapter.js +16 -0
  219. package/dist/core-runtime/evolve/adapters/methodology/adapter.test.js +9 -0
  220. package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.js +298 -0
  221. package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.test.js +70 -0
  222. package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.js +46 -0
  223. package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.test.js +73 -0
  224. package/dist/core-runtime/evolve/adapters/registry.js +47 -0
  225. package/dist/core-runtime/evolve/adapters/registry.test.js +67 -0
  226. package/dist/core-runtime/evolve/cli.js +256 -0
  227. package/dist/core-runtime/evolve/commands/align.js +194 -0
  228. package/dist/core-runtime/evolve/commands/align.test.js +82 -0
  229. package/dist/core-runtime/evolve/commands/apply.js +161 -0
  230. package/dist/core-runtime/evolve/commands/apply.test.js +138 -0
  231. package/dist/core-runtime/evolve/commands/close.js +39 -0
  232. package/dist/core-runtime/evolve/commands/close.test.js +99 -0
  233. package/dist/core-runtime/evolve/commands/defer.js +40 -0
  234. package/dist/core-runtime/evolve/commands/defer.test.js +134 -0
  235. package/dist/core-runtime/evolve/commands/draft.js +323 -0
  236. package/dist/core-runtime/evolve/commands/draft.test.js +178 -0
  237. package/dist/core-runtime/evolve/commands/e2e-evolve-full-cycle.test.js +208 -0
  238. package/dist/core-runtime/evolve/commands/error-messages.js +125 -0
  239. package/dist/core-runtime/evolve/commands/error-messages.test.js +167 -0
  240. package/dist/core-runtime/evolve/commands/propose-align.js +222 -0
  241. package/dist/core-runtime/evolve/commands/propose-align.test.js +136 -0
  242. package/dist/core-runtime/evolve/commands/reconstruct.js +330 -0
  243. package/dist/core-runtime/evolve/commands/reconstruct.test.js +278 -0
  244. package/dist/core-runtime/evolve/commands/shared.js +22 -0
  245. package/dist/core-runtime/evolve/commands/stale-check.js +103 -0
  246. package/dist/core-runtime/evolve/commands/stale-check.test.js +84 -0
  247. package/dist/core-runtime/evolve/commands/start.js +887 -0
  248. package/dist/core-runtime/evolve/commands/start.test.js +396 -0
  249. package/dist/core-runtime/evolve/config/project-config.js +99 -0
  250. package/dist/core-runtime/evolve/config/project-config.test.js +170 -0
  251. package/dist/core-runtime/evolve/renderers/align-packet.js +280 -0
  252. package/dist/core-runtime/evolve/renderers/align-packet.test.js +332 -0
  253. package/dist/core-runtime/evolve/renderers/draft-packet.js +303 -0
  254. package/dist/core-runtime/evolve/renderers/draft-packet.test.js +377 -0
  255. package/dist/core-runtime/evolve/renderers/format.js +5 -0
  256. package/dist/core-runtime/evolve/renderers/scope-md.js +237 -0
  257. package/dist/core-runtime/evolve/renderers/scope-md.test.js +306 -0
  258. package/dist/core-runtime/govern/cli.js +369 -0
  259. package/dist/core-runtime/govern/cli.test.js +314 -0
  260. package/dist/core-runtime/govern/drift-engine.js +103 -0
  261. package/dist/core-runtime/govern/drift-engine.test.js +319 -0
  262. package/dist/core-runtime/govern/promote-principle.js +206 -0
  263. package/dist/core-runtime/govern/promote-principle.test.js +368 -0
  264. package/dist/core-runtime/govern/queue.js +81 -0
  265. package/dist/core-runtime/govern/types.js +16 -0
  266. package/dist/core-runtime/install/cli.js +530 -0
  267. package/dist/core-runtime/install/detect.js +128 -0
  268. package/dist/core-runtime/install/detect.test.js +155 -0
  269. package/dist/core-runtime/install/gitignore-update.js +74 -0
  270. package/dist/core-runtime/install/gitignore-update.test.js +64 -0
  271. package/dist/core-runtime/install/install-integration.test.js +373 -0
  272. package/dist/core-runtime/install/prompts.js +389 -0
  273. package/dist/core-runtime/install/prompts.test.js +293 -0
  274. package/dist/core-runtime/install/types.js +26 -0
  275. package/dist/core-runtime/install/validation.js +295 -0
  276. package/dist/core-runtime/install/validation.test.js +313 -0
  277. package/dist/core-runtime/install/writer.js +254 -0
  278. package/dist/core-runtime/install/writer.test.js +218 -0
  279. package/dist/core-runtime/learning/extractor.js +461 -0
  280. package/dist/core-runtime/learning/feedback.js +179 -0
  281. package/dist/core-runtime/learning/health-report.js +165 -0
  282. package/dist/core-runtime/learning/health-report.test.js +169 -0
  283. package/dist/core-runtime/learning/loader.js +388 -0
  284. package/dist/core-runtime/learning/loader.test.js +102 -0
  285. package/dist/core-runtime/learning/promote/apply-state.js +240 -0
  286. package/dist/core-runtime/learning/promote/audit-obligation.js +195 -0
  287. package/dist/core-runtime/learning/promote/collector.js +432 -0
  288. package/dist/core-runtime/learning/promote/degraded-state.js +125 -0
  289. package/dist/core-runtime/learning/promote/domain-doc-proposer.js +166 -0
  290. package/dist/core-runtime/learning/promote/e2e-promote.test.js +6385 -0
  291. package/dist/core-runtime/learning/promote/health-snapshot.js +150 -0
  292. package/dist/core-runtime/learning/promote/insight-reclassifier.js +544 -0
  293. package/dist/core-runtime/learning/promote/judgment-auditor.js +517 -0
  294. package/dist/core-runtime/learning/promote/panel-reviewer.js +1158 -0
  295. package/dist/core-runtime/learning/promote/promote-executor.js +1675 -0
  296. package/dist/core-runtime/learning/promote/promoter.js +307 -0
  297. package/dist/core-runtime/learning/promote/retirement.js +122 -0
  298. package/dist/core-runtime/learning/promote/types.js +23 -0
  299. package/dist/core-runtime/learning/prompt-sections.js +51 -0
  300. package/dist/core-runtime/learning/shared/artifact-registry-init.js +45 -0
  301. package/dist/core-runtime/learning/shared/artifact-registry.js +254 -0
  302. package/dist/core-runtime/learning/shared/audit-obligation-kernel.js +73 -0
  303. package/dist/core-runtime/learning/shared/audit-state.js +99 -0
  304. package/dist/core-runtime/learning/shared/duplicate-check.js +28 -0
  305. package/dist/core-runtime/learning/shared/llm-caller.js +831 -0
  306. package/dist/core-runtime/learning/shared/llm-caller.test.js +601 -0
  307. package/dist/core-runtime/learning/shared/llm-tool-loop.js +393 -0
  308. package/dist/core-runtime/learning/shared/mode.js +25 -0
  309. package/dist/core-runtime/learning/shared/paths.js +84 -0
  310. package/dist/core-runtime/learning/shared/paths.test.js +79 -0
  311. package/dist/core-runtime/learning/shared/patterns.js +37 -0
  312. package/dist/core-runtime/learning/shared/recoverability.js +355 -0
  313. package/dist/core-runtime/learning/shared/recovery-context.js +374 -0
  314. package/dist/core-runtime/learning/shared/scope.js +1 -0
  315. package/dist/core-runtime/learning/shared/semantic-classifier.js +94 -0
  316. package/dist/core-runtime/learning/shared/specs/apply-execution-state-spec.js +42 -0
  317. package/dist/core-runtime/learning/shared/specs/audit-state-spec.js +37 -0
  318. package/dist/core-runtime/learning/shared/specs/backup-metadata-spec.js +39 -0
  319. package/dist/core-runtime/learning/shared/specs/emergency-log-spec.js +41 -0
  320. package/dist/core-runtime/learning/shared/specs/layout-version-spec.js +38 -0
  321. package/dist/core-runtime/learning/shared/specs/promote-decisions-spec.js +43 -0
  322. package/dist/core-runtime/learning/shared/specs/promote-report-spec.js +113 -0
  323. package/dist/core-runtime/learning/shared/specs/prune-log-spec.js +36 -0
  324. package/dist/core-runtime/learning/shared/specs/recovery-resolution-spec.js +48 -0
  325. package/dist/core-runtime/learning/shared/specs/restore-manifest-spec.js +43 -0
  326. package/dist/core-runtime/learning/shared/specs/spec-helpers.js +64 -0
  327. package/dist/core-runtime/learning/usage-tracker.js +190 -0
  328. package/dist/core-runtime/learning/usage-tracker.test.js +176 -0
  329. package/dist/core-runtime/llm/llm-caller.js +649 -0
  330. package/dist/core-runtime/llm/llm-tool-loop.js +401 -0
  331. package/dist/core-runtime/llm/model-switcher.js +62 -0
  332. package/dist/core-runtime/logger.js +22 -0
  333. package/dist/core-runtime/onboard/detect-review-axes.js +122 -0
  334. package/dist/core-runtime/onboard/detect-review-axes.test.js +127 -0
  335. package/dist/core-runtime/onboard/write-review-block.js +188 -0
  336. package/dist/core-runtime/onboard/write-review-block.test.js +240 -0
  337. package/dist/core-runtime/readers/brownfield-builder.js +150 -0
  338. package/dist/core-runtime/readers/brownfield-builder.test.js +136 -0
  339. package/dist/core-runtime/readers/code-chunk-collector.js +53 -0
  340. package/dist/core-runtime/readers/code-chunk-collector.test.js +136 -0
  341. package/dist/core-runtime/readers/file-utils.js +240 -0
  342. package/dist/core-runtime/readers/file-utils.test.js +146 -0
  343. package/dist/core-runtime/readers/lexicon-citation-check.js +93 -0
  344. package/dist/core-runtime/readers/lexicon-citation-check.test.js +77 -0
  345. package/dist/core-runtime/readers/mcp-figma.js +30 -0
  346. package/dist/core-runtime/readers/mcp-figma.test.js +82 -0
  347. package/dist/core-runtime/readers/mcp-generic.js +31 -0
  348. package/dist/core-runtime/readers/mcp-generic.test.js +76 -0
  349. package/dist/core-runtime/readers/ontology-index.js +148 -0
  350. package/dist/core-runtime/readers/ontology-index.test.js +245 -0
  351. package/dist/core-runtime/readers/ontology-query.js +168 -0
  352. package/dist/core-runtime/readers/ontology-query.test.js +311 -0
  353. package/dist/core-runtime/readers/ontology-resolve.js +48 -0
  354. package/dist/core-runtime/readers/ontology-resolve.test.js +48 -0
  355. package/dist/core-runtime/readers/patterns/index.js +7 -0
  356. package/dist/core-runtime/readers/review-log.js +213 -0
  357. package/dist/core-runtime/readers/review-log.test.js +313 -0
  358. package/dist/core-runtime/readers/scan-local.js +102 -0
  359. package/dist/core-runtime/readers/scan-local.test.js +102 -0
  360. package/dist/core-runtime/readers/scan-tarball.js +121 -0
  361. package/dist/core-runtime/readers/scan-tarball.test.js +283 -0
  362. package/dist/core-runtime/readers/scan-vault.js +34 -0
  363. package/dist/core-runtime/readers/scan-vault.test.js +81 -0
  364. package/dist/core-runtime/readers/types.js +42 -0
  365. package/dist/core-runtime/readers/types.test.js +94 -0
  366. package/dist/core-runtime/readers/viewpoint-collectors.js +229 -0
  367. package/dist/core-runtime/reconstruct/artifact-types.js +1 -0
  368. package/dist/core-runtime/reconstruct/directive-validation.js +123 -0
  369. package/dist/core-runtime/reconstruct/materialize-preparation.js +251 -0
  370. package/dist/core-runtime/reconstruct/record.js +198 -0
  371. package/dist/core-runtime/reconstruct/run.js +578 -0
  372. package/dist/core-runtime/reconstruct/seed-candidate-validation.js +356 -0
  373. package/dist/core-runtime/reconstruct/source-observations.js +62 -0
  374. package/dist/core-runtime/reconstruct/source-profiles.js +73 -0
  375. package/dist/core-runtime/release-channel/release-channel.js +90 -0
  376. package/dist/core-runtime/review/artifact-types.js +13 -0
  377. package/dist/core-runtime/review/citation-audit.js +204 -0
  378. package/dist/core-runtime/review/citation-audit.test.js +165 -0
  379. package/dist/core-runtime/review/controlled-lens-deliberation.js +125 -0
  380. package/dist/core-runtime/review/execution-plan-resolver.js +247 -0
  381. package/dist/core-runtime/review/execution-plan-resolver.test.js +243 -0
  382. package/dist/core-runtime/review/execution-topology-resolver-axis-first.test.js +246 -0
  383. package/dist/core-runtime/review/execution-topology-resolver.js +401 -0
  384. package/dist/core-runtime/review/execution-topology-resolver.test.js +315 -0
  385. package/dist/core-runtime/review/failure-records.js +57 -0
  386. package/dist/core-runtime/review/inline-context-embedder.js +141 -0
  387. package/dist/core-runtime/review/inline-context-embedder.test.js +154 -0
  388. package/dist/core-runtime/review/issue-artifact-runtime.js +859 -0
  389. package/dist/core-runtime/review/legacy-mode-policy.js +88 -0
  390. package/dist/core-runtime/review/lens-completion-policy.js +17 -0
  391. package/dist/core-runtime/review/materializers-effort-persist.test.js +79 -0
  392. package/dist/core-runtime/review/materializers.js +963 -0
  393. package/dist/core-runtime/review/ontology-path-classifier.js +179 -0
  394. package/dist/core-runtime/review/ontology-path-classifier.test.js +216 -0
  395. package/dist/core-runtime/review/packet-boundary-policy.js +215 -0
  396. package/dist/core-runtime/review/packet-boundary-policy.test.js +107 -0
  397. package/dist/core-runtime/review/participating-lens-paths.js +61 -0
  398. package/dist/core-runtime/review/participating-lens-paths.test.js +73 -0
  399. package/dist/core-runtime/review/review-artifact-utils.js +287 -0
  400. package/dist/core-runtime/review/review-config-legacy-translate.js +244 -0
  401. package/dist/core-runtime/review/review-config-legacy-translate.test.js +161 -0
  402. package/dist/core-runtime/review/review-config-validator.js +289 -0
  403. package/dist/core-runtime/review/review-config-validator.test.js +236 -0
  404. package/dist/core-runtime/review/review-execution-profile.js +193 -0
  405. package/dist/core-runtime/review/review-execution-route.js +52 -0
  406. package/dist/core-runtime/review/review-progress-contract.js +123 -0
  407. package/dist/core-runtime/review/review-record-validation.js +251 -0
  408. package/dist/core-runtime/review/review-result-classification.js +379 -0
  409. package/dist/core-runtime/review/review-state-machine.js +39 -0
  410. package/dist/core-runtime/review/route-visibility.js +125 -0
  411. package/dist/core-runtime/review/shape-pipeline-audit.test.js +311 -0
  412. package/dist/core-runtime/review/shape-to-topology-id.js +117 -0
  413. package/dist/core-runtime/review/shape-to-topology-id.test.js +132 -0
  414. package/dist/core-runtime/review/topology-shape-derivation.js +155 -0
  415. package/dist/core-runtime/review/topology-shape-derivation.test.js +195 -0
  416. package/dist/core-runtime/scope-runtime/constants.js +12 -0
  417. package/dist/core-runtime/scope-runtime/constraint-pool.js +166 -0
  418. package/dist/core-runtime/scope-runtime/constraint-pool.test.js +674 -0
  419. package/dist/core-runtime/scope-runtime/domain-validation-log.js +135 -0
  420. package/dist/core-runtime/scope-runtime/domain-validation-log.test.js +156 -0
  421. package/dist/core-runtime/scope-runtime/eval-persistence.js +65 -0
  422. package/dist/core-runtime/scope-runtime/eval-persistence.test.js +84 -0
  423. package/dist/core-runtime/scope-runtime/event-pipeline.js +64 -0
  424. package/dist/core-runtime/scope-runtime/event-pipeline.test.js +450 -0
  425. package/dist/core-runtime/scope-runtime/event-store.js +39 -0
  426. package/dist/core-runtime/scope-runtime/event-store.test.js +95 -0
  427. package/dist/core-runtime/scope-runtime/gate-guard.js +348 -0
  428. package/dist/core-runtime/scope-runtime/gate-guard.test.js +1047 -0
  429. package/dist/core-runtime/scope-runtime/hash.js +4 -0
  430. package/dist/core-runtime/scope-runtime/hash.test.js +33 -0
  431. package/dist/core-runtime/scope-runtime/id.js +4 -0
  432. package/dist/core-runtime/scope-runtime/id.test.js +17 -0
  433. package/dist/core-runtime/scope-runtime/reducer.js +297 -0
  434. package/dist/core-runtime/scope-runtime/reducer.test.js +759 -0
  435. package/dist/core-runtime/scope-runtime/scope-manager.js +161 -0
  436. package/dist/core-runtime/scope-runtime/state-machine.js +309 -0
  437. package/dist/core-runtime/scope-runtime/state-machine.test.js +704 -0
  438. package/dist/core-runtime/scope-runtime/types.js +116 -0
  439. package/dist/core-runtime/scope-runtime/types.test.js +69 -0
  440. package/dist/core-runtime/target-material-kind.js +256 -0
  441. package/dist/core-runtime/translate/render-for-user.js +169 -0
  442. package/dist/core-runtime/translate/render-for-user.test.js +122 -0
  443. package/dist/mcp/server.js +1011 -0
  444. package/dist/mcp/tool-schemas.js +93 -0
  445. package/dist/providers/capability-contract.js +1 -0
  446. package/package.json +68 -0
  447. package/settings.example.json +33 -0
@@ -0,0 +1,517 @@
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
+ }