feat(vetting): make a face for this community without leaving the flow - #358
Merged
Merged
Conversation
#356 made the picker say which faces cannot make this community's card. That leaves the case where none of them can: the answer was to go to My Identity, build a face there, come back and press f again — the out-of-cycle config work this flow has been folding inline everywhere else. The picker gains a last row, "Make a face for this community". A row rather than a key, so every way out of the screen is in the list the eye is already on. It opens a form that knows what the face is for. The community has already named the claim types its card must carry, so the matching attributes open **already ticked** and the holder's decision is usually just a name. What is still missing is said against the current selection, not against the pool, so unticking something required says so at the moment of the choice rather than at the card preview. Composed from attributes the pool already holds; it never creates one. Supplying a value for a legal name is a different act from arranging which attributes a face shows, and it belongs with the editor that knows about value types, sensitivity and masking. What this form owes the holder is to name the claim type no attribute can cover — a different problem from one merely unticked, because ticking harder will not fix it — rather than offer a face that cannot make the card. Creating and wearing are one step. A face made here exists to be worn by this application; leaving it created but unworn would put the holder back on the picker to do what they had just asked for. It reuses the `FaceWorn` outcome, so the face is recorded on the application and shown by the same paths as one chosen from the list. The pool read meets the same holder-grant refusal the faces read does — the pool is what a face is built over — and routes it to the same view rather than passing the agent's paragraph through. `other_entries` is empty on the write because this creates: there is no profile whose pinned or inline entries could be dropped. The general editor has to carry them; here there is nothing yet to carry. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
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.
#356 made the picker say which faces cannot make this community's card. This
handles the case it exposed: none of them can.
The answer then was to leave the vetting flow, build a face under My Identity,
come back and press
fagain — the out-of-cycle config work this flow has beenfolding inline everywhere else (#348, #351).
The row
The picker gains a last row:
A row rather than a key, so every way out of this screen is in the list the
eye is already on.
The form knows what the face is for
The community has already named the claim types its card must carry, so the
matching attributes open already ticked. The holder's decision is usually
just a name.
What is still missing is computed against the current selection, not the
pool, so unticking something required says so at the moment of the choice
rather than three steps later at the card preview.
Composed, never created
The form selects from attributes the pool already holds and never creates one.
Supplying a value for a legal name is a different act from arranging which
attributes a face shows, and it belongs with the editor that knows about value
types, sensitivity and masking.
What this form owes the holder instead is to name the claim type no attribute
can cover:
That is a different problem from a claim merely unticked, because ticking harder
will not fix it, and
a_claim_the_pool_cannot_cover_is_named_as_suchpins thatthe two do not get conflated.
This is the deliberate boundary of the PR. A holder who has never recorded
their legal name still goes to My Identity once. The inline flow covers the
common case — attributes exist, spread across faces that individually fall
short — which is exactly the shape the dry run hit.
Three smaller decisions
Creating and wearing are one step. A face made here exists to be worn by
this application; leaving it created but unworn would put the holder back on the
picker to do what they had just asked for. It reuses the
FaceWornoutcome, sothe face is recorded on the application (
ChosenFace, #356) and displayed bythe same paths as one chosen from the list.
The pool read meets the same holder-grant refusal the faces read does — the
pool is what a face is built over — and routes it to the same view rather than
passing the agent's paragraph through.
other_entriesis empty on the write, because this creates.ProfileForm'sown doc warns that rebuilding a profile from only the ticked boxes silently
deletes pinned and inline entries; that hazard is real for the general editor
and absent here, since there is no existing profile to lose anything from.
Testing
cargo test --all-features— all greencargo clippy --all-targets --all-features— cleancargo fmt --all— cleanRUSTDOCFLAGS="-D warnings" cargo doc --no-deps --all-features— cleanThree new tests: the opening selection, the uncoverable case, and that the pool
read's holder refusal lands on the same view.
Not covered: the
FaceJob::Createjob itself, which needs a live VTA — thetests exercise the form's logic and the outcome handling, not the write. The
key wiring (Tab between name and list, Space to tick) is also untested; it goes
through the panel's generic non-List key handler, which has no harness.
Not validated live. Nothing here has been run against a real pool.