Auto dev lite
Grill → Gate → Build: interrogate requirements until accurate and complete, score them with an independent gate, then hand the human-approved PRD to autonomous development.
npx -y skills add samgao2000/prd-grill --skill auto-dev-liteAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Autonomous software development pipeline, lite edition: no GitHub dependency, git optional. Drives local markdown issue files to git commits (when a repo exists) or to a runs/ledger.md audit log (when it doesn't), fully AFK end-to-end. Trigger on "run auto-dev-lite on X", "implement the PRD AFK", "local pipeline go", or "start auto-dev-lite from the PRD". Chinese version: SKILL.zh.md (same folder)
SKILL.md
11.4 KB, as published. Nobody here has run it
Auto-Dev Lite — Skill
Triggers
- "run auto-dev-lite on X"
- "implement the PRD AFK"
- "local pipeline go"
- "start auto-dev-lite from the PRD" (implies step 0.5 auto-import)
- "turn the PRD into issues and run them"
Position in the pipeline
user idea (human present)
↓ req-dev-lite grilling (human answers questions)
docs/prd/YYYY-MM-DD-{slug}.md (three buckets + gate verdict)
↓ auto-dev-lite step 0.5 auto-import (no human)
local-issues/*.md (Bucket A ready, Bucket C blocked)
↓ auto-dev-lite steps 1-9 loop (no human)
git commit sequence (or ledger entries) + retro
req-dev-lite stops after landing the PRD — it never auto-triggers this skill.
Whether and when to start implementation is the user's call. On start, if a PRD
exists and local-issues/ is empty, step 0.5 picks it up automatically.
Core constraints
- Acceptance-test immutability: files marked
# AUTO_DEV_ACCEPTANCE: immutableare NEVER modified, even when one edit would make a test pass. Wrong test → mark the issueblockedwith a note; a human amends it. - Kill switch: between every major step, check
runs/<run_id>.kill; abort if present. - Tier-based risk control: low/medium auto-commit; high →
needs-review, no auto-commit. - Cost ceiling: $50 per run by default; hard-stop beyond it.
- Trailer: every commit (or ledger entry in no-git mode) carries an
Auto-Dev-Lite-Trailerblock. Every issue MUST leave one traceable record — losing the trailer is losing the audit chain.
Local issue file format
<target_project>/local-issues/00N-slug.md — full template (frontmatter fields,
state machine, Bucket-C variants) in references/issue-template.md.
States: ready → in_progress → done | blocked | needs-review.
Run procedure (per issue, AFK)
0. Preflight
- Git-mode detection (git is optional, not a prerequisite):
<target>/.git/exists →git_mode = tracked: step 8 commits.- absent →
git_mode = ledger: step 8 appends toruns/ledger.md. Do NOTgit initon your own — version control is the user's decision. Print once: "No git repo: ledger mode. Per-issue rollback unavailable; consider (not required) git init."
- Lazy-create
<target>/runs/. - Read
<target>/PROJECT_CONTEXT.mdif present (stack, test command, migration command — overrides defaults). - Probe
local-issues/(files other than.imported.md) anddocs/prd/:- issues exist → step 1
- issues empty, PRD exists → step 0.5
- both empty → hard-stop: "no issues and no PRD; run req-dev-lite first"
0.5. PRD import (auto-runs only when local-issues/ is empty)
Convert the latest req-dev-lite PRD into local-issues/*.md. Full rules:
references/prd-import-rules.md — including the
bilingual (EN/中文) section-anchor table. Summary:
| PRD section | Bucket | Lands in | status |
|---|---|---|---|
## 3. User Stories (Bucket A/桶 A) ### US-NNN blocks | A | local-issues/00N-{slug}.md (id = original US-NNN) | ready |
### Outcome Metrics (Bucket B/桶 B) table | B | PROJECT_CONTEXT.md § Reference Metrics (lazy) | n/a |
## 8. Open Items (Bucket C/桶 C) rows | C | local-issues/00N-OI-NNN-{slug}.md | blocked |
## 5. Testing Decisions (SBE option a/b/c) | config | PROJECT_CONTEXT.md § Testing | n/a |
Hard rules: Bucket-A story bodies are copied verbatim (all 7 fields — never
rewritten or "tidied"); Bucket C keeps original OI-NNN ids and is always
blocked; Bucket B never becomes an issue; frontmatter final_gate_verdict: FAIL | not_reached → hard-stop (an unscored or failed spec must not enter
implementation); parse failure / id conflict / all buckets empty → hard-stop, no
partial writes. Read gate_mode + gate_confidence for step 7 (below). Then
write the import log local-issues/.imported.md and proceed to step 1.
1. Pick the next issue
Scan local-issues/*.md: status ready, all depends_on done, lowest number first.
No candidate → final report.
2. Move to in_progress, init run
Set status: in_progress, generate run_id (YYYYMMDDHHMMSS-rand6), write it to
the issue, create runs/<run_id>/log.jsonl, emit issue_fetched.
3. Tier classify (re-evaluate)
Parse the story body, identify planned_paths, apply tier rules
(low = docs/config/single new file; medium = multi-file logic or schema
migration; high = ≥3 modules or auth/payment/data-loss boundaries or external
APIs). Update the issue's tier: field; emit tier_classified.
4. Claude as M3: write tests, then implementation
a. Acceptance tests first (translate Gherkin AC verbatim into pytest
functions; one test per Scenario, named after it; include Extensions
branches; file headed # AUTO_DEV_ACCEPTANCE: immutable; record the path in
the issue's acceptance_tests: field).
b. Then the implementation (read surrounding code first; plan files; write
via Edit/Write or bash heredoc; NEVER touch acceptance-test files).
c. Run schema migrations when needed.
5. Run pytest (subprocess — never in-process)
# Must be a subprocess: in-process pytest + stdout capture + a
# ThreadPoolExecutor in the code under test deadlocks on Windows
# (observed in practice).
import subprocess
result = subprocess.run(["pytest", "--tb=short", "-q"], cwd=target_root,
capture_output=True, text=True, timeout=300)
Exit 0 or 5 → step 6. Anything else → issue blocked, emit pytest_failed,
append ## Block reason with the stderr tail to the issue body, move on to the
next issue (blocked is a review queue, not a pipeline stall).
6. M4 self-review (single-LLM)
Design note — why single-LLM, for now. M4's original design is a multi-LLM review: two or more independent models review the same diff, and the overlap between their finding sets feeds a capture-recapture estimate of the defects still uncaught — a statistical technique from wildlife population studies that Watts Humphrey applied to software inspections in his Personal Software Process (PSP) work. It is deferred deliberately: requiring a second model would raise the entry bar for users running a single LLM. v1 therefore ships single-LLM self-review with an explicit
single_llm: trueflag in every review record, so multi-LLM records stay distinguishable when the feature lands. Planned as a future enhancement for review performance.
Read your own diff: correctness defects (off-by-one, null handling, missing
error paths)? security smells (plaintext secrets, SQL injection, unescaped HTML,
PII leaks)? spec violations against each Gherkin AC? any acceptance test
touched (absolute stop)? Blockers → handle as step-5 failure. Record the verdict
with the explicit caveat single_llm: true.
7. M5 escalation decision
Build the run state (helpers: references/inlined-helpers.py if the full
auto_dev package is absent): cost spent vs ceiling, test-failure count, new
dependencies, security findings, scope creep, arch conflicts, and
requirement_confidence sourced from the PRD frontmatter recorded at import:
gate_mode: prd-gate→ usegate_confidenceverbatim.gate_mode: self-reported(or absent) →min(verdict mapping, 0.85): PASS → 0.85, PASS-WITH-OPEN-ITEMS → 0.75. A self-graded verdict never earns full trust; below the 0.7 threshold it soft-escalates.
Decisions: hard_stop → blocked; soft_escalate → needs-review, next
issue; otherwise continue.
8. Leave the audit record (per git_mode)
tracked — single-branch commit to main, message body ending with the
Auto-Dev-Lite-Trailer block (run_id / issue_id / tier / review / cost_usd /
files_touched / lines / trailer_version: lite-1). No branches, no PRs.
ledger — append (never rewrite) an entry to runs/ledger.md:
## L-NNN — US-XXX: <title>
- completed: <ISO timestamp>
- run_id / tier / review / cost_usd
- files_touched: path (+A/-B) per line
- trailer_version: lite-1-ledger
L-NNN is monotonically increasing. Known ledger-mode limits (state them in the
final report): no per-issue diff or rollback; audit granularity is file-level.
9. Mark done
status: done; emit issue_done with commit_sha (tracked) or ledger_id
(ledger); loop to step 1.
10. Emit the calibration record (mandatory final step)
When the run ends (run-all completed, or during abort cleanup), record emission is
mandatory: python -m prd_gate calib add --run runs/<run_id> --prd <prd-path>.
Exactly one record per run, pairing the PRD's gate scores with the run's rework
outcomes — this feeds the score-vs-rework calibration. If prd_gate is not
installed, skip and state "calibration record not emitted (prd_gate absent)" in
the final report. Full rules: the calibration-run-logger PRD in
examples/calibration-run-logger/prd.md.
Run-all mode
Loop steps 1-9 until no ready issue remains. Per-issue one-liner:
✅ US-003 done in 4 min, +120/-8 lines, commit abc1234 (ledger mode:
..., ledger L-007). Final report: total time, estimated cost, blocked list,
git/ledger mode, and whether the PRD verdict was independently gated.
Anti-pattern self-checks
- ❌ Quietly amending an acceptance test to make it pass → hard-stop.
- ❌ In-process pytest (capture + thread pools deadlock on Windows) → always subprocess.
- ❌ Editor-style tools may silently truncate long files → bash heredoc for
files >200 lines, then verify (
ast.parsefor Python). - ❌ Cross-issue code (one issue touching five stories' code) → violates INVEST Independence.
- ❌ Skipping the trailer → audit chain lost.
- ❌ Step 0.5 marking Bucket B/C items
ready→ they have no Gherkin AC and will fail; B never becomes an issue, C staysblocked. - ❌ Step 0.5 "tidying" PRD bodies → provenance broken; Bucket A is verbatim.
Module sources (two-level fallback)
- If the full
auto_devpackage is installed (pip install -e, same-repo scenario), importtier_classifier/escalation/trailer/cost_meter/run_log/kill_switchfrom it. - Otherwise use
references/inlined-helpers.py— a stdlib-only simplified equivalent (tier heuristics, escalation decision including the 0.7 requirement-confidence threshold, trailer builder, run ids, ledger append, kill-switch check). Semantics match; the inlined rules are coarser (keyword heuristics). Where they disagree, the full package is authoritative.
Files
SKILL.md— this filereferences/prd-import-rules.md— full step 0.5 import rules (source selection, bucket mapping, bilingual anchors, edge cases, failure modes, log format)references/issue-template.md— local issue file templatereferences/inlined-helpers.py— stdlib fallback implementationsessions/— post-run retros (same pattern as req-dev-lite)
Contract alignment: req-dev-lite templates/prd-local(.en).md @ 2026-06-10 (see "与 req-dev-lite 的契约" at the end of prd-import-rules.md).