@nebulacomponents/citable 1.12.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/CHANGELOG.md +140 -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,179 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { canonicalJson } from '../release/governance.js';
6
+ import { nowIso, readJson, sha256, sha256File, writeJson } from '../shared/io.js';
7
+ import { validateAgainst } from '../shared/schemaValidator.js';
8
+
9
+ const PACKAGE = readJson(path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../package.json'));
10
+ const ENVELOPE = 'citable-artifact.json';
11
+ const SAFE_RUN_ID = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
12
+
13
+ function safeRelativePath(value) {
14
+ return typeof value === 'string'
15
+ && value.length > 0
16
+ && !path.isAbsolute(value)
17
+ && !value.includes('\\')
18
+ && !value.split('/').includes('..')
19
+ && !/^[a-z][a-z0-9+.-]*:/i.test(value);
20
+ }
21
+
22
+ function filesUnder(dir, current = dir, result = []) {
23
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })) {
24
+ const absolute = path.join(current, entry.name);
25
+ const relative = path.relative(dir, absolute).split(path.sep).join('/');
26
+ if (entry.isSymbolicLink()) throw new Error(`artifact package cannot contain symbolic links: ${relative}`);
27
+ if (entry.isDirectory()) filesUnder(dir, absolute, result);
28
+ else if (entry.isFile()) result.push(relative);
29
+ else throw new Error(`artifact package contains unsupported filesystem entry: ${relative}`);
30
+ }
31
+ return result.sort();
32
+ }
33
+
34
+ function validateRunPackage(runDir) {
35
+ if (!fs.existsSync(runDir) || !fs.statSync(runDir).isDirectory()) throw new Error(`run package not found: ${runDir}`);
36
+ const manifestFile = path.join(runDir, 'manifest.json');
37
+ const checksumsFile = path.join(runDir, 'checksums.json');
38
+ if (!fs.existsSync(manifestFile) || !fs.existsSync(checksumsFile)) throw new Error('run package requires manifest.json and checksums.json');
39
+ const manifest = readJson(manifestFile);
40
+ const manifestCheck = validateAgainst('run.schema.json', manifest);
41
+ if (!manifestCheck.valid) throw new Error(`run manifest invalid: ${manifestCheck.errors.join('; ')}`);
42
+ const checksums = readJson(checksumsFile);
43
+ if (!checksums || Array.isArray(checksums) || typeof checksums !== 'object') throw new Error('checksums.json must be an object');
44
+ const actualFiles = filesUnder(runDir).filter((name) => name !== ENVELOPE);
45
+ const expectedFiles = [...Object.keys(checksums), 'checksums.json'].sort();
46
+ if (new Set(expectedFiles).size !== expectedFiles.length) throw new Error('checksums.json contains duplicate package paths');
47
+ for (const rel of Object.keys(checksums)) {
48
+ if (!safeRelativePath(rel) || rel === ENVELOPE || rel === 'checksums.json') throw new Error(`unsafe checksum path: ${rel}`);
49
+ const file = path.join(runDir, ...rel.split('/'));
50
+ if (!fs.existsSync(file) || !fs.statSync(file).isFile()) throw new Error(`checksummed artifact is missing: ${rel}`);
51
+ if (!/^[a-f0-9]{64}$/.test(checksums[rel]) || sha256File(file) !== checksums[rel]) throw new Error(`artifact checksum mismatch: ${rel}`);
52
+ }
53
+ const extras = actualFiles.filter((name) => !expectedFiles.includes(name));
54
+ const missing = expectedFiles.filter((name) => !actualFiles.includes(name));
55
+ if (extras.length || missing.length) throw new Error(`run package completeness failure${extras.length ? `; unsealed: ${extras.join(', ')}` : ''}${missing.length ? `; missing: ${missing.join(', ')}` : ''}`);
56
+ if (checksums['manifest.json'] !== sha256File(manifestFile)) throw new Error('manifest.json is not bound by checksums.json');
57
+ return { manifest, files: actualFiles };
58
+ }
59
+
60
+ function artifactRecords(dir, files) {
61
+ return files.map((relative) => {
62
+ const file = path.join(dir, ...relative.split('/'));
63
+ return { path: relative, sha256: sha256File(file), bytes: fs.statSync(file).size };
64
+ });
65
+ }
66
+
67
+ function packageHash(envelope) {
68
+ return sha256(canonicalJson({ ...envelope, package_hash: '' }));
69
+ }
70
+
71
+ export function verifyArtifactPackage(input) {
72
+ const dir = path.resolve(input ?? '');
73
+ const envelopeFile = path.join(dir, ENVELOPE);
74
+ if (!fs.existsSync(envelopeFile)) throw new Error(`artifact interchange envelope not found: ${envelopeFile}`);
75
+ const envelope = readJson(envelopeFile);
76
+ const envelopeCheck = validateAgainst('artifact-interchange.schema.json', envelope);
77
+ if (!envelopeCheck.valid) throw new Error(`artifact interchange envelope invalid: ${envelopeCheck.errors.join('; ')}`);
78
+ if (packageHash(envelope) !== envelope.package_hash) throw new Error('artifact interchange package hash mismatch');
79
+ const { manifest, files } = validateRunPackage(dir);
80
+ if (manifest.run_id !== envelope.run.run_id) throw new Error('artifact run id does not match run manifest');
81
+ if (manifest.command !== envelope.run.command || manifest.status !== envelope.run.status || manifest.timestamp !== envelope.run.timestamp) throw new Error('artifact run metadata does not match run manifest');
82
+ if (manifest.tool_version !== envelope.run.tool_version || manifest.skill_version !== envelope.run.skill_version) throw new Error('artifact source versions do not match run manifest');
83
+ if (sha256File(path.join(dir, 'manifest.json')) !== envelope.run.manifest_sha256) throw new Error('artifact manifest hash mismatch');
84
+ if (sha256File(path.join(dir, 'checksums.json')) !== envelope.run.checksums_sha256) throw new Error('artifact checksums hash mismatch');
85
+ const records = artifactRecords(dir, files);
86
+ if (canonicalJson(records) !== canonicalJson(envelope.artifacts)) throw new Error('artifact inventory does not match package contents');
87
+ return { valid: true, dir, envelope, manifest, artifacts: records };
88
+ }
89
+
90
+ export function exportArtifactPackage(root, { runId, output }) {
91
+ if (!runId) throw new Error('usage: citable artifacts export <run-id> --output <directory>');
92
+ if (!SAFE_RUN_ID.test(runId)) throw new Error('artifact export requires a safe run id');
93
+ if (!output) throw new Error('artifact export requires --output <directory>');
94
+ const source = path.join(root, '.citable', 'runs', runId);
95
+ const validated = validateRunPackage(source);
96
+ if (validated.manifest.run_id !== runId) throw new Error('requested run id does not match run manifest');
97
+ const destination = path.resolve(root, output);
98
+ if (fs.existsSync(destination)) throw new Error(`artifact export destination already exists: ${destination}`);
99
+ if (destination === source || destination.startsWith(`${source}${path.sep}`)) throw new Error('artifact export destination cannot be inside the source run package');
100
+ const parent = path.dirname(destination);
101
+ fs.mkdirSync(parent, { recursive: true });
102
+ const stage = fs.mkdtempSync(path.join(parent, `.${path.basename(destination)}-`));
103
+ try {
104
+ for (const relative of validated.files) {
105
+ const sourceFile = path.join(source, ...relative.split('/'));
106
+ const targetFile = path.join(stage, ...relative.split('/'));
107
+ fs.mkdirSync(path.dirname(targetFile), { recursive: true });
108
+ fs.copyFileSync(sourceFile, targetFile);
109
+ }
110
+ const artifacts = artifactRecords(stage, validated.files);
111
+ const envelope = {
112
+ contract: 'citable-artifact-interchange',
113
+ contract_version: 1,
114
+ created_at: nowIso(),
115
+ producer: { tool: 'citable', tool_version: PACKAGE.version, skill_version: PACKAGE.version },
116
+ run: {
117
+ run_id: validated.manifest.run_id,
118
+ command: validated.manifest.command,
119
+ status: validated.manifest.status,
120
+ timestamp: validated.manifest.timestamp,
121
+ tool_version: validated.manifest.tool_version,
122
+ skill_version: validated.manifest.skill_version,
123
+ manifest_sha256: sha256File(path.join(stage, 'manifest.json')),
124
+ checksums_sha256: sha256File(path.join(stage, 'checksums.json')),
125
+ },
126
+ artifacts,
127
+ package_hash: '',
128
+ limitations: [
129
+ 'Checksums establish preservation of exported bytes, not source authenticity, completeness of external observations, or outcome causality.',
130
+ 'This portable package does not grant hosted storage, tenant, authentication, billing, or dashboard authority.',
131
+ ],
132
+ };
133
+ envelope.package_hash = packageHash(envelope);
134
+ writeJson(path.join(stage, ENVELOPE), envelope);
135
+ verifyArtifactPackage(stage);
136
+ fs.renameSync(stage, destination);
137
+ return { output: destination, envelope, artifacts: artifacts.length };
138
+ } catch (error) {
139
+ fs.rmSync(stage, { recursive: true, force: true });
140
+ throw error;
141
+ }
142
+ }
143
+
144
+ export function importArtifactPackage(root, { input }) {
145
+ if (!input) throw new Error('artifact import requires --input <directory>');
146
+ const verified = verifyArtifactPackage(input);
147
+ if (!SAFE_RUN_ID.test(verified.manifest.run_id)) throw new Error('artifact import requires a safe run id');
148
+ const runsDir = path.join(root, '.citable', 'runs');
149
+ const destination = path.join(runsDir, verified.manifest.run_id);
150
+ if (fs.existsSync(destination)) {
151
+ let existing;
152
+ try {
153
+ existing = validateRunPackage(destination);
154
+ } catch (error) {
155
+ throw new Error(`run collision: ${verified.manifest.run_id} already exists but is not a valid sealed package (${error.message})`);
156
+ }
157
+ const existingRecords = artifactRecords(destination, existing.files);
158
+ if (canonicalJson(existingRecords) === canonicalJson(verified.artifacts)) return { status: 'already_present', run_id: verified.manifest.run_id, destination };
159
+ throw new Error(`run collision: ${verified.manifest.run_id} already exists with different artifacts`);
160
+ }
161
+ fs.mkdirSync(runsDir, { recursive: true });
162
+ const stage = fs.mkdtempSync(path.join(runsDir, '.artifact-import-'));
163
+ try {
164
+ for (const relative of verified.artifacts.map((item) => item.path)) {
165
+ const sourceFile = path.join(verified.dir, ...relative.split('/'));
166
+ const targetFile = path.join(stage, ...relative.split('/'));
167
+ fs.mkdirSync(path.dirname(targetFile), { recursive: true });
168
+ fs.copyFileSync(sourceFile, targetFile);
169
+ }
170
+ validateRunPackage(stage);
171
+ fs.renameSync(stage, destination);
172
+ return { status: 'imported', run_id: verified.manifest.run_id, destination, source_package_hash: verified.envelope.package_hash };
173
+ } catch (error) {
174
+ fs.rmSync(stage, { recursive: true, force: true });
175
+ throw error;
176
+ }
177
+ }
178
+
179
+ export const ARTIFACT_INTERCHANGE_ENVELOPE = ENVELOPE;
package/src/cli/index.js CHANGED
@@ -10,7 +10,7 @@ import { inspect } from '../commands/inspect.js';
10
10
  import { schemaCommand } from '../commands/schemaCmd.js';
