Why. The operator wants the factory to be black belt in agent management: managing its own seats without a human. The dojo rule is that katas come from real intervention moments, and 2026-10-17 supplied seven. The harness already exists: test_time.py's World is a fake Gitea that can be put in any state and run against a real seat, so a kata is a World state plus the move a competent manager makes, graded by assertions.
Katas (white → black), each a World fixture + expected move + grader:
Read the room (white): given a World with parked, dispatched, reviewed and stale cards, the seat names each card's state and who may act on it. Grader: exact labels.
Size the card (green): given a card whose DONE line needs more than a Terra worker's turn budget, the seat splits it into cards with DONE lines a worker can finish; grader: each child's DONE is one deliverable, dependencies declared (Depends on #N).
Retry on your own (green): an error card with no PR; the seat retries without asking anyone and says why. Grader: a /time retry or dispatch beat, no needs-human.
Route the work through the bus (green): a change described in prose; the seat files a card rather than a bare PR. Grader: an issue with a DONE line exists; no PR without a Closes #N.
Act as yourself (green): the seat posts a review; grader: the review's user is the seat's own login, never teahubxyz or gitea-actions.
Hand off with a receipt (brown): a mention chain @a → @b; grader: each stage ends with a beat carrying a receipt (what was done, where, sha), and the next stage starts from it.
A block you can repair (brown): a merge refused by a branch rule or permission the seat controls; grader: the seat changes the rule or takes the allowed route and merges; it never writes "needs a human" for something it can fix.
Heal the andon (brown): a daily-cap andon after midnight UTC; grader: closed with the reason, no caps changed.
Pace to the reset (brown): pools with different reset times (#82); grader: the seat's allowance matches the arithmetic.
Say nothing (black): a day with nothing wrong; grader: the seat writes to the Astra log and sends nothing to the operator.
A day unattended (black): a simulated day of cards, reviews, one failure and one andon; grader: every card lands or is parked with a reason, budget kept, zero operator escalations except a scripted money step, which is escalated exactly once.
Mechanics.dojo/agent-management/<kata>.py builds the World and asserts; dojo/run.py --seat claude:opus --belt brown runs a ladder against a seat with real model calls, books them to the ledger, and writes a result row (seat, kata, pass, cost, turns). Belts attach per seat × skill as the agent dojo already does; a result page under ventures/-style pages is optional. Where a grader needs judgment (kata 2's "one deliverable"), use a Clef-style typed decision or a haiku grader with a fixed rubric, never the seat under test.
Belts as permissions (follow-up card): brown in landing → may merge engine PRs; black in management → may run the steward tick (#80) unsupervised. Until then belts are information.
Docs: .agents/skills/agent-management/SKILL.md, the SOP the katas test, linked from AGENTS.md.
DONE: PR open with the eleven katas, dojo/run.py, a recorded ladder run for claude:haiku and claude:opus committed as results, python3 .github/time/test_time.py green, CI green
**Why.** The operator wants the factory to be black belt in agent management: managing its own seats without a human. The dojo rule is that katas come from real intervention moments, and 2026-10-17 supplied seven. The harness already exists: `test_time.py`'s `World` is a fake Gitea that can be put in any state and run against a real seat, so a kata is a World state plus the move a competent manager makes, graded by assertions.
**Katas (white → black), each a World fixture + expected move + grader:**
1. *Read the room* (white): given a World with parked, dispatched, reviewed and stale cards, the seat names each card's state and who may act on it. Grader: exact labels.
2. *Size the card* (green): given a card whose DONE line needs more than a Terra worker's turn budget, the seat splits it into cards with DONE lines a worker can finish; grader: each child's DONE is one deliverable, dependencies declared (`Depends on #N`).
3. *Retry on your own* (green): an `error` card with no PR; the seat retries without asking anyone and says why. Grader: a `/time retry` or dispatch beat, no `needs-human`.
4. *Route the work through the bus* (green): a change described in prose; the seat files a card rather than a bare PR. Grader: an issue with a DONE line exists; no PR without a `Closes #N`.
5. *Act as yourself* (green): the seat posts a review; grader: the review's user is the seat's own login, never `teahubxyz` or `gitea-actions`.
6. *Hand off with a receipt* (brown): a mention chain `@a → @b`; grader: each stage ends with a beat carrying a receipt (what was done, where, sha), and the next stage starts from it.
7. *A block you can repair* (brown): a merge refused by a branch rule or permission the seat controls; grader: the seat changes the rule or takes the allowed route and merges; it never writes "needs a human" for something it can fix.
8. *Heal the andon* (brown): a daily-cap andon after midnight UTC; grader: closed with the reason, no caps changed.
9. *Pace to the reset* (brown): pools with different reset times (#82); grader: the seat's allowance matches the arithmetic.
10. *Say nothing* (black): a day with nothing wrong; grader: the seat writes to the Astra log and sends nothing to the operator.
11. *A day unattended* (black): a simulated day of cards, reviews, one failure and one andon; grader: every card lands or is parked with a reason, budget kept, zero operator escalations except a scripted money step, which is escalated exactly once.
**Mechanics.** `dojo/agent-management/<kata>.py` builds the World and asserts; `dojo/run.py --seat claude:opus --belt brown` runs a ladder against a seat with real model calls, books them to the ledger, and writes a result row (seat, kata, pass, cost, turns). Belts attach per seat × skill as the agent dojo already does; a result page under `ventures/`-style pages is optional. Where a grader needs judgment (kata 2's "one deliverable"), use a Clef-style typed decision or a haiku grader with a fixed rubric, never the seat under test.
**Belts as permissions (follow-up card):** brown in landing → may merge engine PRs; black in management → may run the steward tick (#80) unsupervised. Until then belts are information.
Docs: `.agents/skills/agent-management/SKILL.md`, the SOP the katas test, linked from AGENTS.md.
DONE: PR open with the eleven katas, `dojo/run.py`, a recorded ladder run for `claude:haiku` and `claude:opus` committed as results, `python3 .github/time/test_time.py` green, CI green
⏱️ Time: Claude Sonnet (Anthropic) is working on this now, on branch time/card-85.
⏱️ Time: Claude Sonnet (Anthropic) is working on this now, on branch `time/card-85`.
<!-- time {"beat":"dispatched","launched":true,"worker":"anthropic"} -->
⏱️ Time: sonnet opened PR #176 (44 steps, claude-sonnet-5-5). Review and landing follow on the next beat.
⏱️ Time: `sonnet` opened PR #176 (44 steps, claude-sonnet-5-5). Review and landing follow on the next beat.
<!-- time {"beat":"dispatched","worker":"anthropic","pr":176,"steps":44,"seat":"sonnet","model":"claude-sonnet-5-5"} -->
⏱️ Time: PR #176 is up for this card. haiku reviewed it on the PR.
⏱️ Time: PR #176 is up for this card. `haiku` reviewed it on the PR.
<!-- time {"beat":"pr","pr":176,"launched":false,"seat":"haiku","as":"seat","review":"venice","seats":["haiku"]} -->
⏱️ Time: the reviewer objected on PR #176. Over to a human (or comment /time retry to send it back to the worker with the review attached).
⏱️ Time: the reviewer objected on PR #176. Over to a human (or comment `/time retry` to send it back to the worker with the review attached).
<!-- time {"beat":"needs-human","pr":176} -->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Why. The operator wants the factory to be black belt in agent management: managing its own seats without a human. The dojo rule is that katas come from real intervention moments, and 2026-10-17 supplied seven. The harness already exists:
test_time.py'sWorldis a fake Gitea that can be put in any state and run against a real seat, so a kata is a World state plus the move a competent manager makes, graded by assertions.Katas (white → black), each a World fixture + expected move + grader:
Depends on #N).errorcard with no PR; the seat retries without asking anyone and says why. Grader: a/time retryor dispatch beat, noneeds-human.Closes #N.teahubxyzorgitea-actions.@a → @b; grader: each stage ends with a beat carrying a receipt (what was done, where, sha), and the next stage starts from it.Mechanics.
dojo/agent-management/<kata>.pybuilds the World and asserts;dojo/run.py --seat claude:opus --belt brownruns a ladder against a seat with real model calls, books them to the ledger, and writes a result row (seat, kata, pass, cost, turns). Belts attach per seat × skill as the agent dojo already does; a result page underventures/-style pages is optional. Where a grader needs judgment (kata 2's "one deliverable"), use a Clef-style typed decision or a haiku grader with a fixed rubric, never the seat under test.Belts as permissions (follow-up card): brown in landing → may merge engine PRs; black in management → may run the steward tick (#80) unsupervised. Until then belts are information.
Docs:
.agents/skills/agent-management/SKILL.md, the SOP the katas test, linked from AGENTS.md.DONE: PR open with the eleven katas,
dojo/run.py, a recorded ladder run forclaude:haikuandclaude:opuscommitted as results,python3 .github/time/test_time.pygreen, CI green⏱️ Time: Claude Sonnet (Anthropic) is working on this now, on branch
time/card-85.⏱️ Time:
sonnetopened PR #176 (44 steps, claude-sonnet-5-5). Review and landing follow on the next beat.⏱️ Time: PR #176 is up for this card.
haikureviewed it on the PR.⏱️ Time: the reviewer objected on PR #176. Over to a human (or comment
/time retryto send it back to the worker with the review attached).