Skip to content

refactor(persona): one word for a persona [on hold — awaiting vocabulary] - #278

Closed
stormer78 wants to merge 3 commits into
mainfrom
feat/identity-pane-naming-and-grant
Closed

refactor(persona): one word for a persona [on hold — awaiting vocabulary]#278
stormer78 wants to merge 3 commits into
mainfrom
feat/identity-pane-naming-and-grant

Conversation

@stormer78

@stormer78 stormer78 commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

On hold. The functional half — the ACL grant the pane needs — moved to
#279 so it isn't blocked by a naming decision. What's left here is vocabulary,
and you're settling the canonical terms; I'll redo this sweep against whatever
lands rather than merging a word that's about to change.

What this was going to do

Rename the pane's "face" to persona, on the evidence that "face" appears
nowhere else in the ecosystem:

  • the Trust Tasks spec, the VTA, the SDK, pnm persona binding set --persona-did
  • the console pane shipped this week (nav "Persona"; sections "Attributes",
    "Profiles", "What each persona presents")
  • this repo's own PersonaRecord / persona_ref / persona_did
  • (the 69 "face" hits in the browser plugin are all surface / interface)

Not "profile" — that already names the thing a persona presents. You bind
a profile to a persona; the reverse is not a sentence, and reusing the word
would collide head-on with persona/profile/*.

The overload "face" was invented to dodge is real — the persona/* task family
spans the DID and everything above it — but it's a prose problem with a prose
fix: say "persona DID" where a sentence has to be unambiguous, exactly as pnm's
own help does.

Also renames ContentPanelState::personasidentity, so the list can take the
name it should have had (identity.personas, not personas.personas) — that
part is independent of which noun wins, since the menu entry has read
"My Identity" since #277.

When the vocabulary lands

The sweep is mechanical (~112 occurrences, mostly prose) and I'll re-run it
against the agreed terms. Worth deciding at the same time: whether the menu
entry stays "My Identity", and whether the tab keeps the plural noun.

The identity pane called a persona DID a "face". Nothing else does: not the
Trust Tasks spec, not the VTA, not the SDK, not `pnm persona binding set
--persona-did`, not the console pane shipped this week, and not this repo's own
`PersonaRecord` / `persona_ref` / `persona_did`. A holder moving between two of
those surfaces had to translate, and translation is where a boundary gets
misread.

"Profile" was the other candidate and it is the one that would have hurt: it
already names the thing a persona *presents*. Calling the DID a profile would
have collided head-on with `persona/profile/*` — you bind a profile to a
persona; the reverse is not a sentence.

The word "persona" is genuinely overloaded — the task family spans the DID and
everything above it — and "face" was an attempt to fix that by inventing a third
noun. The overload is a prose problem with a prose fix: say "persona DID" where
a sentence has to be unambiguous about which layer it means, exactly as `pnm`'s
own help does. The pane's module header now states both words and the direction
between them.

`ContentPanelState::personas` becomes `identity`, so the list can take the name
it should have had: `identity.personas` rather than `personas.personas`. That
matches the menu entry, which has read "My Identity" since the pane landed —
the pane is not only personas, and now the field says so.

Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
The pane shipped unable to do most of its job, and the reason was an ACL scope
nobody had connected to it.

Setup provisions a context-scoped admin — `pnm contexts create --admin-did`
writes `allowed_contexts: ["openvtc"]` — while the attribute pool, the profiles
over it and the disclosure history are gated on an *unscoped* holder credential,
because they sit above every trust context. So on every install the Attributes,
Profiles and Disclosures tabs were refused, correctly, by a gate this client
could not satisfy without becoming an administrator of every context on the
agent.

The command the setup page shows now ends `--admin-holder`, which grants the
`persona-holder` capability alongside the context-scoped entry
(verifiable-trust-infrastructure#1286). The entry stays scoped to its one
context and gains authority over the holder's own identity — which is what a
client that *is* the holder should have and an integration should not. It is not
a way around the boundary; it is the grant the boundary was waiting for.

For installs that already exist, the pane's refusal now carries the command
instead of only the agent's (accurate, abstract) explanation. Matched on the
phrase both the current and pre-capability VTA use, so an operator pointing at
either gets the hint; matched on that phrase rather than on "forbidden", because
a false positive sends someone to fix something that is not their problem.

The command is now tested. It is pasted character for character into another
terminal, and a mangled string literal — a run of spaces where a line
continuation collapsed — is invisible in review and survives all the way to the
operator's shell. One had already got in.

Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
@stormer78
stormer78 requested a review from a team as a code owner September 7, 2026 10:47
@stormer78 stormer78 changed the title refactor(persona): one word for a persona, and the grant the pane needs refactor(persona): one word for a persona [on hold — awaiting vocabulary] Sep 7, 2026
@stormer78
stormer78 marked this pull request as draft September 7, 2026 11:16
@stormer78

Copy link
Copy Markdown
Contributor Author

Superseded by #280, which does this against design-docs/persona-vocabulary.md rather than guessing.

The guess was half right and half backwards: persona for the persona DID is what the table says (that commit survives, first in #280), but I had used face for the persona DID — the table uses it for a profile. So the rename I was holding would have entrenched the collision it was meant to remove.

The functional half — the ACL grant — is #279.

@stormer78 stormer78 closed this Sep 7, 2026
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.

1 participant