feat(join): create a persona without leaving the join - #348
Merged
Merged
Conversation
A community that vets is exactly where someone without a persona finds out they need one — applying signs every card with it. The route was blocked with "create one under My Identity", which meant leaving the flow, finding the right pane, minting, and coming back to start the join again, entering the community's DID a second time on the way. The requirements just read were gone by then too. `n` on that page now opens the create-persona overlay over the join, with every option it has: the label, whether the hosting server names the DID's path or the operator does, and which context it is minted into. It is the same overlay rather than a second one. Its keys and its rendering were methods on the main page and are now one module both pages call, taking the overlay state and an action sender — the only two things they ever used. The phases, the keys and the wording therefore cannot fork between the two places it can be opened from. Only the mint differs, and only in how it is run. The runtime loop spawns it through its dispatcher; the join loop has none, so `spawn_persona_mint` splits into `advance_persona_overlay` — everything up to the mint, which is phase-checking against config and needs no I/O — plus the job. The join loop awaits that job raced against the interrupt (R15), draining its progress onto the overlay as it arrives rather than after: minting a DID is not instant, and a frozen "Creating persona…" is indistinguishable from a wedged one. A persona minted here is persisted and its listener started before the overlay closes. The route it unblocks is the one that would otherwise fail on a persona that cannot send, which would be worse than the block. The vetting view is re-derived once the overlay is gone, so the row that was blocked on having no persona unblocks itself rather than waiting for the join to be entered again. The two places that said "create one under My Identity" now name the key that is on the page they are printed on. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
This was referenced Sep 19, 2026
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.
Follow-up to #347, found in the same live guide run. Single commit on
main.Why
A community that vets is exactly where someone without a persona finds out they
need one — applying signs every card with it. The route was blocked with
"create one under My Identity", which meant leaving the flow, finding the
right pane, minting, and coming back to start the join again, entering the
community's DID a second time on the way. The requirements just read were gone
by then too.
What changed
non that page opens the create-persona overlay over the join, with everyoption it has: the label, whether the hosting server names the DID's path or the
operator does, and which context it is minted into.
It is the same overlay, not a second one. Its key handling and its rendering
were methods on the main page; they are now one module both pages call, taking
the overlay state and an action sender — the only two things they ever used from
self. The phases, the keys and the wording therefore cannot fork between thetwo places it opens from.
Only the mint differs, and only in how it is run. The runtime loop spawns it
through its dispatcher; the join loop has none. So
spawn_persona_mintsplits:advance_persona_overlay— everything up to the mint. Phase-checking againstconfig, no I/O. Returns the job when the last phase commits.loop, the way that loop already awaits the join sequence.
The join loop races it against the interrupt (R15) and drains its progress onto
the overlay as it arrives rather than after: minting a DID is not instant, and a
frozen "Creating persona…" is indistinguishable from a wedged one.
A persona minted here is usable when the overlay closes. It is persisted and
its listener started before then, because the route it unblocks is the one that
would otherwise fail on a persona that cannot send — which would be worse than
the block was. In State A there is no service to install into; that loop restarts
into the full pipeline after a join and brings it up there, as it already does.
The routes re-derive once the overlay is gone, so the row blocked on having
no persona unblocks itself rather than waiting for the join to be entered again.
The two places that said "create one under My Identity" now name the key on the
page they are printed on, and the footer offers
Nonly where it is the thingstanding in the way.
Testing
cargo fmt --all --check,cargo clippy --all-targets --all-features— cleancargo test --all-features -- --include-ignored— all greenRUSTDOCFLAGS="-D warnings" cargo doc --no-deps --all-features— cleanRe-run after rebasing onto
mainwith #347 in it.applying_without_a_persona_points_at_the_key_herepins the blocked reasonnaming
nand not naming My Identity — the latter is the assertion that wouldcatch this regressing, since the sentence reads fine either way.
Not covered
The overlay's own behaviour is covered by the main page's existing tests, which
now exercise the shared module. What has no test is the join loop hosting it
— the inline mint, the progress drain and the listener start need a VTA, so they
are the part the live run has to prove. Worth knowing before this is relied on.
Not yet run against the live community; the guide run that prompted it is next.