Skip to content

feat(ceremony): rebuild browser package around supplied popup connections - #28

Draft
Wondertan wants to merge 64 commits into
feat/popup-packagefrom
feat/ceremony-rebuild-plan
Draft

feat(ceremony): rebuild browser package around supplied popup connections#28
Wondertan wants to merge 64 commits into
feat/popup-packagefrom
feat/ceremony-rebuild-plan

Conversation

@Wondertan

@Wondertan Wondertan commented Sep 7, 2026

Copy link
Copy Markdown
Member

Rebuild @libid/ceremony around an externally supplied PopupConnection and the current CCDP contracts. Callback clears captured OAuth returns, selects its bundled CCDP version and privately forwards them to one logical Prover. Popup owns window creation, navigation, isolation fallback and continuity; the application owns wallet operations and submission.

Client resolves the Bridge’s callbackPath against its supplied Bridge origin once and sends the same frozen redirectUri with GitHub token requests. Client snapshots the ledger hash and, for X/GitHub, its notary address before OAuth. Prover receives those values without a ledger decoder; the ledger package contains an interface and explicit synthetic fixtures. Results contain identity and oauthProof. Browser code does not cryptographically verify proofs or attestations. Safe failure codes cross the connection; raw OAuth returns and original exceptions stay private.

Asset owners declare archives, wildcard members and external URLs once. The build derives prefetch from the declarations and emitted graph; bb.js CRS requests retain their native hosts and ranges. WASM bodies are normalized at build time, with gzip/Brotli sidecars served by native SWS negotiation. Existing immutable URLs retain their bytes. Validated cached responses are delivered directly; misses can reuse the browser HTTP cache. Cache Storage writes run after response delivery while single-flight entries and Service Worker events remain alive through persistence.

Released verification keys are prefetched and supplied to bb.js. Dependency initialization, witness execution and notary socket setup overlap where their inputs permit it. GitHub identity setup starts alongside token exchange, with final delivery waiting for all required outputs and correlations. OAuth readers tolerate additional bounded provider metadata while validating required fields. X/GitHub JSON readers accept whitespace without rewriting transcript bytes. Token admission allows additional headers while requiring unique Host, Content-Type and canonical Content-Length values. Token and identity requests reject their forbidden header names while preserving the required layouts and bearer holes.

The Bridge’s new configuration uses TOML [[platforms]] tables in ts/apps/dev/bridge-config.toml, mounted by Compose; obsolete BASE_URL, NOTARY_URL and CEREMONY_PLATFORMS settings are removed. ts/apps/dev provides per-platform buttons, run history, stage timings and post-consent duration. Successful ceremonies close their popup; failures remain open for inspection. pnpm dev starts the app, Bridge, notary and SWS on separate localhost HTTP origins. pnpm dev:ccdp refreshes the static distribution without rebuilding service images. Explicit HTTP/WS exceptions cover only localhost and 127.0.0.1; production remains HTTPS/WSS.

The internal layout uses standalone barretenberg/, notary/ and assets/ modules, separate from ccdp/documents/. Barretenberg owns the engine and oidc_google/bearer_link circuit adapters; notary owns HTTP/transcript parsing. Platform orchestration owns ProverContext; JSON duplicate-key detection and progress accounting remain shared. Resource declarations use owner-specific *.assets.ts names. The platform catalog composes URL builders and proof validators directly; url.ts contains no proof re-exports. Notary owns the delivered attestation type and projection validator, shared URL/scalar guards live in primitives.ts, and document UI lives beside its three consumers.

The package exports only its root discovery/result API and @libid/ceremony/ccdp/client. CCDP codecs and document startup functions are private build inputs; configuration validators and proof-type mappings are internal. CCDPClient.enabledPlatforms discovers compatible configured platforms, and enabledVersions(platform) lists their compatible versions. The optional trailing new(..., ceremonyVersion) chooses an enabled version explicitly; omission retains the highest-compatible default. The selected version is validated before ledger reads and retained in prefetch, authorization, Prover inputs and the result. Versions may differ in disclosure behavior, so apps offering a specific mode can pin that choice. These changes leave wire messages and document routes unchanged. Existing Biome formatting and import organization are enforced, and adjacent API comments document lifecycle, ownership and trust constraints while package docs retain cross-component requirements.

