@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,123 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+ import { execFileSync } from 'node:child_process';
5
+ import {
6
+ createDeploymentReceipt,
7
+ generateReleaseManifest,
8
+ initializeReleaseState,
9
+ transitionRelease,
10
+ validateReleaseManifest,
11
+ verifyManifestIntegrity,
12
+ verifyRepositoryBinding,
13
+ } from '../src/release/governance.js';
14
+ import { writeJson } from '../src/shared/io.js';
15
+
16
+ function read(file) {
17
+ return JSON.parse(fs.readFileSync(file, 'utf8'));
18
+ }
19
+
20
+ function generatedFiles(dir) {
21
+ const files = {};
22
+ for (const [name, key] of [['resource-data.json', 'release/resource-data.json'], ['llms.txt', 'release/llms.txt']]) {
23
+ const file = path.join(dir, name);
24
+ if (fs.existsSync(file)) files[key] = fs.readFileSync(file, 'utf8');
25
+ }
26
+ return files;
27
+ }
28
+
29
+ function requireArg(value, usage) {
30
+ if (!value) throw new Error(usage);
31
+ return value;
32
+ }
33
+
34
+ export function runReleaseGovernance(argv, root = process.cwd()) {
35
+ const [command, ...args] = argv;
36
+ if (command === 'manifest') {
37
+ const outputDir = path.resolve(requireArg(args[0], 'manifest requires <output-dir>'));
38
+ const commit = args[1];
39
+ const boundCommit = commit || execFileCommit(root);
40
+ const binding = verifyRepositoryBinding(root, boundCommit);
41
+ if (!binding.ok) throw new Error(`release source binding failed: ${binding.failures.join('; ')}`);
42
+ const result = generateReleaseManifest(root, { outputDir, commit: boundCommit });
43
+ return { command, output: path.join(outputDir, 'release-manifest.json'), manifest: result.manifest };
44
+ }
45
+ if (command === 'validate') {
46
+ const manifestFile = path.resolve(requireArg(args[0], 'validate requires <manifest-file>'));
47
+ const projectionDir = path.resolve(args[1] || path.dirname(manifestFile));
48
+ const manifest = read(manifestFile);
49
+ const binding = verifyRepositoryBinding(root, manifest.commit);
50
+ if (!binding.ok) throw new Error(`release source binding failed: ${binding.failures.join('; ')}`);
51
+ const result = validateReleaseManifest(root, manifest, generatedFiles(projectionDir));
52
+ if (!result.ok) throw new Error(`phase-one release validation failed: ${result.failures.join('; ')}`);
53
+ return { command, ok: true };
54
+ }
55
+ if (command === 'state-init') {
56
+ const manifestFile = path.resolve(requireArg(args[0], 'state-init requires <manifest-file> <output-file> <actor>'));
57
+ const outputFile = path.resolve(requireArg(args[1], 'state-init requires <manifest-file> <output-file> <actor>'));
58
+ const actor = requireArg(args[2], 'state-init requires <manifest-file> <output-file> <actor>');
59
+ const manifest = read(manifestFile);
60
+ const integrity = verifyManifestIntegrity(manifest);
61
+ if (!integrity.ok) throw new Error(`manifest integrity failed: ${integrity.failures.join('; ')}`);
62
+ const state = initializeReleaseState(manifest, { actor, maxDwellHours: Number(process.env.CITABLE_RELEASE_DWELL_HOURS || 24) });
63
+ writeJson(outputFile, state);
64
+ return { command, output: outputFile, state };
65
+ }
66
+ if (command === 'state-publish') {
67
+ const manifestFile = path.resolve(requireArg(args[0], 'state-publish requires <manifest-file> <state-file> <actor>'));
68
+ const stateFile = path.resolve(requireArg(args[1], 'state-publish requires <manifest-file> <state-file> <actor>'));
69
+ const actor = requireArg(args[2], 'state-publish requires <manifest-file> <state-file> <actor>');
70
+ const manifest = read(manifestFile);
71
+ const binding = verifyRepositoryBinding(root, manifest.commit);
72
+ if (!binding.ok) throw new Error(`release source binding failed: ${binding.failures.join('; ')}`);
73
+ const phaseOne = validateReleaseManifest(root, manifest, generatedFiles(path.dirname(manifestFile)));
74
+ if (!phaseOne.ok) throw new Error(`phase-one release validation failed: ${phaseOne.failures.join('; ')}`);
75
+ const state = transitionRelease(read(stateFile), 'published_unfinalized', { actor, reason: 'Immutable npm package and release references published.', phaseOne: { ok: true, manifest_hash: manifest.manifest_hash }, evidenceRefs: [manifest.manifest_hash, `https://www.npmjs.com/package/@nebulacomponents/citable/v/${manifest.version}`] });
76
+ writeJson(stateFile, state);
77
+ return { command, output: stateFile, state };
78
+ }
79
+ if (command === 'receipt') {
80
+ const manifestFile = path.resolve(requireArg(args[0], 'receipt requires <manifest-file> <observation-file> <output-file>'));
81
+ const observationFile = path.resolve(requireArg(args[1], 'receipt requires <manifest-file> <observation-file> <output-file>'));
82
+ const outputFile = path.resolve(requireArg(args[2], 'receipt requires <manifest-file> <observation-file> <output-file>'));
83
+ const receipt = createDeploymentReceipt(read(manifestFile), read(observationFile));
84
+ writeJson(outputFile, receipt);
85
+ return { command, output: outputFile, receipt };
86
+ }
87
+ if (command === 'state-finalize') {
88
+ const manifestFile = path.resolve(requireArg(args[0], 'state-finalize requires <manifest-file> <state-file> <actor> <receipt...>'));
89
+ const stateFile = path.resolve(requireArg(args[1], 'state-finalize requires <manifest-file> <state-file> <actor> <receipt...>'));
90
+ const actor = requireArg(args[2], 'state-finalize requires <manifest-file> <state-file> <actor> <receipt...>');
91
+ const receiptFiles = args.slice(3);
92
+ if (!receiptFiles.length) throw new Error('state-finalize requires at least one receipt');
93
+ const manifest = read(manifestFile);
94
+ const receipts = receiptFiles.map((file) => read(path.resolve(file)));
95
+ const state = transitionRelease(read(stateFile), 'finalized', { actor, reason: 'All required publisher-controlled surfaces verified.', manifest, receipts, evidenceRefs: receipts.map((item) => item.receipt_hash) });
96
+ writeJson(stateFile, state);
97
+ return { command, output: stateFile, state };
98
+ }
99
+ if (command === 'state-resolve') {
100
+ const stateFile = path.resolve(requireArg(args[0], 'state-resolve requires <state-file> <withdrawn|superseded> <actor> <reason> [superseding-release-id]'));
101
+ const to = requireArg(args[1], 'state-resolve requires a terminal state');
102
+ const actor = requireArg(args[2], 'state-resolve requires an actor');
103
+ const reason = requireArg(args[3], 'state-resolve requires a reason');
104
+ const state = transitionRelease(read(stateFile), to, { actor, reason, supersedingReleaseId: args[4] || null });
105
+ writeJson(stateFile, state);
106
+ return { command, output: stateFile, state };
107
+ }
108
+ throw new Error('usage: release-governance <manifest|validate|state-init|state-publish|receipt|state-finalize|state-resolve> ...');
109
+ }
110
+
111
+ function execFileCommit(root) {
112
+ return execFileSync('git', ['rev-parse', 'HEAD'], { cwd: root, encoding: 'utf8' }).trim();
113
+ }
114
+
115
+ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
116
+ try {
117
+ const result = runReleaseGovernance(process.argv.slice(2));
118
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
119
+ } catch (error) {
120
+ process.stderr.write(`release-governance: ${error.message}\n`);
121
+ process.exitCode = 1;
122
+ }
123
+ }
package/skill/SKILL.md CHANGED
@@ -7,7 +7,7 @@ description: >
7
7
  generative engine optimization, structured data governance, claim substantiation,
