Files
pi-skills/.agents/skills/evolve/references/mechanical-batches.md
T

57 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Mechanical Batch Work — Script vs Per-File Edit
A "mechanical batch" is work where the same edit is applied to N files mechanically, with no per-file judgement after the pattern is established. Examples from prior sessions: declaring `practices: [slug]` across 533 cli/ Go files, regenerating COMMANDS.md from a Cobra tree, bumping a version literal in N manifests.
The default per-file `Edit` tool path scales linearly with N and burns context. Switch to a script when ANY of these apply:
- N > ~20 files
- The transformation is **uniform** (same regex / same sed / same template field)
- A failure on file K does not change the strategy for files K+1..N
- Per-file output verification is cheap (`git diff --stat`, a single grep)
## Script-first pattern
```bash
# 1. Inventory candidates with the predicate the task implies
candidates=$(git ls-files 'skills/**/SKILL.md' | xargs -I{} bash -c '
grep -L "^practices:" "{}" >/dev/null && echo "{}"
' | head -50)
# 2. Apply the mechanical edit
for f in $candidates; do
awk '
/^description:/ && !done { print; print "practices: [<slug>]"; done=1; next }
{ print }
' "$f" > "$f.tmp" && mv "$f.tmp" "$f"
done
# 3. Verify in one shot
git diff --stat
grep -c "^practices:" $candidates | sort
```
## Per-file Edit pattern (when the above does NOT apply)
Use `Edit` per file only when:
- The transformation requires per-file decisions (which slug? which carrier?)
- N is small (< 10)
- Verification benefits from reading each diff in context
## Decision in Step 4
When `/rpi` discovery surfaces a per-file pattern with N > 20 uniform candidates, the implementation phase should generate a script under `scripts/` or use an inline awk/sed pass rather than queuing N `Edit` operations. The post-edit gate then verifies the batch atomically.
If the script needs different parameters per file, that is a signal the work isn't actually mechanical — fall back to per-file Edit and reduce N (split the cycle).
## Why this matters
A 533-file `practices:` backfill done via per-file Edit takes ~50× more context than the same backfill done via a script with `git diff --stat` verification. The context-budget exhausts well before the work completes, and the loop drops into a forced scout or idle state with most of the work still pending.
## Anti-patterns
- Running a script that mutates files but ignoring the result of `git diff` (silent partial application).
- Using `sed -i` on a tree-traversed find without `--null` handling (filename-with-spaces breakage).
- Mixing mechanical and per-file edits in the same commit (auditor cannot tell what was bulk-applied vs per-judged).
- Treating a 200-file batch as a single "atomic" change — split into review-sized waves (~30-100 files) with one commit per wave.