Lane 3: Members & characters (#729, CAMP-8) #768
Loading…
Reference in a new issue
No description provided.
Delete branch "build/lane3-members"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Lane 3's third UI PR: CAMP-8, Members & characters — 38 of 42 coverage rows, at
/campaigns/:id/members, with an entry in the Contents.It is a page every member opens rather than a panel only the GM could reach (#656). A row is a person — their name, their own pronouns, their role, the owner's mark — and their characters hang under it with their pronouns, which is the whole point of the page: the two facts can never be mistaken for each other.
A server change, inside a UI PR
Flagging this because build-plan §7 wants server work first, as its own PR.
IS-230asks for a person's pronouns beside their name, and there was no wire for them.MemberResponsecarriedcharacter_pronounsand not the person's, so the page built to stop #653's confusion had only the character's to print next to a human being.User.pronounsexists andThisWeekRsvpalready carries it (#765).The change is
MemberResponse.pronouns, read from the account inlist_members— null when unsaid, nothing inferred from a name, nothing borrowed from the character below. Purely additive, and every member endpoint is built bylist_members, so one line covers list/add/role/patch/assign. NoBOT_CONTRACT_VERSIONmove: the bot reads/api/bot/*only.Splitting eight lines and two tests into their own PR would have cost more than it bought, so it is here with this note rather than silently.
Not built: the Foundry panel (
IS-272–IS-275)Four drawn rows, absent. There is no server for them. The only Foundry code in the backend is
app/reference/adapters/foundry.py, which imports reference content for content packs; nothing fetches a Foundry actor, stores one, or records a sync time, andCampaignResponsehas no Foundry connection field. Build-plan §3.3's D36 is exactly this case — "a Discord or Foundry action is never a dead button" — so the panel is absent rather than drawn dead.This is not a gap nobody owns: D82 ("Foundry both ways and Pathbuilder in", owner, 2026-09-21) assigns the integration to WIKI-19, lane 9.
IS-276, the typed sheet link that stands in for it meanwhile, is built.Where the drawing and the server disagreed
CampaignAnalytics.jsxmade for "3 h 38 m a session".!gm— only a player may leave. #644 says the last GM may leave, so it is gated on "not the owner" instead, and tested from both sides. A guard here would have quietly reverted a decision taken on purpose.join_requires_approval, so there are two wordings.Where the drawing is wrong
aria-label="Add a member"on a button reading "Add someone" — the visible label is not inside the accessible name, a WCAG 2.5.3 (label-in-name) failure, inherited from the old page's "+ Add" button which genuinely needed one. Dropped. The "Close" state keeps a label that contains its visible word.flex: 1; min-width: 0wrapped the person's name mid-word, on the one page where that is unaffordable. Fixed with a container query giving the name and the actions a line each. The render caught it; reading the CSS did not.One default worth your eye
The erase's "Rewrite the summaries afterwards" defaults ON, as all three drawn stills show (
aria-pressed="true"); the old page defaulted it off. The caption calls it "the part people miss", and leaving a person named in GM-approved summaries defeats the erase. But it does mean the default run regenerates approved text. One line to flip if you would rather it were opt-in.Merges
Two, both with a resolution git could not see:
AppFrame.test.jsxauto-merged without a conflict and was wrong — This week asserts Settings is absent from the Contents; CAMP-8's split is what puts it there.vocabulary.js—MEMBERS_AND_SETTINGSretires the moment CAMP-8 has its own page, which its own comment said would happen. What is left behind…/manageis the nine Settings sections, so the entry isSETTINGS.Checks
Frontend 1591 tests in 127 files, green on the merged tree. Backend 289 passed across the member, ownership, character, erasure, invite and this-week suites;
ruffclean.lane2.pyprints with no unclassified rows and no classification changed. Renderedlane2.html?only=camp8in both themes, then served the builtdistand screenshotted the real page with real data at desktop and 500 px — which is what found the wrapping bug.🤖 Generated with Claude Code