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
@@ -0,0 +1,700 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { KIBI_BRAND, renderKibiFaviconDataUri, renderKibiLogo, renderKibiWordmark, } from "./brand.js";
5
+ import { formatAbsoluteUtc, parseTimestamp } from "./relative-time.js";
6
+ import { REPORT_FILTERS, reportFilterCounts, } from "./report-view.js";
7
+ import { commitWebUrl, formatSourceCoordinate, shortCommitSha, sourceWebUrl, } from "./repository.js";
8
+ // implements REQ-kibi-html-health-report
9
+ function reportStyles() {
10
+ const raw = readFileSync(join(fileURLToPath(new URL(".", import.meta.url)), "html-report.css"), "utf8");
11
+ return raw
12
+ .replaceAll("__KIBI_CARBON__", KIBI_BRAND.carbon)
13
+ .replaceAll("__KIBI_DEEP_CARBON__", KIBI_BRAND.deepCarbon)
14
+ .replaceAll("__KIBI_PANEL__", KIBI_BRAND.panel)
15
+ .replaceAll("__KIBI_ICE__", KIBI_BRAND.ice)
16
+ .replaceAll("__KIBI_SIGNAL__", KIBI_BRAND.signal)
17
+ .replaceAll("__KIBI_SNOW__", KIBI_BRAND.snow)
18
+ .replaceAll("__KIBI_MIST__", KIBI_BRAND.mist)
19
+ .replaceAll("__KIBI_RAIL__", KIBI_BRAND.rail)
20
+ .replaceAll("__KIBI_SUCCESS__", KIBI_BRAND.success)
21
+ .replaceAll("__KIBI_WARNING__", KIBI_BRAND.warning)
22
+ .replaceAll("__KIBI_DANGER__", KIBI_BRAND.danger);
23
+ }
24
+ // implements REQ-kibi-html-health-report
25
+ export const REPORT_CSP = "default-src 'none'; img-src data:; style-src 'unsafe-inline'; script-src 'unsafe-inline'";
26
+ // implements REQ-kibi-html-health-report
27
+ export const KIBI_GETTING_STARTED_URL = "https://github.com/Looted/kibi/blob/develop/docs/install.md";
28
+ function record(value) {
29
+ return value !== null && typeof value === "object" && !Array.isArray(value)
30
+ ? value
31
+ : {};
32
+ }
33
+ function records(value) {
34
+ return Array.isArray(value) ? value.map(record) : [];
35
+ }
36
+ function strings(value) {
37
+ return Array.isArray(value)
38
+ ? value.filter((item) => typeof item === "string")
39
+ : [];
40
+ }
41
+ function text(value, fallback = "") {
42
+ return typeof value === "string" && value.trim() ? value.trim() : fallback;
43
+ }
44
+ function count(value) {
45
+ return typeof value === "number" && Number.isFinite(value)
46
+ ? Math.max(0, Math.trunc(value))
47
+ : 0;
48
+ }
49
+ function escapeHtml(value) {
50
+ return String(value)
51
+ .replaceAll("&", "&")
52
+ .replaceAll("<", "&lt;")
53
+ .replaceAll(">", "&gt;")
54
+ .replaceAll('"', "&quot;")
55
+ .replaceAll("'", "&#39;");
56
+ }
57
+ function humanize(value) {
58
+ return value
59
+ .replaceAll("_", " ")
60
+ .replace(/\b\w/g, (character) => character.toUpperCase());
61
+ }
62
+ function sourceCoordinate(value) {
63
+ const item = record(value);
64
+ const path = text(item.path);
65
+ if (!path)
66
+ return undefined;
67
+ const line = Number(item.line);
68
+ const endLine = Number(item.endLine);
69
+ const id = text(item.id);
70
+ return {
71
+ path,
72
+ ...(id ? { id } : {}),
73
+ ...(Number.isInteger(line) && line >= 1 ? { line } : {}),
74
+ ...(Number.isInteger(endLine) && endLine >= 1 ? { endLine } : {}),
75
+ };
76
+ }
77
+ function sourceCoordinates(value) {
78
+ return Array.isArray(value)
79
+ ? value.flatMap((item) => {
80
+ const coordinate = sourceCoordinate(item);
81
+ return coordinate ? [coordinate] : [];
82
+ })
83
+ : [];
84
+ }
85
+ function linkedLabel(label, href) {
86
+ const safe = escapeHtml(label);
87
+ if (!href)
88
+ return safe;
89
+ return `<a class="source-link" href="${escapeHtml(href)}" target="_blank" rel="noopener noreferrer">${safe}</a>`;
90
+ }
91
+ function linkedCoordinate(coordinate, repository, fallback) {
92
+ const label = formatSourceCoordinate(coordinate) ?? fallback;
93
+ return linkedLabel(label, sourceWebUrl(repository, coordinate));
94
+ }
95
+ function renderRelativeTime(iso, prefixHtml) {
96
+ const date = parseTimestamp(iso);
97
+ if (!date) {
98
+ return `${prefixHtml} timestamp unavailable`;
99
+ }
100
+ const absolute = formatAbsoluteUtc(date);
101
+ const datetime = date.toISOString();
102
+ return `${prefixHtml} <time datetime="${escapeHtml(datetime)}">${escapeHtml(absolute)}</time><span class="relative-age" data-relative-from="${escapeHtml(datetime)}"></span>`;
103
+ }
104
+ function stageStatus(stage) {
105
+ return text(record(stage).status, "missing");
106
+ }
107
+ function combinedStageState(...statuses) {
108
+ if (statuses.every((status) => status === "passed"))
109
+ return "passed";
110
+ if (statuses.some((status) => ["blocked", "unresolved", "stale"].includes(status))) {
111
+ return "warning";
112
+ }
113
+ if (statuses.some((status) => status === "not_applicable"))
114
+ return "muted";
115
+ return "failed";
116
+ }
117
+ function stagePassed(stages, name) {
118
+ return stageStatus(stages[name]) === "passed";
119
+ }
120
+ function hasEndToEndTest(stages) {
121
+ const evidence = records(record(stages.passingE2e).receiptEvidence);
122
+ return evidence.some((item) => item.scope === "end_to_end");
123
+ }
124
+ function implementationOwned(stages) {
125
+ const productionSymbols = strings(record(stages.productionSymbols).symbols);
126
+ if (productionSymbols.length === 0)
127
+ return false;
128
+ const sourceCoordinates = record(stages.sourceCoordinates);
129
+ if (sourceCoordinates.requirementSource !== "present")
130
+ return false;
131
+ const missingCoordinates = new Set(strings(sourceCoordinates.missingSymbols));
132
+ return productionSymbols.every((symbol) => !missingCoordinates.has(symbol));
133
+ }
134
+ function passesProofGate(row, gate) {
135
+ if (row.proofStatus === "proven")
136
+ return true;
137
+ const stages = record(row.proofStages);
138
+ if (gate === "semantic") {
139
+ return (stagePassed(stages, "semanticInventory") &&
140
+ stagePassed(stages, "logicGrounding") &&
141
+ stagePassed(stages, "contradictions"));
142
+ }
143
+ if (gate === "scenario")
144
+ return stagePassed(stages, "scenarios");
145
+ if (gate === "implementation")
146
+ return implementationOwned(stages);
147
+ if (gate === "e2e") {
148
+ return stagePassed(stages, "scenarioTests") && hasEndToEndTest(stages);
149
+ }
150
+ return row.proofStatus === "proven";
151
+ }
152
+ function proofGates(rows) {
153
+ const definitions = [
154
+ [
155
+ "semantic",
156
+ "Semantic model",
157
+ "Intent is complete, grounded, and coherent",
158
+ ],
159
+ ["scenario", "Scenario", "Behavior is specified"],
160
+ [
161
+ "implementation",
162
+ "Implementation",
163
+ "Production ownership is source-bound",
164
+ ],
165
+ ["e2e", "E2E", "A scenario-backed end-to-end test exists"],
166
+ ["evidence", "Evidence", "Every strict proof stage passes now"],
167
+ ];
168
+ let candidates = [...rows];
169
+ return definitions.map(([key, label, detail]) => {
170
+ const remainingRows = candidates.filter((row) => passesProofGate(row, key));
171
+ const gate = {
172
+ key,
173
+ label,
174
+ detail,
175
+ remaining: remainingRows.length,
176
+ blocked: candidates.length - remainingRows.length,
177
+ };
178
+ candidates = remainingRows;
179
+ return gate;
180
+ });
181
+ }
182
+ // implements REQ-kibi-html-health-report
183
+ // covered_by TEST-kibi-html-health-report
184
+ export function firstFailingProofGate(gates, passes) {
185
+ for (const gate of gates) {
186
+ if (!passes(gate))
187
+ return gate;
188
+ }
189
+ return "proven";
190
+ }
191
+ // implements REQ-kibi-html-health-report
192
+ // covered_by TEST-kibi-html-health-report
193
+ export function earliestUnmetGate(row) {
194
+ if (row.proofStatus === "proven")
195
+ return "proven";
196
+ return firstFailingProofGate(["semantic", "scenario", "implementation", "e2e", "evidence"], (gate) => passesProofGate(row, gate));
197
+ }
198
+ function evidenceStage(passingE2e, testSources, repository) {
199
+ const evidence = records(passingE2e.receiptEvidence);
200
+ const passed = evidence.find((item) => item.state === "passed");
201
+ if (passed) {
202
+ const testSource = testSources.find((item) => item.id === text(passed.testId)) ??
203
+ testSources[0];
204
+ const prefix = linkedLabel("Passed", sourceWebUrl(repository, testSource));
205
+ return {
206
+ label: "Evidence",
207
+ detail: renderRelativeTime(text(passed.finishedAt) || undefined, prefix),
208
+ state: "passed",
209
+ };
210
+ }
211
+ const evidenceState = text(evidence[0]?.state);
212
+ if (evidenceState === "stale") {
213
+ return {
214
+ label: "Evidence",
215
+ detail: "E2E receipt stale for this code snapshot",
216
+ state: "warning",
217
+ };
218
+ }
219
+ if (evidenceState === "contract_mismatch") {
220
+ return {
221
+ label: "Evidence",
222
+ detail: "Receipt uses an older verification contract",
223
+ state: "warning",
224
+ };
225
+ }
226
+ if (evidenceState === "snapshot_unavailable") {
227
+ return {
228
+ label: "Evidence",
229
+ detail: "Code snapshot unavailable",
230
+ state: "warning",
231
+ };
232
+ }
233
+ if (["failed", "invalid"].includes(evidenceState)) {
234
+ return {
235
+ label: "Evidence",
236
+ detail: `${escapeHtml(humanize(evidenceState))} E2E receipt`,
237
+ state: "failed",
238
+ };
239
+ }
240
+ return {
241
+ label: "Evidence",
242
+ detail: "No fresh passing E2E receipt",
243
+ state: "failed",
244
+ };
245
+ }
246
+ function linkedSourceList(coordinates, repository, fallback) {
247
+ if (coordinates.length === 0)
248
+ return escapeHtml(fallback);
249
+ const visible = coordinates
250
+ .slice(0, 2)
251
+ .map((coordinate) => linkedCoordinate(coordinate, repository, formatSourceCoordinate(coordinate) ?? text(coordinate.id, fallback)));
252
+ const extra = coordinates.length - visible.length;
253
+ return extra > 0
254
+ ? `${visible.join(", ")} +${extra.toLocaleString("en-US")} more`
255
+ : visible.join(", ");
256
+ }
257
+ function requirementStages(row, repository) {
258
+ const stages = record(row.proofStages);
259
+ const semanticInventory = stageStatus(stages.semanticInventory);
260
+ const logicGrounding = stageStatus(stages.logicGrounding);
261
+ const contradictions = stageStatus(stages.contradictions);
262
+ const scenarios = stageStatus(stages.scenarios);
263
+ const scenarioTests = stageStatus(stages.scenarioTests);
264
+ const productionSymbols = record(stages.productionSymbols);
265
+ const sourceCoordinatesStage = record(stages.sourceCoordinates);
266
+ const executableSymbols = record(stages.executableSymbols);
267
+ const passingE2e = record(stages.passingE2e);
268
+ const implementationSymbols = strings(productionSymbols.symbols);
269
+ const missingCoordinates = strings(sourceCoordinatesStage.missingSymbols);
270
+ const receiptEvidence = records(passingE2e.receiptEvidence);
271
+ const hasE2e = receiptEvidence.some((item) => item.scope === "end_to_end");
272
+ const factSources = sourceCoordinates(record(stages.logicGrounding).sources);
273
+ const scenarioSources = sourceCoordinates(record(stages.scenarios).sources);
274
+ const testSources = sourceCoordinates(record(stages.scenarioTests).sources);
275
+ const productionSources = sourceCoordinates(productionSymbols.coordinates);
276
+ const executableSources = sourceCoordinates(executableSymbols.coordinates);
277
+ let implementationState = "failed";
278
+ let implementationDetail = "No production symbol ownership";
279
+ if (stageStatus(productionSymbols) === "passed" &&
280
+ stageStatus(sourceCoordinatesStage) === "passed") {
281
+ implementationState = "passed";
282
+ implementationDetail = linkedSourceList(productionSources, repository, `${implementationSymbols.length} owned and E2E-covered ${implementationSymbols.length === 1 ? "symbol" : "symbols"}`);
283
+ }
284
+ else if (implementationSymbols.length > 0) {
285
+ implementationState = "warning";
286
+ implementationDetail =
287
+ missingCoordinates.length > 0
288
+ ? `${missingCoordinates.length} ${missingCoordinates.length === 1 ? "symbol needs" : "symbols need"} current coordinates`
289
+ : "Ownership present; proof coverage is incomplete";
290
+ }
291
+ const e2eState = hasE2e
292
+ ? stageStatus(executableSymbols) === "missing"
293
+ ? "warning"
294
+ : "passed"
295
+ : "failed";
296
+ const semanticDetail = semanticInventory === "passed" && logicGrounding === "passed"
297
+ ? contradictions === "passed"
298
+ ? linkedSourceList(factSources, repository, "Complete, grounded, and coherent")
299
+ : "Grounded with unresolved coherence"
300
+ : "Incomplete proposition grounding";
301
+ const scenarioCount = strings(record(stages.scenarios).scenarios).length;
302
+ const scenarioDetail = scenarios === "passed" && scenarioTests === "passed"
303
+ ? linkedSourceList(scenarioSources, repository, `${scenarioCount} specified`)
304
+ : scenarios !== "passed"
305
+ ? "Missing requirement scenario"
306
+ : "Scenario has no linked test";
307
+ const e2eDetail = hasE2e
308
+ ? stageStatus(executableSymbols) === "missing"
309
+ ? "Test exists; executable symbol is missing"
310
+ : linkedSourceList(testSources.length > 0 ? testSources : executableSources, repository, "Scenario-backed executable test")
311
+ : "No scenario-backed end-to-end test";
312
+ return [
313
+ {
314
+ label: "Semantic model",
315
+ detail: semanticDetail,
316
+ state: combinedStageState(semanticInventory, logicGrounding, contradictions),
317
+ },
318
+ {
319
+ label: "Scenario",
320
+ detail: scenarioDetail,
321
+ state: combinedStageState(scenarios, scenarioTests),
322
+ },
323
+ {
324
+ label: "Implementation",
325
+ detail: implementationDetail,
326
+ state: implementationState,
327
+ },
328
+ {
329
+ label: "E2E test",
330
+ detail: e2eDetail,
331
+ state: e2eState,
332
+ },
333
+ evidenceStage(passingE2e, testSources, repository),
334
+ ];
335
+ }
336
+ function renderStage(stage) {
337
+ const icons = {
338
+ passed: "✓",
339
+ warning: "!",
340
+ failed: "×",
341
+ muted: "—",
342
+ };
343
+ return `<li class="stage stage--${stage.state}">
344
+ <span class="stage__icon" aria-hidden="true">${icons[stage.state]}</span>
345
+ <span class="stage__label">${escapeHtml(stage.label)}</span>
346
+ <span class="stage__detail">${stage.detail}</span>
347
+ </li>`;
348
+ }
349
+ function formatTermValue(side) {
350
+ const term = record(side.term);
351
+ if (term.value !== undefined) {
352
+ const value = Array.isArray(term.value)
353
+ ? term.value.join(", ")
354
+ : String(term.value);
355
+ return text(term.unit) ? `${value} ${text(term.unit)}` : value;
356
+ }
357
+ if (term.polarity !== undefined)
358
+ return text(term.polarity);
359
+ return text(side.claimText, text(side.factId, "conflicting claim"));
360
+ }
361
+ function conflictKey(conflict) {
362
+ const requirements = strings(conflict.requirements).slice().sort().join("/");
363
+ return `${requirements}:${text(conflict.kind)}:${text(conflict.reason)}`;
364
+ }
365
+ function contradictionRows(rows) {
366
+ const unique = new Map();
367
+ for (const row of rows) {
368
+ const conflicts = records(record(record(row.proofStages).contradictions).conflicts);
369
+ for (const conflict of conflicts) {
370
+ if (text(conflict.status) !== "contradiction")
371
+ continue;
372
+ unique.set(conflictKey(conflict), conflict);
373
+ }
374
+ }
375
+ return [...unique.values()];
376
+ }
377
+ function renderContradiction(conflict) {
378
+ const left = record(conflict.left);
379
+ const right = record(conflict.right);
380
+ const subject = text(conflict.propertyKey, text(conflict.predicateName));
381
+ return `<div class="contradiction">
382
+ <div class="contradiction__eyebrow">Contradiction${subject ? ` · ${escapeHtml(humanize(subject))}` : ""}</div>
383
+ <div class="contradiction__values"><span>${escapeHtml(formatTermValue(left))}</span><b>↔</b><span>${escapeHtml(formatTermValue(right))}</span></div>
384
+ <p>${escapeHtml(text(conflict.reason, "Two current requirements encode incompatible claims."))}</p>
385
+ </div>`;
386
+ }
387
+ function rowSeverity(row) {
388
+ const gaps = strings(row.proofGaps);
389
+ if (gaps.includes("blocking_contradiction"))
390
+ return 0;
391
+ if (gaps.includes("stale_proof_receipt"))
392
+ return 1;
393
+ if (row.proofStatus !== "proven")
394
+ return 2;
395
+ return 3;
396
+ }
397
+ function rowStates(row) {
398
+ const states = new Set();
399
+ const gaps = strings(row.proofGaps);
400
+ if (row.proofStatus === "proven")
401
+ states.add("proven");
402
+ else
403
+ states.add("attention");
404
+ if (gaps.includes("stale_proof_receipt"))
405
+ states.add("stale");
406
+ if (gaps.includes("blocking_contradiction"))
407
+ states.add("contradiction");
408
+ return [...states].join(" ");
409
+ }
410
+ function renderIssueList(codes, className, singular, plural) {
411
+ if (codes.length === 0)
412
+ return "";
413
+ const label = `${codes.length} ${codes.length === 1 ? singular : plural}`;
414
+ return `<details class="${className}"><summary>${escapeHtml(label)}</summary><ul>${codes.map((code) => `<li>${escapeHtml(humanize(code))}</li>`).join("")}</ul></details>`;
415
+ }
416
+ function renderRequirement(row, repository) {
417
+ const id = text(row.id, "REQ-UNKNOWN");
418
+ const title = text(row.title, "Untitled requirement");
419
+ const proofStatus = text(row.proofStatus, "missing");
420
+ const proofGaps = strings(row.proofGaps);
421
+ const proofAdvisories = strings(row.proofAdvisories);
422
+ const blockingGaps = proofStatus === "proven" ? [] : proofGaps;
423
+ const advisories = proofStatus === "proven"
424
+ ? [
425
+ ...proofAdvisories,
426
+ ...proofGaps.filter((gap) => !proofAdvisories.includes(gap)),
427
+ ]
428
+ : proofAdvisories;
429
+ const conflicts = records(record(record(row.proofStages).contradictions).conflicts).filter((conflict) => text(conflict.status) === "contradiction");
430
+ const stages = requirementStages(row, repository);
431
+ const badgeLabel = proofStatus === "proven" ? "Proven" : "Needs attention";
432
+ const requirementSource = sourceCoordinate({
433
+ path: text(record(record(row.proofStages).sourceCoordinates).requirementPath, text(row.source)),
434
+ }) ?? sourceCoordinate({ path: text(row.source) });
435
+ const gate = earliestUnmetGate(row);
436
+ return `<article class="requirement requirement--${escapeHtml(proofStatus)}" data-state="${rowStates(row)}" data-gate="${escapeHtml(gate)}">
437
+ <header class="requirement__header">
438
+ <div>
439
+ <div class="requirement__id">${linkedLabel(id, sourceWebUrl(repository, requirementSource))}</div>
440
+ <h3>${linkedLabel(title, sourceWebUrl(repository, requirementSource))}</h3>
441
+ </div>
442
+ <span class="proof-badge proof-badge--${escapeHtml(proofStatus)}">${escapeHtml(badgeLabel)}</span>
443
+ </header>
444
+ <ul class="stages">${stages.map(renderStage).join("")}</ul>
445
+ ${conflicts.map(renderContradiction).join("")}
446
+ ${renderIssueList(blockingGaps, "proof-gaps", "proof gap", "proof gaps")}
447
+ ${renderIssueList(advisories, "proof-advisories", "advisory", "advisories")}
448
+ </article>`;
449
+ }
450
+ function metric(label, value, tone = "") {
451
+ return `<div class="metric${tone ? ` metric--${tone}` : ""}"><span>${escapeHtml(label)}</span><strong>${value.toLocaleString("en-US")}</strong></div>`;
452
+ }
453
+ function renderProofGate(gate, index) {
454
+ const state = gate.remaining === 0 ? "blocked" : "active";
455
+ const drop = gate.blocked === 0
456
+ ? "No drop"
457
+ : `−${gate.blocked.toLocaleString("en-US")} blocked here`;
458
+ const accessible = `${gate.label}. ${gate.blocked} blocked here. Filter requirements whose earliest unmet proof gate is ${gate.label}.`;
459
+ return `<li>
460
+ <button type="button" class="proof-gate proof-gate--${state}" data-gate="${escapeHtml(gate.key)}" aria-pressed="false" aria-controls="requirements" aria-label="${escapeHtml(accessible)}">
461
+ <div class="proof-gate__node"><span>${index + 1}</span></div>
462
+ <div class="proof-gate__count">${gate.remaining.toLocaleString("en-US")}</div>
463
+ <div class="proof-gate__label">${escapeHtml(gate.label)}</div>
464
+ <div class="proof-gate__drop">${escapeHtml(drop)}</div>
465
+ <p>${escapeHtml(gate.detail)}</p>
466
+ </button>
467
+ </li>`;
468
+ }
469
+ function reportNotice(input) {
470
+ const meta = input.requirements.meta ?? {};
471
+ const notices = [];
472
+ if (meta.dirty === true)
473
+ notices.push("The Kibi knowledge snapshot is stale.");
474
+ if (meta.proofSnapshotDirty === true) {
475
+ notices.push("Proof was evaluated against a dirty workspace.");
476
+ }
477
+ if (notices.length === 0)
478
+ return "";
479
+ return `<aside class="snapshot-notice"><strong>Snapshot warning</strong><span>${escapeHtml(notices.join(" "))}</span></aside>`;
480
+ }
481
+ function reportIdentity(input) {
482
+ const branch = text(input.branch, "unknown");
483
+ const repository = input.repository;
484
+ const identity = text(repository?.identity);
485
+ const shortSha = shortCommitSha(repository?.commitSha);
486
+ const repoHref = repository?.webUrl;
487
+ const commitHref = commitWebUrl(repository);
488
+ const parts = [
489
+ identity ? linkedLabel(identity, repoHref) : "",
490
+ escapeHtml(branch),
491
+ shortSha ? linkedLabel(shortSha, commitHref) : "",
492
+ ].filter(Boolean);
493
+ const snapshotHtml = parts.length > 0
494
+ ? parts.join(' <span aria-hidden="true">/</span> ')
495
+ : "local workspace";
496
+ const titleParts = ["Kibi Requirement Health", identity, branch].filter(Boolean);
497
+ return {
498
+ title: titleParts.join(" · "),
499
+ snapshotHtml,
500
+ };
501
+ }
502
+ function renderFilters(counts) {
503
+ const labels = {
504
+ all: "All",
505
+ proven: "Proven",
506
+ attention: "Needs attention",
507
+ stale: "Stale evidence",
508
+ contradiction: "Contradictions",
509
+ };
510
+ return REPORT_FILTERS.map((filter, index) => {
511
+ const countValue = counts[filter].toLocaleString("en-US");
512
+ return `<button class="filter" type="button" data-filter="${filter}" aria-pressed="${index === 0 ? "true" : "false"}">${escapeHtml(labels[filter])} <span class="filter__count">${countValue}</span></button>`;
513
+ }).join("");
514
+ }
515
+ // implements REQ-kibi-html-health-report
516
+ export function renderHtmlReport(input) {
517
+ const summary = input.requirements.summary;
518
+ const symbolSummary = input.symbols.summary;
519
+ const currentRows = input.requirements.rows
520
+ .filter((row) => row.proofStatus !== "not_applicable")
521
+ .slice()
522
+ .sort((left, right) => {
523
+ const severity = rowSeverity(left) - rowSeverity(right);
524
+ return severity || text(left.id).localeCompare(text(right.id));
525
+ });
526
+ const total = count(summary.total);
527
+ const notApplicable = count(summary.proofNotApplicable);
528
+ const currentRequirements = Math.max(0, total - notApplicable);
529
+ const proven = count(summary.proofProven);
530
+ const proofPercent = currentRequirements === 0
531
+ ? 0
532
+ : Math.round((proven / currentRequirements) * 100);
533
+ const missingScenarios = currentRows.filter((row) => strings(row.proofGaps).includes("missing_scenario")).length;
534
+ const staleEvidence = currentRows.filter((row) => strings(row.proofGaps).includes("stale_proof_receipt")).length;
535
+ const withoutImplementation = currentRows.filter((row) => strings(row.proofGaps).includes("missing_production_symbol")).length;
536
+ const contradictions = contradictionRows(currentRows);
537
+ const unmappedProductionSymbols = Math.max(0, count(symbolSummary.uncovered) - count(symbolSummary.mixedRole));
538
+ const generatedAt = input.generatedAt.toISOString();
539
+ const snapshot = text(input.requirements.meta?.proofSnapshot);
540
+ const branch = text(input.branch, "unknown");
541
+ const repository = {
542
+ ...input.repository,
543
+ branch: input.repository?.branch ?? branch,
544
+ };
545
+ const gates = proofGates(currentRows);
546
+ const filterCounts = reportFilterCounts(currentRows.map((row) => ({
547
+ text: `${text(row.id)} ${text(row.title)}`,
548
+ states: rowStates(row).split(" ").filter(Boolean),
549
+ earliestGate: earliestUnmetGate(row),
550
+ })));
551
+ const identity = reportIdentity({ ...input, repository });
552
+ const faviconHref = renderKibiFaviconDataUri();
553
+ const scoreLabel = currentRequirements === 0
554
+ ? "No current requirements"
555
+ : "Strict proof coverage";
556
+ const scoreRatio = currentRequirements === 0
557
+ ? "No current requirements to prove"
558
+ : `${proven.toLocaleString("en-US")} of ${currentRequirements.toLocaleString("en-US")} current requirements fully proven end-to-end`;
559
+ return `<!doctype html>
560
+ <html lang="en">
561
+ <head>
562
+ <meta charset="utf-8">
563
+ <meta name="viewport" content="width=device-width, initial-scale=1">
564
+ <meta name="color-scheme" content="dark light">
565
+ <meta name="theme-color" content="${KIBI_BRAND.deepCarbon}">
566
+ <meta http-equiv="Content-Security-Policy" content="${REPORT_CSP}">
567
+ <link rel="icon" type="image/svg+xml" href="${escapeHtml(faviconHref)}">
568
+ <title>${escapeHtml(identity.title)}</title>
569
+ <style>\n${reportStyles()}\n </style>
570
+ </head>
571
+ <body>
572
+ <div class="shell">
573
+ <header class="topbar">
574
+ <div class="brand">
575
+ ${renderKibiLogo("brand__logo")}
576
+ ${renderKibiWordmark("brand__wordmark")}
577
+ <span class="brand__product">Requirement health</span>
578
+ </div>
579
+ <div class="snapshot">${identity.snapshotHtml}</div>
580
+ </header>
581
+ <main>
582
+ <section class="overview">
583
+ <div class="overview__copy">
584
+ <p class="eyebrow">Requirement health · ${escapeHtml(branch)}</p>
585
+ <h1>Intent to proof,<br>without the gaps.</h1>
586
+ <p>Kibi compiles product intent into an inspectable chain of semantics, scenarios, implementation ownership, end-to-end tests, and fresh evidence.</p>
587
+ </div>
588
+ <div class="score" aria-label="${proofPercent}% strict proof coverage, ${proven} of ${currentRequirements} current requirements fully proven end-to-end">
589
+ <div class="score__value">${proofPercent}<span>%</span></div>
590
+ <div class="score__label">${escapeHtml(scoreLabel)}</div>
591
+ <div class="score__ratio">${escapeHtml(scoreRatio)}</div>
592
+ ${currentRequirements === 0 ? "" : `<p class="score__note">Kibi only counts a requirement when every required proof gate passes.</p>`}
593
+ </div>
594
+ </section>
595
+ ${reportNotice(input)}
596
+ <section class="proof-path" aria-labelledby="proof-path-title">
597
+ <div class="proof-path__header">
598
+ <div><p class="eyebrow">Intent → proof</p><h2 id="proof-path-title">Where proof stops</h2></div>
599
+ <p>Counts are sequential. Each drop is the earliest unmet gate, so a strict score never looks like a broken report. Select a gate to inspect those requirements.</p>
600
+ </div>
601
+ <ol class="proof-rail" aria-label="Filter requirements by earliest unmet proof gate">${gates.map(renderProofGate).join("")}</ol>
602
+ </section>
603
+ <section class="metrics" aria-label="Requirement health summary">
604
+ ${metric("Requirements", currentRequirements)}
605
+ ${metric("Strict proof coverage", proven, "good")}
606
+ ${metric("Missing scenarios", missingScenarios, missingScenarios ? "warn" : "")}
607
+ ${metric("Stale E2E evidence", staleEvidence, staleEvidence ? "warn" : "")}
608
+ ${metric("Contradictions", contradictions.length, contradictions.length ? "bad" : "")}
609
+ ${metric("Unmapped production symbols", unmappedProductionSymbols, unmappedProductionSymbols ? "bad" : "")}
610
+ ${metric("Requirements without implementation", withoutImplementation, withoutImplementation ? "warn" : "")}
611
+ </section>
612
+ <section>
613
+ <div class="section-header">
614
+ <div><p class="eyebrow">Proof ledger</p><h2>Requirements</h2></div>
615
+ <p>Each row shows independent proof stages. Missing knowledge remains visible instead of being inferred as success.</p>
616
+ </div>
617
+ <div class="controls">
618
+ <input class="search" id="search" type="search" placeholder="Search requirements" aria-label="Search requirements">
619
+ <div class="filters" role="group" aria-label="Filter requirements">
620
+ ${renderFilters(filterCounts)}
621
+ </div>
622
+ </div>
623
+ <div class="requirements" id="requirements">${currentRows.map((row) => renderRequirement(row, repository)).join("")}</div>
624
+ <div class="empty" id="empty" aria-live="polite">No requirements match this view.</div>
625
+ </section>
626
+ </main>
627
+ <footer>
628
+ <span>${renderRelativeTime(generatedAt, "Generated")}${snapshot ? ` · snapshot ${escapeHtml(snapshot.slice(0, 12))}` : ""}${notApplicable > 0 ? ` · ${notApplicable.toLocaleString("en-US")} non-current ${notApplicable === 1 ? "requirement" : "requirements"} excluded` : ""}</span>
629
+ <span>Generated by Kibi · <a class="cta" href="${KIBI_GETTING_STARTED_URL}">Add requirement proof to your repo →</a></span>
630
+ </footer>
631
+ </div>
632
+ <script>
633
+ (() => {
634
+ const search = document.querySelector("#search");
635
+ const cards = [...document.querySelectorAll(".requirement")];
636
+ const filters = [...document.querySelectorAll(".filter")];
637
+ const gates = [...document.querySelectorAll(".proof-gate")];
638
+ const empty = document.querySelector("#empty");
639
+ let activeFilter = "all";
640
+ let activeGate = "all";
641
+ const formatRelativeAge = (fromMs, nowMs) => {
642
+ if (!Number.isFinite(fromMs) || !Number.isFinite(nowMs)) return "timestamp unavailable";
643
+ const deltaSeconds = Math.floor((nowMs - fromMs) / 1000);
644
+ if (deltaSeconds < 0) return "in the future";
645
+ if (deltaSeconds < 60) return "just now";
646
+ const minutes = Math.floor(deltaSeconds / 60);
647
+ if (minutes < 60) return minutes + "m ago";
648
+ const hours = Math.floor(deltaSeconds / 3600);
649
+ const remainingMinutes = minutes % 60;
650
+ if (hours < 24) return remainingMinutes === 0 ? hours + "h ago" : hours + "h " + remainingMinutes + "m ago";
651
+ const days = Math.floor(deltaSeconds / 86400);
652
+ const remainingHours = hours % 24;
653
+ if (days < 7 && remainingHours > 0) return days + "d " + remainingHours + "h ago";
654
+ return days + "d ago";
655
+ };
656
+ const refreshAges = (now = Date.now()) => {
657
+ for (const node of document.querySelectorAll("[data-relative-from]")) {
658
+ const from = Date.parse(node.getAttribute("data-relative-from") || "");
659
+ node.textContent = formatRelativeAge(from, now);
660
+ }
661
+ };
662
+ const apply = () => {
663
+ const query = (search.value || "").trim().toLocaleLowerCase();
664
+ let visible = 0;
665
+ for (const card of cards) {
666
+ const states = (card.dataset.state || "").split(" ").filter(Boolean);
667
+ const gate = card.dataset.gate || "";
668
+ const matchesState = activeFilter === "all" || states.includes(activeFilter);
669
+ const matchesGate = activeGate === "all" || gate === activeGate;
670
+ const matchesQuery = !query || (card.textContent || "").toLocaleLowerCase().includes(query);
671
+ card.hidden = !(matchesState && matchesGate && matchesQuery);
672
+ if (!card.hidden) visible += 1;
673
+ }
674
+ empty.dataset.visible = String(visible === 0);
675
+ };
676
+ search.addEventListener("input", apply);
677
+ for (const filter of filters) {
678
+ filter.addEventListener("click", () => {
679
+ activeFilter = filter.dataset.filter || "all";
680
+ for (const candidate of filters) candidate.setAttribute("aria-pressed", String(candidate === filter));
681
+ apply();
682
+ });
683
+ }
684
+ for (const gate of gates) {
685
+ gate.addEventListener("click", () => {
686
+ const selected = gate.dataset.gate || "all";
687
+ activeGate = activeGate === selected ? "all" : selected;
688
+ for (const candidate of gates) {
689
+ candidate.setAttribute("aria-pressed", String(candidate.dataset.gate === activeGate));
690
+ }
691
+ apply();
692
+ });
693
+ }
694
+ refreshAges();
695
+ setInterval(refreshAges, 30000);
696
+ })();
697
+ </script>
698
+ </body>
699
+ </html>`;
700
+ }