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,412 @@
1
+ /**
2
+ * TeamCreate Lens Deliberation Executor.
3
+ *
4
+ * # What this module is
5
+ *
6
+ * Realizes the protocol side of topology `cc-teams-lens-agent-deliberation`
7
+ * (sketch v3 §3.1 option 1-0). After each of the N lens agents — spawned
8
+ * as persistent `TeamCreate` members — completes its primary lens
9
+ * reasoning, the teamlead dispatches 1-2 rounds of `SendMessage` controlled-deliberation transport
10
+ * deliberation: every lens agent sees the others' outputs and replies
11
+ * with a re-evaluation. Deliberation outputs are written to
12
+ * `<deliberation_dir>/roundN/<lens_id>-deliberation.md` and fed into
13
+ * the final synthesize step.
14
+ *
15
+ * # Why it exists
16
+ *
17
+ * 1-0 is the only topology in which lens agents can directly cross-talk
18
+ * without ending their sessions — every other topology terminates lens
19
+ * agents after output so only the synthesize step integrates findings.
20
+ * Deliberation therefore requires a persistent `TeamCreate` lifecycle
21
+ * (Claude Code experimental feature; pre-verified by the principal
22
+ * 2026-04-18, handoff §6.7).
23
+ *
24
+ * # How it relates
25
+ *
26
+ * - `resolveExecutionTopology()` selects `cc-teams-lens-agent-deliberation`
27
+ * only when TRIPLE opt-in is satisfied (CLAUDECODE + experimental flag
28
+ * + `config.lens_agent_teams_mode`). This module re-checks the same
29
+ * three flags via `requireDeliberationOptIn()` as a defence-in-depth
30
+ * guard for direct callers.
31
+ * - `TeamCreate` / `SendMessage` themselves are Claude Code tools invoked
32
+ * by the Claude coordinator agent (not by the TS subprocess). This
33
+ * module produces PROTOCOL ARTIFACTS — prompts the agent sends,
34
+ * markdown files it writes, schema the synthesize step consumes —
35
+ * so the Claude agent has a deterministic script to follow. The
36
+ * actual controlled-deliberation transport message dispatch stays at the Claude tool layer.
37
+ *
38
+ * # Scope
39
+ *
40
+ * - Triple opt-in guard (`requireDeliberationOptIn`)
41
+ * - Per-round prompt templates (`buildDeliberationRound1Prompt` /
42
+ * `buildDeliberationRound2Prompt`)
43
+ * - Artifact read/write helpers (`writeDeliberationArtifact` /
44
+ * `readDeliberationArtifact`)
45
+ * - Disagreement extraction (`extractDisagreements`) for round 2
46
+ * - Orchestration entrypoint (`runLensAgentDeliberation`) — produces
47
+ * the deliberation plan structure the coordinator follows
48
+ *
49
+ * Integration into `executeReviewPromptExecution` (routing 1-0 resolutions
50
+ * through this module) is reserved for PR-E.
51
+ *
52
+ * # Design reference
53
+ *
54
+ * - Sketch v3 §3.1 option 1-0, §6.4 (double opt-in becomes triple here)
55
+ * - Handoff §6: development-records/plan/20260418-sketch-v3-implementation-handoff.md
56
+ */
57
+ import fs from "node:fs/promises";
58
+ import path from "node:path";
59
+ // ---------------------------------------------------------------------------
60
+ // Errors
61
+ // ---------------------------------------------------------------------------
62
+ export class DeliberationOptInError extends Error {
63
+ missing;
64
+ constructor(missing) {
65
+ super([
66
+ "cc-teams-lens-agent-deliberation topology 는 3 중 opt-in 이 모두 필요합니다.",
67
+ "누락된 조건:",
68
+ ...missing.map((m) => ` - ${m}`),
69
+ "",
70
+ "해결:",
71
+ " 1. Claude Code 세션에서 실행 (CLAUDECODE=1 자동)",
72
+ " 2. ~/.claude*/settings.json 에 CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 설정",
73
+ " 3. .onto/config.yml 에 lens_agent_teams_mode: true 명시",
74
+ ].join("\n"));
75
+ this.missing = missing;
76
+ this.name = "DeliberationOptInError";
77
+ }
78
+ }
79
+ // ---------------------------------------------------------------------------
80
+ // Triple opt-in guard
81
+ // ---------------------------------------------------------------------------
82
+ /**
83
+ * Defence-in-depth check. `resolveExecutionTopology` already enforces the
84
+ * same three flags at resolver time, but direct callers of this module
85
+ * (tests, bespoke scripts) also bear the invariant. Called at the top of
86
+ * `runLensAgentDeliberation`.
87
+ */
88
+ export function requireDeliberationOptIn(ontoConfig, env = process.env) {
89
+ const missing = [];
90
+ if (env.CLAUDECODE !== "1")
91
+ missing.push("CLAUDECODE=1 (Claude Code 세션 아님)");
92
+ if (env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS !== "1") {
93
+ missing.push("CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 (experimental agent teams 미활성)");
94
+ }
95
+ if (ontoConfig.lens_agent_teams_mode !== true) {
96
+ missing.push("config.lens_agent_teams_mode=true (프로젝트 opt-in 미설정)");
97
+ }
98
+ if (missing.length > 0) {
99
+ throw new DeliberationOptInError(missing);
100
+ }
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // Prompt templates
104
+ // ---------------------------------------------------------------------------
105
+ /**
106
+ * Round 1: give each lens agent the primary outputs of EVERY OTHER lens
107
+ * and ask for a re-evaluation. The lens is free to stand firm, concede,
108
+ * or refine — the prompt does not prescribe an outcome, only the shape
109
+ * of the reply.
110
+ *
111
+ * Design choice: the lens reads its OWN prior output implicitly (it's
112
+ * in its own session memory). We pass only the `own_output_summary`
113
+ * as a name anchor; the full payload that differs is "other lens
114
+ * outputs". This keeps round 1 prompts bounded when N is large.
115
+ */
116
+ export function buildDeliberationRound1Prompt(args) {
117
+ const otherBlocks = args.other_lens_outputs
118
+ .map((other) => {
119
+ return [
120
+ `## Lens: ${other.lens_id}`,
121
+ "",
122
+ other.content.trim(),
123
+ ].join("\n");
124
+ })
125
+ .join("\n\n---\n\n");
126
+ return [
127
+ `# Deliberation Round 1 — lens "${args.own_lens_id}"`,
128
+ "",
129
+ "당신은 기존에 작성한 검토 결과를 이미 본인 세션에 보유하고 있습니다.",
130
+ `Own output 요약: ${args.own_output_summary}`,
131
+ "",
132
+ "아래는 **다른 lens agent 들의 출력** 입니다. 각 lens 는 독립적으로",
133
+ "관점을 수행했으며, 일부는 당신과 상충하거나 보완할 수 있습니다.",
134
+ "",
135
+ "# 다른 lens 들의 출력",
136
+ "",
137
+ otherBlocks,
138
+ "",
139
+ "# 당신의 작업",
140
+ "",
141
+ "위 내용을 읽고 당신의 기존 결론을 **재평가** 하세요:",
142
+ "",
143
+ "1. **동의 또는 강화**: 다른 lens 의 발견이 당신의 판단을 뒷받침하는가?",
144
+ " 근거를 명시하세요.",
145
+ "2. **반박 또는 수정**: 다른 lens 와 충돌하는 지점이 있는가? 당신의",
146
+ " 기존 결론을 유지할지 수정할지 명시하세요.",
147
+ "3. **새로운 발견**: 다른 lens 출력에서 촉발된 추가 관찰이 있는가?",
148
+ "",
149
+ "응답 형식 (markdown, 600 단어 이내):",
150
+ "",
151
+ "```",
152
+ "## 재평가 요약",
153
+ "<2-3 문장으로 당신의 round 1 이후 입장 요약>",
154
+ "",
155
+ "## 동의/강화 지점",
156
+ "<다른 lens 의 발견 중 당신의 판단을 강화한 것; bullet 또는 문단>",
157
+ "",
158
+ "## 충돌/수정 지점",
159
+ "<다른 lens 와 충돌하는 지점, 당신의 응답 + 기존 결론 유지/수정 여부>",
160
+ "",
161
+ "## 추가 발견",
162
+ "<촉발된 새 관찰; 없으면 '없음' 명시>",
163
+ "```",
164
+ "",
165
+ "이 응답을 당신이 담당한 deliberation artifact 파일에 기록하세요.",
166
+ ].join("\n");
167
+ }
168
+ /**
169
+ * Round 2: consolidation + disagreement surfacing. Each lens agent sees
170
+ * ALL round-1 responses (including its own) and is asked to either
171
+ * converge or explicitly mark points of persistent disagreement so the
172
+ * synthesizer can represent them faithfully rather than hide them.
173
+ */
174
+ export function buildDeliberationRound2Prompt(args) {
175
+ const blocks = args.round1_responses
176
+ .map((r) => `## Round 1 response — lens: ${r.lens_id}\n\n${r.content.trim()}`)
177
+ .join("\n\n---\n\n");
178
+ return [
179
+ `# Deliberation Round 2 — lens "${args.own_lens_id}"`,
180
+ "",
181
+ "Round 1 에서 모든 lens 가 재평가를 마쳤습니다. 아래는 round 1 응답",
182
+ "전체입니다 (당신의 응답 포함). 이제 round 2 에서 다음을 수행하세요:",
183
+ "",
184
+ "1. **수렴 가능 지점**: 여러 lens 가 round 1 에서 일치한 판단을 식별.",
185
+ "2. **지속적 이견**: round 1 이후에도 해소되지 않는 충돌을 식별.",
186
+ " 이견은 숨기지 말고 명시하세요 — synthesizer 는 이견을 있는 그대로",
187
+ " 표상하는 것이 소거하는 것보다 낫습니다.",
188
+ "3. **최종 입장**: 당신의 lens 관점 최종 입장 (round 1 → 2 변화 유무 포함).",
189
+ "",
190
+ "# Round 1 응답 전체",
191
+ "",
192
+ blocks,
193
+ "",
194
+ "# 응답 형식 (markdown, 500 단어 이내)",
195
+ "",
196
+ "```",
197
+ "## 수렴 요약",
198
+ "<모든 lens 가 동의한 판단; bullet>",
199
+ "",
200
+ "## 지속적 이견",
201
+ "<다음 포맷으로 각 이견 항목>",
202
+ "- **이견 항목**: <짧은 제목>",
203
+ " - 당신의 입장: <...>",
204
+ " - 반대 입장 (lens X): <...>",
205
+ " - 해소 경로 (있다면): <...>",
206
+ "",
207
+ "## 최종 입장",
208
+ "<당신의 lens 관점에서 round 1 → 2 를 거친 최종 결론>",
209
+ "```",
210
+ "",
211
+ "이 응답을 당신의 round 2 deliberation artifact 파일에 기록하세요.",
212
+ ].join("\n");
213
+ }
214
+ // ---------------------------------------------------------------------------
215
+ // Artifact read/write
216
+ // ---------------------------------------------------------------------------
217
+ /**
218
+ * Compute the path for a given round + lens deliberation artifact.
219
+ * Pure function so tests can assert without filesystem side effects.
220
+ */
221
+ export function deliberationArtifactPath(deliberation_dir, round, lens_id) {
222
+ return path.join(deliberation_dir, `round${round}`, `${lens_id}-deliberation.md`);
223
+ }
224
+ /**
225
+ * Write a deliberation artifact to disk, creating parent directories.
226
+ * Returns the absolute path written.
227
+ */
228
+ export async function writeDeliberationArtifact(deliberation_dir, round, lens_id, content) {
229
+ const filePath = deliberationArtifactPath(deliberation_dir, round, lens_id);
230
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
231
+ await fs.writeFile(filePath, content, "utf8");
232
+ return filePath;
233
+ }
234
+ /**
235
+ * Read a deliberation artifact. Returns `null` when the file does not
236
+ * exist (not an error — synthesize step decides whether absence is
237
+ * acceptable for a given lens / round pair).
238
+ */
239
+ export async function readDeliberationArtifact(deliberation_dir, round, lens_id) {
240
+ const filePath = deliberationArtifactPath(deliberation_dir, round, lens_id);
241
+ try {
242
+ return await fs.readFile(filePath, "utf8");
243
+ }
244
+ catch (err) {
245
+ const code = err.code;
246
+ if (code === "ENOENT")
247
+ return null;
248
+ throw err;
249
+ }
250
+ }
251
+ const DISAGREEMENT_HEADING_PATTERNS = [
252
+ /^##\s+지속적\s*이견\s*$/m,
253
+ /^##\s+Persistent\s+Disagreements?\s*$/im,
254
+ ];
255
+ const ITEM_PREFIX = /^-\s+\*\*이견\s*항목\*\*\s*:\s*(.+?)\s*$/;
256
+ /**
257
+ * Parse round-2 artifacts for a "지속적 이견" section and extract each
258
+ * bullet labelled `**이견 항목**`. Other bullet content up to the next
259
+ * `- **이견 항목**` entry (or end of section / next `##`) is captured
260
+ * as body.
261
+ *
262
+ * Unknown / missing section → empty array. Lenient parsing by design:
263
+ * lens agents may vary the exact punctuation.
264
+ */
265
+ export function extractDisagreements(round2_artifacts) {
266
+ const out = [];
267
+ for (const artifact of round2_artifacts) {
268
+ const sectionContent = extractSection(artifact.content);
269
+ if (!sectionContent)
270
+ continue;
271
+ const items = splitDisagreementItems(sectionContent);
272
+ for (const item of items) {
273
+ out.push({
274
+ source_lens_id: artifact.lens_id,
275
+ title: item.title,
276
+ body: item.body,
277
+ });
278
+ }
279
+ }
280
+ return out;
281
+ }
282
+ function extractSection(content) {
283
+ for (const pattern of DISAGREEMENT_HEADING_PATTERNS) {
284
+ const match = content.match(pattern);
285
+ if (!match)
286
+ continue;
287
+ const start = match.index;
288
+ if (typeof start !== "number")
289
+ continue;
290
+ const after = content.slice(start + match[0].length);
291
+ // Cut at the next ## heading, if any.
292
+ const nextHeading = after.search(/^##\s+/m);
293
+ const section = nextHeading >= 0 ? after.slice(0, nextHeading) : after;
294
+ return section.trim();
295
+ }
296
+ return null;
297
+ }
298
+ function splitDisagreementItems(section) {
299
+ const items = [];
300
+ const lines = section.split("\n");
301
+ let current = null;
302
+ for (const line of lines) {
303
+ const match = line.match(ITEM_PREFIX);
304
+ if (match) {
305
+ if (current) {
306
+ items.push({ title: current.title, body: current.bodyLines.join("\n").trim() });
307
+ }
308
+ current = { title: match[1], bodyLines: [] };
309
+ continue;
310
+ }
311
+ if (current) {
312
+ current.bodyLines.push(line);
313
+ }
314
+ }
315
+ if (current) {
316
+ items.push({ title: current.title, body: current.bodyLines.join("\n").trim() });
317
+ }
318
+ return items;
319
+ }
320
+ // ---------------------------------------------------------------------------
321
+ // Deliberation plan builder
322
+ // ---------------------------------------------------------------------------
323
+ /**
324
+ * Build the step-by-step plan the coordinator follows. Pure — no
325
+ * filesystem or spawn calls. Useful for logging / artifact recording
326
+ * before the coordinator begins Claude-tool invocations.
327
+ *
328
+ * Round 1 steps are emitted first (one per lens), then round 2 (if
329
+ * requested). Step ordering within a round is stable (matches
330
+ * `input.lenses` order).
331
+ */
332
+ export function buildDeliberationPlan(input, round1ContentBuilder, round2ContentBuilder) {
333
+ const steps = [];
334
+ for (const lens of input.lenses) {
335
+ const others = input.lenses.filter((l) => l.lens_id !== lens.lens_id);
336
+ steps.push({
337
+ round: 1,
338
+ lens_id: lens.lens_id,
339
+ prompt: round1ContentBuilder(lens, others),
340
+ artifact_path: deliberationArtifactPath(input.deliberation_dir, 1, lens.lens_id),
341
+ });
342
+ }
343
+ if (input.rounds >= 2 && round2ContentBuilder) {
344
+ for (const lens of input.lenses) {
345
+ const others = input.lenses.filter((l) => l.lens_id !== lens.lens_id);
346
+ steps.push({
347
+ round: 2,
348
+ lens_id: lens.lens_id,
349
+ prompt: round2ContentBuilder(lens, others),
350
+ artifact_path: deliberationArtifactPath(input.deliberation_dir, 2, lens.lens_id),
351
+ });
352
+ }
353
+ }
354
+ return {
355
+ steps,
356
+ all_artifact_paths: steps.map((s) => s.artifact_path),
357
+ };
358
+ }
359
+ /**
360
+ * Produce the deliberation plan after verifying opt-in and reading lens
361
+ * primary outputs. Does NOT invoke `TeamCreate` or `SendMessage` itself
362
+ * — those are Claude tools the coordinator agent invokes. The returned
363
+ * plan contains fully-formed prompts and target artifact paths.
364
+ *
365
+ * This separation keeps the TS test harness deterministic without needing
366
+ * Claude Code runtime access: TS builds prompts + schema, Claude agent
367
+ * executes tool calls.
368
+ */
369
+ export async function runLensAgentDeliberation(args) {
370
+ requireDeliberationOptIn(args.ontoConfig, args.env ?? process.env);
371
+ const read = args.readPrimary ?? (async (p) => fs.readFile(p, "utf8"));
372
+ const primaryBodies = await Promise.all(args.input.lenses.map(async (lens) => ({
373
+ lens_id: lens.lens_id,
374
+ content: await read(lens.output_path),
375
+ })));
376
+ const bodyByLens = new Map(primaryBodies.map((p) => [p.lens_id, p.content]));
377
+ const round1Builder = (own, others) => {
378
+ const otherOutputs = others.map((o) => ({
379
+ lens_id: o.lens_id,
380
+ content: bodyByLens.get(o.lens_id) ?? "",
381
+ }));
382
+ const ownSummary = summarizeFirstParagraph(bodyByLens.get(own.lens_id) ?? "");
383
+ return buildDeliberationRound1Prompt({
384
+ own_lens_id: own.lens_id,
385
+ own_output_summary: ownSummary,
386
+ other_lens_outputs: otherOutputs,
387
+ });
388
+ };
389
+ const round2Builder = (own, _others) => {
390
+ // Round 2 prompt is built lazily (it depends on round-1 responses
391
+ // that don't yet exist at plan-build time). For the plan, we emit
392
+ // a PLACEHOLDER that the coordinator replaces with actual round-1
393
+ // responses read from disk once round 1 completes.
394
+ return buildDeliberationRound2Prompt({
395
+ own_lens_id: own.lens_id,
396
+ round1_responses: [
397
+ {
398
+ lens_id: "<placeholder>",
399
+ content: "[coordinator-replace-at-runtime]: round 1 artifacts 를 읽어 모든 lens 의 응답을 여기에 삽입.",
400
+ },
401
+ ],
402
+ });
403
+ };
404
+ return buildDeliberationPlan(args.input, round1Builder, args.input.rounds >= 2 ? round2Builder : undefined);
405
+ }
406
+ function summarizeFirstParagraph(content) {
407
+ const paragraphs = content.split(/\n\s*\n/);
408
+ const first = paragraphs[0]?.trim() ?? "";
409
+ if (first.length <= 140)
410
+ return first;
411
+ return first.slice(0, 137) + "...";
412
+ }