kibi-cli 1.0.1 → 2.1.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 (548) hide show
  1. package/dist/cli-errors.d.ts +3 -1
  2. package/dist/cli-errors.d.ts.map +1 -1
  3. package/dist/cli-errors.js +4 -1
  4. package/dist/cli-json-command.d.ts +1 -0
  5. package/dist/cli-json-command.d.ts.map +1 -1
  6. package/dist/cli-json-command.js +13 -4
  7. package/dist/cli-operation-loader.js +3 -3
  8. package/dist/cli-operation-metadata.d.ts +4 -3
  9. package/dist/cli-operation-metadata.d.ts.map +1 -1
  10. package/dist/cli-operation-metadata.js +7 -5
  11. package/dist/cli-protocol.js +1 -1
  12. package/dist/cli-register-maintenance.d.ts.map +1 -1
  13. package/dist/cli-register-maintenance.js +7 -0
  14. package/dist/cli-register-proof.d.ts +3 -0
  15. package/dist/cli-register-proof.d.ts.map +1 -0
  16. package/dist/cli-register-proof.js +127 -0
  17. package/dist/cli-register-reporting.d.ts.map +1 -1
  18. package/dist/cli-register-reporting.js +7 -0
  19. package/dist/cli.d.ts +4 -0
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +19 -10
  22. package/dist/commands/branch.d.ts +1 -0
  23. package/dist/commands/branch.d.ts.map +1 -1
  24. package/dist/commands/branch.js +8 -4
  25. package/dist/commands/check-generated.d.ts +7 -0
  26. package/dist/commands/check-generated.d.ts.map +1 -0
  27. package/dist/commands/check-generated.js +192 -0
  28. package/dist/commands/check.d.ts +14 -0
  29. package/dist/commands/check.d.ts.map +1 -1
  30. package/dist/commands/check.js +193 -46
  31. package/dist/commands/coverage.d.ts +1 -0
  32. package/dist/commands/coverage.d.ts.map +1 -1
  33. package/dist/commands/coverage.js +6 -0
  34. package/dist/commands/doctor.d.ts +22 -0
  35. package/dist/commands/doctor.d.ts.map +1 -1
  36. package/dist/commands/doctor.js +170 -23
  37. package/dist/commands/engine.d.ts +12 -0
  38. package/dist/commands/engine.d.ts.map +1 -1
  39. package/dist/commands/engine.js +42 -0
  40. package/dist/commands/github-init.d.ts +1 -0
  41. package/dist/commands/github-init.d.ts.map +1 -1
  42. package/dist/commands/github-init.js +9 -5
  43. package/dist/commands/init-helpers.d.ts.map +1 -1
  44. package/dist/commands/init-helpers.js +49 -10
  45. package/dist/commands/migrate.d.ts +4 -0
  46. package/dist/commands/migrate.d.ts.map +1 -1
  47. package/dist/commands/migrate.js +7 -7
  48. package/dist/commands/proof-explain.d.ts +10 -0
  49. package/dist/commands/proof-explain.d.ts.map +1 -0
  50. package/dist/commands/proof-explain.js +45 -0
  51. package/dist/commands/proof-impact.d.ts +7 -0
  52. package/dist/commands/proof-impact.d.ts.map +1 -0
  53. package/dist/commands/proof-impact.js +39 -0
  54. package/dist/commands/proof-migrate-legacy.d.ts +7 -0
  55. package/dist/commands/proof-migrate-legacy.d.ts.map +1 -0
  56. package/dist/commands/proof-migrate-legacy.js +45 -0
  57. package/dist/commands/proof-prune.d.ts +8 -0
  58. package/dist/commands/proof-prune.d.ts.map +1 -0
  59. package/dist/commands/proof-prune.js +53 -0
  60. package/dist/commands/prove.d.ts +37 -0
  61. package/dist/commands/prove.d.ts.map +1 -0
  62. package/dist/commands/prove.js +470 -0
  63. package/dist/commands/report.d.ts.map +1 -1
  64. package/dist/commands/report.js +18 -3
  65. package/dist/commands/sync/discovery.d.ts +3 -0
  66. package/dist/commands/sync/discovery.d.ts.map +1 -1
  67. package/dist/commands/sync/discovery.js +36 -28
  68. package/dist/commands/sync/manifest.d.ts +2 -1
  69. package/dist/commands/sync/manifest.d.ts.map +1 -1
  70. package/dist/commands/sync/manifest.js +55 -21
  71. package/dist/commands/sync/persistence.d.ts +4 -1
  72. package/dist/commands/sync/persistence.d.ts.map +1 -1
  73. package/dist/commands/sync/persistence.js +31 -14
  74. package/dist/commands/sync/staging.d.ts +1 -0
  75. package/dist/commands/sync/staging.d.ts.map +1 -1
  76. package/dist/commands/sync/staging.js +5 -2
  77. package/dist/commands/sync/untracked-targets.d.ts +24 -0
  78. package/dist/commands/sync/untracked-targets.d.ts.map +1 -0
  79. package/dist/commands/sync/untracked-targets.js +108 -0
  80. package/dist/commands/sync.d.ts +11 -1
  81. package/dist/commands/sync.d.ts.map +1 -1
  82. package/dist/commands/sync.js +74 -30
  83. package/dist/engine-daemon.d.ts +3 -1
  84. package/dist/engine-daemon.d.ts.map +1 -1
  85. package/dist/engine-daemon.js +49 -20
  86. package/dist/engine.d.ts +17 -77
  87. package/dist/engine.d.ts.map +1 -1
  88. package/dist/engine.js +331 -91
  89. package/dist/env/bootstrap.d.ts +84 -0
  90. package/dist/env/bootstrap.d.ts.map +1 -0
  91. package/dist/env/bootstrap.js +310 -0
  92. package/dist/extractors/manifest.d.ts +5 -0
  93. package/dist/extractors/manifest.d.ts.map +1 -1
  94. package/dist/extractors/manifest.js +46 -1
  95. package/dist/extractors/markdown.d.ts +7 -3
  96. package/dist/extractors/markdown.d.ts.map +1 -1
  97. package/dist/extractors/markdown.js +60 -24
  98. package/dist/extractors/playwright-cases.js +1 -1
  99. package/dist/extractors/relationships.d.ts +6 -0
  100. package/dist/extractors/relationships.d.ts.map +1 -1
  101. package/dist/extractors/relationships.js +1 -1
  102. package/dist/extractors/symbol-coordinates.d.ts.map +1 -1
  103. package/dist/extractors/symbols-coordinator.d.ts +8 -0
  104. package/dist/extractors/symbols-coordinator.d.ts.map +1 -1
  105. package/dist/extractors/symbols-coordinator.js +40 -0
  106. package/dist/extractors/symbols-ts.d.ts +9 -19
  107. package/dist/extractors/symbols-ts.d.ts.map +1 -1
  108. package/dist/extractors/symbols-ts.js +34 -429
  109. package/dist/intent-search.d.ts +1 -0
  110. package/dist/intent-search.d.ts.map +1 -1
  111. package/dist/intent-search.js +11 -8
  112. package/dist/logic/ir.d.ts +1 -0
  113. package/dist/logic/ir.d.ts.map +1 -1
  114. package/dist/logic/ir.js +1 -1
  115. package/dist/operations/bootstrap/activation.d.ts +2 -1
  116. package/dist/operations/bootstrap/activation.d.ts.map +1 -1
  117. package/dist/operations/bootstrap/activation.js +11 -3
  118. package/dist/operations/bootstrap/generate.d.ts +2 -1
  119. package/dist/operations/bootstrap/generate.d.ts.map +1 -1
  120. package/dist/operations/bootstrap/generate.js +6 -3
  121. package/dist/operations/bootstrap/guidance.d.ts +1 -0
  122. package/dist/operations/bootstrap/guidance.d.ts.map +1 -1
  123. package/dist/operations/bootstrap/guidance.js +1 -1
  124. package/dist/operations/modeling/model-requirement.d.ts +5 -0
  125. package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
  126. package/dist/operations/modeling/model-requirement.js +57 -46
  127. package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -1
  128. package/dist/operations/modeling/predicate-applicability.js +103 -4
  129. package/dist/operations/modeling/predicate-catalog-2.d.ts.map +1 -1
  130. package/dist/operations/modeling/predicate-catalog-2.js +18 -2
  131. package/dist/operations/modeling/predicate-catalog-3.d.ts.map +1 -1
  132. package/dist/operations/modeling/predicate-catalog-3.js +17 -1
  133. package/dist/operations/modeling/predicate-catalog-5.d.ts +10 -0
  134. package/dist/operations/modeling/predicate-catalog-5.d.ts.map +1 -0
  135. package/dist/operations/modeling/predicate-catalog-5.js +291 -0
  136. package/dist/operations/modeling/predicate-catalog.d.ts.map +1 -1
  137. package/dist/operations/modeling/predicate-catalog.js +4 -0
  138. package/dist/operations/modeling/predicate-loader.d.ts +1 -0
  139. package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
  140. package/dist/operations/modeling/predicate-loader.js +4 -3
  141. package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
  142. package/dist/operations/modeling/predicate-ranker.js +4 -1
  143. package/dist/operations/modeling/predicate-types.d.ts +1 -1
  144. package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
  145. package/dist/operations/modeling/predicate-usage-hints-4.d.ts +3 -0
  146. package/dist/operations/modeling/predicate-usage-hints-4.d.ts.map +1 -0
  147. package/dist/operations/modeling/predicate-usage-hints-4.js +84 -0
  148. package/dist/operations/modeling/suggest-predicates.d.ts +4 -2
  149. package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
  150. package/dist/operations/modeling/suggest-predicates.js +82 -22
  151. package/dist/operations/mutation/contradictions.d.ts +2 -1
  152. package/dist/operations/mutation/contradictions.d.ts.map +1 -1
  153. package/dist/operations/mutation/contradictions.js +26 -5
  154. package/dist/operations/mutation/delete.d.ts +3 -0
  155. package/dist/operations/mutation/delete.d.ts.map +1 -1
  156. package/dist/operations/mutation/delete.js +100 -32
  157. package/dist/operations/mutation/relationships.d.ts +1 -0
  158. package/dist/operations/mutation/relationships.d.ts.map +1 -1
  159. package/dist/operations/mutation/relationships.js +6 -4
  160. package/dist/operations/mutation/saga.d.ts +51 -0
  161. package/dist/operations/mutation/saga.d.ts.map +1 -0
  162. package/dist/operations/mutation/saga.js +67 -0
  163. package/dist/operations/mutation/serialization.d.ts.map +1 -1
  164. package/dist/operations/mutation/serialization.js +3 -2
  165. package/dist/operations/mutation/source-authoring.d.ts +5 -1
  166. package/dist/operations/mutation/source-authoring.d.ts.map +1 -1
  167. package/dist/operations/mutation/source-authoring.js +79 -46
  168. package/dist/operations/mutation/strict-fact.d.ts +1 -0
  169. package/dist/operations/mutation/strict-fact.d.ts.map +1 -1
  170. package/dist/operations/mutation/strict-fact.js +8 -5
  171. package/dist/operations/mutation/symbol-compiler-lock.d.ts +5 -2
  172. package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -1
  173. package/dist/operations/mutation/symbol-compiler-lock.js +65 -2
  174. package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
  175. package/dist/operations/mutation/symbol-granularity.js +11 -89
  176. package/dist/operations/mutation/symbol-refresh.d.ts +1 -0
  177. package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
  178. package/dist/operations/mutation/symbol-refresh.js +10 -8
  179. package/dist/operations/mutation/upsert.d.ts +18 -2
  180. package/dist/operations/mutation/upsert.d.ts.map +1 -1
  181. package/dist/operations/mutation/upsert.js +86 -54
  182. package/dist/operations/mutation/validate-upsert.js +2 -2
  183. package/dist/operations/mutation/validation.d.ts.map +1 -1
  184. package/dist/operations/mutation/validation.js +46 -4
  185. package/dist/operations/mutation/warnings.d.ts +1 -0
  186. package/dist/operations/mutation/warnings.d.ts.map +1 -1
  187. package/dist/operations/mutation/warnings.js +7 -5
  188. package/dist/operations/mutation/workspace-mutation-lock.d.ts +60 -0
  189. package/dist/operations/mutation/workspace-mutation-lock.d.ts.map +1 -0
  190. package/dist/operations/mutation/workspace-mutation-lock.js +362 -0
  191. package/dist/operations/planning/apply-plan.d.ts +8 -106
  192. package/dist/operations/planning/apply-plan.d.ts.map +1 -1
  193. package/dist/operations/planning/apply-plan.js +113 -36
  194. package/dist/operations/planning/compile-intent.d.ts +51 -0
  195. package/dist/operations/planning/compile-intent.d.ts.map +1 -1
  196. package/dist/operations/planning/compile-intent.js +133 -17
  197. package/dist/operations/proof/baseline-diff.d.ts +41 -0
  198. package/dist/operations/proof/baseline-diff.d.ts.map +1 -0
  199. package/dist/operations/proof/baseline-diff.js +153 -0
  200. package/dist/operations/proof/explain.d.ts +75 -0
  201. package/dist/operations/proof/explain.d.ts.map +1 -0
  202. package/dist/operations/proof/explain.js +294 -0
  203. package/dist/operations/proof/impact.d.ts +45 -0
  204. package/dist/operations/proof/impact.d.ts.map +1 -0
  205. package/dist/operations/proof/impact.js +118 -0
  206. package/dist/operations/proof/ingest-proof.d.ts +34 -0
  207. package/dist/operations/proof/ingest-proof.d.ts.map +1 -0
  208. package/dist/operations/proof/ingest-proof.js +348 -0
  209. package/dist/operations/proof/migrate-legacy-receipts.d.ts +30 -0
  210. package/dist/operations/proof/migrate-legacy-receipts.d.ts.map +1 -0
  211. package/dist/operations/proof/migrate-legacy-receipts.js +92 -0
  212. package/dist/operations/proof/prune-receipts.d.ts +35 -0
  213. package/dist/operations/proof/prune-receipts.d.ts.map +1 -0
  214. package/dist/operations/proof/prune-receipts.js +91 -0
  215. package/dist/operations/proof/receipt-document.d.ts +29 -0
  216. package/dist/operations/proof/receipt-document.d.ts.map +1 -0
  217. package/dist/operations/proof/receipt-document.js +117 -0
  218. package/dist/operations/semantic-advisor/analysis-receipt.d.ts.map +1 -1
  219. package/dist/operations/semantic-advisor/analysis-receipt.js +3 -9
  220. package/dist/operations/semantic-advisor/analyze-prose.d.ts +1 -0
  221. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  222. package/dist/operations/semantic-advisor/analyze-prose.js +64 -93
  223. package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
  224. package/dist/operations/semantic-advisor/clauses.js +20 -7
  225. package/dist/operations/semantic-advisor/plugin-orchestration.d.ts +63 -0
  226. package/dist/operations/semantic-advisor/plugin-orchestration.d.ts.map +1 -0
  227. package/dist/operations/semantic-advisor/plugin-orchestration.js +489 -0
  228. package/dist/operations/semantic-advisor/predicate-rules-core.d.ts +15 -2
  229. package/dist/operations/semantic-advisor/predicate-rules-core.d.ts.map +1 -1
  230. package/dist/operations/semantic-advisor/predicate-rules-core.js +7 -140
  231. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts +11 -12
  232. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts.map +1 -1
  233. package/dist/operations/semantic-advisor/predicate-rules-launcher.js +6 -94
  234. package/dist/operations/semantic-advisor/predicate-rules-policy.d.ts +16 -0
  235. package/dist/operations/semantic-advisor/predicate-rules-policy.d.ts.map +1 -1
  236. package/dist/operations/semantic-advisor/predicate-rules-policy.js +7 -150
  237. package/dist/operations/semantic-advisor/predicate-rules-product-tail.d.ts +9 -0
  238. package/dist/operations/semantic-advisor/predicate-rules-product-tail.d.ts.map +1 -1
  239. package/dist/operations/semantic-advisor/predicate-rules-product-tail.js +7 -102
  240. package/dist/operations/semantic-advisor/predicate-rules-product.d.ts +13 -0
  241. package/dist/operations/semantic-advisor/predicate-rules-product.d.ts.map +1 -1
  242. package/dist/operations/semantic-advisor/predicate-rules-product.js +7 -133
  243. package/dist/operations/semantic-advisor/strict-count-rules.d.ts +2 -0
  244. package/dist/operations/semantic-advisor/strict-count-rules.d.ts.map +1 -1
  245. package/dist/operations/semantic-advisor/strict-count-rules.js +40 -25
  246. package/dist/operations/semantic-advisor/types.d.ts +1 -0
  247. package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
  248. package/dist/plugins/compose-ontology-packs.d.ts +51 -0
  249. package/dist/plugins/compose-ontology-packs.d.ts.map +1 -0
  250. package/dist/plugins/compose-ontology-packs.js +257 -0
  251. package/dist/plugins/compose-semantic-classifier.d.ts +42 -0
  252. package/dist/plugins/compose-semantic-classifier.d.ts.map +1 -0
  253. package/dist/plugins/compose-semantic-classifier.js +211 -0
  254. package/dist/plugins/external-allowlist.d.ts +10 -0
  255. package/dist/plugins/external-allowlist.d.ts.map +1 -0
  256. package/dist/plugins/external-allowlist.js +16 -0
  257. package/dist/plugins/index.d.ts +9 -0
  258. package/dist/plugins/index.d.ts.map +1 -0
  259. package/dist/plugins/index.js +33 -0
  260. package/dist/plugins/load-plugin.d.ts +19 -0
  261. package/dist/plugins/load-plugin.d.ts.map +1 -0
  262. package/dist/plugins/load-plugin.js +59 -0
  263. package/dist/plugins/project-config.d.ts +28 -0
  264. package/dist/plugins/project-config.d.ts.map +1 -0
  265. package/dist/plugins/project-config.js +90 -0
  266. package/dist/plugins/registry.d.ts +93 -0
  267. package/dist/plugins/registry.d.ts.map +1 -0
  268. package/dist/plugins/registry.js +338 -0
  269. package/dist/plugins/resolve-package.d.ts +47 -0
  270. package/dist/plugins/resolve-package.d.ts.map +1 -0
  271. package/dist/plugins/resolve-package.js +262 -0
  272. package/dist/plugins/source-analysis-service.d.ts +44 -0
  273. package/dist/plugins/source-analysis-service.d.ts.map +1 -0
  274. package/dist/plugins/source-analysis-service.js +232 -0
  275. package/dist/prolog/codec.d.ts +13 -1
  276. package/dist/prolog/codec.d.ts.map +1 -1
  277. package/dist/prolog/codec.js +269 -154
  278. package/dist/prolog/error-terms.d.ts +47 -0
  279. package/dist/prolog/error-terms.d.ts.map +1 -0
  280. package/dist/prolog/error-terms.js +334 -0
  281. package/dist/prolog/janitor.d.ts +50 -0
  282. package/dist/prolog/janitor.d.ts.map +1 -0
  283. package/dist/prolog/janitor.js +154 -0
  284. package/dist/prolog/store-lock.d.ts +45 -0
  285. package/dist/prolog/store-lock.d.ts.map +1 -0
  286. package/dist/prolog/store-lock.js +195 -0
  287. package/dist/prolog.d.ts +7 -0
  288. package/dist/prolog.d.ts.map +1 -1
  289. package/dist/prolog.js +55 -17
  290. package/dist/proof/evaluate.d.ts +27 -0
  291. package/dist/proof/evaluate.d.ts.map +1 -0
  292. package/dist/proof/evaluate.js +151 -0
  293. package/dist/proof/inspect.d.ts +12 -0
  294. package/dist/proof/inspect.d.ts.map +1 -0
  295. package/dist/proof/inspect.js +236 -0
  296. package/dist/proof/integrations.d.ts +35 -0
  297. package/dist/proof/integrations.d.ts.map +1 -0
  298. package/dist/proof/integrations.js +123 -0
  299. package/dist/proof/producers/junit-adapter.d.ts +26 -0
  300. package/dist/proof/producers/junit-adapter.d.ts.map +1 -0
  301. package/dist/proof/producers/junit-adapter.js +186 -0
  302. package/dist/{public → proof/producers}/playwright-case-id.d.ts +1 -1
  303. package/dist/proof/producers/playwright-case-id.d.ts.map +1 -0
  304. package/dist/{public → proof/producers}/playwright-case-id.js +1 -1
  305. package/dist/proof/producers/playwright-reporter.d.ts +27 -0
  306. package/dist/proof/producers/playwright-reporter.d.ts.map +1 -0
  307. package/dist/proof/producers/playwright-reporter.js +138 -0
  308. package/dist/proof/producers/tap-adapter.d.ts +10 -0
  309. package/dist/proof/producers/tap-adapter.d.ts.map +1 -0
  310. package/dist/proof/producers/tap-adapter.js +200 -0
  311. package/dist/proof/receipt-outcome.d.ts +2 -0
  312. package/dist/proof/receipt-outcome.d.ts.map +1 -0
  313. package/dist/proof/receipt-outcome.js +1 -0
  314. package/dist/public/diagnostic-usage.js +6 -6
  315. package/dist/public/distribution-parity.d.ts +7 -1
  316. package/dist/public/distribution-parity.d.ts.map +1 -1
  317. package/dist/public/distribution-parity.js +15 -10
  318. package/dist/public/extractors/symbols-coordinator.d.ts +1 -1
  319. package/dist/public/extractors/symbols-coordinator.d.ts.map +1 -1
  320. package/dist/public/extractors/symbols-coordinator.js +1 -1
  321. package/dist/public/impact/analyzer.d.ts +1 -1
  322. package/dist/public/impact/analyzer.d.ts.map +1 -1
  323. package/dist/public/impact/analyzer.js +6 -4
  324. package/dist/public/impact/coverage-depth-quality.d.ts +1 -0
  325. package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
  326. package/dist/public/impact/coverage-depth-quality.js +1 -1
  327. package/dist/public/impact/diagnostics.d.ts.map +1 -1
  328. package/dist/public/impact/diagnostics.js +2 -2
  329. package/dist/public/impact/diff-meaning.d.ts +1 -0
  330. package/dist/public/impact/diff-meaning.d.ts.map +1 -1
  331. package/dist/public/impact/diff-meaning.js +5 -2
  332. package/dist/public/impact/full-kb-quality.d.ts +5 -2
  333. package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
  334. package/dist/public/impact/full-kb-quality.js +329 -64
  335. package/dist/public/operations/catalog.d.ts +450 -196
  336. package/dist/public/operations/catalog.d.ts.map +1 -1
  337. package/dist/public/operations/catalog.js +6 -4
  338. package/dist/public/operations/check-executor.d.ts.map +1 -1
  339. package/dist/public/operations/check-executor.js +4 -8
  340. package/dist/public/operations/check-helpers.d.ts +1 -1
  341. package/dist/public/operations/check-helpers.d.ts.map +1 -1
  342. package/dist/public/operations/check-helpers.js +1 -1
  343. package/dist/public/operations/contracts.d.ts +7 -0
  344. package/dist/public/operations/contracts.d.ts.map +1 -1
  345. package/dist/public/operations/contracts.js +66 -34
  346. package/dist/public/operations/discovery-entities.d.ts +15 -0
  347. package/dist/public/operations/discovery-entities.d.ts.map +1 -1
  348. package/dist/public/operations/discovery-entities.js +38 -0
  349. package/dist/public/operations/discovery-executors.d.ts +9 -9
  350. package/dist/public/operations/discovery-executors.d.ts.map +1 -1
  351. package/dist/public/operations/discovery-executors.js +39 -31
  352. package/dist/public/operations/index.d.ts +1 -1
  353. package/dist/public/operations/index.d.ts.map +1 -1
  354. package/dist/public/operations/index.js +1 -1
  355. package/dist/public/operations/migration-plan.d.ts +4 -3
  356. package/dist/public/operations/migration-plan.d.ts.map +1 -1
  357. package/dist/public/operations/migration-plan.js +23 -21
  358. package/dist/public/operations/node-ports.js +6 -6
  359. package/dist/public/operations/prolog-json.d.ts +1 -1
  360. package/dist/public/operations/prolog-json.d.ts.map +1 -1
  361. package/dist/public/operations/prolog-json.js +7 -7
  362. package/dist/public/operations/repair-plan.d.ts +3 -3
  363. package/dist/public/operations/repair-plan.d.ts.map +1 -1
  364. package/dist/public/operations/repair-plan.js +49 -19
  365. package/dist/public/operations/result-envelope.d.ts +1 -0
  366. package/dist/public/operations/result-envelope.d.ts.map +1 -1
  367. package/dist/public/operations/result-envelope.js +12 -10
  368. package/dist/public/operations/runtime-types.d.ts +21 -1
  369. package/dist/public/operations/runtime-types.d.ts.map +1 -1
  370. package/dist/public/operations/specs/check-rules.generated.d.ts +5 -0
  371. package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -0
  372. package/dist/public/operations/specs/check-rules.generated.js +35 -0
  373. package/dist/public/operations/specs/check.d.ts +7 -2
  374. package/dist/public/operations/specs/check.d.ts.map +1 -1
  375. package/dist/public/operations/specs/check.js +8 -20
  376. package/dist/public/operations/specs/discovery.d.ts +3 -0
  377. package/dist/public/operations/specs/discovery.d.ts.map +1 -1
  378. package/dist/public/operations/specs/discovery.js +3 -0
  379. package/dist/public/operations/specs/mutation-schemas.d.ts +257 -163
  380. package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
  381. package/dist/public/operations/specs/mutation-schemas.js +15 -7
  382. package/dist/public/operations/specs/planning.d.ts +9 -0
  383. package/dist/public/operations/specs/planning.d.ts.map +1 -1
  384. package/dist/public/operations/specs/planning.js +6 -0
  385. package/dist/public/operations/specs/proof.d.ts +212 -0
  386. package/dist/public/operations/specs/proof.d.ts.map +1 -0
  387. package/dist/public/operations/specs/proof.js +30 -0
  388. package/dist/public/operations/specs/reporting.d.ts +20 -0
  389. package/dist/public/operations/specs/reporting.d.ts.map +1 -1
  390. package/dist/public/operations/specs/reporting.js +112 -12
  391. package/dist/public/operations/specs/semantic.d.ts +1 -1
  392. package/dist/public/operations/specs/semantic.d.ts.map +1 -1
  393. package/dist/public/operations/specs/semantic.js +54 -4
  394. package/dist/public/operations/specs/upsert.d.ts +257 -163
  395. package/dist/public/operations/specs/upsert.d.ts.map +1 -1
  396. package/dist/public/operations/symbol-repair-plan.d.ts +11 -0
  397. package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -1
  398. package/dist/public/operations/symbol-repair-plan.js +121 -4
  399. package/dist/public/operations/types.d.ts +6 -1
  400. package/dist/public/operations/types.d.ts.map +1 -1
  401. package/dist/public/proof-fingerprint.d.ts +54 -0
  402. package/dist/public/proof-fingerprint.d.ts.map +1 -0
  403. package/dist/public/proof-fingerprint.js +141 -0
  404. package/dist/public/proof-protocol.d.ts +354 -0
  405. package/dist/public/proof-protocol.d.ts.map +1 -0
  406. package/dist/public/proof-protocol.js +454 -0
  407. package/dist/public/proof-receipt.d.ts +279 -0
  408. package/dist/public/proof-receipt.d.ts.map +1 -0
  409. package/dist/public/proof-receipt.js +377 -0
  410. package/dist/public/schemas/entity.d.ts.map +1 -1
  411. package/dist/public/schemas/entity.js +21 -7
  412. package/dist/public/skills/kibi-freshness/SKILL.md +1 -1
  413. package/dist/public/skills/kibi-usage/SKILL.md +44 -12
  414. package/dist/public/skills/kibi-usage/resources/operation-access.md +1 -1
  415. package/dist/public/skills/kibi-usage/resources/proof.md +150 -0
  416. package/dist/public/skills/kibi-usage/resources/workflows.md +6 -6
  417. package/dist/public/symbol-granularity.d.ts +3 -14
  418. package/dist/public/symbol-granularity.d.ts.map +1 -1
  419. package/dist/public/symbol-granularity.generated.d.ts +16 -0
  420. package/dist/public/symbol-granularity.generated.d.ts.map +1 -0
  421. package/dist/public/symbol-granularity.generated.js +53 -0
  422. package/dist/public/symbol-granularity.js +6 -47
  423. package/dist/public/telemetry-acceptance.d.ts +3 -77
  424. package/dist/public/telemetry-acceptance.d.ts.map +1 -1
  425. package/dist/public/telemetry-acceptance.js +4 -2
  426. package/dist/public/telemetry-remediation.js +1 -1
  427. package/dist/report/html-report.css +1240 -0
  428. package/dist/report/html-report.d.ts +4 -2
  429. package/dist/report/html-report.d.ts.map +1 -1
  430. package/dist/report/html-report.js +37 -300
  431. package/dist/runtime/cli-runtime.d.ts +2 -0
  432. package/dist/runtime/cli-runtime.d.ts.map +1 -1
  433. package/dist/runtime/cli-runtime.js +32 -7
  434. package/dist/schemas/entity.schema.json +355 -215
  435. package/dist/search-ranking.d.ts +1 -0
  436. package/dist/search-ranking.d.ts.map +1 -1
  437. package/dist/search-ranking.js +3 -0
  438. package/dist/traceability/evidence-model.d.ts +28 -0
  439. package/dist/traceability/evidence-model.d.ts.map +1 -1
  440. package/dist/traceability/git-staged.d.ts +20 -0
  441. package/dist/traceability/git-staged.d.ts.map +1 -1
  442. package/dist/traceability/git-staged.js +145 -1
  443. package/dist/traceability/staged-diagnostics.d.ts +7 -0
  444. package/dist/traceability/staged-diagnostics.d.ts.map +1 -1
  445. package/dist/traceability/staged-diagnostics.js +78 -7
  446. package/dist/traceability/staged-file-coverage.d.ts +33 -0
  447. package/dist/traceability/staged-file-coverage.d.ts.map +1 -0
  448. package/dist/traceability/staged-file-coverage.js +284 -0
  449. package/dist/traceability/staged-impact-contract.js +4 -4
  450. package/dist/traceability/staged-symbols-manifest.d.ts +13 -0
  451. package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
  452. package/dist/traceability/staged-symbols-manifest.js +138 -27
  453. package/dist/traceability/symbol-extract.d.ts +24 -2
  454. package/dist/traceability/symbol-extract.d.ts.map +1 -1
  455. package/dist/traceability/symbol-extract.js +64 -208
  456. package/dist/traceability/temp-kb.d.ts +2 -0
  457. package/dist/traceability/temp-kb.d.ts.map +1 -1
  458. package/dist/traceability/temp-kb.js +13 -4
  459. package/dist/types/entities.d.ts +5 -3
  460. package/dist/types/entities.d.ts.map +1 -1
  461. package/dist/utils/branch-resolver.d.ts +1 -0
  462. package/dist/utils/branch-resolver.d.ts.map +1 -1
  463. package/dist/utils/branch-resolver.js +7 -4
  464. package/dist/utils/branch-store.d.ts +6 -0
  465. package/dist/utils/branch-store.d.ts.map +1 -1
  466. package/dist/utils/branch-store.js +27 -0
  467. package/dist/utils/kb-paths.d.ts +1 -1
  468. package/dist/utils/kb-paths.d.ts.map +1 -1
  469. package/dist/utils/kb-paths.js +1 -1
  470. package/dist/utils/rule-registry.d.ts +1 -11
  471. package/dist/utils/rule-registry.d.ts.map +1 -1
  472. package/dist/utils/rule-registry.generated.d.ts +102 -0
  473. package/dist/utils/rule-registry.generated.d.ts.map +1 -0
  474. package/dist/utils/rule-registry.generated.js +131 -0
  475. package/dist/utils/rule-registry.js +12 -113
  476. package/dist/utils/strict-modeling.d.ts +1 -0
  477. package/dist/utils/strict-modeling.d.ts.map +1 -1
  478. package/dist/utils/strict-modeling.js +1 -1
  479. package/package.json +20 -20
  480. package/src/public/diagnostic-usage.ts +6 -6
  481. package/src/public/distribution-parity.ts +17 -10
  482. package/src/public/extractors/symbols-coordinator.ts +1 -0
  483. package/src/public/impact/analyzer.ts +15 -12
  484. package/src/public/impact/coverage-depth-quality.ts +1 -1
  485. package/src/public/impact/diagnostics.ts +2 -1
  486. package/src/public/impact/diff-meaning.ts +11 -4
  487. package/src/public/impact/full-kb-quality.ts +463 -72
  488. package/src/public/operations/catalog.ts +10 -4
  489. package/src/public/operations/check-executor.ts +4 -8
  490. package/src/public/operations/check-helpers.ts +2 -2
  491. package/src/public/operations/contracts.ts +78 -34
  492. package/src/public/operations/discovery-entities.ts +53 -0
  493. package/src/public/operations/discovery-executors.ts +64 -48
  494. package/src/public/operations/index.ts +1 -1
  495. package/src/public/operations/migration-plan.ts +32 -25
  496. package/src/public/operations/node-ports.ts +6 -6
  497. package/src/public/operations/prolog-json.ts +13 -5
  498. package/src/public/operations/repair-plan.ts +60 -23
  499. package/src/public/operations/result-envelope.ts +15 -10
  500. package/src/public/operations/runtime-types.ts +26 -2
  501. package/src/public/operations/specs/check-rules.generated.ts +38 -0
  502. package/src/public/operations/specs/check.ts +12 -21
  503. package/src/public/operations/specs/discovery.ts +3 -0
  504. package/src/public/operations/specs/mutation-schemas.ts +22 -9
  505. package/src/public/operations/specs/planning.ts +7 -0
  506. package/src/public/operations/specs/proof.ts +43 -0
  507. package/src/public/operations/specs/reporting.ts +140 -13
  508. package/src/public/operations/specs/semantic.ts +79 -17
  509. package/src/public/operations/symbol-repair-plan.ts +166 -7
  510. package/src/public/operations/types.ts +6 -1
  511. package/src/public/proof-fingerprint.ts +216 -0
  512. package/src/public/proof-protocol-types.d.ts +96 -0
  513. package/src/public/proof-protocol.ts +589 -0
  514. package/src/public/proof-receipt.ts +499 -0
  515. package/src/public/schemas/entity.ts +26 -10
  516. package/src/public/skills/kibi-freshness/SKILL.md +1 -1
  517. package/src/public/skills/kibi-usage/SKILL.md +44 -12
  518. package/src/public/skills/kibi-usage/resources/operation-access.md +1 -1
  519. package/src/public/skills/kibi-usage/resources/proof.md +150 -0
  520. package/src/public/skills/kibi-usage/resources/workflows.md +6 -6
  521. package/src/public/symbol-granularity.generated.ts +74 -0
  522. package/src/public/symbol-granularity.ts +34 -59
  523. package/src/public/telemetry-acceptance-types.d.ts +98 -0
  524. package/src/public/telemetry-acceptance.ts +22 -100
  525. package/src/public/telemetry-remediation.ts +1 -1
  526. package/src/schemas/entity.schema.json +355 -215
  527. package/dist/cli-register-verification.d.ts +0 -3
  528. package/dist/cli-register-verification.d.ts.map +0 -1
  529. package/dist/cli-register-verification.js +0 -16
  530. package/dist/commands/verify.d.ts +0 -10
  531. package/dist/commands/verify.d.ts.map +0 -1
  532. package/dist/commands/verify.js +0 -126
  533. package/dist/operations/verification/ingest-verification.d.ts +0 -29
  534. package/dist/operations/verification/ingest-verification.d.ts.map +0 -1
  535. package/dist/operations/verification/ingest-verification.js +0 -192
  536. package/dist/public/operations/specs/verification.d.ts +0 -78
  537. package/dist/public/operations/specs/verification.d.ts.map +0 -1
  538. package/dist/public/operations/specs/verification.js +0 -62
  539. package/dist/public/playwright-case-id.d.ts.map +0 -1
  540. package/dist/public/verification-receipt.d.ts +0 -242
  541. package/dist/public/verification-receipt.d.ts.map +0 -1
  542. package/dist/public/verification-receipt.js +0 -296
  543. package/dist/verification/playwright-reporter.d.ts +0 -21
  544. package/dist/verification/playwright-reporter.d.ts.map +0 -1
  545. package/dist/verification/playwright-reporter.js +0 -114
  546. package/src/public/operations/specs/verification.ts +0 -78
  547. package/src/public/playwright-case-id.ts +0 -35
  548. package/src/public/verification-receipt.ts +0 -412
