@nebulacomponents/citable 1.3.0 → 1.4.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 (125) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +16 -4
  3. package/dist/universal/.agents/skills/citable/SKILL.md +7 -1
  4. package/dist/universal/.agents/skills/citable/VERSION +1 -1
  5. package/dist/universal/.agents/skills/citable/commands/README.md +5 -2
  6. package/dist/universal/.agents/skills/citable/commands/measurement.md +5 -5
  7. package/dist/universal/.agents/skills/citable/commands/observe-and-act.md +40 -0
  8. package/dist/universal/.agents/skills/citable/manifest.json +11 -8
  9. package/dist/universal/.agents/skills/citable/references/capability-boundaries.md +8 -8
  10. package/dist/universal/.agents/skills/citable/schemas/observation.schema.json +20 -0
  11. package/dist/universal/.agents/skills/citable/schemas/remediation-spec.schema.json +28 -0
  12. package/dist/universal/.claude/skills/citable/SKILL.md +7 -1
  13. package/dist/universal/.claude/skills/citable/VERSION +1 -1
  14. package/dist/universal/.claude/skills/citable/commands/README.md +5 -2
  15. package/dist/universal/.claude/skills/citable/commands/measurement.md +5 -5
  16. package/dist/universal/.claude/skills/citable/commands/observe-and-act.md +40 -0
  17. package/dist/universal/.claude/skills/citable/manifest.json +11 -8
  18. package/dist/universal/.claude/skills/citable/references/capability-boundaries.md +8 -8
  19. package/dist/universal/.claude/skills/citable/schemas/observation.schema.json +20 -0
  20. package/dist/universal/.claude/skills/citable/schemas/remediation-spec.schema.json +28 -0
  21. package/dist/universal/.cursor/skills/citable/SKILL.md +7 -1
  22. package/dist/universal/.cursor/skills/citable/VERSION +1 -1
  23. package/dist/universal/.cursor/skills/citable/commands/README.md +5 -2
  24. package/dist/universal/.cursor/skills/citable/commands/measurement.md +5 -5
  25. package/dist/universal/.cursor/skills/citable/commands/observe-and-act.md +40 -0
  26. package/dist/universal/.cursor/skills/citable/manifest.json +11 -8
  27. package/dist/universal/.cursor/skills/citable/references/capability-boundaries.md +8 -8
  28. package/dist/universal/.cursor/skills/citable/schemas/observation.schema.json +20 -0
  29. package/dist/universal/.cursor/skills/citable/schemas/remediation-spec.schema.json +28 -0
  30. package/dist/universal/.gemini/skills/citable/SKILL.md +7 -1
  31. package/dist/universal/.gemini/skills/citable/VERSION +1 -1
  32. package/dist/universal/.gemini/skills/citable/commands/README.md +5 -2
  33. package/dist/universal/.gemini/skills/citable/commands/measurement.md +5 -5
  34. package/dist/universal/.gemini/skills/citable/commands/observe-and-act.md +40 -0
  35. package/dist/universal/.gemini/skills/citable/manifest.json +11 -8
  36. package/dist/universal/.gemini/skills/citable/references/capability-boundaries.md +8 -8
  37. package/dist/universal/.gemini/skills/citable/schemas/observation.schema.json +20 -0
  38. package/dist/universal/.gemini/skills/citable/schemas/remediation-spec.schema.json +28 -0
  39. package/dist/universal/.github/skills/citable/SKILL.md +7 -1
  40. package/dist/universal/.github/skills/citable/VERSION +1 -1
  41. package/dist/universal/.github/skills/citable/commands/README.md +5 -2
  42. package/dist/universal/.github/skills/citable/commands/measurement.md +5 -5
  43. package/dist/universal/.github/skills/citable/commands/observe-and-act.md +40 -0
  44. package/dist/universal/.github/skills/citable/manifest.json +11 -8
  45. package/dist/universal/.github/skills/citable/references/capability-boundaries.md +8 -8
  46. package/dist/universal/.github/skills/citable/schemas/observation.schema.json +20 -0
  47. package/dist/universal/.github/skills/citable/schemas/remediation-spec.schema.json +28 -0
  48. package/dist/universal/.kiro/skills/citable/SKILL.md +7 -1
  49. package/dist/universal/.kiro/skills/citable/VERSION +1 -1
  50. package/dist/universal/.kiro/skills/citable/commands/README.md +5 -2
  51. package/dist/universal/.kiro/skills/citable/commands/measurement.md +5 -5
  52. package/dist/universal/.kiro/skills/citable/commands/observe-and-act.md +40 -0
  53. package/dist/universal/.kiro/skills/citable/manifest.json +11 -8
  54. package/dist/universal/.kiro/skills/citable/references/capability-boundaries.md +8 -8
  55. package/dist/universal/.kiro/skills/citable/schemas/observation.schema.json +20 -0
  56. package/dist/universal/.kiro/skills/citable/schemas/remediation-spec.schema.json +28 -0
  57. package/dist/universal/.opencode/skills/citable/SKILL.md +7 -1
  58. package/dist/universal/.opencode/skills/citable/VERSION +1 -1
  59. package/dist/universal/.opencode/skills/citable/commands/README.md +5 -2
  60. package/dist/universal/.opencode/skills/citable/commands/measurement.md +5 -5
  61. package/dist/universal/.opencode/skills/citable/commands/observe-and-act.md +40 -0
  62. package/dist/universal/.opencode/skills/citable/manifest.json +11 -8
  63. package/dist/universal/.opencode/skills/citable/references/capability-boundaries.md +8 -8
  64. package/dist/universal/.opencode/skills/citable/schemas/observation.schema.json +20 -0
  65. package/dist/universal/.opencode/skills/citable/schemas/remediation-spec.schema.json +28 -0
  66. package/dist/universal/.pi/agent/skills/citable/SKILL.md +7 -1
  67. package/dist/universal/.pi/agent/skills/citable/VERSION +1 -1
  68. package/dist/universal/.pi/agent/skills/citable/commands/README.md +5 -2
  69. package/dist/universal/.pi/agent/skills/citable/commands/measurement.md +5 -5
  70. package/dist/universal/.pi/agent/skills/citable/commands/observe-and-act.md +40 -0
  71. package/dist/universal/.pi/agent/skills/citable/manifest.json +11 -8
  72. package/dist/universal/.pi/agent/skills/citable/references/capability-boundaries.md +8 -8
  73. package/dist/universal/.pi/agent/skills/citable/schemas/observation.schema.json +20 -0
  74. package/dist/universal/.pi/agent/skills/citable/schemas/remediation-spec.schema.json +28 -0
  75. package/dist/universal/.qoder/skills/citable/SKILL.md +7 -1
  76. package/dist/universal/.qoder/skills/citable/VERSION +1 -1
  77. package/dist/universal/.qoder/skills/citable/commands/README.md +5 -2
  78. package/dist/universal/.qoder/skills/citable/commands/measurement.md +5 -5
  79. package/dist/universal/.qoder/skills/citable/commands/observe-and-act.md +40 -0
  80. package/dist/universal/.qoder/skills/citable/manifest.json +11 -8
  81. package/dist/universal/.qoder/skills/citable/references/capability-boundaries.md +8 -8
  82. package/dist/universal/.qoder/skills/citable/schemas/observation.schema.json +20 -0
  83. package/dist/universal/.qoder/skills/citable/schemas/remediation-spec.schema.json +28 -0
  84. package/dist/universal/.rovodev/skills/citable/SKILL.md +7 -1
  85. package/dist/universal/.rovodev/skills/citable/VERSION +1 -1
  86. package/dist/universal/.rovodev/skills/citable/commands/README.md +5 -2
  87. package/dist/universal/.rovodev/skills/citable/commands/measurement.md +5 -5
  88. package/dist/universal/.rovodev/skills/citable/commands/observe-and-act.md +40 -0
  89. package/dist/universal/.rovodev/skills/citable/manifest.json +11 -8
  90. package/dist/universal/.rovodev/skills/citable/references/capability-boundaries.md +8 -8
  91. package/dist/universal/.rovodev/skills/citable/schemas/observation.schema.json +20 -0
  92. package/dist/universal/.rovodev/skills/citable/schemas/remediation-spec.schema.json +28 -0
  93. package/dist/universal/.trae/skills/citable/SKILL.md +7 -1
  94. package/dist/universal/.trae/skills/citable/VERSION +1 -1
  95. package/dist/universal/.trae/skills/citable/commands/README.md +5 -2
  96. package/dist/universal/.trae/skills/citable/commands/measurement.md +5 -5
  97. package/dist/universal/.trae/skills/citable/commands/observe-and-act.md +40 -0
  98. package/dist/universal/.trae/skills/citable/manifest.json +11 -8
  99. package/dist/universal/.trae/skills/citable/references/capability-boundaries.md +8 -8
  100. package/dist/universal/.trae/skills/citable/schemas/observation.schema.json +20 -0
  101. package/dist/universal/.trae/skills/citable/schemas/remediation-spec.schema.json +28 -0
  102. package/dist/universal/.trae-cn/skills/citable/SKILL.md +7 -1
  103. package/dist/universal/.trae-cn/skills/citable/VERSION +1 -1
  104. package/dist/universal/.trae-cn/skills/citable/commands/README.md +5 -2
  105. package/dist/universal/.trae-cn/skills/citable/commands/measurement.md +5 -5
  106. package/dist/universal/.trae-cn/skills/citable/commands/observe-and-act.md +40 -0
  107. package/dist/universal/.trae-cn/skills/citable/manifest.json +11 -8
  108. package/dist/universal/.trae-cn/skills/citable/references/capability-boundaries.md +8 -8
  109. package/dist/universal/.trae-cn/skills/citable/schemas/observation.schema.json +20 -0
  110. package/dist/universal/.trae-cn/skills/citable/schemas/remediation-spec.schema.json +28 -0
  111. package/dist/universal/manifest.json +135 -99
  112. package/package.json +9 -1
  113. package/schemas/observation.schema.json +20 -0
  114. package/schemas/remediation-spec.schema.json +28 -0
  115. package/skill/SKILL.md +7 -1
  116. package/skill/commands/README.md +5 -2
  117. package/skill/commands/measurement.md +5 -5
  118. package/skill/commands/observe-and-act.md +40 -0
  119. package/skill/references/capability-boundaries.md +8 -8
  120. package/src/cli/index.js +39 -0
  121. package/src/commands/applyRemediation.js +57 -0
  122. package/src/commands/monitor.js +40 -0
  123. package/src/commands/observe.js +235 -0
  124. package/src/evidence/run.js +1 -1
  125. package/src/observations/common.js +61 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.4.0 — 2026-07-18
