feat(persona): mint the disclosure step-up approval as 0.3 - #193
Merged
Conversation
The agent has accepted `approve-response/0.3` since VTI #1316. This is the approver that asks in it, so a bound disclosure approval is answered `recorded` and stops elevating the session — closing #1304's stated compromise end to end. `buildStepUpApproval` is shared by two flows answering different services: the persona disclosure gate (the VTA, which accepts 0.3) and rp-login's performStepUpVta (the did-hosting control plane, which does not). Flipping it wholesale would have had the control plane refuse every login step-up as an unsupported type, so `responseVersion` is a per-call input and rp-login is pinned to 0.2 with the reason in the code. Required rather than defaulted: no default is right for both, and an optional field would make the next relying party inherit whichever one was chosen. Both directions are silent — too low and a bound approval needlessly elevates, too high and that party's step-up breaks entirely. The task-surface guard refused the new URI until the snapshot was refreshed; synced from a sibling checkout first verified to be exactly at origin/main with a clean vta-sdk. The diff is the two URIs #1315 and #1316 added. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
8 tasks
🛡️ AI Agentic Security Code Review🔎 A manual security review is recommended before merging. Please contact the Security team for specifics and remediation guidance.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The last step of the
release: stepUpchain. The agent has acceptedapprove-response/0.3since VTI #1316; this is the approver that asks in it, soa bound disclosure approval is answered
recordedand stops elevating thesession.
The catch that shaped this: one wallet, two relying parties
buildStepUpApprovalis shared by two flows that answer different services:persona/disclosure gaterp-login'sperformStepUpVtaFlipping the builder to 0.3 wholesale would have had the control plane refuse
every login step-up as an unsupported type. So
responseVersionis aper-call input, and
rp-loginis explicitly pinned to0.2with the reasonin the code.
It is required, not defaulted. There is no default that is right for both,
and an optional field would make the next relying party added inherit whichever
answer happened to be the default. Both directions of that mistake are silent:
too low and a bound approval needlessly elevates a session; too high and every
step-up against that party breaks. Same reasoning as
SigningIdentitybeing arequired channel input — a call that could omit it is a call that gets it
wrong by not thinking.
The task-surface guard did its job
tests/task-surface.mjsrefused the new URI because the checked-in snapshot ofthe agent's surface predated #1316 — a cross-repo guard catching a wallet naming
a task the agent does not serve.
Refreshed with
npm run tasks:syncagainst a sibling checkout verified to beexactly at
origin/mainwith a cleanvta-sdk/first, so the snapshot is of areal published surface rather than of someone's work in progress. The diff is
two URIs and a version —
approve-response/0.3andpersona/claim-types/list/1.0,from #1316 and #1315.
Tests
the disclosure approval is minted as 0.3, and rp-login's is notasserts bothhalves of the split from the same builder, and that both documents still verify
(the payload is identical across the versions — only the acknowledgement moved,
which is why a new version was needed at all).
Probed rather than assumed: collapsing the disclosure path back to
0.2failsthe test with the reason attached. The three
.mjscall sites inrp-login.step-up.mjsnow passresponseVersionexplicitly too — those filesare not typechecked, so "required" does not reach them and the contract is
better stated than implied.
Full suite green: 918 across the four workspaces, 0 failures;
tsc -bandnpm run buildclean.What this completes
With this, a
release: stepUpdisclosure through the wallet is: refused →approved with a fresh authentication bound to that
previewId→ released, withno session elevation anywhere in it. That was #1304's one stated compromise
and it is now closed end to end.
vta-mobile-coreis the remaining approver and moves the same way, independently.Guide checklist (§9)
responseVersionis required, so absence is a compile error rather than a silent default