Summary
Firstmate already lets me choose who does the work (config/crew-dispatch.json picks harness, model, and effort per kind of task). It does not let me choose how the work is done.
The workflow steps themselves are fixed. no-mistakes is the validation skill, and phases like planning and code review have no skill hook at all. I have my own skills that I trust for those phases and I want firstmate to use them.
I'd like a local, gitignored config file that maps a workflow phase to a skill, so that:
- when a crewmate does planning work → it uses my
grill-with-docs skill
- when a crewmate does code review → it uses my
thermo-nuclear-code-quality-review skill
Same idea as config/crew-dispatch.json, just one axis over: that file answers which agent, this one answers which skill.
The problem today
I have a working style I like. It lives in skills I've written and refined. Today there are only three ways to get firstmate to use them, and none of them work well:
- Type it into every task. I have to remember to tell the first mate "use grill-with-docs for the planning" on every single dispatch. Miss one and the crewmate quietly does it the default way. It doesn't scale past a couple of tasks, which defeats the point of running a crew.
- Write it as prose in
data/captain.md. This is a preferences file, not a dispatch contract. It's a nudge, not a rule — it may or may not be applied, and there's nothing that fails loudly when a skill name is wrong or missing.
- Fork
AGENTS.md. This works, but AGENTS.md is the shared, tracked orchestrator file. Editing it to hold my personal skill choices means my private preferences now live in tracked, shared material, and I fight a merge every time upstream changes. The repo's own tracking principle says shared things are tracked and personal things aren't — my skill preferences are personal.
So there is currently no supported place to put "this is my workflow" and have it actually stick.
What I want
A local, gitignored file — config/crew-skills.json — that firstmate reads before dispatching and before driving a phase transition:
{
"phases": {
"plan": { "skill": "grill-with-docs" },
"review": { "skill": "thermo-nuclear-code-quality-review" }
}
}
That's the whole minimum viable version. Two lines of config and my crew works the way I work.
With per-project overrides
Different projects deserve different rigor. My side project doesn't need the nuclear option; my production service does:
{
"phases": {
"plan": { "skill": "grill-with-docs" },
"review": { "skill": "thermo-nuclear-code-quality-review" }
},
"projects": {
"my-side-project": {
"review": { "skill": "quick-sanity-review" }
}
}
}
Resolution order
Most specific wins, and it should fall back cleanly to today's behavior:
- an explicit instruction from me in chat for this one task ("plan this one with grill-with-docs")
- the
projects.<name> entry for the project the task belongs to
- the top-level
phases entry
- today's built-in default (no extra skill,
no-mistakes where the delivery mode calls for it)
A captain with no config file sees zero change in behavior.
Suggested phases
I'd start with a small, fixed set of names that match firstmate's existing vocabulary rather than inventing new concepts:
| Phase |
When it fires |
Applies to |
plan |
crewmate is investigating, planning, or writing up findings |
scout tasks |
implement |
crewmate is writing the change |
ship tasks |
review |
the change is written and needs a quality pass before delivery |
ship tasks |
validate |
the delivery gate runs |
ship tasks (no-mistakes mode) |
Starting with just plan and review would already cover my case and most of what people are likely to ask for. The rest can come later.
Why I think this fits firstmate
This isn't a new concept — it's the existing one applied to a second axis.
config/crew-dispatch.json is the exact precedent. It's a local, gitignored JSON file of natural-language rules that firstmate resolves with judgment, validated at bootstrap, inherited into secondmate homes, and never mixed into tracked shared material. Everything I'm asking for could follow that same pattern, and a captain who already understands crew dispatch would understand this immediately.
It respects the tracking principle. AGENTS.md stays the shared orchestrator. My skill preferences stay local and gitignored, next to crew-harness, crew-dispatch.json, and backend. Nothing personal ends up in tracked files, and I never fight a merge to keep my workflow.
It's the missing half of dispatch. Right now I can say "send the hard tasks to a strong model" but not "and have it review its work the way I review mine." Those two decisions belong side by side.
If you'd rather not add a second file, folding a "skills" key into config/crew-dispatch.json would satisfy me just as well — I care about the capability, not the filename.
Guardrails I'd expect
I want to be clear that I am not asking to weaken the delivery gate.
- The
no-mistakes gate stays authoritative. For no-mistakes-mode projects, my review skill should run in addition to the pipeline, not instead of it. If a captain ever wants to actually replace it, that should be an explicit, separate, obviously-scary opt-in — not something you get by filling in review. Default is additive.
- Fail loudly, not silently. If a configured skill doesn't exist, or the JSON is malformed, bootstrap should report it the way an invalid
crew-dispatch.json is reported today (CREW_SKILLS: invalid config/crew-skills.json - ...) and refuse to quietly fall back. A skipped review is worse than a stopped dispatch.
- Reuse the existing harness knowledge for invocation. The
harness-adapters skill already owns the per-harness skill-invocation syntax (/<skill> for claude, grok, and kimi; $<skill> for codex; natural language where no form is verified). This feature should call into that, not restate it — and on a harness with no verified invocation form, degrade to a natural-language instruction in the brief rather than sending a command that won't land.
- Both skill locations should work. My skills are user-level (
~/.claude/skills/), not vendored into the firstmate repo. Repo-level .agents/skills/ names should work too.
- Record it in task meta. Writing the resolved skill into
state/<id>.meta (e.g. skill_review=) the way harness=, model=, and effort= are recorded today would make it debuggable when a task didn't do what I expected.
Acceptance criteria
Alternatives I considered
| Option |
Why it doesn't work |
Prose in data/captain.md |
It's a preferences file, not a contract. No validation, no guarantee it's applied, no per-project scoping. |
Editing AGENTS.md |
Puts personal choices in tracked shared material and creates a permanent merge conflict with upstream. |
| Telling the first mate every task |
Doesn't scale, and a forgotten instruction fails silently. |
| Wrapping my skills into one mega-skill |
Doesn't help — there's still no hook that says when to invoke it. |
My use case, concretely
I run several projects through firstmate. My planning skill (grill-with-docs) forces a crewmate to actually read the docs and interrogate its own assumptions before it writes a line — it catches bad plans early, which is the cheapest place to catch them. My review skill (thermo-nuclear-code-quality-review) is a deliberately harsh quality pass that I trust more than a generic review.
These two skills are my workflow. Right now firstmate gives me a great crew that doesn't work the way I do, and I have to choose between re-typing my workflow forever or forking the orchestrator. A small config file solves it, follows a pattern the project already uses, and costs nothing for captains who never create the file.
Summary
Firstmate already lets me choose who does the work (
config/crew-dispatch.jsonpicks harness, model, and effort per kind of task). It does not let me choose how the work is done.The workflow steps themselves are fixed.
no-mistakesis the validation skill, and phases like planning and code review have no skill hook at all. I have my own skills that I trust for those phases and I want firstmate to use them.I'd like a local, gitignored config file that maps a workflow phase to a skill, so that:
grill-with-docsskillthermo-nuclear-code-quality-reviewskillSame idea as
config/crew-dispatch.json, just one axis over: that file answers which agent, this one answers which skill.The problem today
I have a working style I like. It lives in skills I've written and refined. Today there are only three ways to get firstmate to use them, and none of them work well:
data/captain.md. This is a preferences file, not a dispatch contract. It's a nudge, not a rule — it may or may not be applied, and there's nothing that fails loudly when a skill name is wrong or missing.AGENTS.md. This works, butAGENTS.mdis the shared, tracked orchestrator file. Editing it to hold my personal skill choices means my private preferences now live in tracked, shared material, and I fight a merge every time upstream changes. The repo's own tracking principle says shared things are tracked and personal things aren't — my skill preferences are personal.So there is currently no supported place to put "this is my workflow" and have it actually stick.
What I want
A local, gitignored file —
config/crew-skills.json— that firstmate reads before dispatching and before driving a phase transition:{ "phases": { "plan": { "skill": "grill-with-docs" }, "review": { "skill": "thermo-nuclear-code-quality-review" } } }That's the whole minimum viable version. Two lines of config and my crew works the way I work.
With per-project overrides
Different projects deserve different rigor. My side project doesn't need the nuclear option; my production service does:
{ "phases": { "plan": { "skill": "grill-with-docs" }, "review": { "skill": "thermo-nuclear-code-quality-review" } }, "projects": { "my-side-project": { "review": { "skill": "quick-sanity-review" } } } }Resolution order
Most specific wins, and it should fall back cleanly to today's behavior:
projects.<name>entry for the project the task belongs tophasesentryno-mistakeswhere the delivery mode calls for it)A captain with no config file sees zero change in behavior.
Suggested phases
I'd start with a small, fixed set of names that match firstmate's existing vocabulary rather than inventing new concepts:
planimplementreviewvalidateno-mistakesmode)Starting with just
planandreviewwould already cover my case and most of what people are likely to ask for. The rest can come later.Why I think this fits firstmate
This isn't a new concept — it's the existing one applied to a second axis.
config/crew-dispatch.jsonis the exact precedent. It's a local, gitignored JSON file of natural-language rules that firstmate resolves with judgment, validated at bootstrap, inherited into secondmate homes, and never mixed into tracked shared material. Everything I'm asking for could follow that same pattern, and a captain who already understands crew dispatch would understand this immediately.It respects the tracking principle.
AGENTS.mdstays the shared orchestrator. My skill preferences stay local and gitignored, next tocrew-harness,crew-dispatch.json, andbackend. Nothing personal ends up in tracked files, and I never fight a merge to keep my workflow.It's the missing half of dispatch. Right now I can say "send the hard tasks to a strong model" but not "and have it review its work the way I review mine." Those two decisions belong side by side.
If you'd rather not add a second file, folding a
"skills"key intoconfig/crew-dispatch.jsonwould satisfy me just as well — I care about the capability, not the filename.Guardrails I'd expect
I want to be clear that I am not asking to weaken the delivery gate.
no-mistakesgate stays authoritative. Forno-mistakes-mode projects, my review skill should run in addition to the pipeline, not instead of it. If a captain ever wants to actually replace it, that should be an explicit, separate, obviously-scary opt-in — not something you get by filling inreview. Default is additive.crew-dispatch.jsonis reported today (CREW_SKILLS: invalid config/crew-skills.json - ...) and refuse to quietly fall back. A skipped review is worse than a stopped dispatch.harness-adaptersskill already owns the per-harness skill-invocation syntax (/<skill>for claude, grok, and kimi;$<skill>for codex; natural language where no form is verified). This feature should call into that, not restate it — and on a harness with no verified invocation form, degrade to a natural-language instruction in the brief rather than sending a command that won't land.~/.claude/skills/), not vendored into the firstmate repo. Repo-level.agents/skills/names should work too.state/<id>.meta(e.g.skill_review=) the wayharness=,model=, andeffort=are recorded today would make it debuggable when a task didn't do what I expected.Acceptance criteria
config/crew-skills.json, name a skill forplanandreview, and every subsequent crewmate uses those skills without further prompting.docs/configuration.md, with a copyable starting point underdocs/examples/.no-mistakes-mode projects, the configured review skill runs alongside the pipeline; the gate is not bypassed.Alternatives I considered
data/captain.mdAGENTS.mdMy use case, concretely
I run several projects through firstmate. My planning skill (
grill-with-docs) forces a crewmate to actually read the docs and interrogate its own assumptions before it writes a line — it catches bad plans early, which is the cheapest place to catch them. My review skill (thermo-nuclear-code-quality-review) is a deliberately harsh quality pass that I trust more than a generic review.These two skills are my workflow. Right now firstmate gives me a great crew that doesn't work the way I do, and I have to choose between re-typing my workflow forever or forking the orchestrator. A small config file solves it, follows a pattern the project already uses, and costs nothing for captains who never create the file.