kibi-cli 0.19.0 → 2.0.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 (672) 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.d.ts.map +1 -1
  8. package/dist/cli-operation-loader.js +53 -20
  9. package/dist/cli-operation-metadata.d.ts +21 -8
  10. package/dist/cli-operation-metadata.d.ts.map +1 -1
  11. package/dist/cli-operation-metadata.js +27 -10
  12. package/dist/cli-protocol.d.ts.map +1 -1
  13. package/dist/cli-protocol.js +38 -8
  14. package/dist/cli-register-foundation.d.ts.map +1 -1
  15. package/dist/cli-register-foundation.js +14 -2
  16. package/dist/cli-register-maintenance.d.ts.map +1 -1
  17. package/dist/cli-register-maintenance.js +33 -4
  18. package/dist/cli-register-proof.d.ts +3 -0
  19. package/dist/cli-register-proof.d.ts.map +1 -0
  20. package/dist/cli-register-proof.js +103 -0
  21. package/dist/cli-register-reporting.d.ts.map +1 -1
  22. package/dist/cli-register-reporting.js +11 -0
  23. package/dist/cli.d.ts +4 -0
  24. package/dist/cli.d.ts.map +1 -1
  25. package/dist/cli.js +17 -8
  26. package/dist/commands/aggregated-checks.d.ts +1 -2
  27. package/dist/commands/aggregated-checks.d.ts.map +1 -1
  28. package/dist/commands/aggregated-checks.js +14 -9
  29. package/dist/commands/branch.d.ts +37 -0
  30. package/dist/commands/branch.d.ts.map +1 -1
  31. package/dist/commands/branch.js +375 -40
  32. package/dist/commands/check.d.ts +14 -0
  33. package/dist/commands/check.d.ts.map +1 -1
  34. package/dist/commands/check.js +209 -110
  35. package/dist/commands/coverage.d.ts +1 -0
  36. package/dist/commands/coverage.d.ts.map +1 -1
  37. package/dist/commands/coverage.js +6 -0
  38. package/dist/commands/discovery-shared.d.ts.map +1 -1
  39. package/dist/commands/discovery-shared.js +10 -19
  40. package/dist/commands/doctor.d.ts +26 -1
  41. package/dist/commands/doctor.d.ts.map +1 -1
  42. package/dist/commands/doctor.js +291 -30
  43. package/dist/commands/engine.d.ts +12 -0
  44. package/dist/commands/engine.d.ts.map +1 -1
  45. package/dist/commands/engine.js +50 -7
  46. package/dist/commands/gc.d.ts +5 -2
  47. package/dist/commands/gc.d.ts.map +1 -1
  48. package/dist/commands/gc.js +140 -71
  49. package/dist/commands/github-init.d.ts +57 -0
  50. package/dist/commands/github-init.d.ts.map +1 -0
  51. package/dist/commands/github-init.js +314 -0
  52. package/dist/commands/init-helpers.d.ts +1 -1
  53. package/dist/commands/init-helpers.d.ts.map +1 -1
  54. package/dist/commands/init-helpers.js +109 -28
  55. package/dist/commands/init.d.ts +2 -0
  56. package/dist/commands/init.d.ts.map +1 -1
  57. package/dist/commands/init.js +79 -24
  58. package/dist/commands/legacy-storage-migration.d.ts +54 -0
  59. package/dist/commands/legacy-storage-migration.d.ts.map +1 -0
  60. package/dist/commands/legacy-storage-migration.js +277 -0
  61. package/dist/commands/migrate.d.ts +11 -0
  62. package/dist/commands/migrate.d.ts.map +1 -1
  63. package/dist/commands/migrate.js +249 -96
  64. package/dist/commands/proof-migrate-legacy.d.ts +7 -0
  65. package/dist/commands/proof-migrate-legacy.d.ts.map +1 -0
  66. package/dist/commands/proof-migrate-legacy.js +45 -0
  67. package/dist/commands/proof-prune.d.ts +8 -0
  68. package/dist/commands/proof-prune.d.ts.map +1 -0
  69. package/dist/commands/proof-prune.js +53 -0
  70. package/dist/commands/prove.d.ts +37 -0
  71. package/dist/commands/prove.d.ts.map +1 -0
  72. package/dist/commands/prove.js +470 -0
  73. package/dist/commands/report.d.ts +24 -0
  74. package/dist/commands/report.d.ts.map +1 -0
  75. package/dist/commands/report.js +191 -0
  76. package/dist/commands/sync/cache.d.ts +16 -3
  77. package/dist/commands/sync/cache.d.ts.map +1 -1
  78. package/dist/commands/sync/cache.js +111 -4
  79. package/dist/commands/sync/discovery.d.ts +26 -2
  80. package/dist/commands/sync/discovery.d.ts.map +1 -1
  81. package/dist/commands/sync/discovery.js +204 -15
  82. package/dist/commands/sync/extraction.d.ts +8 -1
  83. package/dist/commands/sync/extraction.d.ts.map +1 -1
  84. package/dist/commands/sync/extraction.js +38 -4
  85. package/dist/commands/sync/manifest.d.ts +9 -6
  86. package/dist/commands/sync/manifest.d.ts.map +1 -1
  87. package/dist/commands/sync/manifest.js +195 -60
  88. package/dist/commands/sync/persistence.d.ts +4 -1
  89. package/dist/commands/sync/persistence.d.ts.map +1 -1
  90. package/dist/commands/sync/persistence.js +26 -12
  91. package/dist/commands/sync/staging.d.ts +1 -0
  92. package/dist/commands/sync/staging.d.ts.map +1 -1
  93. package/dist/commands/sync/staging.js +5 -2
  94. package/dist/commands/sync/untracked-targets.d.ts +24 -0
  95. package/dist/commands/sync/untracked-targets.d.ts.map +1 -0
  96. package/dist/commands/sync/untracked-targets.js +108 -0
  97. package/dist/commands/sync.d.ts +17 -1
  98. package/dist/commands/sync.d.ts.map +1 -1
  99. package/dist/commands/sync.js +375 -106
  100. package/dist/diagnostics.d.ts +1 -1
  101. package/dist/diagnostics.d.ts.map +1 -1
  102. package/dist/engine-daemon.d.ts +3 -1
  103. package/dist/engine-daemon.d.ts.map +1 -1
  104. package/dist/engine-daemon.js +49 -20
  105. package/dist/engine.d.ts +34 -3
  106. package/dist/engine.d.ts.map +1 -1
  107. package/dist/engine.js +578 -42
  108. package/dist/env.d.ts.map +1 -1
  109. package/dist/env.js +5 -6
  110. package/dist/extractors/manifest.d.ts +13 -1
  111. package/dist/extractors/manifest.d.ts.map +1 -1
  112. package/dist/extractors/manifest.js +97 -10
  113. package/dist/extractors/markdown.d.ts +5 -2
  114. package/dist/extractors/markdown.d.ts.map +1 -1
  115. package/dist/extractors/markdown.js +47 -12
  116. package/dist/extractors/playwright-cases.d.ts +24 -0
  117. package/dist/extractors/playwright-cases.d.ts.map +1 -0
  118. package/dist/extractors/playwright-cases.js +126 -0
  119. package/dist/extractors/relationships.d.ts +6 -0
  120. package/dist/extractors/relationships.d.ts.map +1 -1
  121. package/dist/extractors/relationships.js +2 -1
  122. package/dist/extractors/symbol-coordinates.d.ts +81 -3
  123. package/dist/extractors/symbol-coordinates.d.ts.map +1 -1
  124. package/dist/extractors/symbol-coordinates.js +389 -51
  125. package/dist/extractors/symbols-coordinator.js +11 -1
  126. package/dist/extractors/symbols-ts.d.ts +1 -0
  127. package/dist/extractors/symbols-ts.d.ts.map +1 -1
  128. package/dist/extractors/symbols-ts.js +142 -67
  129. package/dist/intent-search.d.ts +61 -0
  130. package/dist/intent-search.d.ts.map +1 -0
  131. package/dist/intent-search.js +437 -0
  132. package/dist/logic/ir.d.ts +1 -0
  133. package/dist/logic/ir.d.ts.map +1 -1
  134. package/dist/logic/ir.js +1 -1
  135. package/dist/operations/bootstrap/activation.d.ts +5 -0
  136. package/dist/operations/bootstrap/activation.d.ts.map +1 -0
  137. package/dist/operations/{autopilot → bootstrap}/activation.js +58 -33
  138. package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts.map +1 -1
  139. package/dist/operations/bootstrap/candidates.d.ts +4 -0
  140. package/dist/operations/{autopilot → bootstrap}/candidates.d.ts.map +1 -1
  141. package/dist/operations/{autopilot → bootstrap}/candidates.js +22 -8
  142. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts +2 -2
  143. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts.map +1 -1
  144. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.js +46 -6
  145. package/dist/operations/{autopilot → bootstrap}/discovery.d.ts +1 -1
  146. package/dist/operations/bootstrap/discovery.d.ts.map +1 -0
  147. package/dist/operations/{autopilot → bootstrap}/discovery.js +21 -14
  148. package/dist/operations/bootstrap/generate.d.ts +9 -0
  149. package/dist/operations/bootstrap/generate.d.ts.map +1 -0
  150. package/dist/operations/bootstrap/generate.js +207 -0
  151. package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts +2 -2
  152. package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts.map +1 -1
  153. package/dist/operations/{autopilot → bootstrap}/guidance-actions.js +4 -4
  154. package/dist/operations/{autopilot → bootstrap}/guidance.d.ts +3 -2
  155. package/dist/operations/bootstrap/guidance.d.ts.map +1 -0
  156. package/dist/operations/{autopilot → bootstrap}/guidance.js +3 -1
  157. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts +2 -2
  158. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts.map +1 -1
  159. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.js +4 -3
  160. package/dist/operations/bootstrap/presentation.d.ts +15 -0
  161. package/dist/operations/bootstrap/presentation.d.ts.map +1 -0
  162. package/dist/operations/bootstrap/presentation.js +177 -0
  163. package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts.map +1 -1
  164. package/dist/operations/{autopilot → bootstrap}/types.d.ts +63 -21
  165. package/dist/operations/bootstrap/types.d.ts.map +1 -0
  166. package/dist/operations/bootstrap/types.js +25 -0
  167. package/dist/operations/modeling/model-requirement.d.ts +5 -0
  168. package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
  169. package/dist/operations/modeling/model-requirement.js +57 -63
  170. package/dist/operations/modeling/predicate-applicability.d.ts +16 -0
  171. package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -0
  172. package/dist/operations/modeling/predicate-applicability.js +375 -0
  173. package/dist/operations/modeling/predicate-applyplan.d.ts +13 -2
  174. package/dist/operations/modeling/predicate-applyplan.d.ts.map +1 -1
  175. package/dist/operations/modeling/predicate-applyplan.js +100 -3
  176. package/dist/operations/modeling/predicate-bindings.d.ts +6 -0
  177. package/dist/operations/modeling/predicate-bindings.d.ts.map +1 -0
  178. package/dist/operations/modeling/predicate-bindings.js +122 -0
  179. package/dist/operations/modeling/predicate-catalog-2.d.ts.map +1 -1
  180. package/dist/operations/modeling/predicate-catalog-2.js +18 -2
  181. package/dist/operations/modeling/predicate-catalog-3.d.ts.map +1 -1
  182. package/dist/operations/modeling/predicate-catalog-3.js +17 -1
  183. package/dist/operations/modeling/predicate-catalog-4.d.ts.map +1 -1
  184. package/dist/operations/modeling/predicate-catalog-4.js +155 -0
  185. package/dist/operations/modeling/predicate-catalog-5.d.ts +10 -0
  186. package/dist/operations/modeling/predicate-catalog-5.d.ts.map +1 -0
  187. package/dist/operations/modeling/predicate-catalog-5.js +291 -0
  188. package/dist/operations/modeling/predicate-catalog.d.ts.map +1 -1
  189. package/dist/operations/modeling/predicate-catalog.js +4 -0
  190. package/dist/operations/modeling/predicate-inference-1.d.ts.map +1 -1
  191. package/dist/operations/modeling/predicate-inference-1.js +8 -0
  192. package/dist/operations/modeling/predicate-inference-launcher.d.ts +10 -0
  193. package/dist/operations/modeling/predicate-inference-launcher.d.ts.map +1 -0
  194. package/dist/operations/modeling/predicate-inference-launcher.js +13 -0
  195. package/dist/operations/modeling/predicate-inference.d.ts.map +1 -1
  196. package/dist/operations/modeling/predicate-inference.js +4 -0
  197. package/dist/operations/modeling/predicate-loader.d.ts +1 -0
  198. package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
  199. package/dist/operations/modeling/predicate-loader.js +11 -3
  200. package/dist/operations/modeling/predicate-ranker.d.ts +8 -1
  201. package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
  202. package/dist/operations/modeling/predicate-ranker.js +159 -24
  203. package/dist/operations/modeling/predicate-score-3.d.ts.map +1 -1
  204. package/dist/operations/modeling/predicate-score-3.js +6 -0
  205. package/dist/operations/modeling/predicate-types.d.ts +35 -1
  206. package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
  207. package/dist/operations/modeling/predicate-usage-hints-3.d.ts.map +1 -1
  208. package/dist/operations/modeling/predicate-usage-hints-3.js +40 -0
  209. package/dist/operations/modeling/predicate-usage-hints-4.d.ts +3 -0
  210. package/dist/operations/modeling/predicate-usage-hints-4.d.ts.map +1 -0
  211. package/dist/operations/modeling/predicate-usage-hints-4.js +84 -0
  212. package/dist/operations/modeling/predicate-utils.d.ts.map +1 -1
  213. package/dist/operations/modeling/predicate-utils.js +2 -0
  214. package/dist/operations/modeling/suggest-predicates.d.ts +4 -2
  215. package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
  216. package/dist/operations/modeling/suggest-predicates.js +203 -32
  217. package/dist/operations/mutation/contradictions.d.ts +2 -1
  218. package/dist/operations/mutation/contradictions.d.ts.map +1 -1
  219. package/dist/operations/mutation/contradictions.js +26 -5
  220. package/dist/operations/mutation/delete.d.ts +3 -0
  221. package/dist/operations/mutation/delete.d.ts.map +1 -1
  222. package/dist/operations/mutation/delete.js +483 -19
  223. package/dist/operations/mutation/entity-projection.d.ts +11 -0
  224. package/dist/operations/mutation/entity-projection.d.ts.map +1 -0
  225. package/dist/operations/mutation/entity-projection.js +14 -0
  226. package/dist/operations/mutation/relationships.d.ts +11 -0
  227. package/dist/operations/mutation/relationships.d.ts.map +1 -1
  228. package/dist/operations/mutation/relationships.js +77 -5
  229. package/dist/operations/mutation/saga.d.ts +51 -0
  230. package/dist/operations/mutation/saga.d.ts.map +1 -0
  231. package/dist/operations/mutation/saga.js +67 -0
  232. package/dist/operations/mutation/serialization.d.ts.map +1 -1
  233. package/dist/operations/mutation/serialization.js +3 -1
  234. package/dist/operations/mutation/source-authoring.d.ts +65 -0
  235. package/dist/operations/mutation/source-authoring.d.ts.map +1 -0
  236. package/dist/operations/mutation/source-authoring.js +576 -0
  237. package/dist/operations/mutation/strict-fact.d.ts +1 -0
  238. package/dist/operations/mutation/strict-fact.d.ts.map +1 -1
  239. package/dist/operations/mutation/strict-fact.js +8 -5
  240. package/dist/operations/mutation/symbol-compiler-lock.d.ts +54 -0
  241. package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -0
  242. package/dist/operations/mutation/symbol-compiler-lock.js +337 -0
  243. package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
  244. package/dist/operations/mutation/symbol-granularity.js +35 -4
  245. package/dist/operations/mutation/symbol-refresh.d.ts +19 -1
  246. package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
  247. package/dist/operations/mutation/symbol-refresh.js +227 -63
  248. package/dist/operations/mutation/types.d.ts +57 -1
  249. package/dist/operations/mutation/types.d.ts.map +1 -1
  250. package/dist/operations/mutation/upsert.d.ts +18 -2
  251. package/dist/operations/mutation/upsert.d.ts.map +1 -1
  252. package/dist/operations/mutation/upsert.js +403 -32
  253. package/dist/operations/mutation/validate-upsert.js +2 -2
  254. package/dist/operations/mutation/validation.d.ts.map +1 -1
  255. package/dist/operations/mutation/validation.js +47 -4
  256. package/dist/operations/mutation/warnings.d.ts +1 -0
  257. package/dist/operations/mutation/warnings.d.ts.map +1 -1
  258. package/dist/operations/mutation/warnings.js +7 -5
  259. package/dist/operations/mutation/workspace-mutation-lock.d.ts +60 -0
  260. package/dist/operations/mutation/workspace-mutation-lock.d.ts.map +1 -0
  261. package/dist/operations/mutation/workspace-mutation-lock.js +362 -0
  262. package/dist/operations/planning/apply-plan.d.ts +19 -0
  263. package/dist/operations/planning/apply-plan.d.ts.map +1 -0
  264. package/dist/operations/planning/apply-plan.js +1514 -0
  265. package/dist/operations/planning/compile-intent.d.ts +108 -0
  266. package/dist/operations/planning/compile-intent.d.ts.map +1 -0
  267. package/dist/operations/planning/compile-intent.js +618 -0
  268. package/dist/operations/proof/ingest-proof.d.ts +34 -0
  269. package/dist/operations/proof/ingest-proof.d.ts.map +1 -0
  270. package/dist/operations/proof/ingest-proof.js +307 -0
  271. package/dist/operations/proof/migrate-legacy-receipts.d.ts +30 -0
  272. package/dist/operations/proof/migrate-legacy-receipts.d.ts.map +1 -0
  273. package/dist/operations/proof/migrate-legacy-receipts.js +88 -0
  274. package/dist/operations/proof/prune-receipts.d.ts +35 -0
  275. package/dist/operations/proof/prune-receipts.d.ts.map +1 -0
  276. package/dist/operations/proof/prune-receipts.js +91 -0
  277. package/dist/operations/proof/receipt-document.d.ts +29 -0
  278. package/dist/operations/proof/receipt-document.d.ts.map +1 -0
  279. package/dist/operations/proof/receipt-document.js +117 -0
  280. package/dist/operations/semantic-advisor/analyze-prose.d.ts +1 -0
  281. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  282. package/dist/operations/semantic-advisor/analyze-prose.js +52 -28
  283. package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
  284. package/dist/operations/semantic-advisor/clauses.js +35 -9
  285. package/dist/operations/semantic-advisor/ingestion-boundary.d.ts.map +1 -1
  286. package/dist/operations/semantic-advisor/ingestion-boundary.js +7 -3
  287. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts +51 -0
  288. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts.map +1 -0
  289. package/dist/operations/semantic-advisor/predicate-rules-launcher.js +96 -0
  290. package/dist/operations/semantic-advisor/strict-count-rules.d.ts +2 -0
  291. package/dist/operations/semantic-advisor/strict-count-rules.d.ts.map +1 -1
  292. package/dist/operations/semantic-advisor/strict-count-rules.js +40 -25
  293. package/dist/operations/semantic-advisor/types.d.ts +13 -5
  294. package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
  295. package/dist/prolog/codec.d.ts +13 -1
  296. package/dist/prolog/codec.d.ts.map +1 -1
  297. package/dist/prolog/codec.js +269 -153
  298. package/dist/prolog/error-terms.d.ts +47 -0
  299. package/dist/prolog/error-terms.d.ts.map +1 -0
  300. package/dist/prolog/error-terms.js +334 -0
  301. package/dist/prolog/janitor.d.ts +50 -0
  302. package/dist/prolog/janitor.d.ts.map +1 -0
  303. package/dist/prolog/janitor.js +154 -0
  304. package/dist/prolog/store-lock.d.ts +45 -0
  305. package/dist/prolog/store-lock.d.ts.map +1 -0
  306. package/dist/prolog/store-lock.js +195 -0
  307. package/dist/prolog.d.ts +7 -0
  308. package/dist/prolog.d.ts.map +1 -1
  309. package/dist/prolog.js +82 -25
  310. package/dist/proof/evaluate.d.ts +27 -0
  311. package/dist/proof/evaluate.d.ts.map +1 -0
  312. package/dist/proof/evaluate.js +151 -0
  313. package/dist/proof/inspect.d.ts +12 -0
  314. package/dist/proof/inspect.d.ts.map +1 -0
  315. package/dist/proof/inspect.js +236 -0
  316. package/dist/proof/integrations.d.ts +35 -0
  317. package/dist/proof/integrations.d.ts.map +1 -0
  318. package/dist/proof/integrations.js +123 -0
  319. package/dist/proof/producers/junit-adapter.d.ts +26 -0
  320. package/dist/proof/producers/junit-adapter.d.ts.map +1 -0
  321. package/dist/proof/producers/junit-adapter.js +186 -0
  322. package/dist/proof/producers/playwright-case-id.d.ts +8 -0
  323. package/dist/proof/producers/playwright-case-id.d.ts.map +1 -0
  324. package/dist/proof/producers/playwright-case-id.js +25 -0
  325. package/dist/proof/producers/playwright-reporter.d.ts +27 -0
  326. package/dist/proof/producers/playwright-reporter.d.ts.map +1 -0
  327. package/dist/proof/producers/playwright-reporter.js +138 -0
  328. package/dist/proof/producers/tap-adapter.d.ts +10 -0
  329. package/dist/proof/producers/tap-adapter.d.ts.map +1 -0
  330. package/dist/proof/producers/tap-adapter.js +200 -0
  331. package/dist/proof/receipt-outcome.d.ts +2 -0
  332. package/dist/proof/receipt-outcome.d.ts.map +1 -0
  333. package/dist/proof/receipt-outcome.js +1 -0
  334. package/dist/public/branch-resolver.d.ts +1 -0
  335. package/dist/public/branch-resolver.d.ts.map +1 -1
  336. package/dist/public/branch-resolver.js +1 -0
  337. package/dist/public/check-types.d.ts +2 -2
  338. package/dist/public/check-types.d.ts.map +1 -1
  339. package/dist/public/check-types.js +16 -16
  340. package/dist/public/diagnostic-usage.d.ts.map +1 -1
  341. package/dist/public/diagnostic-usage.js +74 -6
  342. package/dist/public/distribution-parity.d.ts +7 -1
  343. package/dist/public/distribution-parity.d.ts.map +1 -1
  344. package/dist/public/distribution-parity.js +15 -9
  345. package/dist/public/ignore-policy.d.ts.map +1 -1
  346. package/dist/public/ignore-policy.js +16 -4
  347. package/dist/public/impact/coverage-depth-quality.d.ts +7 -1
  348. package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
  349. package/dist/public/impact/coverage-depth-quality.js +22 -4
  350. package/dist/public/impact/diagnostics.d.ts.map +1 -1
  351. package/dist/public/impact/diagnostics.js +2 -2
  352. package/dist/public/impact/diff-meaning.d.ts +1 -0
  353. package/dist/public/impact/diff-meaning.d.ts.map +1 -1
  354. package/dist/public/impact/diff-meaning.js +5 -2
  355. package/dist/public/impact/full-kb-quality.d.ts +7 -2
  356. package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
  357. package/dist/public/impact/full-kb-quality.js +364 -39
  358. package/dist/public/impact/manifest.d.ts.map +1 -1
  359. package/dist/public/impact/manifest.js +2 -5
  360. package/dist/public/operational-artifacts.d.ts.map +1 -1
  361. package/dist/public/operational-artifacts.js +7 -1
  362. package/dist/public/operations/catalog.d.ts +900 -34
  363. package/dist/public/operations/catalog.d.ts.map +1 -1
  364. package/dist/public/operations/catalog.js +130 -6
  365. package/dist/public/operations/check-executor.d.ts +2 -2
  366. package/dist/public/operations/check-executor.d.ts.map +1 -1
  367. package/dist/public/operations/check-executor.js +68 -13
  368. package/dist/public/operations/check-format-shared.d.ts +3 -0
  369. package/dist/public/operations/check-format-shared.d.ts.map +1 -1
  370. package/dist/public/operations/check-format-shared.js +3 -0
  371. package/dist/public/operations/check-helpers.d.ts +27 -2
  372. package/dist/public/operations/check-helpers.d.ts.map +1 -1
  373. package/dist/public/operations/check-helpers.js +62 -26
  374. package/dist/public/operations/contracts.d.ts +18 -0
  375. package/dist/public/operations/contracts.d.ts.map +1 -0
  376. package/dist/public/operations/contracts.js +334 -0
  377. package/dist/public/operations/discovery-entities.d.ts +3 -0
  378. package/dist/public/operations/discovery-entities.d.ts.map +1 -1
  379. package/dist/public/operations/discovery-entities.js +4 -0
  380. package/dist/public/operations/discovery-executors.d.ts +43 -7
  381. package/dist/public/operations/discovery-executors.d.ts.map +1 -1
  382. package/dist/public/operations/discovery-executors.js +216 -13
  383. package/dist/public/operations/index.d.ts +9 -4
  384. package/dist/public/operations/index.d.ts.map +1 -1
  385. package/dist/public/operations/index.js +8 -3
  386. package/dist/public/operations/migration-plan.d.ts +102 -0
  387. package/dist/public/operations/migration-plan.d.ts.map +1 -0
  388. package/dist/public/operations/migration-plan.js +539 -0
  389. package/dist/public/operations/node-ports.d.ts.map +1 -1
  390. package/dist/public/operations/node-ports.js +71 -11
  391. package/dist/public/operations/prolog-json.d.ts +14 -0
  392. package/dist/public/operations/prolog-json.d.ts.map +1 -1
  393. package/dist/public/operations/prolog-json.js +44 -5
  394. package/dist/public/operations/repair-plan.d.ts +3 -3
  395. package/dist/public/operations/repair-plan.d.ts.map +1 -1
  396. package/dist/public/operations/repair-plan.js +49 -18
  397. package/dist/public/operations/result-envelope.d.ts +14 -0
  398. package/dist/public/operations/result-envelope.d.ts.map +1 -0
  399. package/dist/public/operations/result-envelope.js +106 -0
  400. package/dist/public/operations/runtime-types.d.ts +102 -7
  401. package/dist/public/operations/runtime-types.d.ts.map +1 -1
  402. package/dist/public/operations/source-relationship-parity.d.ts +13 -0
  403. package/dist/public/operations/source-relationship-parity.d.ts.map +1 -0
  404. package/dist/public/operations/source-relationship-parity.js +162 -0
  405. package/dist/public/operations/specs/{autopilot.d.ts → bootstrap.d.ts} +9 -9
  406. package/dist/public/operations/specs/bootstrap.d.ts.map +1 -0
  407. package/dist/public/operations/specs/{autopilot.js → bootstrap.js} +8 -7
  408. package/dist/public/operations/specs/check-rules.generated.d.ts +5 -0
  409. package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -0
  410. package/dist/public/operations/specs/check-rules.generated.js +34 -0
  411. package/dist/public/operations/specs/check.d.ts +9 -4
  412. package/dist/public/operations/specs/check.d.ts.map +1 -1
  413. package/dist/public/operations/specs/check.js +10 -21
  414. package/dist/public/operations/specs/discovery.d.ts +87 -3
  415. package/dist/public/operations/specs/discovery.d.ts.map +1 -1
  416. package/dist/public/operations/specs/discovery.js +53 -3
  417. package/dist/public/operations/specs/modeling.d.ts +3 -3
  418. package/dist/public/operations/specs/modeling.js +3 -3
  419. package/dist/public/operations/specs/mutation-schemas.d.ts +251 -14
  420. package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
  421. package/dist/public/operations/specs/mutation-schemas.js +16 -6
  422. package/dist/public/operations/specs/mutation.d.ts +42 -2
  423. package/dist/public/operations/specs/mutation.d.ts.map +1 -1
  424. package/dist/public/operations/specs/mutation.js +26 -2
  425. package/dist/public/operations/specs/planning.d.ts +279 -0
  426. package/dist/public/operations/specs/planning.d.ts.map +1 -0
  427. package/dist/public/operations/specs/planning.js +197 -0
  428. package/dist/public/operations/specs/proof.d.ts +212 -0
  429. package/dist/public/operations/specs/proof.d.ts.map +1 -0
  430. package/dist/public/operations/specs/proof.js +30 -0
  431. package/dist/public/operations/specs/reporting.d.ts +23 -1
  432. package/dist/public/operations/specs/reporting.d.ts.map +1 -1
  433. package/dist/public/operations/specs/reporting.js +156 -11
  434. package/dist/public/operations/specs/upsert.d.ts +265 -14
  435. package/dist/public/operations/specs/upsert.d.ts.map +1 -1
  436. package/dist/public/operations/specs/upsert.js +9 -0
  437. package/dist/public/operations/symbol-repair-plan.d.ts +22 -0
  438. package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -0
  439. package/dist/public/operations/symbol-repair-plan.js +238 -0
  440. package/dist/public/operations/types.d.ts +52 -1
  441. package/dist/public/operations/types.d.ts.map +1 -1
  442. package/dist/public/proof-fingerprint.d.ts +54 -0
  443. package/dist/public/proof-fingerprint.d.ts.map +1 -0
  444. package/dist/public/proof-fingerprint.js +141 -0
  445. package/dist/public/proof-protocol.d.ts +354 -0
  446. package/dist/public/proof-protocol.d.ts.map +1 -0
  447. package/dist/public/proof-protocol.js +454 -0
  448. package/dist/public/proof-receipt.d.ts +279 -0
  449. package/dist/public/proof-receipt.d.ts.map +1 -0
  450. package/dist/public/proof-receipt.js +377 -0
  451. package/dist/public/schemas/entity.d.ts.map +1 -1
  452. package/dist/public/schemas/entity.js +22 -6
  453. package/dist/public/skills/kibi-bootstrap/SKILL.md +58 -0
  454. package/dist/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
  455. package/dist/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
  456. package/dist/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
  457. package/dist/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
  458. package/dist/public/skills/kibi-freshness/SKILL.md +39 -9
  459. package/dist/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
  460. package/dist/public/skills/kibi-freshness/resources/operation-access.md +6 -0
  461. package/dist/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
  462. package/dist/public/skills/kibi-traceability/SKILL.md +47 -47
  463. package/dist/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
  464. package/dist/public/skills/kibi-traceability/resources/operation-access.md +5 -0
  465. package/dist/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
  466. package/dist/public/skills/kibi-traceability/resources/traceability.md +8 -0
  467. package/dist/public/skills/kibi-usage/SKILL.md +136 -231
  468. package/dist/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
  469. package/dist/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
  470. package/dist/public/skills/kibi-usage/resources/operation-access.md +36 -38
  471. package/dist/public/skills/kibi-usage/resources/proof.md +105 -0
  472. package/dist/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
  473. package/dist/public/skills/kibi-usage/resources/source-authoring.md +31 -0
  474. package/dist/public/skills/kibi-usage/resources/workflows.md +57 -4
  475. package/dist/public/symbol-granularity.d.ts +3 -14
  476. package/dist/public/symbol-granularity.d.ts.map +1 -1
  477. package/dist/public/symbol-granularity.generated.d.ts +16 -0
  478. package/dist/public/symbol-granularity.generated.d.ts.map +1 -0
  479. package/dist/public/symbol-granularity.generated.js +20 -0
  480. package/dist/public/symbol-granularity.js +6 -46
  481. package/dist/public/telemetry-acceptance.d.ts +3 -70
  482. package/dist/public/telemetry-acceptance.d.ts.map +1 -1
  483. package/dist/public/telemetry-acceptance.js +11 -2
  484. package/dist/public/telemetry-remediation.js +1 -1
  485. package/dist/relationships/shards.d.ts +16 -0
  486. package/dist/relationships/shards.d.ts.map +1 -1
  487. package/dist/relationships/shards.js +87 -2
  488. package/dist/report/brand.d.ts +19 -0
  489. package/dist/report/brand.d.ts.map +1 -0
  490. package/dist/report/brand.js +112 -0
  491. package/dist/report/html-report.css +282 -0
  492. package/dist/report/html-report.d.ts +21 -0
  493. package/dist/report/html-report.d.ts.map +1 -0
  494. package/dist/report/html-report.js +700 -0
  495. package/dist/report/relative-time.d.ts +4 -0
  496. package/dist/report/relative-time.d.ts.map +1 -0
  497. package/dist/report/relative-time.js +46 -0
  498. package/dist/report/report-view.d.ts +17 -0
  499. package/dist/report/report-view.d.ts.map +1 -0
  500. package/dist/report/report-view.js +33 -0
  501. package/dist/report/repository.d.ts +35 -0
  502. package/dist/report/repository.d.ts.map +1 -0
  503. package/dist/report/repository.js +151 -0
  504. package/dist/runtime/cli-runtime.d.ts +2 -0
  505. package/dist/runtime/cli-runtime.d.ts.map +1 -1
  506. package/dist/runtime/cli-runtime.js +90 -23
  507. package/dist/schemas/entity.schema.json +1254 -239
  508. package/dist/search-ranking.d.ts +1 -0
  509. package/dist/search-ranking.d.ts.map +1 -1
  510. package/dist/search-ranking.js +3 -0
  511. package/dist/traceability/evidence-model.d.ts +30 -2
  512. package/dist/traceability/evidence-model.d.ts.map +1 -1
  513. package/dist/traceability/evidence-model.js +2 -2
  514. package/dist/traceability/git-staged.d.ts +20 -0
  515. package/dist/traceability/git-staged.d.ts.map +1 -1
  516. package/dist/traceability/git-staged.js +156 -37
  517. package/dist/traceability/markdown-validate.d.ts.map +1 -1
  518. package/dist/traceability/markdown-validate.js +12 -7
  519. package/dist/traceability/staged-diagnostics.d.ts +7 -0
  520. package/dist/traceability/staged-diagnostics.d.ts.map +1 -1
  521. package/dist/traceability/staged-diagnostics.js +78 -7
  522. package/dist/traceability/staged-file-coverage.d.ts +33 -0
  523. package/dist/traceability/staged-file-coverage.d.ts.map +1 -0
  524. package/dist/traceability/staged-file-coverage.js +284 -0
  525. package/dist/traceability/staged-impact-contract.d.ts +3 -3
  526. package/dist/traceability/staged-impact-contract.d.ts.map +1 -1
  527. package/dist/traceability/staged-impact-contract.js +12 -40
  528. package/dist/traceability/staged-symbols-manifest.d.ts +13 -0
  529. package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
  530. package/dist/traceability/staged-symbols-manifest.js +142 -26
  531. package/dist/traceability/symbol-extract.d.ts +5 -0
  532. package/dist/traceability/symbol-extract.d.ts.map +1 -1
  533. package/dist/traceability/symbol-extract.js +1 -1
  534. package/dist/traceability/temp-kb.d.ts +2 -0
  535. package/dist/traceability/temp-kb.d.ts.map +1 -1
  536. package/dist/traceability/temp-kb.js +14 -2
  537. package/dist/types/entities.d.ts +5 -0
  538. package/dist/types/entities.d.ts.map +1 -1
  539. package/dist/utils/branch-resolver.d.ts +25 -10
  540. package/dist/utils/branch-resolver.d.ts.map +1 -1
  541. package/dist/utils/branch-resolver.js +124 -38
  542. package/dist/utils/branch-store-locator.d.ts +23 -0
  543. package/dist/utils/branch-store-locator.d.ts.map +1 -0
  544. package/dist/utils/branch-store-locator.js +90 -0
  545. package/dist/utils/branch-store.d.ts +21 -0
  546. package/dist/utils/branch-store.d.ts.map +1 -0
  547. package/dist/utils/branch-store.js +157 -0
  548. package/dist/utils/config.d.ts +39 -37
  549. package/dist/utils/config.d.ts.map +1 -1
  550. package/dist/utils/config.js +107 -119
  551. package/dist/utils/kb-manifest.d.ts +35 -0
  552. package/dist/utils/kb-manifest.d.ts.map +1 -0
  553. package/dist/utils/kb-manifest.js +154 -0
  554. package/dist/utils/kb-paths.d.ts +54 -0
  555. package/dist/utils/kb-paths.d.ts.map +1 -0
  556. package/dist/utils/kb-paths.js +125 -0
  557. package/dist/utils/manifest-paths.d.ts +4 -4
  558. package/dist/utils/manifest-paths.d.ts.map +1 -1
  559. package/dist/utils/manifest-paths.js +8 -56
  560. package/dist/utils/rule-registry.d.ts +42 -24
  561. package/dist/utils/rule-registry.d.ts.map +1 -1
  562. package/dist/utils/rule-registry.generated.d.ts +97 -0
  563. package/dist/utils/rule-registry.generated.d.ts.map +1 -0
  564. package/dist/utils/rule-registry.generated.js +125 -0
  565. package/dist/utils/rule-registry.js +52 -148
  566. package/dist/utils/schema-version.d.ts +5 -5
  567. package/dist/utils/schema-version.d.ts.map +1 -1
  568. package/dist/utils/schema-version.js +26 -6
  569. package/dist/utils/strict-modeling.d.ts +1 -4
  570. package/dist/utils/strict-modeling.d.ts.map +1 -1
  571. package/dist/utils/strict-modeling.js +8 -9
  572. package/package.json +47 -11
  573. package/schema/config.json +2 -2
  574. package/schema/manifest.json +26 -0
  575. package/src/public/branch-resolver.ts +1 -0
  576. package/src/public/check-types.ts +22 -19
  577. package/src/public/diagnostic-usage.ts +84 -6
  578. package/src/public/distribution-parity.ts +17 -9
  579. package/src/public/ignore-policy.ts +16 -10
  580. package/src/public/impact/coverage-depth-quality.ts +37 -1
  581. package/src/public/impact/diagnostics.ts +2 -1
  582. package/src/public/impact/diff-meaning.ts +11 -4
  583. package/src/public/impact/full-kb-quality.ts +545 -41
  584. package/src/public/impact/manifest.ts +2 -4
  585. package/src/public/operational-artifacts.ts +9 -1
  586. package/src/public/operations/catalog.ts +153 -10
  587. package/src/public/operations/check-executor.ts +98 -15
  588. package/src/public/operations/check-format-shared.ts +6 -0
  589. package/src/public/operations/check-helpers.ts +74 -35
  590. package/src/public/operations/contracts.ts +382 -0
  591. package/src/public/operations/discovery-entities.ts +7 -0
  592. package/src/public/operations/discovery-executors.ts +315 -25
  593. package/src/public/operations/index.ts +9 -4
  594. package/src/public/operations/migration-plan.ts +747 -0
  595. package/src/public/operations/node-ports.ts +87 -13
  596. package/src/public/operations/prolog-json.ts +60 -5
  597. package/src/public/operations/repair-plan.ts +60 -22
  598. package/src/public/operations/result-envelope.ts +141 -0
  599. package/src/public/operations/runtime-types.ts +96 -5
  600. package/src/public/operations/source-relationship-parity.ts +226 -0
  601. package/src/public/operations/specs/{autopilot.ts → bootstrap.ts} +17 -16
  602. package/src/public/operations/specs/check-rules.generated.ts +37 -0
  603. package/src/public/operations/specs/check.ts +14 -22
  604. package/src/public/operations/specs/discovery.ts +57 -3
  605. package/src/public/operations/specs/modeling.ts +3 -3
  606. package/src/public/operations/specs/mutation-schemas.ts +24 -6
  607. package/src/public/operations/specs/mutation.ts +27 -2
  608. package/src/public/operations/specs/planning.ts +241 -0
  609. package/src/public/operations/specs/proof.ts +43 -0
  610. package/src/public/operations/specs/reporting.ts +193 -12
  611. package/src/public/operations/specs/upsert.ts +10 -0
  612. package/src/public/operations/symbol-repair-plan.ts +324 -0
  613. package/src/public/operations/types.ts +62 -1
  614. package/src/public/proof-fingerprint.ts +216 -0
  615. package/src/public/proof-protocol-types.d.ts +96 -0
  616. package/src/public/proof-protocol.ts +589 -0
  617. package/src/public/proof-receipt.ts +499 -0
  618. package/src/public/schemas/entity.ts +27 -6
  619. package/src/public/skills/kibi-bootstrap/SKILL.md +58 -0
  620. package/src/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
  621. package/src/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
  622. package/src/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
  623. package/src/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
  624. package/src/public/skills/kibi-freshness/SKILL.md +39 -9
  625. package/src/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
  626. package/src/public/skills/kibi-freshness/resources/operation-access.md +6 -0
  627. package/src/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
  628. package/src/public/skills/kibi-traceability/SKILL.md +47 -47
  629. package/src/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
  630. package/src/public/skills/kibi-traceability/resources/operation-access.md +5 -0
  631. package/src/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
  632. package/src/public/skills/kibi-traceability/resources/traceability.md +8 -0
  633. package/src/public/skills/kibi-usage/SKILL.md +136 -231
  634. package/src/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
  635. package/src/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
  636. package/src/public/skills/kibi-usage/resources/operation-access.md +36 -38
  637. package/src/public/skills/kibi-usage/resources/proof.md +105 -0
  638. package/src/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
  639. package/src/public/skills/kibi-usage/resources/source-authoring.md +31 -0
  640. package/src/public/skills/kibi-usage/resources/workflows.md +57 -4
  641. package/src/public/symbol-granularity.generated.ts +41 -0
  642. package/src/public/symbol-granularity.ts +35 -59
  643. package/src/public/telemetry-acceptance-types.d.ts +98 -0
  644. package/src/public/telemetry-acceptance.ts +30 -93
  645. package/src/public/telemetry-remediation.ts +1 -1
  646. package/src/schemas/entity.schema.json +1254 -239
  647. package/templates/github/kibi-badge.yml +86 -0
  648. package/templates/github/kibi-report.yml +84 -0
  649. package/dist/operations/autopilot/activation.d.ts +0 -4
  650. package/dist/operations/autopilot/activation.d.ts.map +0 -1
  651. package/dist/operations/autopilot/candidates.d.ts +0 -4
  652. package/dist/operations/autopilot/discovery.d.ts.map +0 -1
  653. package/dist/operations/autopilot/generate.d.ts +0 -8
  654. package/dist/operations/autopilot/generate.d.ts.map +0 -1
  655. package/dist/operations/autopilot/generate.js +0 -112
  656. package/dist/operations/autopilot/guidance.d.ts.map +0 -1
  657. package/dist/operations/autopilot/presentation.d.ts +0 -13
  658. package/dist/operations/autopilot/presentation.d.ts.map +0 -1
  659. package/dist/operations/autopilot/presentation.js +0 -91
  660. package/dist/operations/autopilot/types.d.ts.map +0 -1
  661. package/dist/operations/autopilot/types.js +0 -8
  662. package/dist/public/operations/specs/autopilot.d.ts.map +0 -1
  663. package/dist/public/skills/init-kibi/SKILL.md +0 -62
  664. package/dist/public/verification-receipt.d.ts +0 -75
  665. package/dist/public/verification-receipt.d.ts.map +0 -1
  666. package/dist/public/verification-receipt.js +0 -129
  667. package/src/public/skills/init-kibi/SKILL.md +0 -62
  668. package/src/public/verification-receipt.ts +0 -170
  669. /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts +0 -0
  670. /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.js +0 -0
  671. /package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts +0 -0
  672. /package/dist/operations/{autopilot → bootstrap}/requirement-claims.js +0 -0
