Repository navigation
Epic: Node owner pathways #347
Description
Problem: node owners run their communities from City Node, but its two most important jobs are the hardest: getting people onboarded at events, and claiming rewards into their Node DAO. Events don't show, communities don't appear on the map, and the rewards card can work against them.
Goal: node administration that owners can do without walkthroughs, starting with its two most important jobs, onboarding and claiming, and protecting the attendee join flow owners already like.
Scope: owner-facing events, map, onboarding and claiming, plus measuring joins. Terms follow the glossary; "community" is the user-facing name for a node.
Decisions this epic depends on, with their owners and what they block, are in Decisions.
Track 1: Onboarding
Goal: a person finds an event, shows up, joins with one passkey prompt, and lands in the community, and owners set each step up without walkthroughs.
| Step | Issues |
|---|---|
| Finding an event | #339, #340, #341 |
| Showing up (the event's station) | #345, #333 |
| Joining | #336, #342 |
| Landing in the community | #343 |
| Measuring it | #338, #348 |
Done when:
- Coming up and the Events tab say whether visitors can see each event, and new manually created events are Published by default (Make owners' events show publicly, and show why when they don't #339)
- Overview and the Events tab show how many imported events are waiting, with a Review view that lists only those (Make owners' events show publicly, and show why when they don't #339)
- After connecting or switching a Luma calendar, owners see what the import did, and failed syncs are logged with their cause (Tell owners what a Luma import did, and log why syncs fail #340)
- Overview shows each community whether it's on the map, and why not when it isn't (Show owners whether their community is on the map #341)
- An owner opens an event's station in one click, and the button is hidden for anyone who isn't an organizer (One onboarding path: the event's button opens its station #345); events-team members create and edit events, approve imports, and start stations from the event in My community and from Organization → Onboard (Organizers can't start an onboarding station from the UI #333)
- An attendee joins with one passkey prompt; a signed-in prior joiner who is still a member sees "joined" on an expired or used-up code (revoked stays unavailable) (Prove the join flow end to end, and show "joined" after a code closes #336)
- When joining fails, the page names the cause and offers one next step (Join flow: name the cause when joining fails, with one next step #342)
- After joining, the attendee lands on a link to their community when it has a public page (After joining, link new members to their community #343)
- Platform admins see people who redeemed a code and new members, per community per month (Show platform admins code redemptions and new members per community each month #338)
- Owners see their community's code redemptions and new members, this month and last, on Overview (Show owners their community's code redemptions and new members on Overview #348)
- Each pathway with UI issues (events, map, station, join, admin count) has a passing Playwright trace on a test stack, linked here
Measure: people who redeemed a code and new members, per community per month, on the admin overview (#338) and each community's Overview (#348); becomes "activated members" once wallet activation exists. Baseline: last month as #338 and the owner stats show it when they ship, from #338's backfilled rows; no manual numbers.
Track 2: Claiming
Goal: each community whose Node DAO owns a validating pool claims rewards into its DAO without walkthroughs, and never loses time to a restarted unlock.
| Issues |
|---|
| #337, #344 |
Done when:
- No claim restarts an unlock, and unstake and withdraw pause while an unstake or withdraw proposal is open in the DAO or the pool or DAO can't be read (Stop the Team stake card from restarting the unlock #337)
- Treasury (
finance) members and DAO role holders see the Team stake card, Treasury members can open Overview, and only DAO members who can propose can act on it (Stop the Team stake card from restarting the unlock #337; first use of thefinancearea Epic: Organization teams, team workspaces & invitations #81 reserved) - Every owner whose community can't claim sees why (Tell owners why their community can't claim yet #344)
- Both are verified by unit and component tests with fixture RPC responses: browser specs can't seed the pool and DAO state claiming depends on, so this track has no Playwright trace
Measure: each community whose Node DAO owns a validating pool claims at least monthly, without walkthroughs (judged in owner interviews). A community counts when its Node DAO owns the pool and the pool is validating with staking not paused (#344's "Validating, owned by the DAO" state). Baseline: one of three city communities can claim today, and does so by hand in Trezu; the other two wait on pool decisions outside this epic. Counted by hand from DAO proposals until "Last claim" exists (Later).
Each outcome above is merged with its tests. Then close this epic; anything left, including #346, moves to a follow-up.
Pathways
| Owner pathway | Today | What gets in the way | Fixed by |
|---|---|---|---|
| Create an Onboarding Code and onboard people | My community → the event's Onboarding → pick the event again → start → open station | The button forgets the event; the Events tab starts a new station every time; Organization → Onboard points organizers to a page they can't open; several names for one thing | #345, #333; names Later (#346) |
| Join at an event (attendee) | Scan → one passkey prompt → joined | Works; no link to the community; closed codes show "unavailable" to people who already joined; failures all say "ask for a new link" | #336, #343, #342 |
| Make my events show | My community → Events, but visibility lives in Community settings | One job across two pages; drafts look live | #339, #340 |
| Get my node on the map | Community settings → Profile | Overview doesn't show whether you're on the map | #341 |
| Claim rewards (payouts on Trezu) | Overview → Team stake → propose → approve on Trezu | Can restart the unlock; no reason shown when the pool can't claim | #337, #344 |
| Add social accounts and profile | Community settings → Profile (moved there by #329, merged) | Settings split between Community settings and Organization | Later (settings merge); not counted in Done when |
| Decide what members and teams can do | Organization → Teams | The Teams tab doesn't explain what members can do | Later (Teams tab explains areas); not counted in Done when |
Sub-issues
| # | Issue | Track | Blocked by | First cut | PR | Owner |
|---|---|---|---|---|---|---|
| #339 | Make owners' events show publicly, and show why when they don't | Onboarding | #332 | Yes | #360 (draft) | |
| #340 | Tell owners what a Luma import did, and log why syncs fail | Onboarding | — | Yes | #360 (draft) | |
| #341 | Show owners whether their community is on the map | Onboarding | #332 (soft), #339 | Yes | — | |
| #336 | Prove the join flow end to end, and show "joined" after a code closes | Onboarding | — | Yes | #354 | |
| #342 | Join flow: name the cause when joining fails, with one next step | Onboarding | #336 | No | — | |
| #343 | After joining, link new members to their community | Onboarding | #336 | Yes | — | |
| #345 | One onboarding path: the event's button opens its station | Onboarding | — | Yes | — | |
| #333 | Organizers start stations from the UI | Onboarding | — | Yes | — | |
| #337 | Stop the Team stake card from restarting the unlock | Claiming | — | Yes | #358 | |
| #344 | Tell owners why their community can't claim yet | Claiming | #337 | Yes | — | |
| #338 | Show platform admins code redemptions and new members per community each month | Onboarding | — | Yes | #356 | |
| #348 | Show owners their community's code redemptions and new members on Overview | Onboarding | #338 | Yes | — | |
| #346 | Use the same names everywhere owners look | Later | Product owner's names; #345 | No | — |
Events and the map come first because they reach every community; claiming code helps one community today.
Labels: every sub-issue carries enhancement or bug as listed in it. Issues that ship with a PR (#339, #340, #336, #337, #338) get no ready-for-agent. Unbuilt issues (#341, #342, #343, #344, #345, #348) are posted with needs-triage and suggested for ready-for-agent at triage. #346 gets decision.
Merge-order hotspots
Several PRs and issues change the same files. Rows use PR numbers where a PR is open (#354 for #336, #356 for #338, #358 for #337, #360 for #339 and #340) and issue numbers otherwise. Each row lists the landing order; issues separated by commas can land in either order. Rebase the later ones.
| File | Order |
|---|---|
ui/src/routes/_authenticated/_dashboard/dashboard/node/index.tsx (Overview) |
#352 → #358 → #360 → #345, #344, #341 → #348 |
ui/src/routes/_authenticated/_dashboard/dashboard/node/-community-header.tsx |
#358 → #341 |
ui/src/routes/_authenticated/_dashboard/dashboard/node.tsx |
#358 → #345 |
ui/src/components/discovery/activity-editor.tsx |
#332 → #360 → #345 |
ui/src/components/discovery/events-editor.tsx, ui/src/routes/_authenticated/_dashboard/nodes/$nodeId/content.tsx |
#332 → #360 → #341 |
ui/src/components/discovery/event-visibility.tsx (added by #360) |
#360 → #341 |
tests/regression/lib/seed-tenant.mjs |
#360 → #341 |
ui/src/components/team-stake-card.tsx |
#358 → #344 |
ui/src/components/layout/nav-items.ts and its test |
#350 → #358 |
ui/src/i18n/messages/: common.ts, public.ts |
common.ts: #352 → #360; public.ts: #332 → #353 → #358 |
plugins/auth/src/handlers/onboarding.ts |
#354 → #356 → #343 → #342 → #345 |
plugins/auth/src/contract.ts |
#356 → #343 → #342 → #345 |
plugins/auth/tests/integration/onboarding.test.ts |
#354 → #342 → #345 |
plugins/auth/ui/src/routes/_public/onboard.tsx, plugins/auth/ui/src/routes/_public/-onboard.test.tsx |
#354 → #343 → #342 |
tests/regression/browser/helpers/onboarding-seed.ts |
#354 → #356 |
#360 (#339, #340) is a draft until #332 merges, then rebases on it.
Decisions
| Decision | Owner | Blocks |
|---|---|---|
| Final copy for #341, #342 and #344 | Product owner | Those issues' merge, not their build |
| Should imports from before #315 stay public? | Maintainers | Nothing in this epic |
| Pool ownership and validators for communities that can't claim yet (assumed: each city community gets a DAO-owned pool soon) | Maintainers | Claiming past one community; no issue in this epic |
| Names for onboarding, settings and profile pages, after interviews | Product owner | #346 |
| Member permissions: what members and teams can see and do | Maintainers | Nothing in this epic |
| Merge community settings from Organization into Community settings | Maintainers | Nothing in this epic |
Settled:
- Who edits events? (Organizers can't start an onboarding station from the UI #333; revisits Spec: Event onboarding — passkey sign-up, event-linked Onboarding Codes, hardened Device Link #190): members of a team with the
eventsarea create and edit events and approve Luma imports. - Where does onboarding start? (Organizers can't start an onboarding station from the UI #333): both, from the event in My community and from Organization → Onboard, which gets an event picker.
#333 ships in the first cut. Background: #81 and #190 (closed).
Risks
- Pools: claiming only grows past one community after the pool decision in Decisions.
- Platform migration: chore: consumer break-off — extend the published base, drop the vendored fork #357 (draft) moves City Node onto the published v2 base: pnpm, the upstream CI workflow, and the vendored platform and
tests/regressionremoved. PRs that merge before it need no port. The browser specs in fix(onboard): show "joined" after a code closes, and prove the join flow end to end #354 and feat: show platform admins code redemptions and new members per community each month #356, and the Playwright-trace criterion above, need a new home once it lands. - Evidence: the order comes from code and chain state; node owner and platform admin interviews under way may change it.
Supporting
CI doesn't run the UI, API or plugin test suites today, so each PR runs them locally and says so. The v2 platform migration (#357) replaces CI with the upstream consumer workflow, which runs every workspace's tests, including the auth plugin's; its timing-sensitive tests (device link, orphan sweep, passkey sign-up and session revocation, in plugins/auth/tests/integration/) may need fixing then.
Non-goals
Wallet activation (the next Build page epic), member pathways, the admin launch path, and community subdomains. Each is a separate epic or listed under Later.
Related
- Already tracked: bug: plugins/auth UI error-handling batch — onboard.tsx crashes on load, floating promises, blank renders, wrong recovery paths #211, Create the organization when a community application is approved #321, Make community approval provisioning and DAO publication resumable #322, Community settings: tenant slug and account-name URLs use the wrong tenant ID #331, fix(ui): load community events independently of the profile #332, Organizers can't start an onboarding station from the UI #333
- Small PRs alongside: test(ui): disable Node's built-in web storage in UI test workers #349 (UI tests on Node 26), fix(ui): explain unstaking and 100% commission on the stake page #353 (stake page copy), chore(ui): remove the duplicate Docs link from the signed-in sidebar #350 (duplicate Docs link), chore(ui): remove the contributor badge from community bulletins #352 (bulletin badge)
- Security fix alongside: fix(auth-plugin): require member:create to add organization members #359 ports the
addMemberpermission check from fix(auth-plugin): require member:create to add organization members everything-dev#315.
Later
- Use the same names everywhere owners look #346: use the same names everywhere owners look (
decision; waits on the product owner's names after interviews, and on One onboarding path: the event's button opens its station #345) - Merge community settings from Organization into Community settings (waits on the maintainer decision in Decisions)
- A setup checklist on Overview showing owners what's left to set up (waits on owner interviews)
- Claim rewards into the Node DAO from one Rewards card (after Stop the Team stake card from restarting the unlock #337, once a second city community can claim)
- Event times entered in the event's time zone
- Approve, reject and retry reward claims in City Node
- "Last claim" on Overview for owners (the joins figures are Show owners their community's code redemptions and new members on Overview #348)
- Teams tab explains what each area allows
- Signed-out prior joiners on a closed code see "unavailable" until they sign in; offer sign-in there (follow-up to Prove the join flow end to end, and show "joined" after a code closes #336)
- A removed member who re-scans an open code is told they joined but isn't re-added (follow-up to Prove the join flow end to end, and show "joined" after a code closes #336)
- Community subdomains verified at approval (depends on Zone-wide SSO mechanics: cookies, CSRF/CORS, ADR 0013 amendment everything-dev#358 for signed-in use)
- Community page shows all upcoming events and social updates
- "Also show on" only offers communities you manage
Metadata
Metadata
Assignees
Labels
Type
Fields
Priority
Projects
- StatusShow more project fieldsTodo
Activity
adenarc commentedon Oct 15, 2026
Playwright traces for the owner pathways, all passing on the
start:ssrtest stack (11/11, #381):owner-event-visibility.spec.ts, extended in test(regression): prove owners' live events show publicly (#347 traces) #381community-map-status.spec.tsevent-station.spec.ts,organizer-stations.spec.tsonboarding.spec.tsadmin-joins.spec.tsAlso checked all four by hand on the #381 build with a wallet sign-in.