thumbgate 1.34.3 → 1.37.1

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 (200) hide show
  1. package/.agents/skills/cyberstrike-compare-not-clone/SKILL.md +36 -0
  2. package/.agents/skills/gitlab-sandbox-allowlist-not-trust/SKILL.md +77 -0
  3. package/.agents/skills/jit-harness-compare-not-clone/SKILL.md +34 -0
  4. package/.agents/skills/openui-catalog-compose-honesty/SKILL.md +64 -0
  5. package/.agents/skills/zvec-grep-compare-not-clone/SKILL.md +34 -0
  6. package/.claude-plugin/plugin.json +1 -1
  7. package/.well-known/llms.txt +1 -0
  8. package/.well-known/mcp/server-card.json +1 -1
  9. package/CONTRIBUTING.md +95 -0
  10. package/README.md +195 -632
  11. package/THIRD_PARTY_NOTICES.md +89 -0
  12. package/adapters/claude/.mcp.json +2 -2
  13. package/adapters/forge/forge.yaml +3 -3
  14. package/adapters/future-agi/.mcp.json +8 -0
  15. package/adapters/future-agi/FUTURE_AGI.md +23 -0
  16. package/adapters/future-agi/config.toml +3 -0
  17. package/adapters/future-agi/future-agi-bridge.js +9 -0
  18. package/adapters/future-agi/opencode.json +8 -0
  19. package/adapters/herdr/herdr-plugin.toml +18 -0
  20. package/adapters/mcp/server-stdio.js +238 -25
  21. package/adapters/opencode/opencode.json +1 -1
  22. package/adapters/workos/WORKOS.md +52 -0
  23. package/bin/cli.js +373 -5
  24. package/bin/futureagi-bridge +9 -0
  25. package/config/gate-templates.json +653 -4
  26. package/config/gates/actor-critic-audit.json +34 -0
  27. package/config/gates/default.json +21 -2
  28. package/config/gates/five-walls-governance.json +34 -0
  29. package/config/gates/future-agi-guardrails.json +34 -0
  30. package/config/gates/radware-threat-defense-2026.json +61 -0
  31. package/config/gates/simatree-data-governance.json +33 -0
  32. package/config/mcp-allowlists.json +4 -0
  33. package/config/merge-quality-checks.json +10 -1
  34. package/config/model-candidates.json +382 -24
  35. package/config/model-tiers.json +18 -0
  36. package/config/post-deploy-marketing-pages.json +10 -0
  37. package/config/progressive/01-wire-only.json +11 -0
  38. package/config/progressive/02-dashboard-empty-ok.json +10 -0
  39. package/config/progressive/03-one-lesson.json +10 -0
  40. package/config/progressive/04-warn-fires.json +11 -0
  41. package/config/progressive/05-strict-optional.json +11 -0
  42. package/config/progressive/README.md +15 -0
  43. package/config/schemas/broker-execution-receipt.schema.json +139 -0
  44. package/config/schemas/provider-execution-attestation-v1.schema.json +58 -0
  45. package/conformance/provider-attestation/vectors.json +320 -0
  46. package/docs/specs/provider-execution-attestation-v1.md +69 -0
  47. package/openapi/openapi.yaml +15 -0
  48. package/package.json +401 -147
  49. package/public/about.html +2 -2
  50. package/public/ai-malpractice-prevention.html +7 -7
  51. package/public/blog/a-10-dollar-vps-is-not-a-computer.html +143 -0
  52. package/public/blog/a-receipt-is-not-world-state.html +388 -0
  53. package/public/blog/git-at-agent-scale.html +374 -0
  54. package/public/blog/no-llm-in-the-gate.html +133 -0
  55. package/public/blog.html +80 -0
  56. package/public/case-studies.html +16 -1
  57. package/public/compare.html +28 -0
  58. package/public/diagnostic.html +216 -7
  59. package/public/docs/connectors.html +39 -0
  60. package/public/federal.html +2 -2
  61. package/public/founders.html +639 -0
  62. package/public/index.html +87 -9
  63. package/public/install.html +8 -8
  64. package/public/learn.html +39 -0
  65. package/public/numbers.html +2 -2
  66. package/public/peter.html +310 -0
  67. package/public/platform-partners.html +119 -0
  68. package/public/pricing.html +24 -3
  69. package/public/privacy.html +117 -0
  70. package/public/pro.html +17 -0
  71. package/public/support.html +62 -0
  72. package/public/terms.html +130 -0
  73. package/public/third-party-notices.html +95 -0
  74. package/public/yt.html +351 -0
  75. package/scripts/action-receipts.js +133 -3
  76. package/scripts/adaptive-governance-arena.js +349 -0
  77. package/scripts/admin-override.js +205 -0
  78. package/scripts/agent-action-inventory.js +869 -0
  79. package/scripts/agent-audit-trace.js +42 -2
  80. package/scripts/agent-egress-policy.js +1117 -0
  81. package/scripts/agent-memory-lifecycle.js +141 -2
  82. package/scripts/agent-operations-planner.js +441 -1
  83. package/scripts/agent-readiness.js +68 -0
  84. package/scripts/agent-security-central.js +647 -0
  85. package/scripts/allowlist-bridge-honesty.js +417 -0
  86. package/scripts/async-job-runner.js +102 -11
  87. package/scripts/audit-trail.js +212 -0
  88. package/scripts/auto-promote-gates.js +178 -27
  89. package/scripts/billing.js +1 -1
  90. package/scripts/broker-execution-receipts.js +719 -0
  91. package/scripts/budget-aware-gates-proof.js +423 -0
  92. package/scripts/claude-feedback-sync.js +29 -3
  93. package/scripts/claw-harness-production.js +237 -0
  94. package/scripts/cli-progress.js +111 -0
  95. package/scripts/cli-schema.js +163 -1
  96. package/scripts/codex-runbook-flywheel.js +318 -0
  97. package/scripts/context-footprint.js +186 -0
  98. package/scripts/contextfs.js +143 -61
  99. package/scripts/dashboard-limits.js +27 -0
  100. package/scripts/dashboard.js +279 -9
  101. package/scripts/deepseek-v4-runtime-guardrails.js +72 -6
  102. package/scripts/docker-sandbox-planner.js +18 -0
  103. package/scripts/double-blind-eval-protocol.js +252 -0
  104. package/scripts/edotenv-rl-gateway.js +259 -0
  105. package/scripts/ensure-production-search-corpus.js +162 -0
  106. package/scripts/eval-holdout.js +311 -0
  107. package/scripts/feedback-aggregate.js +21 -2
  108. package/scripts/feedback-loop.js +87 -5
  109. package/scripts/feedback-quality.js +9 -0
  110. package/scripts/file-ledger-lock.js +4 -1
  111. package/scripts/financial-control-plane.js +41 -1
  112. package/scripts/find-dormant-requires.js +118 -0
  113. package/scripts/fs-utils.js +84 -8
  114. package/scripts/gate-stats.js +2 -2
  115. package/scripts/gates-engine.js +859 -58
  116. package/scripts/generate-case-study-outreach.js +24 -15
  117. package/scripts/git-at-scale.js +628 -0
  118. package/scripts/governance-conflict-audit.js +1650 -0
  119. package/scripts/governance-difficulty-curriculum.js +328 -0
  120. package/scripts/graphrag-retrieval.js +275 -0
  121. package/scripts/gurobi-optimizer.js +324 -0
  122. package/scripts/gurobi_optimizer.py +485 -0
  123. package/scripts/harness-selector.js +82 -1
  124. package/scripts/hidden-entry-points.js +284 -0
  125. package/scripts/human-escalation.js +199 -1
  126. package/scripts/hybrid-feedback-context.js +152 -19
  127. package/scripts/intent-governed-execution.js +602 -0
  128. package/scripts/intervention-policy.js +123 -20
  129. package/scripts/jit-harness-compose.js +628 -0
  130. package/scripts/jsonl-watcher.js +10 -0
  131. package/scripts/lesson-embedding-index.js +95 -12
  132. package/scripts/lesson-retrieval.js +105 -19
  133. package/scripts/local-model-profile.js +19 -2
  134. package/scripts/mailer/resend-mailer.js +1 -1
  135. package/scripts/matryoshka-embedding.js +235 -0
  136. package/scripts/mcp-oauth.js +42 -4
  137. package/scripts/mcp-session-handles.js +1016 -0
  138. package/scripts/mcp-wiring-doctor.js +314 -0
  139. package/scripts/memory-firewall.js +115 -2
  140. package/scripts/memory-scope-readiness.js +299 -0
  141. package/scripts/memory-vs-rag-route.js +161 -0
  142. package/scripts/model-tier-router.js +148 -21
  143. package/scripts/nvidia-specdecode-al-doctor.js +536 -0
  144. package/scripts/openui-catalog-compose-honesty.js +593 -0
  145. package/scripts/operational-integrity.js +19 -1
  146. package/scripts/override-audit.js +213 -0
  147. package/scripts/package-manager-honesty-doctor.js +458 -0
  148. package/scripts/pr-manager.js +63 -1
  149. package/scripts/prove-herdr-adapter.js +52 -0
  150. package/scripts/prove-memory-pyramid-and-symbolic-canvas.js +95 -0
  151. package/scripts/prove-workos.js +73 -0
  152. package/scripts/provider-attestation-conformance.js +192 -0
  153. package/scripts/provider-receipt-contract.js +136 -0
  154. package/scripts/qwen38-max-cost-optimizer.js +401 -0
  155. package/scripts/radware-threat-defense.js +280 -0
  156. package/scripts/rag-embedding-identity.js +221 -0
  157. package/scripts/rag-precision-guardrails.js +112 -2
  158. package/scripts/remote-feedback-capture.js +159 -0
  159. package/scripts/research-agent-harness.js +256 -0
  160. package/scripts/rsi-safety-hillclimb.js +200 -0
  161. package/scripts/rule-sprawl.js +188 -0
  162. package/scripts/schedule-manager.js +147 -0
  163. package/scripts/self-heal.js +8 -0
  164. package/scripts/session-lease.js +415 -0
  165. package/scripts/simatree-data-governance.js +347 -0
  166. package/scripts/slo-alert-engine.js +172 -7
  167. package/scripts/solver-parity.js +539 -0
  168. package/scripts/stealth-memory-injection-gate.js +333 -0
  169. package/scripts/switchyard-router.js +366 -0
  170. package/scripts/telemetry-analytics.js +84 -27
  171. package/scripts/temporal-decay-weighting.js +138 -0
  172. package/scripts/test-all.js +165 -0
  173. package/scripts/token-savings.js +42 -0
  174. package/scripts/tool-kpi-tracker.js +108 -5
  175. package/scripts/tool-registry.js +193 -5
  176. package/scripts/universal-claim-evaluator.js +14 -2
  177. package/scripts/vector-store.js +279 -9
  178. package/scripts/workflow-notebook.js +391 -0
  179. package/scripts/workflow-sentinel.js +111 -12
  180. package/scripts/workos-production-guard.js +260 -0
  181. package/scripts/workspace-search-route.js +515 -0
  182. package/server.json +2 -2
  183. package/src/agent-identity-boundary.js +76 -0
  184. package/src/agent-retrieval-cache.js +155 -0
  185. package/src/alert-noise-ledger.js +502 -0
  186. package/src/api/server.js +802 -185
  187. package/src/git-fast-cache.js +220 -0
  188. package/src/git-wal-sync.js +156 -0
  189. package/src/hash-anchored-edit.js +82 -0
  190. package/src/hermes-platform-protocol.js +475 -0
  191. package/src/hermes-sync-plane.js +241 -0
  192. package/src/index.js +30 -1
  193. package/src/iso42001-compliance-guard.js +97 -0
  194. package/src/latency-budget.js +244 -0
  195. package/src/mcp-writeguard.js +316 -0
  196. package/src/miminions-adapter.js +106 -0
  197. package/src/pipeline-compass.js +104 -0
  198. package/src/ppl-alert-pipeline.js +284 -0
  199. package/src/rendezvous-router.js +90 -0
  200. package/src/security-questionnaire.js +195 -0