4
+
5
+ ### Added
6
+
7
+ - Governed observation envelopes and evidence collectors for rendered DOM,
8
+ search-index exports/live Google inspection, controlled citation experiments,
9
+ citation support review, production crawler logs, answer passages,
10
+ canonical/freshness consensus, CrUX or imported performance data, and external
11
+ corroboration.
12
+ - `citable apply` for reviewed, source-run-bound, hash-locked source changes;
13
+ dry-run is the default and stale or ambiguous operations fail closed.
14
+ - `citable monitor` for observation-state, index, canonical, and citation
15
+ regressions across immutable runs.
16
+ - Optional Playwright peer integration and a disclosed HTTP adapter protocol
17
+ for repeatable provider/prompt experiments.
18
+
19
+ ## 1.3.1 — 2026-07-18
20
+
21
+ ### Fixed
22
+
23
+ - GitHub workflows now use `actions/checkout@v7` and `actions/setup-node@v7`,
24
+ whose action runtimes target Node.js 24, in addition to running project tasks
25
+ on Node.js 24.
26
+
3
27
  ## 1.3.0 — 2026-07-18
4
28
 
5
29
  ### Added
package/README.md CHANGED
@@ -124,6 +124,15 @@ cd your-site/
124
124
  citable init # creates .citable/ (non-destructive)
