Examples
Each example is a situation and the skills rota reaches for in it. Every step shows what you type and what the agent prints.
Fix a small bug or add a small feature
One clear item, small enough to build in one sitting.
-
/rota-captureWrite the item down. Capture records it and stops./rota-capture the list command shows every row when I ask for zero[B03] list shows every row when the limit is zero Bug, P2
-
/rota-workBuild it in small commits. The proof gate needs a red run, then a green one./rota-work B03Tree clean. Branch rota/B03-limit-zero created. T1 treat 0 as a real limit in cmd/list.go rota proof record B03 -- go test ./cmd -run TestListLimitZero FAIL (red run) rota proof record B03 -- go test ./cmd -run TestListLimitZero PASS a1b2c3d fix: treat --limit 0 as zero rows [B03] -
/rota-shipReview the branch, then open the PR or merge./rota-ship/rota-review: PASS PR body built from commit subjects and resolved IDs: B03 Merged into main with --no-ff; branch deleted.
Build a bigger feature
A Major item where the design or the approach needs sign-off before code lands.
-
/rota-captureRecord the feature as an item./rota-capture "an /rota-archive command that ages out resolved items older than 90 days"[F12] /rota-archive command for old resolved items Feature, Major Run /rota-brainstorm F12 before /rota-plan to negotiate the design.
-
/rota-brainstormSettle the design with you, section by section./rota-brainstorm F12Read F12, KNOWLEDGE.md and DECISIONS.md. Question: what signals "resolved"? ## Completed only, or also ARCHIVE.md?
Completed only.Design drafted: 3 approaches with tradeoffs, recommended the append-only journal. Approve and hand off to /rota-plan, approve with no plan yet, or revise?
-
/rota-planTurn the design into tasks with a way to verify each./rota-plan F12Planning dial: 1 (pointers) - the design is signed off and revert is clean. Override: say "level 1" or "level 4". Goal: /rota-archive moves ## Completed items older than 90 days into ARCHIVE.md. T1. Append archived items to ARCHIVE.md in internal/backlog/archive.go. Verify: go test ./internal/backlog -run TestArchiveAppend T2. Wire the command and the 90-day cutoff. Verify: go test ./cmd -run TestArchiveCutoff Confirm this plan? (yes / changes)yes -
/rota-workBuild the plan, one verified task at a time./rota-work F12Tree clean. Branch rota/F12-rota-archive created. Plan .rota/plans/F12.md: 2 tasks. T1 append archived items to ARCHIVE.md rota proof record F12 -- go test ./internal/backlog -run TestArchiveAppend FAIL (red run) rota proof record F12 -- go test ./internal/backlog -run TestArchiveAppend PASS c4d5e6f feat: append archived items to ARCHIVE.md [F12] T2 wire the command and the 90-day cutoff PASS d7e8f90 feat: add /rota-archive with a 90-day cutoff [F12] -
/rota-shipReview against what the item promised, then merge./rota-ship/rota-review: PASS (checked against the F12 design and its acceptance) PR body built from commit subjects and resolved IDs: F12 Merged into main with --no-ff; branch deleted.
Chase a bug you don't understand
Something is broken and the cause is not known yet.
-
/rota-debugReproduce it, test one hypothesis at a time, fix it in one commit./rota-debug F04Reproducer: TestAmountRoundTrip FAILED (0.10 -> 9, want 10) H1 (likely): the minor-unit helper multiplies a float64 by 100 and truncates. Verified H1: the intermediate float prints 9.999999999999998. Fix: decimal Shift(2) instead of Float64() * 100. Reproducer passes. fix(money): use decimal.Shift instead of Float64 for minor-unit conversion Root cause was non-obvious. Consider running /rota-learn to capture this.
-
/rota-shipReview and merge the fix./rota-ship/rota-review: PASS PR body built from commit subjects and resolved IDs: F04 Merged into main with --no-ff; branch deleted.
-
/rota-learnKeep what the bug taught you for the next session./rota-learnProposed bullet under ## Money & Decimals: Never multiply a decimal.Decimal by a float to convert to minor units. Float64() * 100 gives 9.999... for 0.10, and truncation gives 9. Use decimal.NewFromString(...).Shift(2).IntPart() end to end. Written to .rota/KNOWLEDGE.md.
Try a risky idea first
You don’t know yet whether an approach or a library works.
-
/rota-spikeTry it on a throwaway branch. Only the findings come back./rota-spike will a single-currency schema survive a later move to multi-currency?Question: can a single-currency schema migrate to multi-currency without data loss? Named it sqlite-schema. Created branch spike/sqlite-schema and .rota/spikes/sqlite-schema.md. The question is recorded. Experiment on the branch; fill in Findings and Decision when done.
-
/rota-planPlan the real work with what the spike found./rota-plan M01-S01Planning dial: 3 (research round) - a schema migration does not revert cleanly; the spike already answered the open question. Override: say "level 1" or "level 4". Read .rota/spikes/sqlite-schema.md: ship single-currency in M01, no currency column yet. Goal: stand up the SQLite schema and tally add end to end. T1. Skeleton CLI in cmd/tally. Verify: go test ./... && tally --version | grep v0.0.0 T2. Migrations engine in internal/store/migrate.go. Verify: run tally init twice; the second run is a no-op ... Confirm this plan? (yes / changes)yes -
/rota-workBuild it./rota-work M01-S01Plan .rota/plans/M01-S01.md read: 5 tasks, none done. Branch rota/M01-S01 created. T1 skeleton CLI in cmd/tally go test ./... PASS tally --version | grep v0.0.0 PASS feat(cli): scaffold tally root command Next: T2 migrations engine.
Start a project from a brief
An empty repo and an idea of where it should go.
-
/rota-initSuggest config values from the repo, confirmed one by one./rota-inittest.fast = go test ./... (from Makefile target `test`) git.baseBranch = main (from origin/HEAD) forge.provider = github (from the origin remote URL) Set test.fast to `go test ./...`? A) yes (recommended) B) other
Arota config set test.fast '["go test ./..."]'
-
/rota-visionTurn the brief into milestones./rota-visionI found README.md (Tally). Seed milestones from it? Your brief says "dogfood within two weeks." What does dogfooded mean concretely?
a CLI I use daily for two weeks before showing anyone elseProposed: M01 CLI MVP, M02 Web dashboard (depends M01), M03 Budget alerts (depends M01). M01 marked active.
-
/rota-planPlan the first milestone slice./rota-plan M01-S01Planning dial: 2 (spec) - first slice of a new schema; a migration does not revert cleanly. Override: say "level 1" or "level 4". Goal: stand up the SQLite schema and tally add end to end. T1. Skeleton CLI in cmd/tally. Verify: go test ./... && tally --version | grep v0.0.0 T2. Migrations engine in internal/store/migrate.go. Verify: run tally init twice; the second run is a no-op ... Confirm this plan? (yes / changes)yes -
/rota-captureTurn the plan into backlog items./rota-capture "tally CLI skeleton, sqlite migrations engine, transactions schema with int64 minor units, tally add command, tally list command"[F01] tally CLI skeleton Feature, Minor, Milestone: M01 [F02] sqlite migrations engine Feature, Minor, Milestone: M01 [F03] transactions schema with int64 minor units Feature, Minor, Milestone: M01 [F04] tally add command Feature, Minor, Milestone: M01 [F05] tally list command Feature, Minor, Milestone: M01
-
/rota-workBuild the first item./rota-workBacklog (M01 active): Features F01, F02, F03, F04, F05 (all Minor) Suggested next: F01 (head of M01 dependency chain) Run /rota-work F01? [y/N]
yBranch rota/F01-tally-cli-skeleton. Plan task 1: skeleton CLI. verify: go test ./... PASS verify: tally --version | grep v0.0.0 PASS feat(cli): scaffold tally root command [F01] Merged into main with --no-ff; branch deleted.
Bring rota into an existing project
A repo with history and a backlog that lives in your head, with no rota yet.
-
/rota-initSuggest config values from the repo, confirmed one by one./rota-inittest.fast = go test ./... (from Makefile target `test`) git.baseBranch = main (from origin/HEAD) forge.provider = github (from the origin remote URL) Set test.fast to `go test ./...`? A) yes (recommended) B) other
Arota config set test.fast '["go test ./..."]'
-
/rota-refactorWith –map, draft the project map so later cycles skip re-exploring the code./rota-refactor --mapMapped 6 subsystems. Files to write: .rota/map/api.md new .rota/map/dashboard.md new .rota/map/alerts.md new .rota/map/integrations.md new .rota/map/storage.md new .rota/map/shared.md new Write the new files? (all / pick / none)
allWrote 6 files, skipped 0. Ran rota map index and rota map stats.
-
/rota-captureBrain-dump the bugs and ideas you have been carrying around./rota-capture "alert rule editor crashes on empty title; we should add a /health endpoint for k8s; dedup window is hardcoded at 5 min, should be per-rule; DST off-by-one on dashboard 24h filter"[B06] alert rule editor crash on empty title Bug, P1, Major [F01] /health endpoint for k8s probes Feature, Minor [F02] per-rule dedup window Feature, Major [B07] DST off-by-one on dashboard 24h filter Bug, P1, Major F02 is Major: consider /rota-brainstorm F02 before /rota-plan.
-
/rota-workTake the P0 first. The map and knowledge tell the worker where to look./rota-work B05Read .rota/map/integrations.md. KNOWLEDGE.md has nothing under Security yet. Branch rota/B05-secrets-in-url-form created. 4 tasks. T1 render secrets via <input type="password"> rota proof record B05 -- npm test -- integration-form PASS T2 reject secrets in the URL query on the POST endpoint ... -
/rota-debugWhen a fix will not stay fixed, find the cause before changing code./rota-debug B01Reproduced: TestDedupAcrossIntegrations fails, two events instead of one. Hypothesis: dedupKey includes severity, and the integrations differ in casing. Verified before touching code: lowercased severities give matching keys. Fix: lowercase severity in the dedup-key computation. Reproducer passes. fix: normalize severity casing in dedup key [B01] Non-obvious cause: run /rota-learn to save this gotcha.
-
/rota-learnKeep the gotcha so the next cycle in that area starts with it./rota-learnProposed bullet under ## Alerts: Severity is case-sensitive in the dedup key path. Normalize at the boundary, not at storage time. Written to .rota/KNOWLEDGE.md.
Run several issues in parallel
A few independent issues are ready and you can stay around for questions.
-
/rota-planShape the slate so every issue has clear acceptance./rota-plan 42Planning dial: 2 (spec) - new flag on a published command; revert is clean. Override: say "level 1" or "level 4". Goal: export --since DATE keeps only rows on or after DATE. T1. Parse and validate --since in cmd/export.go (AC-1). Verify: go test ./cmd -run TestExportSince T2. Document the flag in docs/usage/export.md (AC-2). Verify: grep -n -e --since docs/usage/export.md Confirm this plan? (yes / changes)yes -
/rota-orchestrateHand issues to workers, review their PRs, merge through the gate.rota orchestraterun a round on issues 42, 51, 58 and 63rota round start --scope slate --items 42,51,58,63 rota round assign 42 # claims #42, cuts <agent>/42-<slug>, starts a worker ... Armed rota round watch in the background; it wakes me on a slot, PR or escalation change.
-
/rota-answerAnswer the decisions the round put to you, one at a time./rota-answer1 of 3: slot nia is blocked on #58. Worker asks: keep the old --json shape or break it? A) Keep the old shape (recommended) B) Break it and note it in the changelog C) Write your own answer
ARecorded as a decision comment on #58 and relayed to nia.
-
/rota-learnAt wind-down, keep what the round learned./rota-learnRead the round summary: #58 bounced twice on the same criterion. Proposed bullet under ## Rounds: A criterion with two readings produces the same wrong PR on every bounce. Audit the acceptance criteria before the third relay. Written to .rota/KNOWLEDGE.md.
-
/rota-releaseCut a release when the work adds up to one./rota-releaseChecklist (.rota/RELEASE.md): all items pass. Commits since v0.25.0: 1 feature, 4 fixes. Recommend minor.
minorRelease notes drafted for v0.26.0. Notes look good? Yes pushes the tag and publishes the release. (manual gate)
Stop for today
The context is filling up or you have to leave mid-item.
-
/rota-learnSave the lessons worth keeping./rota-learnProposed bullet under ## Timer: The badge reads its count from the store on mount, so a stale subscription shows the previous value until the first tick. Re-subscribe in the quick-switch handler. Written to .rota/KNOWLEDGE.md.
-
/rota-pauseWrite a handoff so a fresh session continues./rota-pauseUncommitted work on rota/fix-B07-timer-badge: wip commit, stash, or leave in place?
wip commitPaused rota/fix-B07-timer-badge - handoff note saved. Resume with /rota-work in a fresh session.
-
/rota-workNext session, with no argument, it reads the handoff and picks up./rota-workActive streams rota/fix-B07-timer-badge (1 wip commit) mid-implementation Handoff note found: Next planned step: re-run the badge test after the selector change Resume with /rota-work, or leave the handoff for later?
resumeResuming /rota-work with handoff brief.