@nebulacomponents/citable 1.18.2 → 1.19.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 (102) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/universal/.agents/skills/citable/SKILL.md +1 -1
  3. package/dist/universal/.agents/skills/citable/VERSION +1 -1
  4. package/dist/universal/.agents/skills/citable/manifest.json +9 -6
  5. package/dist/universal/.agents/skills/citable/schemas/browser-evidence-plan.schema.json +186 -3
  6. package/dist/universal/.agents/skills/citable/schemas/browser-network-events.schema.json +142 -0
  7. package/dist/universal/.agents/skills/citable/schemas/browser-runtime-events.schema.json +112 -0
  8. package/dist/universal/.agents/skills/citable/schemas/browser-state-observations.schema.json +97 -0
  9. package/dist/universal/.claude/agents/citable/manifest.json +2 -2
  10. package/dist/universal/.claude/skills/citable/SKILL.md +1 -1
  11. package/dist/universal/.claude/skills/citable/VERSION +1 -1
  12. package/dist/universal/.claude/skills/citable/manifest.json +9 -6
  13. package/dist/universal/.claude/skills/citable/schemas/browser-evidence-plan.schema.json +186 -3
  14. package/dist/universal/.claude/skills/citable/schemas/browser-network-events.schema.json +142 -0
  15. package/dist/universal/.claude/skills/citable/schemas/browser-runtime-events.schema.json +112 -0
  16. package/dist/universal/.claude/skills/citable/schemas/browser-state-observations.schema.json +97 -0
  17. package/dist/universal/.cursor/skills/citable/SKILL.md +1 -1
  18. package/dist/universal/.cursor/skills/citable/VERSION +1 -1
  19. package/dist/universal/.cursor/skills/citable/manifest.json +9 -6
  20. package/dist/universal/.cursor/skills/citable/schemas/browser-evidence-plan.schema.json +186 -3
  21. package/dist/universal/.cursor/skills/citable/schemas/browser-network-events.schema.json +142 -0
  22. package/dist/universal/.cursor/skills/citable/schemas/browser-runtime-events.schema.json +112 -0
  23. package/dist/universal/.cursor/skills/citable/schemas/browser-state-observations.schema.json +97 -0
  24. package/dist/universal/.gemini/skills/citable/SKILL.md +1 -1
  25. package/dist/universal/.gemini/skills/citable/VERSION +1 -1
  26. package/dist/universal/.gemini/skills/citable/manifest.json +9 -6
  27. package/dist/universal/.gemini/skills/citable/schemas/browser-evidence-plan.schema.json +186 -3
  28. package/dist/universal/.gemini/skills/citable/schemas/browser-network-events.schema.json +142 -0
  29. package/dist/universal/.gemini/skills/citable/schemas/browser-runtime-events.schema.json +112 -0
  30. package/dist/universal/.gemini/skills/citable/schemas/browser-state-observations.schema.json +97 -0
  31. package/dist/universal/.github/skills/citable/SKILL.md +1 -1
  32. package/dist/universal/.github/skills/citable/VERSION +1 -1
  33. package/dist/universal/.github/skills/citable/manifest.json +9 -6
  34. package/dist/universal/.github/skills/citable/schemas/browser-evidence-plan.schema.json +186 -3
  35. package/dist/universal/.github/skills/citable/schemas/browser-network-events.schema.json +142 -0
  36. package/dist/universal/.github/skills/citable/schemas/browser-runtime-events.schema.json +112 -0
  37. package/dist/universal/.github/skills/citable/schemas/browser-state-observations.schema.json +97 -0
  38. package/dist/universal/.kiro/skills/citable/SKILL.md +1 -1
  39. package/dist/universal/.kiro/skills/citable/VERSION +1 -1
  40. package/dist/universal/.kiro/skills/citable/manifest.json +9 -6
  41. package/dist/universal/.kiro/skills/citable/schemas/browser-evidence-plan.schema.json +186 -3
  42. package/dist/universal/.kiro/skills/citable/schemas/browser-network-events.schema.json +142 -0
  43. package/dist/universal/.kiro/skills/citable/schemas/browser-runtime-events.schema.json +112 -0
  44. package/dist/universal/.kiro/skills/citable/schemas/browser-state-observations.schema.json +97 -0
  45. package/dist/universal/.opencode/skills/citable/SKILL.md +1 -1
  46. package/dist/universal/.opencode/skills/citable/VERSION +1 -1
  47. package/dist/universal/.opencode/skills/citable/manifest.json +9 -6
  48. package/dist/universal/.opencode/skills/citable/schemas/browser-evidence-plan.schema.json +186 -3
  49. package/dist/universal/.opencode/skills/citable/schemas/browser-network-events.schema.json +142 -0
  50. package/dist/universal/.opencode/skills/citable/schemas/browser-runtime-events.schema.json +112 -0
  51. package/dist/universal/.opencode/skills/citable/schemas/browser-state-observations.schema.json +97 -0
  52. package/dist/universal/.pi/agent/skills/citable/SKILL.md +1 -1
  53. package/dist/universal/.pi/agent/skills/citable/VERSION +1 -1
  54. package/dist/universal/.pi/agent/skills/citable/manifest.json +9 -6
  55. package/dist/universal/.pi/agent/skills/citable/schemas/browser-evidence-plan.schema.json +186 -3
  56. package/dist/universal/.pi/agent/skills/citable/schemas/browser-network-events.schema.json +142 -0
  57. package/dist/universal/.pi/agent/skills/citable/schemas/browser-runtime-events.schema.json +112 -0
  58. package/dist/universal/.pi/agent/skills/citable/schemas/browser-state-observations.schema.json +97 -0
  59. package/dist/universal/.qoder/skills/citable/SKILL.md +1 -1
  60. package/dist/universal/.qoder/skills/citable/VERSION +1 -1
  61. package/dist/universal/.qoder/skills/citable/manifest.json +9 -6
  62. package/dist/universal/.qoder/skills/citable/schemas/browser-evidence-plan.schema.json +186 -3
  63. package/dist/universal/.qoder/skills/citable/schemas/browser-network-events.schema.json +142 -0
  64. package/dist/universal/.qoder/skills/citable/schemas/browser-runtime-events.schema.json +112 -0
  65. package/dist/universal/.qoder/skills/citable/schemas/browser-state-observations.schema.json +97 -0
  66. package/dist/universal/.rovodev/skills/citable/SKILL.md +1 -1
  67. package/dist/universal/.rovodev/skills/citable/VERSION +1 -1
  68. package/dist/universal/.rovodev/skills/citable/manifest.json +9 -6
  69. package/dist/universal/.rovodev/skills/citable/schemas/browser-evidence-plan.schema.json +186 -3
  70. package/dist/universal/.rovodev/skills/citable/schemas/browser-network-events.schema.json +142 -0
  71. package/dist/universal/.rovodev/skills/citable/schemas/browser-runtime-events.schema.json +112 -0
  72. package/dist/universal/.rovodev/skills/citable/schemas/browser-state-observations.schema.json +97 -0
  73. package/dist/universal/.trae/skills/citable/SKILL.md +1 -1
  74. package/dist/universal/.trae/skills/citable/VERSION +1 -1
  75. package/dist/universal/.trae/skills/citable/manifest.json +9 -6
  76. package/dist/universal/.trae/skills/citable/schemas/browser-evidence-plan.schema.json +186 -3
  77. package/dist/universal/.trae/skills/citable/schemas/browser-network-events.schema.json +142 -0
  78. package/dist/universal/.trae/skills/citable/schemas/browser-runtime-events.schema.json +112 -0
  79. package/dist/universal/.trae/skills/citable/schemas/browser-state-observations.schema.json +97 -0
  80. package/dist/universal/.trae-cn/skills/citable/SKILL.md +1 -1
  81. package/dist/universal/.trae-cn/skills/citable/VERSION +1 -1
  82. package/dist/universal/.trae-cn/skills/citable/manifest.json +9 -6
  83. package/dist/universal/.trae-cn/skills/citable/schemas/browser-evidence-plan.schema.json +186 -3
  84. package/dist/universal/.trae-cn/skills/citable/schemas/browser-network-events.schema.json +142 -0
  85. package/dist/universal/.trae-cn/skills/citable/schemas/browser-runtime-events.schema.json +112 -0
  86. package/dist/universal/.trae-cn/skills/citable/schemas/browser-state-observations.schema.json +97 -0
  87. package/dist/universal/manifest.json +112 -76
  88. package/package.json +1 -1
  89. package/schemas/browser-evidence-plan.schema.json +186 -3
  90. package/schemas/browser-network-events.schema.json +142 -0
  91. package/schemas/browser-runtime-events.schema.json +112 -0
  92. package/schemas/browser-state-observations.schema.json +97 -0
  93. package/skill/SKILL.md +1 -1
  94. package/src/observations/browser/correlation.js +83 -0
  95. package/src/observations/browser/networkCollector.js +413 -0
  96. package/src/observations/browser/runtimeEventCollector.js +337 -0
  97. package/src/observations/browser/sanitizer.js +322 -0
  98. package/src/observations/browser/stateCollector.js +386 -0
  99. package/src/observations/browserJourney.js +131 -3
  100. package/src/reporting/executiveCroReport.js +1 -1
  101. package/src/reporting/executiveSearchReport.js +1 -1
  102. package/src/sow/generateSow.js +1 -1