125
125
  citable audit --target ./dist --base-url https://example.com
126
126
  citable action-plan <run-id> # ordered actions, blockers, review gates, verification
127
+ citable observe passages --target ./dist --base-url https://example.com
128
+ citable observe index --input search-console-export.json
129
+ citable observe citations --input prompt-results.json --target https://example.com
130
+ citable observe logs --input edge-logs.json
131
+ citable observe consensus --target ./dist --base-url https://example.com
132
+ citable observe performance --target https://example.com # CRUX_API_KEY
133
+ citable apply --input remediation-spec.json # dry run
134
+ citable apply --input remediation-spec.json --write # reviewed + hash-locked
135
+ citable monitor [runA runB]
127
136
  citable substantiate # claim/evidence assessment (dry run)
128
137
  citable validate # registry schema + referential integrity
129
138
  ```
@@ -134,7 +143,7 @@ citable validate # registry schema + referential integrity
134
143
  | --- | --- |
135
144
  | `skill/` | Canonical agent skill: SKILL.md, command contracts, rubrics, anti-patterns, policies, templates |
136
145
  | `src/` | CLI, commands, registries, detectors, crawler/extractor, evidence, reporting |
137
- | `schemas/` | JSON Schemas: 9 registries + finding + run + config + prompt-result |
146
+ | `schemas/` | JSON Schemas: 9 registries plus findings, runs, observations, remediation, config, and prompt results |
138
147
  | `tests/` | Unit + integration suites; positive/negative fixtures |
139
148
  | `docs/` | ADR, traceability matrix, known limitations |
140
149
  | `dist/` | Generated distribution packages (run `npm run build:dist`) |
@@ -153,9 +162,12 @@ citable validate # registry schema + referential integrity
153
162
 
154
163
  ## Requirements
155
164
 
156
- Node >= 22.22.2. Network access only for URL-mode audits. Supported frameworks for
157
- auto-detection: Next.js, Astro, Nuxt, SvelteKit, Gatsby (other stacks: audit
158
- their built HTML output).
165
+ Node >= 22.22.2. Network access is used for URL audits and explicitly selected
166
+ live collectors. Render collection requires the optional `playwright` peer and
167
+ an installed Chromium browser. Google index inspection uses `GSC_ACCESS_TOKEN`
168
+ and `--site-url`; CrUX uses `CRUX_API_KEY`. Missing dependencies or credentials
169
+ produce incomplete evidence. Supported frameworks for auto-detection: Next.js,
170
+ Astro, Nuxt, SvelteKit, Gatsby (other stacks: audit their built HTML output).
159
171
 
160
172
  ## License
161
173
 
@@ -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.3.0
10
+ version: 1.4.0
11
11
  ---
12
12
 
13
13
  # Citable — search & generative discoverability governance
@@ -85,6 +85,9 @@ citable schema --target <dir|url>
85
85
  citable validate [registries|claims|evidence|schema|links]
86
86
  citable compare-snapshots [runA runB]
87
87
  citable action-plan [run-id] # ordered actions, blockers, semantic gates, verification
88
+ citable observe <mode> [options] # render/index/citation/log/passage/consensus/performance evidence
89
+ citable apply --input <spec> [--write] # reviewed, hash-locked remediation; dry run by default
90
+ citable monitor [runA runB] # observation regression alerts
88
91
  ```
89
92
 