@@ -16,20 +16,23 @@
16
16
  along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
  */
18
18
  import { execSync } from "node:child_process";
19
- import { existsSync, readdirSync } from "node:fs";
19
+ import { createHash } from "node:crypto";
20
+ import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync, } from "node:fs";
20
21
  import * as path from "node:path";
21
22
  import { branchErrorToDiagnostic, createDocsNotIndexedDiagnostic, createInvalidAuthoringDiagnostic, createKbMissingDiagnostic, formatSyncSummary, } from "../diagnostics.js";
22
- import { EngineClient, engineSocketPath, ensureJournaledBranchStoreAsync, fsyncJournaledBranchStore, } from "../engine.js";
23
+ import { EngineClient, acquireEnginePublicationLease, engineSocketPath, ensureJournaledBranchStoreAsync, formatEngineAttachmentMismatch, fsyncJournaledBranchStore, parseEngineAttachmentIdentity, readEngineAttachmentIdentity, } from "../engine.js";
23
24
  import { isCliDebugEnabled } from "../env.js";
24
25
  import { extractRelationshipShard, validateRelationships, } from "../extractors/relationships.js";
26
+ import { acquireSymbolCompilerLock, releaseSymbolCompilerLock, } from "../operations/mutation/symbol-compiler-lock.js";
25
27
  import { analyzeSemanticAdvisorInput } from "../operations/semantic-advisor/analyze-prose.js";
