@aperant/framework 0.6.7 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +240 -0
- package/agents/apt-planner.md +12 -0
- package/agents/apt-pr-review-fixer.md +13 -9
- package/bin/apt-tools.mjs +7 -0
- package/dist/cli/ci-watch/stop-matrix.d.mts.map +1 -1
- package/dist/cli/ci-watch/stop-matrix.mjs +16 -0
- package/dist/cli/ci-watch/stop-matrix.mjs.map +1 -1
- package/dist/cli/commands/ci-watch.d.mts +11 -0
- package/dist/cli/commands/ci-watch.d.mts.map +1 -1
- package/dist/cli/commands/ci-watch.mjs +147 -3
- package/dist/cli/commands/ci-watch.mjs.map +1 -1
- package/dist/cli/commands/features-audit.d.mts +24 -0
- package/dist/cli/commands/features-audit.d.mts.map +1 -1
- package/dist/cli/commands/features-audit.mjs +159 -5
- package/dist/cli/commands/features-audit.mjs.map +1 -1
- package/dist/cli/commands/health-check.d.mts +16 -0
- package/dist/cli/commands/health-check.d.mts.map +1 -1
- package/dist/cli/commands/health-check.mjs +119 -3
- package/dist/cli/commands/health-check.mjs.map +1 -1
- package/dist/cli/commands/init.d.mts +19 -1
- package/dist/cli/commands/init.d.mts.map +1 -1
- package/dist/cli/commands/init.mjs +143 -8
- package/dist/cli/commands/init.mjs.map +1 -1
- package/dist/cli/commands/modes.d.mts.map +1 -1
- package/dist/cli/commands/modes.mjs +11 -0
- package/dist/cli/commands/modes.mjs.map +1 -1
- package/dist/cli/commands/pr-review-audit-fixer.d.mts +13 -0
- package/dist/cli/commands/pr-review-audit-fixer.d.mts.map +1 -1
- package/dist/cli/commands/pr-review-audit-fixer.mjs +18 -5
- package/dist/cli/commands/pr-review-audit-fixer.mjs.map +1 -1
- package/dist/cli/commands/route.d.mts.map +1 -1
- package/dist/cli/commands/route.mjs +37 -2
- package/dist/cli/commands/route.mjs.map +1 -1
- package/dist/cli/commands/task.d.mts.map +1 -1
- package/dist/cli/commands/task.mjs +132 -5
- package/dist/cli/commands/task.mjs.map +1 -1
- package/dist/cli/commands/validate-evidence.d.mts +24 -2
- package/dist/cli/commands/validate-evidence.d.mts.map +1 -1
- package/dist/cli/commands/validate-evidence.mjs +154 -17
- package/dist/cli/commands/validate-evidence.mjs.map +1 -1
- package/dist/cli/commands/vitest-doctor.d.mts +2 -0
- package/dist/cli/commands/vitest-doctor.d.mts.map +1 -0
- package/dist/cli/commands/vitest-doctor.mjs +168 -0
- package/dist/cli/commands/vitest-doctor.mjs.map +1 -0
- package/dist/cli/config/gitignore-drift.d.mts +23 -1
- package/dist/cli/config/gitignore-drift.d.mts.map +1 -1
- package/dist/cli/config/gitignore-drift.mjs +81 -3
- package/dist/cli/config/gitignore-drift.mjs.map +1 -1
- package/dist/cli/config/load.d.mts +56 -2
- package/dist/cli/config/load.d.mts.map +1 -1
- package/dist/cli/config/load.mjs +192 -2
- package/dist/cli/config/load.mjs.map +1 -1
- package/dist/cli/consistency/parse-review.mjs +7 -0
- package/dist/cli/consistency/parse-review.mjs.map +1 -1
- package/dist/cli/dispatch.d.mts.map +1 -1
- package/dist/cli/dispatch.mjs +24 -2
- package/dist/cli/dispatch.mjs.map +1 -1
- package/dist/cli/gate/gates/gitignore-in-sync.d.mts +1 -1
- package/dist/cli/gate/gates/gitignore-in-sync.d.mts.map +1 -1
- package/dist/cli/gate/gates/gitignore-in-sync.mjs +5 -2
- package/dist/cli/gate/gates/gitignore-in-sync.mjs.map +1 -1
- package/dist/cli/gate/gates/review-clean.d.mts +5 -1
- package/dist/cli/gate/gates/review-clean.d.mts.map +1 -1
- package/dist/cli/gate/gates/review-clean.mjs +23 -18
- package/dist/cli/gate/gates/review-clean.mjs.map +1 -1
- package/dist/cli/gate/gates/verify-approved.d.mts +49 -1
- package/dist/cli/gate/gates/verify-approved.d.mts.map +1 -1
- package/dist/cli/gate/gates/verify-approved.mjs +93 -14
- package/dist/cli/gate/gates/verify-approved.mjs.map +1 -1
- package/dist/cli/help.d.mts.map +1 -1
- package/dist/cli/help.mjs +8 -2
- package/dist/cli/help.mjs.map +1 -1
- package/dist/cli/host/detect.d.mts +122 -9
- package/dist/cli/host/detect.d.mts.map +1 -1
- package/dist/cli/host/detect.mjs +132 -0
- package/dist/cli/host/detect.mjs.map +1 -1
- package/dist/cli/install/legacy-paths.d.mts +38 -0
- package/dist/cli/install/legacy-paths.d.mts.map +1 -0
- package/dist/cli/install/legacy-paths.mjs +69 -0
- package/dist/cli/install/legacy-paths.mjs.map +1 -0
- package/dist/cli/install/runtime-detect.d.mts +13 -0
- package/dist/cli/install/runtime-detect.d.mts.map +1 -1
- package/dist/cli/install/runtime-detect.mjs +9 -0
- package/dist/cli/install/runtime-detect.mjs.map +1 -1
- package/dist/cli/install/runtime-migrate.d.mts +84 -0
- package/dist/cli/install/runtime-migrate.d.mts.map +1 -0
- package/dist/cli/install/runtime-migrate.mjs +244 -0
- package/dist/cli/install/runtime-migrate.mjs.map +1 -0
- package/dist/cli/route/drift-detect.d.mts +20 -0
- package/dist/cli/route/drift-detect.d.mts.map +1 -0
- package/dist/cli/route/drift-detect.mjs +107 -0
- package/dist/cli/route/drift-detect.mjs.map +1 -0
- package/dist/cli/task/index-md.d.mts.map +1 -1
- package/dist/cli/task/index-md.mjs +14 -2
- package/dist/cli/task/index-md.mjs.map +1 -1
- package/dist/cli/util/aperant-section.d.mts +34 -0
- package/dist/cli/util/aperant-section.d.mts.map +1 -0
- package/dist/cli/util/aperant-section.mjs +127 -0
- package/dist/cli/util/aperant-section.mjs.map +1 -0
- package/dist/cli/util/copy.d.mts +28 -1
- package/dist/cli/util/copy.d.mts.map +1 -1
- package/dist/cli/util/copy.mjs +43 -55
- package/dist/cli/util/copy.mjs.map +1 -1
- package/dist/cli/util/semver.d.mts +17 -0
- package/dist/cli/util/semver.d.mts.map +1 -0
- package/dist/cli/util/semver.mjs +29 -0
- package/dist/cli/util/semver.mjs.map +1 -0
- package/dist/cli/util/skill-installs.d.mts +65 -9
- package/dist/cli/util/skill-installs.d.mts.map +1 -1
- package/dist/cli/util/skill-installs.mjs +130 -21
- package/dist/cli/util/skill-installs.mjs.map +1 -1
- package/dist/cli/util/version-preflight.d.mts +44 -0
- package/dist/cli/util/version-preflight.d.mts.map +1 -0
- package/dist/cli/util/version-preflight.mjs +66 -0
- package/dist/cli/util/version-preflight.mjs.map +1 -0
- package/dist/plugin/.claude-plugin/plugin.json +11 -2
- package/dist/plugin/agents/apt-improver.md +99 -0
- package/dist/plugin/agents/apt-planner.md +127 -10
- package/dist/plugin/agents/apt-pr-review-fixer.md +13 -9
- package/dist/plugin/skills/apt/SKILL.md +1 -0
- package/dist/plugin/skills/apt-close-task/SKILL.md +63 -1
- package/dist/plugin/skills/apt-debug/SKILL.md +39 -6
- package/dist/plugin/skills/apt-debug/appendices/diagnose-discipline.md +119 -0
- package/dist/plugin/skills/apt-diagram/SKILL.md +378 -0
- package/dist/plugin/skills/apt-diagram/appendices/design-discipline.md +97 -0
- package/dist/plugin/skills/apt-discuss/SKILL.md +72 -5
- package/dist/plugin/skills/apt-discuss/appendices/grill-discipline.md +104 -0
- package/dist/plugin/skills/apt-discuss/appendices/zoom-out-helper.md +79 -0
- package/dist/plugin/skills/apt-execute/SKILL.md +57 -5
- package/dist/plugin/skills/apt-execute/appendices/tdd-mode.md +107 -0
- package/dist/plugin/skills/apt-improve/DEEPENING.md +84 -0
- package/dist/plugin/skills/apt-improve/INTERFACE-DESIGN.md +97 -0
- package/dist/plugin/skills/apt-improve/LANGUAGE.md +104 -0
- package/dist/plugin/skills/apt-improve/SKILL.md +141 -0
- package/dist/plugin/skills/apt-plan/SKILL.md +171 -4
- package/dist/plugin/skills/apt-plan/adapters/conductor.md +98 -0
- package/dist/plugin/skills/apt-pr-review/SKILL.md +57 -18
- package/dist/plugin/skills/apt-prototype/LOGIC.md +109 -0
- package/dist/plugin/skills/apt-prototype/SKILL.md +143 -0
- package/dist/plugin/skills/apt-prototype/UI.md +90 -0
- package/dist/plugin/skills/apt-quick/SKILL.md +49 -8
- package/dist/plugin/skills/apt-release-notes/SKILL.md +193 -0
- package/dist/plugin/skills/apt-release-notes/appendices/persona-voice.md +59 -0
- package/dist/plugin/skills/apt-review/SKILL.md +2 -0
- package/dist/plugin/skills/apt-run/SKILL.md +32 -4
- package/dist/plugin/skills/apt-setup/SKILL.md +308 -6
- package/dist/plugin/skills/apt-ship/SKILL.md +122 -1
- package/dist/plugin/skills/apt-spar/SKILL.md +315 -0
- package/dist/plugin/skills/apt-triage/AGENT-BRIEF.md +84 -0
- package/dist/plugin/skills/apt-triage/OUT-OF-SCOPE.md +75 -0
- package/dist/plugin/skills/apt-triage/SKILL.md +169 -0
- package/dist/plugin/skills/apt-update/SKILL.md +77 -10
- package/dist/plugin/skills/apt-verify/SKILL.md +3 -0
- package/dist/plugin/skills/apt-verify-proof/SKILL.md +10 -5
- package/dist/plugin/skills/apt-watch-ci/SKILL.md +166 -0
- package/dist/plugin/skills/apt-zoom-out/SKILL.md +130 -0
- package/package.json +133 -133
- package/prompts/conductor-framework-context.md +63 -0
- package/prompts/conductor-system.md +11 -0
- package/skills/apt-close-task/SKILL.md +6 -0
- package/skills/apt-discuss/SKILL.md +47 -5
- package/skills/apt-execute/SKILL.md +9 -0
- package/skills/apt-plan/SKILL.md +12 -0
- package/skills/apt-pr-review/SKILL.md +11 -2
- package/skills/apt-quick/SKILL.md +19 -8
- package/skills/apt-researcher.md +1 -0
- package/skills/apt-setup/SKILL.md +33 -2
- package/skills/apt-ship/SKILL.md +16 -4
- package/skills/apt-spar/SKILL.md +36 -11
- package/skills/apt-update/SKILL.md +26 -1
- package/skills/apt-verify-proof/SKILL.md +7 -5
- package/skills/apt-watch-ci/SKILL.md +4 -1
- package/src/cli/ci-watch/stop-matrix.mjs +17 -0
- package/src/cli/commands/ci-watch.mjs +152 -3
- package/src/cli/commands/features-audit.mjs +164 -5
- package/src/cli/commands/health-check.mjs +116 -3
- package/src/cli/commands/init.mjs +154 -6
- package/src/cli/commands/modes.mjs +11 -0
- package/src/cli/commands/pr-review-audit-fixer.mjs +18 -5
- package/src/cli/commands/route.mjs +38 -2
- package/src/cli/commands/task.mjs +132 -5
- package/src/cli/commands/validate-evidence.mjs +158 -17
- package/src/cli/commands/vitest-doctor.mjs +173 -0
- package/src/cli/config/gitignore-drift.mjs +74 -3
- package/src/cli/config/load.mjs +188 -2
- package/src/cli/consistency/parse-review.mjs +6 -0
- package/src/cli/dispatch.mjs +23 -2
- package/src/cli/gate/gates/gitignore-in-sync.mjs +5 -2
- package/src/cli/gate/gates/review-clean.mjs +24 -19
- package/src/cli/gate/gates/verify-approved.mjs +97 -14
- package/src/cli/help.mjs +8 -2
- package/src/cli/host/detect.mjs +135 -0
- package/src/cli/install/legacy-paths.mjs +69 -0
- package/src/cli/install/runtime-detect.mjs +9 -0
- package/src/cli/install/runtime-migrate.mjs +252 -0
- package/src/cli/route/drift-detect.mjs +107 -0
- package/src/cli/task/index-md.mjs +15 -2
- package/src/cli/util/aperant-section.mjs +136 -0
- package/src/cli/util/copy.mjs +43 -56
- package/src/cli/util/semver.mjs +28 -0
- package/src/cli/util/skill-installs.mjs +134 -21
- package/src/cli/util/version-preflight.mjs +65 -0
- package/templates/aperant-claude-md-appendix.md +37 -0
- package/templates/config.json +2 -7
- package/workflows/verify-proof.md +8 -3
|
@@ -17,7 +17,7 @@ execution_modes:
|
|
|
17
17
|
- step
|
|
18
18
|
- research
|
|
19
19
|
allowed-tools: "Bash, Read, Grep, Glob, Write"
|
|
20
|
-
argument-hint: "apt:discuss [--brainstorm] [topic]"
|
|
20
|
+
argument-hint: "apt:discuss [--brainstorm] [--grill] [topic]"
|
|
21
21
|
gates: []
|
|
22
22
|
---
|
|
23
23
|
<objective>
|
|
@@ -46,6 +46,31 @@ never by asking:
|
|
|
46
46
|
These are two postures of the same skill, not two different skills. The
|
|
47
47
|
intent-detection step below decides which one to enter — same file, same
|
|
48
48
|
artifact layout, different section populated.
|
|
49
|
+
|
|
50
|
+
**Decision-lock posture loader (Pocock adoption ID-02 + ID-04 — AC11).**
|
|
51
|
+
When entering decision-lock posture, you MUST load
|
|
52
|
+
`appendices/grill-discipline.md` into reasoning context. It carries the
|
|
53
|
+
validated 100-token reframe sentence ("Your job is not to emit a plan;
|
|
54
|
+
your job is to resolve the design tree until planning is mechanical.")
|
|
55
|
+
and the autonomy-aware degradation table (Autonomy 1 grills everything;
|
|
56
|
+
Autonomy 2 batches recommendations; Autonomy 3 auto-locks with three
|
|
57
|
+
escalation triggers — conflict with prior locked decision, critical-path
|
|
58
|
+
file touched, or no defensible default). This appendix is the canonical
|
|
59
|
+
source for the autonomy-aware rule; downstream skills (`apt:improve`,
|
|
60
|
+
`apt:triage`) reference it rather than re-stating the policy. Brainstorm
|
|
61
|
+
posture does NOT load this appendix.
|
|
62
|
+
|
|
63
|
+
**Brainstorm posture zoom-out helper (Pocock adoption AC6 + AC11).**
|
|
64
|
+
When in brainstorm posture and the user's turn contains a zoom-out
|
|
65
|
+
trigger phrase ("give me a broader picture", "I'm lost in this area",
|
|
66
|
+
"explain how this fits", "what's the surrounding architecture", "zoom
|
|
67
|
+
out from X"), load `appendices/zoom-out-helper.md` and follow its
|
|
68
|
+
3-6-line compressed orientation pattern. The brainstorm posture stays
|
|
69
|
+
active — this is an augmentation, not a pivot. The full router-invocable
|
|
70
|
+
`/apt:zoom-out` skill is the right answer when the user invokes it
|
|
71
|
+
explicitly; this helper is the right answer when the request surfaces
|
|
72
|
+
inside an active brainstorm discussion. Decision-lock posture does NOT
|
|
73
|
+
load this helper (orientation is descriptive, not normative).
|
|
49
74
|
</objective>
|
|
50
75
|
|
|
51
76
|
<your_environment>
|
|
@@ -158,10 +183,11 @@ If any file is missing, proceed with what's available. The framework works with
|
|
|
158
183
|
Extract the task description from `$ARGUMENTS`:
|
|
159
184
|
|
|
160
185
|
1. Strip mode flags (`--assumptions`, `--power`, `--auto`, `--review-auto`, `--continue`) from arguments
|
|
161
|
-
2.
|
|
162
|
-
3.
|
|
163
|
-
4. If
|
|
164
|
-
5.
|
|
186
|
+
2. Strip the **`--grill`** overlay flag from arguments (orthogonal to the mode flags — see Section 6.5). `--grill` may combine with any mode; standalone `--grill` defaults to Interactive.
|
|
187
|
+
3. The remaining text is the task description
|
|
188
|
+
4. If task description is empty but `state.json` has an `active_task`, use that task's description
|
|
189
|
+
5. If still empty, ask: "What are you working on?"
|
|
190
|
+
6. Generate a `task-id` slug from the description: lowercase, hyphens, max 40 characters
|
|
165
191
|
- Example: "Add OAuth login with Google" -> `add-oauth-login-with-google`
|
|
166
192
|
|
|
167
193
|
## 3.5. Brainstorm (skip if you picked decision-lock in Section 1)
|
|
@@ -539,6 +565,47 @@ Review-Auto is Auto Mode **plus one human checkpoint at the batch end**. It does
|
|
|
539
565
|
|
|
540
566
|
Do NOT introduce per-decision staging ("show me D-01, wait, show me D-02, wait...") — that collapses review-auto into spaced interactive mode and defeats the point of joint reasoning up front. Do NOT skip the pause ("autonomy is high, let's just write it") — that collapses review-auto into auto. The one pause at the end is the whole identity of this mode.
|
|
541
567
|
|
|
568
|
+
## 6.5. Grill Mode (`--grill` flag — Pocock `grill-with-docs` overlay)
|
|
569
|
+
|
|
570
|
+
**Activate when:** the user invoked the skill with `--grill`. This is an **overlay**, not a mode — it stacks on top of whichever Section 6 mode is active (Interactive by default; combine with `--auto` etc. as desired). The overlay does two things: (1) it applies Pocock's 4 grill moves during decision resolution; (2) it fires inline writes to CONTEXT.md and ADRs as terms resolve and decisions pass the Nygard 3-gate.
|
|
571
|
+
|
|
572
|
+
The discipline this overlay loads is already in [`appendices/grill-discipline.md`](./appendices/grill-discipline.md) — re-read the reframe sentence and the autonomy degradation table before each grill turn. **Do NOT duplicate that content here.** What follows is only the moves + writer-call instructions specific to the overlay.
|
|
573
|
+
|
|
574
|
+
### The 4 grill moves (apply during gray-area resolution)
|
|
575
|
+
|
|
576
|
+
1. **Challenge against the glossary.** When the user uses a term that conflicts with an existing CONTEXT.md term-block, call it out immediately: *"Your glossary defines 'cancellation' as X, but you seem to mean Y — which is it?"* Read `CONTEXT.md` (or per-context CONTEXT files via `CONTEXT-MAP.md`) when the overlay activates; skip silently if absent.
|
|
577
|
+
2. **Sharpen fuzzy language.** When the user uses vague or overloaded terms, propose a precise canonical term: *"You're saying 'account' — do you mean Customer or User? Those are different things."*
|
|
578
|
+
3. **Stress-test with concrete scenarios.** When domain relationships are being discussed, invent specific scenarios that probe edge cases and force precision about the boundaries between concepts.
|
|
579
|
+
4. **Cross-reference with code.** When the user states how something works, check whether the code agrees. If you find a contradiction, surface it: *"Your code cancels entire Orders, but you just said partial cancellation is possible — which is right?"*
|
|
580
|
+
|
|
581
|
+
### Inline writer calls (NOT batched)
|
|
582
|
+
|
|
583
|
+
When a term resolves with confidence during the grill, invoke `apt-tools context write` to upsert the term-block into CONTEXT.md **right there** — do NOT batch:
|
|
584
|
+
|
|
585
|
+
```bash
|
|
586
|
+
node .aperant/deps/node_modules/@aperant/framework/bin/apt-tools.mjs context write . \
|
|
587
|
+
--term "Plan thread" \
|
|
588
|
+
--definition "<one-line definition>" \
|
|
589
|
+
--aliases-to-avoid "Plan session,plan chat" \
|
|
590
|
+
--cardinality "one-to-many"
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
**Lazy creation:** if no `CONTEXT.md` exists at the project root (or in the relevant per-context directory when `CONTEXT-MAP.md` is present), the first resolved term creates the file. Do NOT create CONTEXT.md upfront with placeholder content.
|
|
594
|
+
|
|
595
|
+
**Glossary-only rule:** CONTEXT.md is a glossary of domain terms — NO implementation details, NO spec content, NO scratch-pad notes. Implementation lives in `spec.md` / `implementation_plan.json`; scratch lives in `.aperant/context/notes/{task-id}.md`. Term-blocks are user-facing concepts (e.g. "Plan thread", "Sparring round"), not code identifiers (e.g. "ChatSession", "useTaskStore").
|
|
596
|
+
|
|
597
|
+
When a decision passes the **Nygard 3-gate**, offer to write an ADR via `apt-tools adr write .`. The 3-gate (ALL three must hold — miss one and skip the ADR):
|
|
598
|
+
|
|
599
|
+
1. **Hard to reverse** — the cost of changing your mind later is meaningful.
|
|
600
|
+
2. **Surprising without context** — a future reader will wonder *"why did they do it this way?"*.
|
|
601
|
+
3. **Result of a real trade-off** — there were genuine alternatives and you picked one for specific reasons.
|
|
602
|
+
|
|
603
|
+
If only one or two hold, the decision belongs in `.aperant/context/notes/{task-id}.md` (locked-decisions list), not in an ADR.
|
|
604
|
+
|
|
605
|
+
### Autonomy interaction
|
|
606
|
+
|
|
607
|
+
`--grill` does not change the autonomy degradation already specified in [`appendices/grill-discipline.md`](./appendices/grill-discipline.md). Autonomy 1 grills every term/decision interactively; Autonomy 2 batches recommendations; Autonomy 3 auto-locks with the three escalation triggers (conflict-with-locked, critical-path file, no-defensible-default). The overlay simply ensures that whichever autonomy path runs, the writer CLIs fire as side-effects of the resolution work.
|
|
608
|
+
|
|
542
609
|
## 7. Advanced Elicitation (DEEP Tasks Only)
|
|
543
610
|
|
|
544
611
|
After all decisions are locked, check the task track. If the track is DEEP (from state.json or router context), behavior depends on the resolved mode from Section 6's precedence chain (D-07):
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Adapted from Matt Pocock's MIT-licensed skill suite:
|
|
3
|
+
https://github.com/mattpocock/skills/blob/main/skills/engineering/grill-with-docs
|
|
4
|
+
Licensed under MIT. Modifications: ported as an apt:discuss posture loader,
|
|
5
|
+
extended with the validated 100-token reframe sentence and the
|
|
6
|
+
autonomy-aware degradation table from the Pocock adoption brainstorm
|
|
7
|
+
(Architectural principles to lock §2).
|
|
8
|
+
-->
|
|
9
|
+
|
|
10
|
+
# Grill Discipline — apt:discuss posture loader
|
|
11
|
+
|
|
12
|
+
This appendix loads into `apt:discuss`'s reasoning context whenever the
|
|
13
|
+
skill is invoked in decision-lock posture (or as a sub-step inside
|
|
14
|
+
`apt:improve` / `apt:triage`'s grill loop). It carries two load-bearing
|
|
15
|
+
artifacts:
|
|
16
|
+
|
|
17
|
+
1. The 100-token **reframe sentence** validated by the V2 grill-comparison
|
|
18
|
+
experiment (43/44 vs 38/44 blind-judge score against Pocock's verbatim
|
|
19
|
+
`grill-with-docs`).
|
|
20
|
+
2. The **autonomy-aware degradation table** that prevents full-auto runs
|
|
21
|
+
from grinding to a halt grilling every gray area.
|
|
22
|
+
|
|
23
|
+
## The reframe sentence (validated, 43/44 vs 38/44)
|
|
24
|
+
|
|
25
|
+
> **Your job is not to emit a plan; your job is to resolve the design
|
|
26
|
+
> tree until planning is mechanical.**
|
|
27
|
+
|
|
28
|
+
This sentence is the *first thing* you load into your reasoning context
|
|
29
|
+
when entering decision-lock posture. It does two things at once:
|
|
30
|
+
|
|
31
|
+
- It refuses the "I'll just emit a plan and let the executor figure
|
|
32
|
+
out the gaps" anti-pattern. Plans with unresolved gray areas push the
|
|
33
|
+
cost into execution where rollbacks are 10× more expensive.
|
|
34
|
+
- It frames the goal as *resolving a design tree*, not *answering a
|
|
35
|
+
questionnaire*. The interview-style "ask the user 47 clarifying
|
|
36
|
+
questions" is the failure mode this reframe blocks.
|
|
37
|
+
|
|
38
|
+
The empirical V1 + V2 evidence is in
|
|
39
|
+
`.aperant/experiments/grill-comparison-20260513/SUMMARY-FOR-AGENT-REVIEW.md`.
|
|
40
|
+
|
|
41
|
+
## Autonomy-aware degradation table (load-bearing)
|
|
42
|
+
|
|
43
|
+
The grill discipline runs at every autonomy level — the *interaction
|
|
44
|
+
shape* degrades, not the discipline itself. This is the canonical
|
|
45
|
+
source for this rule; new skills (apt:improve, apt:triage) reference
|
|
46
|
+
THIS table rather than re-stating the policy.
|
|
47
|
+
|
|
48
|
+
| Autonomy | Mode | Behavior |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| **1 (Supervised)** | Grill everything | Ask the user for every load-bearing decision. The user reviews each Q&A turn before the next one fires. |
|
|
51
|
+
| **2 (Balanced / Semi)** | Batch-recommend | Auto-recommend per decision; collect all recommendations into a single batch the user reviews at the end. This is the existing `--review-auto` pattern. |
|
|
52
|
+
| **3 (Full auto / YOLO)** | Auto-lock with escalation triggers | Auto-recommend and lock decisions silently. Escalate to the user only when one of THREE triggers fires (below). |
|
|
53
|
+
|
|
54
|
+
## The three escalation triggers (Autonomy 3 only)
|
|
55
|
+
|
|
56
|
+
At Autonomy 3, the agent locks recommendations silently — **EXCEPT** when:
|
|
57
|
+
|
|
58
|
+
1. **Conflict with a prior locked decision.** The new recommendation
|
|
59
|
+
contradicts a decision already written to
|
|
60
|
+
`.aperant/context/notes/{task-id}.md` (or any other notes file under
|
|
61
|
+
`.aperant/context/notes/`). Re-litigating a locked decision needs
|
|
62
|
+
human sign-off.
|
|
63
|
+
2. **Critical-path file touched.** The decision's downstream effect
|
|
64
|
+
modifies a file matching a glob in
|
|
65
|
+
`.aperant/config.json.risk_map.critical_paths` (e.g., auth, billing,
|
|
66
|
+
migration paths). Critical-path changes always escalate at every
|
|
67
|
+
autonomy level — this trigger is the autonomy-3 surface for the same
|
|
68
|
+
policy.
|
|
69
|
+
3. **No defensible default exists.** Neither AGENTS.md nor an existing
|
|
70
|
+
codebase pattern provides a defensible answer. "Just pick one" is
|
|
71
|
+
not a defensible default; the agent must say "I see two viable
|
|
72
|
+
paths and no precedent — which do you want?"
|
|
73
|
+
|
|
74
|
+
These three triggers cover the cases where a silent auto-lock would
|
|
75
|
+
cause real harm. Everything else gets locked, logged, and surfaced in
|
|
76
|
+
the final report only — not as a blocking prompt.
|
|
77
|
+
|
|
78
|
+
## Practical consequence for new skills
|
|
79
|
+
|
|
80
|
+
When `apt:improve`'s deepening loop, `apt:triage`'s priority resolution,
|
|
81
|
+
or any other agent reaches a gray area:
|
|
82
|
+
|
|
83
|
+
- It loads THIS appendix into reasoning context.
|
|
84
|
+
- It reads the current autonomy from `.aperant/config.json` (or the
|
|
85
|
+
per-task autonomy from `apt-tools task get`).
|
|
86
|
+
- It enters the matching row of the degradation table.
|
|
87
|
+
- At Autonomy 3, it walks the three triggers before deciding to lock or
|
|
88
|
+
escalate.
|
|
89
|
+
|
|
90
|
+
The "ask first vs lock first" decision is NOT a per-skill policy.
|
|
91
|
+
Reasoning lives here; every grill-loop-bearing skill references it.
|
|
92
|
+
|
|
93
|
+
## When NOT to load this appendix
|
|
94
|
+
|
|
95
|
+
This appendix is for **decision-lock** posture (convergent discussion
|
|
96
|
+
where the user has a concrete task with implicit gray areas). The
|
|
97
|
+
**brainstorm** posture (divergent — user has a rough vision, exploring
|
|
98
|
+
options) does NOT load this appendix; brainstorm has its own posture
|
|
99
|
+
encoded in apt:discuss's `<objective>` block.
|
|
100
|
+
|
|
101
|
+
`apt:zoom-out` (a sibling skill, also Pocock-adopted) does NOT load
|
|
102
|
+
this appendix. Zoom-out is descriptive ("show me the broader picture"),
|
|
103
|
+
not normative ("lock this decision"). Loading grill-discipline there
|
|
104
|
+
would mis-fire the reframe sentence on a read-only operation.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Adapted from Matt Pocock's MIT-licensed skill suite:
|
|
3
|
+
https://github.com/mattpocock/skills/blob/main/skills/engineering/zoom-out
|
|
4
|
+
Licensed under MIT. Modifications: ported as a loaded-helper for apt:discuss
|
|
5
|
+
brainstorm mode so the discipline activates without spawning the full
|
|
6
|
+
apt:zoom-out skill (the latter is a router-invocable verb on its own).
|
|
7
|
+
-->
|
|
8
|
+
|
|
9
|
+
# Zoom-Out Helper — apt:discuss brainstorm mode loaded helper
|
|
10
|
+
|
|
11
|
+
This appendix loads into `apt:discuss` brainstorm mode when the user's
|
|
12
|
+
turn contains a zoom-out trigger phrase. The full
|
|
13
|
+
`/apt:zoom-out` skill (router-invocable) is the right answer when the
|
|
14
|
+
user invokes it explicitly; this helper is the right answer when the
|
|
15
|
+
zoom-out request surfaces *inside* a brainstorm discussion.
|
|
16
|
+
|
|
17
|
+
## When to load this appendix
|
|
18
|
+
|
|
19
|
+
Inside an active `apt:discuss --brainstorm` session, if the user's turn
|
|
20
|
+
contains any of these phrases (or their natural-language variants):
|
|
21
|
+
|
|
22
|
+
- "give me a broader picture"
|
|
23
|
+
- "I'm lost in this area"
|
|
24
|
+
- "explain how this fits"
|
|
25
|
+
- "what's the surrounding architecture"
|
|
26
|
+
- "zoom out from {topic}"
|
|
27
|
+
|
|
28
|
+
…load this appendix into reasoning context and follow the helper
|
|
29
|
+
process below. The brainstorm posture stays active — you don't pivot
|
|
30
|
+
out of `apt:discuss`; you augment its reasoning with the orientation
|
|
31
|
+
discipline.
|
|
32
|
+
|
|
33
|
+
## Process (helper mode, not full skill)
|
|
34
|
+
|
|
35
|
+
1. **Identify the area.** Pull the noun phrase from the user's message
|
|
36
|
+
(e.g., "the sparring engine"). If ambiguous, ask a single targeted
|
|
37
|
+
clarifying question — do NOT enter a 20-question interview.
|
|
38
|
+
|
|
39
|
+
2. **Load CONTEXT.md term-blocks if matching.** Same as the full
|
|
40
|
+
`apt:zoom-out` skill: if the area name matches a term or alias in
|
|
41
|
+
`CONTEXT.md`, pre-load that term-block's definition + flagged
|
|
42
|
+
ambiguities into the orientation.
|
|
43
|
+
|
|
44
|
+
3. **Emit a compressed orientation INLINE in the discussion.** Format:
|
|
45
|
+
|
|
46
|
+
> **Purpose:** {one sentence}
|
|
47
|
+
> **Entry points:** `{file1}`, `{file2}`
|
|
48
|
+
> **State owners:** `{file3}` ({what state})
|
|
49
|
+
> **External boundaries:** `{file4}` ({what external})
|
|
50
|
+
> **Watch out for:** {one-line fragile area}
|
|
51
|
+
|
|
52
|
+
Three to six lines. The full one-page `apt:zoom-out` report is
|
|
53
|
+
overkill when the user is mid-discussion — they want enough context
|
|
54
|
+
to keep brainstorming, not a separate artifact.
|
|
55
|
+
|
|
56
|
+
4. **Resume brainstorm posture.** After the orientation block, ask:
|
|
57
|
+
"Want me to keep zooming, lock a decision, or stay in brainstorm?"
|
|
58
|
+
so the user explicitly drives whether to deepen.
|
|
59
|
+
|
|
60
|
+
## When NOT to load this appendix
|
|
61
|
+
|
|
62
|
+
- In decision-lock posture (the user wants to *resolve* a decision, not
|
|
63
|
+
*orient* themselves) — load `grill-discipline.md` instead.
|
|
64
|
+
- When the user explicitly types `/apt:zoom-out` — they invoked the
|
|
65
|
+
full skill; let that skill run unmodified.
|
|
66
|
+
- In `apt:plan` — the planner's Phase-0 codebase investigation already
|
|
67
|
+
covers orientation. Loading this helper there would duplicate work.
|
|
68
|
+
|
|
69
|
+
## Relationship to the full apt:zoom-out skill
|
|
70
|
+
|
|
71
|
+
| | `apt:discuss + zoom-out-helper` | `/apt:zoom-out` (full skill) |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| Invocation | Detected mid-brainstorm | User-explicit verb |
|
|
74
|
+
| Output | 3-6 line inline orientation | One-page report |
|
|
75
|
+
| Side effects | None | None (read-only) |
|
|
76
|
+
| Posture after | Brainstorm continues | Skill exits — no continuation |
|
|
77
|
+
|
|
78
|
+
Same underlying discipline; different surface shapes for different
|
|
79
|
+
work contexts.
|
|
@@ -15,11 +15,14 @@ execution_modes:
|
|
|
15
15
|
- auto
|
|
16
16
|
- step
|
|
17
17
|
allowed-tools: "Read, Write, Edit, Bash, Grep, Glob"
|
|
18
|
-
argument-hint: "apt:execute [--continue]"
|
|
18
|
+
argument-hint: "apt:execute [--continue] [--subtask <id>] [--parallel] [--wave <N>] [--tdd] [--no-tdd]"
|
|
19
19
|
gates:
|
|
20
20
|
- constitution-read
|
|
21
21
|
- constitution-coverage
|
|
22
22
|
- plan-exists
|
|
23
|
+
config_keys:
|
|
24
|
+
- coding.tdd_default
|
|
25
|
+
- tdd.iron_law
|
|
23
26
|
---
|
|
24
27
|
<objective>
|
|
25
28
|
Read an implementation plan, iterate through subtasks, implement each one with atomic commits, and track progress. Supports both sequential (default) and wave-parallel execution modes.
|
|
@@ -79,6 +82,8 @@ When `/apt:execute` spawns ANY subagent (executor, wave workers, post-subtask re
|
|
|
79
82
|
| `--subtask <id>` | Jump to a specific subtask (skip dependency check — user override) |
|
|
80
83
|
| `--parallel` | Force wave-parallel mode even if `parallelization.enabled` is false in config |
|
|
81
84
|
| `--wave <N>` | Execute only wave N (implies wave mode). Useful for pacing or quota management |
|
|
85
|
+
| `--tdd` | Activate the vertical-tracer-bullet TDD discipline for this run (gates `<tdd_iron_law>`). Inverse of `--no-tdd`. Hard-exempt on QUICK tasks per Fast Path Guarantee (ID-05). |
|
|
86
|
+
| `--no-tdd` | Deactivate TDD even if `coding.tdd_default: true` is set in config. |
|
|
82
87
|
</arguments>
|
|
83
88
|
|
|
84
89
|
<process>
|
|
@@ -134,6 +139,44 @@ Before loading context, determine execution mode:
|
|
|
134
139
|
|
|
135
140
|
4. **If Sequential Mode:** proceed to Section 1 below (existing behavior, unchanged).
|
|
136
141
|
|
|
142
|
+
### 0a.1. TDD Discipline Detection (Pocock adoption AC3)
|
|
143
|
+
|
|
144
|
+
Compute whether the vertical-tracer-bullet TDD discipline is active for
|
|
145
|
+
this run. The `<tdd_iron_law>` block in Section 3c is gated on this
|
|
146
|
+
boolean. Three inputs combine; QUICK is hard-exempt regardless.
|
|
147
|
+
|
|
148
|
+
1. **Read config:** `coding.tdd_default` from `.aperant/config.json`
|
|
149
|
+
(default `false` when absent).
|
|
150
|
+
2. **Read flags:** `--tdd` (force-enable) and `--no-tdd` (force-disable)
|
|
151
|
+
on the command line.
|
|
152
|
+
3. **Read task track** from `apt-tools task get . --id {task-id}` →
|
|
153
|
+
`task.track`. (If unset, fall back to `complexity` field on
|
|
154
|
+
`implementation_plan.json`: `simple` → QUICK, otherwise STANDARD.)
|
|
155
|
+
|
|
156
|
+
Compute `tdd_active` as:
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
if track === "QUICK":
|
|
160
|
+
tdd_active = false # Fast Path Guarantee — ID-05, hard-exempt
|
|
161
|
+
elif --no-tdd flag:
|
|
162
|
+
tdd_active = false # explicit user override
|
|
163
|
+
elif --tdd flag:
|
|
164
|
+
tdd_active = true # explicit user opt-in
|
|
165
|
+
else:
|
|
166
|
+
tdd_active = coding.tdd_default || legacy config.tdd.iron_law === true
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Carry `tdd_active` forward to Section 3c. When `tdd_active === false`,
|
|
170
|
+
the iron-law block is skipped entirely and execute behaves identically
|
|
171
|
+
to the pre-Pocock single-commit flow. When `tdd_active === true`, the
|
|
172
|
+
red-green-refactor sequence is mandatory and audited by gate G9.
|
|
173
|
+
|
|
174
|
+
**The QUICK exemption is a constraint, not a toggle.** A user who passes
|
|
175
|
+
`--tdd` on a QUICK-routed task gets `tdd_active = false` and a one-line
|
|
176
|
+
note in the run report: "TDD requested but skipped — QUICK Fast Path
|
|
177
|
+
Guarantee (ID-05)". The Pocock appendix
|
|
178
|
+
`appendices/tdd-mode.md` carries the rationale.
|
|
179
|
+
|
|
137
180
|
## 1. Load Context
|
|
138
181
|
|
|
139
182
|
1. Read `AGENTS.md` if it exists — extract coding conventions, test requirements, style rules
|
|
@@ -236,11 +279,11 @@ Follow `subtask.description` to implement the changes. Rules:
|
|
|
236
279
|
- Add/update tests if the subtask modifies testable behavior
|
|
237
280
|
- Reference `prompts/coder.md` for coding methodology and environment awareness
|
|
238
281
|
|
|
239
|
-
<tdd_iron_law enabled_when="
|
|
282
|
+
<tdd_iron_law enabled_when="tdd_active === true">
|
|
240
283
|
|
|
241
|
-
**TDD Iron Law — conditional flow.** This block activates ONLY when
|
|
284
|
+
**TDD Iron Law — conditional flow.** This block activates ONLY when `tdd_active === true` (computed in Section 0a.1 from `coding.tdd_default` config, the `--tdd` / `--no-tdd` flags, and the task track). When `tdd_active === false` — including all QUICK-routed tasks regardless of flag or config (Fast Path Guarantee, ID-05) — skip this block entirely and use the single-commit flow above. The legacy `config.tdd.iron_law` config key continues to work and is rolled into `tdd_active` as a backward-compat alias.
|
|
242
285
|
|
|
243
|
-
When
|
|
286
|
+
When the iron law is on, 3c/3d/3e collapses into a strict red-green-refactor sequence with **two commits per subtask**:
|
|
244
287
|
|
|
245
288
|
1. **Write the failing test first.** Identify or create the test file in `subtask.files` (look for `*.test.*` / `*.spec.*`). Add the test that describes the behavior you are about to implement. Do NOT touch implementation files yet.
|
|
246
289
|
2. **Commit the red test.**
|
|
@@ -256,7 +299,7 @@ When `tdd.iron_law` is on, 3c/3d/3e collapses into a strict red-green-refactor s
|
|
|
256
299
|
```
|
|
257
300
|
The audit gate `tdd-iron-law` (G9) fires during `/apt:verify` and asserts this commit order per subtask — a `feat(...)` commit that precedes the matching `test(...)` commit on the same file set is a blocking failure.
|
|
258
301
|
|
|
259
|
-
**Rationalizations to reject** (do NOT take any of these shortcuts when `
|
|
302
|
+
**Rationalizations to reject** (do NOT take any of these shortcuts when `tdd_active` is on):
|
|
260
303
|
|
|
261
304
|
| Rationalization | Counter-rule |
|
|
262
305
|
|---|---|
|
|
@@ -340,11 +383,20 @@ executor commits introduce a new feature surface without registering it.
|
|
|
340
383
|
|
|
341
384
|
```bash
|
|
342
385
|
node packages/framework/bin/apt-tools.mjs features-audit . \
|
|
386
|
+
--task-id "$TASK_ID" \
|
|
343
387
|
--diff-files "$(git diff --name-only HEAD^ HEAD | tr '\n' ',')" \
|
|
344
388
|
--apply-stubs
|
|
345
389
|
```
|
|
346
390
|
|
|
347
391
|
Notes:
|
|
392
|
+
- `--task-id $TASK_ID` (BUG-025b) is mandatory when the executor runs
|
|
393
|
+
from the main-repo cwd instead of inside the worktree (the
|
|
394
|
+
orchestrator's common path). features-audit resolves the worktree's
|
|
395
|
+
`.aperant/features/` from the active task record and writes there,
|
|
396
|
+
preventing generated `*.json` from leaking into main. When invoked
|
|
397
|
+
from the worktree cwd directly, `--task-id` is a no-op (layer 1
|
|
398
|
+
detection short-circuits). Pass `--no-worktree-redirect` only when
|
|
399
|
+
you intentionally want to write to the invoking cwd.
|
|
348
400
|
- `--apply-stubs` only runs when the matched surface's policy is
|
|
349
401
|
`auto-update` (the default for `.aperant/features/*.json`). Users who
|
|
350
402
|
opted out via `/apt:setup` Batch 7 get a no-op — the command still
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Adapted from Matt Pocock's MIT-licensed skill suite:
|
|
3
|
+
https://github.com/mattpocock/skills/blob/main/skills/engineering/tdd
|
|
4
|
+
Licensed under MIT. Modifications: ported as an apt:execute appendix
|
|
5
|
+
gated by `tdd_active` (config.coding.tdd_default || --tdd flag) and
|
|
6
|
+
made QUICK-exempt per Aperant's Fast Path Guarantee (ID-05).
|
|
7
|
+
-->
|
|
8
|
+
|
|
9
|
+
# TDD Mode — Vertical Tracer-Bullet Discipline (apt:execute appendix)
|
|
10
|
+
|
|
11
|
+
This appendix loads into `apt:execute`'s context when `tdd_active === true`
|
|
12
|
+
(see SKILL.md §0a.1). It carries the vertical-tracer-bullet discipline
|
|
13
|
+
Pocock's `tdd` skill captured. The audit gate G9 (`tdd-iron-law`) enforces
|
|
14
|
+
the commit order; this prose explains the **why**.
|
|
15
|
+
|
|
16
|
+
## Why vertical tracer bullets, not horizontal layers
|
|
17
|
+
|
|
18
|
+
A "vertical slice" of TDD means: for each subtask, write one failing
|
|
19
|
+
test that describes the **smallest end-to-end behavior change the user
|
|
20
|
+
will care about**, then implement only enough to make it green.
|
|
21
|
+
Horizontal TDD ("write all the data-layer tests first, then all the
|
|
22
|
+
service tests, then all the UI tests") accumulates dead inventory and
|
|
23
|
+
hides whether the slice actually delivers user value.
|
|
24
|
+
|
|
25
|
+
Concretely:
|
|
26
|
+
|
|
27
|
+
- A vertical-slice subtask titled "Solo dogfooder gets a PRD-shaped
|
|
28
|
+
spec on STANDARD" should commit one `test(plan): STANDARD emits PRD
|
|
29
|
+
shape` red test first — exercising the user-visible behavior — then
|
|
30
|
+
one `feat(plan): branch spec.md on track` green commit. Two commits.
|
|
31
|
+
Done.
|
|
32
|
+
- A horizontal-slice subtask titled "edit apt-plan SKILL.md" gets you a
|
|
33
|
+
test that pins prose, not a test that pins user value. The G9 audit
|
|
34
|
+
will pass technically but the discipline failed.
|
|
35
|
+
|
|
36
|
+
The vertical-slice subtask schema (`user_value` field, mandatory on
|
|
37
|
+
STANDARD/DEEP per AC2) is **upstream** of this discipline — TDD bites
|
|
38
|
+
hardest when the subtask was already framed as user value, not file
|
|
39
|
+
scope.
|
|
40
|
+
|
|
41
|
+
## The five rules of vertical tracer bullets
|
|
42
|
+
|
|
43
|
+
These five rules are the load-bearing discipline; ignoring any one of
|
|
44
|
+
them collapses TDD back into ceremony.
|
|
45
|
+
|
|
46
|
+
1. **Write the failing test from the spec, not from the implementation
|
|
47
|
+
you're about to write.** If you write the test after you mentally
|
|
48
|
+
draft the implementation, the test only pins what you wrote —
|
|
49
|
+
not what the spec required. Read the relevant `acceptance_criteria`
|
|
50
|
+
id-ref, then write a test that fails because that AC isn't met yet.
|
|
51
|
+
|
|
52
|
+
2. **Verify the test fails for the *right reason*.** A `ReferenceError`
|
|
53
|
+
because the function doesn't exist yet is not the same as the
|
|
54
|
+
assertion failing on a value mismatch. The G9 audit treats any
|
|
55
|
+
non-zero exit as RED, but the discipline demands you check the
|
|
56
|
+
failure mode is "behavior wrong", not "code shape wrong".
|
|
57
|
+
|
|
58
|
+
3. **Implement the minimum to turn the test green.** No speculative
|
|
59
|
+
abstractions. No "while I'm here, I'll refactor X." The vertical
|
|
60
|
+
slice is one test + one minimum impl. Refactor lives in a follow-up
|
|
61
|
+
subtask with its own test.
|
|
62
|
+
|
|
63
|
+
4. **Commit the test before the implementation.** This is the iron-law
|
|
64
|
+
commit order audit gate G9 enforces. A `feat(...)` commit that
|
|
65
|
+
precedes the matching `test(...)` commit on the same file set is a
|
|
66
|
+
blocking failure at `/apt:verify`.
|
|
67
|
+
|
|
68
|
+
5. **Don't grow the test surface to cover edge cases the spec didn't
|
|
69
|
+
list.** Edge cases are subtasks of their own (with their own AC
|
|
70
|
+
id-refs). The vertical-slice rule applies recursively: each edge
|
|
71
|
+
case is a new tracer bullet through the whole stack, not a wider
|
|
72
|
+
suite of tests for the same slice.
|
|
73
|
+
|
|
74
|
+
## Fast Path Guarantee — QUICK is hard-exempt
|
|
75
|
+
|
|
76
|
+
`tdd_active` is forced `false` when the task's track is `"QUICK"`,
|
|
77
|
+
regardless of flag or config. The rationale: QUICK is the one-shot
|
|
78
|
+
fast path for trivial fixes (typo, copy change, single-line config
|
|
79
|
+
update). Forcing TDD ceremony on those tasks violates the Fast Path
|
|
80
|
+
Guarantee (ID-05) — the user opted into speed, not discipline. If a
|
|
81
|
+
QUICK-routed task genuinely needs TDD, the right move is to re-route
|
|
82
|
+
it as STANDARD via `/apt:plan` (which the router will do for any task
|
|
83
|
+
with >1 file or >30 words of description).
|
|
84
|
+
|
|
85
|
+
The skill body emits a one-line note in the run report when `--tdd`
|
|
86
|
+
was passed on a QUICK task: "TDD requested but skipped — QUICK Fast
|
|
87
|
+
Path Guarantee (ID-05)". This is intentional surface — the user sees
|
|
88
|
+
that their flag was overridden by the constraint.
|
|
89
|
+
|
|
90
|
+
## Backward-compat alias
|
|
91
|
+
|
|
92
|
+
The legacy `config.tdd.iron_law` key continues to enable TDD for
|
|
93
|
+
projects that adopted Aperant before the Pocock content-format
|
|
94
|
+
upgrade. The new computation rolls it into `tdd_active`:
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
tdd_active = (
|
|
98
|
+
(--tdd flag) ||
|
|
99
|
+
(coding.tdd_default === true) ||
|
|
100
|
+
(config.tdd.iron_law === true)
|
|
101
|
+
)
|
|
102
|
+
&& (track !== "QUICK")
|
|
103
|
+
&& !(--no-tdd flag)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
The two config keys (`coding.tdd_default` and `tdd.iron_law`) coexist
|
|
107
|
+
without conflict; either set to `true` enables TDD by default.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Adapted from Matt Pocock's MIT-licensed skill suite:
|
|
3
|
+
https://github.com/mattpocock/skills/blob/main/skills/engineering/improve-codebase-architecture/DEEPENING.md
|
|
4
|
+
Licensed under MIT. Modifications: scoped to Aperant's apt:improve
|
|
5
|
+
Phase-1 explore step and aligned with the deletion-test priority
|
|
6
|
+
rubric in Phase 2.
|
|
7
|
+
-->
|
|
8
|
+
|
|
9
|
+
# DEEPENING — Domain-modeling depth lens
|
|
10
|
+
|
|
11
|
+
This lens asks: **does this area model the domain at the right depth?**
|
|
12
|
+
Are the abstractions earning their keep, or are they shallow wrappers
|
|
13
|
+
hiding nothing?
|
|
14
|
+
|
|
15
|
+
The discipline is to **find abstractions that have failed to deepen** —
|
|
16
|
+
classes, modules, or types that started as a single-use convenience and
|
|
17
|
+
never grew into something that captures domain meaning.
|
|
18
|
+
|
|
19
|
+
## What "deep" means
|
|
20
|
+
|
|
21
|
+
A deep abstraction:
|
|
22
|
+
|
|
23
|
+
- Has a name that maps to a domain concept the user / business cares
|
|
24
|
+
about
|
|
25
|
+
- Encapsulates more behavior than its interface suggests (you can call
|
|
26
|
+
one method and trust it to handle multiple internal concerns)
|
|
27
|
+
- Reads naturally in client code without the reader needing to know
|
|
28
|
+
the abstraction's internals
|
|
29
|
+
|
|
30
|
+
A shallow abstraction:
|
|
31
|
+
|
|
32
|
+
- Has a name that mirrors implementation detail rather than domain
|
|
33
|
+
concept (e.g., `DataManager`, `Helper`, `Utils`)
|
|
34
|
+
- Encapsulates almost no behavior — the interface is wider than the
|
|
35
|
+
internals (mostly pass-through)
|
|
36
|
+
- Reads as noise in client code; the reader has to look inside the
|
|
37
|
+
abstraction to know what it does
|
|
38
|
+
|
|
39
|
+
## Red flags this lens surfaces
|
|
40
|
+
|
|
41
|
+
- **Anemic types** — types that are bags of fields with no methods, OR
|
|
42
|
+
classes with methods that just return fields.
|
|
43
|
+
- **Pass-through wrappers** — `class FooService { constructor(api) { this.api = api } create(x) { return this.api.create(x) } }` adds nothing.
|
|
44
|
+
- **Single-call-site abstractions** — extracted "for reuse" but only
|
|
45
|
+
called from one place. Inline them.
|
|
46
|
+
- **God objects** — abstractions that grew too deep AND too wide,
|
|
47
|
+
collecting unrelated responsibilities. Different problem, same lens.
|
|
48
|
+
|
|
49
|
+
## Apply in Phase 1
|
|
50
|
+
|
|
51
|
+
When the explore step scans the named area:
|
|
52
|
+
|
|
53
|
+
1. For each module / class / type, ask: "what domain concept does this
|
|
54
|
+
model?"
|
|
55
|
+
2. If the answer is "none — it's an implementation detail dressed up as
|
|
56
|
+
a concept", flag it as a candidate.
|
|
57
|
+
3. Note in the inventory: `{File}:{Symbol} — shallow ({reason})`. The
|
|
58
|
+
deletion test in Phase 2 will rank these.
|
|
59
|
+
|
|
60
|
+
## What this lens does NOT cover
|
|
61
|
+
|
|
62
|
+
- Boundary shape between modules → see `INTERFACE-DESIGN.md`
|
|
63
|
+
- Naming consistency within / across modules → see `LANGUAGE.md`
|
|
64
|
+
|
|
65
|
+
DEEPENING is about whether each abstraction is the right size. The
|
|
66
|
+
sibling lenses are about whether the gaps between them are well-shaped
|
|
67
|
+
and whether the language is consistent.
|
|
68
|
+
|
|
69
|
+
## Deletion test (Phase 2 prep)
|
|
70
|
+
|
|
71
|
+
For each candidate this lens flags, the Phase-2 deletion test asks:
|
|
72
|
+
|
|
73
|
+
> If I deleted `{Symbol}` and inlined its body at every call site, what
|
|
74
|
+
> domain meaning would be lost?
|
|
75
|
+
|
|
76
|
+
If the answer is "nothing — it was just a name on a syntactic shape",
|
|
77
|
+
the deletion test passes and the candidate is high-priority for refactor
|
|
78
|
+
(remove the abstraction; the area gets shallower in surface area but
|
|
79
|
+
deeper in meaning per remaining concept).
|
|
80
|
+
|
|
81
|
+
If the answer is "we'd lose the {domain concept} as a first-class
|
|
82
|
+
thing in the code", the deletion test fails — the abstraction was
|
|
83
|
+
earning its keep, just maybe at the wrong depth. Re-scope to a sibling
|
|
84
|
+
lens.
|