90
93
  Audit scopes: `technical seo aeo geo architecture entity claims evidence schema
@@ -126,6 +129,9 @@ mandatory semantic reviews make the relevant posture `not_established`.
126
129
  Consult `references/capability-boundaries.md` before claiming any observation;
127
130
  it identifies which states the current CLI can collect and which require
128
131
  operator data or future adapters.
132
+ Use `commands/observe-and-act.md` for collector prerequisites, evidence labels,
133
+ the controlled citation adapter protocol, remediation refusal conditions, and
134
+ monitoring interpretation.
129
135
 
130
136
  ## Command workflows
131
137
 
@@ -1 +1 @@
1
- 1.3.0
1
+ 1.4.0
@@ -21,11 +21,14 @@ intent, not executability, so statuses are strict:
21
21
  | /citable validate, validate-claims, validate-evidence, validate-schema, validate-links | implemented |
22
22
  | /citable compare-snapshots / validate-regression | implemented |
23
23
  | /citable action-plan | implemented — writes ordered, source-run-bound action artifacts outside immutable evidence packages |
24
+ | /citable observe | implemented — render, index, citation, crawler-log, passage, consensus, performance, and corroboration evidence |
25
+ | /citable apply | implemented — reviewed, hash-locked source replacements; dry run by default |
26
+ | /citable monitor | implemented — compares immutable observation runs and emits evidence-linked alerts |
24
27
  | /citable ingest, map-site, map-queries, map-prompts, map-entities, map-evidence | specified (ingest.md) |
25
28
  | /citable optimize-page | specified (optimize-page.md) — requires source-to-render mapping, claim-preserving rewrites, build execution, rollback; none of that is proven yet |
26
29
  | /citable create-page, answer-block, architect, interlink, consolidate, metadata | specified (page-work.md) |
27
- | /citable validate-render | specified (validate-render.md) blocked on the rendered-truth phase (docs/detectors/render-phase-plan.md) |
28
- | /citable measure seo/aeo/geo, test-prompts, monitor-crawlers, monitor-contradictions | specified (measurement.md) no external engine adapters exist or are claimed |
30
+ | /citable validate-render | partially implemented by `observe render`; mobile/cross-browser and interaction exploration remain |
31
+ | /citable measure seo/aeo/geo, test-prompts, monitor-crawlers, monitor-contradictions | partially implemented by observation imports, Google/CrUX live APIs, custom citation adapters, and monitor comparisons |
29
32
 
30
33
  Shared refusal conditions (all commands): any action that would fabricate
31
34
  facts, citations, evidence, authorship, reviews, corroboration, or hidden
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  command: /citable measure seo|aeo|geo, test-prompts, monitor-crawlers, monitor-contradictions
3
- purpose: Observation and measurement workflows. Citable records and validates observations; it does not claim live engine adapters it does not have.
3
+ purpose: Observation and measurement workflows with exact collector and product-mode boundaries.
4
4
  ---
5
5
 
6
6
  # Honest capability statement
7
7
 
8
- This MVP ships **no external engine adapters** (no Search Console API client,
9
- no ChatGPT/Perplexity automation). Measurement commands therefore operate on
10
- *operator-supplied observations*, validated against the data contracts, plus
11
- registry-side integrity checks (MEAS-001/002/003). Do not imply otherwise.
8
+ Citable ships Google URL Inspection, CrUX field collection, normalized owner
9
+ imports, and a disclosed custom citation-adapter protocol. It does not claim
10
+ Bing AI Performance automation or equivalence between an API adapter and a
11
+ consumer answer product. Preserve collector and product mode on every result.
12
12
 
13
13
  # measure seo
14
14
  Inputs the operator exports (Search Console/Bing/analytics CSV or JSON).
@@ -0,0 +1,40 @@
1
+ ---
2
+ command: /citable observe|apply|monitor
3
+ purpose: Collect external and rendered evidence, apply reviewed source changes, and detect regressions without collapsing unlike evidence states.
4
+ failure_behaviour: unavailable dependency, credential, source run, reviewer, exact hash, or unique replacement -> incomplete or fail; never infer success
5
+ ---
6
+
7
+ # Observe, apply, and monitor
8
+
9
+ ## Collection modes
10
+
11
+ - `observe render --target <URL>` uses optional Playwright. Browser evidence is
12
+ not search-index evidence.
13
+ - `observe index --input <JSON>` imports owner exports. With `--target`,
14
+ `--site-url`, and `GSC_ACCESS_TOKEN`, it calls Google URL Inspection, which
15
+ reports the indexed version rather than performing a live indexability test.
16
+ - `observe citations --input <JSON>` imports complete controlled observations.
17
+ With `--endpoint`, the input is a versioned prompt corpus and each prompt runs
18
+ 1-20 times (default 3) through the disclosed adapter protocol. An API is not
19
+ presumed equivalent to a provider's consumer search experience.
20
+ - `observe logs --input <JSON>` imports server/CDN records. User-agent matches
21
+ without IP verification remain low confidence.
22
+ - `observe passages|consensus --target <dir|URL>` performs static extraction.
23
+ - `observe performance` imports evidence or calls CrUX with `CRUX_API_KEY`.
24
+ - `observe corroboration --input <JSON>` records observable external mentions;
25
+ controlled or unverified sources do not become authority claims.
26
+
27
+ ## Guarded remediation
28
+
29
+ `apply --input remediation-spec.json` is a dry run. Every operation binds to an
30
+ existing audit run and finding IDs, stays inside repository source, names a
31
+ reviewer, matches the exact file hash, and identifies exactly one source string.
32
+ `--write` applies only after all operations validate. Build, tests, semantic
33
+ review, re-audit, and snapshot comparison remain mandatory afterward.
34
+
35
+ ## Monitoring
36
+
37
+ `monitor [runA runB]` reports state changes, missing observations, index loss,
38
+ canonical disagreement, and citation-presence changes. Alerts are evidence
39
+ changes, not causal explanations or ranking conclusions. Schedule it in CI at
40
+ the cadence defined by lifecycle and experiment records.
@@ -1,24 +1,25 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "codex",
6
6
  "providerName": "OpenAI Codex",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.3.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.4.0",
9
9
  "variantPath": ".agents/skills/citable",
10
10
  "files": {
11
11
  "commands/action-findings.md": "sha256:510361461f24fcd4a550e0a8d960c383aefe23f9a65a54a3ffc44abd4c1293e7",
12
12
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
13
- "commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
13
+ "commands/measurement.md": "sha256:c90352849a589b4cb66d1275a1888e9a2de5052a62399224c42b00f92bbdd814",
14
+ "commands/observe-and-act.md": "sha256:02a93bbbfddc3d8e11cb921ddccd19b0666133c4bdb4f4a280bcb131bed37e8c",
14
15
  "commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
15
16
  "commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
16
- "commands/README.md": "sha256:186ca808e0f303938ef9f8f98c8273c4b7cb76cc791e7d751c3639bf201e3bb1",
17
+ "commands/README.md": "sha256:71b7f2b7fc5e98cfa2b699ec48f58f3b4e32dfb0233315759fc98f7ae7eecac0",
17
18
  "commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
18
19
  "policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
19
20
  "references/aeo-geo-validation.md": "sha256:e45828d3ccca54a08513cb4235578c8a8ecf1dc47d1cb98e4a497838103bef70",
20
21
  "references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
21
- "references/capability-boundaries.md": "sha256:901840fe87080071d0b11aa329d6a7954ffa6c601c58fadc275b55a7a988376a",
22
+ "references/capability-boundaries.md": "sha256:0d66909025541c1b4b7f5532750fdbfaed9116fb7fc156a67f290024342e30e4",
22
23
  "rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
23
24
  "rubrics/claim-boundedness.md": "sha256:0bab1b85248c252b966175912ebfae13bf18aa7e41573f7466831ac78b5d3e27",
24
25
  "rubrics/comparison-fairness.md": "sha256:7afc86903aa4a695060be7b6bca42ba505c106ea7cfa153344189afc5b78a5ba",
@@ -43,16 +44,18 @@
43
44
  "schemas/evidence.schema.json": "sha256:76baec7ad7e89c6952473c01dacb9e3b26953c088331e6314d531ce620df9ec1",
44
45
  "schemas/experiment.schema.json": "sha256:3cebebc5745a9eb359261408b0a0421b8370d2c94f8244ce939827cd9da41cb6",
45
46
  "schemas/finding.schema.json": "sha256:85907cd04cd8d2fe24a1e618e0df7160f6d56aa1818db501f345aebce5eb5edb",
47
+ "schemas/observation.schema.json": "sha256:81d8994591fff4bc23a10f813f1957719d5a2093171520f661ab8792e14748da",
46
48
  "schemas/page.schema.json": "sha256:627613c35f461177fa946df08edf66fbf6f6bbdfc57eef812572b3af796d5e07",
47
49
  "schemas/project.schema.json": "sha256:ea48fdb6480f7047ba4594bd5908bc1f79c1ad6b9a2c204df900959b5f203dc6",
48
50
  "schemas/prompt-result.schema.json": "sha256:b55be47d7d58d7b1dd8c3b1e849e24e55216212c592cde7eb836953379b85737",
49
51
  "schemas/prompt.schema.json": "sha256:7f0f50c83a86ac91faa7b79895dbc1fed371e8c0342e18d8c2877cc81f4f0f4c",
50
52
  "schemas/query.schema.json": "sha256:3c0793a8c0c48ab39320416790840b345ea987696f35b1cc364f23245a62aacb",
53
+ "schemas/remediation-spec.schema.json": "sha256:6fe8cb773702862ba6d261198bb5cc2dca3eca0a2310a60ebddd04377654df8d",
51
54
  "schemas/run.schema.json": "sha256:46c3178620f3a358d936d535aeadb83454b9b35b551e53e6615cc9862063dacb",
52
55
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
53
- "SKILL.md": "sha256:b9864498dd1507003386ac82b4cb8aea9056af7435c313e1aa19faa5cb185bf1",
56
+ "SKILL.md": "sha256:1e53637f88647dba7bdafc08545ad966f0f77b2814d956d3fbd57b38b3e34fa0",
54
57
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
55
- "VERSION": "sha256:64d23f858ef51b0f996e4966d4e27c0371b437e2d2787890b1f7ad22d4ec5663"
58
+ "VERSION": "sha256:78b591400c56b7b67b8cb3b2b8a8e65e9093897f02ce0878e6b5405c68620fa7"
56
59
  },
57
- "treeHash": "sha256:f9dab639bf6d9fa5b638eefa2cc9ee73c7a30cc37d7f85f625ae608976b195aa"
60
+ "treeHash": "sha256:d5eb2a8baf1230bc82f28610cf0a875f58f5070cb3953838b8310bad07eca012"
58
61
  }
@@ -6,18 +6,18 @@ Use the narrowest supported state. Never promote evidence across rows.
6
6
  | --- | --- | --- |
7
7
  | Allowed by policy | Implemented | Effective robots rule plus crawler-purpose registry decision |
8
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 |
9
+ | Verified crawler reached edge | Imported evidence | `observe logs` record plus provider-published IP verification where supported |
10
+ | Observed in production logs | Imported evidence | Timestamped `observe logs` artifact with URL, status, bytes, latency, cache result, UA, and verification result |
11
+ | Indexed | Google API or imported evidence | `observe index`; Google inspection covers the indexed version, other engines require owner exports |
12
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 |
13
+ | Cited | Import or disclosed adapter | Complete `observe citations` answer with citation URL and product/adapter mode |
14
+ | Materially supports answer | Human review required | `citation_review` maps answer claim to source passage and names the reviewer |
15
15
  | Recommended | Operator supplied + review | Explicit recommendation, constraints, provider/mode/locale/time |
16
16
 
17
- Current CLI URL mode does not prove crawler identity, WAF allowlisting,
17
+ URL audit mode alone does not prove crawler identity, WAF allowlisting,
18
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.
19
+ or provider citation behavior. Observation collectors can supply narrower
20
+ evidence for these states; unavailable inputs remain `not_evidenced`.
21
21
 
22
22
  Primary-source lineage for these boundaries:
23
23
 
@@ -0,0 +1,20 @@
1
+ {
2
+ "$id": "citable://schemas/observation.schema.json",
3
+ "$schema": "http://json-schema.org/draft-07/schema#",
4
+ "title": "Collected observation envelope",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["observation_id", "kind", "state", "collected_at", "collection_method", "confidence", "source", "evidence_hash", "data"],
8
+ "properties": {
9
+ "observation_id": { "type": "string", "minLength": 1 },
10
+ "kind": { "type": "string", "enum": ["render", "index", "citation", "citation_review", "crawler_log", "passage", "canonical_freshness", "performance", "corroboration"] },
11
+ "state": { "type": "string", "enum": ["observed", "not_observed", "not_evidenced", "incomplete", "review_required", "failed"] },
12
+ "collected_at": { "type": "string", "format": "date-time" },
13
+ "collection_method": { "type": "string", "enum": ["live_api", "browser", "owner_import", "synthetic_fetch", "static_analysis", "human_review"] },
14
+ "confidence": { "type": "string", "enum": ["confirmed", "high", "medium", "low", "unknown"] },
15
+ "source": { "type": "string", "minLength": 1 },
16
+ "evidence_hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
17
+ "data": { "type": "object" },
18
+ "limitations": { "type": "array", "items": { "type": "string" } }
19
+ }
20
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$id": "citable://schemas/remediation-spec.schema.json",
3
+ "$schema": "http://json-schema.org/draft-07/schema#",
4
+ "title": "Guarded remediation specification",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["source_run_id", "operations"],
8
+ "properties": {
9
+ "source_run_id": { "type": "string" },
10
+ "operations": {
11
+ "type": "array",
12
+ "items": {
13
+ "type": "object",
14
+ "additionalProperties": false,
15
+ "required": ["operation_id", "file", "find", "replace", "expected_file_hash", "finding_ids"],
16
+ "properties": {
17
+ "operation_id": { "type": "string" },
18
+ "file": { "type": "string", "minLength": 1 },
19
+ "find": { "type": "string", "minLength": 1 },
20
+ "replace": { "type": "string" },
21
+ "expected_file_hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
22
+ "finding_ids": { "type": "array", "minItems": 1, "items": { "type": "string" } },
23
+ "reviewer": { "type": "string" }
24
+ }
25
+ }
26
+ }
27
+ }
28
+ }
@@ -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.3.0
10
+ version: 1.4.0
11
11
  ---
12
12
 
13
13
  # Citable — search & generative discoverability governance
@@ -85,6 +85,9 @@ citable schema --target <dir|url>
85
85
  citable validate [registries|claims|evidence|schema|links]
86
86
  citable compare-snapshots [runA runB]
87
87
  citable action-plan [run-id] # ordered actions, blockers, semantic gates, verification
88
+ citable observe <mode> [options] # render/index/citation/log/passage/consensus/performance evidence
89
+ citable apply --input <spec> [--write] # reviewed, hash-locked remediation; dry run by default
90
+ citable monitor [runA runB] # observation regression alerts
88
91
  ```
