kibi-cli 0.18.1 → 1.0.1

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 (539) hide show
  1. package/dist/cli-json-command.d.ts +1 -2
  2. package/dist/cli-json-command.d.ts.map +1 -1
  3. package/dist/cli-json-command.js +2 -34
  4. package/dist/cli-operation-loader.d.ts +3 -0
  5. package/dist/cli-operation-loader.d.ts.map +1 -0
  6. package/dist/cli-operation-loader.js +91 -0
  7. package/dist/cli-operation-metadata.d.ts +94 -0
  8. package/dist/cli-operation-metadata.d.ts.map +1 -0
  9. package/dist/cli-operation-metadata.js +121 -0
  10. package/dist/cli-protocol.d.ts +1 -1
  11. package/dist/cli-protocol.d.ts.map +1 -1
  12. package/dist/cli-protocol.js +42 -11
  13. package/dist/cli-register-foundation.d.ts.map +1 -1
  14. package/dist/cli-register-foundation.js +28 -19
  15. package/dist/cli-register-json.d.ts +3 -0
  16. package/dist/cli-register-json.d.ts.map +1 -0
  17. package/dist/cli-register-json.js +35 -0
  18. package/dist/cli-register-maintenance.d.ts.map +1 -1
  19. package/dist/cli-register-maintenance.js +60 -13
  20. package/dist/cli-register-reporting.d.ts.map +1 -1
  21. package/dist/cli-register-reporting.js +23 -14
  22. package/dist/cli-register-skills.d.ts.map +1 -1
  23. package/dist/cli-register-skills.js +8 -6
  24. package/dist/cli-register-verification.d.ts +3 -0
  25. package/dist/cli-register-verification.d.ts.map +1 -0
  26. package/dist/cli-register-verification.js +16 -0
  27. package/dist/cli.d.ts.map +1 -1
  28. package/dist/cli.js +3 -1
  29. package/dist/commands/aggregated-checks.d.ts +1 -2
  30. package/dist/commands/aggregated-checks.d.ts.map +1 -1
  31. package/dist/commands/aggregated-checks.js +14 -9
  32. package/dist/commands/branch.d.ts +36 -0
  33. package/dist/commands/branch.d.ts.map +1 -1
  34. package/dist/commands/branch.js +371 -40
  35. package/dist/commands/check.d.ts.map +1 -1
  36. package/dist/commands/check.js +48 -77
  37. package/dist/commands/coverage.js +1 -1
  38. package/dist/commands/discovery-shared.d.ts +2 -1
  39. package/dist/commands/discovery-shared.d.ts.map +1 -1
  40. package/dist/commands/discovery-shared.js +38 -25
  41. package/dist/commands/doctor.d.ts +4 -1
  42. package/dist/commands/doctor.d.ts.map +1 -1
  43. package/dist/commands/doctor.js +259 -24
  44. package/dist/commands/engine.d.ts +8 -0
  45. package/dist/commands/engine.d.ts.map +1 -0
  46. package/dist/commands/engine.js +103 -0
  47. package/dist/commands/gaps.js +1 -1
  48. package/dist/commands/gc.d.ts +5 -2
  49. package/dist/commands/gc.d.ts.map +1 -1
  50. package/dist/commands/gc.js +140 -71
  51. package/dist/commands/github-init.d.ts +56 -0
  52. package/dist/commands/github-init.d.ts.map +1 -0
  53. package/dist/commands/github-init.js +310 -0
  54. package/dist/commands/graph.js +1 -1
  55. package/dist/commands/init-helpers.d.ts +1 -1
  56. package/dist/commands/init-helpers.d.ts.map +1 -1
  57. package/dist/commands/init-helpers.js +73 -25
  58. package/dist/commands/init.d.ts +2 -0
  59. package/dist/commands/init.d.ts.map +1 -1
  60. package/dist/commands/init.js +79 -24
  61. package/dist/commands/legacy-storage-migration.d.ts +54 -0
  62. package/dist/commands/legacy-storage-migration.d.ts.map +1 -0
  63. package/dist/commands/legacy-storage-migration.js +277 -0
  64. package/dist/commands/migrate.d.ts +7 -0
  65. package/dist/commands/migrate.d.ts.map +1 -1
  66. package/dist/commands/migrate.js +244 -91
  67. package/dist/commands/query.d.ts.map +1 -1
  68. package/dist/commands/query.js +3 -1
  69. package/dist/commands/report.d.ts +24 -0
  70. package/dist/commands/report.d.ts.map +1 -0
  71. package/dist/commands/report.js +191 -0
  72. package/dist/commands/search.d.ts.map +1 -1
  73. package/dist/commands/search.js +3 -1
  74. package/dist/commands/status.d.ts.map +1 -1
  75. package/dist/commands/status.js +2 -1
  76. package/dist/commands/sync/cache.d.ts +26 -3
  77. package/dist/commands/sync/cache.d.ts.map +1 -1
  78. package/dist/commands/sync/cache.js +141 -5
  79. package/dist/commands/sync/discovery.d.ts +23 -2
  80. package/dist/commands/sync/discovery.d.ts.map +1 -1
  81. package/dist/commands/sync/discovery.js +196 -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 +8 -5
  86. package/dist/commands/sync/manifest.d.ts.map +1 -1
  87. package/dist/commands/sync/manifest.js +142 -39
  88. package/dist/commands/sync/persistence.d.ts +10 -1
  89. package/dist/commands/sync/persistence.d.ts.map +1 -1
  90. package/dist/commands/sync/persistence.js +223 -44
  91. package/dist/commands/sync/staging.d.ts +10 -1
  92. package/dist/commands/sync/staging.d.ts.map +1 -1
  93. package/dist/commands/sync/staging.js +84 -1
  94. package/dist/commands/sync.d.ts +6 -0
  95. package/dist/commands/sync.d.ts.map +1 -1
  96. package/dist/commands/sync.js +710 -48
  97. package/dist/commands/verify.d.ts +10 -0
  98. package/dist/commands/verify.d.ts.map +1 -0
  99. package/dist/commands/verify.js +126 -0
  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 -0
  103. package/dist/engine-daemon.d.ts.map +1 -0
  104. package/dist/engine-daemon.js +34 -0
  105. package/dist/engine.d.ts +156 -0
  106. package/dist/engine.d.ts.map +1 -0
  107. package/dist/engine.js +1625 -0
  108. package/dist/env.d.ts.map +1 -1
  109. package/dist/env.js +5 -6
  110. package/dist/extractors/manifest.d.ts +8 -1
  111. package/dist/extractors/manifest.d.ts.map +1 -1
  112. package/dist/extractors/manifest.js +51 -9
  113. package/dist/extractors/markdown.d.ts +2 -1
  114. package/dist/extractors/markdown.d.ts.map +1 -1
  115. package/dist/extractors/markdown.js +21 -3
  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 +2 -0
  120. package/dist/extractors/relationships.d.ts.map +1 -1
  121. package/dist/extractors/relationships.js +16 -17
  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/intent-search.d.ts +60 -0
  127. package/dist/intent-search.d.ts.map +1 -0
  128. package/dist/intent-search.js +433 -0
  129. package/dist/operations/bootstrap/activation.d.ts.map +1 -0
  130. package/dist/operations/{autopilot → bootstrap}/activation.js +48 -31
  131. package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts.map +1 -1
  132. package/dist/operations/bootstrap/candidates.d.ts +4 -0
  133. package/dist/operations/{autopilot → bootstrap}/candidates.d.ts.map +1 -1
  134. package/dist/operations/{autopilot → bootstrap}/candidates.js +22 -8
  135. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts +2 -2
  136. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.d.ts.map +1 -1
  137. package/dist/operations/{autopilot → bootstrap}/discovery-evidence.js +46 -6
  138. package/dist/operations/{autopilot → bootstrap}/discovery.d.ts +1 -1
  139. package/dist/operations/bootstrap/discovery.d.ts.map +1 -0
  140. package/dist/operations/{autopilot → bootstrap}/discovery.js +21 -14
  141. package/dist/operations/bootstrap/generate.d.ts +8 -0
  142. package/dist/operations/bootstrap/generate.d.ts.map +1 -0
  143. package/dist/operations/bootstrap/generate.js +204 -0
  144. package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts +2 -2
  145. package/dist/operations/{autopilot → bootstrap}/guidance-actions.d.ts.map +1 -1
  146. package/dist/operations/{autopilot → bootstrap}/guidance-actions.js +4 -4
  147. package/dist/operations/{autopilot → bootstrap}/guidance.d.ts +2 -2
  148. package/dist/operations/{autopilot → bootstrap}/guidance.d.ts.map +1 -1
  149. package/dist/operations/{autopilot → bootstrap}/guidance.js +2 -0
  150. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts +2 -2
  151. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.d.ts.map +1 -1
  152. package/dist/operations/{autopilot → bootstrap}/markdown-candidates.js +4 -3
  153. package/dist/operations/bootstrap/presentation.d.ts +15 -0
  154. package/dist/operations/bootstrap/presentation.d.ts.map +1 -0
  155. package/dist/operations/bootstrap/presentation.js +177 -0
  156. package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts.map +1 -1
  157. package/dist/operations/{autopilot → bootstrap}/types.d.ts +63 -21
  158. package/dist/operations/bootstrap/types.d.ts.map +1 -0
  159. package/dist/operations/bootstrap/types.js +25 -0
  160. package/dist/operations/modeling/model-requirement.d.ts.map +1 -1
  161. package/dist/operations/modeling/model-requirement.js +4 -17
  162. package/dist/operations/modeling/predicate-applicability.d.ts +16 -0
  163. package/dist/operations/modeling/predicate-applicability.d.ts.map +1 -0
  164. package/dist/operations/modeling/predicate-applicability.js +276 -0
  165. package/dist/operations/modeling/predicate-applyplan.d.ts +13 -2
  166. package/dist/operations/modeling/predicate-applyplan.d.ts.map +1 -1
  167. package/dist/operations/modeling/predicate-applyplan.js +100 -3
  168. package/dist/operations/modeling/predicate-bindings.d.ts +6 -0
  169. package/dist/operations/modeling/predicate-bindings.d.ts.map +1 -0
  170. package/dist/operations/modeling/predicate-bindings.js +122 -0
  171. package/dist/operations/modeling/predicate-catalog-4.d.ts.map +1 -1
  172. package/dist/operations/modeling/predicate-catalog-4.js +155 -0
  173. package/dist/operations/modeling/predicate-inference-1.d.ts.map +1 -1
  174. package/dist/operations/modeling/predicate-inference-1.js +8 -0
  175. package/dist/operations/modeling/predicate-inference-launcher.d.ts +10 -0
  176. package/dist/operations/modeling/predicate-inference-launcher.d.ts.map +1 -0
  177. package/dist/operations/modeling/predicate-inference-launcher.js +13 -0
  178. package/dist/operations/modeling/predicate-inference.d.ts.map +1 -1
  179. package/dist/operations/modeling/predicate-inference.js +4 -0
  180. package/dist/operations/modeling/predicate-loader.d.ts.map +1 -1
  181. package/dist/operations/modeling/predicate-loader.js +7 -0
  182. package/dist/operations/modeling/predicate-ranker.d.ts +8 -1
  183. package/dist/operations/modeling/predicate-ranker.d.ts.map +1 -1
  184. package/dist/operations/modeling/predicate-ranker.js +156 -24
  185. package/dist/operations/modeling/predicate-score-3.d.ts.map +1 -1
  186. package/dist/operations/modeling/predicate-score-3.js +6 -0
  187. package/dist/operations/modeling/predicate-types.d.ts +34 -0
  188. package/dist/operations/modeling/predicate-types.d.ts.map +1 -1
  189. package/dist/operations/modeling/predicate-usage-hints-3.d.ts.map +1 -1
  190. package/dist/operations/modeling/predicate-usage-hints-3.js +40 -0
  191. package/dist/operations/modeling/predicate-utils.d.ts.map +1 -1
  192. package/dist/operations/modeling/predicate-utils.js +2 -0
  193. package/dist/operations/modeling/suggest-predicates.d.ts +1 -1
  194. package/dist/operations/modeling/suggest-predicates.d.ts.map +1 -1
  195. package/dist/operations/modeling/suggest-predicates.js +170 -32
  196. package/dist/operations/mutation/delete.d.ts.map +1 -1
  197. package/dist/operations/mutation/delete.js +415 -19
  198. package/dist/operations/mutation/entity-projection.d.ts +11 -0
  199. package/dist/operations/mutation/entity-projection.d.ts.map +1 -0
  200. package/dist/operations/mutation/entity-projection.js +14 -0
  201. package/dist/operations/mutation/relationships.d.ts +10 -0
  202. package/dist/operations/mutation/relationships.d.ts.map +1 -1
  203. package/dist/operations/mutation/relationships.js +71 -1
  204. package/dist/operations/mutation/serialization.d.ts.map +1 -1
  205. package/dist/operations/mutation/serialization.js +1 -0
  206. package/dist/operations/mutation/source-authoring.d.ts +61 -0
  207. package/dist/operations/mutation/source-authoring.d.ts.map +1 -0
  208. package/dist/operations/mutation/source-authoring.js +543 -0
  209. package/dist/operations/mutation/symbol-compiler-lock.d.ts +51 -0
  210. package/dist/operations/mutation/symbol-compiler-lock.d.ts.map +1 -0
  211. package/dist/operations/mutation/symbol-compiler-lock.js +274 -0
  212. package/dist/operations/mutation/symbol-granularity.d.ts.map +1 -1
  213. package/dist/operations/mutation/symbol-granularity.js +34 -3
  214. package/dist/operations/mutation/symbol-refresh.d.ts +18 -1
  215. package/dist/operations/mutation/symbol-refresh.d.ts.map +1 -1
  216. package/dist/operations/mutation/symbol-refresh.js +225 -63
  217. package/dist/operations/mutation/types.d.ts +57 -1
  218. package/dist/operations/mutation/types.d.ts.map +1 -1
  219. package/dist/operations/mutation/upsert.d.ts.map +1 -1
  220. package/dist/operations/mutation/upsert.js +363 -24
  221. package/dist/operations/mutation/validation.d.ts.map +1 -1
  222. package/dist/operations/mutation/validation.js +1 -0
  223. package/dist/operations/planning/apply-plan.d.ts +117 -0
  224. package/dist/operations/planning/apply-plan.d.ts.map +1 -0
  225. package/dist/operations/planning/apply-plan.js +1437 -0
  226. package/dist/operations/planning/compile-intent.d.ts +106 -0
  227. package/dist/operations/planning/compile-intent.d.ts.map +1 -0
  228. package/dist/operations/planning/compile-intent.js +562 -0
  229. package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
  230. package/dist/operations/semantic-advisor/analyze-prose.js +6 -2
  231. package/dist/operations/semantic-advisor/clauses.d.ts.map +1 -1
  232. package/dist/operations/semantic-advisor/clauses.js +15 -2
  233. package/dist/operations/semantic-advisor/ingestion-boundary.d.ts.map +1 -1
  234. package/dist/operations/semantic-advisor/ingestion-boundary.js +7 -3
  235. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts +51 -0
  236. package/dist/operations/semantic-advisor/predicate-rules-launcher.d.ts.map +1 -0
  237. package/dist/operations/semantic-advisor/predicate-rules-launcher.js +96 -0
  238. package/dist/operations/semantic-advisor/types.d.ts +13 -5
  239. package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
  240. package/dist/operations/verification/ingest-verification.d.ts +29 -0
  241. package/dist/operations/verification/ingest-verification.d.ts.map +1 -0
  242. package/dist/operations/verification/ingest-verification.js +192 -0
  243. package/dist/prolog/codec.d.ts.map +1 -1
  244. package/dist/prolog/codec.js +2 -1
  245. package/dist/prolog.d.ts +8 -0
  246. package/dist/prolog.d.ts.map +1 -1
  247. package/dist/prolog.js +66 -16
  248. package/dist/public/branch-resolver.d.ts +1 -0
  249. package/dist/public/branch-resolver.d.ts.map +1 -1
  250. package/dist/public/branch-resolver.js +1 -0
  251. package/dist/public/check-types.d.ts +2 -2
  252. package/dist/public/check-types.d.ts.map +1 -1
  253. package/dist/public/check-types.js +16 -16
  254. package/dist/public/diagnostic-usage.d.ts.map +1 -1
  255. package/dist/public/diagnostic-usage.js +69 -1
  256. package/dist/public/distribution-parity.d.ts +1 -1
  257. package/dist/public/distribution-parity.d.ts.map +1 -1
  258. package/dist/public/distribution-parity.js +1 -0
  259. package/dist/public/ignore-policy.d.ts.map +1 -1
  260. package/dist/public/ignore-policy.js +16 -4
  261. package/dist/public/impact/coverage-depth-quality.d.ts +6 -1
  262. package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
  263. package/dist/public/impact/coverage-depth-quality.js +21 -3
  264. package/dist/public/impact/full-kb-quality.d.ts +4 -2
  265. package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
  266. package/dist/public/impact/full-kb-quality.js +61 -1
  267. package/dist/public/impact/manifest.d.ts.map +1 -1
  268. package/dist/public/impact/manifest.js +2 -5
  269. package/dist/public/operational-artifacts.d.ts.map +1 -1
  270. package/dist/public/operational-artifacts.js +7 -1
  271. package/dist/public/operations/catalog.d.ts +682 -67
  272. package/dist/public/operations/catalog.d.ts.map +1 -1
  273. package/dist/public/operations/catalog.js +126 -4
  274. package/dist/public/operations/check-executor.d.ts +2 -2
  275. package/dist/public/operations/check-executor.d.ts.map +1 -1
  276. package/dist/public/operations/check-executor.js +72 -13
  277. package/dist/public/operations/check-format-shared.d.ts +3 -0
  278. package/dist/public/operations/check-format-shared.d.ts.map +1 -1
  279. package/dist/public/operations/check-format-shared.js +3 -0
  280. package/dist/public/operations/check-helpers.d.ts +27 -2
  281. package/dist/public/operations/check-helpers.d.ts.map +1 -1
  282. package/dist/public/operations/check-helpers.js +62 -26
  283. package/dist/public/operations/contracts.d.ts +11 -0
  284. package/dist/public/operations/contracts.d.ts.map +1 -0
  285. package/dist/public/operations/contracts.js +325 -0
  286. package/dist/public/operations/discovery-entities.d.ts.map +1 -1
  287. package/dist/public/operations/discovery-entities.js +3 -2
  288. package/dist/public/operations/discovery-executors.d.ts +37 -1
  289. package/dist/public/operations/discovery-executors.d.ts.map +1 -1
  290. package/dist/public/operations/discovery-executors.js +246 -9
  291. package/dist/public/operations/index.d.ts +9 -4
  292. package/dist/public/operations/index.d.ts.map +1 -1
  293. package/dist/public/operations/index.js +8 -3
  294. package/dist/public/operations/migration-plan.d.ts +101 -0
  295. package/dist/public/operations/migration-plan.d.ts.map +1 -0
  296. package/dist/public/operations/migration-plan.js +537 -0
  297. package/dist/public/operations/node-ports.d.ts.map +1 -1
  298. package/dist/public/operations/node-ports.js +68 -8
  299. package/dist/public/operations/prolog-json.d.ts +14 -0
  300. package/dist/public/operations/prolog-json.d.ts.map +1 -1
  301. package/dist/public/operations/prolog-json.js +55 -6
  302. package/dist/public/operations/repair-plan.d.ts.map +1 -1
  303. package/dist/public/operations/repair-plan.js +1 -0
  304. package/dist/public/operations/result-envelope.d.ts +13 -0
  305. package/dist/public/operations/result-envelope.d.ts.map +1 -0
  306. package/dist/public/operations/result-envelope.js +104 -0
  307. package/dist/public/operations/runtime-types.d.ts +126 -5
  308. package/dist/public/operations/runtime-types.d.ts.map +1 -1
  309. package/dist/public/operations/source-relationship-parity.d.ts +13 -0
  310. package/dist/public/operations/source-relationship-parity.d.ts.map +1 -0
  311. package/dist/public/operations/source-relationship-parity.js +162 -0
  312. package/dist/public/operations/specs/{autopilot.d.ts → bootstrap.d.ts} +9 -9
  313. package/dist/public/operations/specs/bootstrap.d.ts.map +1 -0
  314. package/dist/public/operations/specs/{autopilot.js → bootstrap.js} +8 -7
  315. package/dist/public/operations/specs/check.d.ts +4 -4
  316. package/dist/public/operations/specs/check.d.ts.map +1 -1
  317. package/dist/public/operations/specs/check.js +4 -3
  318. package/dist/public/operations/specs/discovery.d.ts +87 -3
  319. package/dist/public/operations/specs/discovery.d.ts.map +1 -1
  320. package/dist/public/operations/specs/discovery.js +53 -3
  321. package/dist/public/operations/specs/modeling.d.ts +3 -3
  322. package/dist/public/operations/specs/modeling.js +3 -3
  323. package/dist/public/operations/specs/mutation-schemas.d.ts +190 -47
  324. package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
  325. package/dist/public/operations/specs/mutation-schemas.js +3 -1
  326. package/dist/public/operations/specs/mutation.d.ts +42 -2
  327. package/dist/public/operations/specs/mutation.d.ts.map +1 -1
  328. package/dist/public/operations/specs/mutation.js +26 -2
  329. package/dist/public/operations/specs/planning.d.ts +270 -0
  330. package/dist/public/operations/specs/planning.d.ts.map +1 -0
  331. package/dist/public/operations/specs/planning.js +191 -0
  332. package/dist/public/operations/specs/reporting.d.ts +4 -1
  333. package/dist/public/operations/specs/reporting.d.ts.map +1 -1
  334. package/dist/public/operations/specs/reporting.js +46 -1
  335. package/dist/public/operations/specs/upsert.d.ts +204 -47
  336. package/dist/public/operations/specs/upsert.d.ts.map +1 -1
  337. package/dist/public/operations/specs/upsert.js +9 -0
  338. package/dist/public/operations/specs/verification.d.ts +78 -0
  339. package/dist/public/operations/specs/verification.d.ts.map +1 -0
  340. package/dist/public/operations/specs/verification.js +62 -0
  341. package/dist/public/operations/symbol-repair-plan.d.ts +11 -0
  342. package/dist/public/operations/symbol-repair-plan.d.ts.map +1 -0
  343. package/dist/public/operations/symbol-repair-plan.js +123 -0
  344. package/dist/public/operations/types.d.ts +52 -1
  345. package/dist/public/operations/types.d.ts.map +1 -1
  346. package/dist/public/playwright-case-id.d.ts +8 -0
  347. package/dist/public/playwright-case-id.d.ts.map +1 -0
  348. package/dist/public/playwright-case-id.js +25 -0
  349. package/dist/public/schemas/entity.d.ts.map +1 -1
  350. package/dist/public/schemas/entity.js +4 -2
  351. package/dist/public/skills/kibi-bootstrap/SKILL.md +58 -0
  352. package/dist/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
  353. package/dist/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
  354. package/dist/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
  355. package/dist/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
  356. package/dist/public/skills/kibi-freshness/SKILL.md +40 -10
  357. package/dist/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
  358. package/dist/public/skills/kibi-freshness/resources/operation-access.md +6 -0
  359. package/dist/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
  360. package/dist/public/skills/kibi-traceability/SKILL.md +47 -47
  361. package/dist/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
  362. package/dist/public/skills/kibi-traceability/resources/operation-access.md +5 -0
  363. package/dist/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
  364. package/dist/public/skills/kibi-traceability/resources/traceability.md +8 -0
  365. package/dist/public/skills/kibi-usage/SKILL.md +115 -239
  366. package/dist/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
  367. package/dist/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
  368. package/dist/public/skills/kibi-usage/resources/operation-access.md +36 -38
  369. package/dist/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
  370. package/dist/public/skills/kibi-usage/resources/source-authoring.md +31 -0
  371. package/dist/public/skills/kibi-usage/resources/workflows.md +56 -3
  372. package/dist/public/symbol-granularity.d.ts +1 -1
  373. package/dist/public/symbol-granularity.d.ts.map +1 -1
  374. package/dist/public/symbol-granularity.js +1 -0
  375. package/dist/public/telemetry-acceptance.d.ts +7 -0
  376. package/dist/public/telemetry-acceptance.d.ts.map +1 -1
  377. package/dist/public/telemetry-acceptance.js +8 -1
  378. package/dist/public/telemetry-remediation.js +1 -1
  379. package/dist/public/verification-receipt.d.ts +206 -39
  380. package/dist/public/verification-receipt.d.ts.map +1 -1
  381. package/dist/public/verification-receipt.js +171 -4
  382. package/dist/relationships/shards.d.ts +16 -0
  383. package/dist/relationships/shards.d.ts.map +1 -1
  384. package/dist/relationships/shards.js +87 -2
  385. package/dist/report/brand.d.ts +19 -0
  386. package/dist/report/brand.d.ts.map +1 -0
  387. package/dist/report/brand.js +112 -0
  388. package/dist/report/html-report.d.ts +19 -0
  389. package/dist/report/html-report.d.ts.map +1 -0
  390. package/dist/report/html-report.js +963 -0
  391. package/dist/report/relative-time.d.ts +4 -0
  392. package/dist/report/relative-time.d.ts.map +1 -0
  393. package/dist/report/relative-time.js +46 -0
  394. package/dist/report/report-view.d.ts +17 -0
  395. package/dist/report/report-view.d.ts.map +1 -0
  396. package/dist/report/report-view.js +33 -0
  397. package/dist/report/repository.d.ts +35 -0
  398. package/dist/report/repository.d.ts.map +1 -0
  399. package/dist/report/repository.js +151 -0
  400. package/dist/runtime/cli-runtime.d.ts.map +1 -1
  401. package/dist/runtime/cli-runtime.js +98 -42
  402. package/dist/schemas/entity.schema.json +1148 -273
  403. package/dist/traceability/evidence-model.d.ts +2 -2
  404. package/dist/traceability/evidence-model.d.ts.map +1 -1
  405. package/dist/traceability/evidence-model.js +2 -2
  406. package/dist/traceability/git-staged.d.ts.map +1 -1
  407. package/dist/traceability/git-staged.js +15 -40
  408. package/dist/traceability/markdown-validate.d.ts.map +1 -1
  409. package/dist/traceability/markdown-validate.js +12 -7
  410. package/dist/traceability/staged-impact-contract.d.ts +3 -3
  411. package/dist/traceability/staged-impact-contract.d.ts.map +1 -1
  412. package/dist/traceability/staged-impact-contract.js +10 -38
  413. package/dist/traceability/staged-symbols-manifest.d.ts.map +1 -1
  414. package/dist/traceability/staged-symbols-manifest.js +8 -3
  415. package/dist/traceability/temp-kb.d.ts.map +1 -1
  416. package/dist/traceability/temp-kb.js +3 -0
  417. package/dist/types/entities.d.ts +3 -0
  418. package/dist/types/entities.d.ts.map +1 -1
  419. package/dist/utils/branch-resolver.d.ts +24 -10
  420. package/dist/utils/branch-resolver.d.ts.map +1 -1
  421. package/dist/utils/branch-resolver.js +121 -38
  422. package/dist/utils/branch-store-locator.d.ts +23 -0
  423. package/dist/utils/branch-store-locator.d.ts.map +1 -0
  424. package/dist/utils/branch-store-locator.js +90 -0
  425. package/dist/utils/branch-store.d.ts +15 -0
  426. package/dist/utils/branch-store.d.ts.map +1 -0
  427. package/dist/utils/branch-store.js +130 -0
  428. package/dist/utils/config.d.ts +39 -37
  429. package/dist/utils/config.d.ts.map +1 -1
  430. package/dist/utils/config.js +107 -119
  431. package/dist/utils/kb-manifest.d.ts +35 -0
  432. package/dist/utils/kb-manifest.d.ts.map +1 -0
  433. package/dist/utils/kb-manifest.js +154 -0
  434. package/dist/utils/kb-paths.d.ts +54 -0
  435. package/dist/utils/kb-paths.d.ts.map +1 -0
  436. package/dist/utils/kb-paths.js +125 -0
  437. package/dist/utils/manifest-paths.d.ts +4 -4
  438. package/dist/utils/manifest-paths.d.ts.map +1 -1
  439. package/dist/utils/manifest-paths.js +8 -56
  440. package/dist/utils/rule-registry.d.ts +48 -20
  441. package/dist/utils/rule-registry.d.ts.map +1 -1
  442. package/dist/utils/rule-registry.js +82 -77
  443. package/dist/utils/schema-version.d.ts +5 -5
  444. package/dist/utils/schema-version.d.ts.map +1 -1
  445. package/dist/utils/schema-version.js +26 -6
  446. package/dist/utils/strict-modeling.d.ts +0 -4
  447. package/dist/utils/strict-modeling.d.ts.map +1 -1
  448. package/dist/utils/strict-modeling.js +7 -8
  449. package/dist/verification/playwright-reporter.d.ts +21 -0
  450. package/dist/verification/playwright-reporter.d.ts.map +1 -0
  451. package/dist/verification/playwright-reporter.js +114 -0
  452. package/package.json +51 -8
  453. package/schema/config.json +2 -2
  454. package/schema/manifest.json +26 -0
  455. package/src/public/branch-resolver.ts +1 -0
  456. package/src/public/check-types.ts +22 -19
  457. package/src/public/diagnostic-usage.ts +79 -1
  458. package/src/public/distribution-parity.ts +1 -0
  459. package/src/public/ignore-policy.ts +16 -10
  460. package/src/public/impact/coverage-depth-quality.ts +36 -0
  461. package/src/public/impact/full-kb-quality.ts +118 -5
  462. package/src/public/impact/manifest.ts +2 -4
  463. package/src/public/operational-artifacts.ts +9 -1
  464. package/src/public/operations/catalog.ts +146 -9
  465. package/src/public/operations/check-executor.ts +102 -15
  466. package/src/public/operations/check-format-shared.ts +6 -0
  467. package/src/public/operations/check-helpers.ts +74 -35
  468. package/src/public/operations/contracts.ts +366 -0
  469. package/src/public/operations/discovery-entities.ts +3 -2
  470. package/src/public/operations/discovery-executors.ts +343 -15
  471. package/src/public/operations/index.ts +9 -4
  472. package/src/public/operations/migration-plan.ts +740 -0
  473. package/src/public/operations/node-ports.ts +84 -10
  474. package/src/public/operations/prolog-json.ts +73 -6
  475. package/src/public/operations/repair-plan.ts +1 -0
  476. package/src/public/operations/result-envelope.ts +136 -0
  477. package/src/public/operations/runtime-types.ts +130 -5
  478. package/src/public/operations/source-relationship-parity.ts +226 -0
  479. package/src/public/operations/specs/{autopilot.ts → bootstrap.ts} +17 -16
  480. package/src/public/operations/specs/check.ts +4 -3
  481. package/src/public/operations/specs/discovery.ts +57 -3
  482. package/src/public/operations/specs/modeling.ts +3 -3
  483. package/src/public/operations/specs/mutation-schemas.ts +6 -1
  484. package/src/public/operations/specs/mutation.ts +27 -2
  485. package/src/public/operations/specs/planning.ts +234 -0
  486. package/src/public/operations/specs/reporting.ts +55 -1
  487. package/src/public/operations/specs/upsert.ts +10 -0
  488. package/src/public/operations/specs/verification.ts +78 -0
  489. package/src/public/operations/symbol-repair-plan.ts +164 -0
  490. package/src/public/operations/types.ts +62 -1
  491. package/src/public/playwright-case-id.ts +35 -0
  492. package/src/public/schemas/entity.ts +7 -2
  493. package/src/public/skills/kibi-bootstrap/SKILL.md +58 -0
  494. package/src/public/skills/kibi-bootstrap/resources/bootstrap.md +11 -0
  495. package/src/public/skills/kibi-bootstrap/resources/branch-lifecycle.md +7 -0
  496. package/src/public/skills/kibi-bootstrap/resources/operation-access.md +5 -0
  497. package/src/public/skills/kibi-bootstrap/resources/source-authoring.md +8 -0
  498. package/src/public/skills/kibi-freshness/SKILL.md +40 -10
  499. package/src/public/skills/kibi-freshness/resources/branch-lifecycle.md +7 -0
  500. package/src/public/skills/kibi-freshness/resources/operation-access.md +6 -0
  501. package/src/public/skills/kibi-freshness/resources/source-authoring.md +7 -0
  502. package/src/public/skills/kibi-traceability/SKILL.md +47 -47
  503. package/src/public/skills/kibi-traceability/resources/branch-lifecycle.md +7 -0
  504. package/src/public/skills/kibi-traceability/resources/operation-access.md +5 -0
  505. package/src/public/skills/kibi-traceability/resources/source-authoring.md +6 -0
  506. package/src/public/skills/kibi-traceability/resources/traceability.md +8 -0
  507. package/src/public/skills/kibi-usage/SKILL.md +115 -239
  508. package/src/public/skills/kibi-usage/resources/branch-lifecycle.md +31 -0
  509. package/src/public/skills/kibi-usage/resources/kb-improvement.md +38 -0
  510. package/src/public/skills/kibi-usage/resources/operation-access.md +36 -38
  511. package/src/public/skills/kibi-usage/resources/relationship-directions.md +3 -3
  512. package/src/public/skills/kibi-usage/resources/source-authoring.md +31 -0
  513. package/src/public/skills/kibi-usage/resources/workflows.md +56 -3
  514. package/src/public/symbol-granularity.ts +1 -0
  515. package/src/public/telemetry-acceptance.ts +16 -1
  516. package/src/public/telemetry-remediation.ts +1 -1
  517. package/src/public/verification-receipt.ts +248 -6
  518. package/src/schemas/entity.schema.json +1148 -273
  519. package/templates/github/kibi-badge.yml +86 -0
  520. package/templates/github/kibi-report.yml +84 -0
  521. package/dist/operations/autopilot/activation.d.ts.map +0 -1
  522. package/dist/operations/autopilot/candidates.d.ts +0 -4
  523. package/dist/operations/autopilot/discovery.d.ts.map +0 -1
  524. package/dist/operations/autopilot/generate.d.ts +0 -8
  525. package/dist/operations/autopilot/generate.d.ts.map +0 -1
  526. package/dist/operations/autopilot/generate.js +0 -112
  527. package/dist/operations/autopilot/presentation.d.ts +0 -13
  528. package/dist/operations/autopilot/presentation.d.ts.map +0 -1
  529. package/dist/operations/autopilot/presentation.js +0 -91
  530. package/dist/operations/autopilot/types.d.ts.map +0 -1
  531. package/dist/operations/autopilot/types.js +0 -8
  532. package/dist/public/operations/specs/autopilot.d.ts.map +0 -1
  533. package/dist/public/skills/init-kibi/SKILL.md +0 -62
  534. package/src/public/skills/init-kibi/SKILL.md +0 -62
  535. /package/dist/operations/{autopilot → bootstrap}/activation.d.ts +0 -0
  536. /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.d.ts +0 -0
  537. /package/dist/operations/{autopilot → bootstrap}/candidate-helpers.js +0 -0
  538. /package/dist/operations/{autopilot → bootstrap}/requirement-claims.d.ts +0 -0
  539. /package/dist/operations/{autopilot → bootstrap}/requirement-claims.js +0 -0