@@ -1,5 +1,6 @@
1
1
  import { analyzeSemanticAdvisorInput } from "../semantic-advisor/analyze-prose.js";
2
2
  import { semanticClaimKey } from "../semantic-advisor/clauses.js";
3
+ import { composeOntologyCatalogForOperation } from "../semantic-advisor/plugin-orchestration.js";
3
4
  import { STRONG_APPLICABILITY_SCORE, WEAK_CANDIDATE_MARGIN, evaluateSemanticApplicability, } from "./predicate-applicability.js";
4
5
  import { buildGapApplyPlan, buildPredicateApplyPlan, buildPredicateSchemaDraft, buildRelationshipPlan, buildSuggestion, } from "./predicate-applyplan.js";
5
6
  import { BUILT_IN_PREDICATE_SCHEMAS } from "./predicate-catalog.js";
@@ -14,15 +15,14 @@ const NON_ASSERTIVE_PROPOSITION_ROLES = new Set([
14
15
  "example",
15
16
  "subjective",
16
17
  ]);
17
- function assertivePropositionCount(text) {
18
- const analysis = analyzeSemanticAdvisorInput({
18
+ function analyzeInputPropositions(text) {
19
+ return analyzeSemanticAdvisorInput({
19
20
  payload: {
20
21
  type: "req",
21
22
  id: "REQ-KIBI-PREDICATE-SUGGESTION-INPUT",
22
23
  properties: { semantic_text: text },
23
24
  },
24
- });
25
- return analysis.receipt.propositions.filter((proposition) => !NON_ASSERTIVE_PROPOSITION_ROLES.has(proposition.role)).length;
25
+ }).receipt.propositions;
26
26
  }
27
27
  function compoundInputAbstention(args, text, subject, propositionCount) {
28
28
  const claimKey = semanticClaimKey(text);
@@ -52,6 +52,34 @@ function compoundInputAbstention(args, text, subject, propositionCount) {
52
52
  applyPlan,
53
53
  };
54
54
  }
55
+ function nonlogicalInputRouting(args, text, subject) {
56
+ const claimKey = semanticClaimKey(text);
57
+ const warning = "The semantic advisor classifies this prose as nonlogical (rationale, example, or subjective context); it does not assert a verifiable domain proposition. Advisor routing wins: no predicate candidates, schema draft, or write plan were generated, and the claim was not added to logic_claims.";
58
+ const applyPlan = [];
59
+ return {
60
+ content: [
61
+ {
62
+ type: "text",
63
+ text: "Predicate suggestion abstained because the semantic advisor classifies this prose as nonlogical (rationale, example, or subjective context). Keep it outside logic_claims; no candidate, ontology-gap observation, or schema draft was generated.",
64
+ },
65
+ ],
66
+ structuredContent: {
67
+ text,
68
+ claimKey,
69
+ logicClaims: Array.from(new Set(args.existingLogicClaims ?? [])),
70
+ source: args.source ?? null,
71
+ requirementId: args.requirementId ?? null,
72
+ subject,
73
+ candidates: [],
74
+ recommendedAction: "review_nonlogical",
75
+ recommendedPredicateSchema: null,
76
+ applyPlan,
77
+ relationshipPlan: null,
78
+ warnings: [warning],
79
+ },
80
+ applyPlan,
81
+ };
82
+ }
55
83
  function uniqueSchemas(schemas) {
56
84
  const seen = new Set();
57
85
  return schemas.filter((schema) => {
@@ -62,14 +90,36 @@ function uniqueSchemas(schemas) {
62
90
  return true;
63
91
  });
64
92
  }
93
+ function ontologyPackSchemasToCandidates(schemas) {
94
+ return schemas.map((schema) => ({
95
+ id: schema.schemaId,
96
+ predicate_name: schema.predicateName,
97
+ title: schema.title ?? schema.predicateName,
98
+ description: schema.description ?? schema.predicateName,
99
+ argument_names: [...schema.argumentNames],
100
+ argument_types: [...schema.argumentTypes],
101
+ keywords: [schema.predicateName, ...(schema.aliases ?? [])],
102
+ ...(schema.aliases ? { aliases: [...schema.aliases] } : {}),
103
+ examples: [],
104
+ tags: ["ontology-pack"],
105
+ }));
106
+ }
107
+ export function compareEligibleByApplicabilityThenName(left, right) {
108
+ if (right.applicability_score !== left.applicability_score)
109
+ return right.applicability_score - left.applicability_score;
110
+ return left.predicate_name.localeCompare(right.predicate_name);
111
+ }
112
+ export function compareEligibleByApplicabilityScoreThenName(left, right) {
113
+ if (right.applicability_score !== left.applicability_score)
114
+ return right.applicability_score - left.applicability_score;
115
+ if (right.score !== left.score)
116
+ return right.score - left.score;
117
+ return left.predicate_name.localeCompare(right.predicate_name);
118
+ }
65
119
  function withMarginRejection(candidates) {
66
120
  const eligible = candidates
67
121
  .filter((candidate) => candidate.eligibility === "eligible")
68
- .sort((left, right) => {
69
- if (right.applicability_score !== left.applicability_score)
70
- return right.applicability_score - left.applicability_score;
71
- return left.predicate_name.localeCompare(right.predicate_name);
72
- });
122
+ .sort(compareEligibleByApplicabilityThenName);
73
123
  const top = eligible[0];
74
124
  const second = eligible[1];
75
125
  if (!top ||
@@ -94,20 +144,36 @@ function withMarginRejection(candidates) {
94
144
  });
95
145
  }
96
146
  // implements REQ-mcp-suggest-predicates
97
- export async function handleKbSuggestPredicates(prolog, args) {
147
+ export async function handleKbSuggestPredicates(prolog, args, context) {
98
148
  const text = normalizeText(args.text);
99
149
  const subject = inferSubject(text, args.subjectHint);
100
- const propositionCount = assertivePropositionCount(text);
101
- if (propositionCount > 1) {
102
- return compoundInputAbstention(args, text, subject, propositionCount);
150
+ const propositions = analyzeInputPropositions(text);
151
+ const assertivePropositionCount = propositions.filter((proposition) => !NON_ASSERTIVE_PROPOSITION_ROLES.has(proposition.role)).length;
152
+ if (propositions.length > 0 && assertivePropositionCount === 0) {
153
+ return nonlogicalInputRouting(args, text, subject);
154
+ }
155
+ if (assertivePropositionCount > 1) {
156
+ return compoundInputAbstention(args, text, subject, assertivePropositionCount);
103
157
  }
104
158
  const maxCandidates = clampInteger(args.maxCandidates, DEFAULT_MAX_CANDIDATES, 1, 20);
105
159
  const minScore = clampScore(args.minScore ?? DEFAULT_MIN_SCORE);
106
160
  const warnings = [];
107
161
  const existingSchemas = await loadExistingPredicateSchemas(prolog, args.includeExistingSchemas ?? true, warnings);
162
+ const composedCatalog = await composeOntologyCatalogForOperation(context, "kb_suggest_predicates");
163
+ const packSchemas = composedCatalog
164
+ ? ontologyPackSchemasToCandidates(composedCatalog.schemas)
165
+ : [];
166
+ // When ontology resolution is in replace mode and the replace pack
167
+ // successfully supplied its catalog, do not silently re-append the builtin
168
+ // *provider* catalog. Persisted/project KB schemas remain available.
169
+ const includeBuiltinProviderCatalog = !(composedCatalog?.replaced === true);
170
+ if (composedCatalog?.diagnostics?.length) {
171
+ warnings.push(...composedCatalog.diagnostics);
172
+ }
108
173
  const schemas = uniqueSchemas([
109
174
  ...existingSchemas,
110
- ...BUILT_IN_PREDICATE_SCHEMAS,
175
+ ...(includeBuiltinProviderCatalog ? BUILT_IN_PREDICATE_SCHEMAS : []),
176
+ ...packSchemas,
111
177
  ]);
112
178
  const selectedSchemas = args.schemaId
113
179
  ? schemas.filter((schema) => schema.id === args.schemaId)
@@ -163,13 +229,7 @@ export async function handleKbSuggestPredicates(prolog, args) {
163
229
  : [];
164
230
  const recommendedCandidate = candidates
165
231
  .filter((candidate) => candidate.eligibility === "eligible")
166
- .sort((left, right) => {
167
- if (right.applicability_score !== left.applicability_score)
168
- return right.applicability_score - left.applicability_score;
169
- if (right.score !== left.score)
170
- return right.score - left.score;
171
- return left.predicate_name.localeCompare(right.predicate_name);
172
- })[0];
232
+ .sort(compareEligibleByApplicabilityScoreThenName)[0];
173
233
  if (candidates.length === 0 && !args.schemaId) {
174
234
  warnings.push("No predicate candidate met minScore. If this is recurring domain language, create a fact_kind=predicate_schema fact; otherwise keep the generated review:ontology-gap observation. Do not invent unsupported predicate names without a predicate_schema.");
175
235
  }
@@ -222,5 +282,5 @@ export async function handleKbSuggestPredicates(prolog, args) {
222
282
  };
223
283
  }
224
284
  export async function executeSuggestPredicates(args, context) {
225
- return handleKbSuggestPredicates(context.prolog ?? null, args);
285
+ return handleKbSuggestPredicates(context.prolog ?? null, args, context);
226
286
  }
@@ -1,3 +1,4 @@
1
+ import type { PrologErrorRecord } from "../../prolog/error-terms.js";
1
2
  import type { RelationshipInput } from "./types.js";
2
3
  type TransactionInput = {
3
4
  readonly entity: Readonly<Record<string, unknown>>;
@@ -5,6 +6,6 @@ type TransactionInput = {
5
6
  readonly skipContradictionCheck: boolean;
6
7
  };
7
8
  export declare function buildUpsertCommitGoal(input: TransactionInput): string;
8
- export declare function formatUpsertError(entityId: string, raw?: string): string;
9
+ export declare function formatUpsertError(entityId: string, raw?: string, record?: PrologErrorRecord): string;
9
10
  export {};
10
11
  //# sourceMappingURL=contradictions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contradictions.d.ts","sourceRoot":"","sources":["../../../src/operations/mutation/contradictions.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,KAAK,gBAAgB,GAAG;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,aAAa,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACrD,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;CAC1C,CAAC;AAGF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAOrE;AAGD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CA6CxE"}
1
+ {"version":3,"file":"contradictions.d.ts","sourceRoot":"","sources":["../../../src/operations/mutation/contradictions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AASrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,KAAK,gBAAgB,GAAG;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,aAAa,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACrD,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;CAC1C,CAAC;AAGF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAOrE;AAGD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,iBAAiB,GACzB,MAAM,CAOR"}
@@ -1,5 +1,5 @@
1
1
  import { escapeAtom } from "../../prolog/codec.js";
2
- import { formatInvalidRelationshipError } from "./relationships.js";
2
+ import { formatInvalidRelationshipError, formatInvalidRelationshipTuple, } from "./relationships.js";
3
3
  import { buildPropertyList, buildRelationshipMetadata, } from "./serialization.js";
4
4
  // implements REQ-kibi-operation-interface-parity
5
5
  export function buildUpsertCommitGoal(input) {
@@ -8,12 +8,33 @@ export function buildUpsertCommitGoal(input) {
8
8
  return `kb_commit_upsert(${type}, ${buildPropertyList(input.entity)}, [${relationships.join(", ")}], ${input.skipContradictionCheck ? "true" : "false"}, ChangeKind)`;
9
9
  }
10
10
  // implements REQ-kibi-operation-interface-parity
11
- export function formatUpsertError(entityId, raw) {
11
+ export function formatUpsertError(entityId, raw, record) {
12
+ const stage = raw?.match(/\(stage=([^)]+)\)/)?.[1];
13
+ const stageSuffix = stage === undefined ? "" : ` (stage=${stage})`;
14
+ if (record) {
15
+ return formatStructuredUpsertError(entityId, record, stageSuffix);
16
+ }
17
+ return formatTextUpsertError(entityId, raw, stageSuffix);
18
+ }
19
+ function formatStructuredUpsertError(entityId, record, stageSuffix) {
20
+ if (record.code === "contradiction") {
21
+ const conflicts = [
22
+ ...new Set((record.conflicts ?? []).map((conflict) => ` - Conflicts with ${conflict.otherId}: ${conflict.reason}`)),
23
+ ];
24
+ if (conflicts.length > 0) {
25
+ return `Contradiction detected for requirement ${entityId}:\n${conflicts.join("\n")}\n\nTo resolve:\n 1. Add a supersedes relationship from the new requirement to the conflicting one, OR\n 2. Deprecate the conflicting requirement before creating the new one.${stageSuffix}`;
26
+ }
27
+ return `Contradiction detected for entity ${entityId}: This requirement conflicts with existing requirements. Add a supersedes relationship to the conflicting requirement, or deprecate the old requirement before creating the new one.${stageSuffix}`;
28
+ }
29
+ if (record.code === "invalid_relationship" && record.relationship) {
30
+ return `Failed to upsert entity ${entityId}: ${formatInvalidRelationshipTuple(record.relationship)}${stageSuffix}`;
31
+ }
32
+ return `Failed to upsert entity ${entityId}: ${record.message}${stageSuffix}`;
33
+ }
34
+ function formatTextUpsertError(entityId, raw, stageSuffix) {
12
35
  if (!raw)
13
36
  return `Failed to upsert entity ${entityId}: Unknown error`;
14
- const stage = raw.match(/\(stage=([^)]+)\)/)?.[1];
15
- const stageSuffix = stage === undefined ? "" : ` (stage=${stage})`;
16
- const diagnosticFree = raw.replace(/^__KIBI_(?:STAGE|RUNTIME)__:[^\r\n]*\r?\n?/gm, "");
37
+ const diagnosticFree = raw.replace(/^__KIBI_(?:STAGE|RUNTIME|ERROR)__:[^\r\n]*\r?\n?/gm, "");
17
38
  if (diagnosticFree.includes("stale_snapshot")) {
18
39
  return `Failed to upsert entity ${entityId}: KB snapshot is stale; reattach or refresh the runtime before retrying (stale_snapshot)${stageSuffix}`;
19
40
  }
@@ -1,5 +1,8 @@
1
1
  import type { OperationContext } from "../../public/operations/runtime-types.js";
2
2
  import type { OperationResult } from "../../public/operations/types.js";
3
+ import { type RelationshipSelector } from "../../relationships/shards.js";
3
4
  import type { DeleteInput, DeletePayload } from "./types.js";
5
+ export declare function assertFilesystemCapableRuntime(fs: OperationContext["fs"]): asserts fs is NonNullable<OperationContext["fs"]>;
6
+ export declare function executeRelationshipDelete(selectors: readonly RelationshipSelector[], context: OperationContext, onCommitted?: () => void): Promise<DeletePayload>;
4
7
  export declare function executeDelete(input: DeleteInput, context: OperationContext): Promise<OperationResult<DeletePayload>>;
5
8
  //# sourceMappingURL=delete.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/operations/mutation/delete.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAsBxE,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAkW7D,wBAAsB,aAAa,CACjC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CA4MzC"}
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/operations/mutation/delete.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EACL,KAAK,oBAAoB,EAI1B,MAAM,+BAA+B,CAAC;AAgBvC,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAc7D,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,gBAAgB,CAAC,IAAI,CAAC,GACzB,OAAO,CAAC,EAAE,IAAI,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAMnD;AAuWD,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,SAAS,oBAAoB,EAAE,EAC1C,OAAO,EAAE,gBAAgB,EACzB,WAAW,GAAE,MAAM,IAAsB,GACxC,OAAO,CAAC,aAAa,CAAC,CA4BxB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CA6OzC"}
@@ -1,6 +1,7 @@
1
- import { createHash } from "node:crypto";
1
+ import { createHash, randomUUID } from "node:crypto";
2
2
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
3
3
  import path from "node:path";
4
+ import { InputError, OperationError } from "../../cli-errors.js";
4
5
  import { parseEntityFromList, parseListOfLists, toPrologAtom, } from "../../prolog/codec.js";
5
6
  import { listShards, readAllShards, removeRelationshipsFromShards, } from "../../relationships/shards.js";
6
7
  import { resolveBranchAttachment } from "../../utils/branch-resolver.js";
@@ -8,11 +9,17 @@ import { buildEntityDeleteAuditGoal } from "./audit.js";
8
9
  import { RELATIONSHIP_TYPES, dependentRelationshipsGoal, } from "./relationships.js";
9
10
  import { saveAtomicMutation, saveMutation } from "./save.js";
10
11
  import { normalizeAuthoredSourcePath, renderMarkdownRelationshipDeletion, renderSourceDeletion, renderYamlRelationshipDeletion, resolveContainedSourcePath, writePendingSourceReceipt, } from "./source-authoring.js";
12
+ import { acquireWorkspaceMutationLock, classifySourceMutationFailure, releaseWorkspaceMutationLock, } from "./workspace-mutation-lock.js";
11
13
  function requireProlog(context) {
12
14
  if (context.prolog === undefined)
13
15
  throw new Error("Delete operation requires a Prolog runtime");
14
16
  return context.prolog;
15
17
  }
18
+ export function assertFilesystemCapableRuntime(fs) {
19
+ if (!fs) {
20
+ throw new Error("Relationship source patch requires a filesystem-capable runtime");
21
+ }
22
+ }
16
23
  async function loadEntity(prolog, id) {
17
24
  const safeId = id.replaceAll("'", "''");
18
25
  const result = await prolog.query(`findall(['${safeId}',Type,Props], kb_entity('${safeId}', Type, Props), Results)`);
@@ -40,7 +47,9 @@ function fileHash(pathname) {
40
47
  return null;
41
48
  return createHash("sha256").update(readFileSync(pathname)).digest("hex");
42
49
  }
43
- async function executeRelationshipDelete(selectors, context) {
50
+ // implements REQ-011
51
+ // covered_by TEST-cli-source-relationship-parity-unit
52
+ async function executeRelationshipDeleteUnlocked(selectors, context, onCommitted = () => undefined) {
44
53
  const prolog = requireProlog(context);
45
54
  const allowed = new Set(RELATIONSHIP_TYPES);
46
55
  const errors = [];
@@ -84,41 +93,40 @@ async function executeRelationshipDelete(selectors, context) {
84
93
  record.to === selector.to);
85
94
  const liveResult = await prolog.query(`once(kb_relationship(${toPrologAtom(selector.type)}, ${toPrologAtom(selector.from)}, ${toPrologAtom(selector.to)}))`);
86
95
  let sourceRemoved = false;
87
- let authoredYamlSource = false;
96
+ let authoredSourceKind;
88
97
  if (context.fs) {
89
98
  // Authored YAML symbol relationships remain authoritative even when the
90
99
  // compiled edge or relationship shard is present. Patch the source first
91
100
  // so the next sync cannot recreate a relationship the caller deleted.
92
- // Legacy Markdown declarations retain their fallback-only behavior.
101
+ // Legacy Markdown declarations are authoritative by the same rule.
93
102
  try {
94
103
  const entity = await loadEntity(prolog, selector.from);
95
104
  const source = typeof entity.source === "string" ? entity.source : "";
96
105
  if (sourceIsAuthored(source)) {
97
- authoredYamlSource = /\.(?:ya?ml)$/i.test(source);
106
+ authoredSourceKind = /\.(?:ya?ml)$/i.test(source.replaceAll("\\", "/"))
107
+ ? "YAML"
108
+ : "Markdown";
98
109
  const relative = normalizeAuthoredSourcePath(context.workspaceRoot, source);
99
110
  const absolute = resolveContainedSourcePath(context.workspaceRoot, relative);
100
111
  const isYaml = /\.(?:ya?ml)$/i.test(relative);
101
- authoredYamlSource = isYaml;
102
- if (isYaml || (!liveResult.success && matchingShard.length === 0)) {
103
- const previous = sourcePatches.get(relative);
104
- const before = previous?.before ?? (await context.fs.readFile(absolute));
105
- const current = previous?.after ?? before;
106
- const rendered = isYaml
107
- ? renderYamlRelationshipDeletion(relative, current, selector)
108
- : renderMarkdownRelationshipDeletion(relative, current, selector);
109
- if (rendered.removed) {
110
- sourcePatches.set(relative, {
111
- before,
112
- after: rendered.body,
113
- });
114
- sourceRemoved = true;
115
- }
112
+ const previous = sourcePatches.get(relative);
113
+ const before = previous?.before ?? (await context.fs.readFile(absolute));
114
+ const current = previous?.after ?? before;
115
+ const rendered = isYaml
116
+ ? renderYamlRelationshipDeletion(relative, current, selector)
117
+ : renderMarkdownRelationshipDeletion(relative, current, selector);
118
+ if (rendered.removed) {
119
+ sourcePatches.set(relative, {
120
+ before,
121
+ after: rendered.body,
122
+ });
123
+ sourceRemoved = true;
116
124
  }
117
125
  }
118
126
  }
119
127
  catch (error) {
120
- if (authoredYamlSource) {
121
- throw new Error(`Authored YAML relationship deletion failed for ${selector.from}: ${error instanceof Error ? error.message : String(error)}`);
128
+ if (authoredSourceKind !== undefined) {
129
+ throw new Error(`Authored ${authoredSourceKind} relationship deletion failed for ${selector.from}: ${error instanceof Error ? error.message : String(error)}`);
122
130
  }
123
131
  // The normal typed preflight below reports a deterministic not-found
124
132
  // or inspection error when no authored source can prove the edge.
@@ -183,17 +191,24 @@ async function executeRelationshipDelete(selectors, context) {
183
191
  throw new Error(`Relationship shard update failed before compiled mutation: ${error instanceof Error ? error.message : String(error)}`);
184
192
  }
185
193
  const writeSourcePatch = async (relative, body) => {
186
- if (!context.fs)
187
- throw new Error("Relationship source patch requires a filesystem-capable runtime");
194
+ assertFilesystemCapableRuntime(context.fs);
188
195
  const absolute = resolveContainedSourcePath(context.workspaceRoot, relative);
189
196
  await context.fs.mkdir(path.dirname(absolute));
190
- const temporary = `${absolute}.kibi-relationship-${process.pid}-${Date.now()}`;
191
- await context.fs.writeFile(temporary, body);
192
- if (context.fs.rename)
193
- await context.fs.rename(temporary, absolute);
194
- else {
195
- await context.fs.writeFile(absolute, body);
197
+ const temporary = `${absolute}.kibi-relationship-${process.pid}-${randomUUID()}`;
198
+ try {
199
+ await context.fs.writeFile(temporary, body);
200
+ if (context.fs.rename)
201
+ await context.fs.rename(temporary, absolute);
202
+ else {
203
+ await context.fs.writeFile(absolute, body);
204
+ await context.fs.unlink?.(temporary).catch(() => undefined);
205
+ }
206
+ }
207
+ catch (error) {
208
+ // A failed rename must not leak the unique temp file into the authored
209
+ // tree; the published target (if any) is untouched at this point.
196
210
  await context.fs.unlink?.(temporary).catch(() => undefined);
211
+ throw error;
197
212
  }
198
213
  };
199
214
  try {
@@ -226,6 +241,9 @@ async function executeRelationshipDelete(selectors, context) {
226
241
  }
227
242
  if (retracted > 0)
228
243
  await saveMutation(prolog, "delete");
244
+ // The compiled mutation is now authoritative. Receipt publication below
245
+ // must not make the enclosing operation look retryable.
246
+ onCommitted();
229
247
  }
230
248
  catch (error) {
231
249
  const paths = [
@@ -295,6 +313,29 @@ async function executeRelationshipDelete(selectors, context) {
295
313
  ...(sourceWrites.length > 0 ? { sourceWrites } : {}),
296
314
  };
297
315
  }
316
+ export async function executeRelationshipDelete(selectors, context, onCommitted = () => undefined) {
317
+ if (!context.fs || context.sourceMutationLockHeld === true)
318
+ return executeRelationshipDeleteUnlocked(selectors, context, onCommitted);
319
+ const lock = await acquireWorkspaceMutationLock(context.workspaceRoot);
320
+ let operationFailure;
321
+ let committed = false;
322
+ try {
323
+ const result = await executeRelationshipDeleteUnlocked(selectors, context, () => {
324
+ committed = true;
325
+ onCommitted();
326
+ });
327
+ committed = true;
328
+ return result;
329
+ }
330
+ catch (error) {
331
+ const failure = classifySourceMutationFailure("Relationship delete", error, committed);
332
+ operationFailure = { error: failure };
333
+ throw failure;
334
+ }
335
+ finally {
336
+ releaseWorkspaceMutationLock(lock, operationFailure, committed);
337
+ }
338
+ }
298
339
  export async function executeDelete(input, context) {
299
340
  const branchAttachment = context.branchAttachment ?? resolveBranchAttachment(context.workspaceRoot);
300
341
  if ("error" in branchAttachment) {
@@ -305,7 +346,13 @@ export async function executeDelete(input, context) {
305
346
  throw new Error(`Delete blocked: KB is attached through legacy branch storage (${branchAttachment.gitBranch} -> ${branchAttachment.kbBranch}). Run 'kibi branch migrate --from ${branchAttachment.kbBranch} --to ${branchAttachment.gitBranch} --apply' first.`);
306
347
  }
307
348
  const prolog = requireProlog(context);
349
+ let sourceMutationLock;
350
+ let committed = false;
351
+ let operationFailure;
308
352
  try {
353
+ if (context.fs && context.sourceMutationLockHeld !== true) {
354
+ sourceMutationLock = await acquireWorkspaceMutationLock(context.workspaceRoot);
355
+ }
309
356
  const ids = input.ids ?? [];
310
357
  const relationships = input.relationships ?? [];
311
358
  if ((ids.length === 0) === (relationships.length === 0))
@@ -313,7 +360,9 @@ export async function executeDelete(input, context) {
313
360
  if (relationships.length > 0) {
314
361
  if (relationships.some((value) => !isSelector(value)))
315
362
  throw new Error("Each relationship selector requires non-empty type, from, and to strings");
316
- const payload = await executeRelationshipDelete(relationships, context);
363
+ const payload = await executeRelationshipDelete(relationships, { ...context, sourceMutationLockHeld: true }, () => {
364
+ committed = true;
365
+ });
317
366
  return {
318
367
  content: [
319
368
  {
@@ -435,6 +484,7 @@ export async function executeDelete(input, context) {
435
484
  await saveAtomicMutation(prolog, goals, "delete");
436
485
  else
437
486
  await saveMutation(prolog, "delete");
487
+ committed = true;
438
488
  }
439
489
  catch (error) {
440
490
  for (const [source, body] of sourceBodies) {
@@ -458,6 +508,24 @@ export async function executeDelete(input, context) {
458
508
  };
459
509
  }
460
510
  catch (error) {
461
- throw new Error(`Delete execution failed: ${error instanceof Error ? error.message : String(error)}`);
511
+ // Typed operation errors keep their code and retryability. After the
512
+ // commit milestone, a generic failure is already a committed mutation:
513
+ // wrap it as non-retryable immediately instead of only when lock release
514
+ // also fails.
515
+ if (error instanceof OperationError || error instanceof InputError) {
516
+ operationFailure = { error };
517
+ throw error;
518
+ }
519
+ if (committed) {
520
+ const failure = classifySourceMutationFailure("Delete", error, true);
521
+ operationFailure = { error: failure };
522
+ throw failure;
523
+ }
524
+ const failure = new Error(`Delete execution failed: ${error instanceof Error ? error.message : String(error)}`);
525
+ operationFailure = { error: failure };
526
+ throw failure;
527
+ }
528
+ finally {
529
+ releaseWorkspaceMutationLock(sourceMutationLock, operationFailure, committed);
462
530
  }
463
531
  }
@@ -2,6 +2,7 @@ import type { PrologPort } from "../../public/operations/runtime-types.js";
2
2
  import type { RelationshipInput } from "./types.js";
3
3
  export declare const RELATIONSHIP_TYPES: readonly ["depends_on", "specified_by", "verified_by", "validates", "implements", "covered_by", "executable_for", "constrained_by", "constrains", "requires_property", "requires_predicate", "requires_rule", "guards", "publishes", "consumes", "supersedes", "relates_to"];
4
4
  export type RelationshipType = (typeof RELATIONSHIP_TYPES)[number];
5
+ export declare function wrongKindRelationshipError(type: string, target: string, wrongKind: string): Error;
5
6
  export declare function dependentRelationshipsGoal(entityId: string): string;
6
7
  type RelationshipTuple = {
7
8
  readonly relType: string;
@@ -1 +1 @@
1
- {"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../../../src/operations/mutation/relationships.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAE3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,kBAAkB,8QAkBrB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAgCF,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,iBAAiB,GACvB,MAAM,CAER;AAED,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAczE;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,SAAS,iBAAiB,EAAE,GAC1C,IAAI,CAMN;AAED,KAAK,iBAAiB,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAE1D,KAAK,qBAAqB,GAAG,QAAQ,CAAC;IACpC,mBAAmB,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9E,UAAU,EAAE,CACV,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,KACf,OAAO,GAAG,IAAI,CAAC;CACrB,CAAC,CAAC;AAMH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAef;AAsBD,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,IAAI,GAAE,IAAI,CACR,qBAAqB,EACrB,YAAY,CACqB,GAClC,iBAAiB,CAenB;AAGD,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,aAAa,EAAE,SAAS,iBAAiB,EAAE,EAC3C,aAAa,EAAE,MAAM,EACrB,IAAI,GAAE,qBAAuD,GAC5D,OAAO,CAAC,IAAI,CAAC,CAyCf;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,iBAAiB,GAC9B,MAAM,CAIR;AAuBD,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,aAAa,EAAE,SAAS,iBAAiB,EAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,SAAS,iBAAiB,EAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAevC"}
1
+ {"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../../../src/operations/mutation/relationships.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAE3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,eAAO,MAAM,kBAAkB,8QAkBrB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,KAAK,CAKP;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAgCF,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,iBAAiB,GACvB,MAAM,CAER;AAED,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAczE;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,SAAS,iBAAiB,EAAE,GAC1C,IAAI,CAMN;AAED,KAAK,iBAAiB,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAE1D,KAAK,qBAAqB,GAAG,QAAQ,CAAC;IACpC,mBAAmB,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC9E,UAAU,EAAE,CACV,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,KACf,OAAO,GAAG,IAAI,CAAC;CACrB,CAAC,CAAC;AAMH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAef;AAsBD,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,IAAI,GAAE,IAAI,CACR,qBAAqB,EACrB,YAAY,CACqB,GAClC,iBAAiB,CAenB;AAGD,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,aAAa,EAAE,SAAS,iBAAiB,EAAE,EAC3C,aAAa,EAAE,MAAM,EACrB,IAAI,GAAE,qBAAuD,GAC5D,OAAO,CAAC,IAAI,CAAC,CAyCf;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,iBAAiB,GAC9B,MAAM,CAIR;AAuBD,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,aAAa,EAAE,SAAS,iBAAiB,EAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,SAAS,iBAAiB,EAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAevC"}
@@ -20,6 +20,10 @@ export const RELATIONSHIP_TYPES = [
20
20
  "supersedes",
21
21
  "relates_to",
22
22
  ];
23
+ export function wrongKindRelationshipError(type, target, wrongKind) {
24
+ const expected = type === "constrains" ? "subject" : "property_value";
25
+ return new Error(`Relationship '${type}' requires target '${target}' to be a ${expected}, observation, or meta fact. ${wrongKind[0]?.toUpperCase()}${wrongKind.slice(1)} facts cannot be direct targets of ${type} relationships.`);
26
+ }
23
27
  export function dependentRelationshipsGoal(entityId) {
24
28
  return `findall([RelType,From], (member(RelType, [${RELATIONSHIP_TYPES.join(", ")}]), kb_relationship(RelType, From, '${escapeAtom(entityId)}')), Dependents)`;
25
29
  }
@@ -192,10 +196,8 @@ export async function validateStrictLanePairing(prolog, relationships) {
192
196
  if (wrongKind === null)
193
197
  continue;
194
198
  const result = await prolog.query(`once((kb_entity('${escapeAtom(target)}', fact, _SlpProps), memberchk(fact_kind=_SlpFK, _SlpProps), normalize_term_atom(_SlpFK, ${wrongKind})))`);
195
- if (result.success) {
196
- const expected = relationship.type === "constrains" ? "subject" : "property_value";
197
- throw new Error(`Relationship '${String(relationship.type)}' requires target '${target}' to be a ${expected}, observation, or meta fact. ${wrongKind[0]?.toUpperCase()}${wrongKind.slice(1)} facts cannot be direct targets of ${String(relationship.type)} relationships.`);
198
- }
199
+ if (result.success)
200
+ throw wrongKindRelationshipError(String(relationship.type), target, wrongKind);
199
201
  }
200
202
  }
201
203
  export async function existingRelationships(prolog, entityId) {
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Declared compensation list for multi-surface mutations.
3
+ *
4
+ * An upsert touches authored sources, relationship shards, generated
5
+ * coordinate artifacts, and the compiled KB — in that order — and a failed
6
+ * attempt must undo them in reverse order without masking the original
7
+ * failure. Instead of tracking rollback state in scattered locals, steps
8
+ * register a named rollback as they succeed; one rollback() call walks the
9
+ * list backwards exactly once.
10
+ */
11
+ export type SagaStep = Readonly<{
12
+ /** Stable identifier used in rollback diagnostics. */
13
+ name: string;
14
+ /**
15
+ * Undo the step. Implementations should target idempotence (guards against
16
+ * concurrent writers, tolerating an already-restored surface); rollback()
17
+ * never re-throws a rollback error.
18
+ */
19
+ rollback: () => void | Promise<void>;
20
+ /**
21
+ * `swallow` (default): preserve the original mutation failure; the recovery
22
+ * journal / next check reconciles. `capture`: report the rollback failure
23
+ * alongside the original error (e.g. as an AggregateError).
24
+ */
25
+ onError?: "swallow" | "capture";
26
+ }>;
27
+ export type SagaRollbackFailure = Readonly<{
28
+ step: string;
29
+ error: unknown;
30
+ }>;
31
+ export declare class MutationSaga {
32
+ private readonly steps;
33
+ private rollbackCompleted;
34
+ private committedAt;
35
+ /** Register a completed step. Call only after the step fully succeeded. */
36
+ add(step: SagaStep): void;
37
+ /**
38
+ * The durable commit point: once marked, rollback() is a no-op — the
39
+ * compiled KB holds the change and post-commit failures surface as
40
+ * committed-with-repairs results instead of undoing committed state.
41
+ */
42
+ markCommitted(): void;
43
+ get committed(): boolean;
44
+ /**
45
+ * Roll back every registered step in reverse order, exactly once. Rollback
46
+ * errors never throw; capture-policy failures are returned so the caller
47
+ * can decide whether to aggregate them into the propagated error.
48
+ */
49
+ rollback(): Promise<readonly SagaRollbackFailure[]>;
50
+ }
51
+ //# sourceMappingURL=saga.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saga.d.ts","sourceRoot":"","sources":["../../../src/operations/mutation/saga.ts"],"names":[],"mappings":"AAkBA;;;;;;;;;GASG;AAGH,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC9B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CACjC,CAAC,CAAC;AAGH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC,CAAC;AAGH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,WAAW,CAAuB;IAE1C,2EAA2E;IAE3E,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAIzB;;;;OAIG;IAEH,aAAa,IAAI,IAAI;IAKrB,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;;;OAIG;IAEG,QAAQ,IAAI,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC;CAkB1D"}
@@ -0,0 +1,67 @@
1
+ /*
2
+ Kibi — repo-local, per-branch, queryable long-term memory for software projects
3
+ Copyright (C) 2026 Piotr Franczyk
4
+
5
+ This program is free software: you can redistribute it and/or modify
6
+ it under the terms of the GNU Affero General Public License as published by
7
+ the Free Software Foundation, either version 3 of the License, or
8
+ (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU Affero General Public License for more details.
14
+
15
+ You should have received a copy of the GNU Affero General Public License
16
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ // implements REQ-014
19
+ export class MutationSaga {
20
+ steps = [];
21
+ rollbackCompleted = false;
22
+ committedAt = null;
23
+ /** Register a completed step. Call only after the step fully succeeded. */
24
+ // implements REQ-014
25
+ add(step) {
26
+ this.steps.push(step);
27
+ }
28
+ /**
29
+ * The durable commit point: once marked, rollback() is a no-op — the
30
+ * compiled KB holds the change and post-commit failures surface as
31
+ * committed-with-repairs results instead of undoing committed state.
32
+ */
33
+ // implements REQ-014
34
+ markCommitted() {
35
+ this.committedAt = this.steps.length;
36
+ }
37
+ // implements REQ-014
38
+ get committed() {
39
+ return this.committedAt !== null;
40
+ }
41
+ /**
42
+ * Roll back every registered step in reverse order, exactly once. Rollback
43
+ * errors never throw; capture-policy failures are returned so the caller
44
+ * can decide whether to aggregate them into the propagated error.
45
+ */
46
+ // implements REQ-014
47
+ async rollback() {
48
+ if (this.rollbackCompleted || this.committedAt !== null)
49
+ return [];
50
+ this.rollbackCompleted = true;
51
+ const captured = [];
52
+ for (const step of [...this.steps].reverse()) {
53
+ try {
54
+ await step.rollback();
55
+ }
56
+ catch (error) {
57
+ if (step.onError === "capture") {
58
+ captured.push({ step: step.name, error });
59
+ }
60
+ // Swallow-policy failures keep the original mutation error intact;
61
+ // the recovery journal and the next check/sync report what could not
62
+ // be restored.
63
+ }
64
+ }
65
+ return captured;
66
+ }
67
+ }