@clearproof/content 0.5.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 (57) hide show
  1. package/content/explainers/pilot-proof-public-signals.md +80 -0
  2. package/content/explainers/portable-evidence-review.md +103 -0
  3. package/content/explainers/usd-cents-without-a-price-feed.md +106 -0
  4. package/content/explainers/verify-independently.md +106 -0
  5. package/content/explainers/what-clearproof-does.md +92 -0
  6. package/content/explainers/who-verifies-what.md +86 -0
  7. package/content/recipes/deploy-contracts.md +45 -0
  8. package/content/recipes/full-walkthrough.md +84 -0
  9. package/content/recipes/generate-proof.md +43 -0
  10. package/content/recipes/update-sanctions.md +35 -0
  11. package/content/recipes/verify-onchain.md +41 -0
  12. package/content/recipes/verify-proof.md +36 -0
  13. package/content/signals.yaml +128 -0
  14. package/content/topics/api.md +61 -0
  15. package/content/topics/architecture.md +50 -0
  16. package/content/topics/circuits.md +66 -0
  17. package/content/topics/contracts.md +60 -0
  18. package/content/topics/gdpr.md +36 -0
  19. package/content/topics/quickstart.md +77 -0
  20. package/content/topics/sdk.md +56 -0
  21. package/content/topics/security.md +33 -0
  22. package/content/topics/troubleshooting.md +109 -0
  23. package/content/updates/2026-09-09-adoption-roadmap.md +27 -0
  24. package/content/updates/2026-09-12-full-walkthrough.md +31 -0
  25. package/content/updates/2026-09-12-npm-status.md +27 -0
  26. package/content/updates/2026-09-12-proof-boundaries.md +40 -0
  27. package/content/updates/2026-09-21-sanctions-schedule.md +43 -0
  28. package/content/updates/2026-09-25-pilot-transfer-v3.md +60 -0
  29. package/dist/explainers.d.ts +29 -0
  30. package/dist/explainers.d.ts.map +1 -0
  31. package/dist/explainers.js +71 -0
  32. package/dist/explainers.js.map +1 -0
  33. package/dist/index.d.ts +13 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +25 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/parser.d.ts +25 -0
  38. package/dist/parser.d.ts.map +1 -0
  39. package/dist/parser.js +97 -0
  40. package/dist/parser.js.map +1 -0
  41. package/dist/recipes.d.ts +28 -0
  42. package/dist/recipes.d.ts.map +1 -0
  43. package/dist/recipes.js +103 -0
  44. package/dist/recipes.js.map +1 -0
  45. package/dist/signals.d.ts +18 -0
  46. package/dist/signals.d.ts.map +1 -0
  47. package/dist/signals.js +34 -0
  48. package/dist/signals.js.map +1 -0
  49. package/dist/topics.d.ts +18 -0
  50. package/dist/topics.d.ts.map +1 -0
  51. package/dist/topics.js +41 -0
  52. package/dist/topics.js.map +1 -0
  53. package/dist/updates.d.ts +27 -0
  54. package/dist/updates.d.ts.map +1 -0
  55. package/dist/updates.js +69 -0
  56. package/dist/updates.js.map +1 -0
  57. package/package.json +42 -0