Canonical test fixtures live beside their owning circuit/decoder tests; browser qualification reuses the same Google fixture. Fixture files are excluded from package contents.

Rebuilding removes obsolete gzip/Brotli sidecars when a replacement body no longer benefits from compression. This prevents content negotiation from serving stale HTML that points at workers from an earlier build.

Stack and pinned prerequisites

Validation

  • 407 ceremony unit tests, package/build/browser TypeScript checks, package and dev-app builds, workspace formatting and lint pass.
  • 36 browser checks pass across Chromium, Firefox and WebKit over HTTP and HTTPS: actual popup flows, native-anchor fallback, root-worker migration, pending-prefetch joins, persistent HTTP-cache reuse, real Google fixture proofs and concurrent TLSNotary initialization. The six Google proofs are independently verified against the released key with mutated public inputs rejected. Real bearer-link proofs also verify against the released key in all three engines.
  • The latest ownership refinement also passes 30 actual-popup, document-UI, Google fixture proof and concurrent TLSNotary initialization checks across all three engines over HTTP and HTTPS. The moved validation and UI bodies match their previous implementation.
  • The final public API passes all 75 dev-app browser tests, including Android/iOS emulation, plus 18 actual-popup and real Google fixture proof checks across Chromium, Firefox and WebKit over HTTP and HTTPS. This is not physical-device qualification. Consumer type checks preserve platform proof inference and reject removed imports; runtime package resolution rejects all four private subpaths, and the packed archive excludes fixtures.
  • All 17 distribution, installed-dependency-loader and native-SWS checks pass without skips. They cover blocked external asset hosts, normalized bodies, headers, sidecars, negotiation, validators and ranges. The stale-sidecar regression fails before the fix and passes after it; WebKit's real bearer proof passes after rebuilding.
  • Security/correctness, API ergonomics and simplicity reviews are clear for the structure, style, sidecar, ownership and public-API changes. The stale catalog example was replaced with the public API contract and a link to its implementation.
  • Previous Bridge integration validation: 124 Rust tests, Clippy and the actual Docker build passed; the running stack served configuration and Callback, rejected malformed redirects/private egress and reached GitHub through matched RC3 notarization with an intentionally invalid code. Shared parsing uses libid-rs v0.4.0. No fresh consent or updated-contract qualification is claimed by that dependency update.
  • Previous matched-notary qualification completed two concurrent real sessions alongside bb initialization in all three engines. These used unauthenticated responses and do not establish authenticated identity or attestation-signature qualification.

Manual Google, X and GitHub successes were reported during development. This update does not claim fresh live-OAuth, physical-mobile or complete release qualification. Earlier broader browser coverage and the intermittent WebKit two-popup result remain documented; remaining gates and all 153 stable requirement IDs are retained in the package docs.

See the package guide, qualification, traceability, and development setup.

@Wondertan Wondertan self-assigned this Sep 7, 2026
…p connections

Implement the current CCDP actors, platform proof pipelines, byte-prefetch graph and static distribution. Add real browser proof and loader qualification, focused security regressions, and explicit remaining launch gates.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Move Callback, Prefetch and Prover entrypoints under ccdp/documents while keeping proving and cache implementations in their existing modules. Update build paths, exports and package maps, and remove the requested plan artifacts.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Add directory READMEs and module-owned docs, extracting client, document, platform and prefetch contracts from the architecture sources. Preserve requirement IDs, update cross-links and include package-level docs in the archive.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Move the distribution contract out of build/docs and update incoming and outgoing links without changing its content.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
@Wondertan
Wondertan force-pushed the feat/ceremony-rebuild-plan branch from 1d4208a to 1aa1215 Compare September 7, 2026 10:40
Convert build scripts and their tests to TypeScript, add strict NodeNext checks to the package typecheck, and reuse browser asset contracts plus Vite and ESTree types. Update harness imports and documentation without adding a TypeScript runner.

