Build one
Everything else on this site is reference. This is the deliverable — written as a procedure, with the estate's own files as the worked example throughout.
CC BY 4.0 permits taking these role files, changing the names, and shipping your
own team — commercially included, with attribution kept. Keep the attribution line
inside any ROLE.md you copy out, because that is how it survives being
pasted into someone else's repo.
Start with the portable six
architect, dev, devops, historian, librarian, qa. Not a guess — these are the six roles defined in all three operational teams (Explorer, Villager, and the estate's second product, sg-playwright), which is the closest thing to a controlled experiment the corpus contains: the estate independently reached for the same six when standing up a second product.
Excluded from this test: Town Planner. It is a commercial team (accountant, alchemist, designer, librarian), not an operational one, and only its Librarian overlaps with the six.
Write every exclusion list before you write the mission
A role without a Not Responsible For field is not a role — an LLM
given a task will attempt it, and the exclusion list is the only thing that stops
every role from silently becoming the same role. Write it as a list of specific
activities, named after the role that owns them instead — "making architecture
decisions (that's the Architect's job), deploying infrastructure (that's
DevOps's)" — so a reader who hits the boundary knows exactly where to go.
Worked example: Conductor's exclusion list names five specific activities and the roles that own them, not a vague "stay in your lane."
Write the Central Claim as a failure condition
Not "the Librarian keeps things findable" — "if a piece of knowledge exists in this repo but cannot be found in under 30 seconds, the Librarian has failed." A condition, a threshold, sometimes a time bound. The estate's own history shows this getting lost in a later format migration — read why before you write yours, so you do not repeat the regression on day one.
Put the comms tree where every role can find it
One shared location, addressed inside each role's own file — not a separate system a role has to be told about separately. The estate's shape:
team/comms/ ├── QA_START_HERE.md the landing page for one role — copy this pattern per role that needs it ├── briefs/ inter-team briefs ├── changelog/MM/DD/ what changed, written by whoever changed it └── plans/MM/DD/ forward work
The learning that made this work: the shared tree existing is not enough — every role's own file must name the directories it reads and writes. Learning 1, in full →
Give every long-running role a session-start sequence
Eight steps, adapted from QA's: read the landing page, check the changelog, check briefs addressed to you, read your own previous work, read the latest routing brief, confirm the baseline is green, check open issues, pick the next action. This is what lets an agent's session start knowing what happened while it was gone — solved with files, not memory. The full sequence →
Grant a tool and write its prohibition in the same commit
When a role gains a new capability — a CLI, an API key, write access to something — the rule that constrains it goes in the same table row as the grant, in the same commit. A capability added on Monday and a rule added in June is a month of exposure. Learning 2, in full →
Know the trigger before you split into Explorer and Villager
Here the estate's own record runs out, and the honest answer is: the trigger is undocumented. Nothing states when a component moves from build to harden, or who decides. The Cartographer's Genesis/Custom/Product/Commodity classification is the obvious mechanism, but that link is this pack's inference, not the estate's statement. Decide your own trigger explicitly before you split, and write it down — which is the one thing the source estate has not yet done. G2, and why it is the highest-value gap to close.
Before you call it done
- Every role file has Name, Location, Core Mission, Central Claim (as a failure condition) and Not Responsible For.
- Every role's Tools and Access table names the comms directories it reads and writes, and any prohibition sits next to the capability it constrains.
- The Conductor's file states the routing rule explicitly — "the Conductor never does the work" is worth quoting verbatim if it is true of yours too.
- You have decided, and written down, when a component graduates from your Explorer-equivalent to your Villager-equivalent — even if the answer is "not yet, we are one team."
What this page will not do. It will not compare this approach to LangGraph, CrewAI or AutoGen — the corpus has no evidence about them, and inventing a comparison would break this site's own sourced-claims rule. And it will not claim these nineteen roles are optimal. They are the estate's own, measured, with the gaps shown — start there if step 1 above needs the full picture before you commit to it.