@@ -0,0 +1,77 @@
1
+ ---
2
+ title: Quick Start
3
+ category: getting-started
4
+ order: 1
5
+ cli-topic: quickstart
6
+ ---
7
+
8
+ # Quick Start
9
+
10
+ This is a development setup guide, checked September 25, 2026. Use synthetic data and testnet funds. There is no guaranteed setup or proving time.
11
+
12
+ ## Public package access
13
+
14
+ The [main source repository](https://github.com/repfigit/clearproof) is public. Public npm packages are available at version 0.3.0:
15
+
16
+ ```bash
17
+ npm install @clearproof/proof@0.3.0
18
+ ```
19
+
20
+ Proof generation requires compatible circuit WASM and proving-key files. Verification requires the matching verification key. Inspect package contents before relying on exported artifact paths; installing the SDK alone does not create a complete proving environment.
21
+
22
+ The 0.3.0 packages predate the pilot and cover the legacy 16-signal profile only. The source checkout (0.4.0, unpublished) contains the pilot. Do not assume they are the same.
23
+
24
+ The published CLI currently cannot be installed from the public registry because its `@clearproof/content` dependency is unavailable. The standalone proof SDK installation was verified. Use a source checkout for CLI evaluation. The source setup below was verified from a clean clone of `main` on September 15, 2026 at commit `1c8d385` (locked workspace install, workspace build, built-CLI `--help`, Python sync and the Python unit suite); it covers the documented commands, not the circuit compilation path shown later, which additionally requires circom and Powers of Tau inputs.
25
+
26
+ ## Source setup for the unreleased pilot
27
+
28
+ Prerequisites: Git, Python 3.11+ with uv (the locked install uses 3.12), Node.js 20+ with npm, Circom 2.2.2 and PostgreSQL 18 for the pilot acceptance run.
29
+
30
+ ```bash
31
+ git clone --branch main https://github.com/repfigit/clearproof.git
32
+ cd clearproof
33
+ npm exec --yes --package=npm@11.9.0 -- npm ci
34
+ uv sync --frozen --extra dev --python 3.12
35
+ npm run build
36
+ node packages/cli/dist/index.js --help
37
+ ```
38
+
39
+ To generate development artifacts for both proof profiles and run the pilot end to end, follow the [local acceptance guide](https://github.com/repfigit/clearproof/blob/main/docs/operations/local-pilot-acceptance.md):
40
+
41
+ ```bash
42
+ curl --fail -L -o /absolute/ppot_0080_17.ptau \
43
+ https://pse-trusted-setup-ppot.s3.eu-central-1.amazonaws.com/pot28_0080/ppot_0080_17.ptau
44
+ .venv/bin/python scripts/test_development_circuits.py /absolute/new-development-artifacts \
45
+ --prepared-ptau /absolute/ppot_0080_17.ptau
46
+ .venv/bin/python scripts/test_pilot_local.py /absolute/new-development-artifacts/pilot \
47
+ /absolute/new-pilot-run --postgres-bin /usr/lib/postgresql/18/bin
48
+ ```
49
+
50
+ Check the file's SHA-256 against the one pinned in the guide before using it. Locally generated development keys are not production keys. `bash scripts/compile_circuits.sh` still builds the legacy profile on its own.
51
+
52
+ ## API exploration
53
+
54
+ For a disposable local evaluation:
55
+
56
+ ```bash
57
+ export AUTH_MODE=api-key
58
+ export API_KEY="$(openssl rand -hex 32)"
59
+ export PII_MASTER_KEY="$(openssl rand -hex 32)"
60
+ uv run uvicorn src.api.main:app --reload --host 127.0.0.1 --port 8000
61
+ ```
62
+
63
+ Open [the local OpenAPI UI](http://localhost:8000/docs). Protected requests use `X-API-Key` in this mode. Keep keys stable and protected for any evaluation whose encrypted records need to survive restart.
64
+
65
+ Starting the server does not establish a working proof workflow. The pilot routes need PostgreSQL, storage keys, tenant trust configuration and compatible artifacts; `/health` reports process liveness only. Do not treat synthetic output as a live transfer authorization.
66
+
67
+ ## Checks
68
+
69
+ ```bash
70
+ make test
71
+ npm run test:ts
72
+ npm run build
73
+ ```
74
+
75
+ At this checkout, root `npm test` runs Python tests; `npm run test:ts` runs the TypeScript workspaces. Database integration tests need an isolated PostgreSQL instance. Real circuit checks have additional artifact/toolchain requirements.
76
+
77
+ See [project status](/docs/status) before planning an integration.
@@ -0,0 +1,56 @@
1
+ ---
2
+ title: TypeScript SDK
3
+ category: reference
4
+ order: 6
5
+ cli-topic: sdk
6
+ ---
7
+
8
+ # TypeScript SDK
9
+
10
+ `@clearproof/proof` provides proof generation, cryptographic verification and counterparty discovery. Published version: **0.3.0**, checked September 25, 2026. That release predates the pilot: it covers the legacy 16-signal profile only. The pilot functions described below exist in the source checkout (0.4.0, unpublished). Confirm the installed version before using its types.
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ npm install @clearproof/proof@0.3.0
16
+ ```
17
+
18
+ ## Legacy proof API (in the published 0.3.0 package)
19
+
20
+ ```typescript
21
+ import { generateProof, verifyProof, type ComplianceInput } from '@clearproof/proof';
22
+
23
+ // Supply a complete, authenticated input with witnesses matching your circuit.
24
+ async function evaluate(input: ComplianceInput, wasm: string, zkey: string, vkey: string) {
25
+ const generated = await generateProof(input, wasm, zkey);
26
+ const verified = await verifyProof(generated.proof, generated.publicSignals, vkey);
27
+ return { generated, verified };
28
+ }
29
+ ```
30
+
31
+ The caller supplies compatible artifacts. The SDK maps camelCase fields to Circom signal names; it does not create issuer or sanctions witnesses for you. Field encodings, amount units and public-signal ordering must match the exact proof version.
32
+
33
+ `verified.valid` describes cryptographic verification. `isCompliant` and `sarReviewFlag` interpret circuit outputs; they do not establish full registry acceptance, current policy authorization or legal compliance. Additional trust, freshness, revocation, domain and replay checks remain necessary.
34
+
35
+ ## Pilot functions (source checkout)
36
+
37
+ | Function | Purpose |
38
+ | --- | --- |
39
+ | `inspectCurrentProof` | Read-only inspection of a `pilot-transfer-v3` proof through the authenticated API |
40
+ | `authorizeCurrentProof` | Request consumption of one authorization; returns the receipt |
41
+ | `createObservation`, `readObservation`, `listObservations`, `reportObservationCohort` | Non-authorizing observations and cohort reports |
42
+ | `requestReport`, `reportEndpoint` | Authenticated report requests |
43
+ | `canonicalBytes`, `recordDigest` | Canonical encoding and domain-separated digests, matching the Python implementation |
44
+ | `walletOwnershipSigningMessage` | Build the exact EIP-191 message for the wallet ownership challenge |
45
+
46
+ These use server-selected trust: the API owns current roots, policy and consumption. The client validates response shape and profile (`pilot-transfer-v3`) but does not independently establish current state.
47
+
48
+ ## Discovery
49
+
50
+ `discoverVASP(domain)` and `supportsChain(domain, chainId)` read self-declared well-known metadata. A domain response is not independent issuer/VASP authorization. Python and TypeScript discovery compatibility and destination/key validation are active hardening work.
51
+
52
+ ## Input and privacy limitations
53
+
54
+ The current SDK validates selected fields, including proof expiry relative to the transfer timestamp and a nonzero credential nullifier. A zero domain chain ID currently emits a warning; it is not a safe production configuration.
55
+
56
+ Do not log complete witnesses or sensitive proof metadata. Use the installed package's declarations for exact types and dependencies, and review [status](/docs/status) before integration.
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: Security
3
+ category: operations
4
+ order: 7
5
+ cli-topic: security
6
+ ---
7
+
8
+ # Security and assurance
9
+
10
+ Last reviewed: September 25, 2026.
11
+
12
+ clearproof is **pre-production, pilot-stage software**. Independent circuit and contract audits have not been completed. Current proving artifacts use a development-only trusted setup. Testnet deployment and passing tests do not establish production safety.
13
+
14
+ ## Current boundaries
15
+
16
+ - A cryptographically valid proof is not an accepted transfer. In the pilot, the authorization service checks current roots, revocation, policy and signed facts before consuming an authorization in PostgreSQL. Pairing alone checks none of these.
17
+ - Credential, holder, jurisdiction and transfer binding are enforced by the `pilot-transfer-v3` statement and the authorization service, tested locally. They rely on trusted issuers, root publishers and a trusted registry publisher; the contract cannot detect a publisher that lies about private records.
18
+ - Recipient HPKE envelopes are the default; the legacy shared-key AES-256-GCM mode is only used when an operator selects it. Key rotation and altered-envelope rejection are tested locally. Live key discovery between institutions is not yet validated.
19
+ - Current proofs publish eight values (commitments, roots, a nullifier, times and the chain and registry binding) but no amount, tier, jurisdiction or review flag. Those values can still be correlated with other records. The legacy 16-signal demo profile publishes more, including a review flag.
20
+ - Domain, expiry, root and replay checks depend on correct configuration of the authorization service and registry. The site does not claim that replay is universally impossible.
21
+ - Tenant-scoped encrypted storage, restart recovery and retry isolation are tested locally with PostgreSQL. They have not been independently reviewed.
22
+
23
+ ## Controls to evaluate
24
+
25
+ Use synthetic records and testnet funds. Check approved issuer/root/artifact provenance, recipient identity, key purpose, freshness, revocation, transfer binding and duplicate handling. Confirm that sensitive inputs remain inside authorized encrypted data flows and do not appear in logs or exports.
26
+
27
+ `PII_MASTER_KEY` startup validation checks accepted encoding and minimum length. It cannot establish that a supplied value has adequate randomness. Generate secrets securely and manage retention, backup and rotation deliberately.
28
+
29
+ ## Vulnerability reporting
30
+
31
+ The repository security policy lists **security@clearproof.dev** as its reporting address. Share reproduction steps and impact privately; do not post sensitive exploit details or personal information in a public issue. This documentation does not verify mailbox operation or promise a response-time SLA.
32
+
33
+ No active paid bug-bounty program is announced here. See [project status](/docs/status) for the implementation and assurance work that remains.
@@ -0,0 +1,109 @@
1
+ ---
2
+ title: Troubleshooting
3
+ category: operations
4
+ order: 8
5
+ cli-topic: troubleshooting
6
+ ---
7
+
8
+ # Troubleshooting
9
+
10
+ Common issues and fixes for clearproof development and deployment.
11
+
12
+ ## Circuit compilation fails
13
+
14
+ **Symptom:** `bash scripts/compile_circuits.sh` exits with a circom error.
15
+
16
+ **Fix:** Ensure circom 2.2.2+ is installed and on your PATH:
17
+
18
+ ```bash
19
+ circom --version
20
+ # Expected: circom compiler 2.2.2 or higher
21
+ ```
22
+
23
+ If you see `command not found`, follow the [circom install guide](https://docs.circom.io/getting-started/installation/).
24
+
25
+ ## `PII_MASTER_KEY` validation error at startup
26
+
27
+ **Symptom:** API startup rejects a missing or insufficiently long `PII_MASTER_KEY`.
28
+
29
+ **Fix:** Supply 64 hex characters or at least 32 UTF-8 bytes. Generate a random value for a disposable local evaluation:
30
+
31
+ ```bash
32
+ export PII_MASTER_KEY="$(openssl rand -hex 32)"
33
+ ```
34
+
35
+ The startup check validates encoding and length, not randomness. Protect and retain the key when encrypted records must survive restart; changing it can prevent decryption of existing records.
36
+
37
+ ## Proof generation returns 500
38
+
39
+ **Symptom:** `POST /proof/generate` fails because runtime state or proving artifacts are unavailable.
40
+
41
+ Check that the requested credential, trusted issuer root, sanctions witnesses and compatible artifacts are available to the running process. Starting the API, issuing one development credential or building an offline sanctions tree does not alone establish a complete generation workflow. See the quickstart and current project status.
42
+
43
+ ## Sanctions oracle is stale
44
+
45
+ **Symptom:** On-chain `verifyAndRecord()` reverts with `SanctionsOracleStale`.
46
+
47
+ **Fix:** The oracle's grace period defaults to 24 hours. Update the sanctions root:
48
+
49
+ ```bash
50
+ python scripts/relay_sanctions_root.py --network sepolia
51
+ ```
52
+
53
+ Check the configured grace period and actual root update time on each intended chain. Test fixtures may deliberately exercise stale state; do not bypass freshness checks to authorize a transfer.
54
+
55
+ ## Nullifier already spent
56
+
57
+ **Symptom:** The development `verifyAndRecord()` path reverts with `ProofAlreadyUsed` or `TransferAlreadyRecorded`.
58
+
59
+ **Cause:** The nullifier or transfer reference has already been recorded in the target registry.
60
+
61
+ **Fix:** Inspect the original transaction and transfer state before retrying. Preserve the same transfer identity across retries; do not create a new idempotency key just to bypass duplicate protection. API/registry transfer-hash consistency remains planned work.
62
+
63
+ ## WASM prover not found
64
+
65
+ **Symptom:** `@clearproof/proof` throws `ENOENT: no such file or directory` for `compliance.wasm`.
66
+
67
+ **Fix:** Compile circuits first:
68
+
69
+ ```bash
70
+ bash scripts/compile_circuits.sh
71
+ ```
72
+
73
+ Pass the actual compatible WASM, proving-key and verification-key paths to the SDK. The repository's development build writes the WASM under `artifacts/compliance_js/`; public package installation alone is not a complete proving setup.
74
+
75
+ ## Hardhat tests fail with `HH700`
76
+
77
+ **Symptom:** `npx hardhat test` errors with `HH700: Artifact not found`.
78
+
79
+ **Fix:** Compile contracts before running tests:
80
+
81
+ ```bash
82
+ cd packages/contracts
83
+ npx hardhat compile
84
+ npx hardhat test
85
+ ```
86
+
87
+ ## CORS errors in browser
88
+
89
+ **Symptom:** Browser console shows `Access-Control-Allow-Origin` errors when calling the API.
90
+
91
+ **Fix:** Set `CORS_ALLOWED_ORIGINS` to your frontend origin:
92
+
93
+ ```bash
94
+ export CORS_ALLOWED_ORIGINS="http://localhost:3000"
95
+ ```
96
+
97
+ Using `*` with credentials enabled will trigger a startup warning and may not work in all browsers.
98
+
99
+ ## TypeScript build errors after pulling
100
+
101
+ **Symptom:** `npm run build` fails with type errors after `git pull`.
102
+
103
+ **Fix:** Clean install and rebuild:
104
+
105
+ ```bash
106
+ rm -rf node_modules packages/*/dist
107
+ npm install
108
+ npm run build
109
+ ```
@@ -0,0 +1,27 @@
1
+ ---
2
+ id: UP-2026-001
3
+ title: Adoption roadmap and documentation split published
4
+ date: 2026-09-09
5
+ publishAfter: 2026-09-09T00:00:00Z
6
+ sourceCommit: d57aac12493ea585ad38e85d070385e9fa34d905
7
+ claimRefs:
8
+ - docs/ADOPTION_ROADMAP.md
9
+ - docs/PUBLISHING.md
10
+ - README.md
11
+ status: approved
12
+ summary: The repository now carries a public adoption roadmap and publishing boundaries; internal commercial planning moved out of the public tree.
13
+ ---
14
+
15
+ The main repository now includes [docs/ADOPTION_ROADMAP.md](https://github.com/repfigit/clearproof/blob/main/docs/ADOPTION_ROADMAP.md),
16
+ which describes how teams can evaluate Clearproof as pilot-stage software: what
17
+ the circuits and contracts check today, what stays outside that scope, and what
18
+ a careful evaluation record looks like.
19
+
20
+ A companion [docs/PUBLISHING.md](https://github.com/repfigit/clearproof/blob/main/docs/PUBLISHING.md)
21
+ states the project's publication boundaries: source-backed claims, verified
22
+ project-owned destinations, and no unsupported audit, customer or compliance
23
+ statements.
24
+
25
+ Clearproof remains pilot-stage software. Circuits and contracts have not
26
+ completed an independent audit, and current proving artifacts use a
27
+ development-only trusted setup. Use synthetic data and testnet funds.
@@ -0,0 +1,31 @@
1
+ ---
2
+ id: UP-2026-002
3
+ title: A complete transfer walkthrough exists in the source docs
4
+ date: 2026-09-12
5
+ publishAfter: 2026-09-12T14:30:00Z
6
+ sourceCommit: 57222b0bcad7e8dc06796fb870105a41ac87b844
7
+ claimRefs:
8
+ - packages/content/content/recipes/full-walkthrough.md
9
+ - packages/content/content/topics/quickstart.md
10
+ - README.md
11
+ status: approved
12
+ summary: The merged pilot source includes a documented end-to-end walkthrough, from building the sanctions tree through issuing a credential, generating a proof and recording it on a testnet registry.
13
+ ---
14
+
15
+ The source repository includes a [full end-to-end walkthrough](https://github.com/repfigit/clearproof/blob/main/packages/content/content/recipes/full-walkthrough.md)
16
+ covering the complete pilot flow: build the sanctions tree, issue a zkKYC
17
+ credential, generate a Groth16 compliance proof, verify it off-chain, and record
18
+ the verified result on a Sepolia [ComplianceRegistry](https://github.com/repfigit/clearproof/blob/main/packages/contracts/contracts/)
19
+ where a `ProofVerified` event can be checked with the bundled script.
20
+
21
+ Running it requires a local setup: the API with API-key auth, compiled circuit
22
+ artifacts, deployed contracts and a Sepolia RPC endpoint. The
23
+ [quickstart](https://github.com/repfigit/clearproof/blob/main/packages/content/content/topics/quickstart.md)
24
+ documents the prerequisites honestly — there is no guaranteed setup or proving
25
+ time, and the workflow uses synthetic data and testnet funds.
26
+
27
+ This walkthrough is a development pilot, not a production transfer
28
+ authorization. Circuits and contracts have not completed an independent audit,
29
+ and local proving artifacts use a development-only trusted setup. If you want to
30
+ see exactly what a Travel-Rule transfer-evidence flow looks like before
31
+ evaluating the cryptography, the walkthrough is the shortest supported path.
@@ -0,0 +1,27 @@
1
+ ---
2
+ id: UP-2026-003
3
+ title: What npm can install today, and what it cannot
4
+ date: 2026-09-12
5
+ publishAfter: 2026-09-12T14:30:00Z
6
+ sourceCommit: 57222b0bcad7e8dc06796fb870105a41ac87b844
7
+ claimRefs:
8
+ - packages/content/content/topics/quickstart.md
9
+ - README.md
10
+ status: approved
11
+ summary: Public @clearproof packages exist at 0.3.0, but the CLI cannot install from the registry and the development checkout is already 0.4.0. Here is what each path supports.
12
+ ---
13
+
14
+ Clearproof's public npm packages are at **0.3.0** while the development checkout
15
+ is **0.4.0** — they are not the same thing. Verified against the npm registry on
16
+ September 12, 2026:
17
+
18
+ - [`@clearproof/proof`](https://www.npmjs.com/package/@clearproof/proof) 0.3.0 — SDK install verified, but proof generation still requires matching circuit WASM and proving-key files supplied by the caller.
19
+ - [`@clearproof/circuits`](https://www.npmjs.com/package/@clearproof/circuits) 0.3.0 — inspect package contents; installation alone is not a proving setup.
20
+ - [`@clearproof/cli`](https://www.npmjs.com/package/@clearproof/cli) 0.3.0 — public install is currently blocked because its `@clearproof/content` dependency is unavailable on the registry (confirmed returning "Not found").
21
+ - `@clearproof/content` — not published at all.
22
+
23
+ The practical path for evaluating current capabilities is a
24
+ [source checkout](https://github.com/repfigit/clearproof/blob/main/packages/content/content/topics/quickstart.md):
25
+ clone, build, and run the documented checks. The README's installation table is
26
+ kept current with what each package actually supports; nothing there claims a
27
+ one-command production install, because that does not exist yet.
@@ -0,0 +1,40 @@
1
+ ---
2
+ id: UP-2026-004
3
+ title: What the compliance proof actually verifies
4
+ date: 2026-09-12
5
+ publishAfter: 2026-09-12T14:30:00Z
6
+ sourceCommit: 57222b0bcad7e8dc06796fb870105a41ac87b844
7
+ claimRefs:
8
+ - packages/content/content/topics/circuits.md
9
+ - packages/content/content/recipes/verify-proof.md
10
+ - packages/content/content/topics/security.md
11
+ status: approved
12
+ summary: The Groth16 circuit checks sanctions non-membership, credential validity and the amount tier — and it is worth being precise about what stays outside that boundary.
13
+ ---
14
+
15
+ > **Correction, September 25, 2026:** this post described the legacy 16-signal
16
+ > `compliance.circom` demo circuit as if it were current. The current pilot
17
+ > profile, `pilot-transfer-v3`, publishes eight values with no public amount
18
+ > tier or review flag, and screens both wallets. See the
19
+ > [circuits page](https://docs.clearproof.world/docs/circuits).
20
+
21
+ [The circuit documentation](https://github.com/repfigit/clearproof/blob/main/packages/content/content/topics/circuits.md)
22
+ describes the three checks the legacy Groth16 circuit enforces:
23
+
24
+ 1. **Sanctions non-membership** — a sorted-tree gap construction shows the queried value lies between neighboring leaves. This establishes a fact about the supplied tree; authenticity, completeness and freshness of the screening source are separate requirements.
25
+ 2. **Credential validity** — checks performed against the credential commitment and issuer tree supplied to the circuit.
26
+ 3. **Amount tier** — the amount is compared against three ordered public thresholds and the claimed tier is checked.
27
+
28
+ The public-signal array exposes all sixteen signals, including an advisory
29
+ `sar_review_flag` that is tier-derived — it is not a suspicious-activity
30
+ determination or filing instruction.
31
+
32
+ What the proof does not do: a cryptographically valid proof is not an accepted
33
+ transfer. Registry acceptance checks, credential authenticity, holder authority,
34
+ actual transfer binding and replay/expiry handling depend on the verifier and
35
+ its configuration — see the
36
+ [security boundaries](https://github.com/repfigit/clearproof/blob/main/packages/content/content/topics/security.md)
37
+ page. These components are unaudited development work, and the
38
+ [off-chain verification recipe](https://github.com/repfigit/clearproof/blob/main/packages/content/content/recipes/verify-proof.md)
39
+ shows exactly which four checks a verify call performs so you can compare them
40
+ against what your own acceptance policy needs.
@@ -0,0 +1,43 @@
1
+ ---
2
+ id: UP-2026-005
3
+ title: Sanctions-tree refresh now runs on a daily schedule with a change gate
4
+ date: 2026-09-21
5
+ publishAfter: 2026-09-22T15:30:00Z
6
+ sourceCommit: 4a58f129e8640c65ad37074a37dd49114ce9db74
7
+ claimRefs:
8
+ - .github/workflows/sanctions-update.yml
9
+ - scripts/build_sanctions_tree.py
10
+ - packages/content/content/recipes/update-sanctions.md
11
+ status: approved
12
+ summary: The sanctions dataset behind on-chain proof checks is refreshed daily by a scheduled workflow, with a leaf-count sanity gate and a reviewable PR when the tree changes — but the on-chain relay stays a deliberate operator step.
13
+ ---
14
+
15
+ Clearproof proofs commit to a Merkle root of a sanctions dataset that the
16
+ on-chain `SanctionsOracle` stores. Keeping that root current is an operational
17
+ contract of the project — after any root update, all deployed chains must be
18
+ re-relayed consistently. The repository now runs the dataset refresh on a
19
+ schedule instead of leaving it entirely manual.
20
+
21
+ What the workflow does:
22
+
23
+ - `Update Sanctions Tree` runs daily at 06:00 UTC in GitHub Actions (scheduled
24
+ just after the OFAC SDN list typically updates), with a manual
25
+ `workflow_dispatch` trigger kept for operator use.
26
+ - Each run fetches the public sanctions sources and rebuilds the deterministic
27
+ Poseidon Merkle tree with `scripts/build_sanctions_tree.py`.
28
+ - A change gate compares the built tree against the committed baseline.
29
+ - A safety check aborts the run if the leaf count drops by more than 50% — a
30
+ guard against silently building from a broken or partial data source.
31
+ - When the tree actually changed, the workflow opens a reviewable branch and
32
+ pull request showing the previous and new leaf counts, rather than pushing
33
+ anything straight to the default branch.
34
+
35
+ What the workflow deliberately does not do: it does not relay a new root to
36
+ deployed chains on its own. The relay job runs on explicit `workflow_dispatch`,
37
+ so an operator still drives the on-chain update after reviewing the tree PR —
38
+ matching the documented rule that the sanctions relay is never skipped after a
39
+ root update. The [sanctions update recipe](https://github.com/repfigit/clearproof/blob/main/packages/content/content/recipes/update-sanctions.md)
40
+ walks through that operator flow.
41
+
42
+ The workflow source is readable in full in the repository at
43
+ `.github/workflows/sanctions-update.yml`.
@@ -0,0 +1,60 @@
1
+ ---
2
+ id: UP-2026-006
3
+ title: Circuit profile pilot-transfer-v3 replaces v2 with production-scale tree depths
4
+ date: 2026-09-25
5
+ publishAfter: 2026-09-25T12:00:00Z
6
+ sourceCommit: a67caef
7
+ claimRefs:
8
+ - specs/pilot-transfer-v3.md
9
+ - docs/adr/0011-production-tree-depths.md
10
+ - src/registry/pilot_tree.py
11
+ - tests/unit/test_registrar_depths.py
12
+ status: approved
13
+ summary: The pilot circuit now fixes Merkle tree depths at 32/20/20 (issuance, authorized issuers, sanctions), raising capacity from 256 leaves per tree to production-scale sizes. Groth16 verification cost is unchanged; the keys are still development-only.
14
+ ---
15
+
16
+ The development circuit profile for the pilot, `pilot-transfer-v2`, fixed every
17
+ Merkle tree at depth 8: at most 256 leaves per tree. That ceiling is irrelevant
18
+ for a demo but unusable for the deployments the pilot profile models — a large
19
+ custodial VASP issues credentials to tens of millions of customers, a global
20
+ authorized-issuer set has thousands of issuers, and consolidated sanctions
21
+ address lists run to hundreds of thousands of EVM addresses.
22
+
23
+ `pilot-transfer-v3` (merged this week, PR #49) fixes the depths at
24
+ `PilotCompliance(32, 20, 20)` in the Circom circuit itself:
25
+
26
+ | Tree | v2 depth | v3 depth | v3 capacity |
27
+ | --- | --- | --- | --- |
28
+ | Issuance (credentials under an issuance root) | 8 | 32 | 2^32 credentials per issuance root |
29
+ | Authorized issuers | 8 | 20 | 2^20 issuer leaves |
30
+ | Sanctions (raw EVM addresses) | 8 | 20 | 2^20 − 2 addresses (two leaves are the `0` and `2^160` sentinels) |
31
+
32
+ Depths live in one place, `src/registry/pilot_tree.py`, and every consumer —
33
+ witness builder, registrar, proof preparation, issuance tree service and root
34
+ verification — reads them from there. Signed root snapshots must state the exact
35
+ depth for their kind; any other depth rejects.
36
+
37
+ Because tree depth is fixed by the circuit and therefore by the proving and
38
+ verification keys, the profile name changes even though the public signal order
39
+ and meaning are unchanged from v2. Keys are profile-specific: a v2 manifest
40
+ cannot be proved or verified with v3 keys. Current artifact and context checks
41
+ reject v1 and v2 as historical profiles; read-only pairing inspection can still
42
+ use independently pinned v1/v2 keys and reports the profile explicitly.
43
+
44
+ What changed in practice: constraints grow from 51,728 (v2) to 95,408 (v3), the
45
+ local development setup now uses a `2^17` powers-of-tau, and the development
46
+ zkey grows from roughly 23 MB to 44 MB. Groth16 verification cost is unchanged —
47
+ it depends only on the public signal count, which is identical to v2.
48
+
49
+ Two honest boundaries, stated plainly in [ADR 0011](https://github.com/repfigit/clearproof/blob/main/docs/adr/0011-production-tree-depths.md):
50
+
51
+ - The v3 keys remain development-unapproved — no audit or production setup has
52
+ approved this circuit, and no existing Sepolia deployment implements v3.
53
+ - Depth is only one of the production-scaling limits. The registrar still
54
+ configures 1–16 issuers, issuance-tree construction scans at most 256
55
+ enrollments per refresh, and the in-memory sparse tree builds at roughly
56
+ 210 µs per hash — production scale needs an incremental persisted tree
57
+ service. Those are ordinary software, upgradeable without new keys.
58
+
59
+ Read the full public statement at
60
+ [specs/pilot-transfer-v3.md](https://github.com/repfigit/clearproof/blob/main/specs/pilot-transfer-v3.md).
@@ -0,0 +1,29 @@
1
+ export interface ExplainerMeta {
2
+ id: string;
3
+ slug: string;
4
+ title: string;
5
+ date: string;
6
+ /** UTC timestamp after which the explainer may be published. */
7
+ publishAfter: string;
8
+ /** Source revision the claims were validated against. */
9
+ sourceCommit: string;
10
+ claimRefs: string[];
11
+ status: 'draft' | 'validated' | 'approved' | 'published';
12
+ summary: string;
13
+ /** Canonical site path for this explainer, e.g. /explainers/what-clearproof-does. */
14
+ canonical: string;
15
+ /** Editorial template version; approval is bound to template + body. */
16
+ templateVersion: string;
17
+ }
18
+ export interface Explainer extends ExplainerMeta {
19
+ body: string;
20
+ }
21
+ /**
22
+ * List all explainers with metadata (no body), sorted newest first by ISO date.
23
+ */
24
+ export declare function listExplainers(): ExplainerMeta[];
25
+ /**
26
+ * Get a single explainer by slug, including the markdown body.
27
+ */
28
+ export declare function getExplainer(slug: string): Explainer | null;
29
+ //# sourceMappingURL=explainers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainers.d.ts","sourceRoot":"","sources":["../src/explainers.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AA2CD;;GAEG;AACH,wBAAgB,cAAc,IAAI,aAAa,EAAE,CAShD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAQ3D"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listExplainers = listExplainers;
4
+ exports.getExplainer = getExplainer;
5
+ const parser_js_1 = require("./parser.js");
6
+ const EXPLAINER_FIELDS = [
7
+ 'id',
8
+ 'title',
9
+ 'date',
10
+ 'publishAfter',
11
+ 'sourceCommit',
12
+ 'status',
13
+ 'summary',
14
+ 'canonical',
15
+ 'templateVersion',
16
+ ];
17
+ function requiredStringFields(frontmatter) {
18
+ return EXPLAINER_FIELDS.filter((field) => typeof frontmatter[field] !== 'string' || frontmatter[field] === '');
19
+ }
20
+ function normalizeStatus(value) {
21
+ return ['draft', 'validated', 'approved', 'published'].includes(value)
22
+ ? value
23
+ : 'draft';
24
+ }
25
+ function toMeta(slug, frontmatter) {
26
+ const missing = requiredStringFields(frontmatter);
27
+ if (missing.length > 0)
28
+ return null;
29
+ const claimRefs = frontmatter['claimRefs'];
30
+ return {
31
+ id: frontmatter['id'],
32
+ slug,
33
+ title: frontmatter['title'],
34
+ date: frontmatter['date'],
35
+ publishAfter: frontmatter['publishAfter'],
36
+ sourceCommit: frontmatter['sourceCommit'],
37
+ claimRefs: Array.isArray(claimRefs) ? claimRefs.filter((ref) => typeof ref === 'string') : [],
38
+ status: normalizeStatus(frontmatter['status']),
39
+ summary: frontmatter['summary'],
40
+ canonical: frontmatter['canonical'],
41
+ templateVersion: frontmatter['templateVersion'],
42
+ };
43
+ }
44
+ /**
45
+ * List all explainers with metadata (no body), sorted newest first by ISO date.
46
+ */
47
+ function listExplainers() {
48
+ const slugs = (0, parser_js_1.listContentSlugs)('explainers');
49
+ const explainers = [];
50
+ for (const slug of slugs) {
51
+ const { frontmatter } = (0, parser_js_1.readContentFile)(`explainers/${slug}.md`);
52
+ const meta = toMeta(slug, frontmatter);
53
+ if (meta)
54
+ explainers.push(meta);
55
+ }
56
+ return explainers.sort((a, b) => (a.date < b.date ? 1 : a.date > b.date ? -1 : a.slug.localeCompare(b.slug)));
57
+ }
58
+ /**
59
+ * Get a single explainer by slug, including the markdown body.
60
+ */
61
+ function getExplainer(slug) {
62
+ try {
63
+ const { frontmatter, body } = (0, parser_js_1.readContentFile)(`explainers/${slug}.md`);
64
+ const meta = toMeta(slug, frontmatter);
65
+ return meta ? { ...meta, body } : null;
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ //# sourceMappingURL=explainers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainers.js","sourceRoot":"","sources":["../src/explainers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export { parseFrontmatter, readContentFile, listContentSlugs, CONTENT_DIR } from './parser.js';
2
+ export type { Frontmatter, ParsedFile } from './parser.js';
3
+ export { listTopics, getTopic } from './topics.js';
4
+ export type { TopicMeta, Topic } from './topics.js';
5
+ export { listRecipes, getRecipe, getRecipeSteps } from './recipes.js';
6
+ export type { RecipeMeta, Recipe, RecipeStep } from './recipes.js';
7
+ export { listSignals, getSignal } from './signals.js';
8
+ export type { Signal } from './signals.js';
9
+ export { listUpdates, getUpdate } from './updates.js';
10
+ export type { UpdateMeta, Update } from './updates.js';
11
+ export { listExplainers, getExplainer } from './explainers.js';
12
+ export type { ExplainerMeta, Explainer } from './explainers.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/F,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACtE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}