@@ -0,0 +1,963 @@
1
+ import { KIBI_BRAND, renderKibiFaviconDataUri, renderKibiLogo, renderKibiWordmark, } from "./brand.js";
2
+ import { formatAbsoluteUtc, parseTimestamp } from "./relative-time.js";
3
+ import { REPORT_FILTERS, reportFilterCounts, } from "./report-view.js";
4
+ import { commitWebUrl, formatSourceCoordinate, shortCommitSha, sourceWebUrl, } from "./repository.js";
5
+ // implements REQ-kibi-html-health-report
6
+ export const REPORT_CSP = "default-src 'none'; img-src data:; style-src 'unsafe-inline'; script-src 'unsafe-inline'";
7
+ // implements REQ-kibi-html-health-report
8
+ export const KIBI_GETTING_STARTED_URL = "https://github.com/Looted/kibi/blob/develop/docs/install.md";
9
+ function record(value) {
10
+ return value !== null && typeof value === "object" && !Array.isArray(value)
11
+ ? value
12
+ : {};
13
+ }
14
+ function records(value) {
15
+ return Array.isArray(value) ? value.map(record) : [];
16
+ }
17
+ function strings(value) {
18
+ return Array.isArray(value)
19
+ ? value.filter((item) => typeof item === "string")
20
+ : [];
21
+ }
22
+ function text(value, fallback = "") {
23
+ return typeof value === "string" && value.trim() ? value.trim() : fallback;
24
+ }
25
+ function count(value) {
26
+ return typeof value === "number" && Number.isFinite(value)
27
+ ? Math.max(0, Math.trunc(value))
28
+ : 0;
29
+ }
30
+ function escapeHtml(value) {
31
+ return String(value)
32
+ .replaceAll("&", "&")
33
+ .replaceAll("<", "&lt;")
34
+ .replaceAll(">", "&gt;")
35
+ .replaceAll('"', "&quot;")
36
+ .replaceAll("'", "&#39;");
37
+ }
38
+ function humanize(value) {
39
+ return value
40
+ .replaceAll("_", " ")
41
+ .replace(/\b\w/g, (character) => character.toUpperCase());
42
+ }
43
+ function sourceCoordinate(value) {
44
+ const item = record(value);
45
+ const path = text(item.path);
46
+ if (!path)
47
+ return undefined;
48
+ const line = Number(item.line);
49
+ const endLine = Number(item.endLine);
50
+ const id = text(item.id);
51
+ return {
52
+ path,
53
+ ...(id ? { id } : {}),
54
+ ...(Number.isInteger(line) && line >= 1 ? { line } : {}),
55
+ ...(Number.isInteger(endLine) && endLine >= 1 ? { endLine } : {}),
56
+ };
57
+ }
58
+ function sourceCoordinates(value) {
59
+ return Array.isArray(value)
60
+ ? value.flatMap((item) => {
61
+ const coordinate = sourceCoordinate(item);
62
+ return coordinate ? [coordinate] : [];
63
+ })
64
+ : [];
65
+ }
66
+ function linkedLabel(label, href) {
67
+ const safe = escapeHtml(label);
68
+ if (!href)
69
+ return safe;
70
+ return `<a class="source-link" href="${escapeHtml(href)}" target="_blank" rel="noopener noreferrer">${safe}</a>`;
71
+ }
72
+ function linkedCoordinate(coordinate, repository, fallback) {
73
+ const label = formatSourceCoordinate(coordinate) ?? fallback;
74
+ return linkedLabel(label, sourceWebUrl(repository, coordinate));
75
+ }
76
+ function renderRelativeTime(iso, prefixHtml) {
77
+ const date = parseTimestamp(iso);
78
+ if (!date) {
79
+ return `${prefixHtml} timestamp unavailable`;
80
+ }
81
+ const absolute = formatAbsoluteUtc(date);
82
+ const datetime = date.toISOString();
83
+ return `${prefixHtml} <time datetime="${escapeHtml(datetime)}">${escapeHtml(absolute)}</time><span class="relative-age" data-relative-from="${escapeHtml(datetime)}"></span>`;
84
+ }
85
+ function stageStatus(stage) {
86
+ return text(record(stage).status, "missing");
87
+ }
88
+ function combinedStageState(...statuses) {
89
+ if (statuses.every((status) => status === "passed"))
90
+ return "passed";
91
+ if (statuses.some((status) => ["blocked", "unresolved", "stale"].includes(status))) {
92
+ return "warning";
93
+ }
94
+ if (statuses.some((status) => status === "not_applicable"))
95
+ return "muted";
96
+ return "failed";
97
+ }
98
+ function stagePassed(stages, name) {
99
+ return stageStatus(stages[name]) === "passed";
100
+ }
101
+ function hasEndToEndTest(stages) {
102
+ const evidence = records(record(stages.passingE2e).receiptEvidence);
103
+ return evidence.some((item) => item.scope === "end_to_end");
104
+ }
105
+ function implementationOwned(stages) {
106
+ const productionSymbols = strings(record(stages.productionSymbols).symbols);
107
+ if (productionSymbols.length === 0)
108
+ return false;
109
+ const sourceCoordinates = record(stages.sourceCoordinates);
110
+ if (sourceCoordinates.requirementSource !== "present")
111
+ return false;
112
+ const missingCoordinates = new Set(strings(sourceCoordinates.missingSymbols));
113
+ return productionSymbols.every((symbol) => !missingCoordinates.has(symbol));
114
+ }
115
+ function passesProofGate(row, gate) {
116
+ if (row.proofStatus === "proven")
117
+ return true;
118
+ const stages = record(row.proofStages);
119
+ if (gate === "semantic") {
120
+ return (stagePassed(stages, "semanticInventory") &&
121
+ stagePassed(stages, "logicGrounding") &&
122
+ stagePassed(stages, "contradictions"));
123
+ }
124
+ if (gate === "scenario")
125
+ return stagePassed(stages, "scenarios");
126
+ if (gate === "implementation")
127
+ return implementationOwned(stages);
128
+ if (gate === "e2e") {
129
+ return stagePassed(stages, "scenarioTests") && hasEndToEndTest(stages);
130
+ }
131
+ return row.proofStatus === "proven";
132
+ }
133
+ function proofGates(rows) {
134
+ const definitions = [
135
+ [
136
+ "semantic",
137
+ "Semantic model",
138
+ "Intent is complete, grounded, and coherent",
139
+ ],
140
+ ["scenario", "Scenario", "Behavior is specified"],
141
+ [
142
+ "implementation",
143
+ "Implementation",
144
+ "Production ownership is source-bound",
145
+ ],
146
+ ["e2e", "E2E", "A scenario-backed end-to-end test exists"],
147
+ ["evidence", "Evidence", "Every strict proof stage passes now"],
148
+ ];
149
+ let candidates = [...rows];
150
+ return definitions.map(([key, label, detail]) => {
151
+ const remainingRows = candidates.filter((row) => passesProofGate(row, key));
152
+ const gate = {
153
+ key,
154
+ label,
155
+ detail,
156
+ remaining: remainingRows.length,
157
+ blocked: candidates.length - remainingRows.length,
158
+ };
159
+ candidates = remainingRows;
160
+ return gate;
161
+ });
162
+ }
163
+ function earliestUnmetGate(row) {
164
+ if (row.proofStatus === "proven")
165
+ return "proven";
166
+ for (const gate of [
167
+ "semantic",
168
+ "scenario",
169
+ "implementation",
170
+ "e2e",
171
+ "evidence",
172
+ ]) {
173
+ if (!passesProofGate(row, gate))
174
+ return gate;
175
+ }
176
+ return "proven";
177
+ }
178
+ function evidenceStage(passingE2e, testSources, repository) {
179
+ const evidence = records(passingE2e.receiptEvidence);
180
+ const passed = evidence.find((item) => item.state === "passed");
181
+ if (passed) {
182
+ const testSource = testSources.find((item) => item.id === text(passed.testId)) ??
183
+ testSources[0];
184
+ const prefix = linkedLabel("Passed", sourceWebUrl(repository, testSource));
185
+ return {
186
+ label: "Evidence",
187
+ detail: renderRelativeTime(text(passed.finishedAt) || undefined, prefix),
188
+ state: "passed",
189
+ };
190
+ }
191
+ const evidenceState = text(evidence[0]?.state);
192
+ if (evidenceState === "stale") {
193
+ return {
194
+ label: "Evidence",
195
+ detail: "E2E receipt stale for this code snapshot",
196
+ state: "warning",
197
+ };
198
+ }
199
+ if (evidenceState === "contract_mismatch") {
200
+ return {
201
+ label: "Evidence",
202
+ detail: "Receipt uses an older verification contract",
203
+ state: "warning",
204
+ };
205
+ }
206
+ if (evidenceState === "snapshot_unavailable") {
207
+ return {
208
+ label: "Evidence",
209
+ detail: "Code snapshot unavailable",
210
+ state: "warning",
211
+ };
212
+ }
213
+ if (["failed", "invalid"].includes(evidenceState)) {
214
+ return {
215
+ label: "Evidence",
216
+ detail: `${escapeHtml(humanize(evidenceState))} E2E receipt`,
217
+ state: "failed",
218
+ };
219
+ }
220
+ return {
221
+ label: "Evidence",
222
+ detail: "No fresh passing E2E receipt",
223
+ state: "failed",
224
+ };
225
+ }
226
+ function linkedSourceList(coordinates, repository, fallback) {
227
+ if (coordinates.length === 0)
228
+ return escapeHtml(fallback);
229
+ const visible = coordinates
230
+ .slice(0, 2)
231
+ .map((coordinate) => linkedCoordinate(coordinate, repository, formatSourceCoordinate(coordinate) ?? text(coordinate.id, fallback)));
232
+ const extra = coordinates.length - visible.length;
233
+ return extra > 0
234
+ ? `${visible.join(", ")} +${extra.toLocaleString("en-US")} more`
235
+ : visible.join(", ");
236
+ }
237
+ function requirementStages(row, repository) {
238
+ const stages = record(row.proofStages);
239
+ const semanticInventory = stageStatus(stages.semanticInventory);
240
+ const logicGrounding = stageStatus(stages.logicGrounding);
241
+ const contradictions = stageStatus(stages.contradictions);
242
+ const scenarios = stageStatus(stages.scenarios);
243
+ const scenarioTests = stageStatus(stages.scenarioTests);
244
+ const productionSymbols = record(stages.productionSymbols);
245
+ const sourceCoordinatesStage = record(stages.sourceCoordinates);
246
+ const executableSymbols = record(stages.executableSymbols);
247
+ const passingE2e = record(stages.passingE2e);
248
+ const implementationSymbols = strings(productionSymbols.symbols);
249
+ const missingCoordinates = strings(sourceCoordinatesStage.missingSymbols);
250
+ const receiptEvidence = records(passingE2e.receiptEvidence);
251
+ const hasE2e = receiptEvidence.some((item) => item.scope === "end_to_end");
252
+ const factSources = sourceCoordinates(record(stages.logicGrounding).sources);
253
+ const scenarioSources = sourceCoordinates(record(stages.scenarios).sources);
254
+ const testSources = sourceCoordinates(record(stages.scenarioTests).sources);
255
+ const productionSources = sourceCoordinates(productionSymbols.coordinates);
256
+ const executableSources = sourceCoordinates(executableSymbols.coordinates);
257
+ let implementationState = "failed";
258
+ let implementationDetail = "No production symbol ownership";
259
+ if (stageStatus(productionSymbols) === "passed" &&
260
+ stageStatus(sourceCoordinatesStage) === "passed") {
261
+ implementationState = "passed";
262
+ implementationDetail = linkedSourceList(productionSources, repository, `${implementationSymbols.length} owned and E2E-covered ${implementationSymbols.length === 1 ? "symbol" : "symbols"}`);
263
+ }
264
+ else if (implementationSymbols.length > 0) {
265
+ implementationState = "warning";
266
+ implementationDetail =
267
+ missingCoordinates.length > 0
268
+ ? `${missingCoordinates.length} ${missingCoordinates.length === 1 ? "symbol needs" : "symbols need"} current coordinates`
269
+ : "Ownership present; proof coverage is incomplete";
270
+ }
271
+ const e2eState = hasE2e
272
+ ? stageStatus(executableSymbols) === "missing"
273
+ ? "warning"
274
+ : "passed"
275
+ : "failed";
276
+ const semanticDetail = semanticInventory === "passed" && logicGrounding === "passed"
277
+ ? contradictions === "passed"
278
+ ? linkedSourceList(factSources, repository, "Complete, grounded, and coherent")
279
+ : "Grounded with unresolved coherence"
280
+ : "Incomplete proposition grounding";
281
+ const scenarioCount = strings(record(stages.scenarios).scenarios).length;
282
+ const scenarioDetail = scenarios === "passed" && scenarioTests === "passed"
283
+ ? linkedSourceList(scenarioSources, repository, `${scenarioCount} specified`)
284
+ : scenarios !== "passed"
285
+ ? "Missing requirement scenario"
286
+ : "Scenario has no linked test";
287
+ const e2eDetail = hasE2e
288
+ ? stageStatus(executableSymbols) === "missing"
289
+ ? "Test exists; executable symbol is missing"
290
+ : linkedSourceList(testSources.length > 0 ? testSources : executableSources, repository, "Scenario-backed executable test")
291
+ : "No scenario-backed end-to-end test";
292
+ return [
293
+ {
294
+ label: "Semantic model",
295
+ detail: semanticDetail,
296
+ state: combinedStageState(semanticInventory, logicGrounding, contradictions),
297
+ },
298
+ {
299
+ label: "Scenario",
300
+ detail: scenarioDetail,
301
+ state: combinedStageState(scenarios, scenarioTests),
302
+ },
303
+ {
304
+ label: "Implementation",
305
+ detail: implementationDetail,
306
+ state: implementationState,
307
+ },
308
+ {
309
+ label: "E2E test",
310
+ detail: e2eDetail,
311
+ state: e2eState,
312
+ },
313
+ evidenceStage(passingE2e, testSources, repository),
314
+ ];
315
+ }
316
+ function renderStage(stage) {
317
+ const icons = {
318
+ passed: "✓",
319
+ warning: "!",
320
+ failed: "×",
321
+ muted: "—",
322
+ };
323
+ return `<li class="stage stage--${stage.state}">
324
+ <span class="stage__icon" aria-hidden="true">${icons[stage.state]}</span>
325
+ <span class="stage__label">${escapeHtml(stage.label)}</span>
326
+ <span class="stage__detail">${stage.detail}</span>
327
+ </li>`;
328
+ }
329
+ function formatTermValue(side) {
330
+ const term = record(side.term);
331
+ if (term.value !== undefined) {
332
+ const value = Array.isArray(term.value)
333
+ ? term.value.join(", ")
334
+ : String(term.value);
335
+ return text(term.unit) ? `${value} ${text(term.unit)}` : value;
336
+ }
337
+ if (term.polarity !== undefined)
338
+ return text(term.polarity);
339
+ return text(side.claimText, text(side.factId, "conflicting claim"));
340
+ }
341
+ function conflictKey(conflict) {
342
+ const requirements = strings(conflict.requirements).slice().sort().join("/");
343
+ return `${requirements}:${text(conflict.kind)}:${text(conflict.reason)}`;
344
+ }
345
+ function contradictionRows(rows) {
346
+ const unique = new Map();
347
+ for (const row of rows) {
348
+ const conflicts = records(record(record(row.proofStages).contradictions).conflicts);
349
+ for (const conflict of conflicts) {
350
+ if (text(conflict.status) !== "contradiction")
351
+ continue;
352
+ unique.set(conflictKey(conflict), conflict);
353
+ }
354
+ }
355
+ return [...unique.values()];
356
+ }
357
+ function renderContradiction(conflict) {
358
+ const left = record(conflict.left);
359
+ const right = record(conflict.right);
360
+ const subject = text(conflict.propertyKey, text(conflict.predicateName));
361
+ return `<div class="contradiction">
362
+ <div class="contradiction__eyebrow">Contradiction${subject ? ` · ${escapeHtml(humanize(subject))}` : ""}</div>
363
+ <div class="contradiction__values"><span>${escapeHtml(formatTermValue(left))}</span><b>↔</b><span>${escapeHtml(formatTermValue(right))}</span></div>
364
+ <p>${escapeHtml(text(conflict.reason, "Two current requirements encode incompatible claims."))}</p>
365
+ </div>`;
366
+ }
367
+ function rowSeverity(row) {
368
+ const gaps = strings(row.proofGaps);
369
+ if (gaps.includes("blocking_contradiction"))
370
+ return 0;
371
+ if (gaps.includes("stale_verification_receipt"))
372
+ return 1;
373
+ if (row.proofStatus !== "proven")
374
+ return 2;
375
+ return 3;
376
+ }
377
+ function rowStates(row) {
378
+ const states = new Set();
379
+ const gaps = strings(row.proofGaps);
380
+ if (row.proofStatus === "proven")
381
+ states.add("proven");
382
+ else
383
+ states.add("attention");
384
+ if (gaps.includes("stale_verification_receipt"))
385
+ states.add("stale");
386
+ if (gaps.includes("blocking_contradiction"))
387
+ states.add("contradiction");
388
+ return [...states].join(" ");
389
+ }
390
+ function renderIssueList(codes, className, singular, plural) {
391
+ if (codes.length === 0)
392
+ return "";
393
+ const label = `${codes.length} ${codes.length === 1 ? singular : plural}`;
394
+ return `<details class="${className}"><summary>${escapeHtml(label)}</summary><ul>${codes.map((code) => `<li>${escapeHtml(humanize(code))}</li>`).join("")}</ul></details>`;
395
+ }
396
+ function renderRequirement(row, repository) {
397
+ const id = text(row.id, "REQ-UNKNOWN");
398
+ const title = text(row.title, "Untitled requirement");
399
+ const proofStatus = text(row.proofStatus, "missing");
400
+ const proofGaps = strings(row.proofGaps);
401
+ const proofAdvisories = strings(row.proofAdvisories);
402
+ const blockingGaps = proofStatus === "proven" ? [] : proofGaps;
403
+ const advisories = proofStatus === "proven"
404
+ ? [
405
+ ...proofAdvisories,
406
+ ...proofGaps.filter((gap) => !proofAdvisories.includes(gap)),
407
+ ]
408
+ : proofAdvisories;
409
+ const conflicts = records(record(record(row.proofStages).contradictions).conflicts).filter((conflict) => text(conflict.status) === "contradiction");
410
+ const stages = requirementStages(row, repository);
411
+ const badgeLabel = proofStatus === "proven" ? "Proven" : "Needs attention";
412
+ const requirementSource = sourceCoordinate({
413
+ path: text(record(record(row.proofStages).sourceCoordinates).requirementPath, text(row.source)),
414
+ }) ?? sourceCoordinate({ path: text(row.source) });
415
+ const gate = earliestUnmetGate(row);
416
+ return `<article class="requirement requirement--${escapeHtml(proofStatus)}" data-state="${rowStates(row)}" data-gate="${escapeHtml(gate)}">
417
+ <header class="requirement__header">
418
+ <div>
419
+ <div class="requirement__id">${linkedLabel(id, sourceWebUrl(repository, requirementSource))}</div>
420
+ <h3>${linkedLabel(title, sourceWebUrl(repository, requirementSource))}</h3>
421
+ </div>
422
+ <span class="proof-badge proof-badge--${escapeHtml(proofStatus)}">${escapeHtml(badgeLabel)}</span>
423
+ </header>
424
+ <ul class="stages">${stages.map(renderStage).join("")}</ul>
425
+ ${conflicts.map(renderContradiction).join("")}
426
+ ${renderIssueList(blockingGaps, "proof-gaps", "proof gap", "proof gaps")}
427
+ ${renderIssueList(advisories, "proof-advisories", "advisory", "advisories")}
428
+ </article>`;
429
+ }
430
+ function metric(label, value, tone = "") {
431
+ return `<div class="metric${tone ? ` metric--${tone}` : ""}"><span>${escapeHtml(label)}</span><strong>${value.toLocaleString("en-US")}</strong></div>`;
432
+ }
433
+ function renderProofGate(gate, index) {
434
+ const state = gate.remaining === 0 ? "blocked" : "active";
435
+ const drop = gate.blocked === 0
436
+ ? "No drop"
437
+ : `−${gate.blocked.toLocaleString("en-US")} blocked here`;
438
+ const accessible = `${gate.label}. ${gate.blocked} blocked here. Filter requirements whose earliest unmet proof gate is ${gate.label}.`;
439
+ return `<li>
440
+ <button type="button" class="proof-gate proof-gate--${state}" data-gate="${escapeHtml(gate.key)}" aria-pressed="false" aria-controls="requirements" aria-label="${escapeHtml(accessible)}">
441
+ <div class="proof-gate__node"><span>${index + 1}</span></div>
442
+ <div class="proof-gate__count">${gate.remaining.toLocaleString("en-US")}</div>
443
+ <div class="proof-gate__label">${escapeHtml(gate.label)}</div>
444
+ <div class="proof-gate__drop">${escapeHtml(drop)}</div>
445
+ <p>${escapeHtml(gate.detail)}</p>
446
+ </button>
447
+ </li>`;
448
+ }
449
+ function reportNotice(input) {
450
+ const meta = input.requirements.meta ?? {};
451
+ const notices = [];
452
+ if (meta.dirty === true)
453
+ notices.push("The Kibi knowledge snapshot is stale.");
454
+ if (meta.verificationSnapshotDirty === true) {
455
+ notices.push("Proof was evaluated against a dirty workspace.");
456
+ }
457
+ if (notices.length === 0)
458
+ return "";
459
+ return `<aside class="snapshot-notice"><strong>Snapshot warning</strong><span>${escapeHtml(notices.join(" "))}</span></aside>`;
460
+ }
461
+ function reportIdentity(input) {
462
+ const branch = text(input.branch, "unknown");
463
+ const repository = input.repository;
464
+ const identity = text(repository?.identity);
465
+ const shortSha = shortCommitSha(repository?.commitSha);
466
+ const repoHref = repository?.webUrl;
467
+ const commitHref = commitWebUrl(repository);
468
+ const parts = [
469
+ identity ? linkedLabel(identity, repoHref) : "",
470
+ escapeHtml(branch),
471
+ shortSha ? linkedLabel(shortSha, commitHref) : "",
472
+ ].filter(Boolean);
473
+ const snapshotHtml = parts.length > 0
474
+ ? parts.join(' <span aria-hidden="true">/</span> ')
475
+ : "local workspace";
476
+ const titleParts = ["Kibi Requirement Health", identity, branch].filter(Boolean);
477
+ return {
478
+ title: titleParts.join(" · "),
479
+ snapshotHtml,
480
+ };
481
+ }
482
+ function renderFilters(counts) {
483
+ const labels = {
484
+ all: "All",
485
+ proven: "Proven",
486
+ attention: "Needs attention",
487
+ stale: "Stale evidence",
488
+ contradiction: "Contradictions",
489
+ };
490
+ return REPORT_FILTERS.map((filter, index) => {
491
+ const countValue = counts[filter].toLocaleString("en-US");
492
+ 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>`;
493
+ }).join("");
494
+ }
495
+ // implements REQ-kibi-html-health-report
496
+ export function renderHtmlReport(input) {
497
+ const summary = input.requirements.summary;
498
+ const symbolSummary = input.symbols.summary;
499
+ const currentRows = input.requirements.rows
500
+ .filter((row) => row.proofStatus !== "not_applicable")
501
+ .slice()
502
+ .sort((left, right) => {
503
+ const severity = rowSeverity(left) - rowSeverity(right);
504
+ return severity || text(left.id).localeCompare(text(right.id));
505
+ });
506
+ const total = count(summary.total);
507
+ const notApplicable = count(summary.proofNotApplicable);
508
+ const currentRequirements = Math.max(0, total - notApplicable);
509
+ const proven = count(summary.proofProven);
510
+ const proofPercent = currentRequirements === 0
511
+ ? 0
512
+ : Math.round((proven / currentRequirements) * 100);
513
+ const missingScenarios = currentRows.filter((row) => strings(row.proofGaps).includes("missing_scenario")).length;
514
+ const staleEvidence = currentRows.filter((row) => strings(row.proofGaps).includes("stale_verification_receipt")).length;
515
+ const withoutImplementation = currentRows.filter((row) => strings(row.proofGaps).includes("missing_production_symbol")).length;
516
+ const contradictions = contradictionRows(currentRows);
517
+ const unmappedProductionSymbols = Math.max(0, count(symbolSummary.uncovered) - count(symbolSummary.mixedRole));
518
+ const generatedAt = input.generatedAt.toISOString();
519
+ const snapshot = text(input.requirements.meta?.verificationSnapshot);
520
+ const branch = text(input.branch, "unknown");
521
+ const repository = {
522
+ ...input.repository,
523
+ branch: input.repository?.branch ?? branch,
524
+ };
525
+ const gates = proofGates(currentRows);
526
+ const filterCounts = reportFilterCounts(currentRows.map((row) => ({
527
+ text: `${text(row.id)} ${text(row.title)}`,
528
+ states: rowStates(row).split(" ").filter(Boolean),
529
+ earliestGate: earliestUnmetGate(row),
530
+ })));
531
+ const identity = reportIdentity({ ...input, repository });
532
+ const faviconHref = renderKibiFaviconDataUri();
533
+ const scoreLabel = currentRequirements === 0
534
+ ? "No current requirements"
535
+ : "Strict proof coverage";
536
+ const scoreRatio = currentRequirements === 0
537
+ ? "No current requirements to prove"
538
+ : `${proven.toLocaleString("en-US")} of ${currentRequirements.toLocaleString("en-US")} current requirements fully proven end-to-end`;
539
+ return `<!doctype html>
540
+ <html lang="en">
541
+ <head>
542
+ <meta charset="utf-8">
543
+ <meta name="viewport" content="width=device-width, initial-scale=1">
544
+ <meta name="color-scheme" content="dark light">
545
+ <meta name="theme-color" content="${KIBI_BRAND.deepCarbon}">
546
+ <meta http-equiv="Content-Security-Policy" content="${REPORT_CSP}">
547
+ <link rel="icon" type="image/svg+xml" href="${escapeHtml(faviconHref)}">
548
+ <title>${escapeHtml(identity.title)}</title>
549
+ <style>
550
+ :root {
551
+ color-scheme: dark;
552
+ --bg: #090d18;
553
+ --surface: rgba(20, 27, 45, .86);
554
+ --surface-strong: #151d30;
555
+ --line: rgba(157, 171, 206, .16);
556
+ --text: #f4f7ff;
557
+ --muted: #9ba7c3;
558
+ --violet: #9d84ff;
559
+ --cyan: #5ce1e6;
560
+ --green: #62e6a7;
561
+ --amber: #ffc96b;
562
+ --red: #ff7d90;
563
+ --shadow: 0 30px 80px rgba(0, 0, 0, .35);
564
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
565
+ }
566
+ * { box-sizing: border-box; }
567
+ html { scroll-behavior: smooth; }
568
+ body {
569
+ margin: 0;
570
+ min-width: 320px;
571
+ color: var(--text);
572
+ background:
573
+ radial-gradient(circle at 12% -10%, rgba(93, 74, 190, .32), transparent 34rem),
574
+ radial-gradient(circle at 88% 8%, rgba(33, 153, 166, .19), transparent 30rem),
575
+ var(--bg);
576
+ }
577
+ body::before {
578
+ position: fixed;
579
+ inset: 0;
580
+ z-index: -1;
581
+ content: "";
582
+ opacity: .18;
583
+ background-image: linear-gradient(rgba(255,255,255,.035) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,.035) 1px, transparent 1px);
584
+ background-size: 38px 38px;
585
+ mask-image: linear-gradient(to bottom, black, transparent 75%);
586
+ }
587
+ .shell { width: min(1160px, calc(100% - 40px)); margin: 0 auto; }
588
+ .topbar { display: flex; align-items: center; justify-content: space-between; padding: 34px 0 16px; }
589
+ .brand { display: flex; align-items: center; gap: 12px; font-weight: 900; letter-spacing: .3em; }
590
+ .brand__mark { display: grid; width: 34px; height: 34px; place-items: center; border: 1px solid rgba(157,132,255,.55); border-radius: 11px; color: var(--violet); background: rgba(157,132,255,.12); box-shadow: inset 0 0 18px rgba(157,132,255,.12); }
591
+ .snapshot { color: var(--muted); font: 500 12px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; }
592
+ .hero { display: grid; grid-template-columns: 1.15fr .85fr; gap: 30px; align-items: stretch; padding: 42px 0 26px; }
593
+ .hero__copy, .score-card { border: 1px solid var(--line); border-radius: 28px; background: linear-gradient(145deg, rgba(25,33,54,.92), rgba(13,18,31,.82)); box-shadow: var(--shadow); }
594
+ .hero__copy { padding: clamp(30px, 5vw, 62px); }
595
+ .eyebrow { margin: 0 0 17px; color: var(--cyan); font-size: 12px; font-weight: 800; letter-spacing: .18em; text-transform: uppercase; }
596
+ h1 { max-width: 720px; margin: 0; font-size: clamp(42px, 7vw, 76px); font-weight: 760; letter-spacing: -.055em; line-height: .98; }
597
+ h1 span { display: block; color: var(--muted); font-size: .42em; font-weight: 620; letter-spacing: -.025em; line-height: 1.4; }
598
+ .hero__lede { max-width: 620px; margin: 25px 0 0; color: #bdc6dc; font-size: 17px; line-height: 1.65; }
599
+ .score-card { display: grid; min-height: 340px; padding: 38px; place-items: center; text-align: center; }
600
+ .score-ring { --score: 0%; position: relative; display: grid; width: 220px; aspect-ratio: 1; place-items: center; border-radius: 50%; background: conic-gradient(var(--green) var(--score), rgba(255,255,255,.08) 0); box-shadow: 0 0 60px rgba(98,230,167,.12); }
601
+ .score-ring::before { position: absolute; width: 178px; aspect-ratio: 1; content: ""; border: 1px solid var(--line); border-radius: inherit; background: #111827; }
602
+ .score-ring__value { position: relative; font-size: 52px; font-weight: 820; letter-spacing: -.06em; }
603
+ .score-ring__value span { margin-left: 2px; color: var(--muted); font-size: 22px; }
604
+ .score-card p { position: relative; margin: 13px 0 0; color: var(--muted); font-size: 13px; font-weight: 750; letter-spacing: .12em; text-transform: uppercase; }
605
+ .snapshot-notice { display: flex; gap: 14px; align-items: center; margin: 3px 0 23px; padding: 15px 18px; border: 1px solid rgba(255,201,107,.3); border-radius: 15px; color: #f8dfb2; background: rgba(255,201,107,.08); }
606
+ .snapshot-notice strong { flex: none; color: var(--amber); font-size: 12px; letter-spacing: .08em; text-transform: uppercase; }
607
+ .metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(148px, 1fr)); overflow: hidden; margin: 0 0 62px; border: 1px solid var(--line); border-radius: 20px; background: rgba(18,25,42,.74); box-shadow: var(--shadow); }
608
+ .metric { min-width: 0; padding: 22px 20px; border-right: 1px solid var(--line); border-bottom: 1px solid var(--line); }
609
+ .metric:last-child { border-right: 0; }
610
+ .metric span { display: block; min-height: 32px; color: var(--muted); font-size: 12px; line-height: 1.35; }
611
+ .metric strong { display: block; margin-top: 6px; font-size: 30px; letter-spacing: -.035em; }
612
+ .metric--good strong { color: var(--green); }
613
+ .metric--warn strong { color: var(--amber); }
614
+ .metric--bad strong { color: var(--red); }
615
+ .section-header { display: flex; gap: 24px; align-items: end; justify-content: space-between; margin-bottom: 24px; }
616
+ .section-header h2 { margin: 0; font-size: clamp(29px, 4vw, 42px); letter-spacing: -.04em; }
617
+ .section-header p { max-width: 590px; margin: 8px 0 0; color: var(--muted); line-height: 1.55; }
618
+ .controls { position: sticky; top: 12px; z-index: 4; display: flex; gap: 12px; margin: 0 0 24px; padding: 12px; border: 1px solid var(--line); border-radius: 18px; background: rgba(9,13,24,.86); box-shadow: 0 16px 40px rgba(0,0,0,.25); backdrop-filter: blur(18px); }
619
+ .search { min-width: 180px; flex: 1; padding: 12px 15px; border: 1px solid var(--line); border-radius: 12px; outline: none; color: var(--text); background: rgba(255,255,255,.045); font: inherit; }
620
+ .search:focus { border-color: var(--violet); box-shadow: 0 0 0 3px rgba(157,132,255,.12); }
621
+ .filters { display: flex; gap: 7px; overflow-x: auto; }
622
+ .filter { padding: 10px 13px; border: 1px solid transparent; border-radius: 11px; color: var(--muted); background: transparent; cursor: pointer; font: inherit; font-size: 12px; font-weight: 650; white-space: nowrap; }
623
+ .filter:hover { color: var(--text); background: rgba(255,255,255,.05); }
624
+ .filter[aria-pressed="true"] { border-color: rgba(157,132,255,.38); color: #ddd5ff; background: rgba(157,132,255,.14); }
625
+ .requirements { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; padding-bottom: 80px; }
626
+ .requirement { position: relative; overflow: hidden; padding: 25px; border: 1px solid var(--line); border-radius: 20px; background: linear-gradient(145deg, rgba(22,30,50,.94), rgba(15,21,36,.9)); box-shadow: 0 16px 45px rgba(0,0,0,.2); }
627
+ .requirement::before { position: absolute; inset: 0 auto 0 0; width: 3px; content: ""; background: var(--amber); }
628
+ .requirement--proven::before { background: var(--green); }
629
+ .requirement--unresolved::before { background: var(--red); }
630
+ .requirement[hidden] { display: none; }
631
+ .requirement__header { display: flex; gap: 18px; align-items: start; justify-content: space-between; }
632
+ .requirement__id { margin-bottom: 7px; color: var(--muted); font: 700 11px/1.2 ui-monospace, SFMono-Regular, Menlo, monospace; letter-spacing: .05em; }
633
+ .requirement h3 { margin: 0; font-size: 20px; line-height: 1.25; letter-spacing: -.02em; }
634
+ .proof-badge { flex: none; padding: 7px 9px; border: 1px solid rgba(255,201,107,.25); border-radius: 999px; color: var(--amber); background: rgba(255,201,107,.08); font-size: 10px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; }
635
+ .proof-badge--proven { border-color: rgba(98,230,167,.25); color: var(--green); background: rgba(98,230,167,.08); }
636
+ .proof-badge--unresolved { border-color: rgba(255,125,144,.25); color: var(--red); background: rgba(255,125,144,.08); }
637
+ .stages { display: grid; gap: 9px; margin: 24px 0 0; padding: 0; list-style: none; }
638
+ .stage { display: grid; grid-template-columns: 20px minmax(100px, .7fr) 1.3fr; gap: 8px; align-items: baseline; }
639
+ .stage__icon { display: grid; width: 17px; height: 17px; place-items: center; border-radius: 50%; color: #08130e; background: var(--green); font-size: 11px; font-weight: 900; }
640
+ .stage--warning .stage__icon { color: #241602; background: var(--amber); }
641
+ .stage--failed .stage__icon { color: #24080c; background: var(--red); }
642
+ .stage--muted .stage__icon { color: var(--muted); background: rgba(255,255,255,.08); }
643
+ .stage__label { font-size: 13px; font-weight: 720; }
644
+ .stage__detail { color: var(--muted); font-size: 12px; line-height: 1.45; }
645
+ .contradiction { margin-top: 21px; padding: 16px; border: 1px solid rgba(255,125,144,.24); border-radius: 14px; background: rgba(255,125,144,.07); }
646
+ .contradiction__eyebrow { color: var(--red); font-size: 10px; font-weight: 850; letter-spacing: .1em; text-transform: uppercase; }
647
+ .contradiction__values { display: flex; gap: 11px; align-items: center; margin-top: 9px; font: 750 15px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; }
648
+ .contradiction__values b { color: var(--red); }
649
+ .contradiction p { margin: 8px 0 0; color: #d9a9b1; font-size: 12px; line-height: 1.5; }
650
+ .proof-gaps { margin-top: 18px; border-top: 1px solid var(--line); color: var(--muted); font-size: 12px; }
651
+ .proof-advisories { margin-top: 12px; border-top: 1px solid var(--line); color: var(--muted); font-size: 12px; }
652
+ .proof-gaps summary, .proof-advisories summary { padding-top: 14px; cursor: pointer; font-weight: 700; }
653
+ .proof-gaps ul, .proof-advisories ul { columns: 2; margin: 11px 0 0; padding-left: 18px; }
654
+ .proof-gaps li, .proof-advisories li { margin-bottom: 7px; break-inside: avoid; }
655
+ .empty { display: none; padding: 70px 20px; border: 1px dashed var(--line); border-radius: 20px; color: var(--muted); text-align: center; }
656
+ .empty[data-visible="true"] { display: block; }
657
+ footer { display: flex; gap: 20px; justify-content: space-between; padding: 30px 0 48px; border-top: 1px solid var(--line); color: var(--muted); font-size: 12px; }
658
+ @media (max-width: 960px) {
659
+ .hero { grid-template-columns: 1fr; }
660
+ .score-card { min-height: 290px; }
661
+ .metrics { grid-template-columns: repeat(3, 1fr); }
662
+ .metric:nth-child(3) { border-right: 0; }
663
+ .metric:nth-child(-n+3) { border-bottom: 1px solid var(--line); }
664
+ }
665
+ @media (max-width: 760px) {
666
+ .shell { width: min(100% - 24px, 1160px); }
667
+ .topbar { padding-top: 22px; }
668
+ .hero { padding-top: 20px; }
669
+ .hero__copy, .score-card { border-radius: 22px; }
670
+ .requirements { grid-template-columns: 1fr; }
671
+ .section-header { align-items: start; flex-direction: column; }
672
+ .controls { align-items: stretch; flex-direction: column; }
673
+ .filters { padding-bottom: 2px; }
674
+ footer { flex-direction: column; }
675
+ }
676
+ @media (max-width: 520px) {
677
+ .metrics { grid-template-columns: repeat(2, 1fr); }
678
+ .metric { border-bottom: 1px solid var(--line); }
679
+ .metric:nth-child(2n) { border-right: 0; }
680
+ .metric:nth-last-child(-n+2) { border-bottom: 0; }
681
+ .stage { grid-template-columns: 20px 1fr; }
682
+ .stage__detail { grid-column: 2; }
683
+ .proof-gaps ul { columns: 1; }
684
+ }
685
+ @media print {
686
+ body { background: #fff; color: #111827; }
687
+ body::before, .controls { display: none; }
688
+ .hero__copy, .score-card, .metrics, .requirement { border-color: #d9deea; color: #111827; background: #fff; box-shadow: none; break-inside: avoid; }
689
+ .requirements { display: block; }
690
+ .requirement { margin-bottom: 14px; }
691
+ .hero__lede, .metric span, .stage__detail, .section-header p, footer { color: #59647a; }
692
+ }
693
+
694
+ /* Kibi proof-rail identity. Tokens mirror assets/logo.svg and assets/wordmark.svg. */
695
+ :root {
696
+ --carbon: ${KIBI_BRAND.carbon};
697
+ --deep-carbon: ${KIBI_BRAND.deepCarbon};
698
+ --panel: ${KIBI_BRAND.panel};
699
+ --ice: ${KIBI_BRAND.ice};
700
+ --signal: ${KIBI_BRAND.signal};
701
+ --snow: ${KIBI_BRAND.snow};
702
+ --mist: ${KIBI_BRAND.mist};
703
+ --rail: ${KIBI_BRAND.rail};
704
+ --success: ${KIBI_BRAND.success};
705
+ --warning: ${KIBI_BRAND.warning};
706
+ --danger: ${KIBI_BRAND.danger};
707
+ --line: rgba(162, 211, 244, .16);
708
+ --mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
709
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
710
+ }
711
+ body { color: var(--snow); background: var(--deep-carbon); }
712
+ body::before { position: fixed; inset: 0 0 auto; z-index: -1; height: 4px; content: ""; opacity: 1; background: linear-gradient(90deg, var(--ice) 0 17%, var(--signal) 17% 100%); mask-image: none; }
713
+ .shell { width: min(1180px, calc(100% - 40px)); }
714
+ .topbar { padding: 30px 0 20px; border-bottom: 1px solid var(--line); }
715
+ .brand { gap: 13px; letter-spacing: normal; }
716
+ .brand__logo { width: 42px; height: 42px; flex: none; }
717
+ .brand__wordmark { width: 86px; height: auto; }
718
+ .brand__product { padding-left: 14px; border-left: 1px solid var(--rail); color: var(--mist); font-size: 12px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
719
+ .snapshot { max-width: min(52vw, 420px); overflow: hidden; color: var(--mist); font: 500 11px/1.4 var(--mono); text-align: right; text-overflow: ellipsis; }
720
+ .snapshot a, .source-link, .cta { color: var(--ice); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 2px; }
721
+ .snapshot a:hover, .source-link:hover, .cta:hover { color: var(--snow); }
722
+ .relative-age::before { content: " · "; }
723
+ .relative-age:empty::before { content: none; }
724
+ .overview { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 36px; align-items: end; padding: clamp(38px, 7vw, 76px) 0 32px; }
725
+ .eyebrow { margin: 0 0 12px; color: var(--ice); font: 750 11px/1.4 var(--mono); letter-spacing: .12em; }
726
+ h1 { margin: 0; font-size: clamp(38px, 6vw, 68px); font-weight: 720; letter-spacing: -.052em; line-height: 1; }
727
+ .overview__copy { max-width: 700px; }
728
+ .overview__copy p:last-child { max-width: 660px; margin: 19px 0 0; color: var(--mist); font-size: 16px; line-height: 1.65; }
729
+ .score { min-width: 220px; padding-left: 30px; border-left: 2px solid var(--signal); text-align: right; }
730
+ .score__value { color: var(--snow); font: 760 clamp(62px, 9vw, 104px)/.84 var(--mono); letter-spacing: -.09em; }
731
+ .score__value span { color: var(--ice); font-size: .38em; letter-spacing: -.04em; }
732
+ .score__label { margin-top: 17px; color: var(--ice); font-size: 12px; font-weight: 760; letter-spacing: .12em; text-transform: uppercase; }
733
+ .score__ratio { margin-top: 6px; color: var(--mist); font: 500 12px/1.4 var(--mono); }
734
+ .score__note { max-width: 260px; margin: 10px 0 0 auto; color: var(--mist); font-size: 11px; font-weight: 500; letter-spacing: 0; line-height: 1.45; text-transform: none; }
735
+ .snapshot-notice { margin: 0 0 22px; padding: 14px 16px; border-color: rgba(242,184,75,.4); border-radius: 9px; color: var(--snow); background: rgba(242,184,75,.08); }
736
+ .snapshot-notice strong { color: var(--warning); font: 750 11px/1.4 var(--mono); }
737
+ .proof-path { margin-bottom: 20px; padding: 24px 26px 22px; border: 1px solid var(--line); border-radius: 14px; background: var(--carbon); }
738
+ .proof-path__header { display: flex; gap: 24px; align-items: start; justify-content: space-between; margin-bottom: 25px; }
739
+ .proof-path__header h2 { margin: 0; font-size: 19px; letter-spacing: -.02em; }
740
+ .proof-path__header p { max-width: 510px; margin: 0; color: var(--mist); font-size: 12px; line-height: 1.55; text-align: right; }
741
+ .proof-rail { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); margin: 0; padding: 0; list-style: none; }
742
+ .proof-rail > li { min-width: 0; }
743
+ .proof-gate { position: relative; display: block; width: 100%; min-width: 0; margin: 0; padding: 25px 18px 0 0; border: 0; border-top: 2px solid var(--signal); border-radius: 0; color: inherit; background: transparent; font: inherit; text-align: left; cursor: pointer; }
744
+ .proof-gate:last-child, .proof-rail > li:last-child .proof-gate { padding-right: 0; }
745
+ .proof-gate:focus-visible { outline: 2px solid var(--ice); outline-offset: 4px; }
746
+ .proof-gate[aria-pressed="true"] { background: rgba(62, 142, 214, .1); }
747
+ .proof-gate__node { position: absolute; top: -10px; left: 0; display: grid; width: 19px; height: 19px; place-items: center; border: 2px solid var(--ice); border-radius: 50%; color: var(--deep-carbon); background: var(--ice); font: 800 9px/1 var(--mono); }
748
+ .proof-gate--blocked { border-top-color: var(--rail); }
749
+ .proof-gate--blocked .proof-gate__node { border-color: var(--danger); color: var(--danger); background: var(--carbon); }
750
+ .proof-gate__count { font: 750 28px/1 var(--mono); letter-spacing: -.05em; }
751
+ .proof-gate__label { margin-top: 8px; font-size: 13px; font-weight: 720; }
752
+ .proof-gate__drop { min-height: 17px; margin-top: 5px; color: var(--warning); font: 650 10px/1.4 var(--mono); }
753
+ .proof-gate p { margin: 7px 0 0; color: var(--mist); font-size: 11px; line-height: 1.45; }
754
+ .metrics { margin: 0 0 62px; border-color: var(--line); border-radius: 12px; background: var(--panel); box-shadow: none; }
755
+ .metric { position: relative; padding: 18px 17px; border-color: var(--line); }
756
+ .metric::before { position: absolute; top: 0; left: 17px; width: 28px; height: 2px; content: ""; background: var(--signal); }
757
+ .metric span { min-height: 31px; color: var(--mist); font-size: 11px; }
758
+ .metric strong { margin-top: 4px; font: 720 26px/1 var(--mono); letter-spacing: -.04em; }
759
+ .metric--good strong { color: var(--success); }
760
+ .metric--warn strong { color: var(--warning); }
761
+ .metric--bad strong { color: var(--danger); }
762
+ .section-header p { color: var(--mist); }
763
+ .controls { margin-bottom: 18px; padding: 10px; border-color: var(--line); border-radius: 12px; background: rgba(17,19,24,.94); box-shadow: none; backdrop-filter: blur(14px); }
764
+ .search { padding: 11px 13px; border-color: var(--rail); border-radius: 8px; color: var(--snow); background: var(--carbon); }
765
+ .search:focus { border-color: var(--ice); box-shadow: 0 0 0 3px rgba(162,211,244,.1); }
766
+ .filters { gap: 6px; }
767
+ .filter { padding: 9px 11px; border-radius: 7px; color: var(--mist); font: 650 11px/1.4 var(--mono); }
768
+ .filter:hover { color: var(--snow); background: rgba(162,211,244,.06); }
769
+ .filter[aria-pressed="true"] { border-color: rgba(162,211,244,.35); color: var(--ice); background: rgba(62,142,214,.13); }
770
+ .filter:focus-visible { outline: 2px solid var(--ice); outline-offset: 2px; }
771
+ .cta:focus-visible, .source-link:focus-visible, .snapshot a:focus-visible { outline: 2px solid var(--ice); outline-offset: 2px; }
772
+ .requirements { grid-template-columns: 1fr; gap: 13px; }
773
+ .requirement { padding: 22px 24px 20px; border-color: var(--line); border-radius: 12px; background: var(--panel); box-shadow: none; }
774
+ .requirement::before { background: var(--warning); }
775
+ .requirement--proven::before { background: var(--success); }
776
+ .requirement--unresolved::before { background: var(--danger); }
777
+ .requirement__id { color: var(--ice); font: 700 10px/1.2 var(--mono); letter-spacing: .07em; }
778
+ .requirement h3 { font-size: 18px; line-height: 1.3; }
779
+ .proof-badge { padding: 6px 8px; border-color: rgba(242,184,75,.3); border-radius: 6px; color: var(--warning); background: rgba(242,184,75,.07); font: 800 9px/1.2 var(--mono); }
780
+ .proof-badge--proven { border-color: rgba(99,201,154,.3); color: var(--success); background: rgba(99,201,154,.07); }
781
+ .proof-badge--unresolved { border-color: rgba(240,113,120,.3); color: var(--danger); background: rgba(240,113,120,.07); }
782
+ .stages { grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 0; }
783
+ .stage { position: relative; display: block; min-width: 0; padding: 20px 13px 0 0; border-top: 1px solid var(--rail); }
784
+ .stage:last-child { padding-right: 0; }
785
+ .stage__icon { position: absolute; top: -8px; left: 0; width: 16px; height: 16px; border: 1px solid var(--success); color: var(--deep-carbon); background: var(--success); font: 900 10px/1 var(--mono); }
786
+ .stage--warning .stage__icon { border-color: var(--warning); color: var(--warning); background: var(--panel); }
787
+ .stage--failed .stage__icon { border-color: var(--danger); color: var(--danger); background: var(--panel); }
788
+ .stage--muted .stage__icon { border-color: var(--rail); color: var(--mist); background: var(--panel); }
789
+ .stage__label { display: block; font-size: 12px; }
790
+ .stage__detail { display: block; margin-top: 5px; color: var(--mist); font-size: 11px; }
791
+ .contradiction { border-color: rgba(240,113,120,.32); border-radius: 9px; background: rgba(240,113,120,.07); }
792
+ .contradiction__eyebrow, .contradiction__values b { color: var(--danger); }
793
+ .contradiction p, .proof-gaps, .proof-advisories { color: var(--mist); }
794
+ .proof-gaps, .proof-advisories { border-color: var(--line); }
795
+ .proof-gaps ul, .proof-advisories ul { columns: 3; }
796
+ .empty { border-color: var(--rail); border-radius: 12px; color: var(--mist); }
797
+ footer { border-color: var(--line); color: var(--mist); font: 500 11px/1.5 var(--mono); }
798
+ .filter__count { margin-left: 6px; color: var(--ice); }
799
+ .requirement h3 .source-link { color: inherit; }
800
+ @media (max-width: 960px) {
801
+ .proof-rail { grid-template-columns: repeat(5, 180px); overflow-x: auto; padding-top: 8px; }
802
+ .snapshot { max-width: 100%; }
803
+ }
804
+ @media (max-width: 760px) {
805
+ .shell { width: min(100% - 24px, 1180px); }
806
+ .topbar { align-items: start; flex-wrap: wrap; gap: 12px; }
807
+ .snapshot { max-width: 100%; text-align: left; }
808
+ .overview { grid-template-columns: 1fr; gap: 28px; padding-top: 38px; }
809
+ .score { min-width: 0; padding: 20px 0 0; border-top: 2px solid var(--signal); border-left: 0; text-align: left; }
810
+ .score__value { font-size: 66px; }
811
+ .score__note { margin-left: 0; }
812
+ .proof-path__header { align-items: start; flex-direction: column; }
813
+ .proof-path__header p { text-align: left; }
814
+ .stages { grid-template-columns: 1fr; }
815
+ .stage { min-height: 66px; margin-left: 8px; padding: 0 0 18px 30px; border-top: 0; border-left: 1px solid var(--rail); }
816
+ .stage__icon { top: 0; left: -8px; }
817
+ .proof-gaps ul, .proof-advisories ul { columns: 2; }
818
+ }
819
+ @media (max-width: 520px) {
820
+ .brand__product { display: none; }
821
+ .proof-path { padding-inline: 18px; }
822
+ .proof-gaps ul, .proof-advisories ul { columns: 1; }
823
+ }
824
+ @media print {
825
+ :root { color-scheme: light; }
826
+ body { color: #17202a; background: #fff; }
827
+ .topbar, .proof-path, .metrics, .requirement { border-color: #cbd5dc; color: #17202a; background: #fff; }
828
+ .proof-gate, .stage { border-color: #7b8b96; background: transparent; }
829
+ .proof-gate p, .proof-path__header p, .metric span, .stage__detail, .section-header p, footer, .score__note { color: #4e606c; }
830
+ .source-link, .cta, .snapshot a { color: inherit; }
831
+ }
832
+ </style>
833
+ </head>
834
+ <body>
835
+ <div class="shell">
836
+ <header class="topbar">
837
+ <div class="brand">
838
+ ${renderKibiLogo("brand__logo")}
839
+ ${renderKibiWordmark("brand__wordmark")}
840
+ <span class="brand__product">Requirement health</span>
841
+ </div>
842
+ <div class="snapshot">${identity.snapshotHtml}</div>
843
+ </header>
844
+ <main>
845
+ <section class="overview">
846
+ <div class="overview__copy">
847
+ <p class="eyebrow">Requirement health · ${escapeHtml(branch)}</p>
848
+ <h1>Intent to proof,<br>without the gaps.</h1>
849
+ <p>Kibi compiles product intent into an inspectable chain of semantics, scenarios, implementation ownership, end-to-end tests, and fresh evidence.</p>
850
+ </div>
851
+ <div class="score" aria-label="${proofPercent}% strict proof coverage, ${proven} of ${currentRequirements} current requirements fully proven end-to-end">
852
+ <div class="score__value">${proofPercent}<span>%</span></div>
853
+ <div class="score__label">${escapeHtml(scoreLabel)}</div>
854
+ <div class="score__ratio">${escapeHtml(scoreRatio)}</div>
855
+ ${currentRequirements === 0 ? "" : `<p class="score__note">Kibi only counts a requirement when every required proof gate passes.</p>`}
856
+ </div>
857
+ </section>
858
+ ${reportNotice(input)}
859
+ <section class="proof-path" aria-labelledby="proof-path-title">
860
+ <div class="proof-path__header">
861
+ <div><p class="eyebrow">Intent → proof</p><h2 id="proof-path-title">Where proof stops</h2></div>
862
+ <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>
863
+ </div>
864
+ <ol class="proof-rail" aria-label="Filter requirements by earliest unmet proof gate">${gates.map(renderProofGate).join("")}</ol>
865
+ </section>
866
+ <section class="metrics" aria-label="Requirement health summary">
867
+ ${metric("Requirements", currentRequirements)}
868
+ ${metric("Strict proof coverage", proven, "good")}
869
+ ${metric("Missing scenarios", missingScenarios, missingScenarios ? "warn" : "")}
870
+ ${metric("Stale E2E evidence", staleEvidence, staleEvidence ? "warn" : "")}
871
+ ${metric("Contradictions", contradictions.length, contradictions.length ? "bad" : "")}
872
+ ${metric("Unmapped production symbols", unmappedProductionSymbols, unmappedProductionSymbols ? "bad" : "")}
873
+ ${metric("Requirements without implementation", withoutImplementation, withoutImplementation ? "warn" : "")}
874
+ </section>
875
+ <section>
876
+ <div class="section-header">
877
+ <div><p class="eyebrow">Proof ledger</p><h2>Requirements</h2></div>
878
+ <p>Each row shows independent proof stages. Missing knowledge remains visible instead of being inferred as success.</p>
879
+ </div>
880
+ <div class="controls">
881
+ <input class="search" id="search" type="search" placeholder="Search requirements" aria-label="Search requirements">
882
+ <div class="filters" role="group" aria-label="Filter requirements">
883
+ ${renderFilters(filterCounts)}
884
+ </div>
885
+ </div>
886
+ <div class="requirements" id="requirements">${currentRows.map((row) => renderRequirement(row, repository)).join("")}</div>
887
+ <div class="empty" id="empty" aria-live="polite">No requirements match this view.</div>
888
+ </section>
889
+ </main>
890
+ <footer>
891
+ <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>
892
+ <span>Generated by Kibi · <a class="cta" href="${KIBI_GETTING_STARTED_URL}">Add requirement proof to your repo →</a></span>
893
+ </footer>
894
+ </div>
895
+ <script>
896
+ (() => {
897
+ const search = document.querySelector("#search");
898
+ const cards = [...document.querySelectorAll(".requirement")];
899
+ const filters = [...document.querySelectorAll(".filter")];
900
+ const gates = [...document.querySelectorAll(".proof-gate")];
901
+ const empty = document.querySelector("#empty");
902
+ let activeFilter = "all";
903
+ let activeGate = "all";
904
+ const formatRelativeAge = (fromMs, nowMs) => {
905
+ if (!Number.isFinite(fromMs) || !Number.isFinite(nowMs)) return "timestamp unavailable";
906
+ const deltaSeconds = Math.floor((nowMs - fromMs) / 1000);
907
+ if (deltaSeconds < 0) return "in the future";
908
+ if (deltaSeconds < 60) return "just now";
909
+ const minutes = Math.floor(deltaSeconds / 60);
910
+ if (minutes < 60) return minutes + "m ago";
911
+ const hours = Math.floor(deltaSeconds / 3600);
912
+ const remainingMinutes = minutes % 60;
913
+ if (hours < 24) return remainingMinutes === 0 ? hours + "h ago" : hours + "h " + remainingMinutes + "m ago";
914
+ const days = Math.floor(deltaSeconds / 86400);
915
+ const remainingHours = hours % 24;
916
+ if (days < 7 && remainingHours > 0) return days + "d " + remainingHours + "h ago";
917
+ return days + "d ago";
918
+ };
919
+ const refreshAges = (now = Date.now()) => {
920
+ for (const node of document.querySelectorAll("[data-relative-from]")) {
921
+ const from = Date.parse(node.getAttribute("data-relative-from") || "");
922
+ node.textContent = formatRelativeAge(from, now);
923
+ }
924
+ };
925
+ const apply = () => {
926
+ const query = (search.value || "").trim().toLocaleLowerCase();
927
+ let visible = 0;
928
+ for (const card of cards) {
929
+ const states = (card.dataset.state || "").split(" ").filter(Boolean);
930
+ const gate = card.dataset.gate || "";
931
+ const matchesState = activeFilter === "all" || states.includes(activeFilter);
932
+ const matchesGate = activeGate === "all" || gate === activeGate;
933
+ const matchesQuery = !query || (card.textContent || "").toLocaleLowerCase().includes(query);
934
+ card.hidden = !(matchesState && matchesGate && matchesQuery);
935
+ if (!card.hidden) visible += 1;
936
+ }
937
+ empty.dataset.visible = String(visible === 0);
938
+ };
939
+ search.addEventListener("input", apply);
940
+ for (const filter of filters) {
941
+ filter.addEventListener("click", () => {
942
+ activeFilter = filter.dataset.filter || "all";
943
+ for (const candidate of filters) candidate.setAttribute("aria-pressed", String(candidate === filter));
944
+ apply();
945
+ });
946
+ }
947
+ for (const gate of gates) {
948
+ gate.addEventListener("click", () => {
949
+ const selected = gate.dataset.gate || "all";
950
+ activeGate = activeGate === selected ? "all" : selected;
951
+ for (const candidate of gates) {
952
+ candidate.setAttribute("aria-pressed", String(candidate.dataset.gate === activeGate));
953
+ }
954
+ apply();
955
+ });
956
+ }
957
+ refreshAges();
958
+ setInterval(refreshAges, 30000);
959
+ })();
960
+ </script>
961
+ </body>
962
+ </html>`;
963
+ }