package/CHANGELOG.md CHANGED
@@ -15,6 +15,52 @@ _No entries yet. See [`BOUNTY.md`](BOUNTY.md) to submit the first one._
15
15
 
16
16
  ## Unreleased
17
17
 
18
+ ## 1.19.0 — 2026-09-11
19
+
20
+ ### Added — Deterministic Bounded Browser-Journey Evidence Acquisition (ADR-003)
21
+
22
+ - **Browser Network Activity Observation (`network-events.json` / `schemas/browser-network-events.schema.json`)**:
23
+ - Captured HTTP/HTTPS network transactions during journey execution via Playwright request/response/failure hooks.
24
+ - Implemented configurable host allowlist filtering (exact match and wildcard subdomains) to isolate target and partner traffic.
25
+ - Recorded request method, URL, status code, protocol, timings, body size, redirects, and failure errors.
26
+ - Deny-by-default payload capture: request and response bodies default to uncaptured (`request_body: false`, `response_body: false`); host allowlist alone never triggers body capture.
27
+ - Explicit status separation: headers, query params, and bodies record status (`not_requested`, `filtered`, `captured`, `truncated`, `unavailable`, `hash_only`, `redacted`).
28
+ - Added strict sanitization of allowlisted request/response headers, query parameters, and JSON payloads with bounded size limits (`max_body_bytes`, `max_field_size`).
29
+ - In-flight request tracking (`summary.in_flight_requests`) and optional bounded settling timeout (`network_policy.settling_timeout_ms`).
30
+ - Added deterministic transaction bounds (`max_events`) with explicit `truncated` flags and epistemic status (`ABSENT`, `TRUNCATED`, `UNOBSERVABLE`, `FAILED`).
31
+ - **Browser State Observation (`state-observations.json` / `schemas/browser-state-observations.schema.json`)**:
32
+ - Captured multi-checkpoint state snapshots at journey stages (`initial`, `before_step`, `step`, `final`).
33
+ - Recorded final URL, allowlisted query parameters, referrer, and navigation type.
34
+ - Governed access to cookies, localStorage, and sessionStorage: dumps only explicitly named keys/cookies declared in policy, unconditionally blocking unlisted storage.
35
+ - HttpOnly cookie semantics: captures presence, length, and security flags (`http_only: true`, `secure: true`, `same_site`), while strictly suppressing raw plaintext values as `[POLICY_RESTRICTED_HTTPONLY]` in `allowlist_values` mode. Context-level failures are recorded in `unavailable_items`.
36
+ - Added safe global variable evaluation using strict AST identifier/bracket path validation (`[a-zA-Z0-9_$.[\]'"]+`) without `eval()` or arbitrary JavaScript execution. Throwing getters during evaluation fail closed to `unavailable_items` without asserting false absence.
37
+ - Extracted DOM query results (presence, text content, attributes) scoped strictly to allowlisted CSS selectors and attributes.
38
+ - **Explicitly Configured Runtime Events (`runtime-events.json` / `schemas/browser-runtime-events.schema.json`)**:
39
+ - Generic listener for global array event queues (e.g. `window.dataLayer`, custom event queues) hooking queues via `Object.defineProperty(window, prop, ...)` to intercept queue reassignment (`window.dataLayer = []`) with polling fallback for unhooked mutations.
40
+ - Safe in-page and Node extraction protecting against hostile throwing getters (`[GETTER_ERROR]`).
41
+ - Detailed collector health reporting in `summary.collector_health` (`status`, `queue_replaced`, `push_replaced`, `polling_fallback_used`, `supported_contexts: ["top_level_main_frame"]`, `unsupported_contexts: ["cross_origin_iframes", "web_workers"]`).
42
+ - Window event listener for declared DOM events (`DOMContentLoaded`, `load`, custom events).
43
+ - Explicit event allowlists, field allowlists, sensitive key redaction, and SHA-256 field hashing.
44
+ - Bounded collection (`max_events`) with explicit truncation counters and `filtered_events` tracking.
45
+ - **Monotonic Sequencing & Temporal Step Correlation**:
46
+ - `src/observations/browser/correlation.js`: Generates monotonically increasing event sequences and microsecond-precision offsets (`monotonic_offset_ms`) from journey start.
47
+ - Explicit phase classification: `during_step`, `between_steps`, and `post_journey`.
48
+ - Asynchronous transaction completion tagging (`ambiguous_async: true`): records `initiated_step_id` and `completed_step_id` when requests resolve across step boundaries or after journey completion.
49
+ - **Mandatory Secret Sanitization & Residual Risk Disclosure (`src/observations/browser/sanitizer.js`)**:
50
+ - Unconditional redaction to `[REDACTED_SECRET]` for Authorization/Bearer headers, Cookie/Set-Cookie headers, basic auth credentials, passwords, session tokens, API keys, private keys, credit cards, and OAuth callback codes.
51
+ - Defense-in-depth regex redaction paired with structural minimization; documented residual risk for novel unstructured secrets in customer-allowlisted payload fields.
52
+ - Recursively applied across headers, query parameters, request/response bodies, state storage values, globals, and runtime event payloads.
53
+ - **Strict ABSENT Epistemic Invariant**:
54
+ - Guarantees that absence (`ABSENT` / `exists: false`) is asserted only when target was in declared scope, collector was active full window, no truncation occurred, candidate was not filtered, and no collector errors occurred.
55
+ - **Resilient Evidence Preservation**:
56
+ - In the event of a required journey step failure, captured partial network events, state observations, and runtime events are preserved and packaged into the failure evidence bundle alongside failure JSON and screenshots.
57
+ - **Schema & Artifact Integration**:
58
+ - Evolved `schemas/browser-evidence-plan.schema.json` backward-compatibly with optional `network_policy`, `state_policy`, `runtime_event_policy`, and `action: "checkpoint"`.
59
+ - All artifacts validated strictly against compiled Ajv schemas via `validateAgainst`.
60
+ - Added summary objects (`network_summary`, `state_summary`, `runtime_events_summary`) and artifact references to the canonical observation envelope (`schemas/observation.schema.json`).
61
+
62
+
63
+
18
64
  ## 1.18.2 — 2026-09-10
