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,307 @@
1
+ /**
2
+ * Phase 3 Promote — Phase A Orchestrator (Step 10a).
3
+ *
4
+ * Design authority:
5
+ * - learn-phase3-design-v9.md DD-1 (2-Phase + strict source-read-only Phase A)
6
+ * - learn-phase3-design-v5.md §1.3 Phase A canonical sequence
7
+ * - learn-phase3-design-v5.md DD-13/DD-19 (P-14 audit ordering + lineage)
8
+ * - .onto/processes/learn/promote.md Step 1~9
9
+ *
10
+ * Responsibility:
11
+ * - Strict source-read-only orchestration of Phase A:
12
+ * 1. Collect (collector.ts) — produces CollectionResult per DD-18 §SST
13
+ * 2. Pre-analysis (placeholder for P-3 exact / P-4 semantic dedup —
14
+ * structural no-op; the panel evaluates criterion 5 inline)
15
+ * 3. Panel review (panel-reviewer.ts) — DD-2 + DD-7 + DD-12 hard gate
16
+ * 4. Cross-agent dedup discovery (criterion 6, LLM-driven with
17
+ * Jaccard pre-filter + union-find + same-principle test)
18
+ * 5. Carry-forward processing on AuditState (DD-17)
19
+ * 6. Judgment audit P-14 (judgment-auditor.ts) — DD-13 + DD-17
20
+ * 7. Retirement analysis (retirement.ts) — DD-6
21
+ * 8. Domain doc candidate identification (domain-doc-proposer.ts) —
22
+ * DD-19 Phase A part
23
+ * 9. Health snapshot (health-snapshot.ts) — promote.md §9
24
+ * 10. Persist PromoteReport via REGISTRY
25
+ * 11. Persist mutated AuditState (carry-forward + transitions)
26
+ *
27
+ * - Returns the assembled PromoteReport so the CLI can present it.
28
+ *
29
+ * Scope boundary:
30
+ * - NO mutation to learning files. The only persisted writes are:
31
+ * - promote-report.json (PromoteReport)
32
+ * - audit-state.yaml (AuditObligation transitions from carry-forward
33
+ * and P-14 lifecycle)
34
+ * Both are control artifacts, not user-facing learning content.
35
+ *
36
+ * Failure model:
37
+ * - Collector never throws; parse_errors are surfaced in
38
+ * PromoteReport.warnings.
39
+ * - Panel review can produce degraded states (member_unreachable,
40
+ * panel_contract_invalid, panel_minimum_unmet) — collected but Phase A
41
+ * does NOT abort on them. Phase B's gate is the hard gate.
42
+ * - Audit failures route through obligation lifecycle transitions.
43
+ */
44
+ import fs from "node:fs";
45
+ import os from "node:os";
46
+ import path from "node:path";
47
+ import { REGISTRY } from "../shared/artifact-registry.js";
48
+ import { loadAuditState, saveAuditState, processCarryForward, } from "../shared/audit-state.js";
49
+ import { collect } from "./collector.js";
50
+ import { reviewPanel, discoverCrossAgentDedupClusters, candidateIdOf, } from "./panel-reviewer.js";
51
+ import { runJudgmentAudit, DEFAULT_AUDIT_POLICY, } from "./judgment-auditor.js";
52
+ import { identifyRetirementCandidates } from "./retirement.js";
53
+ import { identifyDomainDocCandidates } from "./domain-doc-proposer.js";
54
+ import { buildHealthSnapshot } from "./health-snapshot.js";
55
+ // ---------------------------------------------------------------------------
56
+ // Path resolution
57
+ // ---------------------------------------------------------------------------
58
+ function resolveSessionRoot(config) {
59
+ if (config.sessionRoot)
60
+ return config.sessionRoot;
61
+ return path.join(config.projectRoot, ".onto", "sessions", "promote", config.sessionId);
62
+ }
63
+ function resolveAuditStatePath(config) {
64
+ if (config.auditStatePath)
65
+ return config.auditStatePath;
66
+ const home = config.ontoHome ?? path.join(os.homedir(), ".onto");
67
+ return path.join(home, "audit-state.yaml");
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // Pre-analysis (P-3 exact dedup, P-4 semantic dedup) — intentionally empty
71
+ // ---------------------------------------------------------------------------
72
+ /**
73
+ * Pre-analysis pass — intentionally returns no results.
74
+ *
75
+ * The full design included P-3 (exact dedup) and P-4 (semantic dedup) before
76
+ * panel review, but measurement showed that the panel's criterion 5 already
77
+ * catches the same cases. Running a separate pre-analysis layer would create
78
+ * two LLM call paths for the same axis with no coverage gain. Keeping the
79
+ * function as an empty-result adapter rather than deleting it preserves the
80
+ * §1~§9 step numbering documented in .onto/processes/learn/promote.md and leaves a named
81
+ * extension point for a future cheap-dedup pass if measurement ever proves
82
+ * the panel is too expensive for this axis.
83
+ */
84
+ function runPreAnalysis() {
85
+ return [];
86
+ }
87
+ // ---------------------------------------------------------------------------
88
+ // Phase A entry point
89
+ // ---------------------------------------------------------------------------
90
+ export async function runPromoter(config) {
91
+ const sessionRoot = resolveSessionRoot(config);
92
+ const auditStatePath = resolveAuditStatePath(config);
93
+ fs.mkdirSync(sessionRoot, { recursive: true });
94
+ // -------------------------------------------------------------------------
95
+ // Step 1: Collect — DD-18 §SST canonical seats
96
+ // -------------------------------------------------------------------------
97
+ const collection = collect({
98
+ mode: config.mode,
99
+ projectRoot: config.projectRoot,
100
+ });
101
+ const warnings = [];
102
+ if (collection.parse_errors.length > 0) {
103
+ warnings.push(`${collection.parse_errors.length} learning lines failed to parse — ` +
104
+ `see parse_errors. These items are excluded from this session.`);
105
+ }
106
+ // -------------------------------------------------------------------------
107
+ // Step 2: Pre-analysis (stub)
108
+ // -------------------------------------------------------------------------
109
+ const pre_analysis = runPreAnalysis();
110
+ // -------------------------------------------------------------------------
111
+ // Step 3: Panel review — DD-2 + DD-7 + DD-12
112
+ // -------------------------------------------------------------------------
113
+ let panelVerdicts = [];
114
+ let degradedFromPanel = [];
115
+ if (!config.skipPanel && collection.candidate_items.length > 0) {
116
+ const panelResult = await reviewPanel({
117
+ candidates: collection.candidate_items,
118
+ globalItems: collection.global_items,
119
+ ...(config.ontoHome !== undefined ? { ontoHome: config.ontoHome } : {}),
120
+ ...(config.modelId !== undefined ? { modelId: config.modelId } : {}),
121
+ });
122
+ panelVerdicts = panelResult.verdicts;
123
+ degradedFromPanel = panelResult.degraded_states;
124
+ }
125
+ else if (config.skipPanel) {
126
+ warnings.push("Panel review skipped (skipPanel=true). " +
127
+ "PromoteReport contains zero panel_verdicts.");
128
+ }
129
+ // -------------------------------------------------------------------------
130
+ // Step 4: Cross-agent dedup (criterion 6) — LLM-driven
131
+ // -------------------------------------------------------------------------
132
+ // Discovery runs only when the panel also ran AND there are candidate
133
+ // items (U1 fix: criterion 6 inspects candidate-vs-global + cross-candidate
134
+ // principle duplication. With zero candidates there is nothing to evaluate,
135
+ // even if global_items is populated — running the LLM on a global-only pool
136
+ // would burn cost without producing actionable clusters.)
137
+ //
138
+ // Bounded loss metrics (C4) are captured regardless of whether clusters
139
+ // were emitted and surfaced as warnings so the report never looks more
140
+ // complete than the actual work performed.
141
+ let cross_agent_dedup_clusters = [];
142
+ if (!config.skipPanel && collection.candidate_items.length > 0) {
143
+ const discovery = await discoverCrossAgentDedupClusters(collection.candidate_items, collection.global_items, config.modelId !== undefined ? { modelId: config.modelId } : {});
144
+ cross_agent_dedup_clusters = discovery.clusters;
145
+ // C4: surface bounded-loss signals as warnings. Each channel surfaces
146
+ // a human-readable line so report consumers see what was dropped.
147
+ const m = discovery.metrics;
148
+ if (m.shortlists_cap_dropped_count > 0) {
149
+ warnings.push(`cross_agent_dedup: ${m.shortlists_cap_dropped_count} valid shortlist(s) ` +
150
+ `dropped because total exceeded MAX_SHORTLISTS_PER_RUN cap.`);
151
+ }
152
+ if (m.shortlists_truncated_count > 0) {
153
+ warnings.push(`cross_agent_dedup: ${m.shortlists_truncated_count} shortlist(s) truncated ` +
154
+ `(${m.members_truncated_total} total member(s) removed) by MAX_ITEMS_PER_SHORTLIST cap.`);
155
+ }
156
+ const totalLlmFailures = m.llm_failures.provider_error +
157
+ m.llm_failures.malformed_json +
158
+ m.llm_failures.missing_field +
159
+ m.llm_failures.primary_owner_not_in_shortlist;
160
+ if (totalLlmFailures > 0) {
161
+ warnings.push(`cross_agent_dedup: ${totalLlmFailures} shortlist(s) dropped due to LLM failures ` +
162
+ `(provider_error=${m.llm_failures.provider_error}, malformed_json=${m.llm_failures.malformed_json}, ` +
163
+ `missing_field=${m.llm_failures.missing_field}, primary_owner_not_in_shortlist=${m.llm_failures.primary_owner_not_in_shortlist}).`);
164
+ }
165
+ // UF2: same_principle_rejected is not a failure but operators may still
166
+ // want to see the count for calibration — surface it as an info-tier
167
+ // warning when non-zero.
168
+ if (m.same_principle_rejected > 0) {
169
+ warnings.push(`cross_agent_dedup: ${m.same_principle_rejected} shortlist(s) returned ` +
170
+ `same_principle=false (not the same principle — valid negative classification).`);
171
+ }
172
+ }
173
+ // -------------------------------------------------------------------------
174
+ // Step 5: Audit-state carry-forward + Step 6: P-14 judgment audit
175
+ // -------------------------------------------------------------------------
176
+ let auditState = loadAuditState(auditStatePath);
177
+ auditState = processCarryForward(auditState, config.sessionId);
178
+ let auditOutcomes = {
179
+ policy: config.auditPolicy ?? DEFAULT_AUDIT_POLICY,
180
+ obligations_processed: [],
181
+ eligibility: [],
182
+ execution: { audited_agents: [], audited_items_count: 0, llm_calls: 0 },
183
+ outcomes: { retain: 0, modify: 0, delete: 0, audit_to_conflict_proposal: 0 },
184
+ failed_agents: [],
185
+ };
186
+ const auditConflictProposals = [];
187
+ if (!config.skipAudit) {
188
+ const auditResult = await runJudgmentAudit({
189
+ globalItems: collection.global_items,
190
+ state: auditState,
191
+ sessionId: config.sessionId,
192
+ ...(config.auditPolicy !== undefined
193
+ ? { policy: config.auditPolicy }
194
+ : {}),
195
+ ...(config.modelId !== undefined ? { modelId: config.modelId } : {}),
196
+ });
197
+ auditOutcomes = auditResult.summary;
198
+ // DD-19 lineage: audit_to_conflict_proposal outcomes flow into
199
+ // ConflictProposal[] with origin="judgment_audit" + obligation linkage.
200
+ for (const outcome of auditResult.outcomes) {
201
+ if (outcome.decision !== "audit_to_conflict_proposal")
202
+ continue;
203
+ auditConflictProposals.push({
204
+ source_session_id: config.sessionId,
205
+ lens_id: outcome.agent_id,
206
+ new_item_line: outcome.item.raw_line,
207
+ matched_existing_line: outcome.item.raw_line,
208
+ decision: "conflict_propose_keep",
209
+ conflict_kind: "contradiction",
210
+ reason: outcome.reason,
211
+ });
212
+ }
213
+ }
214
+ else {
215
+ warnings.push("Judgment audit skipped (skipAudit=true).");
216
+ }
217
+ // -------------------------------------------------------------------------
218
+ // Step 7: Retirement analysis — DD-6
219
+ // -------------------------------------------------------------------------
220
+ // W-C-06 scope 명시: retirement 는 GLOBAL scope 대상 (promoted items).
221
+ // panel_verdicts (Step 3~6) 는 PROJECT scope 대상. 두 signal 의 scope 가 다름은 의도적.
222
+ const retirement_candidates = identifyRetirementCandidates(collection.global_items);
223
+ // -------------------------------------------------------------------------
224
+ // Step 8: Domain doc candidates — DD-19 Phase A part
225
+ // -------------------------------------------------------------------------
226
+ const domain_doc_candidates = identifyDomainDocCandidates(panelVerdicts);
227
+ // -------------------------------------------------------------------------
228
+ // Step 9: Health snapshot — promote.md §9
229
+ // -------------------------------------------------------------------------
230
+ const health_snapshot = buildHealthSnapshot({
231
+ globalItems: collection.global_items,
232
+ panelVerdicts,
233
+ retirementCandidates: retirement_candidates,
234
+ crossAgentDedupClusters: cross_agent_dedup_clusters,
235
+ extras: {
236
+ axis_tag_re_evaluation_changes_this_session: countAxisTagChanges(panelVerdicts),
237
+ creation_gate_failures: collection.global_items.filter((item) => item.raw_line.includes("tag-incomplete")).length,
238
+ applied_learnings_aggregate: { yes: 0, no: 0 },
239
+ },
240
+ });
241
+ // -------------------------------------------------------------------------
242
+ // Step 10: Build PromoteReport
243
+ // -------------------------------------------------------------------------
244
+ const generated_at = new Date().toISOString();
245
+ // ConflictProposal[] is audit-derived only. The collector does not produce
246
+ // conflict proposals on its own — Phase 2 ConflictProposal merging lives in
247
+ // the extraction pipeline, not the Phase 3 collector. All entries here come
248
+ // from the judgment-auditor's audit_to_conflict_proposal outcomes.
249
+ const conflict_proposals = auditConflictProposals;
250
+ const report = {
251
+ schema_version: "2",
252
+ session_id: config.sessionId,
253
+ generated_at,
254
+ mode: config.mode,
255
+ collection,
256
+ pre_analysis,
257
+ panel_verdicts: panelVerdicts,
258
+ cross_agent_dedup_clusters,
259
+ audit_summary: auditOutcomes,
260
+ retirement_candidates,
261
+ conflict_proposals,
262
+ domain_doc_candidates,
263
+ health_snapshot,
264
+ degraded_states: degradedFromPanel,
265
+ warnings,
266
+ };
267
+ // -------------------------------------------------------------------------
268
+ // Step 11: Persist via REGISTRY
269
+ // -------------------------------------------------------------------------
270
+ const reportPath = path.join(sessionRoot, "promote-report.json");
271
+ REGISTRY.saveToFile("promote_report", reportPath, report);
272
+ // Persist the mutated audit state (carry-forward + P-14 transitions). The
273
+ // ledger lives outside the session root because it's the canonical
274
+ // cross-session truth (DD-17 SYN-UF-03).
275
+ saveAuditState(auditState, auditStatePath);
276
+ return {
277
+ report,
278
+ reportPath,
279
+ auditStatePath,
280
+ sessionRoot,
281
+ };
282
+ }
283
+ // ---------------------------------------------------------------------------
284
+ // Helpers
285
+ // ---------------------------------------------------------------------------
286
+ /**
287
+ * Count panel verdicts whose axis_tag_recommendation differs from "retain".
288
+ *
289
+ * This is the per-session axis tag re-evaluation churn — promote.md §9
290
+ * exposes it so operators can spot taxonomies that are still settling.
291
+ */
292
+ function countAxisTagChanges(verdicts) {
293
+ let count = 0;
294
+ for (const v of verdicts) {
295
+ for (const r of v.member_reviews) {
296
+ if (r.axis_tag_recommendation !== "retain" &&
297
+ r.axis_tag_recommendation !== "no_recommendation") {
298
+ count += 1;
299
+ break; // count once per candidate
300
+ }
301
+ }
302
+ }
303
+ return count;
304
+ }
305
+ // Re-export for CLI consumers needing to compute candidate ids over a
306
+ // loaded report (e.g., to match a user's "promote 1,3" selection).
307
+ export { candidateIdOf };
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Phase 3 Promote — Retirement analyzer (Step 9a).
3
+ *
4
+ * Design authority:
5
+ * - learn-phase3-design-v2.md DD-6 (event marker 기반 퇴역)
6
+ * - .onto/processes/learn/promote.md Step 4a (event marker review)
7
+ *
8
+ * Responsibility:
9
+ * - Identify global learnings carrying 2+ event markers (`applied-then-found-invalid`)
10
+ * since the most recent `retention-confirmed` checkpoint, surface them as
11
+ * retirement candidates for the operator's Step 5 review.
12
+ *
13
+ * Scope:
14
+ * - Phase A only. No mutation. The actual retirement (file edits) happens
15
+ * in Phase B promote-executor with explicit decisions.
16
+ *
17
+ * Marker grammar (collector.ts emits the full comment text):
18
+ * <!-- applied-then-found-invalid: YYYY-MM-DD, <excerpt>, target:<learning_id> -->
19
+ * <!-- retention-confirmed: YYYY-MM-DD -->
20
+ *
21
+ * Cutoff rule (promote.md §4a):
22
+ * When `retention_confirmed_at` is set, only event markers with a date
23
+ * STRICTLY AFTER that timestamp are counted toward the 2+ threshold.
24
+ * Markers attached before retention-confirmed are considered already
25
+ * reviewed and explicitly retained.
26
+ */
27
+ // ---------------------------------------------------------------------------
28
+ // Constants
29
+ // ---------------------------------------------------------------------------
30
+ /** DD-6 minimum threshold. The design fixes this at 2 — see promote.md §4a. */
31
+ export const RETIREMENT_MARKER_THRESHOLD = 2;
32
+ const EVENT_MARKER_DATE_RE = /<!--\s*(?:applied-then-found-invalid|observed-obsolete):\s*(\d{4}-\d{2}-\d{2})/;
33
+ // ---------------------------------------------------------------------------
34
+ // Marker date parsing
35
+ // ---------------------------------------------------------------------------
36
+ /**
37
+ * Extract the YYYY-MM-DD prefix from an event marker comment string.
38
+ *
39
+ * Returns null when the marker text is malformed (no date prefix). The
40
+ * collector currently writes well-formed markers, but legacy items written by
41
+ * humans before Phase 2 may have looser shapes — those are dropped from the
42
+ * count rather than triggering an error.
43
+ */
44
+ function parseMarkerDate(markerText) {
45
+ const m = markerText.match(EVENT_MARKER_DATE_RE);
46
+ return m ? m[1] : null;
47
+ }
48
+ /**
49
+ * Compare two ISO date strings (YYYY-MM-DD). Lexicographic == chronological.
50
+ */
51
+ function isStrictlyAfter(date, cutoff) {
52
+ return date > cutoff;
53
+ }
54
+ function analyzeItemMarkers(item) {
55
+ const countable = [];
56
+ const excluded = [];
57
+ const undated = [];
58
+ for (const marker of item.event_markers) {
59
+ const date = parseMarkerDate(marker);
60
+ if (date === null) {
61
+ undated.push(marker);
62
+ continue;
63
+ }
64
+ if (item.retention_confirmed_at !== null &&
65
+ !isStrictlyAfter(date, item.retention_confirmed_at)) {
66
+ excluded.push(marker);
67
+ continue;
68
+ }
69
+ countable.push(marker);
70
+ }
71
+ return {
72
+ countable,
73
+ excluded_by_retention: excluded,
74
+ undated,
75
+ };
76
+ }
77
+ /**
78
+ * Identify retirement candidates from a global item pool.
79
+ *
80
+ * Input is the global slice of CollectionResult (`global_items`). Project
81
+ * items are excluded because retirement targets already-promoted learnings.
82
+ * The promote.md §4a wording explicitly limits this to global learnings.
83
+ *
84
+ * Returns one candidate per item that crossed the threshold. The reason
85
+ * string is human-readable so the operator can decide without re-running
86
+ * analysis. Marker counts are exposed in `marker_count` so a downstream
87
+ * UI can sort by severity.
88
+ */
89
+ export function identifyRetirementCandidates(globalItems, config = {}) {
90
+ const threshold = config.threshold ?? RETIREMENT_MARKER_THRESHOLD;
91
+ const candidates = [];
92
+ for (const item of globalItems) {
93
+ if (item.event_markers.length === 0)
94
+ continue;
95
+ const analysis = analyzeItemMarkers(item);
96
+ if (analysis.countable.length < threshold)
97
+ continue;
98
+ const reasonParts = [
99
+ `${analysis.countable.length} event marker(s) since` +
100
+ (item.retention_confirmed_at
101
+ ? ` retention-confirmed (${item.retention_confirmed_at})`
102
+ : " creation"),
103
+ ];
104
+ if (analysis.excluded_by_retention.length > 0) {
105
+ reasonParts.push(`${analysis.excluded_by_retention.length} marker(s) excluded by retention-confirmed cutoff`);
106
+ }
107
+ if (analysis.undated.length > 0) {
108
+ reasonParts.push(`${analysis.undated.length} undated marker(s) ignored`);
109
+ }
110
+ candidates.push({
111
+ item,
112
+ marker_count: analysis.countable.length,
113
+ markers: analysis.countable,
114
+ retention_confirmed_at: item.retention_confirmed_at,
115
+ reason: reasonParts.join("; "),
116
+ });
117
+ }
118
+ // Sort by severity (highest marker_count first) so reviewers see hot spots
119
+ // at the top of the report.
120
+ candidates.sort((a, b) => b.marker_count - a.marker_count);
121
+ return candidates;
122
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Phase 3 Promote — Type definitions.
3
+ *
4
+ * Design authority:
5
+ * - learn-phase3-design-v9.md (final)
6
+ * - learn-phase3-design-v8.md (DD-1~DD-22 base)
7
+ * - learn-phase3-design-v7.md (DD-20/21/22 introduction)
8
+ * - learn-phase3-design-v6.md (DD-1~DD-19 body)
9
+ *
10
+ * This module is the canonical type seat for promote pipeline. Modules under
11
+ * src/core-runtime/learning/promote/ import their interfaces from here.
12
+ *
13
+ * Layering:
14
+ * - Phase A (source-read-only): collection → audit → panel review → report
15
+ * - Phase B (mutation): decisions → checkpoint → apply → state persist
16
+ *
17
+ * Naming convention:
18
+ * - kind: discriminator on union types (e.g., "promote" | "reclassify-insights")
19
+ * - schema_version: persisted artifact version (DD-20)
20
+ * - attempt_id: ULID, unique per Phase B attempt (DD-22)
21
+ * - generation: monotonic within an attempt (DD-22)
22
+ */
23
+ export {};
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Prompt section renderers for Phase 2 — §1.6 Newly Learned + §1.7 Event Markers.
3
+ *
4
+ * Injected into lens prompt packets when extract mode is shadow or active.
5
+ * CON-4 해소: Phase 2 배포 시 주입 시작.
6
+ */
7
+ /**
8
+ * §1.6: Newly Learned prompt instructions.
9
+ * Tells the LLM how to output new learnings in structured format.
10
+ */
11
+ export function renderNewlyLearnedInstructions(sessionDomain) {
12
+ const domainExample = sessionDomain && sessionDomain !== "none" && sessionDomain !== "@-"
13
+ ? `domain/${sessionDomain}`
14
+ : "domain/{name}";
15
+ return `
16
+ ## Learning Extraction
17
+
18
+ After completing your review, include a "### Newly Learned" section at the end of your output.
19
+
20
+ ### Newly Learned
21
+ - [{fact|judgment}] [methodology|${domainExample}]+ [{guardrail|foundation|convention}]? {content} [impact:{high|normal}]
22
+
23
+ Rules:
24
+ - type is required: fact (objective) or judgment (subjective assessment)
25
+ - applicability: at least one tag. Use [methodology] for cross-domain learnings, [${domainExample}] for domain-specific
26
+ - role is optional: [guardrail] for safety/correctness rules, [foundation] for core principles, [convention] for style/naming
27
+ - For guardrail items, include: **Situation**: ... **Result**: ... **Corrective action**: ...
28
+ - impact: [impact:high] for critical learnings, [impact:normal] for standard
29
+ - source metadata is automatically added by the system. Do NOT write (source: ...) yourself
30
+ - If you have no new learnings: write "- none"
31
+
32
+ PROHIBITION: Do NOT write to learning files directly.
33
+ Write learnings ONLY in the ### Newly Learned section of your output.
34
+ The extraction pipeline will process and store them.
35
+ Do NOT use the Write tool on any file under .onto/learnings/.`;
36
+ }
37
+ /**
38
+ * §1.7: Event Marker prompt instructions.
39
+ * Tells the LLM how to report problematic applied learnings.
40
+ */
41
+ export function renderEventMarkerInstructions() {
42
+ return `
43
+ ### Applied Learnings — Event Markers
44
+
45
+ If during your review you applied a prior learning and found it to be harmful or incorrect, report it here:
46
+ - marker: applied-then-found-invalid
47
+ - learning_excerpt: <identifiable excerpt from the learning>
48
+ - reason: <why the learning was harmful or incorrect>
49
+
50
+ If no markers to report, omit this section entirely.`;
51
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Built-in artifact spec registration — DD-20.
3
+ *
4
+ * Importing this module wires the registrar into REGISTRY. The registrar runs
5
+ * lazily on first REGISTRY use. Other modules import this once at process
6
+ * entry to ensure REGISTRY can resolve canonical kinds.
7
+ *
8
+ * Why a separate module:
9
+ * - Breaks the import cycle (registry needs init, init imports specs,
10
+ * specs need registry types).
11
+ * - Allows tests to swap in alternative spec sets via __resetForTest +
12
+ * manual register() calls without re-running this module.
13
+ */
14
+ import { REGISTRY } from "./artifact-registry.js";
15
+ import { PromoteReportSpec } from "./specs/promote-report-spec.js";
16
+ import { AuditStateSpec } from "./specs/audit-state-spec.js";
17
+ import { EmergencyLogSpec } from "./specs/emergency-log-spec.js";
18
+ import { LayoutVersionSpec } from "./specs/layout-version-spec.js";
19
+ import { RestoreManifestSpec } from "./specs/restore-manifest-spec.js";
20
+ import { PruneLogSpec } from "./specs/prune-log-spec.js";
21
+ import { ApplyExecutionStateSpec } from "./specs/apply-execution-state-spec.js";
22
+ import { BackupMetadataSpec } from "./specs/backup-metadata-spec.js";
23
+ import { PromoteDecisionsSpec } from "./specs/promote-decisions-spec.js";
24
+ import { RecoveryResolutionSpec } from "./specs/recovery-resolution-spec.js";
25
+ REGISTRY.setBuiltinRegistrar(() => {
26
+ REGISTRY.register(PromoteReportSpec);
27
+ REGISTRY.register(AuditStateSpec);
28
+ REGISTRY.register(EmergencyLogSpec);
29
+ REGISTRY.register(LayoutVersionSpec);
30
+ REGISTRY.register(RestoreManifestSpec);
31
+ REGISTRY.register(PruneLogSpec);
32
+ REGISTRY.register(ApplyExecutionStateSpec);
33
+ REGISTRY.register(BackupMetadataSpec);
34
+ REGISTRY.register(PromoteDecisionsSpec);
35
+ REGISTRY.register(RecoveryResolutionSpec);
36
+ });
37
+ /**
38
+ * Convenience for tests and explicit init paths. Idempotent: the registrar
39
+ * itself is idempotent inside the registry.
40
+ */
41
+ export function ensureRegistryReady() {
42
+ // Touching REGISTRY.listRegistered() forces ensureInitialized() without
43
+ // requiring a real artifact load.
44
+ REGISTRY.listRegistered();
45
+ }