Releases: swingerman/disciplined-agentic-engineering
Release list
v1.9.0 — runbooks, infra quirks, domain-aware AC coverage
Marketplace: 1.8.0 → 1.9.0 · engineer: 0.15.0 → 0.16.0
The deepest layer of the cross-project skill-friction review: artifacts and references for the methodology surfaces that previously sat outside the DAE model.
runbook.md — NEW first-class artifact
engineer:plan generates features/<slug>/runbook.md when the plan touches infra/operator steps (provisioning, secrets, console-only configuration, manual DNS, deploy-day toggles). Each step has owner: human|agent, optional command:, evidence:, completed:, and blocking_acs.
engineer:arch-check (Step 3.5) refuses to mark CP7 complete if any deploy-AC asserts met: true while its blocking runbook steps are open.
image-titler's 016-staging-environment burned 100+ events on Firebase staging bring-up — entirely outside the artifact model. Now visible, ownership-tagged, and gate-enforced. Schema + how-to in engineer/skills/plan/references/runbook-template.md.
infra_quirks in manifest
engineer:onboard Step 2 batches an AskUserQuestion for project-level runtime quirks:
runtime_pins(Java 21, Node 20.x)port_map_file(path)framework_constraints(Flutter web has no hot-reload)recovery_commands(symptom → fix)
dae_resolve.py validates the schema (+ 5 new tests). engineer:fix consults infra_quirks before booting so the agent doesn't rediscover the same friction. nexthq rediscovered Java 21 + port map every session; mmc looped on Apache opcache cold-start.
Domain-aware AC coverage checklists
New engineer/references/ac-coverage/{web-seo,auth-oauth,deploy-model}.md.
engineer:discover-acs Step 3b (MANDATORY): scan feature.md for surface signals, present matching checklists as batched AskUserQuestion opt-in/out. Ticked items become AC candidates; nothing auto-creates without confirmation.
image-titler shipped without a default og:image AC because nothing prompted the question. nexthq took two passes to settle the right deploy-model decision. Domain-aware checklists fix this class of gap.
v1.8.0 — branch lifecycle + fix re-entry + stuck-loop detector + ATDD team teardown
Marketplace: 1.7.2 → 1.8.0 · engineer: 0.14.2 → 0.15.0
Four cross-project gaps from the v1.7.2 review — mid-pipeline lifecycle, not end-of-pipeline schema.
engineer:post-merge (NEW)
Runs immediately after a merged PR — not deferred to the next session. Closes the gap where users were asking "did we merge? are we still on the feature branch?" mid-session.
- Probes merge state via
gh pr view(preferred) orgit merge-base --is-ancestor(fallback) checkout main,pull --ff-only,branch -d(non-destructive — refuses unmerged work)fetch --prune+ tracker update viaprogress-lognext+session-summarydefer topost-mergeinstead of inlining — single owner, single audit-trail handoff
engineer:fix re-entry mode
New Step 0 routes between continue-existing / capture-new / pick-from-many. mmc ran 5 sequential fixes from one /engineer.fix invocation because the skill assumed one-shot.
- Uses
dae_fix.py list_open_fixesto detect state - New triggers: "another report", "more issues", "still failing", "validation failed again", "another bug", "next defect", "more fixes"
ATDD team teardown
atdd:atdd-team gains a Lifecycle section: create at Phase 1, reuse on session-resume, teardown at "After Completion" Step 4 (CP8 done / PR merged). engineer:progress-log auto-proposes teardown on status: done. nexthq saw a team idle 5 days post-feature.
Stuck-loop detector (engineer:reorient)
New Step 4 scans recent handoffs for N consecutive identical failures (same skill, same status, same recommended-next, same signature). Default threshold 3, tunable via manifest.autonomy.stuck_loop_threshold. On detection: emit a session-summary-style escalation with human_action_needed: decision, breaking the no-handoff rule once. nexthq saw 60+ identical ticks over 12 hours on a Functions emulator blocker.
v1.7.2 — schema enforcement + onboard safety
Marketplace: 1.7.1 → 1.7.2 · engineer: 0.14.1 → 0.14.2
Cross-project skill-friction review (image-titler, distbute, wsapi, mmc, nexthq) surfaced four targeted gaps; this patch closes them.
Schema enforcement
dae_fix.py --validate rejects status: closed unless the artifact has:
handoff_pathpointing at the close-step handoffharden_resultswithbug_line_mutation_confirmed: true,mutation_score,arch_check- non-empty
gap_analysis - no unresolved blockers
mmc shipped 5 fixes with status: closed but only 2 handoffs — Step 9 was silently skipped under deploy pressure. Now it's a hard schema failure.
dae_handoff.py gains:
met: partialrecognized as distinct fromNone(was silently dropped, now surfaces explicitly while still failing the gate)independence_violations()fails the gate when any CP6/CP7/CP8 handoff sharesagent_idwith the CP5 implement handoff (Principle 7). distbute saw a verify subagent crash and main self-verify in the same handoff — this would now block.
Onboard safety
- Gap-check mode: strictly read-only. Forbidden list now spells out
git checkout/pull/fetch/merge/rebase/branch -d/stash. image-titler hit a/engineer.onboardthat rangit checkout mainon a feature branch with unpushed commits because "validation" implied sync to the agent. - Full-onboard precondition: HEAD on
main/default branch, clean working tree, or explicit user confirmation. Never auto-stash, never auto-checkout.
Prime-context
Always emits a breadcrumb handoff. Earlier version produced no artifact; distbute user typed "emit the handoff" expecting one. Surprising users with "no artifact by design" breaks the agentic-summary contract.
Tests
15 new tests (7 for dae_fix close gate, 8 for dae_handoff partial+independence). Full guardrail suite green.
v1.7.1 — branch-cleanup hygiene
Marketplace: 1.7.0 → 1.7.1 · engineer: 0.14.0 → 0.14.1
After completing the DAE pipeline the merged feature branch lingered and main went stale. v1.7.1 closes that gap on both ends of a session.
next — session start
After the survey, probes git merge-base --is-ancestor HEAD origin/HEAD. If the current branch is merged, surfaces a STALE BRANCH item with the three cleanup commands. Autonomy high runs them, medium runs + reports, low waits for confirm.
session-summary — session end
After infra teardown, the same probe runs. If the branch is merged the work is shipped → git checkout main && git pull --ff-only && git branch -d <branch> and log it. If unmerged, do nothing (work isn't complete yet).
fix close — deferred checklist
Step 9 now prints the post-merge cleanup commands the user must run after the PR merges. Recorded in the closure entry so next/session-summary can detect the stale branch later.
Safety
git branch -d (not -D) refuses unmerged work, so the autonomy-high path is non-destructive by construction.
v1.7.0 — declared infrastructure: probe, auto-start, teardown
New feature. DAE now treats infrastructure (firebase emulators, chromedriver, docker services) as a declared, auto-managed part of the methodology. Skills that need infra probe first, start it themselves if it's down, and only stop with a structured diagnosis when starting actually fails.
What this fixes
v1.6.1's dispatch rule said "if you can't access infra, write the dispatch command into the handoff and stop." That was still too pessimistic — "I can't access X" often meant "X isn't running yet and I haven't tried to start it." Surfaced during dogfooding: a CP7 verify deferred to the human because firebase emulators weren't up.
The new behavior: implementing skills don't defer infra to the human anymore. They check, they start, they wait for ready, and they only stop if start genuinely fails — with a structured diagnosis instead of a "try this command" note.
New: manifest infra: section
Projects declare their infrastructure in .engineer/manifest.yml:
infra:
default_teardown: leave-running # optional; per-entry override wins
auth-emulator:
health:
type: http # http | tcp | process | command
url: http://localhost:9099
timeout_s: 5
start:
command: firebase emulators:start --only auth
background: true
ready_signal: "All emulators ready" # optional regex on stdout
ready_timeout_s: 60
teardown: leave-running # leave-running | session-end | always
chromedriver:
health:
type: tcp
port: 9515
start:
command: chromedriver --port=9515
background: true
ready_timeout_s: 10Validated by dae_resolve — kebab-case names, required fields per health type, allowed teardown modes.
New: dae_infra.py script
dae_infra.py status [--root DIR] [NAME …] # probe each declared entry; JSON output
dae_infra.py ensure [--root DIR] NAME … # probe; start in background if down; wait for ready
dae_infra.py teardown [--root DIR] [NAME …] # kill recorded PIDs for session-end/always entries
ensure returns a structured failure when start doesn't work:
{
"name": "auth-emulator",
"status": "start-failed",
"diagnosis": "command-not-found",
"detail": "firebase CLI not on PATH",
"last_output": ["…last 20 lines of stdout…"],
"elapsed_s": 0.3,
"suggested_fix": "Install 'firebase' or ensure it is on PATH"
}Diagnoses: command-not-found, port-in-use, ready-timeout, start-exit-nonzero, unknown. State is recorded under .engineer/infra/<name>.json (PID + pgid + started_at); stale state files are GC'd on read when the PID's process group is gone.
Skills wired up
engineer.refine— Step 7 (Apply) ensures infra before re-running test streams.engineer.fix— Steps 3 (Pin), 4 (Fix), 7 (Harden) ensure infra before any test/mutation run. The skill establishes an "Infra contract" once at the top of its Workflow.engineer.onboard— discovers and proposes infra entries by probing forfirebase.json,docker-compose.yml,package.jsondev/emulator scripts,Makefiletargets, chromedriver dependencies.engineer.session-summary— tears down entries withteardown: session-end(oralways) at the end of a work session.engineer/references/handoff-dispatch.md— the "I can't access the resources" escape is now narrowly: triedensure, here's the structured failure.
Blocker rule for undeclared infra
If a skill needs infra and the manifest doesn't declare it, the skill stops with: "declare <name> in manifest.yml infra: section per the DAE infra schema, or pre-start the service." No grep-the-README fallback — the declaration discipline is the contract that makes downstream skills reliable.
Plugin versions in this release
engineer0.13.1 → 0.14.0 (minor — manifest schema extension + new script + skill wiring)atdd0.8.2 (unchanged)crap-analyzer0.1.1 (unchanged)
Test growth
Baseline 284 (after v1.6.0). Now 342 tests passing — +9 schema validation tests, +48 dae_infra unit tests (probes, state files, ensure idempotency, stale PID GC, structured failure diagnoses, end-to-end status/ensure/teardown cycles), +1 from the cleanup pass.
Install
/plugin marketplace add swingerman/disciplined-agentic-engineering
/plugin install engineer@disciplined-agentic-engineering
Already installed? /plugin marketplace update disciplined-agentic-engineering and re-install engineer. Re-onboard your project (or hand-edit .engineer/manifest.yml) to declare your infra entries.
What this opens up next
- Per-feature infra subsets (a feature can require a specific declared subset, not just "all infra").
- CI-environment awareness (skip start when running inside a CI workflow that pre-provisions infra).
- Auto-drafted infra ADRs when onboarding finds something unusual.
All deferred to v2.0; v1.7.0 is the first cut where DAE workflows actually take responsibility for their own running infrastructure.
v1.6.1 — handoff dispatch rule: skills auto-dispatch the next fresh agent
Workflow rule. Implementing skills now auto-dispatch the next checkpoint's fresh agent instead of asking the human "want me to dispatch?" Surfaced from real use: a refine handoff said "CP7 verify next — must be a fresh agent (Charter §6)" and stopped, even though a subagent dispatched via the Agent tool fully satisfies §6.
The rule
New reference doc: engineer/references/handoff-dispatch.md. Codifies:
Stop ONLY when:
- Something is genuinely ambiguous about what to do next.
- The charter or feature explicitly requires human verification or acceptance at this checkpoint.
- The active feature's effective
autonomy_levelislow(the lowest level is explicitly the "ask first" mode).Otherwise: auto-dispatch the next agent via the Agent tool. Brief it with the feature slug, the relevant handoff, and the next-checkpoint instructions.
Plus a decision table by autonomy level (low → confirm-then-dispatch; medium → auto-dispatch with one-line surfacing; high → auto-dispatch silently) and a subagent brief template.
Special case — when the next agent needs resources the implementer can't access (live emulators, prod creds, hardware): write the exact dispatch command into the handoff and stop. Don't ask "should I dispatch?" — you've already declared why you can't.
Skills updated
Five checkpoint-ending engineer skills now reference the rule from their Handoff sections:
refine→ CP7 verify (the original surfacing case)plan→ CP5 implementdiscover-acs→ CP3 atdd (kept as explicit stop — ACs carryhuman_action_needed: yes; the human owns the AC contract)engineer.atdd→ CP4 planfix→ progress-log propagation on close
The autonomy vocabulary is unchanged: {low, medium, high} per dae_resolve.AUTONOMY_LEVELS, declared on feature.md and capped by manifest.autonomy.path_overrides.
Plugin versions in this release
engineer0.13.0 → 0.13.1 (patch — workflow rule)atdd0.8.2 (unchanged)crap-analyzer0.1.1 (unchanged)
Install
/plugin marketplace add swingerman/disciplined-agentic-engineering
/plugin install engineer@disciplined-agentic-engineering
Already installed? /plugin marketplace update disciplined-agentic-engineering and re-install engineer to pick up the new rule. Test count unchanged at 284 (the change is documentation-only inside the skill files; no script changes).
Where this came from
A real handoff during dogfooding of v1.6.0 paused to ask the human to dispatch the next agent — exactly the bounce-the-mechanical-decision-back pattern the methodology should never produce. The fix is the smallest possible: a shared reference doc + one-line additions to the five skills that end a checkpoint. Future work (deferred): make recommended_next itself machine-actionable with a dispatch_mode field, so the dispatch can be auto-orchestrated structurally rather than via per-skill instructions.
v1.6.0 — fix workflow: defects as a first-class DAE unit-of-work
New feature. A fix skill in the engineer plugin gives DAE its missing unit-of-work: the defect. Bugs are now first-class, with discovery → pin → fix → harden → "why didn't we catch it?" → close, and a methodology-improvement feedback loop baked into every fix.
What this fixes
DAE's 8-checkpoint pipeline assumes "we're building something new." Bugs didn't fit:
- Treating a bug as a feature was heavyweight for a one-hour fix.
feature-editworked only for single-feature regressions, awkwardly for cross-cutting bugs, and not at all for code that predates DAE adoption.- Ad-hoc fixes lost the regression test and the methodology feedback.
fix fills that gap with the same discipline as the rest of DAE.
The workflow (9 phases, two confirm-first gates)
1. Capture — free-form input; no feature slug required
2. Investigate — auto-detect features if obvious; otherwise user confirms.
Uses `prime-context` per candidate to assess fit.
3. Pin — regression spec per affected feature.
Confirm-first gate: spec MUST be RED on buggy code.
4. Fix — implement; regression turns green.
5. Refine — clean up the diff.
6. Verify — arch-check + crap-analyzer on touched code.
7. Harden — atdd-mutate + bug-line mutation gate:
revert the fix's key line(s); the regression spec MUST fail.
Proves the spec pins the bug, not the implementation.
8. Gap analysis — "why didn't we catch it?" Categorized findings
(missing_ac, incomplete_spec, inadequate_verification,
architecture_violation, etc.) become followups.
9. Close — hard preconditions: pin confirmed, hardened, gap_analysis
non-empty, no unresolved blockers.
Blocker rule (close gate)
A gap-analysis finding blocks close (not just lands in consolidation) when:
- The category is
architecture_violation— always. - The fix has
blocks_user: trueANDworkaround: none— ALL findings on this fix are promoted to blockers.
Otherwise, findings are advisory and land in .engineer/consolidation.md tagged with the fix slug.
Cross-cutting bugs
Bugs that span multiple features are first-class. Each affected feature gets its own regression spec; each feature's verification cadence runs that spec independently forever. feature_refs: [] is allowed too — loose fixes against pre-DAE code work, with a category: no_feature followup nudging onboarding.
Integrated into existing skills
/engineer.nextgains an OPEN FIXES bucket between NEEDS YOUR DECISION and READY TO ADVANCE. Sub-priority: user-blocking-no-workaround → user-blocking-with-workaround → not-blocking-user; then by severity./engineer.progress-logpropagates fix closures: each affected feature'sprogress.mdcarries a structured entry referencing the fix slug..engineer/consolidation.mdreceives advisory followups; the trail back to the source fix is preserved.
Design + plan docs
The full design is published in the DAE Notion workspace:
- DAE Fix Workflow Foundation — full design
- DAE Fix Workflow — Implementation Plan — task breakdown + decisions log
Plugin versions in this release
engineer0.12.2 → 0.13.0 (minor — new skill)atdd0.8.2 (unchanged)crap-analyzer0.1.1 (unchanged)
Test growth
- Baseline 230 (after v1.5.2 block-scalar fix)
- After Tasks 1–7 + scenario harness: 284 tests passing
Install
/plugin marketplace add swingerman/disciplined-agentic-engineering
/plugin install engineer@disciplined-agentic-engineering
Already installed? /plugin marketplace update disciplined-agentic-engineering and re-install engineer to pick up the fix workflow. Then try /engineer.fix "your first bug".
v1.5.4 — SKILL.md descriptions follow agentskills.io recommended framing
Spec-style polish. Rewrites five SKILL.md descriptions to follow the agentskills.io specification's recommended "Use when/to…" opening, the framing the spec uses in its own "Good example" block.
What changed
Four descriptions opened with "This skill should be used when the user asks to…" — functional but wordier than the spec example. Rewritten to lead with what the skill does, then the trigger list:
skills/atdd(685 → 393 chars)skills/atdd-team(685 → 465)skills/atdd-mutate(589 → 395)crap-analyzer/skills/crap-analyzer(framing-only, ~same length)
One more (engineer/skills/next) had two behavior-describing sentences trailing the trigger list; those moved out — their content was already in the skill body:
engineer/skills/next(473 → 233 chars)
All five remain well under the 1024-char spec limit and still front-load the trigger phrases agents grep for. Skill behavior unchanged.
Plugin versions in this release
atdd0.8.1 → 0.8.2 (patch — description style)engineer0.12.1 → 0.12.2 (patch — description style)crap-analyzer0.1.0 → 0.1.1 (patch — description style)
Install
/plugin marketplace add swingerman/disciplined-agentic-engineering
/plugin install atdd@disciplined-agentic-engineering
/plugin install engineer@disciplined-agentic-engineering
/plugin install crap-analyzer@disciplined-agentic-engineering
Already installed? /plugin marketplace update disciplined-agentic-engineering and re-install to pick up the cleaner descriptions.
v1.5.3 — atdd skill frontmatters: agentskills.io spec-compliance
Spec-compliance fix. Aligning the atdd plugin's three skill frontmatters with the agentskills.io specification.
The deviation
The spec defines exactly six allowed top-level fields in SKILL.md frontmatter: name, description, license, compatibility, metadata, allowed-tools. A top-level version: is not in the spec. The three atdd-plugin skills carried a version: 0.6.0 line (also stale — the plugin had since moved to 0.8.0), and that's the field this release removes.
The 16 engineer skills and the crap-analyzer skill were already spec-clean (only name + description); no changes there.
What changed
skills/atdd/SKILL.md— removedversion: 0.6.0skills/atdd-team/SKILL.md— removedversion: 0.6.0skills/atdd-mutate/SKILL.md— removedversion: 0.6.0
Canonical version lives in plugin.json / marketplace.json. Removing the duplicate eliminates a drift source.
Plugin versions in this release
atdd0.8.0 → 0.8.1 (patch — spec-compliance)engineer0.12.1 (unchanged)crap-analyzer0.1.0 (unchanged)
Audit summary
Full audit of all 20 SKILL.md files in this repo against the agentskills.io spec:
| Spec check | Result |
|---|---|
name 1-64 chars, lowercase + digits + hyphens, matches parent dir |
All 20 pass |
description 1-1024 chars, includes what + when to use |
All 20 pass |
| Body ≤500 lines (recommendation) | All 20 pass (longest: 298) |
| Directory layout | All 20 pass |
| Top-level fields restricted to spec-defined set | Now all 20 pass |
Install
/plugin marketplace add swingerman/disciplined-agentic-engineering
/plugin install atdd@disciplined-agentic-engineering
Already installed? /plugin marketplace update disciplined-agentic-engineering and re-install atdd to pick up the spec-clean frontmatters.
v1.5.2 — dae_handoff block-scalar parsing fix
Bug fix. dae_handoff.py's frontmatter parser was naïve about both nested list values and YAML block scalars (| / >): bullets inside exit_criteria[].evidence got mis-counted as phantom new criteria, marking substantively-complete handoffs as incomplete and stalling downstream gates.
Surfaced in real use on the image-titler project's CP8 handoff — the user worked around it by rewriting - to • inside evidence blocks. That workaround is no longer needed.
The fix
- Centralized:
dae_resolve.read_manifestgains YAML block-scalar support (|literal preserves newlines,>folded collapses to spaces,#inside a block scalar is content not a comment). 6 new tests including the bug reproducer (key: |\n - one\n - two→"- one\n- two"string, not a list). - Refactored:
dae_handoff.parse_handoffnow consumesread_manifestdirectly. The hand-rolled_parse_criteria(and_frontmatterhelper) are deleted — same bug can never recur because there's only one YAML parser. 2 new tests pinning the reproducer: a 6-criterion handoff withevidence: |blocks containing-bullets reports exactly 6 criteria, allmet: true.
Handoff format unchanged — the natural evidence: |\n - foo\n - bar shape that authors write just works now.
Plugin versions in this release
engineer0.12.0 → 0.12.1 (patch — bug fix)atdd0.8.0 (unchanged)crap-analyzer0.1.0 (unchanged)
Install
/plugin marketplace add swingerman/disciplined-agentic-engineering
/plugin install engineer@disciplined-agentic-engineering
Already installed? /plugin marketplace update disciplined-agentic-engineering and re-install engineer to get the parser fix.
230 tests passing (was 222) — 6 new block-scalar tests in dae_resolve, 2 new bug-reproducer tests in dae_handoff.