19
65
 
20
66
  ### Fixed — Executive Reporting, Evidence Provenance, and Commercial Artifact Hardening
@@ -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.18.2
10
+ version: 1.19.0
11
11
  ---
12
12
 
13
13
  # Citable — evidence and change control for search and AI citation readiness
@@ -1 +1 @@
1
- 1.18.2
1
+ 1.19.0
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "citable",
3
- "version": "1.18.2",
3
+ "version": "1.19.0",
4
4
  "managedBy": "citable-cli",
5
5
  "provider": "codex",
6
6
  "providerName": "OpenAI Codex",
7
7
  "scope": "bundle",
8
- "sourcePackage": "@nebulacomponents/citable@1.18.2",
8
+ "sourcePackage": "@nebulacomponents/citable@1.19.0",
9
9
  "variantPath": ".agents/skills/citable",
10
10
  "agentProfiles": {
11
11
  "status": "unsupported",
@@ -59,7 +59,10 @@
59
59
  "schemas/artifact-interchange.schema.json": "sha256:c6f628934c8a1b8ea2996e03c2c5abd46c2a0e74c680b0a43e44c2343dc9aa21",
60
60
  "schemas/assumption.schema.json": "sha256:31a0f44bbf1d207e013961ec4c39eea85c3ae9efde1485b5e26084562c816844",
61
61
  "schemas/bing-webmaster.schema.json": "sha256:8357c518a8cb4ccd1def2da38950fbba68270e2b1613ad522b50c568a3b8538f",
62
- "schemas/browser-evidence-plan.schema.json": "sha256:81ef14f665b4a00f01afb747576faeb06025722e5c15a36eff3d17e59e978851",
62
+ "schemas/browser-evidence-plan.schema.json": "sha256:1df677fb08338b832d93af2aabec565ef8d621c820cbc77f847dc1c94a814256",
63
+ "schemas/browser-network-events.schema.json": "sha256:aa71380998df74cff929316d7c76332a74c16cd08504214cdb2b86d9d793fee5",
64
+ "schemas/browser-runtime-events.schema.json": "sha256:ff9b6e486ca5a72a6613a4e3e479cd11bcadff52c7481df125aa1670f404a7e4",
65
+ "schemas/browser-state-observations.schema.json": "sha256:7748b9ed7110834e19c1827bd125c0d0cdb50e2dd89a713da03cd643e9c72843",
63
66
  "schemas/canonical-index-import.schema.json": "sha256:ef633662cb30873242ca356443bc4835afe56bb020208e8f42fa47ac8047b66e",
64
67
  "schemas/claim.schema.json": "sha256:ce79ccbfa34ece9b7a309a6962522ea06a1f44c468b4c472b5c376554a788537",
65
68
  "schemas/cli-output-envelope.schema.json": "sha256:6964e8f2f43618bfd0d7a3f5344b37ebc26f04779796bb8ff4675b935b6208c3",
@@ -117,9 +120,9 @@
117
120
  "schemas/sow.schema.json": "sha256:3a3fd6048a747a9bc0cfaea98920376b043616a33c953a9eb8b74d0ae32dded0",
118
121
  "schemas/variance.schema.json": "sha256:68389f64f0a3be13ff8951e8eefba9a5c31d0738325cb47e37c1a8435bea48f0",
119
122
  "scripts/README.md": "sha256:9eee4e8beb4579a183bd714c9dd24b83abd020753eada5caeffae004739d60b5",
120
- "SKILL.md": "sha256:a2c2ce3aced71fc2a66f2e46b4a9fcc10b65819dcef58176b2cefe674d6a941b",
123
+ "SKILL.md": "sha256:70629652ec22ece59e4ddef9198ce9e77f9d4da74eab14a4ccdf99d67c393ab1",
121
124
  "templates/finding-review.md": "sha256:b270a83d3f015150aac80249ae9314979c0befea39ff92ec455f9a5aaa73404c",
122
- "VERSION": "sha256:0a1b17e91d514c0c9e88520e6091e2d52a6faf8296892cad7355ff0723a42914"
125
+ "VERSION": "sha256:c55c898de5079ee498d5f051b29815688154292df4d72ab91f1edb5497ac4e6e"
123
126
  },
