Uh oh!
There was an error while loading. Please reload this page.
PP Auth: prove which platform is calling, and let the owner set terms - #1119
Conversation
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Verified against live congo-basin proofs: the digest is over GitW3's struct field order, not the order a statement arrives in. Every genuine release was being rejected. Claude-Session: https://claude.ai/code/session_01UpwygDu2cizLp12tvvKqVZ
A geometric mean of 3.13 beside an award of L2 reads as an arithmetic mistake. It is the IAL4 requirement for L3 and above, so say that. Claude-Session: https://claude.ai/code/session_01UpwygDu2cizLp12tvvKqVZ
Replaces the minted Chatterbox/Ledgerly world with what is actually on the network: platforms and certificates from awareness, deployments and their binding documents from the eVaults holding them, and the signed-in owner's own records grouped by the domain each schema declares. Split into Platforms, Your data and Your terms. Terms are signed by the real wallet — the signing session id is the statement's canonical payload, so the signature verifies standalone — and published to the owner's eVault. Possession reports 'not attempted' without a key rather than claiming a check failed that was never made. Claude-Session: https://claude.ai/code/session_01UpwygDu2cizLp12tvvKqVZ
The QR encoded localhost, so a phone scanning it called back to itself and the login never completed. Also adds the w3ds://sign callback route, which was missing entirely. Claude-Session: https://claude.ai/code/session_01UpwygDu2cizLp12tvvKqVZ
Certification says which data a release was assessed for; it says nothing about operations. Adds a third gate over the existing AccessGrant ontology: resource:Action permissions, deny by default, append-only revisions, with a withdrawn grant distinguishable from one never made. Deployment keys move to the top of the flow rather than appearing after a failed check, since possession decides what a check can mean. Claude-Session: https://claude.ai/code/session_01UpwygDu2cizLp12tvvKqVZ
A request that answered allow or deny without touching the eVault proved nothing. A permitted read now fetches and renders the records; a refused one fetches nothing and says the vault was never asked; a permitted write really writes and reads the domain back. Also summarises balances, amounts and file sizes, which have no prose field and were rendering as unreadable. Claude-Session: https://claude.ai/code/session_01UpwygDu2cizLp12tvvKqVZ
The domains a platform was not certified for are the ones worth asking for, so the list is the whole vocabulary with the uncertified ones marked. Read and write move next to the domain being asked about, replacing the matrix above it. Reputation has one service and no threshold, so it is stated rather than typed. Claude-Session: https://claude.ai/code/session_01UpwygDu2cizLp12tvvKqVZ
Grants are the platform's to manage through the API; the panel sends requests and shows what came back. Claude-Session: https://claude.ai/code/session_01UpwygDu2cizLp12tvvKqVZ
The four dependencies added with the demonstrator never reached the lockfile, so CI could not install with a frozen lockfile. Claude-Session: https://claude.ai/code/session_01UpwygDu2cizLp12tvvKqVZ
A release under review has not been deployed yet, so the row was always L0 and dragged every assessment down for a fact about the future. Framework version 3: the scoring set changed, so an assessment judged under version 2 is not comparable to one judged now. Claude-Session: https://claude.ai/code/session_01UpwygDu2cizLp12tvvKqVZ
The header still described the minimum rule the geometric mean replaced, and the framework was cached for the life of the process, so editing the policy file appeared to do nothing. Claude-Session: https://claude.ai/code/session_01UpwygDu2cizLp12tvvKqVZ
…rm-migration-services Platform management transfer, and two certification framework corrections
Uh oh!
There was an error while loading. Please reload this page.
Description of change
An eVault cannot currently tell one platform from another.
POST /platforms/certificationmints a year-long token for any name a caller types in, and any registry-signed token bypasses access control outright — so "which platform is this?" has been answered by whoever asked.PP Auth replaces that with a chain a caller has to hold the keys for. A deployment proves, on every handshake, which release it is running and what the association certified that release to do: it holds the deployment key, a named person's wallet authorised that key, the documents that person signed are unaltered, the version identifier derives from the platform and version, the author submitted that release, and the association certified it at a level for named domains. Six links, each failing closed, all six reported so a rejected handshake is debuggable.
The deployment presents its evidence rather than being looked up, so a verifier needs only public endpoints — never read access to the platform's eVault, which is the access it is trying to obtain.
The owner gets the other half. Certification says what a platform was found to be; an
Access Policysays what the owner will deal with — the minimum level, whose reputation scores count and what score they must reach, and any domain refused outright. It is a signed statement, so it travels with the owner and anyone can check it. It can only narrow a certificate, never widen it: permittingfinancedoes not let a social platform reach finance data, because the certificate gate runs first and independently.A demonstrator at
services/pp-auth-demo(port 4310, nothing else needs to be running). Chatterbox is social and L3; Ledgerly handles money and is L4. Point either at a domain it was not certified for and it is refused, with the reason. "Try to cheat" breaks one link at a time — paste your own public key, borrow the other platform's certificate — and the trace shows which link noticed.The demonstrator's keys for the wallet, registry and association are generated in-process so it runs standalone. That is stated on the page and in the docs: the signatures and the verification are real, the roots are not. The minting facility is behind a separate entry point so it cannot be reached by accident from code that verifies real deployments.
Existing registry-minted platform tokens are untouched and keep working.
Issue Number
n/a
Type of change
New
How the change has been tested
pnpm --filter @metastate-foundation/auth test— 33 passed. Each link refuses what it is there to refuse: a key the caller does not hold, evidence authorising a different environment, a version document swapped in from another release, an underivable version eName, a certificate for a different version, a certificate signed by an impostor, a refused release. Plus challenge replay, expiry and wrong-audience; the two authorisation gates; and policy signing, including a policy signed by someone other than the subject and one edited after signing.socialand is refusedfinance; Ledgerly the reverse. Each of the five tamper edits failed at exactly its intended link, and restoring returned the chain to green. Raising the owner's floor to L4 refused Chatterbox and kept Ledgerly; a reputation threshold of 50 did the reverse; denyingcommunicationrefused it against a certificate that grants it.pnpm --filter pp-auth-demo checkandbuild— 0 errors, 0 warnings. Docs site builds; the only broken anchors it reports are pre-existing inglossaryandW3ID.pnpm --filter ppa testandcheckstill pass — 20 tests, 0 errors.Not done: the eVault does not yet enforce any of this.
vault-access-guardstill honours a registry token as a bypass. This PR is the library, the owner's terms and a demonstrator; changing the guard touches every platform at once and belongs in its own change.Change checklist