89
92
 
90
93
  Audit scopes: `technical seo aeo geo architecture entity claims evidence schema
@@ -126,6 +129,9 @@ mandatory semantic reviews make the relevant posture `not_established`.
126
129
  Consult `references/capability-boundaries.md` before claiming any observation;
127
130
  it identifies which states the current CLI can collect and which require
128
131
  operator data or future adapters.
132
+ Use `commands/observe-and-act.md` for collector prerequisites, evidence labels,
133
+ the controlled citation adapter protocol, remediation refusal conditions, and
134
+ monitoring interpretation.
129
135
 
130
136
  ## Command workflows
131
137
 
@@ -1 +1 @@
1
- 1.3.0
1
+ 1.4.0
@@ -21,11 +21,14 @@ intent, not executability, so statuses are strict:
21
21
  | /citable validate, validate-claims, validate-evidence, validate-schema, validate-links | implemented |
22
22
  | /citable compare-snapshots / validate-regression | implemented |
23
23
  | /citable action-plan | implemented — writes ordered, source-run-bound action artifacts outside immutable evidence packages |
24
+ | /citable observe | implemented — render, index, citation, crawler-log, passage, consensus, performance, and corroboration evidence |
25
+ | /citable apply | implemented — reviewed, hash-locked source replacements; dry run by default |
26
+ | /citable monitor | implemented — compares immutable observation runs and emits evidence-linked alerts |
24
27
  | /citable ingest, map-site, map-queries, map-prompts, map-entities, map-evidence | specified (ingest.md) |
25
28
  | /citable optimize-page | specified (optimize-page.md) — requires source-to-render mapping, claim-preserving rewrites, build execution, rollback; none of that is proven yet |
26
29
  | /citable create-page, answer-block, architect, interlink, consolidate, metadata | specified (page-work.md) |
27
- | /citable validate-render | specified (validate-render.md) blocked on the rendered-truth phase (docs/detectors/render-phase-plan.md) |
28
- | /citable measure seo/aeo/geo, test-prompts, monitor-crawlers, monitor-contradictions | specified (measurement.md) no external engine adapters exist or are claimed |
30
+ | /citable validate-render | partially implemented by `observe render`; mobile/cross-browser and interaction exploration remain |
31
+ | /citable measure seo/aeo/geo, test-prompts, monitor-crawlers, monitor-contradictions | partially implemented by observation imports, Google/CrUX live APIs, custom citation adapters, and monitor comparisons |
29
32
 
30
33
  Shared refusal conditions (all commands): any action that would fabricate
31
34
  facts, citations, evidence, authorship, reviews, corroboration, or hidden
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  command: /citable measure seo|aeo|geo, test-prompts, monitor-crawlers, monitor-contradictions
3
- purpose: Observation and measurement workflows. Citable records and validates observations; it does not claim live engine adapters it does not have.
3
+ purpose: Observation and measurement workflows with exact collector and product-mode boundaries.
4
4
  ---
5
5
 
6
6
  # Honest capability statement
7
7
 
8
- This MVP ships **no external engine adapters** (no Search Console API client,
9
- no ChatGPT/Perplexity automation). Measurement commands therefore operate on
10
- *operator-supplied observations*, validated against the data contracts, plus
11
- registry-side integrity checks (MEAS-001/002/003). Do not imply otherwise.
8
+ Citable ships Google URL Inspection, CrUX field collection, normalized owner
9
+ imports, and a disclosed custom citation-adapter protocol. It does not claim
10
+ Bing AI Performance automation or equivalence between an API adapter and a
11
+ consumer answer product. Preserve collector and product mode on every result.
12
12
 
13
13
  # measure seo
14
14
  Inputs the operator exports (Search Console/Bing/analytics CSV or JSON).
@@ -0,0 +1,40 @@
1
+ ---
2
+ command: /citable observe|apply|monitor
3
+ purpose: Collect external and rendered evidence, apply reviewed source changes, and detect regressions without collapsing unlike evidence states.
4
+ failure_behaviour: unavailable dependency, credential, source run, reviewer, exact hash, or unique replacement -> incomplete or fail; never infer success
5
+ ---
6
+
7
+ # Observe, apply, and monitor
8
+
9
+ ## Collection modes
10
+
11
+ - `observe render --target <URL>` uses optional Playwright. Browser evidence is
12
+ not search-index evidence.
13
+ - `observe index --input <JSON>` imports owner exports. With `--target`,
14
+ `--site-url`, and `GSC_ACCESS_TOKEN`, it calls Google URL Inspection, which
15
+ reports the indexed version rather than performing a live indexability test.
16
+ - `observe citations --input <JSON>` imports complete controlled observations.
17
+ With `--endpoint`, the input is a versioned prompt corpus and each prompt runs
18
+ 1-20 times (default 3) through the disclosed adapter protocol. An API is not
19
+ presumed equivalent to a provider's consumer search experience.
20
+ - `observe logs --input <JSON>` imports server/CDN records. User-agent matches
21
+ without IP verification remain low confidence.
22
+ - `observe passages|consensus --target <dir|URL>` performs static extraction.
23
+ - `observe performance` imports evidence or calls CrUX with `CRUX_API_KEY`.
24
+ - `observe corroboration --input <JSON>` records observable external mentions;
25
+ controlled or unverified sources do not become authority claims.
26
+
27
+ ## Guarded remediation
28
+
29
+ `apply --input remediation-spec.json` is a dry run. Every operation binds to an
30
+ existing audit run and finding IDs, stays inside repository source, names a
31
+ reviewer, matches the exact file hash, and identifies exactly one source string.
32
+ `--write` applies only after all operations validate. Build, tests, semantic
33
+ review, re-audit, and snapshot comparison remain mandatory afterward.
34
+
35
+ ## Monitoring
36
+
37
+ `monitor [runA runB]` reports state changes, missing observations, index loss,
38
+ canonical disagreement, and citation-presence changes. Alerts are evidence
39
+ changes, not causal explanations or ranking conclusions. Schedule it in CI at
40
+ the cadence defined by lifecycle and experiment records.
@@ -1,24 +1,25 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "claude",
6
6
  "providerName": "Claude Code",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.3.0",
8
+ "sourcePackage": "@nebulacomponents/citable@1.4.0",
9
9
  "variantPath": ".claude/skills/citable",
10
10
  "files": {
11
11
  "commands/action-findings.md": "sha256:510361461f24fcd4a550e0a8d960c383aefe23f9a65a54a3ffc44abd4c1293e7",
12
12
  "commands/ingest.md": "sha256:cf35659aecd9d0e160909003efdbe056864fc5d824c71b4ef0ee801ce07ff598",
13
- "commands/measurement.md": "sha256:3550b1e747c5a38cdb712016b9bc773d93596bc4d1b49a309f9cddd816c1b662",
13
+ "commands/measurement.md": "sha256:c90352849a589b4cb66d1275a1888e9a2de5052a62399224c42b00f92bbdd814",
14
+ "commands/observe-and-act.md": "sha256:02a93bbbfddc3d8e11cb921ddccd19b0666133c4bdb4f4a280bcb131bed37e8c",
14
15
  "commands/optimize-page.md": "sha256:35866f3d7cdeef0376ea7a7d7036085a9b9cf95bbb300ecf4bd77610ebd74d85",
15
16
  "commands/page-work.md": "sha256:965a66e59bdf7b0da482d26fade53b3d265885ece5d463fe83b0789ebefaef3e",
16
- "commands/README.md": "sha256:186ca808e0f303938ef9f8f98c8273c4b7cb76cc791e7d751c3639bf201e3bb1",
17
+ "commands/README.md": "sha256:71b7f2b7fc5e98cfa2b699ec48f58f3b4e32dfb0233315759fc98f7ae7eecac0",
17
18
  "commands/validate-render.md": "sha256:a8e1d04d40b84d57c35039250d98c6a7302cd44a148a8c3b9d9cfb92678c4347",
18
19
  "policies/crawler-policy-template.md": "sha256:15c88a4eeb21f53f71e5250dd3eb2d2791a814b304eaefce8bb30e2bdf2e2e59",
19
20
  "references/aeo-geo-validation.md": "sha256:e45828d3ccca54a08513cb4235578c8a8ecf1dc47d1cb98e4a497838103bef70",
20
21
  "references/anti-patterns.md": "sha256:de63f8e646af0fbf479b45eb1d050ae62a8637acc320d21b87e4a083fd4c47e7",
21
- "references/capability-boundaries.md": "sha256:901840fe87080071d0b11aa329d6a7954ffa6c601c58fadc275b55a7a988376a",
22
+ "references/capability-boundaries.md": "sha256:0d66909025541c1b4b7f5532750fdbfaed9116fb7fc156a67f290024342e30e4",
22
23
  "rubrics/answer-extractability.md": "sha256:c8e741143c34e53afdb3dc7b6976ce7b4485dce13b12d14c193fccb17bacf1da",
23
24
  "rubrics/claim-boundedness.md": "sha256:0bab1b85248c252b966175912ebfae13bf18aa7e41573f7466831ac78b5d3e27",
24
25
  "rubrics/comparison-fairness.md": "sha256:7afc86903aa4a695060be7b6bca42ba505c106ea7cfa153344189afc5b78a5ba",
@@ -43,16 +44,18 @@
43
44
  "schemas/evidence.schema.json": "sha256:76baec7ad7e89c6952473c01dacb9e3b26953c088331e6314d531ce620df9ec1",
44
45
  "schemas/experiment.schema.json": "sha256:3cebebc5745a9eb359261408b0a0421b8370d2c94f8244ce939827cd9da41cb6",
45
46
  "schemas/finding.schema.json": "sha256:85907cd04cd8d2fe24a1e618e0df7160f6d56aa1818db501f345aebce5eb5edb",
47
+ "schemas/observation.schema.json": "sha256:81d8994591fff4bc23a10f813f1957719d5a2093171520f661ab8792e14748da",
46
48
  "schemas/page.schema.json": "sha256:627613c35f461177fa946df08edf66fbf6f6bbdfc57eef812572b3af796d5e07",
47
49
  "schemas/project.schema.json": "sha256:ea48fdb6480f7047ba4594bd5908bc1f79c1ad6b9a2c204df900959b5f203dc6",
48
50
  "schemas/prompt-result.schema.json": "sha256:b55be47d7d58d7b1dd8c3b1e849e24e55216212c592cde7eb836953379b85737",
49
51
  "schemas/prompt.schema.json": "sha256:7f0f50c83a86ac91faa7b79895dbc1fed371e8c0342e18d8c2877cc81f4f0f4c",
50
52
  "schemas/query.schema.json": "sha256:3c0793a8c0c48ab39320416790840b345ea987696f35b1cc364f23245a62aacb",
53
+ "schemas/remediation-spec.schema.json": "sha256:6fe8cb773702862ba6d261198bb5cc2dca3eca0a2310a60ebddd04377654df8d",
51
54
  "schemas/run.schema.json": "sha256:46c3178620f3a358d936d535aeadb83454b9b35b551e53e6615cc9862063dacb",
52
55
  "scripts/README.md": "sha256:1c3e952950ef353849621b07c5f615bf7cd20cc5654da4635492a7bd6384e747",
53
- "SKILL.md": "sha256:b9864498dd1507003386ac82b4cb8aea9056af7435c313e1aa19faa5cb185bf1",
56
+ "SKILL.md": "sha256:1e53637f88647dba7bdafc08545ad966f0f77b2814d956d3fbd57b38b3e34fa0",
54
57
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
55
- "VERSION": "sha256:64d23f858ef51b0f996e4966d4e27c0371b437e2d2787890b1f7ad22d4ec5663"
58
+ "VERSION": "sha256:78b591400c56b7b67b8cb3b2b8a8e65e9093897f02ce0878e6b5405c68620fa7"
56
59
  },
57
- "treeHash": "sha256:f9dab639bf6d9fa5b638eefa2cc9ee73c7a30cc37d7f85f625ae608976b195aa"
60
+ "treeHash": "sha256:d5eb2a8baf1230bc82f28610cf0a875f58f5070cb3953838b8310bad07eca012"
58
61
  }
@@ -6,18 +6,18 @@ Use the narrowest supported state. Never promote evidence across rows.
6
6
  | --- | --- | --- |
7
7
  | Allowed by policy | Implemented | Effective robots rule plus crawler-purpose registry decision |
8
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 |
9
+ | Verified crawler reached edge | Imported evidence | `observe logs` record plus provider-published IP verification where supported |
10
+ | Observed in production logs | Imported evidence | Timestamped `observe logs` artifact with URL, status, bytes, latency, cache result, UA, and verification result |
11
+ | Indexed | Google API or imported evidence | `observe index`; Google inspection covers the indexed version, other engines require owner exports |
12
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 |
13
+ | Cited | Import or disclosed adapter | Complete `observe citations` answer with citation URL and product/adapter mode |
14
+ | Materially supports answer | Human review required | `citation_review` maps answer claim to source passage and names the reviewer |
15
15
  | Recommended | Operator supplied + review | Explicit recommendation, constraints, provider/mode/locale/time |
16
16
 
17
- Current CLI URL mode does not prove crawler identity, WAF allowlisting,
17
+ URL audit mode alone does not prove crawler identity, WAF allowlisting,
18
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.
19
+ or provider citation behavior. Observation collectors can supply narrower
20
+ evidence for these states; unavailable inputs remain `not_evidenced`.
21
21
 
22
22
  Primary-source lineage for these boundaries:
23
23
 
@@ -0,0 +1,20 @@
1
+ {
2
+ "$id": "citable://schemas/observation.schema.json",
3
+ "$schema": "http://json-schema.org/draft-07/schema#",
4
+ "title": "Collected observation envelope",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["observation_id", "kind", "state", "collected_at", "collection_method", "confidence", "source", "evidence_hash", "data"],
8
+ "properties": {
9
+ "observation_id": { "type": "string", "minLength": 1 },
10
+ "kind": { "type": "string", "enum": ["render", "index", "citation", "citation_review", "crawler_log", "passage", "canonical_freshness", "performance", "corroboration"] },
11
+ "state": { "type": "string", "enum": ["observed", "not_observed", "not_evidenced", "incomplete", "review_required", "failed"] },
12
+ "collected_at": { "type": "string", "format": "date-time" },
13
+ "collection_method": { "type": "string", "enum": ["live_api", "browser", "owner_import", "synthetic_fetch", "static_analysis", "human_review"] },
14
+ "confidence": { "type": "string", "enum": ["confirmed", "high", "medium", "low", "unknown"] },
15
+ "source": { "type": "string", "minLength": 1 },
16
+ "evidence_hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
17
+ "data": { "type": "object" },
18
+ "limitations": { "type": "array", "items": { "type": "string" } }
19
+ }
20
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$id": "citable://schemas/remediation-spec.schema.json",
3
+ "$schema": "http://json-schema.org/draft-07/schema#",
4
+ "title": "Guarded remediation specification",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["source_run_id", "operations"],
8
+ "properties": {
9
+ "source_run_id": { "type": "string" },
10
+ "operations": {
11
+ "type": "array",
12
+ "items": {
13
+ "type": "object",
14
+ "additionalProperties": false,
15
+ "required": ["operation_id", "file", "find", "replace", "expected_file_hash", "finding_ids"],
16
+ "properties": {
17
+ "operation_id": { "type": "string" },
18
+ "file": { "type": "string", "minLength": 1 },
19
+ "find": { "type": "string", "minLength": 1 },
20
+ "replace": { "type": "string" },
21
+ "expected_file_hash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
22
+ "finding_ids": { "type": "array", "minItems": 1, "items": { "type": "string" } },
23
+ "reviewer": { "type": "string" }
24
+ }
25
+ }
26
+ }
27
+ }
28
+ }
@@ -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.3.0
10
+ version: 1.4.0
11
11
  ---
12
12
 
13
13
  # Citable — search & generative discoverability governance
@@ -85,6 +85,9 @@ citable schema --target <dir|url>
85
85
  citable validate [registries|claims|evidence|schema|links]
86
86
  citable compare-snapshots [runA runB]
87
87
  citable action-plan [run-id] # ordered actions, blockers, semantic gates, verification
88
+ citable observe <mode> [options] # render/index/citation/log/passage/consensus/performance evidence
89
+ citable apply --input <spec> [--write] # reviewed, hash-locked remediation; dry run by default
90
+ citable monitor [runA runB] # observation regression alerts
88
91
  ```
89
92
 
90
93
  Audit scopes: `technical seo aeo geo architecture entity claims evidence schema
@@ -126,6 +129,9 @@ mandatory semantic reviews make the relevant posture `not_established`.
126
129
  Consult `references/capability-boundaries.md` before claiming any observation;
127
130
  it identifies which states the current CLI can collect and which require
128
131
  operator data or future adapters.
132
+ Use `commands/observe-and-act.md` for collector prerequisites, evidence labels,
133
+ the controlled citation adapter protocol, remediation refusal conditions, and
134
+ monitoring interpretation.
129
135
 
130
136
  ## Command workflows
131
137
 
@@ -1 +1 @@
1
- 1.3.0
1
+ 1.4.0