26
28
  import { validateSemanticInventoryBoundary } from "../operations/semantic-advisor/ingestion-boundary.js";
27
29
  import { PrologProcess } from "../prolog.js";
28
- import { resolveActiveBranch, } from "../utils/branch-resolver.js";
29
- import { loadSyncConfig } from "../utils/config.js";
30
- import { SYNC_CACHE_TTL_MS, SYNC_CACHE_VERSION, hashFile, hashNormalized, readSyncCache, toCacheKey, writeSyncCache, } from "./sync/cache.js";
31
- import { discoverSourceFiles, } from "./sync/discovery.js";
32
- import { processExtractions } from "./sync/extraction.js";
30
+ import { resolveBranchAttachment } from "../utils/branch-resolver.js";
31
+ import { branchStoreManifestPath, branchStorePath, ensureBranchStoreManifest, expectedBranchStoreManifest, } from "../utils/branch-store-locator.js";
32
+ import { loadEntityPaths } from "../utils/config.js";
33
+ import { SYNC_CACHE_TTL_MS, SYNC_CACHE_VERSION, hashFile, hashManifestWithCoordinates, hashNormalized, readSyncCache, toCacheKey, writeSyncCache, } from "./sync/cache.js";
34
+ import { clearRecoveredPendingSourceReceipts, discoverSourceFiles, } from "./sync/discovery.js";
35
+ import { normalizeExtractionSources, processExtractions, } from "./sync/extraction.js";
33
36
  import { refreshManifestCoordinates } from "./sync/manifest.js";
