@nebulacomponents/citable 1.12.0 → 1.13.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 (397) hide show
  1. package/CHANGELOG.md +163 -0
  2. package/README.md +23 -1
  3. package/dist/universal/.agents/skills/citable/SKILL.md +12 -1
  4. package/dist/universal/.agents/skills/citable/VERSION +1 -1
  5. package/dist/universal/.agents/skills/citable/commands/README.md +2 -1
  6. package/dist/universal/.agents/skills/citable/commands/artifact-interchange.md +28 -0
  7. package/dist/universal/.agents/skills/citable/commands/field-validation.md +71 -0
  8. package/dist/universal/.agents/skills/citable/commands/observe-and-act.md +5 -0
  9. package/dist/universal/.agents/skills/citable/manifest.json +30 -10
  10. package/dist/universal/.agents/skills/citable/references/aeo-geo-validation.md +1 -1
  11. package/dist/universal/.agents/skills/citable/references/capability-boundaries.md +1 -0
  12. package/dist/universal/.agents/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
  13. package/dist/universal/.agents/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
  14. package/dist/universal/.agents/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
  15. package/dist/universal/.agents/skills/citable/schemas/artifact-interchange.schema.json +58 -0
  16. package/dist/universal/.agents/skills/citable/schemas/assumption.schema.json +119 -0
  17. package/dist/universal/.agents/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
  18. package/dist/universal/.agents/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
  19. package/dist/universal/.agents/skills/citable/schemas/customer-outcome.schema.json +119 -0
  20. package/dist/universal/.agents/skills/citable/schemas/decision.schema.json +154 -0
  21. package/dist/universal/.agents/skills/citable/schemas/deployment-receipt.schema.json +51 -0
  22. package/dist/universal/.agents/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
  23. package/dist/universal/.agents/skills/citable/schemas/initiative.schema.json +185 -0
  24. package/dist/universal/.agents/skills/citable/schemas/kpi.schema.json +108 -0
  25. package/dist/universal/.agents/skills/citable/schemas/observation.schema.json +1 -1
  26. package/dist/universal/.agents/skills/citable/schemas/release-manifest.schema.json +74 -0
  27. package/dist/universal/.agents/skills/citable/schemas/release-state.schema.json +40 -0
  28. package/dist/universal/.agents/skills/citable/schemas/risk.schema.json +172 -0
  29. package/dist/universal/.agents/skills/citable/schemas/scenario.schema.json +165 -0
  30. package/dist/universal/.agents/skills/citable/schemas/variance.schema.json +112 -0
  31. package/dist/universal/.claude/skills/citable/SKILL.md +12 -1
  32. package/dist/universal/.claude/skills/citable/VERSION +1 -1
  33. package/dist/universal/.claude/skills/citable/commands/README.md +2 -1
  34. package/dist/universal/.claude/skills/citable/commands/artifact-interchange.md +28 -0
  35. package/dist/universal/.claude/skills/citable/commands/field-validation.md +71 -0
  36. package/dist/universal/.claude/skills/citable/commands/observe-and-act.md +5 -0
  37. package/dist/universal/.claude/skills/citable/manifest.json +30 -10
  38. package/dist/universal/.claude/skills/citable/references/aeo-geo-validation.md +1 -1
  39. package/dist/universal/.claude/skills/citable/references/capability-boundaries.md +1 -0
  40. package/dist/universal/.claude/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
  41. package/dist/universal/.claude/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
  42. package/dist/universal/.claude/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
  43. package/dist/universal/.claude/skills/citable/schemas/artifact-interchange.schema.json +58 -0
  44. package/dist/universal/.claude/skills/citable/schemas/assumption.schema.json +119 -0
  45. package/dist/universal/.claude/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
  46. package/dist/universal/.claude/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
  47. package/dist/universal/.claude/skills/citable/schemas/customer-outcome.schema.json +119 -0
  48. package/dist/universal/.claude/skills/citable/schemas/decision.schema.json +154 -0
  49. package/dist/universal/.claude/skills/citable/schemas/deployment-receipt.schema.json +51 -0
  50. package/dist/universal/.claude/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
  51. package/dist/universal/.claude/skills/citable/schemas/initiative.schema.json +185 -0
  52. package/dist/universal/.claude/skills/citable/schemas/kpi.schema.json +108 -0
  53. package/dist/universal/.claude/skills/citable/schemas/observation.schema.json +1 -1
  54. package/dist/universal/.claude/skills/citable/schemas/release-manifest.schema.json +74 -0
  55. package/dist/universal/.claude/skills/citable/schemas/release-state.schema.json +40 -0
  56. package/dist/universal/.claude/skills/citable/schemas/risk.schema.json +172 -0
  57. package/dist/universal/.claude/skills/citable/schemas/scenario.schema.json +165 -0
  58. package/dist/universal/.claude/skills/citable/schemas/variance.schema.json +112 -0
  59. package/dist/universal/.cursor/skills/citable/SKILL.md +12 -1
  60. package/dist/universal/.cursor/skills/citable/VERSION +1 -1
  61. package/dist/universal/.cursor/skills/citable/commands/README.md +2 -1
  62. package/dist/universal/.cursor/skills/citable/commands/artifact-interchange.md +28 -0
  63. package/dist/universal/.cursor/skills/citable/commands/field-validation.md +71 -0
  64. package/dist/universal/.cursor/skills/citable/commands/observe-and-act.md +5 -0
  65. package/dist/universal/.cursor/skills/citable/manifest.json +30 -10
  66. package/dist/universal/.cursor/skills/citable/references/aeo-geo-validation.md +1 -1
  67. package/dist/universal/.cursor/skills/citable/references/capability-boundaries.md +1 -0
  68. package/dist/universal/.cursor/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
  69. package/dist/universal/.cursor/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
  70. package/dist/universal/.cursor/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
  71. package/dist/universal/.cursor/skills/citable/schemas/artifact-interchange.schema.json +58 -0
  72. package/dist/universal/.cursor/skills/citable/schemas/assumption.schema.json +119 -0
  73. package/dist/universal/.cursor/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
  74. package/dist/universal/.cursor/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
  75. package/dist/universal/.cursor/skills/citable/schemas/customer-outcome.schema.json +119 -0
  76. package/dist/universal/.cursor/skills/citable/schemas/decision.schema.json +154 -0
  77. package/dist/universal/.cursor/skills/citable/schemas/deployment-receipt.schema.json +51 -0
  78. package/dist/universal/.cursor/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
  79. package/dist/universal/.cursor/skills/citable/schemas/initiative.schema.json +185 -0
  80. package/dist/universal/.cursor/skills/citable/schemas/kpi.schema.json +108 -0
  81. package/dist/universal/.cursor/skills/citable/schemas/observation.schema.json +1 -1
  82. package/dist/universal/.cursor/skills/citable/schemas/release-manifest.schema.json +74 -0
  83. package/dist/universal/.cursor/skills/citable/schemas/release-state.schema.json +40 -0
  84. package/dist/universal/.cursor/skills/citable/schemas/risk.schema.json +172 -0
  85. package/dist/universal/.cursor/skills/citable/schemas/scenario.schema.json +165 -0
  86. package/dist/universal/.cursor/skills/citable/schemas/variance.schema.json +112 -0
  87. package/dist/universal/.gemini/skills/citable/SKILL.md +12 -1
  88. package/dist/universal/.gemini/skills/citable/VERSION +1 -1
  89. package/dist/universal/.gemini/skills/citable/commands/README.md +2 -1
  90. package/dist/universal/.gemini/skills/citable/commands/artifact-interchange.md +28 -0
  91. package/dist/universal/.gemini/skills/citable/commands/field-validation.md +71 -0
  92. package/dist/universal/.gemini/skills/citable/commands/observe-and-act.md +5 -0
  93. package/dist/universal/.gemini/skills/citable/manifest.json +30 -10
  94. package/dist/universal/.gemini/skills/citable/references/aeo-geo-validation.md +1 -1
  95. package/dist/universal/.gemini/skills/citable/references/capability-boundaries.md +1 -0
  96. package/dist/universal/.gemini/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
  97. package/dist/universal/.gemini/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
  98. package/dist/universal/.gemini/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
  99. package/dist/universal/.gemini/skills/citable/schemas/artifact-interchange.schema.json +58 -0
  100. package/dist/universal/.gemini/skills/citable/schemas/assumption.schema.json +119 -0
  101. package/dist/universal/.gemini/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
  102. package/dist/universal/.gemini/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
  103. package/dist/universal/.gemini/skills/citable/schemas/customer-outcome.schema.json +119 -0
  104. package/dist/universal/.gemini/skills/citable/schemas/decision.schema.json +154 -0
  105. package/dist/universal/.gemini/skills/citable/schemas/deployment-receipt.schema.json +51 -0
  106. package/dist/universal/.gemini/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
  107. package/dist/universal/.gemini/skills/citable/schemas/initiative.schema.json +185 -0
  108. package/dist/universal/.gemini/skills/citable/schemas/kpi.schema.json +108 -0
  109. package/dist/universal/.gemini/skills/citable/schemas/observation.schema.json +1 -1
  110. package/dist/universal/.gemini/skills/citable/schemas/release-manifest.schema.json +74 -0
  111. package/dist/universal/.gemini/skills/citable/schemas/release-state.schema.json +40 -0
  112. package/dist/universal/.gemini/skills/citable/schemas/risk.schema.json +172 -0
  113. package/dist/universal/.gemini/skills/citable/schemas/scenario.schema.json +165 -0
  114. package/dist/universal/.gemini/skills/citable/schemas/variance.schema.json +112 -0
  115. package/dist/universal/.github/skills/citable/SKILL.md +12 -1
  116. package/dist/universal/.github/skills/citable/VERSION +1 -1
  117. package/dist/universal/.github/skills/citable/commands/README.md +2 -1
  118. package/dist/universal/.github/skills/citable/commands/artifact-interchange.md +28 -0
  119. package/dist/universal/.github/skills/citable/commands/field-validation.md +71 -0
  120. package/dist/universal/.github/skills/citable/commands/observe-and-act.md +5 -0
  121. package/dist/universal/.github/skills/citable/manifest.json +30 -10
  122. package/dist/universal/.github/skills/citable/references/aeo-geo-validation.md +1 -1
  123. package/dist/universal/.github/skills/citable/references/capability-boundaries.md +1 -0
  124. package/dist/universal/.github/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
  125. package/dist/universal/.github/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
  126. package/dist/universal/.github/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
  127. package/dist/universal/.github/skills/citable/schemas/artifact-interchange.schema.json +58 -0
  128. package/dist/universal/.github/skills/citable/schemas/assumption.schema.json +119 -0
  129. package/dist/universal/.github/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
  130. package/dist/universal/.github/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
  131. package/dist/universal/.github/skills/citable/schemas/customer-outcome.schema.json +119 -0
  132. package/dist/universal/.github/skills/citable/schemas/decision.schema.json +154 -0
  133. package/dist/universal/.github/skills/citable/schemas/deployment-receipt.schema.json +51 -0
  134. package/dist/universal/.github/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
  135. package/dist/universal/.github/skills/citable/schemas/initiative.schema.json +185 -0
  136. package/dist/universal/.github/skills/citable/schemas/kpi.schema.json +108 -0
  137. package/dist/universal/.github/skills/citable/schemas/observation.schema.json +1 -1
  138. package/dist/universal/.github/skills/citable/schemas/release-manifest.schema.json +74 -0
  139. package/dist/universal/.github/skills/citable/schemas/release-state.schema.json +40 -0
  140. package/dist/universal/.github/skills/citable/schemas/risk.schema.json +172 -0
  141. package/dist/universal/.github/skills/citable/schemas/scenario.schema.json +165 -0
  142. package/dist/universal/.github/skills/citable/schemas/variance.schema.json +112 -0
  143. package/dist/universal/.kiro/skills/citable/SKILL.md +12 -1
  144. package/dist/universal/.kiro/skills/citable/VERSION +1 -1
  145. package/dist/universal/.kiro/skills/citable/commands/README.md +2 -1
  146. package/dist/universal/.kiro/skills/citable/commands/artifact-interchange.md +28 -0
  147. package/dist/universal/.kiro/skills/citable/commands/field-validation.md +71 -0
  148. package/dist/universal/.kiro/skills/citable/commands/observe-and-act.md +5 -0
  149. package/dist/universal/.kiro/skills/citable/manifest.json +30 -10
  150. package/dist/universal/.kiro/skills/citable/references/aeo-geo-validation.md +1 -1
  151. package/dist/universal/.kiro/skills/citable/references/capability-boundaries.md +1 -0
  152. package/dist/universal/.kiro/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
  153. package/dist/universal/.kiro/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
  154. package/dist/universal/.kiro/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
  155. package/dist/universal/.kiro/skills/citable/schemas/artifact-interchange.schema.json +58 -0
  156. package/dist/universal/.kiro/skills/citable/schemas/assumption.schema.json +119 -0
  157. package/dist/universal/.kiro/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
  158. package/dist/universal/.kiro/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
  159. package/dist/universal/.kiro/skills/citable/schemas/customer-outcome.schema.json +119 -0
  160. package/dist/universal/.kiro/skills/citable/schemas/decision.schema.json +154 -0
  161. package/dist/universal/.kiro/skills/citable/schemas/deployment-receipt.schema.json +51 -0
  162. package/dist/universal/.kiro/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
  163. package/dist/universal/.kiro/skills/citable/schemas/initiative.schema.json +185 -0
  164. package/dist/universal/.kiro/skills/citable/schemas/kpi.schema.json +108 -0
  165. package/dist/universal/.kiro/skills/citable/schemas/observation.schema.json +1 -1
  166. package/dist/universal/.kiro/skills/citable/schemas/release-manifest.schema.json +74 -0
  167. package/dist/universal/.kiro/skills/citable/schemas/release-state.schema.json +40 -0
  168. package/dist/universal/.kiro/skills/citable/schemas/risk.schema.json +172 -0
  169. package/dist/universal/.kiro/skills/citable/schemas/scenario.schema.json +165 -0
  170. package/dist/universal/.kiro/skills/citable/schemas/variance.schema.json +112 -0
  171. package/dist/universal/.opencode/skills/citable/SKILL.md +12 -1
  172. package/dist/universal/.opencode/skills/citable/VERSION +1 -1
  173. package/dist/universal/.opencode/skills/citable/commands/README.md +2 -1
  174. package/dist/universal/.opencode/skills/citable/commands/artifact-interchange.md +28 -0
  175. package/dist/universal/.opencode/skills/citable/commands/field-validation.md +71 -0
  176. package/dist/universal/.opencode/skills/citable/commands/observe-and-act.md +5 -0
  177. package/dist/universal/.opencode/skills/citable/manifest.json +30 -10
  178. package/dist/universal/.opencode/skills/citable/references/aeo-geo-validation.md +1 -1
  179. package/dist/universal/.opencode/skills/citable/references/capability-boundaries.md +1 -0
  180. package/dist/universal/.opencode/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
  181. package/dist/universal/.opencode/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
  182. package/dist/universal/.opencode/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
  183. package/dist/universal/.opencode/skills/citable/schemas/artifact-interchange.schema.json +58 -0
  184. package/dist/universal/.opencode/skills/citable/schemas/assumption.schema.json +119 -0
  185. package/dist/universal/.opencode/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
  186. package/dist/universal/.opencode/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
  187. package/dist/universal/.opencode/skills/citable/schemas/customer-outcome.schema.json +119 -0
  188. package/dist/universal/.opencode/skills/citable/schemas/decision.schema.json +154 -0
  189. package/dist/universal/.opencode/skills/citable/schemas/deployment-receipt.schema.json +51 -0
  190. package/dist/universal/.opencode/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
  191. package/dist/universal/.opencode/skills/citable/schemas/initiative.schema.json +185 -0
  192. package/dist/universal/.opencode/skills/citable/schemas/kpi.schema.json +108 -0
  193. package/dist/universal/.opencode/skills/citable/schemas/observation.schema.json +1 -1
  194. package/dist/universal/.opencode/skills/citable/schemas/release-manifest.schema.json +74 -0
  195. package/dist/universal/.opencode/skills/citable/schemas/release-state.schema.json +40 -0
  196. package/dist/universal/.opencode/skills/citable/schemas/risk.schema.json +172 -0
  197. package/dist/universal/.opencode/skills/citable/schemas/scenario.schema.json +165 -0
  198. package/dist/universal/.opencode/skills/citable/schemas/variance.schema.json +112 -0
  199. package/dist/universal/.pi/agent/skills/citable/SKILL.md +12 -1
  200. package/dist/universal/.pi/agent/skills/citable/VERSION +1 -1
  201. package/dist/universal/.pi/agent/skills/citable/commands/README.md +2 -1
  202. package/dist/universal/.pi/agent/skills/citable/commands/artifact-interchange.md +28 -0
  203. package/dist/universal/.pi/agent/skills/citable/commands/field-validation.md +71 -0
  204. package/dist/universal/.pi/agent/skills/citable/commands/observe-and-act.md +5 -0
  205. package/dist/universal/.pi/agent/skills/citable/manifest.json +30 -10
  206. package/dist/universal/.pi/agent/skills/citable/references/aeo-geo-validation.md +1 -1
  207. package/dist/universal/.pi/agent/skills/citable/references/capability-boundaries.md +1 -0
  208. package/dist/universal/.pi/agent/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
  209. package/dist/universal/.pi/agent/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
  210. package/dist/universal/.pi/agent/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
  211. package/dist/universal/.pi/agent/skills/citable/schemas/artifact-interchange.schema.json +58 -0
  212. package/dist/universal/.pi/agent/skills/citable/schemas/assumption.schema.json +119 -0
  213. package/dist/universal/.pi/agent/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
  214. package/dist/universal/.pi/agent/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
  215. package/dist/universal/.pi/agent/skills/citable/schemas/customer-outcome.schema.json +119 -0
  216. package/dist/universal/.pi/agent/skills/citable/schemas/decision.schema.json +154 -0
  217. package/dist/universal/.pi/agent/skills/citable/schemas/deployment-receipt.schema.json +51 -0
  218. package/dist/universal/.pi/agent/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
  219. package/dist/universal/.pi/agent/skills/citable/schemas/initiative.schema.json +185 -0
  220. package/dist/universal/.pi/agent/skills/citable/schemas/kpi.schema.json +108 -0
  221. package/dist/universal/.pi/agent/skills/citable/schemas/observation.schema.json +1 -1
  222. package/dist/universal/.pi/agent/skills/citable/schemas/release-manifest.schema.json +74 -0
  223. package/dist/universal/.pi/agent/skills/citable/schemas/release-state.schema.json +40 -0
  224. package/dist/universal/.pi/agent/skills/citable/schemas/risk.schema.json +172 -0
  225. package/dist/universal/.pi/agent/skills/citable/schemas/scenario.schema.json +165 -0
  226. package/dist/universal/.pi/agent/skills/citable/schemas/variance.schema.json +112 -0
  227. package/dist/universal/.qoder/skills/citable/SKILL.md +12 -1
  228. package/dist/universal/.qoder/skills/citable/VERSION +1 -1
  229. package/dist/universal/.qoder/skills/citable/commands/README.md +2 -1
  230. package/dist/universal/.qoder/skills/citable/commands/artifact-interchange.md +28 -0
  231. package/dist/universal/.qoder/skills/citable/commands/field-validation.md +71 -0
  232. package/dist/universal/.qoder/skills/citable/commands/observe-and-act.md +5 -0
  233. package/dist/universal/.qoder/skills/citable/manifest.json +30 -10
  234. package/dist/universal/.qoder/skills/citable/references/aeo-geo-validation.md +1 -1
  235. package/dist/universal/.qoder/skills/citable/references/capability-boundaries.md +1 -0
  236. package/dist/universal/.qoder/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
  237. package/dist/universal/.qoder/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
  238. package/dist/universal/.qoder/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
  239. package/dist/universal/.qoder/skills/citable/schemas/artifact-interchange.schema.json +58 -0
  240. package/dist/universal/.qoder/skills/citable/schemas/assumption.schema.json +119 -0
  241. package/dist/universal/.qoder/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
  242. package/dist/universal/.qoder/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
  243. package/dist/universal/.qoder/skills/citable/schemas/customer-outcome.schema.json +119 -0
  244. package/dist/universal/.qoder/skills/citable/schemas/decision.schema.json +154 -0
  245. package/dist/universal/.qoder/skills/citable/schemas/deployment-receipt.schema.json +51 -0
  246. package/dist/universal/.qoder/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
  247. package/dist/universal/.qoder/skills/citable/schemas/initiative.schema.json +185 -0
  248. package/dist/universal/.qoder/skills/citable/schemas/kpi.schema.json +108 -0
  249. package/dist/universal/.qoder/skills/citable/schemas/observation.schema.json +1 -1
  250. package/dist/universal/.qoder/skills/citable/schemas/release-manifest.schema.json +74 -0
  251. package/dist/universal/.qoder/skills/citable/schemas/release-state.schema.json +40 -0
  252. package/dist/universal/.qoder/skills/citable/schemas/risk.schema.json +172 -0
  253. package/dist/universal/.qoder/skills/citable/schemas/scenario.schema.json +165 -0
  254. package/dist/universal/.qoder/skills/citable/schemas/variance.schema.json +112 -0
  255. package/dist/universal/.rovodev/skills/citable/SKILL.md +12 -1
  256. package/dist/universal/.rovodev/skills/citable/VERSION +1 -1
  257. package/dist/universal/.rovodev/skills/citable/commands/README.md +2 -1
  258. package/dist/universal/.rovodev/skills/citable/commands/artifact-interchange.md +28 -0
  259. package/dist/universal/.rovodev/skills/citable/commands/field-validation.md +71 -0
  260. package/dist/universal/.rovodev/skills/citable/commands/observe-and-act.md +5 -0
  261. package/dist/universal/.rovodev/skills/citable/manifest.json +30 -10
  262. package/dist/universal/.rovodev/skills/citable/references/aeo-geo-validation.md +1 -1
  263. package/dist/universal/.rovodev/skills/citable/references/capability-boundaries.md +1 -0
  264. package/dist/universal/.rovodev/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
  265. package/dist/universal/.rovodev/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
  266. package/dist/universal/.rovodev/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
  267. package/dist/universal/.rovodev/skills/citable/schemas/artifact-interchange.schema.json +58 -0
  268. package/dist/universal/.rovodev/skills/citable/schemas/assumption.schema.json +119 -0
  269. package/dist/universal/.rovodev/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
  270. package/dist/universal/.rovodev/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
  271. package/dist/universal/.rovodev/skills/citable/schemas/customer-outcome.schema.json +119 -0
  272. package/dist/universal/.rovodev/skills/citable/schemas/decision.schema.json +154 -0
  273. package/dist/universal/.rovodev/skills/citable/schemas/deployment-receipt.schema.json +51 -0
  274. package/dist/universal/.rovodev/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
  275. package/dist/universal/.rovodev/skills/citable/schemas/initiative.schema.json +185 -0
  276. package/dist/universal/.rovodev/skills/citable/schemas/kpi.schema.json +108 -0
  277. package/dist/universal/.rovodev/skills/citable/schemas/observation.schema.json +1 -1
  278. package/dist/universal/.rovodev/skills/citable/schemas/release-manifest.schema.json +74 -0
  279. package/dist/universal/.rovodev/skills/citable/schemas/release-state.schema.json +40 -0
  280. package/dist/universal/.rovodev/skills/citable/schemas/risk.schema.json +172 -0
  281. package/dist/universal/.rovodev/skills/citable/schemas/scenario.schema.json +165 -0
  282. package/dist/universal/.rovodev/skills/citable/schemas/variance.schema.json +112 -0
  283. package/dist/universal/.trae/skills/citable/SKILL.md +12 -1
  284. package/dist/universal/.trae/skills/citable/VERSION +1 -1
  285. package/dist/universal/.trae/skills/citable/commands/README.md +2 -1
  286. package/dist/universal/.trae/skills/citable/commands/artifact-interchange.md +28 -0
  287. package/dist/universal/.trae/skills/citable/commands/field-validation.md +71 -0
  288. package/dist/universal/.trae/skills/citable/commands/observe-and-act.md +5 -0
  289. package/dist/universal/.trae/skills/citable/manifest.json +30 -10
  290. package/dist/universal/.trae/skills/citable/references/aeo-geo-validation.md +1 -1
  291. package/dist/universal/.trae/skills/citable/references/capability-boundaries.md +1 -0
  292. package/dist/universal/.trae/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
  293. package/dist/universal/.trae/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
  294. package/dist/universal/.trae/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
  295. package/dist/universal/.trae/skills/citable/schemas/artifact-interchange.schema.json +58 -0
  296. package/dist/universal/.trae/skills/citable/schemas/assumption.schema.json +119 -0
  297. package/dist/universal/.trae/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
  298. package/dist/universal/.trae/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
  299. package/dist/universal/.trae/skills/citable/schemas/customer-outcome.schema.json +119 -0
  300. package/dist/universal/.trae/skills/citable/schemas/decision.schema.json +154 -0
  301. package/dist/universal/.trae/skills/citable/schemas/deployment-receipt.schema.json +51 -0
  302. package/dist/universal/.trae/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
  303. package/dist/universal/.trae/skills/citable/schemas/initiative.schema.json +185 -0
  304. package/dist/universal/.trae/skills/citable/schemas/kpi.schema.json +108 -0
  305. package/dist/universal/.trae/skills/citable/schemas/observation.schema.json +1 -1
  306. package/dist/universal/.trae/skills/citable/schemas/release-manifest.schema.json +74 -0
  307. package/dist/universal/.trae/skills/citable/schemas/release-state.schema.json +40 -0
  308. package/dist/universal/.trae/skills/citable/schemas/risk.schema.json +172 -0
  309. package/dist/universal/.trae/skills/citable/schemas/scenario.schema.json +165 -0
  310. package/dist/universal/.trae/skills/citable/schemas/variance.schema.json +112 -0
  311. package/dist/universal/.trae-cn/skills/citable/SKILL.md +12 -1
  312. package/dist/universal/.trae-cn/skills/citable/VERSION +1 -1
  313. package/dist/universal/.trae-cn/skills/citable/commands/README.md +2 -1
  314. package/dist/universal/.trae-cn/skills/citable/commands/artifact-interchange.md +28 -0
  315. package/dist/universal/.trae-cn/skills/citable/commands/field-validation.md +71 -0
  316. package/dist/universal/.trae-cn/skills/citable/commands/observe-and-act.md +5 -0
  317. package/dist/universal/.trae-cn/skills/citable/manifest.json +30 -10
  318. package/dist/universal/.trae-cn/skills/citable/references/aeo-geo-validation.md +1 -1
  319. package/dist/universal/.trae-cn/skills/citable/references/capability-boundaries.md +1 -0
  320. package/dist/universal/.trae-cn/skills/citable/schemas/acceptance-corpus.schema.json +168 -0
  321. package/dist/universal/.trae-cn/skills/citable/schemas/acceptance-run-context.schema.json +17 -0
  322. package/dist/universal/.trae-cn/skills/citable/schemas/acceptance-run-receipt.schema.json +88 -0
  323. package/dist/universal/.trae-cn/skills/citable/schemas/artifact-interchange.schema.json +58 -0
  324. package/dist/universal/.trae-cn/skills/citable/schemas/assumption.schema.json +119 -0
  325. package/dist/universal/.trae-cn/skills/citable/schemas/browser-evidence-plan.schema.json +76 -0
  326. package/dist/universal/.trae-cn/skills/citable/schemas/corpus-publication-receipt.schema.json +24 -0
  327. package/dist/universal/.trae-cn/skills/citable/schemas/customer-outcome.schema.json +119 -0
  328. package/dist/universal/.trae-cn/skills/citable/schemas/decision.schema.json +154 -0
  329. package/dist/universal/.trae-cn/skills/citable/schemas/deployment-receipt.schema.json +51 -0
  330. package/dist/universal/.trae-cn/skills/citable/schemas/field-validation-metrics.schema.json +15 -0
  331. package/dist/universal/.trae-cn/skills/citable/schemas/initiative.schema.json +185 -0
  332. package/dist/universal/.trae-cn/skills/citable/schemas/kpi.schema.json +108 -0
  333. package/dist/universal/.trae-cn/skills/citable/schemas/observation.schema.json +1 -1
  334. package/dist/universal/.trae-cn/skills/citable/schemas/release-manifest.schema.json +74 -0
  335. package/dist/universal/.trae-cn/skills/citable/schemas/release-state.schema.json +40 -0
  336. package/dist/universal/.trae-cn/skills/citable/schemas/risk.schema.json +172 -0
  337. package/dist/universal/.trae-cn/skills/citable/schemas/scenario.schema.json +165 -0
  338. package/dist/universal/.trae-cn/skills/citable/schemas/variance.schema.json +112 -0
  339. package/dist/universal/manifest.json +363 -123
  340. package/package.json +4 -1
  341. package/release/surfaces.json +21 -0
  342. package/schemas/acceptance-corpus.schema.json +168 -0
  343. package/schemas/acceptance-run-context.schema.json +17 -0
  344. package/schemas/acceptance-run-receipt.schema.json +88 -0
  345. package/schemas/artifact-interchange.schema.json +58 -0
  346. package/schemas/assumption.schema.json +119 -0
  347. package/schemas/browser-evidence-plan.schema.json +76 -0
  348. package/schemas/corpus-publication-receipt.schema.json +24 -0
  349. package/schemas/customer-outcome.schema.json +119 -0
  350. package/schemas/decision.schema.json +154 -0
  351. package/schemas/deployment-receipt.schema.json +51 -0
  352. package/schemas/field-validation-metrics.schema.json +15 -0
  353. package/schemas/initiative.schema.json +185 -0
  354. package/schemas/kpi.schema.json +108 -0
  355. package/schemas/observation.schema.json +1 -1
  356. package/schemas/release-manifest.schema.json +74 -0
  357. package/schemas/release-state.schema.json +40 -0
  358. package/schemas/risk.schema.json +172 -0
  359. package/schemas/scenario.schema.json +165 -0
  360. package/schemas/variance.schema.json +112 -0
  361. package/scripts/release-governance.js +123 -0
  362. package/skill/SKILL.md +12 -1
  363. package/skill/commands/README.md +2 -1
  364. package/skill/commands/artifact-interchange.md +28 -0
  365. package/skill/commands/field-validation.md +71 -0
  366. package/skill/commands/observe-and-act.md +5 -0
  367. package/skill/references/aeo-geo-validation.md +1 -1
  368. package/skill/references/capability-boundaries.md +1 -0
  369. package/src/acceptance/reproducibility.js +180 -0
  370. package/src/artifacts/interchange.js +179 -0
  371. package/src/cli/index.js +143 -4
  372. package/src/commands/assumptionAudit.js +111 -0
  373. package/src/commands/audit.js +6 -0
  374. package/src/commands/boardReport.js +251 -0
  375. package/src/commands/competitiveIntel.js +124 -0
  376. package/src/commands/corpus.js +322 -0
  377. package/src/commands/decisionMemo.js +202 -0
  378. package/src/commands/executive.js +167 -0
  379. package/src/commands/executiveReview.js +206 -0
  380. package/src/commands/init.js +14 -1
  381. package/src/commands/kpi.js +86 -0
  382. package/src/commands/monitor.js +9 -0
  383. package/src/commands/observe.js +84 -2
  384. package/src/commands/outcomes.js +113 -0
  385. package/src/commands/prioritize.js +108 -0
  386. package/src/commands/risk.js +104 -0
  387. package/src/commands/scenario.js +98 -0
  388. package/src/commands/variance.js +102 -0
  389. package/src/detectors/framework.js +37 -0
  390. package/src/detectors/page.js +10 -10
  391. package/src/detectors/tech.js +5 -3
  392. package/src/extractor/site.js +21 -6
  393. package/src/observations/browserJourney.js +167 -0
  394. package/src/observations/media.js +8 -1
  395. package/src/registries/index.js +107 -6
  396. package/src/release/governance.js +331 -0
  397. package/src/shared/asOf.js +18 -0
@@ -0,0 +1,251 @@
1
+ /**
2
+ * board-report command — Quarterly Board Pack
3
+ *
4
+ * Governed reporting invariants:
5
+ * - Every reported statement carries: statement_id, statement_type,
6
+ * source_records, period, owner, confidence, limitations
7
+ * - Refuses to invent missing financial, customer, usage, or engine data
8
+ * - Four-act narrative is mandatory for any material variance
9
+ *
10
+ * Citable-specific board sections:
11
+ * 1. Management assessment
12
+ * 2. Commercial position
13
+ * 3. Customer outcomes
14
+ * 4. Product adoption
15
+ * 5. Detector and evidence quality
16
+ * 6. Operational reliability
17
+ * 7. Market and category position
18
+ * 8. Material risks
19
+ * 9. Capital and capacity
20
+ * 10. Board decisions and asks
21
+ * 11. Next-quarter commitments
22
+ *
23
+ * Usage:
24
+ * citable board-report [--quarter <YYYY-QN>] [--json]
25
+ */
26
+ import { checkReferentialIntegrity, loadRegistries } from '../registries/index.js';
27
+ import { nowIso } from '../shared/io.js';
28
+ import { validateAgainst } from '../shared/schemaValidator.js';
29
+ import crypto from 'node:crypto';
30
+ import { dateOnly, parseAsOf } from '../shared/asOf.js';
31
+
32
+ /** Filter registry entries to only those that pass schema validation. */
33
+ function validEntries(entries, schemaName) {
34
+ if (!entries?.length) return [];
35
+ return entries.filter(e => {
36
+ const { valid } = validateAgainst(schemaName, { version: 1, kind: schemaName.replace('.schema.json','s'), entries: [e] });
37
+ return valid;
38
+ });
39
+ }
40
+
41
+ function validReferences(entries, kind, idField, problems) {
42
+ return entries.filter(entry => !problems.some(problem => problem.startsWith(`${kind}/${entry[idField]}:`)));
43
+ }
44
+
45
+ export async function boardReportCommand(args, root = process.cwd()) {
46
+ const asOf = parseAsOf(args);
47
+ const quarter = argVal(args, '--quarter') ?? currentQuarter(asOf);
48
+ const asJson = args.includes('--json');
49
+
50
+ const { registries, problems: regProblems } = loadRegistries(root);
51
+ const refProblems = checkReferentialIntegrity(registries);
52
+
53
+ const report = buildBoardReport(registries, quarter, [...regProblems, ...refProblems], refProblems);
54
+ report.generated_at = nowIso();
55
+ report.as_of = dateOnly(asOf);
56
+
57
+ return asJson ? report : formatBoardReport(report);
58
+ }
59
+
60
+ function buildBoardReport(registries, quarter, regProblems, refProblems) {
61
+ // Filter to schema-valid and referentially valid governed evidence.
62
+ const kpis = validReferences(validEntries(registries.kpis?.entries, 'kpi.schema.json'), 'kpis', 'metric_id', refProblems);
63
+ const validVariances = validReferences(validEntries(registries.variances?.entries, 'variance.schema.json'), 'variances', 'variance_id', refProblems);
64
+ const variances = validVariances.filter(v => inQuarter(v.period, quarter));
65
+ const outcomes = validReferences(validEntries(registries['customer-outcomes']?.entries, 'customer-outcome.schema.json'), 'customer-outcomes', 'outcome_id', refProblems);
66
+ const risks = validReferences(validEntries(registries.risks?.entries, 'risk.schema.json'), 'risks', 'risk_id', refProblems);
67
+ const decisions = validReferences(validEntries(registries.decisions?.entries, 'decision.schema.json'), 'decisions', 'decision_id', refProblems);
68
+ const initiatives = validReferences(validEntries(registries.initiatives?.entries, 'initiative.schema.json'), 'initiatives', 'initiative_id', refProblems);
69
+
70
+ const invalidCounts = {
71
+ kpis: (registries.kpis?.entries?.length ?? 0) - kpis.length,
72
+ variances: (registries.variances?.entries?.length ?? 0) - validVariances.length,
73
+ outcomes: (registries['customer-outcomes']?.entries?.length ?? 0) - outcomes.length,
74
+ risks: (registries.risks?.entries?.length ?? 0) - risks.length,
75
+ decisions: (registries.decisions?.entries?.length ?? 0) - decisions.length,
76
+ initiatives: (registries.initiatives?.entries?.length ?? 0) - initiatives.length,
77
+ };
78
+ const invalidTotal = Object.values(invalidCounts).reduce((a, b) => a + b, 0);
79
+
80
+ const missingData = [];
81
+ if (kpis.length === 0) missingData.push('kpis');
82
+ if (outcomes.length === 0) missingData.push('customer-outcomes');
83
+ if (risks.length === 0) missingData.push('risks');
84
+
85
+ // Deterministic statement envelope: identical governed inputs produce identical IDs.
86
+ const mkStatement = (path, type, value, owner, sourceRecords, confidence, limitations = []) => ({
87
+ statement_id: `STMT-${crypto.createHash('sha256').update(JSON.stringify({
88
+ report_type: 'board-report', period: quarter, path,
89
+ source_records: [...sourceRecords].sort(), value,
90
+ })).digest('hex').slice(0, 16)}`,
91
+ statement_type: type,
92
+ owner,
93
+ value,
94
+ source_records: sourceRecords,
95
+ period: quarter,
96
+ confidence,
97
+ limitations,
98
+ generated_at: nowIso(),
99
+ });
100
+
101
+ const boardRisks = risks.filter(r => r.board_visibility);
102
+ const openDecisions = decisions.filter(d => d.status === 'open');
103
+
104
+ return {
105
+ report_type: 'board-report',
106
+ quarter,
107
+ registry_problems: regProblems,
108
+ invalid_entries_excluded: invalidTotal > 0 ? invalidCounts : undefined,
109
+ missing_data: missingData,
110
+ refused_sections: missingData.length > 0
111
+ ? `Board report INCOMPLETE. Missing governed data for: ${missingData.join(', ')}. Register these before the board pack can be composed.`
112
+ : null,
113
+ sections: {
114
+ management_assessment: {
115
+ description: 'CEO/management assessment of quarter against stated commitments',
116
+ data_required: ['kpis','variances'],
117
+ governed_metrics: mkStatement('management_assessment.governed_metrics', 'fact', kpis.length, 'ceo', ['kpis.yaml'], 'exact'),
118
+ variances_this_quarter: mkStatement('management_assessment.variances_this_quarter', 'fact', variances.length, 'cfo', ['variances.yaml'], 'exact'),
119
+ material_variances: mkStatement('management_assessment.material_variances', 'fact',
120
+ variances.filter(v => ['material','critical'].includes(v.materiality)).length,
121
+ 'cfo', ['variances.yaml'], 'exact'),
122
+ four_act_required: variances.some(v => ['material','critical'].includes(v.materiality)),
123
+ },
124
+ commercial_position: {
125
+ description: 'ARR, MRR, bookings, pipeline, win/loss, concentration',
126
+ metrics: kpis.filter(k => /arr|mrr|booking|pipeline|revenue/i.test(k.metric_id + k.name)).map(k =>
127
+ mkStatement(`commercial_position.metrics.${k.metric_id}`, 'fact', { metric_id: k.metric_id, name: k.name, target: k.target ?? 'NOT_SET' },
128
+ k.owner ?? 'unset', k.source_query ? [k.source_query] : [], k.confidence ?? 'unset',
129
+ k.known_limitations ?? [])),
130
+ ungoverned: kpis.filter(k => /arr|mrr|booking|pipeline|revenue/i.test(k.metric_id + k.name)).length === 0
131
+ ? 'REFUSED: No commercial KPIs governed — cannot report commercial position' : null,
132
+ },
133
+ customer_outcomes: {
134
+ description: 'Validated customer outcomes separated from product activity',
135
+ total: mkStatement('customer_outcomes.total', 'fact', outcomes.length, 'cpo', ['customer-outcomes.yaml'], 'exact'),
136
+ customer_confirmed: mkStatement('customer_outcomes.customer_confirmed', 'fact', outcomes.filter(o => o.customer_confirmed).length, 'cpo', ['customer-outcomes.yaml'], 'exact'),
137
+ independently_verified: mkStatement('customer_outcomes.independently_verified', 'fact', outcomes.filter(o => o.independently_verified).length, 'cpo', ['customer-outcomes.yaml'], 'exact'),
138
+ causal_established: mkStatement('customer_outcomes.causal_established', 'fact', outcomes.filter(o => o.outcome_stage === 'causal_relationship_established').length, 'cpo', ['customer-outcomes.yaml'], 'exact'),
139
+ publishable: mkStatement('customer_outcomes.publishable', 'fact', outcomes.filter(o => o.publication_permission && o.customer_confirmed).length, 'cpo', ['customer-outcomes.yaml'], 'exact'),
140
+ warning: outcomes.length > 0 && outcomes.every(o => o.outcome_stage === 'finding_produced')
141
+ ? 'All outcomes at finding_produced — no validated customer impact to report' : null,
142
+ },
143
+ product_adoption: {
144
+ description: 'Active properties, audit runs, installation success, feature adoption',
145
+ metrics: kpis.filter(k => /install|audit|active_prop|feature|adoption/i.test(k.metric_id + k.name)).map(k =>
146
+ mkStatement(`product_adoption.metrics.${k.metric_id}`, 'fact', { metric_id: k.metric_id, name: k.name },
147
+ k.owner ?? 'unset', k.source_query ? [k.source_query] : [], k.confidence ?? 'unset')),
148
+ },
149
+ detector_evidence_quality: {
150
+ description: 'Detector precision, false positives, false negatives, evidence staleness',
151
+ metrics: kpis.filter(k => /precision|false_pos|false_neg|stale|evidence/i.test(k.metric_id + k.name)).map(k =>
152
+ mkStatement(`detector_evidence_quality.metrics.${k.metric_id}`, 'fact', { metric_id: k.metric_id, name: k.name },
153
+ k.owner ?? 'unset', k.source_query ? [k.source_query] : [], k.confidence ?? 'unset')),
154
+ },
155
+ operational_reliability: {
156
+ description: 'Failed runs, crawler failures, regressions, support burden',
157
+ metrics: kpis.filter(k => /failed_run|crawler|regression|support/i.test(k.metric_id + k.name)).map(k =>
158
+ mkStatement(`operational_reliability.metrics.${k.metric_id}`, 'fact', { metric_id: k.metric_id, name: k.name },
159
+ k.owner ?? 'unset', k.source_query ? [k.source_query] : [], k.confidence ?? 'unset')),
160
+ },
161
+ material_risks: {
162
+ description: 'Top risks by residual exposure, trend, controls, triggers',
163
+ board_visible: mkStatement('material_risks.board_visible', 'fact', boardRisks.length, 'cro', ['risks.yaml'], 'exact'),
164
+ critical: mkStatement('material_risks.critical', 'fact', boardRisks.filter(r => r.residual_exposure === 'critical').length, 'cro', ['risks.yaml'], 'exact'),
165
+ deteriorating: mkStatement('material_risks.deteriorating', 'fact', boardRisks.filter(r => r.trend === 'deteriorating').length, 'cro', ['risks.yaml'], 'exact'),
166
+ top_risks: boardRisks
167
+ .sort((a, b) => ['low','medium','high','critical'].indexOf(b.residual_exposure) - ['low','medium','high','critical'].indexOf(a.residual_exposure))
168
+ .slice(0, 5)
169
+ .map(r => mkStatement(`material_risks.top_risks.${r.risk_id}`, 'fact',
170
+ { risk_id: r.risk_id, title: r.title, residual_exposure: r.residual_exposure, trend: r.trend, trigger_threshold: r.trigger_threshold },
171
+ r.owner ?? 'unset', ['risks.yaml'], 'exact')),
172
+ },
173
+ board_decisions_and_asks: {
174
+ description: 'Decisions requiring board input, asks, and approvals',
175
+ open_decisions: mkStatement('board_decisions_and_asks.open_decisions', 'fact', openDecisions.length, 'ceo', ['decisions.yaml'], 'exact'),
176
+ decisions: openDecisions.map(d => mkStatement(`board_decisions_and_asks.decisions.${d.decision_id}`, 'fact',
177
+ { decision_id: d.decision_id, title: d.title, deadline: d.deadline,
178
+ reversibility: d.reversibility, recommendation: d.recommendation },
179
+ d.owner ?? 'unset', ['decisions.yaml'], 'exact')),
180
+ },
181
+ next_quarter_commitments: {
182
+ description: 'Specific, measurable commitments for next quarter',
183
+ data_required: ['initiatives'],
184
+ approved_initiatives: mkStatement('next_quarter_commitments.approved_initiatives', 'fact', initiatives.filter(i => i.status === 'approved').length, 'cpo', ['initiatives.yaml'], 'exact'),
185
+ in_progress: mkStatement('next_quarter_commitments.in_progress', 'fact', initiatives.filter(i => i.status === 'in_progress').length, 'cpo', ['initiatives.yaml'], 'exact'),
186
+ },
187
+ },
188
+ };
189
+ }
190
+
191
+ function formatBoardReport(report) {
192
+ const lines = [
193
+ `# Board Report — ${report.quarter}`,
194
+ `Generated: ${report.generated_at}`,
195
+ '',
196
+ ];
197
+ if (report.refused_sections) {
198
+ lines.push(`⛔ ${report.refused_sections}`, '');
199
+ }
200
+ if (report.registry_problems?.length) {
201
+ lines.push(`⚠️ Registry problems (${report.registry_problems.length}):`);
202
+ for (const p of report.registry_problems.slice(0, 5)) lines.push(` ${p}`);
203
+ lines.push('');
204
+ }
205
+ for (const [key, section] of Object.entries(report.sections)) {
206
+ lines.push(`## ${key.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase())}`);
207
+ lines.push(section.description);
208
+ if (section.ungoverned) lines.push(`⛔ ${section.ungoverned}`);
209
+ if (section.warning) lines.push(`⚠️ ${section.warning}`);
210
+ for (const [field, value] of Object.entries(section)) {
211
+ if (['description', 'ungoverned', 'warning', 'data_required'].includes(field)) continue;
212
+ renderBoardValue(lines, field, value);
213
+ }
214
+ lines.push('');
215
+ }
216
+ return lines.join('\n');
217
+ }
218
+
219
+ function renderBoardValue(lines, label, value) {
220
+ if (Array.isArray(value)) {
221
+ for (const item of value) renderBoardValue(lines, label, item);
222
+ return;
223
+ }
224
+ if (value?.statement_id) {
225
+ const rendered = typeof value.value === 'object' ? JSON.stringify(value.value) : String(value.value);
226
+ lines.push(`- ${label.replace(/_/g, ' ')}: ${rendered} [${value.statement_id}]`);
227
+ return;
228
+ }
229
+ if (typeof value !== 'object') lines.push(`- ${label.replace(/_/g, ' ')}: ${String(value)}`);
230
+ }
231
+
232
+ function inQuarter(period, quarter) {
233
+ if (!period || !quarter) return false;
234
+ const [yr, qn] = quarter.split('-Q');
235
+ if (!yr || !qn) return false;
236
+ const [py, pm] = period.split('-').map(Number);
237
+ if (!py || !pm) return false;
238
+ const qStart = (parseInt(qn) - 1) * 3 + 1;
239
+ const qEnd = qStart + 2;
240
+ return py === parseInt(yr) && pm >= qStart && pm <= qEnd;
241
+ }
242
+
243
+ function currentQuarter(d) {
244
+ const q = Math.ceil((d.getUTCMonth() + 1) / 3);
245
+ return `${d.getUTCFullYear()}-Q${q}`;
246
+ }
247
+
248
+ function argVal(args, flag) {
249
+ const i = args.indexOf(flag);
250
+ return i >= 0 ? args[i + 1] : null;
251
+ }
@@ -0,0 +1,124 @@
1
+ /**
2
+ * competitive-intel command — Competitive Intelligence Registry
3
+ *
4
+ * High-provenance only. Every claim retains source and observation date.
5
+ * Refuses claims from: stale marketing pages, scraped snippets alone,
6
+ * model recall, unverified directories, or synthetic review sites.
7
+ *
8
+ * Uses the existing competitors.yaml registry — extends it with
9
+ * provenance validation controls.
10
+ *
11
+ * Usage:
12
+ * citable competitive-intel list
13
+ * citable competitive-intel show <competitor_id>
14
+ * citable competitive-intel validate
15
+ * citable competitive-intel stale [--days <N>] — claims older than N days
16
+ */
17
+ import { contextDir, loadRegistryFile, registryLoadProblems } from '../registries/index.js';
18
+ import { validateAgainst } from '../shared/schemaValidator.js';
19
+ import path from 'node:path';
20
+
21
+ import { dateOnly, parseAsOf } from '../shared/asOf.js';
22
+
23
+ // Claim sources that cannot stand alone as primary evidence
24
+ const UNRELIABLE_SOURCES = [
25
+ /marketing.?page/i, /homepage/i, /landing.?page/i,
26
+ /g2\.com/i, /capterra/i, /trustpilot/i, /trustradius/i,
27
+ /model.recall/i, /llm.recall/i, /memory/i,
28
+ /unverified/i, /unknown/i,
29
+ ];
30
+
31
+ const STALE_DAYS_DEFAULT = 90;
32
+
33
+ export async function competitiveIntelCommand(args, root = process.cwd()) {
34
+ const [subcommand, ...rest] = args;
35
+ const file = path.join(contextDir(root), 'competitors.yaml');
36
+
37
+ switch (subcommand) {
38
+ case 'show': return competitorShow(file, rest[0]);
39
+ case 'validate': return competitorValidate(file);
40
+ case 'stale': {
41
+ const daysIndex = rest.indexOf('--days');
42
+ const days = (daysIndex >= 0 ? parseInt(rest[daysIndex + 1], 10) : NaN) || STALE_DAYS_DEFAULT;
43
+ return competitorStale(file, days, parseAsOf(args));
44
+ }
45
+ default: return competitorList(file);
46
+ }
47
+ }
48
+
49
+ function load(file) {
50
+ return loadRegistryFile(file, 'competitors');
51
+ }
52
+
53
+ function competitorList(file) {
54
+ const data = load(file);
55
+ return {
56
+ competitors: data.entries.map(c => ({
57
+ competitor_id: c.competitor_id,
58
+ name: c.name,
59
+ category: c.category,
60
+ last_updated: c.last_updated ?? c.updated ?? 'unknown',
61
+ claims_count: countClaims(c),
62
+ verified_claims: countVerified(c),
63
+ })),
64
+ total: data.entries.length,
65
+ };
66
+ }
67
+
68
+ function competitorShow(file, id) {
69
+ if (!id) return { error: 'competitor_id required' };
70
+ const data = load(file);
71
+ const c = data.entries.find(e => e.competitor_id === id);
72
+ if (!c) return { error: `Competitor not found: ${id}` };
73
+ return { competitor: c };
74
+ }
75
+
76
+ function competitorStale(file, days, asOf) {
77
+ const data = load(file);
78
+ const cutoff = new Date(asOf.getTime() - days * 86400000);
79
+ const stale = data.entries.filter(c => {
80
+ const updated = c.last_updated ?? c.updated;
81
+ return !updated || new Date(updated) < cutoff;
82
+ });
83
+ return {
84
+ stale_competitors: stale.map(c => ({ competitor_id: c.competitor_id, name: c.name, last_updated: c.last_updated ?? c.updated ?? 'never' })),
85
+ cutoff_days: days,
86
+ as_of: dateOnly(asOf),
87
+ total: stale.length,
88
+ };
89
+ }
90
+
91
+ function competitorValidate(file) {
92
+ const data = load(file);
93
+ const problems = [...registryLoadProblems(data)];
94
+
95
+ for (const c of data.entries) {
96
+ // Every claim must have observation_date
97
+ for (const claim of (c.claims ?? [])) {
98
+ if (!claim.observation_date)
99
+ problems.push(`${c.competitor_id} claim "${(claim.text ?? '').slice(0,50)}": observation_date required`);
100
+ if (!claim.source)
101
+ problems.push(`${c.competitor_id} claim: source required for every claim`);
102
+ // Unreliable sources must not be the sole source
103
+ const source = claim.source ?? '';
104
+ const isUnreliable = UNRELIABLE_SOURCES.some(p => p.test(source));
105
+ if (isUnreliable && !claim.independent_verification)
106
+ problems.push(`${c.competitor_id} claim source "${source}": unreliable source — must provide independent_verification`);
107
+ }
108
+ // Distinguish competitor claim vs Citable interpretation
109
+ for (const claim of (c.claims ?? [])) {
110
+ if (!claim.claim_type || !['competitor_claim','independent_verification','citable_interpretation'].includes(claim.claim_type))
111
+ problems.push(`${c.competitor_id} claim: claim_type must be competitor_claim, independent_verification, or citable_interpretation`);
112
+ }
113
+ }
114
+
115
+ return { valid: problems.length === 0, problems, checked: data.entries.length };
116
+ }
117
+
118
+ function countClaims(c) {
119
+ return (c.claims ?? []).length;
120
+ }
121
+
122
+ function countVerified(c) {
123
+ return (c.claims ?? []).filter(cl => cl.independent_verification).length;
124
+ }