- Initialize .sdlc/ with config, guidance, and state machine - Register M0-M8 as released milestones (full engine track history) - Seed M9 (Community Sync & Revocation) and M10 (Governance & Agent Rights) with features - Seed product milestones P0-P4 and PG1 gate with features from existing planning docs - Add Team section to AGENTS.md (tidal-engineer, tidal-visionary, tidal-researcher, tidal-storyteller) - Add knowledge-librarian agent for .sdlc/knowledge/ curation - Gitignore .sdlc/telemetry.redb (volatile binary state) - Add .ai/ scaffold (project knowledge index)
4.4 KiB
dev-driver
A stock sdlc tool that reads project state, finds the single most important next development action, dispatches it asynchronously, and exits. Paired with a recurring orchestrator action (every 4 hours), it makes your sdlc project self-advancing.
What it does
On each invocation, dev-driver applies a 5-level priority waterfall and takes exactly one action:
- Flight lock — if a previous dispatch is still in flight (< 2h), do nothing
- Quality check — if
quality-checkreports failures, do nothing (fix quality first) - Feature advancement — if any feature has an active directive, advance it one step
- Wave start — if a milestone has all features PLANNED/READY, start the wave
- Idle — nothing actionable, exit cleanly
One action per tick. The 4-hour recurrence IS the iteration rhythm.
Default action recipe
Create this action once in the sdlc UI or via CLI:
Label: dev-driver
Tool: dev-driver
Input: {}
Recurrence: 14400 (4 hours in seconds)
Then run sdlc ui --run-actions to enable the orchestrator.
Priority waterfall (detail)
Level 1: Flight lock
Reads .sdlc/.dev-driver.lock. If the lock exists and is less than 2 hours old,
exits immediately with { action: "waiting", lock_age_mins: N }.
This prevents double-dispatch when a previous Claude agent is still running.
Level 2: Quality check
Runs the quality-check tool. If any checks fail, exits with:
{ "action": "quality_failing", "failed_checks": ["test", "lint"] }
Fix the failing checks before dev-driver will advance features.
Level 3: Feature advancement
Finds features in implementation, review, audit, or qa phase with a
pending directive. Picks the first one alphabetically. Dispatches:
claude --print "/sdlc-next <slug>"
This is /sdlc-next — one step only. The 4-hour recurrence advances the feature
step by step over time. This is intentional: it keeps you in control and lets you
course-correct between steps.
Returns:
{ "action": "feature_advanced", "slug": "my-feature", "phase": "implementation", "directive": "/sdlc-next my-feature" }
Level 4: Wave start
If no features have active directives but a milestone has all features in PLANNED or READY phase, starts the next wave:
claude --print "/sdlc-run-wave <milestone>"
Returns:
{ "action": "wave_started", "milestone": "v21-dev-driver" }
Level 5: Idle
No actionable work found. Returns:
{ "action": "idle", "reason": "no actionable work found" }
How to skip a feature
If you don't want dev-driver to autonomously advance a specific feature, add a task
with skip:autonomous in the title:
sdlc task add <slug> --title "skip:autonomous: needs human review before proceeding"
Dev-driver will exclude this feature from Level 3 selection until the task is removed or marked done. You retain full control over which features advance autonomously.
One step, not full run
Dev-driver dispatches /sdlc-next <slug>, NOT /sdlc-run <slug>.
/sdlc-next executes exactly one directive (write a spec, approve a design, implement
a task, etc.) and exits. The next tick, dev-driver will pick the same feature again
and advance it one more step.
This means:
- Each tick = one atomic state machine step
- You can review after each step in the Actions page
- No surprise full-feature runs that take hours
Lock file
Path: .sdlc/.dev-driver.lock
TTL: 2 hours
{
"started_at": "2026-03-02T04:00:00.000Z",
"action": "feature_advanced",
"slug": "my-feature",
"pid": 12345
}
The lock is written before each dispatch and cleared automatically after 2 hours. You can delete it manually if you need to run dev-driver before the TTL expires.
Output reference
All five possible outputs:
// Level 1 (lock)
{ "action": "waiting", "lock_age_mins": 45 }
// Level 1 (active run)
{ "action": "waiting", "reason": "agent run in progress" }
// Level 2
{ "action": "quality_failing", "failed_checks": ["test", "clippy"] }
// Level 3
{ "action": "feature_advanced", "slug": "my-feature", "phase": "implementation", "directive": "/sdlc-next my-feature" }
// Level 4
{ "action": "wave_started", "milestone": "v21-dev-driver" }
// Level 5
{ "action": "idle", "reason": "no actionable work found" }
All wrapped in: { "ok": true, "data": { ... }, "duration_ms": N }