34
37
  import { persistEntities, persistRelationships, retractEntitiesById, retractEntitiesForSources, retractEntityRelationshipsById, retractRelationships, } from "./sync/persistence.js";
35
38
  import { atomicPublish, atomicPublishGeneration, cleanupStaging, createUniqueStagingPath, prepareStagingEnvironment, } from "./sync/staging.js";
@@ -49,6 +52,111 @@ function relationshipFromKey(key) {
49
52
  }
50
53
  return { type, from, to };
51
54
  }
55
+ function assertNoUnresolvedGitConflicts(workspaceRoot) {
56
+ let conflicted = "";
57
+ try {
58
+ conflicted = execSync("git diff --name-only --diff-filter=U --", {
59
+ cwd: workspaceRoot,
60
+ encoding: "utf8",
61
+ timeout: 5000,
62
+ stdio: ["pipe", "pipe", "pipe"],
63
+ }).trim();
64
+ }
65
+ catch {
66
+ // A non-Git workspace is handled by branch resolution below. Do not turn
67
+ // a missing Git binary into a misleading conflict diagnostic.
68
+ return;
69
+ }
70
+ if (conflicted) {
71
+ throw new SyncError(`Unresolved Git conflicts block Kibi compilation; resolve these authored files first: ${conflicted.split("\n").join(", ")}`);
72
+ }
73
+ }
74
+ export function trackedRelationshipFiles(workspaceRoot, relationshipsDir, recoverMissingPendingSources = false, recoveredPendingReceiptPaths = []) {
75
+ let tracked;
76
+ try {
77
+ tracked = new Set(execSync("git ls-files --cached -- .kb/relationships", {
78
+ cwd: workspaceRoot,
79
+ encoding: "utf8",
80
+ timeout: 5000,
81
+ stdio: ["pipe", "pipe", "pipe"],
82
+ })
83
+ .split("\n")
84
+ .filter(Boolean)
85
+ .map((file) => file.replaceAll("\\", "/")));
86
+ }
87
+ catch {
88
+ // A non-Git workspace has no tracked relationship inputs. The caller's
89
+ // branch resolver will produce the user-facing attachment diagnostic.
90
+ return [];
91
+ }
92
+ const pending = new Set();
93
+ const pendingRoot = path.join(workspaceRoot, ".kb", "recovery", "pending-sources");
94
+ if (existsSync(pendingRoot)) {
95
+ for (const receiptName of readdirSync(pendingRoot)) {
96
+ if (!receiptName.endsWith(".json"))
97
+ continue;
98
+ let receipt;
99
+ try {
100
+ receipt = JSON.parse(readFileSync(path.join(pendingRoot, receiptName), "utf8"));
101
+ }
102
+ catch {
103
+ // Malformed receipts are left for explicit recovery diagnostics. They
104
+ // must never make an unrelated relationship shard disappear silently.
105
+ continue;
106
+ }
107
+ if (typeof receipt.path !== "string" ||
108
+ typeof receipt.afterHash !== "string") {
109
+ continue;
110
+ }
111
+ const relative = receipt.path.replaceAll("\\", "/");
112
+ if (!relative.startsWith(".kb/relationships/"))
113
+ continue;
114
+ const absolute = path.resolve(workspaceRoot, relative);
115
+ if (!absolute.startsWith(`${path.resolve(workspaceRoot)}${path.sep}`)) {
116
+ throw new SyncError(`Pending source path escapes workspace: ${relative}`);
117
+ }
118
+ if (!existsSync(absolute)) {
119
+ if (recoverMissingPendingSources) {
120
+ const receiptPath = path.join(pendingRoot, receiptName);
121
+ if (!recoveredPendingReceiptPaths.some((candidate) => candidate.receiptPath === receiptPath)) {
122
+ recoveredPendingReceiptPaths.push({
123
+ receiptPath,
124
+ path: relative,
125
+ afterHash: receipt.afterHash,
126
+ rawHash: createHash("sha256")
127
+ .update(readFileSync(receiptPath))
128
+ .digest("hex"),
129
+ });
130
+ }
131
+ continue;
132
+ }
133
+ throw new SyncError(`Pending source is missing: ${relative}`);
134
+ }
135
+ const actual = createHash("sha256")
136
+ .update(readFileSync(absolute))
137
+ .digest("hex");
138
+ if (actual !== receipt.afterHash) {
139
+ throw new SyncError(`Pending source hash drift blocks sync for ${relative}`);
140
+ }
141
+ pending.add(relative);
142
+ }
143
+ }
144
+ try {
145
+ return readdirSync(relationshipsDir)
146
+ .filter((file) => file.endsWith(".yaml") || file.endsWith(".yml"))
147
+ .map((file) => path.join(relationshipsDir, file))
148
+ .filter((file) => {
149
+ const relative = path
150
+ .relative(workspaceRoot, file)
151
+ .replaceAll(path.sep, "/");
152
+ return tracked.has(relative) || pending.has(relative);
153
+ })
154
+ .sort();
155
+ }
156
+ catch {
157
+ return [];
158
+ }
159
+ }
52
160
  function normalizedEntityHash(result) {
53
161
  const entity = { ...result.entity };
54
162
  // Manifest defaults are generated at extraction time. They must not turn a
@@ -63,6 +171,16 @@ function normalizedEntityHash(result) {
63
171
  .sort((left, right) => left.localeCompare(right)),
64
172
  });
65
173
  }
174
+ // implements REQ-kibi-proposition-complete-ingestion
175
+ function semanticBoundaryRelationships(result, shardRelationships) {
176
+ const relationships = new Map();
177
+ for (const relationship of [...result.relationships, ...shardRelationships]) {
178
+ if (relationship.from !== result.entity.id)
179
+ continue;
180
+ relationships.set(relationshipKey(relationship), relationship);
181
+ }
182
+ return [...relationships.values()];
183
+ }
66
184
  async function checkpointNoopSync(workspaceRoot, branch) {
67
185
  const engine = new EngineClient({
68
186
  workspaceRoot,
@@ -83,8 +201,8 @@ async function checkpointNoopSync(workspaceRoot, branch) {
83
201
  function compilerCacheHasEntityDelta(cache) {
84
202
  return (cache.entityHashes !== undefined && cache.sourceEntityIds !== undefined);
85
203
  }
86
- function compilerCacheIsFresh(cache, sourceFiles, nowMs) {
87
- const sourceKeys = sourceFiles.map(toCacheKey);
204
+ function compilerCacheIsFresh(cache, workspaceRoot, sourceFiles, nowMs) {
205
+ const sourceKeys = sourceFiles.map((file) => toCacheKey(workspaceRoot, file));
88
206
  if (Object.keys(cache.hashes).some((key) => !sourceKeys.includes(key))) {
89
207
  return false;
90
208
  }
@@ -97,36 +215,71 @@ function compilerCacheIsFresh(cache, sourceFiles, nowMs) {
97
215
  nowMs - lastSeenMs <= SYNC_CACHE_TTL_MS);
98
216
  });
99
217
  }
100
- function compilerCacheFilesMatch(cache, sourceFiles, relationshipFiles) {
218
+ function compilerCacheFilesMatch(cache, workspaceRoot, sourceFiles, relationshipFiles, sourceHashOf) {
101
219
  for (const file of sourceFiles) {
102
- if (cache.hashes[toCacheKey(file)] !== hashFile(file))
220
+ if (cache.hashes[toCacheKey(workspaceRoot, file)] !== sourceHashOf(file))
103
221
  return false;
104
222
  }
105
- const relationshipKeys = new Set(relationshipFiles.map(toCacheKey));
223
+ const relationshipKeys = new Set(relationshipFiles.map((file) => toCacheKey(workspaceRoot, file)));
106
224
  if (Object.keys(cache.relationshipHashes ?? {}).some((key) => !relationshipKeys.has(key))) {
107
225
  return false;
108
226
  }
109
227
  for (const file of relationshipFiles) {
110
- if (cache.relationshipHashes?.[toCacheKey(file)] !== hashFile(file)) {
228
+ if (cache.relationshipHashes?.[toCacheKey(workspaceRoot, file)] !==
229
+ hashFile(workspaceRoot, file))
111
230
  return false;
112
- }
113
231
  }
114
232
  return true;
115
233
  }
234
+ export function warnFailedSourceHash(file, error) {
235
+ const message = error instanceof Error ? error.message : String(error);
236
+ console.warn(`Warning: Failed to hash ${file}: ${message}`);
237
+ }
238
+ // implements REQ-003, REQ-007
239
+ export function rememberChangedSourceOrWarn(file, apply) {
240
+ try {
241
+ apply();
242
+ }
243
+ catch (error) {
244
+ warnFailedSourceHash(file, error);
245
+ }
246
+ }
247
+ export function maybePushKbMissingDiagnostic(diagnostics, kbExists, rebuild, currentBranch, livePath) {
248
+ if (!kbExists && !rebuild) {
249
+ diagnostics.push(createKbMissingDiagnostic(currentBranch, livePath));
250
+ }
251
+ }
252
+ export function assertRelationshipsCleared(result) {
253
+ if (!result.success) {
254
+ throw new SyncError(`Failed to clear changed relationship shards: ${result.error || "Unknown error"}`);
255
+ }
256
+ }
257
+ export function maybePushDocsNotIndexedDiagnostic(diagnostics, performedFullReindex, markdownFileCount, entityCount) {
258
+ if (performedFullReindex &&
259
+ markdownFileCount > 0 &&
260
+ entityCount < markdownFileCount) {
261
+ diagnostics.push(createDocsNotIndexedDiagnostic(markdownFileCount, entityCount));
262
+ }
263
+ }
116
264
  // implements REQ-003, REQ-007
117
265
  export async function syncCommand(options = {}, runtime = {}) {
118
266
  const validateOnly = options.validateOnly ?? false;
119
267
  const rebuild = options.rebuild ?? false;
268
+ const recoveryBackupPath = options.recoveryBackupPath;
269
+ const workspaceRoot = path.resolve(options.workspaceRoot ?? process.cwd());
120
270
  const startTime = Date.now();
121
271
  const diagnostics = [];
122
272
  const entityCounts = {};
123
273
  let published = false;
124
274
  let currentBranch;
125
275
  let stagingPath;
276
+ let publicationLease;
277
+ let compilerLock;
278
+ let operationFailure;
126
279
  const getCurrentCommit = () => {
127
280
  try {
128
281
  return execSync("git rev-parse HEAD", {
129
- cwd: process.cwd(),
282
+ cwd: workspaceRoot,
130
283
  encoding: "utf8",
131
284
  timeout: 5000,
132
285
  stdio: ["pipe", "pipe", "pipe"],
@@ -138,30 +291,60 @@ export async function syncCommand(options = {}, runtime = {}) {
138
291
  };
139
292
  const withOptionalCommit = (value, commit) => commit !== undefined ? { ...value, commit } : value;
140
293
  try {
294
+ if (!validateOnly) {
295
+ compilerLock = await (runtime.acquireSymbolCompilerLock ?? acquireSymbolCompilerLock)(workspaceRoot);
296
+ }
297
+ assertNoUnresolvedGitConflicts(workspaceRoot);
141
298
  // Branch resolution
142
- const branchResult = resolveActiveBranch(process.cwd());
299
+ const branchResult = resolveBranchAttachment(workspaceRoot);
143
300
  if ("error" in branchResult) {
144
301
  const diagnostic = branchErrorToDiagnostic(branchResult.code, branchResult.error);
145
302
  diagnostics.push(diagnostic);
146
303
  console.error(`Failed to resolve active branch: ${branchResult.error}`);
147
304
  throw new SyncError(`Failed to resolve active branch: ${branchResult.error}`);
148
305
  }
149
- currentBranch = branchResult.branch;
306
+ if (branchResult.migrationRequired && !validateOnly) {
307
+ throw new SyncError(`Sync blocked: KB is attached through legacy branch storage for '${branchResult.gitBranch}'. Run 'kibi branch migrate --from ${branchResult.kbBranch} --to ${branchResult.gitBranch} --apply' first.`);
308
+ }
309
+ currentBranch = branchResult.kbBranch;
150
310
  // Cut over legacy branches before creating a staging copy. If another
151
311
  // CLI/MCP operation has an engine attached, stop that single writer so the
152
312
  // atomic publish below cannot race its RDF lock.
153
- const livePathForEngine = path.join(process.cwd(), `.kb/branches/${currentBranch}`);
154
- if (!validateOnly) {
313
+ const livePathForEngine = branchStorePath(workspaceRoot, currentBranch);
314
+ if (!validateOnly && recoveryBackupPath === undefined) {
315
+ ensureBranchStoreManifest(workspaceRoot, currentBranch);
155
316
  await ensureJournaledBranchStoreAsync(livePathForEngine);
317
+ }
318
+ const needsExclusiveGenerationPublish = !validateOnly && (rebuild || recoveryBackupPath !== undefined);
319
+ if (needsExclusiveGenerationPublish) {
320
+ // Recovery intentionally avoids attaching the broken live store. The
321
+ // clean rebuild is compiled into staging and published only after it
322
+ // can be reopened successfully.
156
323
  const existingEngine = new EngineClient({
157
- workspaceRoot: process.cwd(),
324
+ workspaceRoot,
158
325
  branch: currentBranch,
159
326
  timeout: 2_000,
327
+ allowPublicationLock: true,
160
328
  });
161
- const needsExclusiveGenerationPublish = rebuild || runtime.createProlog !== undefined;
162
- if (needsExclusiveGenerationPublish &&
163
- existsSync(engineSocketPath(process.cwd(), currentBranch))) {
164
- await existingEngine.stop(false).catch(() => undefined);
329
+ const engineSocketExists = existsSync(engineSocketPath(workspaceRoot, currentBranch));
330
+ try {
331
+ publicationLease = acquireEnginePublicationLease(workspaceRoot, currentBranch);
332
+ // This client is explicitly allowed to attach under its own lease so
333
+ // a daemon that appeared between the socket probe and lease creation
334
+ // is still stopped before publication.
335
+ if (engineSocketExists ||
336
+ existsSync(engineSocketPath(workspaceRoot, currentBranch))) {
337
+ await existingEngine.start(false);
338
+ }
339
+ if (existingEngine.isRunning()) {
340
+ await existingEngine.stop(false);
341
+ }
342
+ else if (engineSocketExists ||
343
+ existsSync(engineSocketPath(workspaceRoot, currentBranch))) {
344
+ throw new SyncError(`Kibi engine socket remains present but is not reachable: ${engineSocketPath(workspaceRoot, currentBranch)}`);
345
+ }
346
+ }
347
+ finally {
165
348
  await existingEngine.terminate();
166
349
  }
167
350
  }
@@ -169,9 +352,11 @@ export async function syncCommand(options = {}, runtime = {}) {
169
352
  // eslint-disable-next-line no-console
170
353
  console.log("[kibi-debug] currentBranch:", currentBranch);
171
354
  }
172
- const config = loadSyncConfig(process.cwd());
173
- const paths = config.paths;
174
- const { markdownFiles, manifestFiles, relationshipsDir } = await discoverSourceFiles(process.cwd(), paths);
355
+ const paths = loadEntityPaths(workspaceRoot);
356
+ const { markdownFiles, manifestFiles, relationshipsDir, recoveredPendingReceiptPaths, } = await discoverSourceFiles(workspaceRoot, {
357
+ trackedOnly: true,
358
+ recoverMissingPendingSources: recoveryBackupPath !== undefined,
359
+ });
175
360
  if (isCliDebugEnabled()) {
176
361
  // eslint-disable-next-line no-console
177
362
  console.log("[kibi-debug] markdownFiles:", markdownFiles.length);
@@ -179,28 +364,30 @@ export async function syncCommand(options = {}, runtime = {}) {
179
364
  console.log("[kibi-debug] manifestFiles:", manifestFiles.length);
180
365
  }
181
366
  const sourceFiles = [...markdownFiles, ...manifestFiles].sort();
182
- const cachePath = path.join(process.cwd(), `.kb/branches/${currentBranch}/sync-cache.json`);
367
+ const cachePath = path.join(livePathForEngine, "sync-cache.json");
183
368
  const syncCache = readSyncCache(cachePath);
184
369
  const nowIso = new Date().toISOString();
185
370
  const nowMs = Date.now();
186
- const currentSourceKeys = new Set(sourceFiles.map(toCacheKey));
371
+ const currentSourceKeys = new Set(sourceFiles.map((file) => toCacheKey(workspaceRoot, file)));
187
372
  const relationshipShardFiles = existsSync(relationshipsDir)
188
- ? readdirSync(relationshipsDir)
189
- .filter((file) => file.endsWith(".yaml") || file.endsWith(".yml"))
190
- .map((file) => path.join(relationshipsDir, file))
191
- .sort()
373
+ ? trackedRelationshipFiles(workspaceRoot, relationshipsDir, recoveryBackupPath !== undefined, recoveredPendingReceiptPaths)
192
374
  : [];
193
375
  // No-op is a first-class compiler result. Hashing the configured inputs is
194
376
  // sufficient when normalized entity/shard inventories are already fresh;
195
377
  // avoid rebuilding maps and rediscovering RDF state for the common path.
378
+ // Symbol manifests hash together with their generated coordinate artifact
379
+ // so artifact-only changes never masquerade as no-ops.
380
+ const fastPathSourceHashOf = (file) => manifestFiles.includes(file)
381
+ ? hashManifestWithCoordinates(workspaceRoot, file, path.join(path.dirname(file), "symbol-coordinates.yaml"))
382
+ : hashFile(workspaceRoot, file);
196
383
  if (!validateOnly &&
197
384
  !rebuild &&
198
385
  !options.refreshSymbolCoordinates &&
199
386
  runtime.createProlog === undefined &&
200
387
  compilerCacheHasEntityDelta(syncCache) &&
201
- compilerCacheIsFresh(syncCache, sourceFiles, nowMs) &&
202
- compilerCacheFilesMatch(syncCache, sourceFiles, relationshipShardFiles)) {
203
- await checkpointNoopSync(process.cwd(), currentBranch);
388
+ compilerCacheIsFresh(syncCache, workspaceRoot, sourceFiles, nowMs) &&
389
+ compilerCacheFilesMatch(syncCache, workspaceRoot, sourceFiles, relationshipShardFiles, fastPathSourceHashOf)) {
390
+ await checkpointNoopSync(workspaceRoot, currentBranch);
204
391
  console.log("✓ Imported 0 entities, 0 relationships (no changes)");
205
392
  return withOptionalCommit({
206
393
  branch: currentBranch,
@@ -214,10 +401,30 @@ export async function syncCommand(options = {}, runtime = {}) {
214
401
  exitCode: 0,
215
402
  }, getCurrentCommit());
216
403
  }
404
+ // Explicit coordinate refresh must precede fingerprinting so the manifest
405
+ // overlay that is persisted into RDF observes the newly generated
406
+ // coordinates. Refresh failures are fatal: cache state may never advance
407
+ // on a partially published compiler dependency.
408
+ const refreshedManifestKeys = new Set();
409
+ if (!validateOnly && options.refreshSymbolCoordinates) {
410
+ for (const file of manifestFiles) {
411
+ await refreshManifestCoordinates(file, workspaceRoot, {
412
+ refreshSymbolCoordinates: options.refreshSymbolCoordinates,
413
+ });
414
+ refreshedManifestKeys.add(toCacheKey(workspaceRoot, file));
415
+ }
416
+ }
417
+ // The generated coordinate artifact is a compiler dependency of every
418
+ // symbol manifest: its existence, emptiness, content, and deletion must
419
+ // all change the effective source hash even when authored YAML is stable.
420
+ const coordinatesPathForManifest = (manifestFile) => path.join(path.dirname(manifestFile), "symbol-coordinates.yaml");
421
+ const effectiveSourceHash = (file) => manifestFiles.includes(file)
422
+ ? hashManifestWithCoordinates(workspaceRoot, file, coordinatesPathForManifest(file))
423
+ : hashFile(workspaceRoot, file);
217
424
  const changedSourceHashes = new Map();
218
425
  for (const file of sourceFiles) {
219
- const key = toCacheKey(file);
220
- const hash = hashFile(file);
426
+ const key = toCacheKey(workspaceRoot, file);
427
+ const hash = effectiveSourceHash(file);
221
428
  if (syncCache.hashes[key] !== hash)
222
429
  changedSourceHashes.set(key, hash);
223
430
  }
@@ -243,14 +450,14 @@ export async function syncCommand(options = {}, runtime = {}) {
243
450
  // sync rather than deleting their last known-good entities.
244
451
  const deletedSourceFiles = Object.keys(syncCache.hashes)
245
452
  .filter((key) => !currentSourceKeys.has(key))
246
- .map((key) => path.resolve(process.cwd(), key));
453
+ .map((key) => path.resolve(workspaceRoot, key));
247
454
  const currentRelationshipKeys = new Set();
248
455
  for (const shardPath of relationshipShardFiles) {
249
- const key = toCacheKey(shardPath);
456
+ const key = toCacheKey(workspaceRoot, shardPath);
250
457
  currentRelationshipKeys.add(key);
251
458
  let hash;
252
459
  try {
253
- hash = hashFile(shardPath);
460
+ hash = hashFile(workspaceRoot, shardPath);
254
461
  nextRelationshipHashes[key] = hash;
255
462
  }
256
463
  catch (error) {
@@ -292,11 +499,11 @@ export async function syncCommand(options = {}, runtime = {}) {
292
499
  const relationshipChanged = addedShardRelationships.length > 0 ||
293
500
  removedShardRelationships.length > 0;
294
501
  for (const file of sourceFiles) {
295
- try {
296
- const key = toCacheKey(file);
502
+ rememberChangedSourceOrWarn(file, () => {
503
+ const key = toCacheKey(workspaceRoot, file);
297
504
  const hash = changedSourceHashes.get(key) ?? syncCache.hashes[key];
298
505
  if (hash === undefined)
299
- continue;
506
+ return;
300
507
  const lastSeen = syncCache.seenAt[key];
301
508
  const lastSeenMs = lastSeen ? Date.parse(lastSeen) : Number.NaN;
302
509
  const expired = !lastSeen ||
@@ -315,11 +522,7 @@ export async function syncCommand(options = {}, runtime = {}) {
315
522
  changedManifestFiles.push(file);
316
523
  }
317
524
  }
318
- }
319
- catch (error) {
320
- const message = error instanceof Error ? error.message : String(error);
321
- console.warn(`Warning: Failed to hash ${file}: ${message}`);
322
- }
525
+ });
323
526
  }
324
527
  // A v1 cache has only whole-file hashes. Perform one compiler-metadata
325
528
  // backfill so subsequent edits can be reduced to normalized entity deltas.
@@ -334,31 +537,24 @@ export async function syncCommand(options = {}, runtime = {}) {
334
537
  changedManifestFiles.push(file);
335
538
  }
336
539
  }
337
- // Coordinate refresh must precede extraction so the manifest overlay that
338
- // is persisted into RDF observes the newly generated coordinates. Force
339
- // each refreshed manifest through extraction even when its authored YAML
340
- // hash is unchanged; the generated coordinate artifact is an input too.
341
- if (!validateOnly && options.refreshSymbolCoordinates) {
342
- for (const file of manifestFiles) {
343
- try {
344
- await refreshManifestCoordinates(file, process.cwd(), {
345
- refreshSymbolCoordinates: options.refreshSymbolCoordinates,
346
- });
347
- if (!changedManifestFiles.includes(file)) {
348
- changedManifestFiles.push(file);
349
- }
350
- }
351
- catch (error) {
352
- const message = error instanceof Error ? error.message : String(error);
353
- console.warn(`Warning: Failed to refresh symbol coordinates in ${file}: ${message}`);
354
- }
540
+ // Explicitly requested refreshes force coordinate-bearing symbols through
541
+ // extraction and RDF persistence even when normalized entity hashes match
542
+ // the cached state, repairing warm-cache RDF divergence.
543
+ for (const file of manifestFiles) {
544
+ if (!refreshedManifestKeys.has(toCacheKey(workspaceRoot, file)) ||
545
+ changedManifestFiles.includes(file)) {
546
+ continue;
355
547
  }
548
+ changedManifestFiles.push(file);
549
+ }
550
+ for (const key of refreshedManifestKeys) {
551
+ forceEntitySourceKeys.add(key);
356
552
  }
357
553
  const performedFullReindex = changedMarkdownFiles.length === markdownFiles.length &&
358
554
  changedManifestFiles.length === manifestFiles.length;
359
- const extraction = await processExtractions(changedMarkdownFiles, changedManifestFiles, validateOnly);
555
+ const extraction = await processExtractions(changedMarkdownFiles, changedManifestFiles, validateOnly, workspaceRoot);
360
556
  const { failedCacheKeys, errors } = extraction;
361
- const extractedResults = extraction.results;
557
+ const extractedResults = normalizeExtractionSources(extraction.results, workspaceRoot);
362
558
  const nextEntityHashes = {
363
559
  ...(syncCache.entityHashes ?? {}),
364
560
  };
@@ -373,12 +569,20 @@ export async function syncCommand(options = {}, runtime = {}) {
373
569
  !validateOnly &&
374
570
  !rebuild &&
375
571
  runtime.createProlog === undefined;
376
- const materializeAllRelationships = !useEntityDelta || changedMarkdownFiles.length > 0;
572
+ // Re-materialize every authored shard edge whenever a source entity is
573
+ // refreshed. Entity-delta sync retracts outgoing relationships for changed
574
+ // entities before persisting their extracted relationships. Manifest
575
+ // entities commonly carry no inline links, so a manifest-only edit (for
576
+ // example, a generated coordinate refresh) would otherwise drop valid
577
+ // shard-only edges and leave the cache claiming they were already synced.
578
+ const materializeAllRelationships = !useEntityDelta ||
579
+ changedMarkdownFiles.length > 0 ||
580
+ changedManifestFiles.length > 0;
377
581
  const allRelationships = materializeAllRelationships
378
582
  ? Object.values(nextShardRelationships).flat().map(relationshipFromKey)
379
583
  : [...addedShardRelationships, ...removedShardRelationships];
380
584
  for (const deletedSource of deletedSourceFiles) {
381
- const sourceKey = toCacheKey(deletedSource);
585
+ const sourceKey = toCacheKey(workspaceRoot, deletedSource);
382
586
  for (const id of nextSourceEntityIds[sourceKey] ?? []) {
383
587
  removedEntityIds.add(id);
384
588
  delete nextEntityHashes[id];
@@ -387,7 +591,7 @@ export async function syncCommand(options = {}, runtime = {}) {
387
591
  }
388
592
  const resultsBySource = new Map();
389
593
  for (const result of extractedResults) {
390
- const sourceKey = toCacheKey(result.entity.source);
594
+ const sourceKey = toCacheKey(workspaceRoot, result.entity.source);
391
595
  const sourceResults = resultsBySource.get(sourceKey) ?? [];
392
596
  sourceResults.push(result);
393
597
  resultsBySource.set(sourceKey, sourceResults);
@@ -396,7 +600,7 @@ export async function syncCommand(options = {}, runtime = {}) {
396
600
  ...changedMarkdownFiles,
397
601
  ...changedManifestFiles,
398
602
  ]) {
399
- const sourceKey = toCacheKey(changedSource);
603
+ const sourceKey = toCacheKey(workspaceRoot, changedSource);
400
604
  if (failedCacheKeys.has(sourceKey))
401
605
  continue;
402
606
  const sourceResults = resultsBySource.get(sourceKey) ?? [];
@@ -425,15 +629,16 @@ export async function syncCommand(options = {}, runtime = {}) {
425
629
  for (const result of extractedResults) {
426
630
  if (result.entity.type !== "req")
427
631
  continue;
428
- const key = toCacheKey(result.entity.source);
632
+ const key = toCacheKey(workspaceRoot, result.entity.source);
633
+ const relationships = semanticBoundaryRelationships(result, allRelationships);
429
634
  const payload = {
430
635
  type: result.entity.type,
431
636
  id: result.entity.id,
432
637
  properties: result.entity,
433
- relationships: result.relationships,
638
+ relationships,
434
639
  };
435
640
  const semantic = analyzeSemanticAdvisorInput({ payload });
436
- const boundary = validateSemanticInventoryBoundary(payload, result.relationships, semantic.receipt);
641
+ const boundary = validateSemanticInventoryBoundary(payload, relationships, semantic.receipt);
437
642
  const previousSemanticHash = syncCache.semanticHashes[key];
438
643
  const advertisedContract = result.entity.semantic_inventory_version !== undefined ||
439
644
  result.entity.semantic_source_hash !== undefined ||
@@ -504,6 +709,12 @@ export async function syncCommand(options = {}, runtime = {}) {
504
709
  evictedSemanticContracts[key] = nextSemanticContracts[key] === true;
505
710
  }
506
711
  }
712
+ // The durable KB checkpoint must precede the cache write: if the
713
+ // checkpoint fails, cached fingerprints must stay stale so the next
714
+ // sync recompiles instead of trusting uncommitted compiler output.
715
+ if (runtime.createProlog === undefined) {
716
+ await checkpointNoopSync(workspaceRoot, currentBranch);
717
+ }
507
718
  writeSyncCache(cachePath, {
508
719
  version: SYNC_CACHE_VERSION,
509
720
  hashes: evictedHashes,
@@ -515,9 +726,6 @@ export async function syncCommand(options = {}, runtime = {}) {
515
726
  semanticHashes: evictedSemanticHashes,
516
727
  semanticContracts: evictedSemanticContracts,
517
728
  });
518
- if (runtime.createProlog === undefined) {
519
- await checkpointNoopSync(process.cwd(), currentBranch);
520
- }
521
729
  console.log("✓ Imported 0 entities, 0 relationships (no changes)");
522
730
  return withOptionalCommit({
523
731
  branch: currentBranch,
@@ -531,11 +739,9 @@ export async function syncCommand(options = {}, runtime = {}) {
531
739
  exitCode: 0,
532
740
  }, getCurrentCommit());
533
741
  }
534
- const livePath = path.join(process.cwd(), `.kb/branches/${currentBranch}`);
742
+ const livePath = branchStorePath(workspaceRoot, currentBranch);
535
743
  const kbExists = existsSync(livePath);
536
- if (!kbExists && !rebuild) {
537
- diagnostics.push(createKbMissingDiagnostic(currentBranch, livePath));
538
- }
744
+ maybePushKbMissingDiagnostic(diagnostics, kbExists, rebuild, currentBranch, livePath);
539
745
  // implements REQ-core-journaled-engine-delta-sync
540
746
  // Normal syncs are compiled directly into the long-lived single-writer
541
747
  // engine. Rebuilds retain generation replacement semantics, and injected
@@ -544,17 +750,34 @@ export async function syncCommand(options = {}, runtime = {}) {
544
750
  // for a one-symbol or relationship-only change.
545
751
  if (!validateOnly && !rebuild && runtime.createProlog === undefined) {
546
752
  const engine = new EngineClient({
547
- workspaceRoot: process.cwd(),
753
+ workspaceRoot,
548
754
  branch: currentBranch,
549
755
  timeout: 120_000,
550
756
  });
551
757
  const engineProlog = engine;
552
758
  try {
553
759
  await engine.start();
760
+ const describeAttachment = async () => {
761
+ const live = readEngineAttachmentIdentity(livePath);
762
+ try {
763
+ const status = await engine.queryStatusJson();
764
+ return {
765
+ live,
766
+ attached: parseEngineAttachmentIdentity(status.bindings.JsonString),
767
+ };
768
+ }
769
+ catch {
770
+ return { live, attached: null };
771
+ }
772
+ };
773
+ const mutationFailure = async (operation, cause) => {
774
+ const { live, attached } = await describeAttachment();
775
+ return `${cause}; ${formatEngineAttachmentMismatch(operation, live, attached)}`;
776
+ };
554
777
  const successfulChangedSources = [
555
778
  ...changedMarkdownFiles,
556
779
  ...changedManifestFiles,
557
- ].filter((file) => !failedCacheKeys.has(toCacheKey(file)));
780
+ ].filter((file) => !failedCacheKeys.has(toCacheKey(workspaceRoot, file)));
558
781
  const removedCount = useEntityDelta
559
782
  ? await retractEntitiesById(engineProlog, [...removedEntityIds])
560
783
  : await retractEntitiesForSources(engineProlog, [
@@ -571,9 +794,19 @@ export async function syncCommand(options = {}, runtime = {}) {
571
794
  await retractRelationships(engineProlog, exactRemovedEdges);
572
795
  }
573
796
  else if (relationshipChanged) {
574
- const cleared = await engine.query("kb_retract_all_relationships");
575
- if (!cleared.success) {
576
- throw new SyncError(`Failed to clear changed relationship shards: ${cleared.error || "Unknown error"}`);
797
+ const clearChangedShards = async () => {
798
+ const cleared = await engine.query("kb_retract_all_relationships");
799
+ if (!cleared.success) {
800
+ throw new SyncError(await mutationFailure("kb_retract_all_relationships", `Failed to clear changed relationship shards: ${cleared.error || "Unknown error"}`));
801
+ }
802
+ };
803
+ try {
804
+ await clearChangedShards();
805
+ }
806
+ catch {
807
+ await engine.stop().catch(() => undefined);
808
+ await engine.start();
809
+ await clearChangedShards();
577
810
  }
578
811
  }
579
812
  const entityIds = new Set();
@@ -591,7 +824,7 @@ export async function syncCommand(options = {}, runtime = {}) {
591
824
  }
592
825
  const danglingKeys = new Set(validationErrors.map(({ relationship }) => `${relationship.type}|${relationship.from}|${relationship.to}`));
593
826
  const shardDeltaByKey = new Map();
594
- const shardCandidates = useEntityDelta
827
+ const shardCandidates = useEntityDelta && !materializeAllRelationships
595
828
  ? [
596
829
  ...addedShardRelationships,
597
830
  ...allRelationships.filter((relationship) => changedEntityIds.has(relationship.from)),
@@ -602,9 +835,7 @@ export async function syncCommand(options = {}, runtime = {}) {
602
835
  shardDeltaByKey.set(relationshipKey(relationship), relationship);
603
836
  }
604
837
  }
605
- const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(engineProlog, results, [
606
- ...shardDeltaByKey.values(),
607
- ]);
838
+ const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(engineProlog, results, [...shardDeltaByKey.values()], { workspaceRoot });
608
839
  const kbModified = removedCount > 0 ||
609
840
  relationshipChanged ||
610
841
  entitiesModified ||
@@ -613,7 +844,7 @@ export async function syncCommand(options = {}, runtime = {}) {
613
844
  engine.invalidateCache();
614
845
  const saveResult = await engine.save();
615
846
  if (!saveResult.success) {
616
- throw new SyncError(`Failed to save journaled KB: ${saveResult.error || "Unknown error"}`);
847
+ throw new SyncError(await mutationFailure("kb_save", `Failed to save journaled KB: ${saveResult.error || "Unknown error"}`));
617
848
  }
618
849
  const evictedHashes = {};
619
850
  const evictedSeenAt = {};
@@ -665,7 +896,7 @@ export async function syncCommand(options = {}, runtime = {}) {
665
896
  await engine.terminate();
666
897
  }
667
898
  }
668
- stagingPath = createUniqueStagingPath(currentBranch, process.cwd());
899
+ stagingPath = createUniqueStagingPath(currentBranch, workspaceRoot);
669
900
  const runtimeContext = {
670
901
  currentBranch,
671
902
  livePath,
@@ -674,6 +905,12 @@ export async function syncCommand(options = {}, runtime = {}) {
674
905
  validateOnly,
675
906
  };
676
907
  await prepareStagingEnvironment(stagingPath, livePath, rebuild);
908
+ // Staging is a new compiled artifact, so install the exact identity fence
909
+ // before the engine attaches. The manifest is published with the staged
910
+ // store during the atomic swap.
911
+ if (!existsSync(branchStoreManifestPath(stagingPath))) {
912
+ writeFileSync(branchStoreManifestPath(stagingPath), `${JSON.stringify(expectedBranchStoreManifest(currentBranch), null, 2)}\n`, { mode: 0o600 });
913
+ }
677
914
  try {
678
915
  const prolog = runtime.createProlog?.({ timeout: 120000 }) ??
679
916
  new PrologProcess({ timeout: 120000 });
@@ -695,12 +932,10 @@ export async function syncCommand(options = {}, runtime = {}) {
695
932
  ...changedMarkdownFiles,
696
933
  ...changedManifestFiles,
697
934
  ...deletedSourceFiles,
698
- ].filter((file) => !failedCacheKeys.has(toCacheKey(file))));
935
+ ].filter((file) => !failedCacheKeys.has(toCacheKey(workspaceRoot, file))));
699
936
  if (relationshipChanged) {
700
937
  const clearRelationships = await prolog.query("kb_retract_all_relationships");
701
- if (!clearRelationships.success) {
702
- throw new SyncError(`Failed to clear changed relationship shards: ${clearRelationships.error || "Unknown error"}`);
703
- }
938
+ assertRelationshipsCleared(clearRelationships);
704
939
  }
705
940
  const { entityCount, kbModified: entitiesModified } = await persistEntities(prolog, results, entityIds);
706
941
  const validationErrors = validateRelationships(allRelationships, entityIds);
@@ -713,7 +948,9 @@ export async function syncCommand(options = {}, runtime = {}) {
713
948
  const danglingKeys = new Set(validationErrors.map(({ relationship: r }) => `${r.type}|${r.from}|${r.to}`));
714
949
  const validRelationships = allRelationships.filter((r) => !danglingKeys.has(`${r.type}|${r.from}|${r.to}`));
715
950
  // Persist relationships
716
- const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(prolog, results, validRelationships);
951
+ const { relationshipCount, kbModified: relationshipsModified } = await persistRelationships(prolog, results, validRelationships, {
952
+ workspaceRoot,
953
+ });
717
954
  const kbModified = entitiesModified || relationshipsModified;
718
955
  if (validateOnly) {
719
956
  await prolog.query("kb_detach");
@@ -760,14 +997,45 @@ export async function syncCommand(options = {}, runtime = {}) {
760
997
  await prolog.query("kb_detach");
761
998
  await prolog.terminate();
762
999
  const journaledLive = existsSync(path.join(livePath, "storage.json"));
763
- if (rebuild && journaledLive) {
1000
+ if (recoveryBackupPath !== undefined) {
1001
+ if (!existsSync(livePath)) {
1002
+ throw new SyncError(`Recovery target disappeared before publication: ${livePath}`);
1003
+ }
1004
+ if (existsSync(recoveryBackupPath)) {
1005
+ throw new SyncError(`Recovery backup path already exists: ${recoveryBackupPath}`);
1006
+ }
1007
+ mkdirSync(path.dirname(recoveryBackupPath), { recursive: true });
1008
+ // Same-filesystem renames give us a recoverable two-step publication:
1009
+ // the original bytes stay at the reported backup path if anything
1010
+ // later needs forensic inspection.
1011
+ renameSync(livePath, recoveryBackupPath);
1012
+ try {
1013
+ renameSync(stagingPath, livePath);
1014
+ }
1015
+ catch (error) {
1016
+ renameSync(recoveryBackupPath, livePath);
1017
+ throw error;
1018
+ }
1019
+ }
1020
+ else if (rebuild && journaledLive) {
764
1021
  atomicPublishGeneration(stagingPath, livePath);
765
1022
  }
766
1023
  else {
767
1024
  atomicPublish(stagingPath, livePath);
768
1025
  }
769
1026
  fsyncJournaledBranchStore(livePath);
770
- cleanupStaging(stagingPath);
1027
+ try {
1028
+ if (recoveryBackupPath !== undefined &&
1029
+ recoveredPendingReceiptPaths.length > 0) {
1030
+ clearRecoveredPendingSourceReceipts(workspaceRoot, recoveredPendingReceiptPaths);
1031
+ }
1032
+ }
1033
+ finally {
1034
+ // Receipt compare-and-delete can fail closed after publication when a
1035
+ // newer receipt wins a race. Staging bytes are still disposable;
1036
+ // leave the published store and surface the pending intent error.
1037
+ cleanupStaging(stagingPath);
1038
+ }
771
1039
  const evictedHashes = {};
772
1040
  const evictedSeenAt = {};
773
1041
  const evictedSemanticHashes = {};
@@ -796,11 +1064,7 @@ export async function syncCommand(options = {}, runtime = {}) {
796
1064
  semanticContracts: evictedSemanticContracts,
797
1065
  });
798
1066
  published = true;
799
- if (performedFullReindex &&
800
- markdownFiles.length > 0 &&
801
- entityCount < markdownFiles.length) {
802
- diagnostics.push(createDocsNotIndexedDiagnostic(markdownFiles.length, entityCount));
803
- }
1067
+ maybePushDocsNotIndexedDiagnostic(diagnostics, performedFullReindex, markdownFiles.length, entityCount);
804
1068
  console.log(`✓ Imported ${entityCount} entities, ${relationshipCount} relationships`);
805
1069
  const commit = getCurrentCommit();
806
1070
  const summary = withOptionalCommit({
@@ -822,6 +1086,7 @@ export async function syncCommand(options = {}, runtime = {}) {
822
1086
  }
823
1087
  }
824
1088
  catch (error) {
1089
+ operationFailure = { error };
825
1090
  if (stagingPath) {
826
1091
  cleanupStaging(stagingPath);
827
1092
  }
@@ -846,5 +1111,9 @@ export async function syncCommand(options = {}, runtime = {}) {
846
1111
  }
847
1112
  throw error;
848
1113
  }
1114
+ finally {
1115
+ publicationLease?.release();
1116
+ releaseSymbolCompilerLock(compilerLock, operationFailure);
1117
+ }
849
1118
  }
850
1119
  export { normalizeMarkdownPath } from "./sync/discovery.js";