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,431 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { parseArgs } from "node:util";
5
+ import { pathToFileURL } from "node:url";
6
+ import YAML from "yaml";
7
+ import { fileExists, isoFromTimestamp, parseMarkdownFrontmatter, readYamlDocument, toRelativePath, writeYamlDocument, } from "../review/review-artifact-utils.js";
8
+ import { validateReviewRecordObject } from "../review/review-record-validation.js";
9
+ import { readReviewResultClassification } from "../review/review-result-classification.js";
10
+ import { printOntoReleaseChannelNotice } from "../release-channel/release-channel.js";
11
+ const LENS_OUTPUT_SCHEMA_VERSION = 2;
12
+ const SHARED_PHENOMENON_RELATIONS = new Set([
13
+ "corroboration",
14
+ "disagreement",
15
+ "partial overlap",
16
+ "dedup",
17
+ ]);
18
+ function requireString(value, optionName) {
19
+ if (typeof value !== "string" || value.length === 0) {
20
+ throw new Error(`Missing required option --${optionName}`);
21
+ }
22
+ return value;
23
+ }
24
+ async function detectDeliberationStatus(executionResult) {
25
+ if (executionResult.deliberation_status === "performed") {
26
+ return "performed";
27
+ }
28
+ if (executionResult.execution_status === "halted_partial") {
29
+ return "not_performed";
30
+ }
31
+ throw new Error(`Review execution result must declare deliberation_status=performed for session ${executionResult.session_id}.`);
32
+ }
33
+ async function assertSynthesisDeliberationPerformed(synthesisPath) {
34
+ const synthesisText = await fs.readFile(synthesisPath, "utf8");
35
+ const parsed = parseMarkdownFrontmatter(synthesisText);
36
+ if (parsed.metadata?.deliberation_status !== "performed") {
37
+ throw new Error(`synthesis.md must declare frontmatter deliberation_status: performed: ${synthesisPath}`);
38
+ }
39
+ }
40
+ function normalizeHeadingTitle(title) {
41
+ return title
42
+ .replace(/[`*_]/g, "")
43
+ .replace(/\s+/g, " ")
44
+ .trim()
45
+ .toLowerCase();
46
+ }
47
+ function extractMarkdownSection(markdownText, acceptedTitles) {
48
+ const accepted = new Set(acceptedTitles.map(normalizeHeadingTitle));
49
+ const body = parseMarkdownFrontmatter(markdownText).body;
50
+ const lines = body.split(/\r?\n/u);
51
+ let start = -1;
52
+ for (let index = 0; index < lines.length; index += 1) {
53
+ const match = /^(#{1,6})\s+(.+?)\s*#*\s*$/u.exec(lines[index] ?? "");
54
+ if (!match?.[2])
55
+ continue;
56
+ if (accepted.has(normalizeHeadingTitle(match[2]))) {
57
+ start = index + 1;
58
+ break;
59
+ }
60
+ }
61
+ if (start < 0)
62
+ return null;
63
+ let end = lines.length;
64
+ for (let index = start; index < lines.length; index += 1) {
65
+ if (/^#{1,6}\s+/u.test(lines[index] ?? "")) {
66
+ end = index;
67
+ break;
68
+ }
69
+ }
70
+ return lines.slice(start, end).join("\n").trim();
71
+ }
72
+ function extractYamlFence(sectionText) {
73
+ const trimmed = sectionText.trim();
74
+ const match = /```(?:ya?ml)?\s*\n([\s\S]*?)\n```/iu.exec(trimmed);
75
+ return (match?.[1] ?? trimmed).trim();
76
+ }
77
+ function parseYamlList(sectionText, label) {
78
+ const source = extractYamlFence(sectionText);
79
+ let parsed;
80
+ try {
81
+ parsed = YAML.parse(source);
82
+ }
83
+ catch (error) {
84
+ throw new Error(`Invalid YAML list in ${label}: ${error instanceof Error ? error.message : String(error)}`);
85
+ }
86
+ if (!Array.isArray(parsed)) {
87
+ throw new Error(`Expected YAML list in ${label}.`);
88
+ }
89
+ return parsed;
90
+ }
91
+ function requireRecord(value, label) {
92
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
93
+ throw new Error(`Expected object item in ${label}.`);
94
+ }
95
+ return value;
96
+ }
97
+ function requireNonEmptyString(value, label) {
98
+ if (typeof value !== "string" || value.trim().length === 0) {
99
+ throw new Error(`Expected non-empty string for ${label}.`);
100
+ }
101
+ return value.trim();
102
+ }
103
+ function parseDomainConstraints(sectionText, lensId) {
104
+ return parseYamlList(sectionText, `${lensId} Domain Constraints Used`).map((item, index) => {
105
+ const record = requireRecord(item, `${lensId} Domain Constraints Used[${index}]`);
106
+ return {
107
+ source_doc: requireNonEmptyString(record.source_doc, `${lensId}.domain_constraints_used[${index}].source_doc`),
108
+ source_version_or_snapshot_id: requireNonEmptyString(record.source_version_or_snapshot_id, `${lensId}.domain_constraints_used[${index}].source_version_or_snapshot_id`),
109
+ anchor: requireNonEmptyString(record.anchor, `${lensId}.domain_constraints_used[${index}].anchor`),
110
+ };
111
+ });
112
+ }
113
+ function parseStringList(sectionText, label) {
114
+ return parseYamlList(sectionText, label).map((item, index) => requireNonEmptyString(item, `${label}[${index}]`));
115
+ }
116
+ async function deriveLensProvenance(lensResultPathsById, participatingLensIds) {
117
+ const perLensProvenance = {};
118
+ for (const lensId of participatingLensIds) {
119
+ const lensResultPath = lensResultPathsById[lensId];
120
+ if (!lensResultPath) {
121
+ throw new Error(`Missing lens result path for participating lens: ${lensId}`);
122
+ }
123
+ const lensText = await fs.readFile(lensResultPath, "utf8");
124
+ const constraintsSection = extractMarkdownSection(lensText, [
125
+ "Domain Constraints Used",
126
+ ]);
127
+ const assumptionsSection = extractMarkdownSection(lensText, [
128
+ "Domain Context Assumptions",
129
+ ]);
130
+ if (constraintsSection === null) {
131
+ throw new Error(`Lens output schema v${LENS_OUTPUT_SCHEMA_VERSION} requires "Domain Constraints Used": ${lensResultPath}`);
132
+ }
133
+ if (assumptionsSection === null) {
134
+ throw new Error(`Lens output schema v${LENS_OUTPUT_SCHEMA_VERSION} requires "Domain Context Assumptions": ${lensResultPath}`);
135
+ }
136
+ perLensProvenance[lensId] = {
137
+ domain_constraints_used: parseDomainConstraints(constraintsSection, lensId),
138
+ domain_context_assumptions: parseStringList(assumptionsSection, `${lensId} Domain Context Assumptions`),
139
+ };
140
+ }
141
+ return perLensProvenance;
142
+ }
143
+ function parseSharedPhenomenonSummaryItem(item, index) {
144
+ const record = requireRecord(item, `shared_phenomenon_summary[${index}]`);
145
+ const claimRelation = requireNonEmptyString(record.claim_relation, `shared_phenomenon_summary[${index}].claim_relation`);
146
+ if (!SHARED_PHENOMENON_RELATIONS.has(claimRelation)) {
147
+ throw new Error(`Invalid shared_phenomenon_summary[${index}].claim_relation: ${claimRelation}`);
148
+ }
149
+ const participatingLensIds = record.participating_lens_ids;
150
+ if (!Array.isArray(participatingLensIds) ||
151
+ participatingLensIds.length < 2) {
152
+ throw new Error(`shared_phenomenon_summary[${index}].participating_lens_ids must list at least two lenses.`);
153
+ }
154
+ return {
155
+ target: requireNonEmptyString(record.target, `shared_phenomenon_summary[${index}].target`),
156
+ evidence_anchor: requireNonEmptyString(record.evidence_anchor, `shared_phenomenon_summary[${index}].evidence_anchor`),
157
+ participating_lens_ids: participatingLensIds.map((lensId, lensIndex) => requireNonEmptyString(lensId, `shared_phenomenon_summary[${index}].participating_lens_ids[${lensIndex}]`)),
158
+ claim_relation: claimRelation,
159
+ };
160
+ }
161
+ async function deriveSharedPhenomenonSummary(synthesisPath) {
162
+ const synthesisText = await fs.readFile(synthesisPath, "utf8");
163
+ const section = extractMarkdownSection(synthesisText, [
164
+ "Shared Phenomenon Summary",
165
+ "Shared Phenomenon Classification",
166
+ "Shared Phenomena",
167
+ ]);
168
+ if (section === null)
169
+ return [];
170
+ return parseYamlList(section, "synthesis Shared Phenomenon Summary").map(parseSharedPhenomenonSummaryItem);
171
+ }
172
+ async function summarizeErrorLog(errorLogPath) {
173
+ if (!(await fileExists(errorLogPath))) {
174
+ return {
175
+ degradedLensIds: [],
176
+ hasExecutionFailure: false,
177
+ hasRunnerHalt: false,
178
+ };
179
+ }
180
+ const errorLogText = await fs.readFile(errorLogPath, "utf8");
181
+ const lensFailureMatches = Array.from(errorLogText.matchAll(/\|\s+lens failure:\s+(?:onto_)?([a-z_]+)/g));
182
+ const uniqueLensIds = [];
183
+ for (const match of lensFailureMatches) {
184
+ const lensId = match[1];
185
+ if (typeof lensId !== "string") {
186
+ continue;
187
+ }
188
+ if (!uniqueLensIds.includes(lensId)) {
189
+ uniqueLensIds.push(lensId);
190
+ }
191
+ }
192
+ return {
193
+ degradedLensIds: uniqueLensIds,
194
+ hasExecutionFailure: /\|\s+(?:lens|deliberation|synthesize) failure:\s+/m.test(errorLogText),
195
+ hasRunnerHalt: /\|\s+runner halted before synthesize/m.test(errorLogText),
196
+ };
197
+ }
198
+ async function deriveRecordStatus(executionResult, errorLogSummary, finalOutputPath) {
199
+ if (executionResult) {
200
+ return executionResult.execution_status;
201
+ }
202
+ const finalOutputExists = await fileExists(finalOutputPath);
203
+ if (!errorLogSummary.hasExecutionFailure && !errorLogSummary.hasRunnerHalt) {
204
+ return finalOutputExists ? "completed" : "halted_partial";
205
+ }
206
+ if (finalOutputExists) {
207
+ return "completed_with_degradation";
208
+ }
209
+ return "halted_partial";
210
+ }
211
+ function hasDegradationSource(args) {
212
+ if (args.executionResult) {
213
+ return (args.executionResult.execution_status !== "completed" ||
214
+ args.degradedLensIds.length > 0);
215
+ }
216
+ return args.errorLogSummary.hasExecutionFailure || args.errorLogSummary.hasRunnerHalt;
217
+ }
218
+ async function deriveDegradationNotesRef(args) {
219
+ if (!hasDegradationSource(args))
220
+ return null;
221
+ const degradationSummaryPath = path.join(args.sessionRoot, "degradation-summary.yaml");
222
+ if (!(await fileExists(degradationSummaryPath))) {
223
+ throw new Error(`degradation-summary.yaml is required when review execution is degraded or halted: ${degradationSummaryPath}`);
224
+ }
225
+ return toRelativePath(degradationSummaryPath, args.projectRoot);
226
+ }
227
+ export async function runAssembleReviewRecordCli(argv) {
228
+ const { values } = parseArgs({
229
+ options: {
230
+ "session-root": { type: "string" },
231
+ "project-root": { type: "string", default: "." },
232
+ "request-text": { type: "string" },
233
+ },
234
+ strict: true,
235
+ allowPositionals: false,
236
+ args: argv,
237
+ });
238
+ const sessionRoot = path.resolve(requireString(values["session-root"], "session-root"));
239
+ const projectRoot = path.resolve(requireString(values["project-root"], "project-root"));
240
+ const requestText = requireString(values["request-text"], "request-text");
241
+ const sessionId = path.basename(sessionRoot);
242
+ const interpretationPath = path.join(sessionRoot, "interpretation.yaml");
243
+ const bindingPath = path.join(sessionRoot, "binding.yaml");
244
+ const sessionMetadataPath = path.join(sessionRoot, "session-metadata.yaml");
245
+ const executionPreparationRoot = path.join(sessionRoot, "execution-preparation");
246
+ const targetSnapshotPath = path.join(executionPreparationRoot, "target-snapshot.md");
247
+ const materializedInputPath = path.join(executionPreparationRoot, "materialized-input.md");
248
+ const reviewTargetProfilePath = path.join(executionPreparationRoot, "review-target-profile.yaml");
249
+ const contextCandidateAssemblyPath = path.join(executionPreparationRoot, "context-candidate-assembly.yaml");
250
+ const synthesisPath = path.join(sessionRoot, "synthesis.md");
251
+ const findingLedgerPath = path.join(sessionRoot, "finding-ledger.yaml");
252
+ const findingRelationGraphPath = path.join(sessionRoot, "finding-relation-graph.yaml");
253
+ const issueLedgerPath = path.join(sessionRoot, "issue-ledger.yaml");
254
+ const issueStanceMatrixPath = path.join(sessionRoot, "issue-stance-matrix.yaml");
255
+ const deliberationPlanPath = path.join(sessionRoot, "deliberation-plan.yaml");
256
+ const problemFramingPath = path.join(sessionRoot, "problem-framing.yaml");
257
+ const deliberationPath = path.join(sessionRoot, "deliberation.md");
258
+ const finalOutputPath = path.join(sessionRoot, "final-output.md");
259
+ const executionResultPath = path.join(sessionRoot, "execution-result.yaml");
260
+ const errorLogPath = path.join(sessionRoot, "error-log.md");
261
+ const reviewRecordPath = path.join(sessionRoot, "review-record.yaml");
262
+ const round1Root = path.join(sessionRoot, "round1");
263
+ const requiredArtifacts = [
264
+ ["interpretation", interpretationPath],
265
+ ["binding", bindingPath],
266
+ ["session metadata", sessionMetadataPath],
267
+ ["target snapshot", targetSnapshotPath],
268
+ ["materialized input", materializedInputPath],
269
+ ["review target profile", reviewTargetProfilePath],
270
+ ["context candidate assembly", contextCandidateAssemblyPath],
271
+ ["final output", finalOutputPath],
272
+ ["execution result", executionResultPath],
273
+ ];
274
+ for (const [label, artifactPath] of requiredArtifacts) {
275
+ if (!(await fileExists(artifactPath))) {
276
+ throw new Error(`Missing ${label} artifact: ${artifactPath}`);
277
+ }
278
+ }
279
+ const invocationBindingArtifact = await readYamlDocument(bindingPath);
280
+ const executionResult = await readYamlDocument(executionResultPath);
281
+ const synthesisExecuted = executionResult.synthesis_executed === true;
282
+ if (synthesisExecuted) {
283
+ const requiredCompletedArtifacts = [
284
+ ["finding ledger", findingLedgerPath],
285
+ ["finding relation graph", findingRelationGraphPath],
286
+ ["issue ledger", issueLedgerPath],
287
+ ["issue stance matrix", issueStanceMatrixPath],
288
+ ["deliberation plan", deliberationPlanPath],
289
+ ["problem framing", problemFramingPath],
290
+ ["controlled deliberation", deliberationPath],
291
+ ["synthesis", synthesisPath],
292
+ ];
293
+ for (const [label, artifactPath] of requiredCompletedArtifacts) {
294
+ if (!(await fileExists(artifactPath))) {
295
+ throw new Error(`Missing ${label} artifact: ${artifactPath}`);
296
+ }
297
+ }
298
+ }
299
+ const sessionMetadata = await readYamlDocument(sessionMetadataPath);
300
+ const lensResultRefs = {};
301
+ const lensResultPathsById = {};
302
+ const participatingLensIds = executionResult?.participating_lens_ids
303
+ ? [...executionResult.participating_lens_ids]
304
+ : [];
305
+ if (executionResult) {
306
+ for (const unitResult of executionResult.lens_execution_results) {
307
+ if (unitResult.status !== "completed") {
308
+ continue;
309
+ }
310
+ const lensResultPath = path.isAbsolute(unitResult.output_path)
311
+ ? unitResult.output_path
312
+ : path.join(projectRoot, unitResult.output_path);
313
+ lensResultRefs[unitResult.unit_id] = toRelativePath(lensResultPath, projectRoot);
314
+ lensResultPathsById[unitResult.unit_id] = lensResultPath;
315
+ }
316
+ }
317
+ else if (await fileExists(round1Root)) {
318
+ const round1FilePaths = await fs.readdir(round1Root);
319
+ for (const entryName of round1FilePaths.sort()) {
320
+ if (!entryName.endsWith(".md")) {
321
+ continue;
322
+ }
323
+ const lensId = entryName.replace(/\.md$/u, "");
324
+ const lensResultPath = path.join(round1Root, entryName);
325
+ lensResultRefs[lensId] = toRelativePath(lensResultPath, projectRoot);
326
+ lensResultPathsById[lensId] = lensResultPath;
327
+ participatingLensIds.push(lensId);
328
+ }
329
+ }
330
+ const errorLogSummary = await summarizeErrorLog(errorLogPath);
331
+ const degradedLensIds = executionResult?.degraded_lens_ids ?? errorLogSummary.degradedLensIds;
332
+ const excludedLensIds = executionResult?.excluded_lens_ids ??
333
+ invocationBindingArtifact.resolved_lens_set.filter((lensId) => !participatingLensIds.includes(lensId) && !degradedLensIds.includes(lensId));
334
+ const updatedAtSource = executionResult
335
+ ? Date.parse(executionResult.execution_completed_at)
336
+ : (await fs.stat(sessionRoot)).mtimeMs;
337
+ if (synthesisExecuted) {
338
+ await assertSynthesisDeliberationPerformed(synthesisPath);
339
+ }
340
+ const perLensProvenance = await deriveLensProvenance(lensResultPathsById, participatingLensIds);
341
+ const sharedPhenomenonSummary = synthesisExecuted
342
+ ? await deriveSharedPhenomenonSummary(synthesisPath)
343
+ : [];
344
+ const problemFraming = synthesisExecuted
345
+ ? await readYamlDocument(problemFramingPath)
346
+ : null;
347
+ const resultClassificationSummary = await readReviewResultClassification(sessionRoot);
348
+ const optionalArtifactRef = async (artifactPath) => (await fileExists(artifactPath))
349
+ ? toRelativePath(artifactPath, projectRoot)
350
+ : null;
351
+ const findingLedgerRef = await optionalArtifactRef(findingLedgerPath);
352
+ const findingRelationGraphRef = await optionalArtifactRef(findingRelationGraphPath);
353
+ const issueLedgerRef = await optionalArtifactRef(issueLedgerPath);
354
+ const issueStanceMatrixRef = await optionalArtifactRef(issueStanceMatrixPath);
355
+ const deliberationPlanRef = await optionalArtifactRef(deliberationPlanPath);
356
+ const problemFramingRef = await optionalArtifactRef(problemFramingPath);
357
+ const synthesisResultRef = (await fileExists(synthesisPath))
358
+ ? toRelativePath(synthesisPath, projectRoot)
359
+ : null;
360
+ const deliberationResultRef = (await fileExists(deliberationPath))
361
+ ? toRelativePath(deliberationPath, projectRoot)
362
+ : null;
363
+ if (synthesisExecuted &&
364
+ !Array.isArray(problemFraming?.classifications)) {
365
+ throw new Error(`problem-framing.yaml must contain classifications list: ${problemFramingPath}`);
366
+ }
367
+ const reviewRecord = {
368
+ review_record_id: sessionId,
369
+ session_id: sessionId,
370
+ entrypoint: "review",
371
+ record_status: await deriveRecordStatus(executionResult, errorLogSummary, finalOutputPath),
372
+ created_at: sessionMetadata.created_at ?? isoFromTimestamp((await fs.stat(sessionRoot)).mtimeMs),
373
+ updated_at: isoFromTimestamp(updatedAtSource),
374
+ request_text: requestText,
375
+ review_target_scope_ref: toRelativePath(bindingPath, projectRoot),
376
+ interpretation_ref: toRelativePath(interpretationPath, projectRoot),
377
+ binding_ref: toRelativePath(bindingPath, projectRoot),
378
+ domain_final_selection_ref: toRelativePath(bindingPath, projectRoot),
379
+ resolved_review_mode: invocationBindingArtifact.resolved_review_mode,
380
+ resolved_execution_realization: invocationBindingArtifact.resolved_execution_realization,
381
+ resolved_host_runtime: invocationBindingArtifact.resolved_host_runtime,
382
+ resolved_lens_ids: invocationBindingArtifact.resolved_lens_set,
383
+ execution_result_ref: toRelativePath(executionResultPath, projectRoot),
384
+ session_metadata_ref: toRelativePath(sessionMetadataPath, projectRoot),
385
+ target_snapshot_ref: toRelativePath(targetSnapshotPath, projectRoot),
386
+ materialized_input_ref: toRelativePath(materializedInputPath, projectRoot),
387
+ review_target_profile_ref: toRelativePath(reviewTargetProfilePath, projectRoot),
388
+ context_candidate_assembly_ref: toRelativePath(contextCandidateAssemblyPath, projectRoot),
389
+ lens_result_refs: lensResultRefs,
390
+ lens_output_schema_version: LENS_OUTPUT_SCHEMA_VERSION,
391
+ participating_lens_ids: participatingLensIds,
392
+ excluded_lens_ids: excludedLensIds,
393
+ degraded_lens_ids: degradedLensIds,
394
+ degradation_notes_ref: await deriveDegradationNotesRef({
395
+ sessionRoot,
396
+ projectRoot,
397
+ executionResult,
398
+ errorLogSummary,
399
+ degradedLensIds,
400
+ }),
401
+ per_lens_provenance: perLensProvenance,
402
+ finding_ledger_ref: findingLedgerRef,
403
+ finding_relation_graph_ref: findingRelationGraphRef,
404
+ issue_ledger_ref: issueLedgerRef,
405
+ issue_stance_matrix_ref: issueStanceMatrixRef,
406
+ deliberation_plan_ref: deliberationPlanRef,
407
+ problem_framing_ref: problemFramingRef,
408
+ issue_resolution_summary: Array.isArray(problemFraming?.classifications)
409
+ ? problemFraming.classifications
410
+ : [],
411
+ result_classification_summary: resultClassificationSummary,
412
+ synthesis_result_ref: synthesisResultRef,
413
+ deliberation_status: await detectDeliberationStatus(executionResult),
414
+ deliberation_result_ref: deliberationResultRef,
415
+ final_output_ref: toRelativePath(finalOutputPath, projectRoot),
416
+ shared_phenomenon_summary: sharedPhenomenonSummary,
417
+ };
418
+ await writeYamlDocument(reviewRecordPath, validateReviewRecordObject(reviewRecord));
419
+ console.log(reviewRecordPath);
420
+ return 0;
421
+ }
422
+ async function main() {
423
+ await printOntoReleaseChannelNotice();
424
+ return runAssembleReviewRecordCli(process.argv.slice(2));
425
+ }
426
+ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
427
+ main().then((exitCode) => process.exit(exitCode), (error) => {
428
+ console.error(error instanceof Error ? error.message : String(error));
429
+ process.exit(1);
430
+ });
431
+ }
@@ -0,0 +1,186 @@
1
+ #!/usr/bin/env node
2
+ import path from "node:path";
3
+ import { parseArgs } from "node:util";
4
+ import { hasOptionFlag } from "../review/review-artifact-utils.js";
5
+ import { bootstrapInvocationBindingArtifacts } from "../review/materializers.js";
6
+ import { printOntoReleaseChannelNotice } from "../release-channel/release-channel.js";
7
+ import { detectClaudeCodeEnvSignal, detectCodexEnvSignal, } from "../discovery/host-detection.js";
8
+ function requireString(value, optionName) {
9
+ if (typeof value !== "string" || value.length === 0) {
10
+ throw new Error(`Missing required option --${optionName}`);
11
+ }
12
+ return value;
13
+ }
14
+ function optionalString(value) {
15
+ return typeof value === "string" ? value : "";
16
+ }
17
+ function requireExecutionRealization(value) {
18
+ if (value === "worker" || value === "host-team" || value === "direct-call") {
19
+ return value;
20
+ }
21
+ throw new Error(`Invalid --execution-realization: ${value}`);
22
+ }
23
+ function normalizeHostRuntime(hostRuntimeValue) {
24
+ if (typeof hostRuntimeValue !== "string" || hostRuntimeValue.length === 0) {
25
+ return undefined;
26
+ }
27
+ if (hostRuntimeValue === "codex" || hostRuntimeValue === "claude") {
28
+ return hostRuntimeValue;
29
+ }
30
+ if (hostRuntimeValue === "standalone" ||
31
+ hostRuntimeValue === "anthropic" ||
32
+ hostRuntimeValue === "openai" ||
33
+ hostRuntimeValue === "grok" ||
34
+ hostRuntimeValue === "lmstudio") {
35
+ return hostRuntimeValue;
36
+ }
37
+ throw new Error(`Invalid --host-runtime: ${hostRuntimeValue}`);
38
+ }
39
+ function detectHostRuntimeFromEnvironment() {
40
+ // Delegated to canonical seat. Note: this consumer expects undefined when
41
+ // no signal is present (so caller can apply its own default), so we DO NOT
42
+ // call `detectHostRuntime()` (which always returns "standalone" as default).
43
+ if (detectCodexEnvSignal()) {
44
+ return "codex";
45
+ }
46
+ if (detectClaudeCodeEnvSignal()) {
47
+ return "claude";
48
+ }
49
+ return undefined;
50
+ }
51
+ function resolveHostRuntime(argv, executionRealizationValue, hostRuntimeValue) {
52
+ const explicitHostRuntime = normalizeHostRuntime(hostRuntimeValue);
53
+ if (explicitHostRuntime) {
54
+ return explicitHostRuntime;
55
+ }
56
+ if (hasOptionFlag(argv, "codex")) {
57
+ return "codex";
58
+ }
59
+ if (hasOptionFlag(argv, "claude")) {
60
+ return "claude";
61
+ }
62
+ const normalizedExecutionRealization = typeof executionRealizationValue === "string" && executionRealizationValue.length > 0
63
+ ? requireExecutionRealization(executionRealizationValue)
64
+ : undefined;
65
+ if (normalizedExecutionRealization) {
66
+ if (normalizedExecutionRealization === "worker")
67
+ return "codex";
68
+ if (normalizedExecutionRealization === "host-team")
69
+ return "claude";
70
+ return "standalone";
71
+ }
72
+ return detectHostRuntimeFromEnvironment() ?? "codex";
73
+ }
74
+ function resolveExecutionRealization(argv, executionRealizationValue, hostRuntime) {
75
+ if (typeof executionRealizationValue === "string" &&
76
+ executionRealizationValue.length > 0) {
77
+ return requireExecutionRealization(executionRealizationValue);
78
+ }
79
+ if (hasOptionFlag(argv, "codex")) {
80
+ return "worker";
81
+ }
82
+ if (hasOptionFlag(argv, "claude")) {
83
+ return "host-team";
84
+ }
85
+ if (hostRuntime === "codex")
86
+ return "worker";
87
+ if (hostRuntime === "claude")
88
+ return "host-team";
89
+ return "direct-call";
90
+ }
91
+ function requireReviewMode(value) {
92
+ if (value === "core-axis" || value === "full") {
93
+ return value;
94
+ }
95
+ throw new Error(`Invalid --review-mode: ${value}`);
96
+ }
97
+ function requireTargetScopeKind(value) {
98
+ if (value === "file" || value === "directory" || value === "bundle") {
99
+ return value;
100
+ }
101
+ throw new Error(`Invalid --target-scope-kind: ${value}`);
102
+ }
103
+ async function main() {
104
+ await printOntoReleaseChannelNotice();
105
+ const { values } = parseArgs({
106
+ options: {
107
+ "project-root": { type: "string", default: "." },
108
+ "requested-target": { type: "string" },
109
+ "requested-domain-token": { type: "string", default: "" },
110
+ "plugin-root": { type: "string" },
111
+ "session-id": { type: "string" },
112
+ "target-scope-kind": { type: "string" },
113
+ "bundle-kind": { type: "string" },
114
+ "resolved-target-ref": { type: "string", multiple: true, default: [] },
115
+ "domain-recommendation": { type: "string", default: "" },
116
+ "domain-final-value": { type: "string" },
117
+ "domain-selection-mode": { type: "string" },
118
+ "execution-realization": { type: "string" },
119
+ "execution-mode": { type: "string" },
120
+ "host-runtime": { type: "string" },
121
+ "runtime-provider": { type: "string" },
122
+ "auth-mode": { type: "string" },
123
+ "effective-worker-executor": { type: "string" },
124
+ codex: { type: "boolean", default: false },
125
+ claude: { type: "boolean", default: false },
126
+ "review-mode": { type: "string" },
127
+ "lens-id": { type: "string", multiple: true, default: [] },
128
+ "binding-note": { type: "string", multiple: true, default: [] },
129
+ },
130
+ strict: true,
131
+ allowPositionals: false,
132
+ });
133
+ const resolvedTargetRefs = values["resolved-target-ref"];
134
+ const resolvedLensIds = values["lens-id"];
135
+ if (resolvedTargetRefs.length === 0) {
136
+ throw new Error("At least one --resolved-target-ref is required.");
137
+ }
138
+ if (resolvedLensIds.length === 0) {
139
+ throw new Error("At least one --lens-id is required.");
140
+ }
141
+ const projectRoot = path.resolve(requireString(values["project-root"], "project-root"));
142
+ const hostRuntime = resolveHostRuntime(process.argv.slice(2), values["execution-realization"] ?? values["execution-mode"], values["host-runtime"]);
143
+ const executionRealization = resolveExecutionRealization(process.argv.slice(2), values["execution-realization"] ?? values["execution-mode"], hostRuntime);
144
+ const bindingParams = {
145
+ projectRoot,
146
+ requestedTarget: requireString(values["requested-target"], "requested-target"),
147
+ requestedDomainToken: optionalString(values["requested-domain-token"]),
148
+ targetScopeKind: requireTargetScopeKind(requireString(values["target-scope-kind"], "target-scope-kind")),
149
+ resolvedTargetRefs,
150
+ domainRecommendation: optionalString(values["domain-recommendation"]),
151
+ domainFinalValue: requireString(values["domain-final-value"], "domain-final-value"),
152
+ domainSelectionMode: requireString(values["domain-selection-mode"], "domain-selection-mode"),
153
+ executionRealization,
154
+ hostRuntime,
155
+ ...(typeof values["runtime-provider"] === "string" &&
156
+ values["runtime-provider"].length > 0
157
+ ? { runtimeProvider: values["runtime-provider"] }
158
+ : {}),
159
+ ...(typeof values["auth-mode"] === "string" && values["auth-mode"].length > 0
160
+ ? { authMode: values["auth-mode"] === "none" ? null : values["auth-mode"] }
161
+ : {}),
162
+ ...(typeof values["effective-worker-executor"] === "string" &&
163
+ values["effective-worker-executor"].length > 0
164
+ ? { effectiveWorkerExecutor: values["effective-worker-executor"] }
165
+ : {}),
166
+ reviewMode: requireReviewMode(requireString(values["review-mode"], "review-mode")),
167
+ resolvedLensIds,
168
+ bindingNotes: values["binding-note"],
169
+ ...(typeof values["plugin-root"] === "string" && values["plugin-root"].length > 0
170
+ ? { pluginRoot: values["plugin-root"] }
171
+ : {}),
172
+ ...(typeof values["session-id"] === "string" && values["session-id"].length > 0
173
+ ? { sessionId: values["session-id"] }
174
+ : {}),
175
+ ...(typeof values["bundle-kind"] === "string" && values["bundle-kind"].length > 0
176
+ ? { bundleKind: values["bundle-kind"] }
177
+ : {}),
178
+ };
179
+ const { sessionRoot } = await bootstrapInvocationBindingArtifacts(bindingParams);
180
+ console.log(sessionRoot);
181
+ return 0;
182
+ }
183
+ main().then((exitCode) => process.exit(exitCode), (error) => {
184
+ console.error(error instanceof Error ? error.message : String(error));
185
+ process.exit(1);
186
+ });