@nebulacomponents/citable 1.1.0 → 1.3.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 (248) hide show
  1. package/CHANGELOG.md +40 -1
  2. package/README.md +14 -2
  3. package/dist/universal/.agents/skills/citable/SKILL.md +49 -1
  4. package/dist/universal/.agents/skills/citable/VERSION +1 -1
  5. package/dist/universal/.agents/skills/citable/commands/README.md +1 -0
  6. package/dist/universal/.agents/skills/citable/commands/action-findings.md +37 -0
  7. package/dist/universal/.agents/skills/citable/manifest.json +20 -16
  8. package/dist/universal/.agents/skills/citable/references/aeo-geo-validation.md +50 -0
  9. package/dist/universal/.agents/skills/citable/references/capability-boundaries.md +34 -0
  10. package/dist/universal/.agents/skills/citable/schemas/action-plan.schema.json +55 -0
  11. package/dist/universal/.agents/skills/citable/schemas/claim.schema.json +2 -0
  12. package/dist/universal/.agents/skills/citable/schemas/common.defs.json +2 -0
  13. package/dist/universal/.agents/skills/citable/schemas/competitor.schema.json +1 -0
  14. package/dist/universal/.agents/skills/citable/schemas/crawler.schema.json +1 -0
  15. package/dist/universal/.agents/skills/citable/schemas/entity.schema.json +2 -1
  16. package/dist/universal/.agents/skills/citable/schemas/evidence.schema.json +1 -0
  17. package/dist/universal/.agents/skills/citable/schemas/experiment.schema.json +1 -0
  18. package/dist/universal/.agents/skills/citable/schemas/page.schema.json +1 -0
  19. package/dist/universal/.agents/skills/citable/schemas/prompt.schema.json +1 -0
  20. package/dist/universal/.agents/skills/citable/schemas/query.schema.json +1 -0
  21. package/dist/universal/.claude/skills/citable/SKILL.md +49 -1
  22. package/dist/universal/.claude/skills/citable/VERSION +1 -1
  23. package/dist/universal/.claude/skills/citable/commands/README.md +1 -0
  24. package/dist/universal/.claude/skills/citable/commands/action-findings.md +37 -0
  25. package/dist/universal/.claude/skills/citable/manifest.json +20 -16
  26. package/dist/universal/.claude/skills/citable/references/aeo-geo-validation.md +50 -0
  27. package/dist/universal/.claude/skills/citable/references/capability-boundaries.md +34 -0
  28. package/dist/universal/.claude/skills/citable/schemas/action-plan.schema.json +55 -0
  29. package/dist/universal/.claude/skills/citable/schemas/claim.schema.json +2 -0
  30. package/dist/universal/.claude/skills/citable/schemas/common.defs.json +2 -0
  31. package/dist/universal/.claude/skills/citable/schemas/competitor.schema.json +1 -0
  32. package/dist/universal/.claude/skills/citable/schemas/crawler.schema.json +1 -0
  33. package/dist/universal/.claude/skills/citable/schemas/entity.schema.json +2 -1
  34. package/dist/universal/.claude/skills/citable/schemas/evidence.schema.json +1 -0
  35. package/dist/universal/.claude/skills/citable/schemas/experiment.schema.json +1 -0
  36. package/dist/universal/.claude/skills/citable/schemas/page.schema.json +1 -0
  37. package/dist/universal/.claude/skills/citable/schemas/prompt.schema.json +1 -0
  38. package/dist/universal/.claude/skills/citable/schemas/query.schema.json +1 -0
  39. package/dist/universal/.cursor/skills/citable/SKILL.md +49 -1
  40. package/dist/universal/.cursor/skills/citable/VERSION +1 -1
  41. package/dist/universal/.cursor/skills/citable/commands/README.md +1 -0
  42. package/dist/universal/.cursor/skills/citable/commands/action-findings.md +37 -0
  43. package/dist/universal/.cursor/skills/citable/manifest.json +20 -16
  44. package/dist/universal/.cursor/skills/citable/references/aeo-geo-validation.md +50 -0
  45. package/dist/universal/.cursor/skills/citable/references/capability-boundaries.md +34 -0
  46. package/dist/universal/.cursor/skills/citable/schemas/action-plan.schema.json +55 -0
  47. package/dist/universal/.cursor/skills/citable/schemas/claim.schema.json +2 -0
  48. package/dist/universal/.cursor/skills/citable/schemas/common.defs.json +2 -0
  49. package/dist/universal/.cursor/skills/citable/schemas/competitor.schema.json +1 -0
  50. package/dist/universal/.cursor/skills/citable/schemas/crawler.schema.json +1 -0
  51. package/dist/universal/.cursor/skills/citable/schemas/entity.schema.json +2 -1
  52. package/dist/universal/.cursor/skills/citable/schemas/evidence.schema.json +1 -0
  53. package/dist/universal/.cursor/skills/citable/schemas/experiment.schema.json +1 -0
  54. package/dist/universal/.cursor/skills/citable/schemas/page.schema.json +1 -0
  55. package/dist/universal/.cursor/skills/citable/schemas/prompt.schema.json +1 -0
  56. package/dist/universal/.cursor/skills/citable/schemas/query.schema.json +1 -0
  57. package/dist/universal/.gemini/skills/citable/SKILL.md +49 -1
  58. package/dist/universal/.gemini/skills/citable/VERSION +1 -1
  59. package/dist/universal/.gemini/skills/citable/commands/README.md +1 -0
  60. package/dist/universal/.gemini/skills/citable/commands/action-findings.md +37 -0
  61. package/dist/universal/.gemini/skills/citable/manifest.json +20 -16
  62. package/dist/universal/.gemini/skills/citable/references/aeo-geo-validation.md +50 -0
  63. package/dist/universal/.gemini/skills/citable/references/capability-boundaries.md +34 -0
  64. package/dist/universal/.gemini/skills/citable/schemas/action-plan.schema.json +55 -0
  65. package/dist/universal/.gemini/skills/citable/schemas/claim.schema.json +2 -0
  66. package/dist/universal/.gemini/skills/citable/schemas/common.defs.json +2 -0
  67. package/dist/universal/.gemini/skills/citable/schemas/competitor.schema.json +1 -0
  68. package/dist/universal/.gemini/skills/citable/schemas/crawler.schema.json +1 -0
  69. package/dist/universal/.gemini/skills/citable/schemas/entity.schema.json +2 -1
  70. package/dist/universal/.gemini/skills/citable/schemas/evidence.schema.json +1 -0
  71. package/dist/universal/.gemini/skills/citable/schemas/experiment.schema.json +1 -0
  72. package/dist/universal/.gemini/skills/citable/schemas/page.schema.json +1 -0
  73. package/dist/universal/.gemini/skills/citable/schemas/prompt.schema.json +1 -0
  74. package/dist/universal/.gemini/skills/citable/schemas/query.schema.json +1 -0
  75. package/dist/universal/.github/skills/citable/SKILL.md +49 -1
  76. package/dist/universal/.github/skills/citable/VERSION +1 -1
  77. package/dist/universal/.github/skills/citable/commands/README.md +1 -0
  78. package/dist/universal/.github/skills/citable/commands/action-findings.md +37 -0
  79. package/dist/universal/.github/skills/citable/manifest.json +20 -16
  80. package/dist/universal/.github/skills/citable/references/aeo-geo-validation.md +50 -0
  81. package/dist/universal/.github/skills/citable/references/capability-boundaries.md +34 -0
  82. package/dist/universal/.github/skills/citable/schemas/action-plan.schema.json +55 -0
  83. package/dist/universal/.github/skills/citable/schemas/claim.schema.json +2 -0
  84. package/dist/universal/.github/skills/citable/schemas/common.defs.json +2 -0
  85. package/dist/universal/.github/skills/citable/schemas/competitor.schema.json +1 -0
  86. package/dist/universal/.github/skills/citable/schemas/crawler.schema.json +1 -0
  87. package/dist/universal/.github/skills/citable/schemas/entity.schema.json +2 -1
  88. package/dist/universal/.github/skills/citable/schemas/evidence.schema.json +1 -0
  89. package/dist/universal/.github/skills/citable/schemas/experiment.schema.json +1 -0
  90. package/dist/universal/.github/skills/citable/schemas/page.schema.json +1 -0
  91. package/dist/universal/.github/skills/citable/schemas/prompt.schema.json +1 -0
  92. package/dist/universal/.github/skills/citable/schemas/query.schema.json +1 -0
  93. package/dist/universal/.kiro/skills/citable/SKILL.md +49 -1
  94. package/dist/universal/.kiro/skills/citable/VERSION +1 -1
  95. package/dist/universal/.kiro/skills/citable/commands/README.md +1 -0
  96. package/dist/universal/.kiro/skills/citable/commands/action-findings.md +37 -0
  97. package/dist/universal/.kiro/skills/citable/manifest.json +20 -16
  98. package/dist/universal/.kiro/skills/citable/references/aeo-geo-validation.md +50 -0
  99. package/dist/universal/.kiro/skills/citable/references/capability-boundaries.md +34 -0
  100. package/dist/universal/.kiro/skills/citable/schemas/action-plan.schema.json +55 -0
  101. package/dist/universal/.kiro/skills/citable/schemas/claim.schema.json +2 -0
  102. package/dist/universal/.kiro/skills/citable/schemas/common.defs.json +2 -0
  103. package/dist/universal/.kiro/skills/citable/schemas/competitor.schema.json +1 -0
  104. package/dist/universal/.kiro/skills/citable/schemas/crawler.schema.json +1 -0
  105. package/dist/universal/.kiro/skills/citable/schemas/entity.schema.json +2 -1
  106. package/dist/universal/.kiro/skills/citable/schemas/evidence.schema.json +1 -0
  107. package/dist/universal/.kiro/skills/citable/schemas/experiment.schema.json +1 -0
  108. package/dist/universal/.kiro/skills/citable/schemas/page.schema.json +1 -0
  109. package/dist/universal/.kiro/skills/citable/schemas/prompt.schema.json +1 -0
  110. package/dist/universal/.kiro/skills/citable/schemas/query.schema.json +1 -0
  111. package/dist/universal/.opencode/skills/citable/SKILL.md +49 -1
  112. package/dist/universal/.opencode/skills/citable/VERSION +1 -1
  113. package/dist/universal/.opencode/skills/citable/commands/README.md +1 -0
  114. package/dist/universal/.opencode/skills/citable/commands/action-findings.md +37 -0
  115. package/dist/universal/.opencode/skills/citable/manifest.json +20 -16
  116. package/dist/universal/.opencode/skills/citable/references/aeo-geo-validation.md +50 -0
  117. package/dist/universal/.opencode/skills/citable/references/capability-boundaries.md +34 -0
  118. package/dist/universal/.opencode/skills/citable/schemas/action-plan.schema.json +55 -0
  119. package/dist/universal/.opencode/skills/citable/schemas/claim.schema.json +2 -0
  120. package/dist/universal/.opencode/skills/citable/schemas/common.defs.json +2 -0
  121. package/dist/universal/.opencode/skills/citable/schemas/competitor.schema.json +1 -0
  122. package/dist/universal/.opencode/skills/citable/schemas/crawler.schema.json +1 -0
  123. package/dist/universal/.opencode/skills/citable/schemas/entity.schema.json +2 -1
  124. package/dist/universal/.opencode/skills/citable/schemas/evidence.schema.json +1 -0
  125. package/dist/universal/.opencode/skills/citable/schemas/experiment.schema.json +1 -0
  126. package/dist/universal/.opencode/skills/citable/schemas/page.schema.json +1 -0
  127. package/dist/universal/.opencode/skills/citable/schemas/prompt.schema.json +1 -0
  128. package/dist/universal/.opencode/skills/citable/schemas/query.schema.json +1 -0
  129. package/dist/universal/.pi/agent/skills/citable/SKILL.md +49 -1
  130. package/dist/universal/.pi/agent/skills/citable/VERSION +1 -1
  131. package/dist/universal/.pi/agent/skills/citable/commands/README.md +1 -0
  132. package/dist/universal/.pi/agent/skills/citable/commands/action-findings.md +37 -0
  133. package/dist/universal/.pi/agent/skills/citable/manifest.json +20 -16
  134. package/dist/universal/.pi/agent/skills/citable/references/aeo-geo-validation.md +50 -0
  135. package/dist/universal/.pi/agent/skills/citable/references/capability-boundaries.md +34 -0
  136. package/dist/universal/.pi/agent/skills/citable/schemas/action-plan.schema.json +55 -0
  137. package/dist/universal/.pi/agent/skills/citable/schemas/claim.schema.json +2 -0
  138. package/dist/universal/.pi/agent/skills/citable/schemas/common.defs.json +2 -0
  139. package/dist/universal/.pi/agent/skills/citable/schemas/competitor.schema.json +1 -0
  140. package/dist/universal/.pi/agent/skills/citable/schemas/crawler.schema.json +1 -0
  141. package/dist/universal/.pi/agent/skills/citable/schemas/entity.schema.json +2 -1
  142. package/dist/universal/.pi/agent/skills/citable/schemas/evidence.schema.json +1 -0
  143. package/dist/universal/.pi/agent/skills/citable/schemas/experiment.schema.json +1 -0
  144. package/dist/universal/.pi/agent/skills/citable/schemas/page.schema.json +1 -0
  145. package/dist/universal/.pi/agent/skills/citable/schemas/prompt.schema.json +1 -0
  146. package/dist/universal/.pi/agent/skills/citable/schemas/query.schema.json +1 -0
  147. package/dist/universal/.qoder/skills/citable/SKILL.md +49 -1
  148. package/dist/universal/.qoder/skills/citable/VERSION +1 -1
  149. package/dist/universal/.qoder/skills/citable/commands/README.md +1 -0
  150. package/dist/universal/.qoder/skills/citable/commands/action-findings.md +37 -0
  151. package/dist/universal/.qoder/skills/citable/manifest.json +20 -16
  152. package/dist/universal/.qoder/skills/citable/references/aeo-geo-validation.md +50 -0
  153. package/dist/universal/.qoder/skills/citable/references/capability-boundaries.md +34 -0
  154. package/dist/universal/.qoder/skills/citable/schemas/action-plan.schema.json +55 -0
  155. package/dist/universal/.qoder/skills/citable/schemas/claim.schema.json +2 -0
  156. package/dist/universal/.qoder/skills/citable/schemas/common.defs.json +2 -0
  157. package/dist/universal/.qoder/skills/citable/schemas/competitor.schema.json +1 -0
  158. package/dist/universal/.qoder/skills/citable/schemas/crawler.schema.json +1 -0
  159. package/dist/universal/.qoder/skills/citable/schemas/entity.schema.json +2 -1
  160. package/dist/universal/.qoder/skills/citable/schemas/evidence.schema.json +1 -0
  161. package/dist/universal/.qoder/skills/citable/schemas/experiment.schema.json +1 -0
  162. package/dist/universal/.qoder/skills/citable/schemas/page.schema.json +1 -0
  163. package/dist/universal/.qoder/skills/citable/schemas/prompt.schema.json +1 -0
  164. package/dist/universal/.qoder/skills/citable/schemas/query.schema.json +1 -0
  165. package/dist/universal/.rovodev/skills/citable/SKILL.md +49 -1
  166. package/dist/universal/.rovodev/skills/citable/VERSION +1 -1
  167. package/dist/universal/.rovodev/skills/citable/commands/README.md +1 -0
  168. package/dist/universal/.rovodev/skills/citable/commands/action-findings.md +37 -0
  169. package/dist/universal/.rovodev/skills/citable/manifest.json +20 -16
  170. package/dist/universal/.rovodev/skills/citable/references/aeo-geo-validation.md +50 -0
  171. package/dist/universal/.rovodev/skills/citable/references/capability-boundaries.md +34 -0
  172. package/dist/universal/.rovodev/skills/citable/schemas/action-plan.schema.json +55 -0
  173. package/dist/universal/.rovodev/skills/citable/schemas/claim.schema.json +2 -0
  174. package/dist/universal/.rovodev/skills/citable/schemas/common.defs.json +2 -0
  175. package/dist/universal/.rovodev/skills/citable/schemas/competitor.schema.json +1 -0
  176. package/dist/universal/.rovodev/skills/citable/schemas/crawler.schema.json +1 -0
  177. package/dist/universal/.rovodev/skills/citable/schemas/entity.schema.json +2 -1
  178. package/dist/universal/.rovodev/skills/citable/schemas/evidence.schema.json +1 -0
  179. package/dist/universal/.rovodev/skills/citable/schemas/experiment.schema.json +1 -0
  180. package/dist/universal/.rovodev/skills/citable/schemas/page.schema.json +1 -0
  181. package/dist/universal/.rovodev/skills/citable/schemas/prompt.schema.json +1 -0
  182. package/dist/universal/.rovodev/skills/citable/schemas/query.schema.json +1 -0
  183. package/dist/universal/.trae/skills/citable/SKILL.md +49 -1
  184. package/dist/universal/.trae/skills/citable/VERSION +1 -1
  185. package/dist/universal/.trae/skills/citable/commands/README.md +1 -0
  186. package/dist/universal/.trae/skills/citable/commands/action-findings.md +37 -0
  187. package/dist/universal/.trae/skills/citable/manifest.json +20 -16
  188. package/dist/universal/.trae/skills/citable/references/aeo-geo-validation.md +50 -0
  189. package/dist/universal/.trae/skills/citable/references/capability-boundaries.md +34 -0
  190. package/dist/universal/.trae/skills/citable/schemas/action-plan.schema.json +55 -0
  191. package/dist/universal/.trae/skills/citable/schemas/claim.schema.json +2 -0
  192. package/dist/universal/.trae/skills/citable/schemas/common.defs.json +2 -0
  193. package/dist/universal/.trae/skills/citable/schemas/competitor.schema.json +1 -0
  194. package/dist/universal/.trae/skills/citable/schemas/crawler.schema.json +1 -0
  195. package/dist/universal/.trae/skills/citable/schemas/entity.schema.json +2 -1
  196. package/dist/universal/.trae/skills/citable/schemas/evidence.schema.json +1 -0
  197. package/dist/universal/.trae/skills/citable/schemas/experiment.schema.json +1 -0
  198. package/dist/universal/.trae/skills/citable/schemas/page.schema.json +1 -0
  199. package/dist/universal/.trae/skills/citable/schemas/prompt.schema.json +1 -0
  200. package/dist/universal/.trae/skills/citable/schemas/query.schema.json +1 -0
  201. package/dist/universal/.trae-cn/skills/citable/SKILL.md +49 -1
  202. package/dist/universal/.trae-cn/skills/citable/VERSION +1 -1
  203. package/dist/universal/.trae-cn/skills/citable/commands/README.md +1 -0
  204. package/dist/universal/.trae-cn/skills/citable/commands/action-findings.md +37 -0
  205. package/dist/universal/.trae-cn/skills/citable/manifest.json +20 -16
  206. package/dist/universal/.trae-cn/skills/citable/references/aeo-geo-validation.md +50 -0
  207. package/dist/universal/.trae-cn/skills/citable/references/capability-boundaries.md +34 -0
  208. package/dist/universal/.trae-cn/skills/citable/schemas/action-plan.schema.json +55 -0
  209. package/dist/universal/.trae-cn/skills/citable/schemas/claim.schema.json +2 -0
  210. package/dist/universal/.trae-cn/skills/citable/schemas/common.defs.json +2 -0
  211. package/dist/universal/.trae-cn/skills/citable/schemas/competitor.schema.json +1 -0
  212. package/dist/universal/.trae-cn/skills/citable/schemas/crawler.schema.json +1 -0
  213. package/dist/universal/.trae-cn/skills/citable/schemas/entity.schema.json +2 -1
  214. package/dist/universal/.trae-cn/skills/citable/schemas/evidence.schema.json +1 -0
  215. package/dist/universal/.trae-cn/skills/citable/schemas/experiment.schema.json +1 -0
  216. package/dist/universal/.trae-cn/skills/citable/schemas/page.schema.json +1 -0
  217. package/dist/universal/.trae-cn/skills/citable/schemas/prompt.schema.json +1 -0
  218. package/dist/universal/.trae-cn/skills/citable/schemas/query.schema.json +1 -0
  219. package/dist/universal/manifest.json +243 -195
  220. package/package.json +1 -1
  221. package/schemas/action-plan.schema.json +55 -0
  222. package/schemas/claim.schema.json +2 -0
  223. package/schemas/common.defs.json +2 -0
  224. package/schemas/competitor.schema.json +1 -0
  225. package/schemas/crawler.schema.json +1 -0
  226. package/schemas/entity.schema.json +2 -1
  227. package/schemas/evidence.schema.json +1 -0
  228. package/schemas/experiment.schema.json +1 -0
  229. package/schemas/page.schema.json +1 -0
  230. package/schemas/prompt.schema.json +1 -0
  231. package/schemas/query.schema.json +1 -0
  232. package/skill/SKILL.md +49 -1
  233. package/skill/commands/README.md +1 -0
  234. package/skill/commands/action-findings.md +37 -0
  235. package/skill/references/aeo-geo-validation.md +50 -0
  236. package/skill/references/capability-boundaries.md +34 -0
  237. package/src/cli/index.js +19 -0
  238. package/src/commands/actionPlan.js +120 -0
  239. package/src/commands/audit.js +6 -1
  240. package/src/commands/context.js +2 -2
  241. package/src/commands/selfUpgrade.js +155 -0
  242. package/src/commands/substantiate.js +2 -2
  243. package/src/crawler/fetch.js +98 -41
  244. package/src/detectors/ans.js +43 -0
  245. package/src/detectors/geoReco.js +48 -0
  246. package/src/extractor/site.js +12 -4
  247. package/src/reporting/report.js +58 -1
  248. package/src/shared/io.js +12 -0
