Skip to content

feat: quick-dev fast lane — per-story quick-dev under full profiles (default OFF)#9

Merged
ikunin merged 1 commit into
mainfrom
feat/quick-dev-fast-lane
Jul 11, 2026
Merged

feat: quick-dev fast lane — per-story quick-dev under full profiles (default OFF)#9
ikunin merged 1 commit into
mainfrom
feat/quick-dev-fast-lane

Conversation

@ikunin

@ikunin ikunin commented Jul 11, 2026

Copy link
Copy Markdown
Owner

Summary

Opt-in (default OFF) per-story routing of LOW-RISK stories through bmad-quick-dev (one-shot) under small/medium/large profiles, while substantial stories keep the mandatory 7-step BMAD cycle. Brings nano's speed to the full profiles per story, with strong guardrails.

How it works

  • Routing: a fast-laned story runs bmad-create-story FIRST (PREPARE_STORY_BRANCH → CREATE_STORY → NANO_QUICK_DEV) so the pre-story gate can judge it from real acceptance criteria + declared paths; nano still skips create-story. The decision is locked at NANO_QUICK_DEV so quick-dev's post-impl File List can't flip it off.
  • Gate (fast-lane-gate.js, pure/deterministic): defaults full on any doubt; deny-globs (auth/migrations/secrets) and an AC-count budget beat a fast tag; inference only fires when every declared path is allow-listed.
  • Escalation net: a quick-dev hard failure re-runs the full cycle from CREATE_STORY; a success that flags failing tests / high severity routes to CODE_REVIEW (the adversarial review the fast lane skipped). Both record the story in fast_lane_forced_full (write-through CRITICAL_KEY) so it never re-fast-lanes.

Configuring fast/full per story or epic

Three ways (docs in CONFIGURATION.md):

  • Explicit mark (highest authority, durable): autopilot fast-lane <story|epic-<id>> <fast|full|auto>, the set_fast_lane chat command, or /sprintpilot-plan-sprint Step 11c. Persists in clobber-resistant fast-lane-overrides.json (survives re-plan). A fast mark overrides the gate and works even when the lane is off; only fast_lane_forced_full beats it.
  • Story-file tag (fast_lane:/risk: in the .md) — subject to deny-globs + max_ac.
  • Epic/plan tag in sprint-plan.yaml.

Safety & observability

Default OFF; installer prompts to enable + set max_ac. Tests stay required. Every routing choice is a fast_lane_decision ledger entry; autopilot progress shows fast-laned / kept-full / escalated counts.

Hardening

Developed and hardened across seven independent adversarial review rounds (create-story-first routing, decision lock, success→CODE_REVIEW escalation, ledger-emit fix, installer regex scoping, manual-override precedence). Docs updated across README, AGENTS, CONFIGURATION, USAGE, ARCHITECTURE, Sprintpilot.md, and the orchestrator/planner skill contracts.

Tests

~110 new unit/integration cases (gate truth table, routing, escalation, derive-profile, metrics, overrides store, commands/CLI) + an opt-in e2e scenario. 2384 pass, Biome clean, all source node --check clean.

🤖 Generated with Claude Code

… profiles (default OFF)

Opt-in per-story routing of LOW-RISK stories through bmad-quick-dev
(one-shot) under small/medium/large profiles, while substantial stories
keep the mandatory 7-step BMAD cycle. Off by default; the installer
prompts to enable it and for the max_ac size gate.

Routing: a fast-laned story runs bmad-create-story FIRST
(PREPARE_STORY_BRANCH -> CREATE_STORY -> NANO_QUICK_DEV) so the pre-story
gate has a real story file to enforce its guardrails; nano still skips
create-story (distinguished by fast_lane_active). The decision is locked
at NANO_QUICK_DEV so quick-dev's post-impl File List can't flip it off.

Gate (new pure fast-lane-gate.js): deterministic, conservative (defaults
`full` on any uncertainty). deny-globs (auth/migrations/secrets) beat an
explicit fast tag; an AC-count budget beats it too; inference only fires
when every declared path is allow-listed; explicit story-file tags and
epic/plan tags (sprint-plan.yaml) can force the decision, story-file
winning. Every routing choice is a fast_lane_decision ledger entry.

Manual marks (highest authority): a user marks a story/epic fast|full|auto
in chat (set_fast_lane UserCommand), via `autopilot fast-lane <key>
<fast|full|auto>`, or during /sprintpilot-plan-sprint. Marks persist in a
Sprintpilot-owned, clobber-resistant fast-lane-overrides.json (survives
re-plan). A `fast` mark wins over the gate (deny-globs/size/tags) and
applies even when the lane is globally off; only fast_lane_forced_full
still overrides it, to prevent a fast->fail->fast loop.

Escalation net: a quick-dev hard failure re-runs the full cycle from
CREATE_STORY; a success that flags failing tests / high severity routes
to CODE_REVIEW (the adversarial review the fast lane skipped) — a done
story survives re-resolution there but not at CREATE_STORY. Both record
the story in fast_lane_forced_full (a write-through CRITICAL_KEY) so it
never re-fast-lanes, and carry a phase-appropriate escalation note.
nano_quick_dev is wall-clock budgeted under full profiles.

Observability: report.js + `autopilot progress` show fast-laned /
kept-full / escalated counts and the current story's decision.

Hardened across six adversarial review rounds. Docs: README, AGENTS,
CONFIGURATION, USAGE, ARCHITECTURE, Sprintpilot.md, workflow contracts.

Tests: ~110 unit/integration cases + an opt-in e2e scenario. 2382 pass,
Biome clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
re += c;
}
}
return new RegExp(`^${re}$`);
@ikunin
ikunin merged commit 27846fa into main Jul 11, 2026
8 checks passed
@ikunin
ikunin deleted the feat/quick-dev-fast-lane branch July 11, 2026 11:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants