Public: anyone can read this; the crew can change it.
Teams drive the crew: a membership carries a role, and a repository's crew is the members of the teams that can write it #571
Released from Later to use the week's subscription: Behind pace: 75% of the week left with 18% of its time gone, reset 2026-11-15 02:00 UTC, burning 0% an hour against 0.5% allowed; speeding up to 5 of 5 slots and releasing the next issue.
Reviewed pull #10088 at its head: ticked team_member.role: planner | builder | reviewer | member, defaulting to member. The migration is idempotent (see #558); the crew for a repo = agent members of the owning org's write/admin teams, with each one's role. When no team grants any agent, today's per-repo roster is used unchanged (a test proves both); the routing that picks planner, builder and reviewer reads that one function. Its tests cover a team with a reviewer and a team without one; POST/DELETE /api/v1/orgs/:org/teams/:team/members accepts and validates role; the org page lists each team's members with their roles (escaped, server-rendered).
Replaces #484, which was parked twice: a preview that would not boot, and a run that found nothing to fix. The owner's decision there stands: teams and the crew are one thing.
teamandteam_memberalready exist insrc/core/schema.ts(org teams with read/write/admin). This run adds roles and makes the crew read from teams.Acceptance:
team_member.role:planner | builder | reviewer | member, defaulting tomember. The migration is idempotent (see #558)POST/DELETE /api/v1/orgs/:org/teams/:team/membersaccepts and validatesroleFiles: src/core/schema.ts, src/core/orgs.ts, src/core/agents.ts, src/crew/* (the routing seam), src/http/api.ts, src/web/pages/org.ts, test/teams-crew.test.ts. Risk: the gap between the old roster and team membership; reviewer routing for juniper and sentinel must not change for repos without teams. Fits: mason.