11
11
  import { compareSnapshots } from '../commands/compareSnapshots.js';
12
12
  import { isInstallerCommand, runInstallerCommand } from '../installer/index.js';
13
- import { selfUpgradeCommand, selfUpgradeExitCode } from '../commands/selfUpgrade.js';
13
+ import { projectGithub, runSchedule } from '../commands/delivery.js';
14
14
  import { actionPlan } from '../commands/actionPlan.js';
15
15
  import { observe } from '../commands/observe.js';
16
16
  import { applyRemediation } from '../commands/applyRemediation.js';
@@ -19,7 +19,24 @@ import { evaluateObjective, importMetrics, initializeObjective, validateObjectiv
19
19
  import { configureConnection, connectionStatus, discoverConnections, disconnectConnection, syncConnection, validateConnection } from '../commands/connect.js';
20
20
  import { evaluateDispositions, validateGovernance } from '../commands/governance.js';
21
21
  import { evaluateReviews, initializeSamplingPlan, prioritizeReviews, queueReviews, selectSample } from '../commands/reviews.js';
22
- import { projectGithub, runSchedule } from '../commands/delivery.js';
22
+ import { selfUpgradeCommand, selfUpgradeExitCode } from '../commands/selfUpgrade.js';
23
+ // Executive reporting suite
24
+ import { kpiCommand } from '../commands/kpi.js';
25
+ import { varianceCommand } from '../commands/variance.js';
26
+ import { outcomesCommand } from '../commands/outcomes.js';
27
+ import { riskCommand } from '../commands/risk.js';
28
+ import { executiveReviewCommand } from '../commands/executiveReview.js';
29
+ import { boardReportCommand } from '../commands/boardReport.js';
30
+ import { decisionMemoCommand } from '../commands/decisionMemo.js';
31
+ import { assumptionAuditCommand } from '../commands/assumptionAudit.js';
32
+ import { scenarioCommand } from '../commands/scenario.js';
33
+ import { prioritizeCommand } from '../commands/prioritize.js';
34
+ import { competitiveIntelCommand } from '../commands/competitiveIntel.js';
35
+ import { executiveCommand } from '../commands/executive.js';
36
+ import { evaluateCorpus, publishCorpus } from '../commands/corpus.js';
37
+ import { createAcceptanceReceipt, readAndCompareAcceptanceReceipts } from '../acceptance/reproducibility.js';
38
+ import { readJson } from '../shared/io.js';
39
+ import { exportArtifactPackage, importArtifactPackage, verifyArtifactPackage } from '../artifacts/interchange.js';
23
40
 
24
41
  const HELP = `citable — SEO / AEO / GEO audit, remediation, validation, and governance
25
42
 
@@ -43,7 +60,7 @@ Commands
43
60
  compare-snapshots [a b] Regression diff between two audit runs
44
61
  action-plan [run] Turn audit findings into ordered remediation work
45
62
  observe <mode> Collect render, index, citation, log, Bing, passage,
46
- consensus, performance, corroboration, or media evidence
63
+ consensus, performance, corroboration, media evidence, or representation evidence
47
64
  apply Apply a reviewed, hash-locked remediation spec
48
65
  monitor [runA runB] Compare observation runs and emit regression alerts
49
66
  metrics import Import declared metric observations from CSV/JSON
@@ -65,13 +82,34 @@ Commands
65
82
  reviews evaluate Detect stale decisions and require disagreement adjudication
66
83
  schedules run [id] Execute an active version-pinned audit schedule
67
84
  project github [run] Render non-authoritative GitHub annotations from a run
85
+ corpus evaluate Evaluate a disclosed real-property acceptance corpus
86
+ corpus publish Validate and project an owner-authorized public corpus
87
+ corpus receipt Create a reproducibility receipt for a sealed run
88
+ corpus compare-receipts Compare two acceptance-run receipt envelopes
89
+ artifacts export Export one sealed run as a portable verified directory
90
+ artifacts verify Verify an exported artifact interchange directory
91
+ artifacts import Import a verified run without changing its canonical bytes
68
92
  self-upgrade Check for a newer version and upgrade the npx cache
93
+ kpi [list|show|validate] KPI architecture — govern metric definitions, sources, targets
94
+ variance [list|validate|material] Variance analysis — explain target-vs-actual without narrative smoothing
95
+ outcomes [list|summary|validate] Customer outcomes — separate activity from validated impact
96
+ risk [list|top|validate] Risk register — top risks, controls, residual exposure, KRIs
97
+ executive-review [--period YYYY-MM] Monthly executive operating review (evidence-first)
98
+ board-report [--quarter YYYY-QN] Quarterly board pack (governed statements only)
99
+ decision-memo [list|show|validate|new] Bounded decision record with trade-offs and evidence
100
+ assumption-audit [list|expired|critical|validate] Assumption validity tracking
101
+ scenario [list|show|triggers|validate] Compound risk scenario war room
102
+ prioritize [list|rank|validate] Initiative prioritization with transparent scoring
103
+ competitive-intel [list|stale|validate] Competitive intelligence (provenance-controlled)
104
+ executive <request> Chief-of-staff router — routes to the correct reporting skill
69
105
 
70
106
  Options
71
107
  --target <dir|url> Built output directory or deployed URL to audit
72
108
  --base-url <url> Base URL for path resolution of a built output dir
73
109
  --ref-date <YYYY-MM-DD> Reference date for expiry/staleness checks (default: today)
74
- --input <file> Import file or remediation specification
110
+ --input <file> Import evidence, remediation, or browser plan
111
+ --output <path> Explicit output path for a corpus or artifact export
112
+ --run <run-id> Sealed run used to create an acceptance receipt
75
113
  --provider <name> Provider label for imported observations
76
114
  --dataset <name> Provider export dataset (for example ai_performance)
77
115
  --connection-id <id> Connection registry identifier
@@ -86,6 +124,9 @@ Options
86
124
  --repeat <count> Repetitions per prompt for citation experiments
87
125
  --interactions Exercise bounded disclosure, tab, and load-more controls
88
126
  --resume-run <run-id> Reuse successful immutable render profiles
127
+ --surface-id <id> Controlled publisher surface for representation evidence
128
+ --region <label> Disclosed collector region for representation evidence
129
+ --user-agent <value> Disclosed request identity for representation evidence
89
130
  --lighthouse Run local, repeated Lighthouse lab observations
90
131
  --ocr Explicitly request optional OCR for media images
91
132
  --write Persist registry changes (map-claims, substantiate)
@@ -107,6 +148,8 @@ function parseArgs(argv) {
107
148
  else if (a === '--base-url') args.baseUrl = argv[++i];
108
149
  else if (a === '--ref-date') args.refDate = argv[++i];
109
150
  else if (a === '--input') args.input = argv[++i];
151
+ else if (a === '--output') args.output = argv[++i];
152
+ else if (a === '--run') args.runId = argv[++i];
110
153
  else if (a === '--provider') args.provider = argv[++i];
111
154
  else if (a === '--dataset') args.dataset = argv[++i];
112
155
  else if (a === '--connection-id') args.connectionId = argv[++i];
@@ -120,6 +163,9 @@ function parseArgs(argv) {
120
163
  else if (a === '--endpoint') args.endpoint = argv[++i];
121
164
  else if (a === '--repeat') args.repeat = Number(argv[++i]);
122
165
  else if (a === '--resume-run') args.resumeRun = argv[++i];
166
+ else if (a === '--surface-id') args.surfaceId = argv[++i];
167
+ else if (a === '--region') args.region = argv[++i];
168
+ else if (a === '--user-agent') args.userAgent = argv[++i];
123
169
  else if (a === '--timeout') args.timeout = Number(argv[++i]);
124
170
  else if (a === '--force') args.force = true;
125
171
  else args._.push(a);
@@ -295,12 +341,105 @@ export async function main(argv = process.argv.slice(2), options = {}) {
295
341
  out(args,`project github ${r.source_run_id}: ${r.annotations.length} annotation(s)\nProjection: ${path.join(r.dir,'annotations.json')}`,r);
296
342
  break;
297
343
  }
344
+ case 'corpus': {
345
+ const mode = args._[0];
346
+ if (mode === 'evaluate') {
347
+ const r = evaluateCorpus(root, { input: args.input });
348
+ out(args, `corpus evaluate ${r.metrics.corpus_id}: ${r.metrics.population.detector_cases} detector case(s)\nEvidence package: ${r.dir}`, r);
349
+ } else if (mode === 'publish') {
350
+ const r = publishCorpus(root, { input: args.input, output: args.output });
351
+ out(args, `corpus publish ${r.receipt.corpus_id}: ${r.receipt.property_ids.length} approved property record(s)\nCorpus: ${r.output}\nMetrics: ${r.metricsFile}\nReport: ${r.reportFile}\nReceipt: ${r.receiptFile}\nEvidence package: ${r.dir}`, r);
352
+ } else if (mode === 'receipt') {
353
+ const context = args.input ? readJson(args.input) : {};
354
+ const r = createAcceptanceReceipt(root, { runId: args.runId, context });
355
+ out(args, `corpus receipt ${r.receipt.receipt_id}\nFingerprint: ${r.receipt.reproducibility.fingerprint}\nReceipt: ${r.output}${r.receipt.execution.partial ? '\nStatus: partial' : ''}`, r);
356
+ } else if (mode === 'compare-receipts') {
357
+ const r = readAndCompareAcceptanceReceipts(args._[1], args._[2]);
358
+ out(args, `corpus compare-receipts ${r.receipt_a} → ${r.receipt_b}\nComparable envelope: ${r.comparable}\nFingerprint equal: ${r.fingerprint_equal}\nPartial runs: ${r.partial_runs.length}`, r);
359
+ } else throw new Error('usage: citable corpus <evaluate|publish|receipt|compare-receipts> [options]');
360
+ break;
361
+ }
362
+ case 'artifacts': {
363
+ const mode = args._[0];
364
+ if (mode === 'export') {
365
+ const r = exportArtifactPackage(root, { runId: args._[1], output: args.output });
366
+ out(args, `artifacts export ${r.envelope.run.run_id}: ${r.artifacts} sealed file(s)\nPackage: ${r.output}\nPackage hash: ${r.envelope.package_hash}`, r);
367
+ } else if (mode === 'verify') {
368
+ const r = verifyArtifactPackage(args.input);
369
+ out(args, `artifacts verify ${r.manifest.run_id}: valid\nArtifacts: ${r.artifacts.length}\nPackage hash: ${r.envelope.package_hash}`, { valid: r.valid, run_id: r.manifest.run_id, artifacts: r.artifacts.length, package_hash: r.envelope.package_hash });
370
+ } else if (mode === 'import') {
371
+ const r = importArtifactPackage(root, { input: args.input });
372
+ out(args, `artifacts import ${r.run_id}: ${r.status}\nRun package: ${r.destination}`, r);
373
+ } else throw new Error('usage: citable artifacts <export <run-id> --output <directory>|verify --input <directory>|import --input <directory>>');
374
+ break;
375
+ }
298
376
  case 'self-upgrade': {
299
377
  const output = await selfUpgradeCommand(argv.slice(1));
300
378
  console.log(output);
301
379
  process.exitCode = selfUpgradeExitCode(output);
302
380
  break;
303
381
  }
382
+ // Executive reporting suite
383
+ case 'kpi': {
384
+ const r = await kpiCommand(argv.slice(1), root);
385
+ out(args, JSON.stringify(r, null, 2), r);
386
+ break;
387
+ }
388
+ case 'variance': {
389
+ const r = await varianceCommand(argv.slice(1), root);
390
+ out(args, JSON.stringify(r, null, 2), r);
391
+ break;
392
+ }
393
+ case 'outcomes': {
394
+ const r = await outcomesCommand(argv.slice(1), root);
395
+ out(args, JSON.stringify(r, null, 2), r);
396
+ break;
397
+ }
398
+ case 'risk': {
399
+ const r = await riskCommand(argv.slice(1), root);
400
+ out(args, JSON.stringify(r, null, 2), r);
401
+ break;
402
+ }
403
+ case 'executive-review': {
404
+ const r = await executiveReviewCommand(argv.slice(1), root);
405
+ out(args, typeof r === 'string' ? r : JSON.stringify(r, null, 2), r);
406
+ break;
407
+ }
408
+ case 'board-report': {
409
+ const r = await boardReportCommand(argv.slice(1), root);
410
+ out(args, typeof r === 'string' ? r : JSON.stringify(r, null, 2), r);
411
+ break;
412
+ }
413
+ case 'decision-memo': {
414
+ const r = await decisionMemoCommand(argv.slice(1), root);
415
+ out(args, JSON.stringify(r, null, 2), r);
416
+ break;
417
+ }
418
+ case 'assumption-audit': {
419
+ const r = await assumptionAuditCommand(argv.slice(1), root);
420
+ out(args, JSON.stringify(r, null, 2), r);
421
+ break;
422
+ }
423
+ case 'scenario': {
424
+ const r = await scenarioCommand(argv.slice(1), root);
425
+ out(args, JSON.stringify(r, null, 2), r);
426
+ break;
427
+ }
428
+ case 'prioritize': {
429
+ const r = await prioritizeCommand(argv.slice(1), root);
430
+ out(args, JSON.stringify(r, null, 2), r);
431
+ break;
432
+ }
433
+ case 'competitive-intel': {
434
+ const r = await competitiveIntelCommand(argv.slice(1), root);
435
+ out(args, JSON.stringify(r, null, 2), r);
436
+ break;
437
+ }
438
+ case 'executive': {
439
+ const r = await executiveCommand(argv.slice(1), root);
440
+ out(args, JSON.stringify(r, null, 2), r);
441
+ break;
442
+ }
304
443
  case undefined:
305
444
  console.log(HELP);
306
445
  break;
@@ -0,0 +1,111 @@
1
+ /**
2
+ * assumption-audit command — Assumption Registry
3
+ *
4
+ * Tracks which commercial and product assumptions remain valid.
5
+ * Feeds both board reporting and roadmap prioritization.
6
+ *
7
+ * Usage:
8
+ * citable assumption-audit list [--status <status>]
9
+ * citable assumption-audit show <assumption_id>
10
+ * citable assumption-audit validate
11
+ * citable assumption-audit expired — assumptions past expiry date
12
+ * citable assumption-audit critical — critical importance assumptions
13
+ */
14
+ import { contextDir, loadRegistryFile, registryLoadProblems } from '../registries/index.js';
15
+ import { validateAgainst } from '../shared/schemaValidator.js';
16
+ import path from 'node:path';
17
+
18
+ import { dateOnly, parseAsOf } from '../shared/asOf.js';
19
+
20
+ export async function assumptionAuditCommand(args, root = process.cwd()) {
21
+ const [subcommand, ...rest] = args;
22
+ const file = path.join(contextDir(root), 'assumptions.yaml');
23
+
24
+ switch (subcommand) {
25
+ case 'show': return assumptionShow(file, rest[0]);
26
+ case 'validate': return assumptionValidate(file);
27
+ case 'expired': return assumptionExpired(file, parseAsOf(args));
28
+ case 'critical': return assumptionList(file, { importance: 'critical' });
29
+ case 'list':
30
+ default: {
31
+ const statusFilter = rest[rest.indexOf('--status') + 1] ?? null;
32
+ return assumptionList(file, { statusFilter });
33
+ }
34
+ }
35
+ }
36
+
37
+ function load(file) {
38
+ return loadRegistryFile(file, 'assumptions');
39
+ }
40
+
41
+ function assumptionList(file, { statusFilter = null, importance = null } = {}) {
42
+ const data = load(file);
43
+ let entries = data.entries;
44
+ if (statusFilter) entries = entries.filter(a => a.current_status === statusFilter);
45
+ if (importance) entries = entries.filter(a => a.importance === importance);
46
+ return {
47
+ assumptions: entries.map(a => ({
48
+ assumption_id: a.assumption_id,
49
+ statement: a.statement,
50
+ category: a.category,
51
+ importance: a.importance,
52
+ current_status: a.current_status,
53
+ confidence: a.confidence,
54
+ owner: a.owner,
55
+ expiry: a.expiry ?? 'none',
56
+ })),
57
+ total: entries.length,
58
+ by_status: statusDist(data.entries),
59
+ };
60
+ }
61
+
62
+ function assumptionShow(file, id) {
63
+ if (!id) return { error: 'assumption_id required' };
64
+ const data = load(file);
65
+ const a = data.entries.find(e => e.assumption_id === id);
66
+ if (!a) return { error: `Assumption not found: ${id}` };
67
+ return { assumption: a };
68
+ }
69
+
70
+ function assumptionExpired(file, asOf) {
71
+ const data = load(file);
72
+ const expired = data.entries.filter(a => a.expiry && new Date(a.expiry) < asOf);
73
+ return {
74
+ expired: expired.map(a => ({
75
+ assumption_id: a.assumption_id, statement: a.statement,
76
+ expiry: a.expiry, current_status: a.current_status, owner: a.owner,
77
+ })),
78
+ total: expired.length,
79
+ as_of: dateOnly(asOf),
80
+ };
81
+ }
82
+
83
+ function assumptionValidate(file) {
84
+ const data = load(file);
85
+ const problems = [...registryLoadProblems(data)];
86
+ const { valid, errors } = validateAgainst('assumption.schema.json', data);
87
+ if (!valid) problems.push(...errors);
88
+
89
+ for (const a of data.entries) {
90
+ // Validated assumptions need supporting evidence
91
+ if (['validated_within_scope','partially_validated'].includes(a.current_status) && (!a.evidence_for || a.evidence_for.length === 0))
92
+ problems.push(`${a.assumption_id}: status "${a.current_status}" requires evidence_for`);
93
+ // Contradicted/invalidated need counter-evidence
94
+ if (['contradicted','invalidated'].includes(a.current_status) && (!a.evidence_against || a.evidence_against.length === 0))
95
+ problems.push(`${a.assumption_id}: status "${a.current_status}" requires evidence_against`);
96
+ // Critical assumptions need a next_test date
97
+ if (a.importance === 'critical' && !a.next_test)
98
+ problems.push(`${a.assumption_id}: critical importance requires next_test date`);
99
+ // Contradicted critical assumptions must have decision dependencies flagged
100
+ if (a.importance === 'critical' && a.current_status === 'contradicted' && (!a.decision_dependency || a.decision_dependency.length === 0))
101
+ problems.push(`${a.assumption_id}: critical contradicted assumption has no decision_dependency — escalate to decision-memo`);
102
+ }
103
+
104
+ return { valid: problems.length === 0, problems, checked: data.entries.length };
105
+ }
106
+
107
+ function statusDist(entries) {
108
+ const dist = {};
109
+ for (const a of entries) dist[a.current_status] = (dist[a.current_status] ?? 0) + 1;
110
+ return dist;
111
+ }
@@ -34,6 +34,11 @@ export async function audit(root, { target, scope, baseUrl, refDate } = {}) {
34
34
  if (ctx.site?.fetchErrors?.length) {
35
35
  run.manifest.errors.push(...ctx.site.fetchErrors);
36
36
  }
37
+ if (ctx.site?.crawl?.truncated) {
38
+ run.manifest.incomplete_checks.push(
39
+ `URL collection reached the ${ctx.site.crawl.maxPages}-page limit with ${ctx.site.crawl.pendingUrlCount} discovered URL(s) pending; sitemap absence checks are incomplete.`
40
+ );
41
+ }
37
42
 
38
43
  const { findings, detectorsRun, detectorsSkipped, errors } = runDetectors(detectors, ctx);
39
44
  run.manifest.detectors_run = detectorsRun;
@@ -65,6 +70,7 @@ export async function audit(root, { target, scope, baseUrl, refDate } = {}) {
65
70
  target: run.manifest.target, scope: scope ?? 'all',
66
71
  registry_counts: Object.fromEntries(Object.entries(ctx.registries).map(([k, v]) => [k, v.entries.length])),
67
72
  pages_audited: ctx.site?.pages.length ?? 0,
73
+ crawl_coverage: ctx.site?.crawl ?? null,
68
74
  });
69
75
  run.writeArtifact('environment.json', {
70
76
  node: process.version, platform: process.platform, cwd: root,