{
"title": "Rust Medium Path",
"description": "Moderate Rust change (20–100 lines, 1–3 files). modum, self-review, PR. Stops at PR — user handles CI, review, merge.",
"tasks": [
{
"order": 1,
"title": "Context Read",
"description": "Read relevant Rust source code. Understand the problem, affected modules, function signatures, and callers. Check for existing test patterns.",
"task_type": "Research",
"complexity": 2,
"acceptance_criteria": [
"problem understood",
"all affected modules identified",
"caller graph known"
]
},
{
"order": 2,
"title": "Verify branch + rebase to origin/main",
"description": "Verify branch is fresh: `git branch -r | grep <branch-name>` — if it exists on any remote, rename (add `-v2`).\n\nFetch and rebase onto origin/main (NOT upstream/main — they have diverged):\n```\ngit fetch origin\ngit rebase origin/main\n```\nVerify: `git diff origin/main --stat` shows ONLY the files you intend to change.",
"task_type": "Configuration",
"complexity": 1,
"dependencies": [
1
],
"acceptance_criteria": [
"branch name is unique across all remotes",
"rebased onto origin/main",
"git diff origin/main --stat shows only intended files"
]
},
{
"order": 3,
"title": "Implement",
"description": "Write the code change. Keep it scoped to one issue — one logical change per PR. Do NOT bundle unrelated fixes. If you have multiple independent fixes, make separate branches and PRs.",
"task_type": "Edit",
"complexity": 2,
"dependencies": [
2
],
"acceptance_criteria": [
"change is minimal and focused",
"all callers updated",
"no scope creep"
]
},
{
"order": 4,
"title": "modum check",
"description": "Run `modum check --mode error`. Fix any violations before proceeding.",
"task_type": "Test",
"complexity": 1,
"dependencies": [
3
],
"acceptance_criteria": [
"modum exits 0"
]
},
{
"order": 5,
"title": "Self-review every changed line",
"description": "Read through the ENTIRE diff (`git diff origin/main`) line by line. Check:\n- Logic errors: Does the control flow handle all edge cases? (early returns, None/Err paths, fallthroughs, type conversions)\n- Unchanged call sites: Did you update ALL callers of a refactored function? Grep for old signatures — **this is the most common failure pattern**\n- Message correctness: Do user-facing strings reference the right flags, paths, and commands?\n- Test coverage: Do the tests actually test the new behavior, or just the old one with renamed variables? Does every new code path have a test?\n- Edge cases: What happens when a dependency is missing, a subprocess fails, a config is empty?\n- Consistency: Are variable names, function signatures, and arg ordering consistent across the change?",
"task_type": "Research",
"complexity": 2,
"dependencies": [
4
],
"acceptance_criteria": [
"no logic errors",
"all callers of changed functions updated",
"edge cases handled",
"messages correct",
"test coverage adequate"
]
},
{
"order": 6,
"title": "Push + PR",
"description": "Verify diff is clean BEFORE pushing: `git diff origin/main --stat`. If it shows hundreds of files, you're based on the wrong branch. Start over:\n```\ngit checkout origin/main -b fix/your-fix-v2\n```\nDo not try to fix a dirty branch by rebasing — start fresh.\n\nPush to upstream (NOT origin): `git push upstream <branch>`\n\nCreate PR: `gh pr create --repo adolfousier/opencrabs --head leshchenko1979:<branch>`\n\nImmediately verify PR diff: `gh pr diff --name-only` should match expected files. If it doesn't, close the PR and start over from origin/main.",
"task_type": "Configuration",
"complexity": 1,
"dependencies": [
5
],
"acceptance_criteria": [
"branch pushed to upstream",
"PR created",
"PR diff matches expected files",
"no extraneous files"
]
}
]
}