124
- "treeHash": "sha256:2d4210d9dd26b7952f53964402abf06c8ae12ae43cb8ac5c568f070ab44b0001"
127
+ "treeHash": "sha256:0343fe90b5b631f5405e5c6390355f4fc6f926d0cf9e49946f3bed921b29ff2e"
125
128
  }
@@ -5,6 +5,181 @@
5
5
  "type": "object",
6
6
  "additionalProperties": false,
7
7
  "required": ["schema_version", "plan_id", "target", "profiles", "limitations"],
8
+ "definitions": {
9
+ "network_policy": {
10
+ "type": "object",
11
+ "additionalProperties": false,
12
+ "properties": {
13
+ "enabled": { "type": "boolean" },
14
+ "allowed_host_patterns": {
15
+ "type": "array",
16
+ "items": { "type": "string", "minLength": 1 }
17
+ },
18
+ "allowed_methods": {
19
+ "type": "array",
20
+ "items": { "type": "string", "enum": ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"] }
21
+ },
22
+ "allowed_resource_types": {
23
+ "type": "array",
24
+ "items": { "type": "string", "enum": ["document", "stylesheet", "image", "media", "font", "script", "texttrack", "xhr", "fetch", "eventsource", "websocket", "manifest", "other"] }
25
+ },
26
+ "capture_request_headers": {
27
+ "type": "array",
28
+ "items": { "type": "string", "minLength": 1 }
29
+ },
30
+ "capture_response_headers": {
31
+ "type": "array",
32
+ "items": { "type": "string", "minLength": 1 }
33
+ },
34
+ "capture_query_params": {
35
+ "type": "array",
36
+ "items": { "type": "string", "minLength": 1 }
37
+ },
38
+ "capture_payload": {
39
+ "type": "object",
40
+ "additionalProperties": false,
41
+ "properties": {
42
+ "request_body": { "type": "boolean" },
43
+ "response_body": { "type": "boolean" },
44
+ "allowed_json_fields": {
45
+ "type": "array",
46
+ "items": { "type": "string", "minLength": 1 }
47
+ },
48
+ "hash_only": { "type": "boolean" },
49
+ "max_bytes": { "type": "integer", "minimum": 0, "maximum": 65536 }
50
+ }
51
+ },
52
+ "max_events": { "type": "integer", "minimum": 1, "maximum": 1000 },
53
+ "max_field_size": { "type": "integer", "minimum": 1, "maximum": 8192 },
54
+ "settling_timeout_ms": { "type": "integer", "minimum": 0, "maximum": 5000 }
55
+ }
56
+ },
57
+ "state_policy": {
58
+ "type": "object",
59
+ "additionalProperties": false,
60
+ "properties": {
61
+ "enabled": { "type": "boolean" },
62
+ "checkpoints": {
63
+ "type": "array",
64
+ "items": { "type": "string", "enum": ["initial", "step", "final"] }
65
+ },
66
+ "capture_url": { "type": "boolean" },
67
+ "allowed_query_params": {
68
+ "type": "array",
69
+ "items": { "type": "string", "minLength": 1 }
70
+ },
71
+ "capture_referrer": { "type": "boolean" },
72
+ "capture_navigation": { "type": "boolean" },
73
+ "cookies": {
74
+ "type": "object",
75
+ "additionalProperties": false,
76
+ "properties": {
77
+ "allowed_names": {
78
+ "type": "array",
79
+ "items": { "type": "string", "minLength": 1 }
80
+ },
81
+ "mode": { "enum": ["presence_only", "hash_only", "allowlist_values"] },
82
+ "max_keys": { "type": "integer", "minimum": 1, "maximum": 100 }
83
+ }
84
+ },
85
+ "local_storage": {
86
+ "type": "object",
87
+ "additionalProperties": false,
88
+ "properties": {
89
+ "allowed_keys": {
90
+ "type": "array",
91
+ "items": { "type": "string", "minLength": 1 }
92
+ },
93
+ "mode": { "enum": ["presence_only", "hash_only", "allowlist_values"] },
94
+ "max_keys": { "type": "integer", "minimum": 1, "maximum": 100 }
95
+ }
96
+ },
97
+ "session_storage": {
98
+ "type": "object",
99
+ "additionalProperties": false,
100
+ "properties": {
101
+ "allowed_keys": {
102
+ "type": "array",
103
+ "items": { "type": "string", "minLength": 1 }
104
+ },
105
+ "mode": { "enum": ["presence_only", "hash_only", "allowlist_values"] },
106
+ "max_keys": { "type": "integer", "minimum": 1, "maximum": 100 }
107
+ }
108
+ },
109
+ "globals": {
110
+ "type": "array",
111
+ "items": {
112
+ "type": "object",
113
+ "additionalProperties": false,
114
+ "required": ["name", "expression"],
115
+ "properties": {
116
+ "name": { "type": "string", "pattern": "^[a-zA-Z0-9_.-]+$" },
117
+ "expression": { "type": "string", "pattern": "^[a-zA-Z0-9_$.\\[\\]'\"]+$" },
118
+ "mode": { "enum": ["presence_only", "type_only", "hash_only", "scalar_value"] }
119
+ }
120
+ }
121
+ },
122
+ "dom_queries": {
123
+ "type": "array",
124
+ "items": {
125
+ "type": "object",
126
+ "additionalProperties": false,
127
+ "required": ["name", "selector", "property"],
128
+ "properties": {
129
+ "name": { "type": "string", "pattern": "^[a-zA-Z0-9_.-]+$" },
130
+ "selector": { "type": "string", "minLength": 1 },
131
+ "property": { "enum": ["presence", "visible", "text_hash", "text_length", "text_content", "attribute_value"] },
132
+ "attribute_name": { "type": "string" }
133
+ }
134
+ }
135
+ },
136
+ "max_observations": { "type": "integer", "minimum": 1, "maximum": 500 },
137
+ "max_value_length": { "type": "integer", "minimum": 1, "maximum": 4096 }
138
+ }
139
+ },
140
+ "runtime_event_policy": {
141
+ "type": "object",
142
+ "additionalProperties": false,
143
+ "properties": {
144
+ "enabled": { "type": "boolean" },
145
+ "sources": {
146
+ "type": "array",
147
+ "minItems": 1,
148
+ "items": {
149
+ "type": "object",
150
+ "additionalProperties": false,
151
+ "required": ["source_id", "type"],
152
+ "properties": {
153
+ "source_id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9_-]*$" },
154
+ "type": { "enum": ["global_array", "window_event", "custom_stream"] },
155
+ "global_name": { "type": "string", "pattern": "^[a-zA-Z0-9_.]+$" },
156
+ "event_name": { "type": "string", "minLength": 1 },
157
+ "event_name_key": { "type": "string", "minLength": 1 }
158
+ }
159
+ }
160
+ },
161
+ "allowed_event_names": {
162
+ "type": "array",
163
+ "items": { "type": "string", "minLength": 1 }
164
+ },
165
+ "allowed_fields": {
166
+ "type": "array",
167
+ "items": { "type": "string", "minLength": 1 }
168
+ },
169
+ "hash_fields": {
170
+ "type": "array",
171
+ "items": { "type": "string", "minLength": 1 }
172
+ },
173
+ "redact_fields": {
174
+ "type": "array",
175
+ "items": { "type": "string", "minLength": 1 }
176
+ },
177
+ "max_events": { "type": "integer", "minimum": 1, "maximum": 1000 },
178
+ "max_payload_depth": { "type": "integer", "minimum": 1, "maximum": 10 },
179
+ "max_field_size": { "type": "integer", "minimum": 1, "maximum": 4096 }
180
+ }
181
+ }
182
+ },
8
183
  "properties": {
9
184
  "schema_version": { "const": 1 },
10
185
  "plan_id": { "type": "string", "pattern": "^BROWSER-PLAN-[A-Z0-9_-]+$" },
@@ -16,13 +191,16 @@
16
191
  "properties": {
17
192
  "policy_id": { "type": "string", "pattern": "^RENDER-POLICY-[A-Z0-9_-]+$" },
18
193
  "review_owner": { "type": "string", "minLength": 1 },
19
- "min_text_retention_ratio": { "type": "number", "minimum": 0, "maximum": 1 },
194
+ "min_text_retention_ratio": { "number": 0, "minimum": 0, "maximum": 1 },
20
195
  "require_heading_parity": { "type": "boolean" },
21
196
  "require_link_parity": { "type": "boolean" },
22
197
  "require_structured_data_parity": { "type": "boolean" },
23
198
  "limitations": { "type": "array", "minItems": 1, "items": { "type": "string", "minLength": 1 } }
24
199
  }
25
200
  },
201
+ "network_policy": { "$ref": "#/definitions/network_policy" },
202
+ "state_policy": { "$ref": "#/definitions/state_policy" },
203
+ "runtime_event_policy": { "$ref": "#/definitions/runtime_event_policy" },
26
204
  "profiles": {
27
205
  "type": "array",
28
206
  "minItems": 1,
@@ -63,6 +241,9 @@
63
241
  "locale": { "type": "string", "minLength": 2 },
64
242
  "consent_state": { "enum": ["not_present", "denied", "granted", "unresolved", "unknown"] },
65
243
  "authentication_state": { "enum": ["anonymous", "owner_authenticated", "unresolved", "unknown"] },
244
+ "network_policy": { "$ref": "#/definitions/network_policy" },
245
+ "state_policy": { "$ref": "#/definitions/state_policy" },
246
+ "runtime_event_policy": { "$ref": "#/definitions/runtime_event_policy" },
66
247
  "steps": {
67
248
  "type": "array",
68
249
  "items": {
@@ -71,13 +252,15 @@
71
252
  "required": ["step_id", "action", "locator", "value_env", "key", "url", "required", "capture_screenshot"],
72
253
  "properties": {
73
254
  "step_id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9_-]*$" },
74
- "action": { "enum": ["navigate", "click", "fill", "select_option", "check", "press", "wait_for", "assert_visible", "scroll"] },
255
+ "action": { "enum": ["navigate", "click", "fill", "select_option", "check", "press", "wait_for", "assert_visible", "scroll", "checkpoint"] },
75
256
  "locator": { "type": ["string", "null"] },
76
257
  "value_env": { "type": ["string", "null"], "pattern": "^[A-Z][A-Z0-9_]*$" },
77
258
  "key": { "type": ["string", "null"] },
78
259
  "url": { "type": ["string", "null"], "format": "uri" },
79
260
  "required": { "type": "boolean" },
80
- "capture_screenshot": { "type": "boolean" }
261
+ "capture_screenshot": { "type": "boolean" },
262
+ "checkpoint_id": { "type": ["string", "null"], "pattern": "^[a-z0-9][a-z0-9_-]*$" },
263
+ "state_checkpoint": { "type": ["boolean", "null"] }
81
264
  }
82
265
  }
83
266
  },