@@ -0,0 +1,11 @@
1
+ {
2
+ "phase": 5,
3
+ "name": "strict-optional",
4
+ "detectEnabled": true,
5
+ "strict": true,
6
+ "commands": [
7
+ "THUMBGATE_STRICT_ENFORCEMENT=1"
8
+ ],
9
+ "verify": "Only after phases 1–4. Matching learned rules can hard-deny.",
10
+ "hiddenMetric": "Strict is opt-in. Secret-exfil floors already deny without it."
11
+ }
@@ -0,0 +1,15 @@
1
+ # Progressive wiring (Frigate-style)
2
+
3
+ Prove the pipe before you turn detection on.
4
+
5
+ | Phase | File | Enable matching? | Verify |
6
+ | --- | --- | --- | --- |
7
+ | 1 | `01-wire-only.json` | no | `npx thumbgate doctor` |
8
+ | 2 | `02-dashboard-empty-ok.json` | no | dashboard loads, empty OK |
9
+ | 3 | `03-one-lesson.json` | no | `npx thumbgate stats` |
10
+ | 4 | `04-warn-fires.json` | yes, warn | hook log / gate-stats |
11
+ | 5 | `05-strict-optional.json` | yes, strict | only after 1–4 |
12
+
13
+ Hidden metric: if nothing fires, check **hook install**, not rule count.
14
+
15
+ Live guide: `/guides/progressive-wiring`
@@ -0,0 +1,139 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://thumbgate.ai/schemas/broker-execution-receipt.schema.json",
4
+ "title": "ThumbGate Broker-Signed Execution Receipt",
5
+ "description": "Broker-signed record that a credential-holding broker (outside the agent trust boundary) authorized or denied a side-effecting action. Agents cannot mint valid signatures. A receipt is not independent world-state proof and does not mean a public listing is invocable.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schemaVersion",
10
+ "receiptId",
11
+ "principal",
12
+ "target",
13
+ "decision",
14
+ "idempotencyKey",
15
+ "issuedAt",
16
+ "broker",
17
+ "payloadHash",
18
+ "signature",
19
+ "receiptHash"
20
+ ],
21
+ "properties": {
22
+ "schemaVersion": {
23
+ "type": "string",
24
+ "const": "broker-execution-receipt-v1"
25
+ },
26
+ "receiptId": {
27
+ "type": "string",
28
+ "minLength": 8,
29
+ "maxLength": 120
30
+ },
31
+ "principal": {
32
+ "type": "object",
33
+ "additionalProperties": false,
34
+ "required": ["id", "kind"],
35
+ "properties": {
36
+ "id": {
37
+ "type": "string",
38
+ "minLength": 1,
39
+ "maxLength": 200
40
+ },
41
+ "kind": {
42
+ "type": "string",
43
+ "enum": ["agent", "user", "service", "system"]
44
+ }
45
+ }
46
+ },
47
+ "target": {
48
+ "type": "object",
49
+ "additionalProperties": false,
50
+ "required": ["provider", "action"],
51
+ "properties": {
52
+ "provider": {
53
+ "type": "string",
54
+ "minLength": 1,
55
+ "maxLength": 120
56
+ },
57
+ "resource": {
58
+ "type": "string",
59
+ "maxLength": 500
60
+ },
61
+ "action": {
62
+ "type": "string",
63
+ "minLength": 1,
64
+ "maxLength": 120
65
+ }
66
+ }
67
+ },
68
+ "decision": {
69
+ "type": "string",
70
+ "enum": ["allow", "execute", "deny"]
71
+ },
72
+ "idempotencyKey": {
73
+ "type": "string",
74
+ "minLength": 1,
75
+ "maxLength": 300
76
+ },
77
+ "providerEventId": {
78
+ "type": ["string", "null"],
79
+ "maxLength": 300
80
+ },
81
+ "issuedAt": {
82
+ "type": "string",
83
+ "format": "date-time"
84
+ },
85
+ "broker": {
86
+ "type": "object",
87
+ "additionalProperties": false,
88
+ "required": ["id", "kind"],
89
+ "properties": {
90
+ "id": {
91
+ "type": "string",
92
+ "minLength": 1,
93
+ "maxLength": 200
94
+ },
95
+ "kind": {
96
+ "type": "string",
97
+ "const": "broker"
98
+ }
99
+ }
100
+ },
101
+ "payloadHash": {
102
+ "type": "string",
103
+ "pattern": "^[a-f0-9]{64}$"
104
+ },
105
+ "previousReceiptHash": {
106
+ "type": ["string", "null"],
107
+ "pattern": "^([a-f0-9]{64})?$"
108
+ },
109
+ "signature": {
110
+ "type": "object",
111
+ "additionalProperties": false,
112
+ "required": ["alg", "publicKeyId", "value"],
113
+ "properties": {
114
+ "alg": {
115
+ "type": "string",
116
+ "const": "ed25519"
117
+ },
118
+ "publicKeyId": {
119
+ "type": "string",
120
+ "minLength": 1,
121
+ "maxLength": 200
122
+ },
123
+ "value": {
124
+ "type": "string",
125
+ "minLength": 16,
126
+ "maxLength": 500
127
+ }
128
+ }
129
+ },
130
+ "receiptHash": {
131
+ "type": "string",
132
+ "pattern": "^[a-f0-9]{64}$"
133
+ },
134
+ "metadata": {
135
+ "type": "object",
136
+ "additionalProperties": true
137
+ }
138
+ }
139
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/IgorGanapolsky/ThumbGate/blob/main/config/schemas/provider-execution-attestation-v1.schema.json",
4
+ "title": "ThumbGate Provider Execution Attestation v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "attestationId", "provider", "credentialHolder", "thumbgate", "providerEvidence", "reconciliationPolicy", "outcome", "issuedAt", "nonce", "signature"],
8
+ "properties": {
9
+ "schemaVersion": { "const": "thumbgate-provider-execution-attestation-v1" },
10
+ "attestationId": { "type": "string", "minLength": 1, "maxLength": 200 },
11
+ "provider": {
12
+ "type": "object", "additionalProperties": false, "required": ["id", "accountId"],
13
+ "properties": { "id": { "type": "string", "minLength": 1, "maxLength": 120 }, "accountId": { "type": "string", "minLength": 1, "maxLength": 200 } }
14
+ },
15
+ "credentialHolder": {
16
+ "type": "object", "additionalProperties": false, "required": ["id", "kind"],
17
+ "properties": { "id": { "type": "string", "minLength": 1, "maxLength": 200 }, "kind": { "enum": ["broker", "vault", "gateway"] } }
18
+ },
19
+ "thumbgate": {
20
+ "type": "object", "additionalProperties": false, "required": ["receiptId", "actionHash"],
21
+ "properties": { "receiptId": { "type": "string", "minLength": 1, "maxLength": 200 }, "actionHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" } }
22
+ },
23
+ "providerEvidence": {
24
+ "type": "object", "additionalProperties": false,
25
+ "required": ["auditSource", "observedAt", "windowStartedAt", "windowClosesAt", "observedLagMs"],
26
+ "properties": {
27
+ "eventId": { "type": ["string", "null"], "maxLength": 300 },
28
+ "auditSource": { "type": "string", "minLength": 1, "maxLength": 200 },
29
+ "observedAt": { "type": "string", "format": "date-time" },
30
+ "windowStartedAt": { "type": "string", "format": "date-time" },
31
+ "windowClosesAt": { "type": "string", "format": "date-time" },
32
+ "observedLagMs": { "type": "integer", "minimum": 0 },
33
+ "rawDigest": { "type": ["string", "null"], "pattern": "^[a-f0-9]{64}$" },
34
+ "locator": { "type": ["string", "null"], "maxLength": 500 }
35
+ }
36
+ },
37
+ "reconciliationPolicy": {
38
+ "type": "object", "additionalProperties": false, "required": ["provider", "maxWindowMs", "declaredWindowMs"],
39
+ "properties": {
40
+ "provider": { "type": "string", "minLength": 1, "maxLength": 120 },
41
+ "maxWindowMs": { "type": "integer", "minimum": 1 },
42
+ "declaredWindowMs": { "type": "integer", "minimum": 1 }
43
+ }
44
+ },
45
+ "outcome": { "enum": ["matched", "mismatched", "not-yet-visible", "absent-after-window"] },
46
+ "issuedAt": { "type": "string", "format": "date-time" },
47
+ "nonce": { "type": "string", "minLength": 16, "maxLength": 200 },
48
+ "signature": {
49
+ "type": "object", "additionalProperties": false, "required": ["alg", "keyId", "payloadHash", "value"],
50
+ "properties": {
51
+ "alg": { "const": "Ed25519" },
52
+ "keyId": { "type": "string", "minLength": 1, "maxLength": 200 },
53
+ "payloadHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
54
+ "value": { "type": "string", "minLength": 1 }
55
+ }
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,320 @@
1
+ {
2
+ "specVersion": "1.0.0",
3
+ "canonicalization": "RFC 8785 JCS",
4
+ "signatureInput": "lowercase hex SHA-256 of JCS payload, encoded as UTF-8",
5
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAs837FHU3G9hjEQkcBguaGpWKQYBK+hrd3zrqylXGyHE=\n-----END PUBLIC KEY-----\n",
6
+ "vectors": [
7
+ {
8
+ "id": "matched-valid-jcs",
9
+ "expectedValid": true,
10
+ "attestation": {
11
+ "schemaVersion": "thumbgate-provider-execution-attestation-v1",
12
+ "attestationId": "att-vector-001",
13
+ "provider": {
14
+ "id": "example-cloud",
15
+ "accountId": "acct-test-001"
16
+ },
17
+ "credentialHolder": {
18
+ "id": "example-vault",
19
+ "kind": "vault"
20
+ },
21
+ "thumbgate": {
22
+ "receiptId": "receipt-test-001",
23
+ "actionHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
24
+ },
25
+ "providerEvidence": {
26
+ "eventId": "evt-test-001",
27
+ "auditSource": "example-cloud-audit",
28
+ "observedAt": "2026-08-14T12:00:30.000Z",
29
+ "windowStartedAt": "2026-08-14T12:00:00.000Z",
30
+ "windowClosesAt": "2026-08-14T12:05:00.000Z",
31
+ "observedLagMs": 30000,
32
+ "rawDigest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
33
+ "locator": "audit://example-cloud/evt-test-001"
34
+ },
35
+ "reconciliationPolicy": {
36
+ "provider": "example-cloud",
37
+ "maxWindowMs": 600000,
38
+ "declaredWindowMs": 300000
39
+ },
40
+ "outcome": "matched",
41
+ "issuedAt": "2026-08-14T12:00:31.000Z",
42
+ "nonce": "0000000000000001",
43
+ "signature": {
44
+ "alg": "Ed25519",
45
+ "keyId": "test-key-rfc8785-v1",
46
+ "payloadHash": "f9fc1a6d56d73dad634082b2617c9f9aac0e74101e5af11edc0e05e3668635c5",
47
+ "value": "946QZB9xWxZVaFezqXDLLsYVzUjrmrbBDSvKhWbOhZ/7dmTe7StDvqODDIf6YFrIdDtTN4n09HeKm432Mti4AQ=="
48
+ }
49
+ },
50
+ "expectedCanonicalPayload": "{\"attestationId\":\"att-vector-001\",\"credentialHolder\":{\"id\":\"example-vault\",\"kind\":\"vault\"},\"issuedAt\":\"2026-08-14T12:00:31.000Z\",\"nonce\":\"0000000000000001\",\"outcome\":\"matched\",\"provider\":{\"accountId\":\"acct-test-001\",\"id\":\"example-cloud\"},\"providerEvidence\":{\"auditSource\":\"example-cloud-audit\",\"eventId\":\"evt-test-001\",\"locator\":\"audit://example-cloud/evt-test-001\",\"observedAt\":\"2026-08-14T12:00:30.000Z\",\"observedLagMs\":30000,\"rawDigest\":\"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\"windowClosesAt\":\"2026-08-14T12:05:00.000Z\",\"windowStartedAt\":\"2026-08-14T12:00:00.000Z\"},\"reconciliationPolicy\":{\"declaredWindowMs\":300000,\"maxWindowMs\":600000,\"provider\":\"example-cloud\"},\"schemaVersion\":\"thumbgate-provider-execution-attestation-v1\",\"thumbgate\":{\"actionHash\":\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"receiptId\":\"receipt-test-001\"}}"
51
+ },
52
+ {
53
+ "id": "mismatched-valid",
54
+ "expectedValid": true,
55
+ "attestation": {
56
+ "schemaVersion": "thumbgate-provider-execution-attestation-v1",
57
+ "attestationId": "att-vector-002",
58
+ "provider": {
59
+ "id": "example-cloud",
60
+ "accountId": "acct-test-001"
61
+ },
62
+ "credentialHolder": {
63
+ "id": "example-vault",
64
+ "kind": "vault"
65
+ },
66
+ "thumbgate": {
67
+ "receiptId": "receipt-test-001",
68
+ "actionHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
69
+ },
70
+ "providerEvidence": {
71
+ "eventId": "evt-test-001",
72
+ "auditSource": "example-cloud-audit",
73
+ "observedAt": "2026-08-14T12:00:30.000Z",
74
+ "windowStartedAt": "2026-08-14T12:00:00.000Z",
75
+ "windowClosesAt": "2026-08-14T12:05:00.000Z",
76
+ "observedLagMs": 30000,
77
+ "rawDigest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
78
+ "locator": "audit://example-cloud/evt-test-001"
79
+ },
80
+ "reconciliationPolicy": {
81
+ "provider": "example-cloud",
82
+ "maxWindowMs": 600000,
83
+ "declaredWindowMs": 300000
84
+ },
85
+ "outcome": "mismatched",
86
+ "issuedAt": "2026-08-14T12:00:31.000Z",
87
+ "nonce": "0000000000000001",
88
+ "signature": {
89
+ "alg": "Ed25519",
90
+ "keyId": "test-key-rfc8785-v1",
91
+ "payloadHash": "0ba89f00278add0b907f7f7696342d5fda4a081cefe81c00cb6a9de43e04f3ae",
92
+ "value": "Jv52aWKWrXBquOhRpo2Qo0NkAveaT5HUHscc6UheMB59OaG7uqUun6KwTTpF3NY8+MCP5WCC4MTjPzCKF7LxDw=="
93
+ }
94
+ }
95
+ },
96
+ {
97
+ "id": "not-yet-visible-valid",
98
+ "expectedValid": true,
99
+ "attestation": {
100
+ "schemaVersion": "thumbgate-provider-execution-attestation-v1",
101
+ "attestationId": "att-vector-003",
102
+ "provider": {
103
+ "id": "example-cloud",
104
+ "accountId": "acct-test-001"
105
+ },
106
+ "credentialHolder": {
107
+ "id": "example-vault",
108
+ "kind": "vault"
109
+ },
110
+ "thumbgate": {
111
+ "receiptId": "receipt-test-001",
112
+ "actionHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
113
+ },
114
+ "providerEvidence": {
115
+ "eventId": null,
116
+ "auditSource": "example-cloud-audit",
117
+ "observedAt": "2026-08-14T12:00:30.000Z",
118
+ "windowStartedAt": "2026-08-14T12:00:00.000Z",
119
+ "windowClosesAt": "2026-08-14T12:05:00.000Z",
120
+ "observedLagMs": 30000,
121
+ "rawDigest": null,
122
+ "locator": null
123
+ },
124
+ "reconciliationPolicy": {
125
+ "provider": "example-cloud",
126
+ "maxWindowMs": 600000,
127
+ "declaredWindowMs": 300000
128
+ },
129
+ "outcome": "not-yet-visible",
130
+ "issuedAt": "2026-08-14T12:00:31.000Z",
131
+ "nonce": "0000000000000001",
132
+ "signature": {
133
+ "alg": "Ed25519",
134
+ "keyId": "test-key-rfc8785-v1",
135
+ "payloadHash": "a14b992953fcdbb7daf30bc71e8e1cc206d49194509fb697af82819b27deb765",
136
+ "value": "RpPkTXdpYl3XmQUJiXcYD8xJEwZePx6Hm/5tE87xqszytJUWR9IJCwBcPv8/PWFGgkYL7nxgGDxOMCJv1PRpDQ=="
137
+ }
138
+ }
139
+ },
140
+ {
141
+ "id": "absent-after-window-valid",
142
+ "expectedValid": true,
143
+ "attestation": {
144
+ "schemaVersion": "thumbgate-provider-execution-attestation-v1",
145
+ "attestationId": "att-vector-004",
146
+ "provider": {
147
+ "id": "example-cloud",
148
+ "accountId": "acct-test-001"
149
+ },
150
+ "credentialHolder": {
151
+ "id": "example-vault",
152
+ "kind": "vault"
153
+ },
154
+ "thumbgate": {
155
+ "receiptId": "receipt-test-001",
156
+ "actionHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
157
+ },
158
+ "providerEvidence": {
159
+ "eventId": null,
160
+ "auditSource": "example-cloud-audit",
161
+ "observedAt": "2026-08-14T12:05:00.000Z",
162
+ "windowStartedAt": "2026-08-14T12:00:00.000Z",
163
+ "windowClosesAt": "2026-08-14T12:05:00.000Z",
164
+ "observedLagMs": 300000,
165
+ "rawDigest": null,
166
+ "locator": null
167
+ },
168
+ "reconciliationPolicy": {
169
+ "provider": "example-cloud",
170
+ "maxWindowMs": 600000,
171
+ "declaredWindowMs": 300000
172
+ },
173
+ "outcome": "absent-after-window",
174
+ "issuedAt": "2026-08-14T12:05:01.000Z",
175
+ "nonce": "0000000000000001",
176
+ "signature": {
177
+ "alg": "Ed25519",
178
+ "keyId": "test-key-rfc8785-v1",
179
+ "payloadHash": "736085db205e7eb81e27688d80ceeece194fae9c6ff5f6bf0ed52a3d8f225b83",
180
+ "value": "s3Cd1lAFaMHi2UM6kqkjx0VbgyZOCKg8k4NwG8UEVrGk+5yoChnYrkbJ/bsKsVlp4NvuF3Pv8d0WzVN13RuQAw=="
181
+ }
182
+ }
183
+ },
184
+ {
185
+ "id": "absence-before-window-invalid",
186
+ "expectedValid": false,
187
+ "attestation": {
188
+ "schemaVersion": "thumbgate-provider-execution-attestation-v1",
189
+ "attestationId": "att-vector-005",
190
+ "provider": {
191
+ "id": "example-cloud",
192
+ "accountId": "acct-test-001"
193
+ },
194
+ "credentialHolder": {
195
+ "id": "example-vault",
196
+ "kind": "vault"
197
+ },
198
+ "thumbgate": {
199
+ "receiptId": "receipt-test-001",
200
+ "actionHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
201
+ },
202
+ "providerEvidence": {
203
+ "eventId": null,
204
+ "auditSource": "example-cloud-audit",
205
+ "observedAt": "2026-08-14T12:00:30.000Z",
206
+ "windowStartedAt": "2026-08-14T12:00:00.000Z",
207
+ "windowClosesAt": "2026-08-14T12:05:00.000Z",
208
+ "observedLagMs": 30000,
209
+ "rawDigest": null,
210
+ "locator": null
211
+ },
212
+ "reconciliationPolicy": {
213
+ "provider": "example-cloud",
214
+ "maxWindowMs": 600000,
215
+ "declaredWindowMs": 300000
216
+ },
217
+ "outcome": "absent-after-window",
218
+ "issuedAt": "2026-08-14T12:00:31.000Z",
219
+ "nonce": "0000000000000001",
220
+ "signature": {
221
+ "alg": "Ed25519",
222
+ "keyId": "test-key-rfc8785-v1",
223
+ "payloadHash": "ac34469e12a33c57e7cd66b91f324b64cd88475214da4efffb6ee107ad52b50f",
224
+ "value": "tGbY53yETzbFO/bpihhDSJxBNVHzSfSKuUvtwm2SiYa1a1AlepM/8Csq8dEbJA+UXiMbwWTguj4zRLxHzqrsBQ=="
225
+ }
226
+ },
227
+ "expectedError": "absence_claimed_before_window_closed"
228
+ },
229
+ {
230
+ "id": "not-yet-visible-after-window-invalid",
231
+ "expectedValid": false,
232
+ "attestation": {
233
+ "schemaVersion": "thumbgate-provider-execution-attestation-v1",
234
+ "attestationId": "att-vector-006",
235
+ "provider": {
236
+ "id": "example-cloud",
237
+ "accountId": "acct-test-001"
238
+ },
239
+ "credentialHolder": {
240
+ "id": "example-vault",
241
+ "kind": "vault"
242
+ },
243
+ "thumbgate": {
244
+ "receiptId": "receipt-test-001",
245
+ "actionHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
246
+ },
247
+ "providerEvidence": {
248
+ "eventId": null,
249
+ "auditSource": "example-cloud-audit",
250
+ "observedAt": "2026-08-14T12:05:00.000Z",
251
+ "windowStartedAt": "2026-08-14T12:00:00.000Z",
252
+ "windowClosesAt": "2026-08-14T12:05:00.000Z",
253
+ "observedLagMs": 30000,
254
+ "rawDigest": null,
255
+ "locator": null
256
+ },
257
+ "reconciliationPolicy": {
258
+ "provider": "example-cloud",
259
+ "maxWindowMs": 600000,
260
+ "declaredWindowMs": 300000
261
+ },
262
+ "outcome": "not-yet-visible",
263
+ "issuedAt": "2026-08-14T12:00:31.000Z",
264
+ "nonce": "0000000000000001",
265
+ "signature": {
266
+ "alg": "Ed25519",
267
+ "keyId": "test-key-rfc8785-v1",
268
+ "payloadHash": "d2b8324ac3f43d82e1814ce70955d18d972c40eb1c64e6dbce0226be0dce03c0",
269
+ "value": "C0jnPNMZgjh9AW7LzR+VsfGSapj+OHp5n39JkX7+z0yThyo2S2Qlq2S/mHq2MFQZ/e4hW5NewYdONR5Hto5FDw=="
270
+ }
271
+ },
272
+ "expectedError": "not_yet_visible_after_window"
273
+ },
274
+ {
275
+ "id": "holder-window-widening-invalid",
276
+ "expectedValid": false,
277
+ "attestation": {
278
+ "schemaVersion": "thumbgate-provider-execution-attestation-v1",
279
+ "attestationId": "att-vector-007",
280
+ "provider": {
281
+ "id": "example-cloud",
282
+ "accountId": "acct-test-001"
283
+ },
284
+ "credentialHolder": {
285
+ "id": "example-vault",
286
+ "kind": "vault"
287
+ },
288
+ "thumbgate": {
289
+ "receiptId": "receipt-test-001",
290
+ "actionHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
291
+ },
292
+ "providerEvidence": {
293
+ "eventId": "evt-test-001",
294
+ "auditSource": "example-cloud-audit",
295
+ "observedAt": "2026-08-14T12:00:30.000Z",
296
+ "windowStartedAt": "2026-08-14T12:00:00.000Z",
297
+ "windowClosesAt": "2026-08-14T12:15:00.000Z",
298
+ "observedLagMs": 30000,
299
+ "rawDigest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
300
+ "locator": "audit://example-cloud/evt-test-001"
301
+ },
302
+ "reconciliationPolicy": {
303
+ "provider": "example-cloud",
304
+ "maxWindowMs": 600000,
305
+ "declaredWindowMs": 900000
306
+ },
307
+ "outcome": "matched",
308
+ "issuedAt": "2026-08-14T12:00:31.000Z",
309
+ "nonce": "0000000000000001",
310
+ "signature": {
311
+ "alg": "Ed25519",
312
+ "keyId": "test-key-rfc8785-v1",
313
+ "payloadHash": "20286e82435d12e3aa7905c2e051eb37bfef92a2c485161e6d82560260063e12",
314
+ "value": "18zFQgQG8gUZdN+6M7ciAs/6iHZyuG0gO/H8tjbJK6q5aT1EEMNzVK3WUOIfempgPDbJq5TdOuDegP0J3gTSBg=="
315
+ }
316
+ },
317
+ "expectedError": "holder_window_exceeds_gate_maximum"
318
+ }
319
+ ]
320
+ }
@@ -0,0 +1,69 @@
1
+ # ThumbGate Provider Execution Attestation v1
2
+
3
+ **Status:** Open provider-neutral specification
4
+ **Schema:** [`config/schemas/provider-execution-attestation-v1.schema.json`](../../config/schemas/provider-execution-attestation-v1.schema.json)
5
+ **Normative vectors:** [`conformance/provider-attestation/vectors.json`](../../conformance/provider-attestation/vectors.json)
6
+ **Verifier:** [`scripts/provider-attestation-conformance.js`](../../scripts/provider-attestation-conformance.js)
7
+ **Quality evidence:** [`VERIFICATION_EVIDENCE.md`](../../VERIFICATION_EVIDENCE.md)
8
+
9
+
10
+ ## Permanent public links
11
+
12
+ | Artifact | URL |
13
+ |---|---|
14
+ | Spec (this document) | https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/specs/provider-execution-attestation-v1.md |
15
+ | JSON Schema | https://raw.githubusercontent.com/IgorGanapolsky/ThumbGate/main/config/schemas/provider-execution-attestation-v1.schema.json |
16
+ | Normative vectors | https://raw.githubusercontent.com/IgorGanapolsky/ThumbGate/main/conformance/provider-attestation/vectors.json |
17
+ | Verifier | https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/provider-attestation-conformance.js |
18
+
19
+ Evaluate locally after cloning:
20
+
21
+ ```bash
22
+ npm run prove:provider-attestation
23
+ # or
24
+ node scripts/provider-attestation-conformance.js
25
+ ```
26
+
27
+ ## Purpose
28
+
29
+ This contract lets a credential-holding broker, vault, or gateway attest to the result of a provider-side action without giving the AI agent provider credentials. ThumbGate binds the attestation to its pre-action execution receipt and independently verifies the holder's evidence.
30
+
31
+ The schema and normative synthetic fixtures are free to evaluate. Provider-specific mapping, live audit-surface calibration, adapter implementation, and conformance certification are commercial integration work.
32
+
33
+ ## Canonicalization and signature
34
+
35
+ 1. Remove the top-level `signature` member.
36
+ 2. Serialize the remaining payload with JSON Canonicalization Scheme, **RFC 8785 JCS**.
37
+ 3. Compute lowercase hexadecimal SHA-256 over the UTF-8 canonical bytes.
38
+ 4. Set `signature.payloadHash` to that digest.
39
+ 5. Sign the UTF-8 bytes of the lowercase digest with Ed25519.
40
+ 6. Store the Base64 signature in `signature.value`.
41
+
42
+ These steps are normative. Implementations that sign ordinary `JSON.stringify` output are non-conformant.
43
+
44
+ ## Reconciliation outcomes
45
+
46
+ | Outcome | Meaning | Timing rule |
47
+ |---|---|---|
48
+ | `matched` | Provider evidence agrees with the expected action | Requires `eventId` |
49
+ | `mismatched` | Provider evidence exists but disagrees | Requires `eventId` |
50
+ | `not-yet-visible` | Event is not visible and the window remains open | Retryable only while `observedAt < windowClosesAt` |
51
+ | `absent-after-window` | Event remained absent through the full window | Valid only when `observedAt >= windowClosesAt` |
52
+
53
+ Absence is not mismatch. Eventual consistency must not become a false deny before the provider window closes.
54
+
55
+ ## Window ownership
56
+
57
+ ThumbGate owns `maxWindowMs` per provider. The credential holder declares the applied `declaredWindowMs`, which must not exceed the maximum, and reports `observedLagMs`. A holder cannot widen the gate's policy until an event appears.
58
+
59
+ ## Running the normative suite
60
+
61
+ ```bash
62
+ node scripts/provider-attestation-conformance.js
63
+ ```
64
+
65
+ A conforming implementation must produce the expected verdict for every vector and must reproduce `expectedCanonicalPayload` where present.
66
+
67
+ ## Live canaries
68
+
69
+ Live-provider canaries should measure real audit lag and validate provider adapters. They are deliberately non-normative because provider availability, credentials, and eventual-consistency behavior cannot make the portable conformance suite deterministic.
@@ -173,6 +173,9 @@ components:
173
173
  enum: [agent, service, human]
174
174
  displayName:
175
175
  type: string
176
+ role:
177
+ type: string
178
+ enum: [admin, reviewer]
176
179
  HumanEscalationRequest:
177
180
  type: object
178
181
  additionalProperties: false
@@ -200,6 +203,12 @@ components:
200
203
  minimum: 1
201
204
  idempotencyKey:
202
205
  type: string
206
+ approvalContextDigest:
207
+ type: string
208
+ pattern: '^[a-fA-F0-9]{64}$'
209
+ requiredReviewerRole:
210
+ type: string
211
+ enum: [admin]
203
212
  HumanEscalationDecision:
204
213
  type: object
205
214
  additionalProperties: false
@@ -1946,6 +1955,12 @@ paths:
1946
1955
  - rules
1947
1956
  - tools
1948
1957
  - provenance
1958
+ strategy: { type: string, enum: [summarize-then-expand] }
1959
+ contextEnvelope:
1960
+ type: object
1961
+ additionalProperties: false
1962
+ required: [goal, businessData, examples, procedures, constraints, rubric]
1963
+ properties: { goal: { type: string, minLength: 1 }, businessData: &contextList { type: array, minItems: 1, items: { type: string, minLength: 1 } }, examples: *contextList, procedures: *contextList, constraints: *contextList, rubric: *contextList }
1949
1964
  responses:
1950
1965
  '200':
1951
1966
  description: Context pack created