@@ -10,6 +10,7 @@
10
10
  "definitions": {
11
11
  "prompt": {
12
12
  "type": "object",
13
+ "additionalProperties": false,
13
14
  "required": ["prompt_id", "canonical_prompt", "prompt_class", "status"],
14
15
  "properties": {
15
16
  "prompt_id": { "$ref": "citable://schemas/common.defs.json#/definitions/id" },
@@ -10,6 +10,7 @@
10
10
  "definitions": {
11
11
  "query": {
12
12
  "type": "object",
13
+ "additionalProperties": false,
13
14
  "required": ["query_id", "canonical_query", "intent", "status"],
14
15
  "properties": {
15
16
  "query_id": { "$ref": "citable://schemas/common.defs.json#/definitions/id" },
@@ -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: 0.1.0
10
+ version: 1.3.0
11
11
  ---
12
12
 
13
13
  # Citable — search & generative discoverability governance
@@ -57,6 +57,19 @@ recommendation would require invented facts.
57
57
  Report posture per dimension (e.g. `retrieval_eligibility: strong`,
58
58
  `answer_extractability: weak`) — never one opaque 0–100 "AI visibility score".
59
59
 
60
+ Every report must keep these top-level states separate:
61
+
62
+ 1. **Retrieval eligibility** — policy and captured technical conditions.
63
+ 2. **Source extraction and support suitability** — passage, entity, claim,
64
+ evidence, freshness, and structured-data conditions.
65
+ 3. **Observed citation behavior** — only controlled, timestamped provider
66
+ observations; absent observations are `not_evidenced`, never inferred.
67
+
68
+ Within retrieval, distinguish `allowed_by_policy`, `synthetic_fetch_succeeded`,
69
+ `observed_in_production_logs`, `indexed`, and `returned_by_retrieval`. Within
70
+ citation testing, distinguish mention, citation, material support, canonical
71
+ source selection, and recommendation. These states are not interchangeable.
72
+
60
73
  ## Tooling
61
74
 
62
75
  The `citable` CLI in this repository performs the deterministic work. Always
@@ -71,6 +84,7 @@ citable substantiate [--write]
71
84
  citable schema --target <dir|url>
72
85
  citable validate [registries|claims|evidence|schema|links]
73
86
  citable compare-snapshots [runA runB]
87
+ citable action-plan [run-id] # ordered actions, blockers, semantic gates, verification
74
88
  ```
75
89
 
76
90
  Audit scopes: `technical seo aeo geo architecture entity claims evidence schema
@@ -79,6 +93,40 @@ lifecycle corroboration`. Every audit writes an evidence package to
79
93
  sitemaps, schema, link graph, checksums). A report without its evidence package
80
94
  is not a deliverable.
81
95
 
96
+ ## Finding-to-action protocol
97
+
98
+ Detection is the start of the workflow, not the deliverable. For every audit:
99
+
100
+ 1. Run `citable action-plan <run-id>`. Use the generated files under
101
+ `.citable/actions/<run-id>/`; never edit the immutable source run.
102
+ 2. Work phases in order: **unblock** retrieval/security failures,
103
+ **governance** for owners/entities/claims/evidence, **content** for page and
104
+ answer changes, then **optimization**. Within a phase, critical/high precede
105
+ lower-severity work. Severity never substitutes for confidence.
106
+ 3. Before editing, assign an accountable owner and satisfy every
107
+ `required_input`. A blocked action stays blocked; do not write around missing
108
+ facts, evidence, legal review, or source-to-render mapping.
109
+ 4. Apply the listed semantic gates. AEO changes require intent alignment and
110
+ answer-extractability review. GEO changes require entity clarity,
111
+ recommendation eligibility, and narrative-accuracy review. Claim/evidence
112
+ changes additionally require claim-boundedness and evidence-strength review.
113
+ 5. Make the smallest source or registry change that addresses the evidence.
114
+ Reject every listed unsafe shortcut and every matching anti-pattern.
115
+ 6. Run the repository build/test commands, then the action's verification
116
+ command. Re-audit the affected scope and run `compare-snapshots` against the
117
+ source run. A finding is resolved only when its detector no longer reports
118
+ the same subject and no new critical/high regression appears.
119
+ 7. Report resolved, persisting, blocked, accepted-risk, and newly introduced
120
+ findings separately. Preserve run IDs, diffs, owners, review evidence, and
121
+ residual risk. Never translate "detector absent" into an outcome guarantee.
122
+
123
+ For the complete AEO/GEO acceptance profile, follow
124
+ `references/aeo-geo-validation.md`. Skipped deterministic checks or incomplete
125
+ mandatory semantic reviews make the relevant posture `not_established`.
126
+ Consult `references/capability-boundaries.md` before claiming any observation;
127
+ it identifies which states the current CLI can collect and which require
128
+ operator data or future adapters.
129
+
82
130
  ## Command workflows
83
131
 
84
132
  Detailed per-command workflows live in `commands/`. Follow them; they define
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.3.0
@@ -20,6 +20,7 @@ intent, not executability, so statuses are strict:
20
20
  | /citable schema | implemented |
21
21
  | /citable validate, validate-claims, validate-evidence, validate-schema, validate-links | implemented |
22
22
  | /citable compare-snapshots / validate-regression | implemented |
23
+ | /citable action-plan | implemented — writes ordered, source-run-bound action artifacts outside immutable evidence packages |
23
24
  | /citable ingest, map-site, map-queries, map-prompts, map-entities, map-evidence | specified (ingest.md) |
24
25
  | /citable optimize-page | specified (optimize-page.md) — requires source-to-render mapping, claim-preserving rewrites, build execution, rollback; none of that is proven yet |
25
26
  | /citable create-page, answer-block, architect, interlink, consolidate, metadata | specified (page-work.md) |
@@ -0,0 +1,37 @@
1
+ ---
2
+ command: /citable action-plan [run-id]
3
+ purpose: Convert observed findings into ordered remediation work without changing the immutable audit package or inventing implementation facts.
4
+ preconditions: [completed audit run with findings.json and manifest.json]
5
+ artifacts_created: [.citable/actions/<run-id>/action-plan.json, .citable/actions/<run-id>/action-plan.md]
6
+ failure_behaviour: missing or invalid source run -> fail; review-required action without owner -> blocked with required_input
7
+ ---
8
+
9
+ # Detection-to-action workflow
10
+
11
+ 1. Generate the plan with `citable action-plan <run-id>`. Confirm the stored
12
+ `source_findings_hash` still matches the source audit before acting.
13
+ 2. Triage in generated phase order: unblock, governance, content, optimization.
14
+ Do not skip an earlier phase when it invalidates later evidence or rendering.
15
+ 3. Assign owners. Resolve each blocked action's exact required input. Missing
16
+ facts, evidence, legal review, or semantic review are blockers, not drafting
17
+ opportunities.
18
+ 4. Capture a before state for each subject. Use the finding's evidence,
19
+ preferred remediation, unsafe shortcuts, and detector lineage as the change
20
+ boundary.
21
+ 5. Apply the semantic gates listed on the action using the named rubrics. Store
22
+ quoted passages and registry records supporting the posture decision.
23
+ 6. Implement the smallest defensible change in canonical source. Registry
24
+ writes use the loader/saver and retain history. Content claims remain equal
25
+ to or narrower than their registered scope.
26
+ 7. Build and test the target repository. Run the generated verification
27
+ command, then compare the new audit to the source run.
28
+ 8. Close only with evidence: resolved detector/subject pair, before/after run
29
+ IDs, diff, reviewer, and residual risk. Mark blocked, accepted risk, and
30
+ false positive explicitly; do not silently drop findings.
31
+
32
+ # Execution boundary
33
+
34
+ `action-plan` plans and records work; it does not automatically rewrite a site.
35
+ Source mutation remains agent/operator work because arbitrary repositories need
36
+ their own build architecture, review authority, and rollback path. Follow
37
+ `optimize-page.md` or `page-work.md` when the action requires page changes.
@@ -1,21 +1,24 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "rovodev",
6
6
  "providerName": "Rovo Dev",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.1.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.3.0",
9
9
  "variantPath": ".rovodev/skills/citable",
10
10
  "files": {
11
+ "commands/action-findings.md": "sha256:510361461f24fcd4a550e0a8d960c383aefe23f9a65a54a3ffc44abd4c1293e7",
11
12
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
12
13
  "commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
13
14
  "commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
14
15
  "commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
15
- "commands/README.md": "sha256:13774e705356b9eafb42aa522cc10337d86dfb973d533976f041a21819fb6cb4",
16
+ "commands/README.md": "sha256:186ca808e0f303938ef9f8f98c8273c4b7cb76cc791e7d751c3639bf201e3bb1",
16
17
  "commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
17
18
  "policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
19
+ "references/aeo-geo-validation.md": "sha256:e45828d3ccca54a08513cb4235578c8a8ecf1dc47d1cb98e4a497838103bef70",
18
20
  "references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
21
+ "references/capability-boundaries.md": "sha256:901840fe87080071d0b11aa329d6a7954ffa6c601c58fadc275b55a7a988376a",
19
22
  "rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
20
23
  "rubrics/claim-boundedness.md": "sha256:0bab1b85248c252b966175912ebfae13bf18aa7e41573f7466831ac78b5d3e27",
21
24
  "rubrics/comparison-fairness.md": "sha256:7afc86903aa4a695060be7b6bca42ba505c106ea7cfa153344189afc5b78a5ba",
@@ -29,26 +32,27 @@
29
32
  "rubrics/recommendation-eligibility.md": "sha256:38d2055fc5f6ab5e40fd1b48de4e0518fc4382da0b7062ad09c5afebcc673fc3",
30
33
  "rubrics/semantic-clarity.md": "sha256:66d9f4843a4a620ea8c00625c5e17c02baeaa373f2b445ce13de6f81d78ec7ba",
31
34
  "rubrics/source-authority.md": "sha256:8dbfe46bdcd0b5351f038be503601268c7d0abb9bed83be9ca58bf54dec5a73b",
32
- "schemas/claim.schema.json": "sha256:70c521e51a24031a1e1f73eca04c2a2650e760f3fdc82e9553eb26c0b5c428e9",
33
- "schemas/common.defs.json": "sha256:1ae1ae4a9b0babadbcba3288dd3d1adb3e152f87f1e51c08a397a0f29878e95f",
34
- "schemas/competitor.schema.json": "sha256:7d34c1f131eba23d94404921c4defbdabb402f83bc5a748a1de40fbe89d65cca",
35
+ "schemas/action-plan.schema.json": "sha256:4b6c4c877840a065c7c0c0c7b52f696502bf3d4ca6d31179622fc364ea868d5e",
36
+ "schemas/claim.schema.json": "sha256:ce79ccbfa34ece9b7a309a6962522ea06a1f44c468b4c472b5c376554a788537",
37
+ "schemas/common.defs.json": "sha256:effdd812910d1c275c50520bb70d8aec085e53fa8cb68054dc58c04a5d4a66b3",
38
+ "schemas/competitor.schema.json": "sha256:2f6fd7e4543846bde56ff4dc62bb41fa366889787b794a7cdb0bff1a3392e591",
35
39
  "schemas/config.schema.json": "sha256:a87f3bb0087de09035b9f2dafea66e32e4fcc2e3e329abcd0fd8a5ec33318f2a",
36
- "schemas/crawler.schema.json": "sha256:0541de509d0b5de065e1dd3ff52212ba389eaf7f5a9c2309b5e5beb232b4b356",
40
+ "schemas/crawler.schema.json": "sha256:1a113dfb80bc6cde904c3ea648c82ea1d88fe50f2c1a0e7175d44abba28ac64e",
37
41
  "schemas/detector-quality.schema.json": "sha256:5e9e1ac80b1198a0ff8fa17b9f7a543d3ccf3ed3d60196152f6ff095cfdebccd",
38
- "schemas/entity.schema.json": "sha256:12f9222122255c86059185bc66e528e2828b430f7abc5683e6759774eb555553",
39
- "schemas/evidence.schema.json": "sha256:a78d39cd1d66c89198b0ecc9af48c8d3d8659c7b5cbb9f96c43d18fcf2b4aeb7",
40
- "schemas/experiment.schema.json": "sha256:704ea5c14cd4409c3a1806b8b1c124bcd9f2fe9e313dfa93662889bed0cb6441",
42
+ "schemas/entity.schema.json": "sha256:78a08c35c8f4eb7a804ab46b61a238502f59621ac5218991e783251fbde61c4f",
43
+ "schemas/evidence.schema.json": "sha256:76baec7ad7e89c6952473c01dacb9e3b26953c088331e6314d531ce620df9ec1",
44
+ "schemas/experiment.schema.json": "sha256:3cebebc5745a9eb359261408b0a0421b8370d2c94f8244ce939827cd9da41cb6",
41
45
  "schemas/finding.schema.json": "sha256:85907cd04cd8d2fe24a1e618e0df7160f6d56aa1818db501f345aebce5eb5edb",
42
- "schemas/page.schema.json": "sha256:195d2f91d67550627c7047fd8e98d08dc386bc5858a02239d6c23b99193eaac2",
46
+ "schemas/page.schema.json": "sha256:627613c35f461177fa946df08edf66fbf6f6bbdfc57eef812572b3af796d5e07",
43
47
  "schemas/project.schema.json": "sha256:ea48fdb6480f7047ba4594bd5908bc1f79c1ad6b9a2c204df900959b5f203dc6",
44
48
  "schemas/prompt-result.schema.json": "sha256:b55be47d7d58d7b1dd8c3b1e849e24e55216212c592cde7eb836953379b85737",
45
- "schemas/prompt.schema.json": "sha256:69782525f9de3a9f92649f2bc2fb4a0b2ed4288d6028663b18e39918c9f7fca1",
46
- "schemas/query.schema.json": "sha256:59829f78461f115d73486e6350dcea5daf5a8e77576013b7a6d25913f240c55d",
49
+ "schemas/prompt.schema.json": "sha256:7f0f50c83a86ac91faa7b79895dbc1fed371e8c0342e18d8c2877cc81f4f0f4c",
50
+ "schemas/query.schema.json": "sha256:3c0793a8c0c48ab39320416790840b345ea987696f35b1cc364f23245a62aacb",
47
51
  "schemas/run.schema.json": "sha256:46c3178620f3a358d936d535aeadb83454b9b35b551e53e6615cc9862063dacb",
48
52
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
49
- "SKILL.md": "sha256:637bb755bca6a2225c5b69edab0b8be7dff294e784d7ce25cec23546b847324c",
53
+ "SKILL.md": "sha256:b9864498dd1507003386ac82b4cb8aea9056af7435c313e1aa19faa5cb185bf1",
50
54
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
51
- "VERSION": "sha256:1575e1af4a95f12f70b4ee6a6adce8160953d93ea17dc2611b90883ccc3ad3b8"
55
+ "VERSION": "sha256:64d23f858ef51b0f996e4966d4e27c0371b437e2d2787890b1f7ad22d4ec5663"
52
56
  },
53
- "treeHash": "sha256:1984fdb279446bdc9e2c81673a1c521564d6ed9f0cc74e8eee62e7cacb7c2843"
57
+ "treeHash": "sha256:f9dab639bf6d9fa5b638eefa2cc9ee73c7a30cc37d7f85f625ae608976b195aa"
54
58
  }
@@ -0,0 +1,50 @@
1
+ # AEO/GEO validation profile
2
+
3
+ This profile is an acceptance gate for eligibility and governance conditions,
4
+ not a prediction of citation or recommendation. Report every row as
5
+ `pass | finding | skipped | not_established`; never collapse rows into one score.
6
+
7
+ ## Top-level state separation
8
+
9
+ | State | Current evidence boundary |
10
+ | --- | --- |
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 extraction plus registries/detectors/rubrics; rendered-DOM parity remains not established without a renderer |
13
+ | Observed citation behavior | Operator-supplied prompt-result observations only; report cohort size and property citation presence, never infer from readiness |
14
+
15
+ ## AEO checks
16
+
17
+ | Condition | Deterministic controls | Semantic gate |
18
+ | --- | --- | --- |
19
+ | Retrievable, indexable answer surface | TECH, CRAWL, LINK; no skipped critical transport checks | intent-alignment |
20
+ | Governed question coverage | ANS-009; page target_prompts resolve to active prompts | intent-alignment |
21
+ | Direct, self-contained answer | ANS-001…004, ANS-008 | answer-extractability |
22
+ | Atomic, bounded factual claims | ANS-005, CLAIM-004/007/009 | claim-boundedness |
23
+ | Evidence adjacent and supportable | ANS-010, EVD-001…007 | evidence-strength, source-authority |
24
+ | Procedures and comparisons extract cleanly | ANS-006/007 | answer-extractability, comparison-fairness |
25
+ | Entity attribution is stable | ENTITY-001…007, GEO-005 | entity-clarity |
26
+ | Visible schema agrees with content | SCHEMA-001…008 | semantic-clarity |
27
+
28
+ ## GEO checks
29
+
30
+ | Condition | Deterministic controls | Semantic gate |
31
+ | --- | --- | --- |
32
+ | Prompt portfolio is evaluable | GEO-006, MEAS-001…003 | narrative-accuracy |
33
+ | Entity and category representation is explicit | GEO-002/003/005, ENTITY-001…007 | entity-clarity |
34
+ | Claims preserve scope, evidence, and legal status | CLAIM-001…009, EVD-001…007, ANS-010 | claim-boundedness, evidence-strength |
35
+ | Recommendation inputs are complete | RECO-001…006 | recommendation-eligibility |
36
+ | Comparisons are fair and corroborated | ANS-007, EXT-001/002 | comparison-fairness, source-authority |
37
+ | Model-directed manipulation is absent | GEO-001/004 | mandatory human review for ambiguous hidden content |
38
+ | Temporal and narrative integrity is governed | LIFE, MEAS, SCHEMA-004/006 | narrative-accuracy |
39
+
40
+ ## Acceptance rules
41
+
42
+ - A deterministic finding means the corresponding condition is not met.
43
+ - A skipped detector means the condition is `not_established`, not pass.
44
+ - A heuristic detector absence is not proof; complete the semantic rubric.
45
+ - Any rubric ambiguity condition produces `not_established + review_required`.
46
+ - AEO/GEO posture can improve only after a before/after audit resolves the
47
+ relevant detector/subject pair without introducing critical/high regression.
48
+ - Effectiveness is measured only from repeated, segmented observations using
49
+ the measurement workflow. Eligibility checks alone do not establish engine
50
+ behavior or causal impact.
@@ -0,0 +1,34 @@
1
+ # Capability and observation boundaries
2
+
3
+ Use the narrowest supported state. Never promote evidence across rows.
4
+
5
+ | State | Current capability | Required evidence |
6
+ | --- | --- | --- |
7
+ | Allowed by policy | Implemented | Effective robots rule plus crawler-purpose registry decision |
8
+ | Synthetic fetch succeeded | Partial | Captured status, redirects, headers, body from the declared user agent; label identity simulated |
9
+ | Verified crawler reached edge | Operator supplied | Request log plus provider-published IP verification where supported |
10
+ | Observed in production logs | Operator supplied | Timestamped server/CDN log with URL, status, bytes, latency, cache result, UA, and verification result |
11
+ | Indexed | Operator supplied | Search Console/Bing Webmaster/API or timestamped engine observation |
12
+ | Returned by retrieval | Operator supplied | Provider observation containing retrieved source URL |
13
+ | Cited | Operator supplied | Complete answer observation with citation URL |
14
+ | Materially supports answer | Human review required | Answer claim mapped to a passage that entails it |
15
+ | Recommended | Operator supplied + review | Explicit recommendation, constraints, provider/mode/locale/time |
16
+
17
+ Current CLI URL mode does not prove crawler identity, WAF allowlisting,
18
+ production-log access, index presence, selected canonical, rendered DOM parity,
19
+ or provider citation behavior. Record those states as `not_evidenced` unless the
20
+ specified evidence is supplied.
21
+
22
+ Primary-source lineage for these boundaries:
23
+
24
+ - Perplexity documents separate `PerplexityBot` and `Perplexity-User` purposes,
25
+ published IP lists, and UA-plus-IP verification:
26
+ https://docs.perplexity.ai/docs/resources/perplexity-crawlers
27
+ - Google documents `noindex` as preventing inclusion in Google Search and
28
+ distinguishes crawl/content controls:
29
+ https://developers.google.com/search/docs/crawling-indexing/control-what-you-share
30
+ - Bing documents citation counts as observations that do not indicate ranking,
31
+ authority, or placement:
32
+ https://blogs.bing.com/webmaster/February-2026/Introducing-AI-Performance-in-Bing-Webmaster-Tools-Public-Preview
33
+ - Google requires structured data to describe visible page content:
34
+ https://developers.google.com/search/docs/appearance/structured-data/sd-policies
@@ -0,0 +1,55 @@
1
+ {
2
+ "$id": "citable://schemas/action-plan.schema.json",
3
+ "$schema": "http://json-schema.org/draft-07/schema#",
4
+ "title": "Finding action plan",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["source_run_id", "source_findings_hash", "generated_at", "summary", "actions"],
8
+ "properties": {
9
+ "source_run_id": { "type": "string", "minLength": 1 },
10
+ "source_findings_hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
11
+ "generated_at": { "type": "string" },
12
+ "summary": {
13
+ "type": "object",
14
+ "additionalProperties": false,
15
+ "required": ["total_actions", "ready", "blocked"],
16
+ "properties": {
17
+ "total_actions": { "type": "integer", "minimum": 0 },
18
+ "ready": { "type": "integer", "minimum": 0 },
19
+ "blocked": { "type": "integer", "minimum": 0 }
20
+ }
21
+ },
22
+ "actions": {
23
+ "type": "array",
24
+ "items": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": ["action_id", "finding_ids", "phase", "priority", "subject", "action", "owner", "status", "required_input", "semantic_gates", "unsafe_shortcuts", "verification"],
28
+ "properties": {
29
+ "action_id": { "$ref": "citable://schemas/common.defs.json#/definitions/id" },
30
+ "finding_ids": { "type": "array", "minItems": 1, "items": { "type": "string" } },
31
+ "phase": { "type": "string", "enum": ["unblock", "governance", "content", "optimization"] },
32
+ "priority": { "type": "string", "enum": ["critical", "high", "medium", "low"] },
33
+ "subject": { "type": "string" },
34
+ "action": { "type": "string", "minLength": 1 },
35
+ "owner": { "type": ["string", "null"] },
36
+ "status": { "type": "string", "enum": ["ready", "blocked"] },
37
+ "required_input": { "type": "array", "items": { "type": "string" } },
38
+ "semantic_gates": { "type": "array", "items": { "type": "string" } },
39
+ "unsafe_shortcuts": { "type": "array", "items": { "type": "string" } },
40
+ "verification": {
41
+ "type": "object",
42
+ "additionalProperties": false,
43
+ "required": ["method", "detector", "command", "expected_result"],
44
+ "properties": {
45
+ "method": { "type": "string" },
46
+ "detector": { "type": "string" },
47
+ "command": { "type": "string" },
48
+ "expected_result": { "type": "string" }
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
@@ -10,6 +10,7 @@
10
10
  "definitions": {
11
11
  "claim": {
12
12
  "type": "object",
13
+ "additionalProperties": false,
13
14
  "required": ["claim_id", "claim", "claim_type", "status"],
14
15
  "properties": {
15
16
  "claim_id": { "$ref": "citable://schemas/common.defs.json#/definitions/id" },
@@ -34,6 +35,7 @@
34
35
  "source_location": { "type": "string" },
35
36
  "support_assessment": {
36
37
  "type": "object",
38
+ "additionalProperties": false,
37
39
  "required": ["status"],
38
40
  "properties": {
39
41
  "status": { "type": "string", "enum": ["directly_supported", "partially_supported", "inferred", "contradicted", "not_assessed"] },
@@ -12,6 +12,7 @@
12
12
  },
13
13
  "provenance": {
14
14
  "type": "object",
15
+ "additionalProperties": false,
15
16
  "properties": {
16
17
  "created": { "$ref": "#/definitions/isoDate" },
17
18
  "updated": { "$ref": "#/definitions/isoDate" },
@@ -21,6 +22,7 @@
21
22
  },
22
23
  "registryFile": {
23
24
  "type": "object",
25
+ "additionalProperties": false,
24
26
  "required": ["version", "kind", "entries"],
25
27
  "properties": {
26
28
  "version": { "type": "integer", "minimum": 1 },
@@ -10,6 +10,7 @@
10
10
  "definitions": {
11
11
  "competitor": {
12
12
  "type": "object",
13
+ "additionalProperties": false,
13
14
  "required": ["competitor_id", "name", "status"],
14
15
  "properties": {
15
16
  "competitor_id": { "$ref": "citable://schemas/common.defs.json#/definitions/id" },
@@ -10,6 +10,7 @@
10
10
  "definitions": {
11
11
  "crawler": {
12
12
  "type": "object",
13
+ "additionalProperties": false,
13
14
  "required": ["crawler_id", "user_agent", "purpose", "decision", "status"],
14
15
  "properties": {
15
16
  "crawler_id": { "$ref": "citable://schemas/common.defs.json#/definitions/id" },
@@ -10,6 +10,7 @@
10
10
  "definitions": {
11
11
  "entity": {
12
12
  "type": "object",
13
+ "additionalProperties": false,
13
14
  "required": ["entity_id", "canonical_name", "entity_type", "status"],
14
15
  "properties": {
15
16
  "entity_id": { "$ref": "citable://schemas/common.defs.json#/definitions/id" },
@@ -26,7 +27,7 @@
26
27
  "secondary_categories": { "type": "array", "items": { "type": "string" } },
27
28
  "definition": { "type": "string" },
28
29
  "exclusions": { "type": "array", "items": { "type": "string" } },
29
- "relationships": { "type": "array", "items": { "type": "object", "required": ["type", "entity"], "properties": { "type": { "type": "string" }, "entity": { "type": "string" } } } },
30
+ "relationships": { "type": "array", "items": { "type": "object", "additionalProperties": false, "required": ["type", "entity"], "properties": { "type": { "type": "string" }, "entity": { "type": "string" } } } },
30
31
  "evidence": { "type": "array", "items": { "type": "string" } },
31
32
  "schema_types": { "type": "array", "items": { "type": "string" } },
32
33
  "status": { "$ref": "citable://schemas/common.defs.json#/definitions/status" },
@@ -10,6 +10,7 @@
10
10
  "definitions": {
11
11
  "evidence": {
12
12
  "type": "object",
13
+ "additionalProperties": false,
13
14
  "required": ["evidence_id", "title", "evidence_type", "verification_status"],
14
15
  "properties": {
15
16
  "evidence_id": { "$ref": "citable://schemas/common.defs.json#/definitions/id" },
@@ -10,6 +10,7 @@
10
10
  "definitions": {
11
11
  "experiment": {
12
12
  "type": "object",
13
+ "additionalProperties": false,
13
14
  "required": ["experiment_id", "hypothesis", "primary_metric", "status"],
14
15
  "properties": {
15
16
  "experiment_id": { "$ref": "citable://schemas/common.defs.json#/definitions/id" },
@@ -10,6 +10,7 @@
10
10
  "definitions": {
11
11
  "page": {
12
12
  "type": "object",
13
+ "additionalProperties": false,
13
14
  "required": ["page_id", "url", "page_type", "status"],
14
15
  "properties": {
15
16
  "page_id": { "$ref": "citable://schemas/common.defs.json#/definitions/id" },
@@ -10,6 +10,7 @@
10
10
  "definitions": {
11
11
  "prompt": {
12
12
  "type": "object",
13
+ "additionalProperties": false,
13
14
  "required": ["prompt_id", "canonical_prompt", "prompt_class", "status"],
14
15
  "properties": {
15
16
  "prompt_id": { "$ref": "citable://schemas/common.defs.json#/definitions/id" },
@@ -10,6 +10,7 @@
10
10
  "definitions": {
11
11
  "query": {
12
12
  "type": "object",
13
+ "additionalProperties": false,
13
14
  "required": ["query_id", "canonical_query", "intent", "status"],
14
15
  "properties": {
15
16
  "query_id": { "$ref": "citable://schemas/common.defs.json#/definitions/id" },
@@ -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: 0.1.0
10
+ version: 1.3.0
11
11
  ---
12
12
 
13
13
  # Citable — search & generative discoverability governance
@@ -57,6 +57,19 @@ recommendation would require invented facts.
57
57
  Report posture per dimension (e.g. `retrieval_eligibility: strong`,
58
58
  `answer_extractability: weak`) — never one opaque 0–100 "AI visibility score".
59
59
 
60
+ Every report must keep these top-level states separate:
61
+
62
+ 1. **Retrieval eligibility** — policy and captured technical conditions.
63
+ 2. **Source extraction and support suitability** — passage, entity, claim,
64
+ evidence, freshness, and structured-data conditions.
65
+ 3. **Observed citation behavior** — only controlled, timestamped provider
66
+ observations; absent observations are `not_evidenced`, never inferred.
67
+
68
+ Within retrieval, distinguish `allowed_by_policy`, `synthetic_fetch_succeeded`,
69
+ `observed_in_production_logs`, `indexed`, and `returned_by_retrieval`. Within
70
+ citation testing, distinguish mention, citation, material support, canonical
71
+ source selection, and recommendation. These states are not interchangeable.
72
+
60
73
  ## Tooling
61
74
 
62
75
  The `citable` CLI in this repository performs the deterministic work. Always
@@ -71,6 +84,7 @@ citable substantiate [--write]
71
84
  citable schema --target <dir|url>
72
85
  citable validate [registries|claims|evidence|schema|links]
73
86
  citable compare-snapshots [runA runB]
87
+ citable action-plan [run-id] # ordered actions, blockers, semantic gates, verification
74
88
  ```
75
89
 
76
90
  Audit scopes: `technical seo aeo geo architecture entity claims evidence schema
@@ -79,6 +93,40 @@ lifecycle corroboration`. Every audit writes an evidence package to
79
93
  sitemaps, schema, link graph, checksums). A report without its evidence package
80
94
  is not a deliverable.
81
95
 
96
+ ## Finding-to-action protocol
97
+
98
+ Detection is the start of the workflow, not the deliverable. For every audit:
99
+
100
+ 1. Run `citable action-plan <run-id>`. Use the generated files under
101
+ `.citable/actions/<run-id>/`; never edit the immutable source run.
102
+ 2. Work phases in order: **unblock** retrieval/security failures,
103
+ **governance** for owners/entities/claims/evidence, **content** for page and
104
+ answer changes, then **optimization**. Within a phase, critical/high precede
105
+ lower-severity work. Severity never substitutes for confidence.
106
+ 3. Before editing, assign an accountable owner and satisfy every
107
+ `required_input`. A blocked action stays blocked; do not write around missing
108
+ facts, evidence, legal review, or source-to-render mapping.
109
+ 4. Apply the listed semantic gates. AEO changes require intent alignment and
110
+ answer-extractability review. GEO changes require entity clarity,
111
+ recommendation eligibility, and narrative-accuracy review. Claim/evidence
112
+ changes additionally require claim-boundedness and evidence-strength review.
113
+ 5. Make the smallest source or registry change that addresses the evidence.
114
+ Reject every listed unsafe shortcut and every matching anti-pattern.
115
+ 6. Run the repository build/test commands, then the action's verification
116
+ command. Re-audit the affected scope and run `compare-snapshots` against the
117
+ source run. A finding is resolved only when its detector no longer reports
118
+ the same subject and no new critical/high regression appears.
119
+ 7. Report resolved, persisting, blocked, accepted-risk, and newly introduced
120
+ findings separately. Preserve run IDs, diffs, owners, review evidence, and
121
+ residual risk. Never translate "detector absent" into an outcome guarantee.
122
+
123
+ For the complete AEO/GEO acceptance profile, follow
124
+ `references/aeo-geo-validation.md`. Skipped deterministic checks or incomplete
125
+ mandatory semantic reviews make the relevant posture `not_established`.
126
+ Consult `references/capability-boundaries.md` before claiming any observation;
127
+ it identifies which states the current CLI can collect and which require
128
+ operator data or future adapters.
129
+
82
130
  ## Command workflows
83
131
 
84
132
  Detailed per-command workflows live in `commands/`. Follow them; they define
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.3.0
@@ -20,6 +20,7 @@ intent, not executability, so statuses are strict:
20
20
  | /citable schema | implemented |
21
21
  | /citable validate, validate-claims, validate-evidence, validate-schema, validate-links | implemented |
22
22
  | /citable compare-snapshots / validate-regression | implemented |
23
+ | /citable action-plan | implemented — writes ordered, source-run-bound action artifacts outside immutable evidence packages |
23
24
  | /citable ingest, map-site, map-queries, map-prompts, map-entities, map-evidence | specified (ingest.md) |
24
25
  | /citable optimize-page | specified (optimize-page.md) — requires source-to-render mapping, claim-preserving rewrites, build execution, rollback; none of that is proven yet |
25
26
  | /citable create-page, answer-block, architect, interlink, consolidate, metadata | specified (page-work.md) |
@@ -0,0 +1,37 @@
1
+ ---
2
+ command: /citable action-plan [run-id]
3
+ purpose: Convert observed findings into ordered remediation work without changing the immutable audit package or inventing implementation facts.
4
+ preconditions: [completed audit run with findings.json and manifest.json]
5
+ artifacts_created: [.citable/actions/<run-id>/action-plan.json, .citable/actions/<run-id>/action-plan.md]
6
+ failure_behaviour: missing or invalid source run -> fail; review-required action without owner -> blocked with required_input
7
+ ---
8
+
9
+ # Detection-to-action workflow
10
+
11
+ 1. Generate the plan with `citable action-plan <run-id>`. Confirm the stored
12
+ `source_findings_hash` still matches the source audit before acting.
13
+ 2. Triage in generated phase order: unblock, governance, content, optimization.
14
+ Do not skip an earlier phase when it invalidates later evidence or rendering.
15
+ 3. Assign owners. Resolve each blocked action's exact required input. Missing
16
+ facts, evidence, legal review, or semantic review are blockers, not drafting
17
+ opportunities.
18
+ 4. Capture a before state for each subject. Use the finding's evidence,
19
+ preferred remediation, unsafe shortcuts, and detector lineage as the change
20
+ boundary.
21
+ 5. Apply the semantic gates listed on the action using the named rubrics. Store
22
+ quoted passages and registry records supporting the posture decision.
23
+ 6. Implement the smallest defensible change in canonical source. Registry
24
+ writes use the loader/saver and retain history. Content claims remain equal
25
+ to or narrower than their registered scope.
26
+ 7. Build and test the target repository. Run the generated verification
27
+ command, then compare the new audit to the source run.
28
+ 8. Close only with evidence: resolved detector/subject pair, before/after run
29
+ IDs, diff, reviewer, and residual risk. Mark blocked, accepted risk, and
30
+ false positive explicitly; do not silently drop findings.
31
+
32
+ # Execution boundary
33
+
34
+ `action-plan` plans and records work; it does not automatically rewrite a site.
35
+ Source mutation remains agent/operator work because arbitrary repositories need
36
+ their own build architecture, review authority, and rollback path. Follow
37
+ `optimize-page.md` or `page-work.md` when the action requires page changes.