@@ -0,0 +1,142 @@
1
+ {
2
+ "$id": "citable://schemas/browser-network-events.schema.json",
3
+ "$schema": "http://json-schema.org/draft-07/schema#",
4
+ "title": "Browser network activity evidence artifact",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "plan_id",
10
+ "profile_id",
11
+ "collected_at",
12
+ "capture_policy",
13
+ "summary",
14
+ "events"
15
+ ],
16
+ "properties": {
17
+ "schema_version": { "const": 1 },
18
+ "plan_id": { "type": "string" },
19
+ "profile_id": { "type": "string" },
20
+ "collected_at": { "type": "string", "format": "date-time" },
21
+ "capture_policy": { "type": "object" },
22
+ "summary": {
23
+ "type": "object",
24
+ "additionalProperties": false,
25
+ "required": ["total_requests", "successful_responses", "failed_requests", "filtered_requests", "truncated", "status_codes"],
26
+ "properties": {
27
+ "total_requests": { "type": "integer", "minimum": 0 },
28
+ "successful_responses": { "type": "integer", "minimum": 0 },
29
+ "failed_requests": { "type": "integer", "minimum": 0 },
30
+ "filtered_requests": { "type": "integer", "minimum": 0 },
31
+ "in_flight_requests": { "type": "integer", "minimum": 0 },
32
+ "collector_status": { "enum": ["complete", "truncated", "failed"] },
33
+ "truncated": { "type": "boolean" },
34
+ "truncation_reason": { "type": ["string", "null"] },
35
+ "status_codes": {
36
+ "type": "object",
37
+ "additionalProperties": { "type": "integer" }
38
+ }
39
+ }
40
+ },
41
+ "events": {
42
+ "type": "array",
43
+ "items": {
44
+ "type": "object",
45
+ "additionalProperties": false,
46
+ "required": [
47
+ "sequence",
48
+ "transaction_id",
49
+ "direction",
50
+ "phase",
51
+ "timing",
52
+ "correlation",
53
+ "request"
54
+ ],
55
+ "properties": {
56
+ "sequence": { "type": "integer", "minimum": 1 },
57
+ "transaction_id": { "type": "string" },
58
+ "direction": { "enum": ["request", "response"] },
59
+ "phase": { "enum": ["request_sent", "response_received", "failed", "redirect"] },
60
+ "timing": {
61
+ "type": "object",
62
+ "additionalProperties": false,
63
+ "required": ["monotonic_offset_ms", "timestamp"],
64
+ "properties": {
65
+ "monotonic_offset_ms": { "type": "number", "minimum": 0 },
66
+ "timestamp": { "type": "string", "format": "date-time" }
67
+ }
68
+ },
69
+ "correlation": {
70
+ "type": "object",
71
+ "additionalProperties": false,
72
+ "required": ["step_id", "step_sequence", "attribution_phase"],
73
+ "properties": {
74
+ "step_id": { "type": ["string", "null"] },
75
+ "step_sequence": { "type": ["integer", "null"] },
76
+ "checkpoint_id": { "type": ["string", "null"] },
77
+ "attribution_phase": { "enum": ["initial", "during_step", "between_steps", "post_journey", "ambiguous_async"] },
78
+ "initiated_step_id": { "type": ["string", "null"] },
79
+ "completed_step_id": { "type": ["string", "null"] },
80
+ "ambiguous_async": { "type": "boolean" }
81
+ }
82
+ },
83
+ "request": {
84
+ "type": "object",
85
+ "additionalProperties": false,
86
+ "required": ["url", "method", "scheme", "host", "path", "resource_type"],
87
+ "properties": {
88
+ "url": { "type": "string" },
89
+ "method": { "type": "string" },
90
+ "scheme": { "type": "string" },
91
+ "host": { "type": "string" },
92
+ "path": { "type": "string" },
93
+ "resource_type": { "type": "string" },
94
+ "query": { "type": ["object", "null"] },
95
+ "query_status": { "enum": ["captured", "not_requested", "filtered", "none_present", "redacted"] },
96
+ "headers": { "type": ["object", "null"] },
97
+ "headers_status": { "enum": ["captured", "not_requested", "filtered", "redacted"] },
98
+ "payload_hash": { "type": ["string", "null"] },
99
+ "payload_bytes": { "type": ["integer", "null"] },
100
+ "payload_fields": { "type": ["object", "null"] },
101
+ "payload_status": { "enum": ["not_requested", "captured", "filtered", "truncated", "unavailable", "hash_only"] }
102
+ }
103
+ },
104
+ "response": {
105
+ "type": ["object", "null"],
106
+ "additionalProperties": false,
107
+ "properties": {
108
+ "status": { "type": "integer" },
109
+ "status_text": { "type": "string" },
110
+ "headers": { "type": ["object", "null"] },
111
+ "headers_status": { "enum": ["captured", "not_requested", "filtered", "redacted"] },
112
+ "mime_type": { "type": ["string", "null"] },
113
+ "body_hash": { "type": ["string", "null"] },
114
+ "body_bytes": { "type": ["integer", "null"] },
115
+ "body_fields": { "type": ["object", "null"] },
116
+ "body_status": { "enum": ["not_requested", "captured", "filtered", "truncated", "unavailable", "hash_only"] },
117
+ "redirect_url": { "type": ["string", "null"] },
118
+ "from_cache": { "type": "boolean" }
119
+ }
120
+ },
121
+ "failure": {
122
+ "type": ["object", "null"],
123
+ "additionalProperties": false,
124
+ "properties": {
125
+ "error_text": { "type": "string" }
126
+ }
127
+ },
128
+ "disposition": {
129
+ "type": "object",
130
+ "additionalProperties": false,
131
+ "required": ["capture_status", "redacted_count", "filtered_fields"],
132
+ "properties": {
133
+ "capture_status": { "enum": ["captured", "filtered", "redacted", "truncated", "error"] },
134
+ "redacted_count": { "type": "integer", "minimum": 0 },
135
+ "filtered_fields": { "type": "array", "items": { "type": "string" } }
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }
141
+ }
142
+ }
@@ -0,0 +1,112 @@
1
+ {
2
+ "$id": "citable://schemas/browser-runtime-events.schema.json",
3
+ "$schema": "http://json-schema.org/draft-07/schema#",
4
+ "title": "Browser runtime events evidence artifact",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "plan_id",
10
+ "profile_id",
11
+ "collected_at",
12
+ "capture_policy",
13
+ "summary",
14
+ "events"
15
+ ],
16
+ "properties": {
17
+ "schema_version": { "const": 1 },
18
+ "plan_id": { "type": "string" },
19
+ "profile_id": { "type": "string" },
20
+ "collected_at": { "type": "string", "format": "date-time" },
21
+ "capture_policy": { "type": "object" },
22
+ "summary": {
23
+ "type": "object",
24
+ "additionalProperties": false,
25
+ "required": ["total_events", "by_source", "by_event_name", "truncated"],
26
+ "properties": {
27
+ "total_events": { "type": "integer", "minimum": 0 },
28
+ "filtered_events": { "type": "integer", "minimum": 0 },
29
+ "collector_status": { "enum": ["complete", "truncated", "failed"] },
30
+ "by_source": {
31
+ "type": "object",
32
+ "additionalProperties": { "type": "integer" }
33
+ },
34
+ "by_event_name": {
35
+ "type": "object",
36
+ "additionalProperties": { "type": "integer" }
37
+ },
38
+ "truncated": { "type": "boolean" },
39
+ "truncation_reason": { "type": ["string", "null"] },
40
+ "collector_health": {
41
+ "type": "object",
42
+ "additionalProperties": false,
43
+ "properties": {
44
+ "status": { "type": "string" },
45
+ "queue_replaced": { "type": "boolean" },
46
+ "push_replaced": { "type": "boolean" },
47
+ "polling_fallback_used": { "type": "boolean" },
48
+ "supported_contexts": { "type": "array", "items": { "type": "string" } },
49
+ "unsupported_contexts": { "type": "array", "items": { "type": "string" } }
50
+ }
51
+ }
52
+ }
53
+ },
54
+ "events": {
55
+ "type": "array",
56
+ "items": {
57
+ "type": "object",
58
+ "additionalProperties": false,
59
+ "required": [
60
+ "sequence",
61
+ "source_id",
62
+ "event_name",
63
+ "timing",
64
+ "correlation",
65
+ "payload"
66
+ ],
67
+ "properties": {
68
+ "sequence": { "type": "integer", "minimum": 1 },
69
+ "source_id": { "type": "string" },
70
+ "event_name": { "type": "string" },
71
+ "occurrence_index": { "type": "integer", "minimum": 1 },
72
+ "timing": {
73
+ "type": "object",
74
+ "additionalProperties": false,
75
+ "required": ["monotonic_offset_ms", "timestamp"],
76
+ "properties": {
77
+ "monotonic_offset_ms": { "type": "number", "minimum": 0 },
78
+ "timestamp": { "type": "string", "format": "date-time" }
79
+ }
80
+ },
81
+ "correlation": {
82
+ "type": "object",
83
+ "additionalProperties": false,
84
+ "required": ["step_id", "step_sequence", "attribution_phase"],
85
+ "properties": {
86
+ "step_id": { "type": ["string", "null"] },
87
+ "step_sequence": { "type": ["integer", "null"] },
88
+ "checkpoint_id": { "type": ["string", "null"] },
89
+ "attribution_phase": { "enum": ["initial", "during_step", "between_steps", "post_journey", "ambiguous_async"] },
90
+ "initiated_step_id": { "type": ["string", "null"] },
91
+ "completed_step_id": { "type": ["string", "null"] },
92
+ "ambiguous_async": { "type": "boolean" }
93
+ }
94
+ },
95
+ "payload": {
96
+ "type": "object"
97
+ },
98
+ "disposition": {
99
+ "type": "object",
100
+ "additionalProperties": false,
101
+ "required": ["capture_status", "redacted_count", "filtered_fields"],
102
+ "properties": {
103
+ "capture_status": { "enum": ["captured", "filtered", "redacted", "truncated"] },
104
+ "redacted_count": { "type": "integer", "minimum": 0 },
105
+ "filtered_fields": { "type": "array", "items": { "type": "string" } }
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }