Second pass over the UI's copy, addressing every finding on the previous implementation and sweeping the same vocabulary across the surfaces it had missed. The rule applied throughout: a string that named a record, a repo, the registry, the fold, a CID or a PDS now names what the person in front of it gets.
The review's findings #
Space settings, Members and guest comments (error). Whose records this space counts is now Who belongs to this space, and whose work it shows, with
the private clause saying it is also who can open the space. The private
guest-comments help no longer explains backlink records, URIs, the fold and a
refused record; it says it is not available in a private space and why in one
sentence — looking a goal up in a public directory would give away that the goal
exists. The public help is reframed as an invitation rather than a permission
and keeps the blessing rule, which is the part a person acts on.
Duplicated durability tooltips. The registry rows now read
durabilityNote[row.durability] from $lib/admin.js, which is what that
constant documents itself as existing for. The ternary is gone.
The docs setup card's orphaned identifier list. The bare row of <code>
tokens had lost its antecedent. It is now introduced (Setting up adds:) and
each entry is named with what it is for, taken from the drafts the button
actually registers — so the list matches the write, and nothing on screen is
unexplained.
"Open the fixture space". Now Open the demo space, matching the chip, the
hints, the write error and RoomyThread's existing house word.
The unswept same-class copy (the info finding), all of it: NewRequest's
two registry sentences, NewType's taken-name error, PlusMenu's empty menu,
Account's "records … your own repo" and its two PDS hints, DocReader's
sources help and unresolved-source label, and the space page's
hint="the registry record". Diagnostics' other two notes are reworded so all
three agree — the previous pass had done one of the three.
Carried further in the same sweep #
SpacePicker (In your repo → Your spaces, and its loading, failure and
private-badge strings), Skeleton and PaneBar's sync text, GuestComposer's
toast, UnitDetail's four URI hints and its tangled pull tooltip, Verdict's
Pinned to … by cid, write.ts's four sign-in errors, docs.ts's tier blurbs
and source label, the space page's root badge, ticket tooltip, removal toast,
empty member list and non-member note, the goal page's not-found line, and
userinput's dropped-item count.
An append-only successor is now Request a replacement rather than
Request a superseding record (and A replacement is already requested), in
requests.ts with its three test expectations updated.
Scope calls #
- Private mode's device panel keeps its own vocabulary.
envelope,endpoint,peerand thelocalOnly/peers === 0split are the fact on that surface, and ADR §19/§21 chose them deliberately. What did change there is the copy that explained mechanism instead: the mode badge and header, six badge tooltips that named replicas and repos, the other-members help, andIts bootstrap names …→The ticket this browser joined with names …. docs/phase6-ui-plan.mdstill quotes the old successor label. It is a historical plan document, and the previous pass likewise leftdocs/untouched; rewriting a plan to match a later copy edit would misreport what was planned.
Checks #
pnpm lint (0 errors, 703 files) · pnpm build · pnpm test — all packages
pass, @radial/ui 902 vitest + 96 node --test. One test asserted a changed
string (userinput-page.svelte.test.ts, "One record was unavailable") and was
updated with it.
Risks #
Copy-only plus one import and one small stylesheet rule; no fold, lexicon or
write-path behaviour changed. The residual risk is editorial — Request a replacement is shorter than the mechanism it names (the superseded version
stays visible as dated history, which the tier's own label already says), and
Diagnostics' Read but not counted, and why. leans on the {group.reason}
labels beneath it to carry the detail.