8
8
  crawler policy, entity consistency, content discoverability, or wants a site audited
9
9
  for how search and AI systems will retrieve, understand, cite, or recommend it.
10
- version: 1.12.0
10
+ version: 1.13.0
11
11
  ---
12
12
 
13
13
  # Citable — evidence and change control for search and AI citation readiness
@@ -97,6 +97,7 @@ citable action-plan [run-id] # ordered actions, blockers, semantic gate
97
97
  citable observe <mode> [options] # render/index/citation/log/passage/consensus/performance evidence
98
98
  citable observe bing --dataset <search_performance|ai_performance> --input <csv|json>
99
99
  citable observe render --target <url> [--interactions] [--resume-run <run-id>]
100
+ citable observe render --input <browser-evidence-plan.json>
100
101
  citable observe performance --target <url> --lighthouse [--repeat 1..5]
101
102
  citable apply --input <spec> [--write] # reviewed, hash-locked remediation; dry run by default
102
103
  citable monitor [runA runB] # observation regression alerts
@@ -120,6 +121,14 @@ citable reviews evaluate
120
121
  citable schedules run <schedule-id> [--ref-date YYYY-MM-DD]
121
122
  citable project github <run-id>
122
123
  citable observe media --input <manifest.json> [--ocr]
124
+ citable observe representation --input <release-manifest.json> --target <controlled-url>
125
+ citable corpus evaluate --input <acceptance-corpus.json>
126
+ citable corpus publish --input <acceptance-corpus.json> --output <public-corpus.json>
127
+ citable corpus receipt --run <run-id> [--input <execution-context.json>]
128
+ citable corpus compare-receipts <receipt-a.json> <receipt-b.json>
129
+ citable artifacts export <run-id> --output <directory>
130
+ citable artifacts verify --input <directory>
131
+ citable artifacts import --input <directory>
123
132
  ```
124
133
 
125
134
  Audit scopes: `technical seo aeo geo architecture entity claims evidence schema