Validation: 141 unit tests, four distribution tests, strict source/build and harness checks, and a real browser proof with released-key verification pass. All 180 distribution files remain byte-identical.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Align Callback artifact, embedded deployment data, URL clearing, version selection and browser qualification with architecture PR #13 at d42c0c4.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Match architecture PR #13 at 8d5f46b: remove default/override fallback and fail locally when the selected version has no valid deployment tuple.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Introduce the shared LedgerId contract and a separate synthetic testing entrypoint without defining real ledgers. Reconstruct ledger identity in Client and Prover, resolve one notary address for all sessions, and isolate fixture builds and metadata from production output.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Replace the version-keyed Callback configuration with one deeply frozen input list, validate required origin fields and ignore optional trailing inputs. Derive harness CSP from that same list, keep loader metadata and bodies in the selected artifact, and synchronize GitHub Bridge origin-admission requirements.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Move all ceremony contracts and guides into the common docs directory, merge module README content with its matching contract, and leave a minimal root README linking to the documentation index. Update links while preserving requirement text and qualification status.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Resolve archive members and external requests from owner declarations, use the notary v0.3.0-rc.1 wildcard snippet, and remove handwritten IDs/checksums and release-specific build logic. Emit build-time Brotli with ordered native SWS policies and share the server across qualification harnesses.

Validate archive/policy boundaries and runtime lowering; retain exact native dependency URLs and ranges. Record passing unit, build/HTTP and five-profile browser coverage, plus the unresolved live notary timeout.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Use the real ceremony Client and popup APIs with configurable local HTTPS Bridge/CCDP origins and the shared synthetic ledger. Keep unavailable Bridge configuration retryable, preserve native-anchor launch, and provide cancellation and terminal outcomes without a runtime mock service.

Add isolated Vite startup, fixture build guidance, and 24 browser checks across the five existing profiles plus shared-origin coverage. Security, API ergonomics and simplicity reviews are clear.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Install the local CA and issue localhost certificates on first dev startup, then reuse the saved pair until expiry. Preserve explicit certificate overrides and keep production frontend builds free of trust-store changes. Document the one-time authentication and browser restart steps.

Test first issuance, byte-for-byte reuse and expiry renewal without altering system trust. All 185 unit tests, dev typechecking, build and lint pass.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
…tracts

Sync PR13 through a73e31f. Use six positional creation arguments and deliver
identity separately from platform proof over ProverIdentityProof. Validate the
selected identity grammar and frozen OAuth client ID, retaining the version and
nonce in the reduced result wrapper. Require effective Callback origin admission
to include CCDP and apply the same allowlist in the reference Bridge harness.

Update callers, verifier-input assembly, documentation and stable-ID traceability.
Validation: 197 unit tests, 15 distribution/loader checks, 55 integration cases,
20 dev browser cases, strict TypeScript, builds and lint. All five browser profiles
generate real Google fixture proofs verified independently with the released key.
Security, API and simplicity reviews are clear after documentation corrections.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
@SupremaLex

Copy link
Copy Markdown
Member

Ran this branch (0469056) end to end with a real GitHub OAuth app, a local
Notary and a local Bridge. Two problems in the browser package.

1. GitHub sends iss and the parser rejects the whole return

Created a fresh GitHub OAuth app for the test. The callback came back with an
iss parameter. The parser has no case for it, so auth failed straight away —
before any token exchange.

src/platforms/codeReturn.ts:20

if (key !== 'state' && key !== 'code' && key !== 'error') return null

What GitHub sent (keys only): code, iss, state

Any unknown key makes parseCodeOAuthReturn return null, and
platforms/github/1/prover.ts:37 then throws Invalid GitHub return. The
cancel path breaks the same way — error, iss, state is rejected too.

iss is the issuer identifier from RFC 9207. Rather than just adding it to the
allowlist, it may be worth checking its value against the expected issuer —
that is what it is for.

2. Errors are thrown away, so this was hard to find

fail takes no argument:

const fail = () => {          // src/ccdp/documents/prover.ts:36

so .catch(fail) at line 116 gets the error and drops it. There are six empty
catch blocks in the two CCDP documents — prover.ts:42,72,96,133 and
prefetch.ts:25,29. Each ends in a fixed message:

Unable to complete proof. Return to your application.
Unable to prepare. Return to your application.

The user sees that, the browser console is empty, and no server logs anything,
because it fails before any request goes out. A broken OAuth parser and a broken
service worker look identical from outside.

Smallest fix: catch (e) and log it. Better: pass a reason into fail and put
it in the abort-ceremony message, which already has a reason field that is
always a constant today.

With iss accepted locally, the ceremony gets through consent, the callback,
the Bridge token exchange and a real MPC-TLS session with github.com. It then
fails in the Notary's attestation step — reported on libid-org/notary#6.

… details

Validate GitHub's advertised issuer on success and denial, accept bounded provider
error details without exposing them, and decode equivalent valid form encodings.
Keep duplicate, state, transport and mixed-outcome rejection before exchange.

Carry a closed error code and exact safe reason through AbortCeremony to the
Client's CeremonyError. Show codes in terminal UI and the dev frontend; report
undeliverable failures locally without logging or forwarding raw exceptions.
Preserve local causes where available. Keep the developer modal deferred until
its data and explicit-reveal design is settled.

Update the coordinated Client/CCDP contract, tests and stable-ID traceability.
Security, API and simplicity reviews are clear after including token admission
in the token-exchange failure boundary.

Validation: 217 unit tests, 15 distribution/loader checks, 55 integration cases,
20 dev browser cases, strict TypeScript, builds and lint. Real Google fixture
proofs verify against the released key in all five browser profiles.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Reveal X token requests whole and admit GitHub's single revealed prefix with
its committed trailing secret field. Validate the exact token headers and
Content-Length against the complete signed request, rejecting hidden headers,
duplicate fields and malformed framing.

Merge adjacent disclosures before native reveal and final correlation so
signing cannot change the planned partition. Cover adjacent GitHub identity
fields and preserve exact byte, commitment and opening checks. Pin GitHub's
API version alongside its required User-Agent; document the unresolved
six-header profile/verifier alignment and Bridge PR #9 qualification target.

Validation: 237 unit tests, TypeScript, package/static builds, formatting,
lint, 14 distribution/loader/native-SWS checks (one unconfigured rebuild
check skipped), and 55 browser cases including independently verified Google
fixture proofs. Security/correctness, API and simplicity reviews are clear.
Live X/GitHub and matched-notary qualification remain pending.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Use navigator.userAgent without a libID identifier. Update regression assertions and document that the profile/verifier must permit a browser-dependent sixth header. Targeted tests, TypeScript, lint, and security/API/simplicity reviews pass.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Add a native HTTPS launcher for the real Bridge and SWS on the documented
local origins, with mkcert reuse, bridge-only secret forwarding and no
request logging. Add read-only pre-consent configuration, admission,
Callback composition and isolated-route checks.

Upgrade browser TLSNotary to rc.2, matching Bridge PR #9's TLSN revision.
Document exact bridge/libid-rs pins, local Callback file mode, required
public registrations and confidential environment inputs, and notary TCP
reachability still needed for live qualification. No placeholder OAuth
client ID is committed.

Validation: real bridge build/startup and frontend Ready over trusted HTTPS;
237 unit tests; 14 distribution/loader/native-SWS checks (one skipped);
actual rc.2 concurrent WASM initialization in all five browser profiles;
development TypeScript and lint. Security, API and simplicity reviews clear.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Declare the fresh Google, X and GitHub client IDs once in oauth-clients.json.
Default the local Bridge to these registrations while retaining explicit
environment overrides. Document the confirmed shared localhost callback URI.
Keep GitHub's matching secret exclusively in ignored local configuration.

Validation: real Bridge configuration matches all three registrations and
contains no secret; pre-consent service checks pass; real frontend admits
all three platforms and denies environment-file access. Development
TypeScript, lint, and security/API/simplicity reviews pass.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Build pinned Bridge PR #9 in Docker, run the matching notary and SWS releases, and expose trusted local HTTPS/WebSocket endpoints. Rebuild CCDP against the local notary and tear down only the checkout-owned Compose project.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Create private @libid/dev with combined and separate workspace launch commands. Keep ceremony's distribution builder in the package while emitting development CCDP into the app cache. Preserve local credential ignores and verify frontend, service readiness and combined teardown.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Close the captured application-owned connection after every settled outcome, preserve the result and enable another attempt after cleanup. Verified with all 25 dev browser tests and focused security, API and simplicity reviews.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Return ordinary cached responses without rereading their bodies. Keep CRS reconstruction and validation, and allow immutable requests to use the browser HTTP cache when Cache Storage misses.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Show elapsed stage timings in the dev run history while retaining concurrent diagnostic steps.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Add fieldless authenticated readiness milestones and retain private OAuth forwarding.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Group authorization for display and end it only after OAuth return admission. Preserve raw milestones for post-consent timing.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Fold final attestation waiting into proof generation and clarify fetched-data and ZK prover stage labels.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Start GitHub identity-session setup alongside the Bridge token request.
Wait for token admission before fetching identity, and cancel dependent
work on failure without masking the original error.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Ignore bounded provider metadata while preserving required fields, transport, issuer, duplicate and credential checks. Cover Google version_info through the actual popup fixture flow.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Prefetch and supply each circuit release verification key to bb circuitProve, preserving the pinned ZK Keccak settings and proof encoding. Reject missing or empty keys without recomputation and select the WASM backend explicitly.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Start bb initialization alongside circuit/key and ACVM/ABI loading. Report branch failures promptly and destroy a backend that becomes ready after a sibling fails.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Accept inputs once Noir is ready, then join witness generation and bb readiness before proving. Keep cancellation, single cleanup and late-result suppression intact, and document the progress-stage boundary.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Start each WebSocket alongside shared TLSNotary initialization. Wait for both before setup, reject sockets closed during initialization, and release pending connections on either failure.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Decode gzip-packed WASM at build time and emit gzip/Brotli sidecars for native SWS delivery. Keep prefetch and dependency loaders on the same decoded resource, and preserve the old immutable bb URL.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Return fully validated responses while persistence continues. Retain single-flight entries and Service Worker event lifetime through write completion, handle prefetch response failures, and test durable-cache eviction independently of pending flights.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Pass the generated certificate key to Chromium through its native SPKI allowlist so HTTP-cache reuse is tested with a clean certificate result. Preserve project launch options without changing system trust or production TLS policy.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Resolve callbackPath against the supplied Bridge origin and pass the frozen redirectUri in GitHub token requests. Replace retired environment settings with inline TOML in dev Compose and pin the rebased RC3-compatible Bridge.

Reject empty query and fragment delimiters through the shared redirect validator. Align fixtures, requirement references and integration documentation with the new wire contract.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Consume the consolidated RC3-compatible Bridge update and record the release-upgrade qualification. The shared whitespace parser now comes from the released library; the server-specific error classifier remains in PR10.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Remove the superseded whitespace requirements and GitHub terminator amendment from the ceremony implementation branch. PR31 owns the shared rules and their stable IDs.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Allow additional token headers while requiring unique Host, Content-Type and canonical Content-Length values. Apply the shared forbidden-header rules to token and identity requests, preserving the bearer and secret disclosure boundaries.

Update focused X/GitHub regressions and package documentation for spec PR31. All 404 ceremony tests, TypeScript checks and formatting/lint checks pass; security, API and simplicity reviews are clear.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Group the Noir/bb engine and released circuit adapters under proving/bb. Keep ProverContext with platform orchestration and shared JSON/progress outside the Prover page. Move HTTP and transcript helpers into notarization and share the bearer-link public-input check.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Move Barretenberg, notary and asset delivery into sibling modules. Name resource declarations by their owner, place the application client under CCDP, and rename platform authorization builders to url.ts. Update the public API and its workspace consumers together.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Drop a previous gzip or Brotli copy when the replacement body no longer compresses smaller. Otherwise content negotiation can serve stale HTML referencing workers from an earlier build.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Move attestation projections into notary, shared validation into primitives, and document UI beside its consumers. Compose platform URL builders and proof validators directly without cross-module re-exports.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Keep discovery and result types at the root and the application API under ccdp/client. Internal codecs, page startup and configuration helpers are no longer public subpaths or exports. Move canonical fixtures beside their owners and exclude them from package contents.

Expose compatible versions and accept an optional explicit selection, retaining the highest-compatible default. Validate and bind that choice throughout the run so applications can choose among supported disclosure behaviors.

Assisted-by: GPT-6
Signed-off-by: Wondertan <hlibwondertan@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants