Skip to content

Releases: swingerman/disciplined-agentic-engineering

v1.9.0 — runbooks, infra quirks, domain-aware AC coverage

Choose a tag to compare

@swingerman swingerman released this 04 Jun 17:25

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

Choose a tag to compare

@swingerman swingerman released this 04 Jun 17:04

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) or git merge-base --is-ancestor (fallback)
  • checkout main, pull --ff-only, branch -d (non-destructive — refuses unmerged work)
  • fetch --prune + tracker update via progress-log
  • next + session-summary defer to post-merge instead 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_fixes to 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

Choose a tag to compare

@swingerman swingerman released this 04 Jun 16:43

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_path pointing at the close-step handoff
  • harden_results with bug_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: partial recognized as distinct from None (was silently dropped, now surfaces explicitly while still failing the gate)
  • independence_violations() fails the gate when any CP6/CP7/CP8 handoff shares agent_id with 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.onboard that ran git checkout main on 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

Choose a tag to compare

@swingerman swingerman released this 04 Jun 15:49

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

Choose a tag to compare

@swingerman swingerman released this 28 May 21:24

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: 10

Validated 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 for firebase.json, docker-compose.yml, package.json dev/emulator scripts, Makefile targets, chromedriver dependencies.
  • engineer.session-summary — tears down entries with teardown: session-end (or always) at the end of a work session.
  • engineer/references/handoff-dispatch.md — the "I can't access the resources" escape is now narrowly: tried ensure, 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

  • engineer 0.13.1 → 0.14.0 (minor — manifest schema extension + new script + skill wiring)
  • atdd 0.8.2 (unchanged)
  • crap-analyzer 0.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

Choose a tag to compare

@swingerman swingerman released this 28 May 20:27

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:

  1. Something is genuinely ambiguous about what to do next.
  2. The charter or feature explicitly requires human verification or acceptance at this checkpoint.
  3. The active feature's effective autonomy_level is low (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 implement
  • discover-acs → CP3 atdd (kept as explicit stop — ACs carry human_action_needed: yes; the human owns the AC contract)
  • engineer.atdd → CP4 plan
  • fix → 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

  • engineer 0.13.0 → 0.13.1 (patch — workflow rule)
  • atdd 0.8.2 (unchanged)
  • crap-analyzer 0.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

Choose a tag to compare

@swingerman swingerman released this 25 May 20:38

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-edit worked 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:

  1. The category is architecture_violation — always.
  2. The fix has blocks_user: true AND workaround: 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.next gains 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-log propagates fix closures: each affected feature's progress.md carries a structured entry referencing the fix slug.
  • .engineer/consolidation.md receives advisory followups; the trail back to the source fix is preserved.

Design + plan docs

The full design is published in the DAE Notion workspace:

Plugin versions in this release

  • engineer 0.12.2 → 0.13.0 (minor — new skill)
  • atdd 0.8.2 (unchanged)
  • crap-analyzer 0.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

Choose a tag to compare

@swingerman swingerman released this 25 May 16:25

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

  • atdd 0.8.1 → 0.8.2 (patch — description style)
  • engineer 0.12.1 → 0.12.2 (patch — description style)
  • crap-analyzer 0.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

Choose a tag to compare

@swingerman swingerman released this 25 May 16:19

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 — removed version: 0.6.0
  • skills/atdd-team/SKILL.md — removed version: 0.6.0
  • skills/atdd-mutate/SKILL.md — removed version: 0.6.0

Canonical version lives in plugin.json / marketplace.json. Removing the duplicate eliminates a drift source.

Plugin versions in this release

  • atdd 0.8.0 → 0.8.1 (patch — spec-compliance)
  • engineer 0.12.1 (unchanged)
  • crap-analyzer 0.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

Choose a tag to compare

@swingerman swingerman released this 25 May 16:06

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_manifest gains 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_handoff now consumes read_manifest directly. The hand-rolled _parse_criteria (and _frontmatter helper) are deleted — same bug can never recur because there's only one YAML parser. 2 new tests pinning the reproducer: a 6-criterion handoff with evidence: | blocks containing - bullets reports exactly 6 criteria, all met: true.

Handoff format unchanged — the natural evidence: |\n - foo\n - bar shape that authors write just works now.

Plugin versions in this release

  • engineer 0.12.0 → 0.12.1 (patch — bug fix)
  • atdd 0.8.0 (unchanged)
  • crap-analyzer 0.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.