@@ -164,6 +173,8 @@ operator data or future adapters.
164
173
  Use `commands/observe-and-act.md` for collector prerequisites, evidence labels,
165
174
  the controlled citation adapter protocol, remediation refusal conditions, and
166
175
  monitoring interpretation.
176
+ Use `commands/field-validation.md` for acceptance-corpus authorization,
177
+ sanitization, publication refusal, reproducibility, and evidence boundaries.
167
178
 
168
179
  ## Command workflows
169
180
 
@@ -34,8 +34,9 @@ intent, not executability, so statuses are strict:
34
34
  | /citable ingest, map-site, map-queries, map-prompts, map-entities, map-evidence | specified (ingest.md) |
35
35
  | /citable optimize-page | specified (optimize-page.md) — requires source-to-render mapping, claim-preserving rewrites, build execution, rollback; none of that is proven yet |
36
36
  | /citable create-page, answer-block, architect, interlink, consolidate, metadata | specified (page-work.md) |
37
- | /citable validate-render | partially implemented by `observe render`; desktop/mobile/JavaScript-disabled profiles and bounded interaction exploration are implemented, while cross-browser and application-specific journeys remain |
37
+ | /citable validate-render | partially implemented by `observe render`; fixed Chromium profiles and schema-validated Chromium/Firefox/WebKit journeys are implemented, while reviewed semantic-impact detectors and reusable application-specific journey libraries remain |
38
38
  | /citable measure seo/aeo/geo, test-prompts, monitor-crawlers, monitor-contradictions | partially implemented by metric/observation imports, objective evaluation, Google/CrUX live APIs, custom citation adapters, and monitor comparisons |
39
+ | `citable artifacts export/verify/import` | implemented — portable, versioned, checksum-bound run interchange without hosted-service authority |
39
40
 
40
41
  Shared refusal conditions (all commands): any action that would fabricate
41
42
  facts, citations, evidence, authorship, reviews, corroboration, or hidden
@@ -0,0 +1,28 @@
1
+ # Portable artifact interchange
2
+
3
+ Use artifact interchange to move one sealed Citable run between local or
4
+ external workspaces without changing its canonical bytes.
5
+
6
+ ```sh
7
+ citable artifacts export <run-id> --output <directory>
8
+ citable artifacts verify --input <directory>
9
+ citable artifacts import --input <directory>
10
+ ```
11
+
12
+ An export contains the original run package plus
13
+ `citable-artifact.json`. The versioned envelope binds the run identity,
14
+ exporter identity, source-run versions, manifest and checksum hashes, exact
15
+ artifact inventory, byte sizes, and a canonical package hash. Verification rejects missing,
16
+ additional, modified, unsafe, or symbolic-link entries. Import verifies into a
17
+ temporary directory before atomically creating `.citable/runs/<run-id>`.
18
+
19
+ Import never rewrites the run manifest, checksums, or artifacts. An identical
20
+ existing run is `already_present`; a different package with the same run ID is
21
+ a collision and fails closed. The interchange envelope is transport metadata
22
+ and is not copied into the canonical run package.
23
+
24
+ Checksums prove preservation after export. They do not prove that the source
25
+ was authentic, that external observations were representative or complete, or
26
+ that an intervention caused an outcome. Hosted tenancy, authentication,
27
+ storage, retention, billing, scheduling, and dashboards are outside this
28
+ contract.
@@ -0,0 +1,71 @@
1
+ # Field validation corpus
2
+
3
+ Use this workflow to assemble, evaluate, and publish an acceptance corpus. A
4
+ fixture-valid corpus is not field evidence. Do not describe a corpus as real,
5
+ representative, accurate, or public until the corresponding records and reviews
6
+ exist.
7
+
8
+ ## Preconditions
9
+
10
+ For every property, record:
11
+
12
+ - architecture and property class;
13
+ - owner authorization for collection, retention, review, and the intended
14
+ publication level;
15
+ - collection methods, authority labels, timestamps, and limitations;
16
+ - unavailable evidence, intentional incompleteness, and contradictions;
17
+ - publication approval, retention, and the exact artifact-reference allowlist;
18
+ - human sanitization review covering personal data, credentials, and source
19
+ identifiers.
20
+
21
+ Every execution must reference raw artifacts, deterministic and heuristic
22
+ findings, reviewer assignments, disagreements, exceptions, interventions,
23
+ verification, and its reproducibility receipt where available. Empty reference
24
+ arrays are valid only where that class of evidence did not occur.
25
+
26
+ ## Evaluate
27
+
28
+ ```sh
29
+ citable corpus evaluate --input acceptance-corpus.json
30
+ ```
31
+
32
+ Evaluation validates the v2 contract and writes `accuracy-metrics.json` plus a
33
+ human-readable `accuracy-metrics.md` projection from the same hash-bound data.
34
+ Every reported metric discloses its numerator, denominator, population,
35
+ exclusions, and confidence limits. Sample and census designs remain distinct,
36
+ and detector versions are reported as separate cohorts. Evaluation does not
37
+ authorize publication. Unknown false negatives remain unknown; discovered
38
+ false-negative rates apply only to adjudicated expected detections in the
39
+ disclosed population.
40
+
41
+ ## Publish
42
+
43
+ ```sh
44
+ citable corpus publish \
45
+ --input acceptance-corpus.json \
46
+ --output public-corpus.json
47
+ ```
48
+
49
+ Publication fails closed when any property is private or aggregate-only, owner
50
+ authority is expired or incomplete, sanitization review is incomplete, an
51
+ artifact reference is unsafe or outside the allowlist, sensitive patterns are
52
+ detected, or the output already exists. It emits the public corpus, a hash-bound
53
+ publisher-controlled receipt, and an immutable local evidence package.
54
+
55
+ Automated checks supplement but do not replace human sanitization review. The
56
+ receipt is owner-authorized publication evidence, not independent attestation.
57
+ Never publish production credentials, customer data, private property artifacts,
58
+ or evidence outside the exact approved scope.
59
+
60
+ ## Reproducibility
61
+
62
+ Create one receipt per sealed acceptance run, then compare repeated envelopes:
63
+
64
+ ```sh
65
+ citable corpus receipt --run <run-id> --input execution-context.json
66
+ citable corpus compare-receipts <receipt-a.json> <receipt-b.json>
67
+ ```
68
+
69
+ Treat fingerprint equality as bounded equality of declared inputs, methods,
70
+ tools, external-system versions, and artifacts. It does not establish causation
71
+ or performance on untested properties.
@@ -14,6 +14,11 @@ failure_behaviour: unavailable dependency, credential, source run, reviewer, exa
14
14
  disclosure, inactive-tab, and load-more-like controls; it does not prove an
15
15
  application-specific journey. `--resume-run` reuses only successful profile
16
16
  observations from the named immutable run and recollects failed/absent ones.
17
+ `observe render --input <browser-evidence-plan.json>` executes an
18
+ explicit Chromium, Firefox, or WebKit profile matrix. Each plan records the
19
+ browser version, device, JavaScript, locale, consent, authentication state,
20
+ and ordered interaction steps. Fill/select values are referenced by
21
+ environment-variable name and are never written to the plan or artifacts.
17
22
  - `observe index --input <JSON>` imports owner exports. With `--target`,
18
23
  `--site-url`, and `GSC_ACCESS_TOKEN`, it calls Google URL Inspection, which
19
24
  reports the indexed version rather than performing a live indexability test.
@@ -9,7 +9,7 @@ not a prediction of citation or recommendation. Report every row as
9
9
  | State | Current evidence boundary |
10
10
  | --- | --- |
11
11
  | Retrieval eligibility | Static policy plus captured synthetic HTTP response; crawler identity remains simulated unless verified logs/IP evidence are supplied |
12
- | Source extraction and support suitability | Initial HTML plus registries/detectors/rubrics; optional Chromium profiles can establish bounded raw/desktop/mobile/JavaScript-disabled parity, while cross-browser and application-specific journeys remain unproven |
12
+ | Source extraction and support suitability | Initial HTML plus registries/detectors/rubrics; optional fixed Chromium profiles and explicit Chromium/Firefox/WebKit journey plans establish bounded artifact-level parity, while semantic impact remains unproven |
13
13
  | Observed citation behavior | Operator-supplied prompt-result observations only; report cohort size and property citation presence, never infer from readiness |
14
14
 
15
15
  ## AEO checks
@@ -10,6 +10,7 @@ Use the narrowest supported state. Never promote evidence across rows.
10
10
  | Observed in production logs | Imported evidence | Timestamped `observe logs` artifact with URL, status, bytes, latency, cache result, UA, and verification result |
11
11
  | Indexed | Google API or imported evidence | `observe index`; Google inspection covers the indexed version, other engines require owner exports |
12
12
  | Rendered profile observed | Optional local browser evidence | Successful profile-specific Chromium DOM, text, screenshot, failed requests, interactions, viewport, and configuration; failed profiles remain independent |
13
+ | Browser journey observed | Schema-validated local browser plan | Engine/version, device, JavaScript, locale, consent, authentication declaration, steps, DOM, text, accessibility snapshot, screenshots, and failures remain separate; differences do not establish semantic or citation impact |
13
14
  | Render parity compared | Bounded local comparison | Raw/desktop and mobile/desktop word ratios from the same run or explicitly resumed immutable profiles; not semantic equivalence |
14
15
  | Returned by retrieval | Operator supplied | Provider observation containing retrieved source URL |
15
16
  | Cited | Import or disclosed adapter | Complete `observe citations` answer with citation URL and product/adapter mode |
@@ -0,0 +1,180 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { canonicalJson } from '../release/governance.js';
4
+ import { nowIso, readJson, sha256, sha256File, writeJson } from '../shared/io.js';
5
+ import { validateAgainst } from '../shared/schemaValidator.js';
6
+
7
+ const INCLUDED_FIELDS = [
8
+ 'property.target', 'property.source_commit', 'property.content_hashes',
9
+ 'detectors', 'configuration.hash', 'observation_method', 'toolchain',
10
+ 'external_systems', 'canonical_artifacts', 'execution.status',
11
+ 'execution.unavailable_observations', 'execution.errors',
12
+ ];
13
+
14
+ const EXCLUDED_FIELDS = [
15
+ 'run_id', 'execution.started_at', 'execution.receipt_created_at',
16
+ 'execution.locale', 'execution.region', 'property.working_tree_state',
17
+ 'host identity', 'filesystem paths', 'runtime duration', 'memory consumption',
18
+ ];
19
+
20
+ function sortedObject(value = {}) {
21
+ return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)));
22
+ }
23
+
24
+ function normalizedArguments(argv = []) {
25
+ const pathFlags = new Set(['--target', '--input', '--resume-run']);
26
+ const normalized = [];
27
+ for (let index = 0; index < argv.length; index += 1) {
28
+ const value = String(argv[index]);
29
+ normalized.push(value);
30
+ if (pathFlags.has(value) && index + 1 < argv.length) {
31
+ normalized.push('<excluded-path-or-run>');
32
+ index += 1;
33
+ } else if (path.isAbsolute(value)) {
34
+ normalized[normalized.length - 1] = '<excluded-path>';
35
+ }
36
+ }
37
+ return normalized;
38
+ }
39
+
40
+ function verifyRunPackage(runDir, manifest) {
41
+ const manifestCheck = validateAgainst('run.schema.json', manifest);
42
+ if (!manifestCheck.valid) throw new Error(`run manifest violates contract: ${manifestCheck.errors.join('; ')}`);
43
+ const checksumsFile = path.join(runDir, 'checksums.json');
44
+ if (!fs.existsSync(checksumsFile)) throw new Error(`run ${manifest.run_id} has no checksums.json`);
45
+ const checksums = readJson(checksumsFile);
46
+ if (!checksums || Array.isArray(checksums) || typeof checksums !== 'object') throw new Error('run checksums must be an object');
47
+ const failures = [];
48
+ for (const [relative, expected] of Object.entries(checksums)) {
49
+ const file = path.resolve(runDir, relative);
50
+ if (path.isAbsolute(relative) || (!file.startsWith(`${path.resolve(runDir)}${path.sep}`))) failures.push(`${relative} escapes the run package`);
51
+ else if (!/^[a-f0-9]{64}$/.test(expected)) failures.push(`${relative} has an invalid checksum`);
52
+ else if (!fs.existsSync(file)) failures.push(`${relative} is missing`);
53
+ else if (sha256File(file) !== expected) failures.push(`${relative} checksum differs`);
54
+ }
55
+ if (failures.length) throw new Error(`run package integrity failed: ${failures.join('; ')}`);
56
+ return checksums;
57
+ }
58
+
59
+ function fingerprintPayload(receipt) {
60
+ return {
61
+ property: { target: receipt.property.target, source_commit: receipt.property.source_commit, content_hashes: receipt.property.content_hashes },
62
+ detectors: receipt.detectors,
63
+ configuration: receipt.configuration,
64
+ observation_method: receipt.observation_method,
65
+ toolchain: receipt.toolchain,
66
+ external_systems: receipt.external_systems,
67
+ canonical_artifacts: receipt.canonical_artifacts,
68
+ execution: { status: receipt.execution.status, unavailable_observations: receipt.execution.unavailable_observations, errors: receipt.execution.errors },
69
+ };
70
+ }
71
+
72
+ export function createAcceptanceReceipt(root, { runId, context = {}, createdAt = nowIso() }) {
73
+ if (!runId) throw new Error('corpus receipt requires --run <run-id>');
74
+ const contextCheck = validateAgainst('acceptance-run-context.schema.json', context);
75
+ if (!contextCheck.valid) throw new Error(`acceptance context violates contract: ${contextCheck.errors.join('; ')}`);
76
+ const runDir = path.join(root, '.citable', 'runs', runId);
77
+ const manifestFile = path.join(runDir, 'manifest.json');
78
+ if (!fs.existsSync(manifestFile)) throw new Error(`run ${runId} not found`);
79
+ const manifest = readJson(manifestFile);
80
+ if (manifest.run_id !== runId) throw new Error(`run manifest id ${manifest.run_id} does not match requested run ${runId}`);
81
+ const checksums = verifyRunPackage(runDir, manifest);
82
+ const canonicalArtifacts = sortedObject(Object.fromEntries(
83
+ Object.entries(checksums).filter(([name]) => name !== 'manifest.json'),
84
+ ));
85
+ const unavailable = [...new Set([...(manifest.incomplete_checks || []), ...(context.unavailable_observations || [])])].sort();
86
+ const receipt = {
87
+ schema_version: 1,
88
+ receipt_id: `ACCEPTANCE-RECEIPT-${sha256(`${runId}:${createdAt}`).slice(0, 20).toUpperCase()}`,
89
+ run_id: runId,
90
+ property: {
91
+ target: manifest.target || {},
92
+ source_commit: context.source_commit ?? manifest.repository_commit ?? null,
93
+ working_tree_state: manifest.working_tree_state ?? null,
94
+ content_hashes: sortedObject({ ...(manifest.input_hashes || {}), ...(context.content_hashes || {}) }),
95
+ },
96
+ detectors: {
97
+ run: [...(manifest.detectors_run || [])].sort(),
98
+ skipped: [...(manifest.detectors_skipped || [])].sort((a, b) => a.detector_id.localeCompare(b.detector_id)),
99
+ },
100
+ configuration: { hash: manifest.configuration_hash ?? null },
101
+ observation_method: {
102
+ command: manifest.command,
103
+ arguments: normalizedArguments(manifest.argv || []),
104
+ target_kind: manifest.target?.kind ?? null,
105
+ collectors: sortedObject(context.collectors || {}),
106
+ },
107
+ toolchain: {
108
+ citable_version: manifest.tool_version,
109
+ skill_version: manifest.skill_version,
110
+ node_version: context.node_version || process.version,
111
+ },
112
+ external_systems: sortedObject(context.external_systems || {}),
113
+ execution: {
114
+ started_at: manifest.timestamp,
115
+ receipt_created_at: createdAt,
116
+ locale: context.locale || manifest.locale || 'und',
117
+ region: context.region ?? null,
118
+ status: manifest.status,
119
+ partial: manifest.status !== 'completed' || unavailable.length > 0 || (manifest.errors || []).length > 0,
120
+ unavailable_observations: unavailable,
121
+ errors: [...(manifest.errors || [])],
122
+ },
123
+ canonical_artifacts: canonicalArtifacts,
124
+ reproducibility: { fingerprint: '', included_fields: INCLUDED_FIELDS, excluded_environment_fields: EXCLUDED_FIELDS },
125
+ limitations: [
126
+ 'Fingerprint equality establishes only equality of the declared canonical inputs, methods, tools, external-system versions, and artifacts.',
127
+ 'Locale, region, timestamps, host identity, runtime, memory, and filesystem paths are execution context and are excluded from fingerprint equality.',
128
+ ],
129
+ };
130
+ receipt.reproducibility.fingerprint = sha256(canonicalJson(fingerprintPayload(receipt)));
131
+ receipt.receipt_hash = sha256(canonicalJson(receipt));
132
+ const check = validateAgainst('acceptance-run-receipt.schema.json', receipt);
133
+ if (!check.valid) throw new Error(`acceptance receipt violates contract: ${check.errors.join('; ')}`);
134
+ const output = path.join(root, '.citable', 'corpus', 'receipts', `${receipt.receipt_id}.json`);
135
+ writeJson(output, receipt);
136
+ return { receipt, output };
137
+ }
138
+
139
+ export function verifyAcceptanceReceipt(receipt) {
140
+ const check = validateAgainst('acceptance-run-receipt.schema.json', receipt);
141
+ const failures = check.valid ? [] : [...check.errors];
142
+ const { receipt_hash: ignored, ...unsigned } = receipt;
143
+ if (receipt.receipt_hash !== sha256(canonicalJson(unsigned))) failures.push('receipt hash is inconsistent');
144
+ if (receipt.reproducibility?.fingerprint !== sha256(canonicalJson(fingerprintPayload(receipt)))) failures.push('reproducibility fingerprint is inconsistent');
145
+ return { valid: failures.length === 0, failures };
146
+ }
147
+
148
+ function changed(left, right) {
149
+ return canonicalJson(left) !== canonicalJson(right);
150
+ }
151
+
152
+ export function compareAcceptanceReceipts(left, right) {
153
+ const leftCheck = verifyAcceptanceReceipt(left);
154
+ const rightCheck = verifyAcceptanceReceipt(right);
155
+ if (!leftCheck.valid || !rightCheck.valid) throw new Error(`acceptance receipt integrity failed: ${[...leftCheck.failures, ...rightCheck.failures].join('; ')}`);
156
+ const dimensions = {
157
+ property_changed: changed({ target: left.property.target, source_commit: left.property.source_commit, content_hashes: left.property.content_hashes }, { target: right.property.target, source_commit: right.property.source_commit, content_hashes: right.property.content_hashes }),
158
+ detector_changed: changed(left.detectors, right.detectors),
159
+ configuration_changed: changed(left.configuration, right.configuration),
160
+ observation_method_changed: changed(left.observation_method, right.observation_method),
161
+ tool_changed: changed(left.toolchain, right.toolchain),
162
+ external_system_changed: changed(left.external_systems, right.external_systems),
163
+ };
164
+ const canonicalArtifactsChanged = changed(left.canonical_artifacts, right.canonical_artifacts);
165
+ return {
166
+ receipt_a: left.receipt_id,
167
+ receipt_b: right.receipt_id,
168
+ fingerprint_equal: left.reproducibility.fingerprint === right.reproducibility.fingerprint,
169
+ canonical_artifacts_changed: canonicalArtifactsChanged,
170
+ change_dimensions: dimensions,
171
+ partial_runs: [left, right].filter((item) => item.execution.partial).map((item) => ({ receipt_id: item.receipt_id, status: item.execution.status, unavailable_observations: item.execution.unavailable_observations, errors: item.execution.errors })),
172
+ comparable: !Object.values(dimensions).some(Boolean),
173
+ limitation: 'Comparability identifies declared envelope differences. It does not establish causation, external-system stability, or performance on untested properties.',
174
+ };
175
+ }
176
+
177
+ export function readAndCompareAcceptanceReceipts(leftFile, rightFile) {
178
+ if (!leftFile || !rightFile) throw new Error('corpus compare-receipts requires two receipt files');
179
+ return compareAcceptanceReceipts(readJson(leftFile), readJson(rightFile));
180
+ }