@ikon85/agent-workflow-kit 0.10.0
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/.agents/skills/ask-matt/SKILL.md +139 -0
- package/.agents/skills/ask-matt/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/audit-skills/SKILL.md +145 -0
- package/.agents/skills/board-to-waves/SKILL.md +135 -0
- package/.agents/skills/code-review/SKILL.md +64 -0
- package/.agents/skills/codebase-design/DEEPENING.md +37 -0
- package/.agents/skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/.agents/skills/codebase-design/SKILL.md +114 -0
- package/.agents/skills/codebase-design/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/codex-adapter-sync/SKILL.md +151 -0
- package/.agents/skills/decision-gate/SKILL.md +67 -0
- package/.agents/skills/diagnose/SKILL.md +136 -0
- package/.agents/skills/diagnose/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/diagnose/scripts/hitl-loop.template.sh +41 -0
- package/.agents/skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/.agents/skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/.agents/skills/domain-modeling/SKILL.md +76 -0
- package/.agents/skills/domain-modeling/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/git-worktree-recover/SKILL.md +176 -0
- package/.agents/skills/grill-me/SKILL.md +54 -0
- package/.agents/skills/grill-me/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/grill-with-docs/ADR-FORMAT.md +47 -0
- package/.agents/skills/grill-with-docs/CONTEXT-FORMAT.md +60 -0
- package/.agents/skills/grill-with-docs/SKILL.md +137 -0
- package/.agents/skills/grill-with-docs/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/implement/SKILL.md +15 -0
- package/.agents/skills/implement/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/improve-codebase-architecture/ADR-FORMAT.md +47 -0
- package/.agents/skills/improve-codebase-architecture/CONTEXT-FORMAT.md +60 -0
- package/.agents/skills/improve-codebase-architecture/DEEPENING.md +37 -0
- package/.agents/skills/improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/.agents/skills/improve-codebase-architecture/INTERFACE-DESIGN.md +46 -0
- package/.agents/skills/improve-codebase-architecture/LANGUAGE.md +53 -0
- package/.agents/skills/improve-codebase-architecture/SKILL.md +88 -0
- package/.agents/skills/improve-codebase-architecture/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/kit-release/SKILL.md +56 -0
- package/.agents/skills/local-ci/SKILL.md +94 -0
- package/.agents/skills/orchestrate-wave/SKILL.md +261 -0
- package/.agents/skills/orchestrate-wave/references/builder-contract.md +67 -0
- package/.agents/skills/prototype/LOGIC.md +79 -0
- package/.agents/skills/prototype/SKILL.md +30 -0
- package/.agents/skills/prototype/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/prototype/UI.md +112 -0
- package/.agents/skills/research/SKILL.md +12 -0
- package/.agents/skills/research/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/resolving-merge-conflicts/SKILL.md +14 -0
- package/.agents/skills/resolving-merge-conflicts/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/retro/SKILL.md +209 -0
- package/.agents/skills/scale-check/SKILL.md +141 -0
- package/.agents/skills/security-audit/SKILL.md +67 -0
- package/.agents/skills/setup-workflow/SKILL.md +187 -0
- package/.agents/skills/setup-workflow/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/setup-workflow/board-sync.md +111 -0
- package/.agents/skills/setup-workflow/code-review.md +26 -0
- package/.agents/skills/setup-workflow/domain.md +51 -0
- package/.agents/skills/setup-workflow/issue-tracker-github.md +35 -0
- package/.agents/skills/setup-workflow/issue-tracker-gitlab.md +34 -0
- package/.agents/skills/setup-workflow/issue-tracker-local.md +30 -0
- package/.agents/skills/setup-workflow/orchestrate-wave-seed.md +44 -0
- package/.agents/skills/setup-workflow/spec-completeness-seed.md +44 -0
- package/.agents/skills/setup-workflow/spec-self-critique-seed.md +43 -0
- package/.agents/skills/setup-workflow/triage-labels.md +18 -0
- package/.agents/skills/setup-workflow/workflow-overview.md +33 -0
- package/.agents/skills/spec-self-critique/SKILL.md +152 -0
- package/.agents/skills/spec-self-critique/scenarios.md +82 -0
- package/.agents/skills/tdd/SKILL.md +120 -0
- package/.agents/skills/tdd/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/tdd/deep-modules.md +33 -0
- package/.agents/skills/tdd/interface-design.md +31 -0
- package/.agents/skills/tdd/mocking.md +59 -0
- package/.agents/skills/tdd/refactoring.md +10 -0
- package/.agents/skills/tdd/tests.md +61 -0
- package/.agents/skills/to-issues/SKILL.md +325 -0
- package/.agents/skills/to-issues/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/to-prd/PROGRAM-PRD-FORMAT.md +162 -0
- package/.agents/skills/to-prd/SKILL.md +180 -0
- package/.agents/skills/to-prd/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/to-waves/SKILL.md +260 -0
- package/.agents/skills/to-waves/SLICE-METADATA-FORMAT.md +74 -0
- package/.agents/skills/triage/AGENT-BRIEF.md +168 -0
- package/.agents/skills/triage/OUT-OF-SCOPE.md +101 -0
- package/.agents/skills/triage/SKILL.md +122 -0
- package/.agents/skills/triage/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/verify-spike/SKILL.md +39 -0
- package/.agents/skills/wayfinder/SKILL.md +127 -0
- package/.agents/skills/wayfinder/THIRD-PARTY-NOTICES.md +29 -0
- package/.agents/skills/wrapup/SKILL.md +71 -0
- package/.agents/skills/wrapup/SOURCES.txt +6 -0
- package/.agents/skills/zoom-out/SKILL.md +7 -0
- package/.agents/skills/zoom-out/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/hooks/_hook_utils.py +184 -0
- package/.claude/hooks/drift-guard.py +176 -0
- package/.claude/hooks/skill-drift-hint.py +122 -0
- package/.claude/hooks/sync-board-status.py +191 -0
- package/.claude/skills/ask-matt/SKILL.md +139 -0
- package/.claude/skills/ask-matt/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/audit-skills/SKILL.md +145 -0
- package/.claude/skills/board-to-waves/SKILL.md +148 -0
- package/.claude/skills/code-review/SKILL.md +64 -0
- package/.claude/skills/codebase-design/DEEPENING.md +37 -0
- package/.claude/skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/.claude/skills/codebase-design/SKILL.md +114 -0
- package/.claude/skills/codebase-design/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/codex-build/SKILL.md +126 -0
- package/.claude/skills/codex-build/THIRD-PARTY-NOTICES.md +35 -0
- package/.claude/skills/codex-review/SKILL.md +145 -0
- package/.claude/skills/codex-review/THIRD-PARTY-NOTICES.md +31 -0
- package/.claude/skills/decision-gate/SKILL.md +67 -0
- package/.claude/skills/diagnose/SKILL.md +136 -0
- package/.claude/skills/diagnose/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/diagnose/scripts/hitl-loop.template.sh +41 -0
- package/.claude/skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/.claude/skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/.claude/skills/domain-modeling/SKILL.md +76 -0
- package/.claude/skills/domain-modeling/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/git-guardrails-claude-code/SKILL.md +96 -0
- package/.claude/skills/git-guardrails-claude-code/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/git-guardrails-claude-code/scripts/block-dangerous-git.sh +28 -0
- package/.claude/skills/git-worktree-recover/SKILL.md +182 -0
- package/.claude/skills/grill-me/SKILL.md +54 -0
- package/.claude/skills/grill-me/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/grill-me-codex/SKILL.md +158 -0
- package/.claude/skills/grill-me-codex/THIRD-PARTY-NOTICES.md +32 -0
- package/.claude/skills/grill-with-docs/ADR-FORMAT.md +47 -0
- package/.claude/skills/grill-with-docs/CONTEXT-FORMAT.md +60 -0
- package/.claude/skills/grill-with-docs/SKILL.md +137 -0
- package/.claude/skills/grill-with-docs/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/grill-with-docs-codex/ADR-FORMAT.md +47 -0
- package/.claude/skills/grill-with-docs-codex/CONTEXT-FORMAT.md +60 -0
- package/.claude/skills/grill-with-docs-codex/SKILL.md +233 -0
- package/.claude/skills/grill-with-docs-codex/THIRD-PARTY-NOTICES.md +33 -0
- package/.claude/skills/implement/SKILL.md +15 -0
- package/.claude/skills/implement/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/improve-codebase-architecture/ADR-FORMAT.md +47 -0
- package/.claude/skills/improve-codebase-architecture/CONTEXT-FORMAT.md +60 -0
- package/.claude/skills/improve-codebase-architecture/DEEPENING.md +37 -0
- package/.claude/skills/improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/.claude/skills/improve-codebase-architecture/INTERFACE-DESIGN.md +46 -0
- package/.claude/skills/improve-codebase-architecture/LANGUAGE.md +53 -0
- package/.claude/skills/improve-codebase-architecture/SKILL.md +88 -0
- package/.claude/skills/improve-codebase-architecture/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/kit-release/SKILL.md +56 -0
- package/.claude/skills/local-ci/SKILL.md +94 -0
- package/.claude/skills/orchestrate-wave/SKILL.md +269 -0
- package/.claude/skills/orchestrate-wave/references/builder-contract.md +67 -0
- package/.claude/skills/prototype/LOGIC.md +79 -0
- package/.claude/skills/prototype/SKILL.md +30 -0
- package/.claude/skills/prototype/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/prototype/UI.md +112 -0
- package/.claude/skills/research/SKILL.md +12 -0
- package/.claude/skills/research/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/resolving-merge-conflicts/SKILL.md +14 -0
- package/.claude/skills/resolving-merge-conflicts/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/retro/SKILL.md +209 -0
- package/.claude/skills/scale-check/SKILL.md +141 -0
- package/.claude/skills/security-audit/SKILL.md +67 -0
- package/.claude/skills/setup-pre-commit/SKILL.md +104 -0
- package/.claude/skills/setup-pre-commit/scripts/pre-commit.template.sh +35 -0
- package/.claude/skills/setup-workflow/SKILL.md +187 -0
- package/.claude/skills/setup-workflow/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/setup-workflow/board-sync.md +111 -0
- package/.claude/skills/setup-workflow/code-review.md +26 -0
- package/.claude/skills/setup-workflow/domain.md +51 -0
- package/.claude/skills/setup-workflow/issue-tracker-github.md +35 -0
- package/.claude/skills/setup-workflow/issue-tracker-gitlab.md +34 -0
- package/.claude/skills/setup-workflow/issue-tracker-local.md +30 -0
- package/.claude/skills/setup-workflow/orchestrate-wave-seed.md +44 -0
- package/.claude/skills/setup-workflow/spec-completeness-seed.md +44 -0
- package/.claude/skills/setup-workflow/spec-self-critique-seed.md +43 -0
- package/.claude/skills/setup-workflow/triage-labels.md +18 -0
- package/.claude/skills/setup-workflow/workflow-overview.md +33 -0
- package/.claude/skills/skill-manifest.json +389 -0
- package/.claude/skills/spec-self-critique/SKILL.md +152 -0
- package/.claude/skills/spec-self-critique/scenarios.md +82 -0
- package/.claude/skills/tdd/SKILL.md +120 -0
- package/.claude/skills/tdd/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/tdd/deep-modules.md +33 -0
- package/.claude/skills/tdd/interface-design.md +31 -0
- package/.claude/skills/tdd/mocking.md +59 -0
- package/.claude/skills/tdd/refactoring.md +10 -0
- package/.claude/skills/tdd/tests.md +61 -0
- package/.claude/skills/to-issues/SKILL.md +325 -0
- package/.claude/skills/to-issues/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/to-prd/PROGRAM-PRD-FORMAT.md +162 -0
- package/.claude/skills/to-prd/SKILL.md +180 -0
- package/.claude/skills/to-prd/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/to-waves/SKILL.md +260 -0
- package/.claude/skills/to-waves/SLICE-METADATA-FORMAT.md +74 -0
- package/.claude/skills/triage/AGENT-BRIEF.md +168 -0
- package/.claude/skills/triage/OUT-OF-SCOPE.md +101 -0
- package/.claude/skills/triage/SKILL.md +122 -0
- package/.claude/skills/triage/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/verify-spike/SKILL.md +39 -0
- package/.claude/skills/wayfinder/SKILL.md +127 -0
- package/.claude/skills/wayfinder/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/wrapup/SKILL.md +81 -0
- package/.claude/skills/wrapup/SOURCES.txt +6 -0
- package/.claude/skills/write-a-skill/GLOSSARY.md +201 -0
- package/.claude/skills/write-a-skill/SKILL.md +88 -0
- package/.claude/skills/write-a-skill/THIRD-PARTY-NOTICES.md +29 -0
- package/.claude/skills/zoom-out/SKILL.md +7 -0
- package/.claude/skills/zoom-out/THIRD-PARTY-NOTICES.md +29 -0
- package/LICENSE +28 -0
- package/PROVENANCE.md +39 -0
- package/README.md +619 -0
- package/agent-workflow-kit.package.json +1939 -0
- package/docs/agents/board-sync.md +71 -0
- package/docs/agents/code-review.md +14 -0
- package/docs/agents/domain.md +7 -0
- package/docs/agents/issue-tracker.md +12 -0
- package/docs/agents/security-audit-runbook-template.md +205 -0
- package/docs/agents/skills/orchestrate-wave.md +13 -0
- package/docs/agents/skills/spec-self-critique.md +18 -0
- package/docs/agents/triage-labels.md +10 -0
- package/docs/agents/wave-anchor-template.md +88 -0
- package/docs/conventions/spec-completeness.md +23 -0
- package/docs/index.html +56 -0
- package/docs/methodology.html +488 -0
- package/docs/methodology.svg +93 -0
- package/docs/workflow.png +0 -0
- package/package.json +40 -0
- package/scripts/anchor_table.py +343 -0
- package/scripts/board-sync.py +1232 -0
- package/scripts/board_config.py +147 -0
- package/scripts/board_fields.py +192 -0
- package/scripts/build-kit.mjs +116 -0
- package/scripts/build-kit.test.mjs +59 -0
- package/scripts/check-kit-staleness.mjs +45 -0
- package/scripts/check-kit-staleness.test.mjs +19 -0
- package/scripts/execute-ready-check.py +516 -0
- package/scripts/issue_deps.py +79 -0
- package/scripts/kit-release.mjs +100 -0
- package/scripts/kit-release.test.mjs +67 -0
- package/scripts/lib/audit-refs.mjs +146 -0
- package/scripts/lib/scrub.mjs +113 -0
- package/scripts/lib/scrub.test.mjs +187 -0
- package/scripts/loc_offender_core.py +196 -0
- package/scripts/loc_offender_gate.py +182 -0
- package/scripts/node_kind.py +68 -0
- package/scripts/portability_profile_scan.py +53 -0
- package/scripts/pr-body-check.py +263 -0
- package/scripts/program_graph.py +125 -0
- package/scripts/program_graph_parse.py +275 -0
- package/scripts/program_graph_validate.py +256 -0
- package/scripts/program_sync.py +160 -0
- package/scripts/release-delta-guard.mjs +96 -0
- package/scripts/release-delta-guard.test.mjs +53 -0
- package/scripts/test_board_sync_create_idempotency.py +104 -0
- package/scripts/test_dist_kit_smoke.py +199 -0
- package/scripts/test_kit_docs_language_census.py +178 -0
- package/scripts/test_skill_code_review_seed.py +89 -0
- package/scripts/test_skill_frontmatter_lint.py +226 -0
- package/scripts/test_skill_gh_lint.py +124 -0
- package/scripts/test_skill_language_census.py +254 -0
- package/scripts/test_skill_portability_lint.py +773 -0
- package/scripts/test_skill_publish_audit.py +300 -0
- package/scripts/test_skill_selfcontainment_lint.py +255 -0
- package/scripts/test_skill_setup_workflow_seeds.py +200 -0
- package/scripts/test_skill_stale_name_lint.py +126 -0
- package/scripts/test_skill_surface_refs.py +300 -0
- package/scripts/test_skill_trailing_artifact_lint.py +71 -0
- package/scripts/wrapup-land.py +573 -0
- package/src/cli.mjs +70 -0
- package/src/commands/diff.mjs +6 -0
- package/src/commands/init.mjs +59 -0
- package/src/commands/uninstall.mjs +43 -0
- package/src/commands/update.mjs +95 -0
- package/src/lib/atomicWrite.mjs +49 -0
- package/src/lib/bundle.mjs +133 -0
- package/src/lib/hash.mjs +13 -0
- package/src/lib/manifest.mjs +58 -0
- package/src/lib/sentinel.mjs +20 -0
- package/src/lib/settings.mjs +23 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ask-matt
|
|
3
|
+
description: "Ask which skill or flow fits your situation. A router over the skills in this repo."
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Ask Matt
|
|
8
|
+
|
|
9
|
+
> **Homage + Router.** Adopted from Matt Pocock's `ask-matt` (MIT, github.com/mattpocock/skills @ `7a83a3a`) — the name stays as a nod to upstream, the content is adapted to *this* repo's skill set (the plan→execute→land→learn line plus our gates, cross-model review, and land/learn skills). Provenance: `docs/agents/provenance.md`. Folder↔upstream-name note: `/diagnose` = upstream `diagnosing-bugs`, `/write-a-skill` = upstream `writing-great-skills` (renamed upstream, local names kept).
|
|
10
|
+
|
|
11
|
+
You don't remember every skill, so ask.
|
|
12
|
+
|
|
13
|
+
A **flow** is a path through the skills. Most paths run along one **main flow**; on-ramps and gates merge onto it. Everything else is standalone, or a vocabulary layer that runs underneath.
|
|
14
|
+
|
|
15
|
+
## The main flow: idea → ship
|
|
16
|
+
|
|
17
|
+
The route most work travels. You have an idea and want it built.
|
|
18
|
+
|
|
19
|
+
0. **Size unclear? `/scale-check` first.** A new undertaking without a clear
|
|
20
|
+
size — a new app, a big cross-cutting change, a genuine "where do I even
|
|
21
|
+
start?" — runs `/scale-check` before anything else: a short plain-language
|
|
22
|
+
dialog that routes it to a Program, a Feature, a Direct-Slice, or a Bug,
|
|
23
|
+
and hands back a paste-ready start prompt for the chosen route. **Rule: a
|
|
24
|
+
new build without a clear size runs `scale-check` first** — never guess
|
|
25
|
+
the altitude and jump straight into step 1. Skip this step outright when
|
|
26
|
+
the size is already obvious (a one-line fix, a known bug) — go straight to
|
|
27
|
+
the entry that fits.
|
|
28
|
+
<!-- mirror-xform:start codex-escalation -->
|
|
29
|
+
1. **`/grill-with-docs`** — sharpen the idea by relentless interview. Start here when you **have a codebase**: it's stateful, retaining what it learns in `CONTEXT.md` and ADRs. (No codebase? Use `/grill-me` — see Standalone.)
|
|
30
|
+
<!-- mirror-xform:end -->
|
|
31
|
+
2. **Branch — can you settle every question in conversation?** If a question needs a runnable answer (state, business logic, a UI you have to see), detour through a prototype, bridged by **`/handoff`** in both directions (see Crossing sessions): `/handoff` out → fresh session → **`/prototype`** to answer with throwaway code → `/handoff` back what you learned.
|
|
32
|
+
3. **Gate — does a slice hinge on an unknown?** Clear it *before* building (see Gate-before-build): a binary fact → **`/verify-spike`**; a bounded "which option" trade-off → **`/decision-gate`**.
|
|
33
|
+
4. **Branch — is this a multi-session build?**
|
|
34
|
+
- **Yes** → **`/to-prd`** (turn the thread into a PRD) → **`/to-issues`** (split into independently-grabbable issues / a wave anchor). Clear context between issues: fresh session per issue, kick off **`/implement`** with the PRD + the single issue.
|
|
35
|
+
- **No** → **`/implement`** right here, same context window.
|
|
36
|
+
|
|
37
|
+
Either way, **`/implement`** builds each issue by driving **`/tdd`** internally — one red-green slice at a time — then closes out with **`/code-review`** (the two-axis Standards×Spec review; project layer at `docs/agents/code-review.md`, seeded by `/setup-workflow`) before committing. Reach for **`/tdd`** on its own to build a concrete behaviour test-first without a full spec, and **`/code-review`** on its own to review any branch/PR against a fixed point.
|
|
38
|
+
5. **Land** → **`/wrapup`** (see Land). **Learn** → **`/retro`** (see Learn).
|
|
39
|
+
|
|
40
|
+
### Context hygiene
|
|
41
|
+
|
|
42
|
+
Keep steps 1–4 in **one unbroken context window** — don't compact or clear until after `/to-issues` — so grilling, PRD, and issues build on the same thinking. Each `/implement` then starts fresh from the issue. If a session gets large before `/to-issues`, don't push on degraded — `/handoff` and continue fresh.
|
|
43
|
+
|
|
44
|
+
## Depth Ladder
|
|
45
|
+
|
|
46
|
+
Prefer the smallest depth that produces a clear next action.
|
|
47
|
+
|
|
48
|
+
- **Program:** the size is genuinely unclear — a new app, a big cross-cutting
|
|
49
|
+
undertaking, several independently-shippable stages. Run `/scale-check`
|
|
50
|
+
first (it owns the altitude criteria catalog — this router only names it);
|
|
51
|
+
two or more criteria tripped routes to a program grill → `/to-prd` →
|
|
52
|
+
`/to-waves`.
|
|
53
|
+
- **Deep:** `/grill-with-docs` followed by `/to-prd` and `/to-issues` when
|
|
54
|
+
terminology, contracts, rollout order, or ownership are still uncertain.
|
|
55
|
+
- **Medium:** `/to-issues` for a ready artefact that needs slicing.
|
|
56
|
+
- **Light:** direct `/tdd` for a small, well-understood change.
|
|
57
|
+
- **Gate:** insert `/verify-spike` or `/decision-gate` before any depth level
|
|
58
|
+
when a slice hinges on an unresolved fact or trade-off.
|
|
59
|
+
|
|
60
|
+
## Gate-before-build
|
|
61
|
+
|
|
62
|
+
When `/to-issues` cuts a slice that hinges on an unknown, it tags the slice instead of guessing. The gate is its own slice, sequenced *before* the build slice it blocks.
|
|
63
|
+
|
|
64
|
+
- **`/verify-spike`** — a single yes/no fact against the real lib/runtime/DB/platform, answered by a throwaway read-only harness with output-proof.
|
|
65
|
+
- **`/decision-gate`** — a bounded trade-off ("which option") or a targeted research gap: options × criteria table + reasoned pick, sunk to an ADR/issue.
|
|
66
|
+
<!-- mirror-xform:start codex-escalation -->
|
|
67
|
+
- **`/grill-with-docs` / `/grill-me`** — for genuinely hard-to-reverse calls, escalate to the relentless-interview grill.
|
|
68
|
+
<!-- mirror-xform:end -->
|
|
69
|
+
|
|
70
|
+
## On-ramps
|
|
71
|
+
|
|
72
|
+
A starting situation that generates work, then merges onto the main flow.
|
|
73
|
+
|
|
74
|
+
- **Bugs and requests piling up** → **`/triage`**. Moves issues through triage and produces agent-ready issues that `/implement` later picks up. Only for issues **you didn't create** — `/to-issues` output is already agent-ready, don't triage it.
|
|
75
|
+
- **Something's broken** → **`/diagnose`**. For the hard ones: the bug that resists a first glance, the intermittent flake, the regression between two known-good states. Refuses to theorise until it has a **tight feedback loop** — one command that already goes red on *this* bug — then fixes with a regression test. Its post-mortem hands off to **`/improve-codebase-architecture`** when the finding is that there's no good seam.
|
|
76
|
+
- **A huge, foggy effort too big for one agent session** — a greenfield build or a sprawling feature where the way from here to the destination isn't yet visible, and it's still **pre-spec** (before any grill or PRD) → **`/wayfinder`** (user-invoked). It charts a **shared map** of investigation slices on the tracker and resolves them one at a time — producing **decisions, not deliverables** — until the fog lifts and the route is clear, then merges onto the main flow at **`/to-prd`** (or, if the effort turned out small enough, straight to **`/implement`**). Where `/grill-with-docs` sharpens an idea you can hold in one session, wayfinder is for the one you can't. Once an undertaking has already resolved into several independently-shippable waves, `/scale-check` → `/to-waves` stays the primary route.
|
|
77
|
+
- **A backlog to cluster** → **`/board-to-waves`**. Groups an existing board into themed waves when you need to *find* the next wave rather than start fresh.
|
|
78
|
+
- **A whole wave to LAND** → **`/orchestrate-wave`**. When a wave anchor (file-disjoint slices, specs already locked) is ready to build, verify and land end-to-end — often AFK: it dispatches an implementer per slice in its own worktree, integrates serially, verifies centrally, and lands the wave. The execute-and-land node of the wave ladder (`scale-check` → `to-waves`/`board-to-waves` → `orchestrate-wave`). A single slice just goes to `/tdd`.
|
|
79
|
+
|
|
80
|
+
## Cross-model review (Codex)
|
|
81
|
+
|
|
82
|
+
An independent second model catches what one model rationalises. Read-only, bounded.
|
|
83
|
+
|
|
84
|
+
<!-- mirror-xform:start codex-escalation -->
|
|
85
|
+
- **`/grill-me` / `/grill-with-docs`** — the relentless interview that locks a plan before any code; reach for these on genuinely hard-to-reverse calls.
|
|
86
|
+
<!-- mirror-xform:end -->
|
|
87
|
+
- **`/codex-review`** (Claude Code only) — standalone: you already have a plan, just want the cross-model stress-test.
|
|
88
|
+
|
|
89
|
+
## Codebase health
|
|
90
|
+
|
|
91
|
+
Not feature work — upkeep.
|
|
92
|
+
|
|
93
|
+
- **`/improve-codebase-architecture`** — run in spare moments to keep the codebase good for agents. Surfaces **deepening opportunities**; picking one _generates an idea_ for the main flow at `/grill-with-docs`.
|
|
94
|
+
- **`/zoom-out`** — step back from the diff to the structure when a change is fighting the codebase; recon that becomes a planned slice or guides a refactor in place.
|
|
95
|
+
- **`/security-audit`** — a whole-app, application-layer security audit run as an independent two-model pass (two models audit the same code separately, then the remediation plan is hardened before any fix). Run before a release or after the attack surface changes (new endpoint, new input source, auth change, dependency bump). Infra hardening (ports/TLS/SSH/backups) is audited separately.
|
|
96
|
+
|
|
97
|
+
## Vocabulary underneath
|
|
98
|
+
|
|
99
|
+
Model-invoked references that run *beneath* the other skills — each the single source of truth for its vocabulary. Reach for them when the **words**, not the process, are the problem.
|
|
100
|
+
|
|
101
|
+
- **`/domain-modeling`** — sharpen the project's *domain* language: challenge a fuzzy term, resolve an overloaded word, record a hard-to-reverse decision as an ADR. The active discipline `/grill-with-docs` drives to keep `CONTEXT.md` a clean glossary. (ADR conventions: `docs/adr/README.md`.)
|
|
102
|
+
- **`/codebase-design`** — the deep-module vocabulary (module, interface, depth, seam, adapter, leverage, locality) for designing a module's *shape*. `/tdd` and `/improve-codebase-architecture` both speak it.
|
|
103
|
+
- **`/write-a-skill`** (Claude Code only) — reference for writing and editing skills well (invocation, information hierarchy, progressive disclosure, leading words, pruning, failure modes). *This router is itself an instance of its "router skill" pattern.*
|
|
104
|
+
|
|
105
|
+
## Land
|
|
106
|
+
|
|
107
|
+
- **`/wrapup`** — the land-and-clean closeout: make the branch landable, enforce the PR-body contract, merge, reconcile the board, sweep merged branches, surface what's still open. Does not replace live verification — verify the user outcome first.
|
|
108
|
+
- **`/local-ci`** — the pre-PR gate: run the repo's local CI (fast static guards + the full gate) before opening a PR. When your host can't enforce a required status check at merge (a Free-plan private repo has no branch protection), the gate has to be local — this is it.
|
|
109
|
+
- The **pre-commit / pre-push gate** fires automatically (installed once via `/git-guardrails-claude-code` / `/setup-pre-commit`, both Claude Code only), blocking a broken commit/push.
|
|
110
|
+
|
|
111
|
+
## Learn
|
|
112
|
+
|
|
113
|
+
- **`/retro`** — in-session post-mortem that proposes concrete changes to rules, skills, or hooks, each with per-patch approval.
|
|
114
|
+
- **`/audit-skills`** — the anti-drift audit: check the repo's own skills against code/doc reality and fix the rot (dead paths, stale line numbers, broken cross-refs). Run it periodically or when a SessionStart drift-hint flags a skill whose declared source moved.
|
|
115
|
+
- **`/write-a-skill`** (Claude Code only) — turn a move you keep repeating into a reusable skill (see Vocabulary).
|
|
116
|
+
|
|
117
|
+
## Crossing sessions
|
|
118
|
+
|
|
119
|
+
- **`/handoff`** — compacts the conversation into a markdown file when a thread is full or you need to branch (e.g. into a `/prototype` session). You don't continue in place — open a new session and reference that file. `/handoff` forks; `/compact` continues.
|
|
120
|
+
- **`/compact`** (built-in) — stay in the same conversation, letting earlier turns be summarized. Use at intentional breaks between phases, not mid-phase.
|
|
121
|
+
|
|
122
|
+
## Standalone
|
|
123
|
+
|
|
124
|
+
Off the main flow entirely.
|
|
125
|
+
|
|
126
|
+
- **`/grill-me`** — the same relentless interview as `/grill-with-docs`, but for when you have **no codebase**. Stateless — saves nothing locally.
|
|
127
|
+
- **`/prototype`** — a small throwaway program that answers one design question (does this state model feel right; what should this UI look like). Keep the answer, delete the code.
|
|
128
|
+
- **`/research`** — delegate reading/docs legwork to a **background agent**: it investigates a question against **primary sources** and leaves a cited Markdown note in the repo. Keep working while it reads. Model-invoked (also triggerable by name); the note it produces is something to carry *into* the main flow at `/grill-with-docs` — research feeds the thinking, it doesn't replace it.
|
|
129
|
+
- **`/resolving-merge-conflicts`** — a disciplined loop for an in-progress merge/rebase conflict: understand each side's intent, preserve both where possible, always resolve (never `--abort`).
|
|
130
|
+
- **`/git-worktree-recover`** — reflog recovery for a branch mix-up: a commit landed on the wrong branch, the branch switched unexpectedly, or work looks lost. Finds the misplaced commit, moves it to the right branch, and sets up a clean worktree.
|
|
131
|
+
- **`/spec-self-critique`** — red-team your own spec before committing to build it.
|
|
132
|
+
|
|
133
|
+
## Precondition
|
|
134
|
+
|
|
135
|
+
- **`/setup-workflow`** — run before your first engineering flow to configure the issue tracker, triage labels, board profile, and doc layout the other skills assume.
|
|
136
|
+
|
|
137
|
+
## Repo-specific skills
|
|
138
|
+
|
|
139
|
+
This repo also carries **project-private domain/tooling skills** (data layer, migrations, forecast/risk logic, brand, blast-radius census, …) that don't ship in the kit. For those, see the **project-skill table in `CLAUDE.md`** — they're model-invoked and fire on their own triggers.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Third-Party Notices
|
|
2
|
+
|
|
3
|
+
This skill is adapted from **Matt Pocock's skills**
|
|
4
|
+
(https://github.com/mattpocock/skills), `skills/engineering/ask-matt` @ d574778, Copyright (c) 2026 Matt Pocock,
|
|
5
|
+
used under the MIT License. Locally adapted (fork-and-own); see PROVENANCE.md.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
MIT License
|
|
9
|
+
|
|
10
|
+
Copyright (c) 2026 Matt Pocock
|
|
11
|
+
|
|
12
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
14
|
+
in the Software without restriction, including without limitation the rights
|
|
15
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
16
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
17
|
+
furnished to do so, subject to the following conditions:
|
|
18
|
+
|
|
19
|
+
The above copyright notice and this permission notice shall be included in all
|
|
20
|
+
copies or substantial portions of the Software.
|
|
21
|
+
|
|
22
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
23
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
24
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
25
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
26
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
27
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
28
|
+
SOFTWARE.
|
|
29
|
+
```
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audit-skills
|
|
3
|
+
disable-model-invocation: true
|
|
4
|
+
description: "Audit the project's own skills for drift from code/doc reality and fix it — the anti-drift learn step. Run at retro, periodically, or when a drift-hint warns a skill's declared source moved since its last touch. Fans out one read-only research subagent per skill, re-verifies each reported drift before editing (the auditor produces false positives), and fixes by content type. Triggers: audit the skills, skill drift, stale skill, skill points at a dead path or renamed symbol."
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# audit-skills — Skill freshness audit (anti-drift)
|
|
8
|
+
|
|
9
|
+
A reusable recipe for checking the project's own skills against code/doc reality
|
|
10
|
+
and keeping them fresh. Skills rot in every repo: a refactor moves a file, a
|
|
11
|
+
symbol is renamed, a line number shifts — and the SKILL.md that named it now
|
|
12
|
+
lies. This is the **learn** step of the plan → execute → land → learn line: the
|
|
13
|
+
skills the other steps rely on drift, and nothing fixes them unless a recipe does.
|
|
14
|
+
|
|
15
|
+
## When to run
|
|
16
|
+
|
|
17
|
+
- At `/retro` (a periodic hygiene point).
|
|
18
|
+
- When the SessionStart drift-hint hook (`.claude/hooks/skill-drift-hint.py`)
|
|
19
|
+
warns that a declared source moved in git since the skill's last touch.
|
|
20
|
+
- Ad-hoc, when a skill you just reached for points at a dead path or a renamed
|
|
21
|
+
symbol.
|
|
22
|
+
|
|
23
|
+
Not for: rewriting a domain skill's content on demand (that is the skill itself),
|
|
24
|
+
or auditing application code (a code review or a diagnosis does that).
|
|
25
|
+
|
|
26
|
+
## Standing guards (run without this audit)
|
|
27
|
+
|
|
28
|
+
Two automatic nets catch the most common drift classes before an audit — this
|
|
29
|
+
recipe complements them, it does not replace them:
|
|
30
|
+
|
|
31
|
+
1. **A skill-sync test** — for any un-guessable enumeration a skill documents (a
|
|
32
|
+
status→bucket map, a design-token list), a test parses the value out of the
|
|
33
|
+
SKILL.md and asserts equality with the code constant. Drift breaks the build.
|
|
34
|
+
Your project layer names the concrete tests.
|
|
35
|
+
2. **The drift-hint hook** (`.claude/hooks/skill-drift-hint.py`) + a per-skill
|
|
36
|
+
`SOURCES.txt`: at SessionStart it flags any skill whose declared source file
|
|
37
|
+
is newer in git than its SKILL.md.
|
|
38
|
+
|
|
39
|
+
**Core insight:** test-covered values do NOT drift silently — only un-tested
|
|
40
|
+
prose refs (paths, line numbers, cross-refs, memory keys) rot. So: test-cover the
|
|
41
|
+
high-value un-guessable enumerations (guard 1); audit everything else
|
|
42
|
+
periodically (this recipe).
|
|
43
|
+
|
|
44
|
+
## The SOURCES.txt convention
|
|
45
|
+
|
|
46
|
+
Each drift-prone skill declares its code/doc anchors in a co-located
|
|
47
|
+
`SOURCES.txt` next to its `SKILL.md`:
|
|
48
|
+
|
|
49
|
+
- one repo-relative source path per line;
|
|
50
|
+
- `#` comments and blank lines are ignored;
|
|
51
|
+
- the drift-hint hook compares each source's last-commit time against the
|
|
52
|
+
SKILL.md's — a source committed *after* the skill means the skill may be stale;
|
|
53
|
+
- committing (touching) the SKILL.md resets the signal — that is how you
|
|
54
|
+
acknowledge that you re-checked it.
|
|
55
|
+
|
|
56
|
+
When a confirmed fix introduces a new source file or replaces an old one, update
|
|
57
|
+
that skill's `SOURCES.txt` in the same change — otherwise the hook keeps pointing
|
|
58
|
+
at dead anchors, or misses the new source.
|
|
59
|
+
|
|
60
|
+
## Recipe
|
|
61
|
+
|
|
62
|
+
### 1. Enumerate the skills — three audit classes
|
|
63
|
+
|
|
64
|
+
Do NOT hardcode a skill list (it rots on every new skill; a newly added skill
|
|
65
|
+
stays blind). Derive it from the skill manifest (`.claude/skills/skill-manifest.json`)
|
|
66
|
+
plus the `SOURCES.txt` files. Sort every skill into one of three classes:
|
|
67
|
+
|
|
68
|
+
1. **Code-drift — subagent-audited, drift-hook-netted.** Every skill with a
|
|
69
|
+
`SOURCES.txt`. The hook already watches these; run a full step-2 subagent
|
|
70
|
+
audit over each file/symbol/line claim.
|
|
71
|
+
```bash
|
|
72
|
+
ls .claude/skills/*/SOURCES.txt # → the drift-netted skills
|
|
73
|
+
```
|
|
74
|
+
2. **Project-layer drift — against docs, not code.** Published/genericized skills
|
|
75
|
+
carry their project crust in a project-layer doc, not in code. Lighter check:
|
|
76
|
+
do the inline pointers still resolve to existing project-layer files, and do
|
|
77
|
+
the cited field/status names still match the profile.
|
|
78
|
+
3. **Script-coupled, un-netted — checked by hand every audit.** Skills coupled to
|
|
79
|
+
scripts or hooks with no `SOURCES.txt` and no hook net. No hook warns, so
|
|
80
|
+
re-check them manually each audit.
|
|
81
|
+
|
|
82
|
+
Your project layer assigns each concrete skill to a class — a completeness gate
|
|
83
|
+
catches the next new skill that would otherwise stay invisible.
|
|
84
|
+
|
|
85
|
+
### 2. Audit in parallel — one subagent per skill
|
|
86
|
+
|
|
87
|
+
Run **one read-only research subagent per skill** — several in parallel in a
|
|
88
|
+
SINGLE message (they are independent and read-only, so they don't contend for the
|
|
89
|
+
git index). Per subagent prompt:
|
|
90
|
+
|
|
91
|
+
- name the repo root, insist **read-only**, "propose no fixes";
|
|
92
|
+
- list **each concrete SKILL.md claim** separately: file path, symbol name, line
|
|
93
|
+
number, code example, cross-ref, memory key;
|
|
94
|
+
- ask for a verdict table back — `TRUE / FALSE / PARTIAL` + the CURRENT real
|
|
95
|
+
path/symbol/signature — in compact `file:line` form (far fewer tokens than
|
|
96
|
+
inline reads).
|
|
97
|
+
|
|
98
|
+
### 3. Re-verify before every edit — mandatory
|
|
99
|
+
|
|
100
|
+
**The auditor produces false positives.** Treat every reported drift as a
|
|
101
|
+
hypothesis, not a fact: re-verify it at the edit itself (`grep` / read the file)
|
|
102
|
+
before changing anything. Never take the auditor's list blind — and an empty
|
|
103
|
+
`grep` result is not proof either, so anchor the search frame (path from the repo
|
|
104
|
+
root, grep the import line, try a second pattern variant). On low-confidence
|
|
105
|
+
findings, re-audit the whole skill rather than trusting the list. This
|
|
106
|
+
false-positive discipline is the single most important rule of the recipe.
|
|
107
|
+
|
|
108
|
+
### 4. Fix only what's confirmed — by content type
|
|
109
|
+
|
|
110
|
+
- **Line number** → reference the symbol (function / constant); keep a line only
|
|
111
|
+
when unavoidable.
|
|
112
|
+
- **Dead path** → the correct path, OR a pointer to the single source of truth.
|
|
113
|
+
- **Cross-ref** → a stable name (verify the target still exists first).
|
|
114
|
+
- **Stale "must still fix" state-claim** → move it into a "historical" block
|
|
115
|
+
(keep the lesson, don't present it as current) or delete it.
|
|
116
|
+
- **Real code finding** (the skill is right, the code drifted) → a **separate
|
|
117
|
+
issue**, NOT fixed inside the docs change.
|
|
118
|
+
- **Test-covered values** → leave untouched (guard 1 already secures them).
|
|
119
|
+
|
|
120
|
+
### 5. Catch up the SOURCES.txt
|
|
121
|
+
|
|
122
|
+
If a confirmed fix introduced a new source file or replaced an old one, update
|
|
123
|
+
the affected skill's `SOURCES.txt` in the same change (see the convention above).
|
|
124
|
+
|
|
125
|
+
### 5b. Sync any second surface
|
|
126
|
+
|
|
127
|
+
If your skills are published to more than one surface (for example a Codex mirror
|
|
128
|
+
alongside the Claude source), sync the mirror in the **same** change — otherwise
|
|
129
|
+
the second surface rots silently. Mirror the body, but preserve each surface's
|
|
130
|
+
own frontmatter: a mirror's `description` may be deliberately condensed, so never
|
|
131
|
+
blind-copy the whole file over it. A `SOURCES.txt` is a plain anchor list and can
|
|
132
|
+
be mirrored verbatim. Your project layer names the surfaces and the exact
|
|
133
|
+
transform.
|
|
134
|
+
|
|
135
|
+
## Done
|
|
136
|
+
|
|
137
|
+
- **Enumeration completeness:** every skill from the manifest is assigned to one
|
|
138
|
+
of the three §1 classes — this catches the next new skill that would otherwise
|
|
139
|
+
stay invisible to the audit.
|
|
140
|
+
- Every reported drift is either fixed (with re-verify proof) or dismissed as a
|
|
141
|
+
false positive (with proof the skill was right).
|
|
142
|
+
- Real code findings filed as their own issues, not folded into the docs change.
|
|
143
|
+
- Any second surface synced (body-parity; each surface's frontmatter preserved).
|
|
144
|
+
- The skill-sync guard and the drift-hint smoke test pass.
|
|
145
|
+
- A pure docs / test / hook change needs no application live-verify.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: board-to-waves
|
|
3
|
+
disable-model-invocation: false
|
|
4
|
+
"description": "Use when sweeping/grooming the GitHub backlog board to cluster open issues into thematic waves (Wellen) — \"lass uns das Board durchgehen\", \"was ist offen und passt zusammen\", \"clustern wir den Backlog\", \"welche Wellen stecken da drin\" — or to spot candidate waves before planning. Reads all open issues, groups them by the Gate+Booster+Splitter heuristic, estimates size/risk + grill-needed per candidate, and after the user confirms creates cluster/Wave-less candidate STUB issues with a To-Do checklist. STOPS at stubs: no PRD, no slicing, no sub-issue links, no promotion (downstream: to-prd matures the stub, to-issues slices + promotes). NOT for maturing/slicing ONE already-chosen candidate (to-prd/to-issues), NOT for per-issue triage labelling (triage), NOT for code comprehension (zoom-out) — this is board-WIDE thematic affinity grouping, not per-issue and not code-reading."
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# board-to-waves
|
|
8
|
+
|
|
9
|
+
**Survey the board → cluster open issues by theme → anchor stub issues.** Systematizes how Welle F came about: first look at what's open and what fits together, then form thematic waves. Result lands durably as an anchor issue on the board (GitHub = SSOT), not as a chat list.
|
|
10
|
+
|
|
11
|
+
## Pipeline Position
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
board-to-waves Board → candidate STUB issues (cluster/wave-less, size + grill-needed flag) ← HERE
|
|
15
|
+
↓ (<maintainer> picks waves)
|
|
16
|
+
[optional] dedicated grill-with-docs session — only if the flag fires
|
|
17
|
+
↓
|
|
18
|
+
to-prd matures the stub into a Draft PRD (Mode B)
|
|
19
|
+
↓
|
|
20
|
+
to-issues slices + promotes (sets type:cluster + Wave at ≥2 slices)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Stops at stubs.** No slice plan, no PRD, no sub-issue link, no promotion. Whether/when a stub becomes a real wave = separate step (`to-prd → to-issues`), <maintainer>'s call.
|
|
24
|
+
|
|
25
|
+
**S4 exit — no stub at all.** A candidate that trips the `scale-check` altitude criteria (Splitter S4 below) skips the stub step entirely — it is reported as an escalation, pointing at `scale-check` (→ a program grill → `to-prd` program mode → `to-waves`), never at `to-prd`/`to-issues` directly. Still <maintainer>'s call, still no board write here.
|
|
26
|
+
|
|
27
|
+
Model: **strongest available reasoning model for board-wide judgment calls** (survey/plan/brainstorm — cross-board judgment, <maintainer>'s table).
|
|
28
|
+
|
|
29
|
+
## Wave Numbering & Registry
|
|
30
|
+
|
|
31
|
+
**Format:** `Welle <N> — <Thema>` (hybrid: number orders, topic gives context). **The wave number is only assigned at `to-issues` promotion** — the board-to-waves candidate stub is cluster/wave-less and carries **no** `Welle <N> —` prefix in the title yet (`to-issues` sets it on promote).
|
|
32
|
+
**Carrier = Wave field (number)** on the **anchor** (mandatory — source of truth + board sort key, set at promotion). NOT the title string, NOT the `wave:*` label (both deprecated for waves). Member/sub-issues get the Wave field + native parent link at `to-issues` promotion (not yet at clustering time): the parent link carries the assignment semantically, the Wave field makes it board-filterable — without the Wave field an assigned issue wrongly shows up in the "wave-less" view (`is:open no:wave -label:"type:cluster"`).
|
|
33
|
+
**N = monotonic auto-increment ID:** `max(assigned wave numbers) + 1`. Ascending, never reused, never letters, never retroactively resorted (like issue numbers). Gaps are fine. `to-issues` pulls the next free number at promotion via the shared board-sync helper (`scripts/board-sync.py` `next-wave`) — board-to-waves itself assigns **no** wave.
|
|
34
|
+
|
|
35
|
+
**Registry = board-native, no doc file:** view filter `type:cluster`, sort `Wave` ascending, columns Status + sub-issues progress. The anchor issues + Wave field **are** the registry. Active wave = `type:cluster` + the in-progress-role status. Wave field ≠ `Cluster (G-number)` field (roadmap G-cluster, orthogonal). No milestones (progress comes from the sub-issue rollup).
|
|
36
|
+
|
|
37
|
+
## Clustering Heuristic — Gate + Booster + Splitter
|
|
38
|
+
|
|
39
|
+
**🚦 Gate (mandatory — without it, no wave, just a pile):** shared **through-line / outcome**. The issues must serve *one* product outcome (e.g. "market/partner readiness" = Welle F).
|
|
40
|
+
|
|
41
|
+
**➕ Boosters (the more that fire, the clearer a wave):**
|
|
42
|
+
| # | Criterion | Board signal |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| B1 | Code proximity / change coupling | same files/paths in issue bodies; historically co-changed (`git log`) |
|
|
45
|
+
| B2 | Type homogeneity | same `type:*` / `dimension:*` labels |
|
|
46
|
+
| B3 | Dependency chain | **native blocked-by edges** (`python3 scripts/board-sync.py deps <#>` — the blocking SSOT); secondary: `blocked` label, "blocked by" / mutual body refs (the body section is only the machine mirror) |
|
|
47
|
+
| B4 | Shared verify surface | same page/surface live-testable |
|
|
48
|
+
|
|
49
|
+
**✂️ Splitters (separate DESPITE affinity):**
|
|
50
|
+
- **S1 Too big** — > ~7 slices / not shippable in a manageable sequence → split into two waves.
|
|
51
|
+
- **S2 Foreign parent** — issue already hangs under another wave (GitHub 1-parent; `to-issues` link check is the final word).
|
|
52
|
+
- **S3 "Same type alone" ≠ wave** — type is a booster, never a gate. Otherwise "all refactors" becomes a junk drawer.
|
|
53
|
+
- **S4 Programm-Verdacht** — the candidate trips the `scale-check` altitude criteria (`.claude/skills/scale-check/SKILL.md` § "Altitude criteria (the single source of truth)" — referenced here, **never** re-forked; e.g. staged delivery + several subsystems that each stand on their own) → **escalate to the Program route instead of creating a candidate stub**: report it in the candidate list (§3/§5) pointing at `scale-check` (grill once into a Program-PRD with a Wellenplan, then `to-waves` unfolds it), not `to-prd`/`to-issues`. The bottom-up Wave-stamping rule above is unaffected — an escalated candidate is still just a proposal, not yet a committed wave, exactly like any other candidate.
|
|
54
|
+
|
|
55
|
+
**Rule:** issue → candidate X if **Gate(X) satisfied AND ≥1 booster fires** and no splitter applies. Otherwise: own candidate or leftover bucket "unclustered / standalone issue".
|
|
56
|
+
|
|
57
|
+
**Sequencing WITHIN a wave** (belongs to `to-issues`, noted here only): WSJF-lite — visible+low-risk → logic/backend → cleanup; dependencies force order.
|
|
58
|
+
|
|
59
|
+
> References: Atlassian/Mountain Goat (epics/themes), CodeScene/Tornhill (change coupling), SAFe (WSJF), ProductPlan/Asana (affinity/batching).
|
|
60
|
+
|
|
61
|
+
## Size + `grill-needed` (per candidate)
|
|
62
|
+
|
|
63
|
+
- **Size + risk** as a rough effort estimate (no fixed time commitment): rough slice count, backend yes/no, model mix, risk level (race/cache/forecast/migration → high).
|
|
64
|
+
- **`grill-needed` flag** — fires when: many slices OR fuzzy (members are `type:idea`/`type:research`, undecided) OR cross-subsystem OR open product decisions. = low decision maturity.
|
|
65
|
+
- **"this session"** when manageable, **"own session"** when too big/fuzzy to do on the side. Recommendation goes into the stub, **<maintainer>'s call**.
|
|
66
|
+
|
|
67
|
+
## Procedure
|
|
68
|
+
|
|
69
|
+
### 1. Read the board
|
|
70
|
+
```bash
|
|
71
|
+
gh issue list --repo <owner>/<repo> --state open --limit 500 \
|
|
72
|
+
--json number,title,labels,body
|
|
73
|
+
```
|
|
74
|
+
`--limit 500` (item/issue-list caps **silently**, `docs/agents/board-sync.md`). Already-parented issues get recognized later at link time — title/labels/body suffice here.
|
|
75
|
+
|
|
76
|
+
### 2. Cluster
|
|
77
|
+
Apply the heuristic. Per candidate, capture: topic (gate outcome), members (#…), firing boosters, splitter checks, size+risk, `grill-needed`+when. Issues that reach no gate+booster → leftover bucket, **do not** force-cluster.
|
|
78
|
+
|
|
79
|
+
### 3. Propose candidates (<maintainer> chooses)
|
|
80
|
+
Concise list, per candidate **which criteria fired** visible (rationale):
|
|
81
|
+
```
|
|
82
|
+
Candidate A "<Outcome>": #a #b #c
|
|
83
|
+
Gate=<Outcome> · B1 all frontend · B2 all type:refactor
|
|
84
|
+
Size ~4 slices, risk low · grill-needed: no
|
|
85
|
+
Candidate B "<Outcome>": #x #y …
|
|
86
|
+
… · grill-needed: yes (own session — cross-subsystem)
|
|
87
|
+
Candidate C "<Outcome>": #p #q #r #s …
|
|
88
|
+
… · trips scale-check C1+C2 → Programm-Verdacht (S4) — escalate to `scale-check`, no stub here
|
|
89
|
+
Rest (unclustered): #m #n …
|
|
90
|
+
```
|
|
91
|
+
**<maintainer> confirms** which become real waves. Only confirmed → step 4 (an S4-flagged candidate is routed to `scale-check` instead, not step 4).
|
|
92
|
+
|
|
93
|
+
### 4. Create candidate stubs (per confirmed candidate)
|
|
94
|
+
Body from `docs/agents/wave-anchor-template.md` **stage 1** (header + cluster origin + to-do checklist; slice table empty). Body **always** via `--body-file` (`gotchas_gh_body_file`).
|
|
95
|
+
|
|
96
|
+
**All board write mechanics (create stub, attach to board, stamp status) go through the shared board-sync helper** `scripts/board-sync.py` — no bare `gh issue create`/`gh project item-*` in this prose (enforced by lint; board constants live in `docs/agents/board-sync.md`).
|
|
97
|
+
|
|
98
|
+
**Idempotency — stub marker + search-before-create (mandatory, BEFORE `create`).** Re-runs of board-to-waves must **not** produce duplicate stubs (a duplicate stub would confuse Mode-B identity in `to-prd`). Mirrors the `to-prd` pattern:
|
|
99
|
+
- **Stable stub marker** `<!-- wave-stub-source: <topic-slug> -->` as the **first body line** of every stub. `<topic-slug>` = kebab-case slug of the gate outcome; set on the **first** run, **never** changed after (identity ≠ content — the slug stays findable even if members/size change later).
|
|
100
|
+
- **search-before-create** per candidate **before** the `create`. **No** reliance on GitHub search (doesn't index HTML comments) — bounded, local:
|
|
101
|
+
```bash
|
|
102
|
+
gh issue list --repo <owner>/<repo> --state open --limit 500 --json number,body,labels
|
|
103
|
+
# locally filter on `wave-stub-source: <topic-slug>` → 1 match ⇒ skip + report (stub exists); >1 ⇒ STOP + report; 0 ⇒ create
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Create the candidate stub (cluster/wave-less)** — issue **without** `type:cluster` and **without** `--wave` (exactly one `type:*` + one `priority:*`; title **without** a `Welle <N>` prefix, since the wave number is only assigned at promotion), **with `--wave-stub`** (a searchable "awaiting planning" filter — the HTML marker above is only locally greppable, GitHub doesn't index it), attach to the board, triaged-role status (clustered, not yet planned). `to-prd` then matures the stub (Mode B) into a Draft PRD, `to-issues` promotes it to an anchor (sets `type:cluster` + Wave then, **strips `wave-stub`** — the stub leaves the planning list):
|
|
107
|
+
```bash
|
|
108
|
+
python3 scripts/board-sync.py create \
|
|
109
|
+
--title "<Outcome/Thema>" \
|
|
110
|
+
--body-file <stub.md> \
|
|
111
|
+
--label "type:feature" --label "priority:medium" \
|
|
112
|
+
--wave-stub \
|
|
113
|
+
--status-role triaged
|
|
114
|
+
```
|
|
115
|
+
Outputs `#<STUB_NUM> <URL>`. `--dry-run` shows the `gh` calls without writing. (Fuzzy/undecided candidate → `type:research` instead of `type:feature`.)
|
|
116
|
+
|
|
117
|
+
**Search open stubs** (= "what still needs planning"): `gh issue list --label wave-stub --state open` or board filter `is:open label:wave-stub`. At `to-issues` promotion (wave) **or** atomic publish (`add --bucket`), `wave-stub` is stripped automatically — no manual edit.
|
|
118
|
+
|
|
119
|
+
**Member issues:** list in the stub body (#…). **No** wave stamp and **no** native parent link yet at clustering time — `to-issues` sets both at promotion. That members show up in the "wave-less" view (`is:open no:wave`) until then is **correct**: a candidate isn't a committed wave yet.
|
|
120
|
+
|
|
121
|
+
### 5. Output
|
|
122
|
+
```
|
|
123
|
+
Clustered: <N> wave candidates, <M> confirmed → cluster/wave-less stubs created.
|
|
124
|
+
Candidate <X> #<STUB_NUM> — #a #b #c · ~4 slices · grill: no
|
|
125
|
+
Candidate <Y> #<…> — #x #y · ~8 slices · grill: own session
|
|
126
|
+
Escalated (Programm-Verdacht, S4): #<p> #<q> … — routed to `scale-check`, no stub created
|
|
127
|
+
Rest (unclustered): #m #n …
|
|
128
|
+
Next step (<maintainer>'s call, separate): grill → to-prd (matures the stub) → to-issues (slices + promotes) per chosen candidate; an escalated candidate instead starts at `scale-check`.
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Notes
|
|
132
|
+
- **Stops at stubs.** Never write the PRD, slice, link, promote, or call `to-prd`/`to-issues` yourself.
|
|
133
|
+
- Boundary: `triage` = per-issue state machine; `zoom-out` = code comprehension; `board-to-waves` = board-wide thematic affinity. Different altitudes.
|
|
134
|
+
- A leftover bucket is OK and intentional — not every issue belongs in a wave. Force-clustering dilutes the gate.
|
|
135
|
+
- Size/risk are a rough estimate, not a commitment. <maintainer> can override the stub's "when to grill" recommendation at any time.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-review
|
|
3
|
+
description: Review a diff, branch, or PR against two separate axes — Standards (this repo's own conventions plus a Fowler-smell baseline) and Spec (does the diff faithfully implement the originating issue/PRD) — reported side by side, never merged or re-ranked. Runs a three-dot merge-base preflight before either axis starts. Use when asked to review a diff/branch/PR, or when a review needs to answer both "does this follow our standards" and "does this match the spec" without one masking the other. NOT for a pre-code plan review (that reviews a plan before any code exists), NOT for root-causing a known bug (`diagnose`), and NOT a pure reuse/simplification/efficiency pass (narrower, no bug-hunting).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Code Review
|
|
7
|
+
|
|
8
|
+
A code-review compares one diff against **two independent axes** — Standards and Spec — and reports them **separately**. A diff can pass one axis and fail the other: code that satisfies every convention but builds the wrong thing is a Standards-pass/Spec-fail; code that nails the issue but breaks conventions is a Spec-pass/Standards-fail. Merge or re-rank the two and one axis silently masks the other — that is the exact failure mode this method exists to prevent.
|
|
9
|
+
|
|
10
|
+
## When this and not another skill
|
|
11
|
+
|
|
12
|
+
| You are reviewing… | Use |
|
|
13
|
+
|---|---|
|
|
14
|
+
| "Review this diff/branch/PR against our standards AND the spec." | **code-review** |
|
|
15
|
+
| "Review this plan before any code is written." (adversarial pre-code review) | a plan-review / adversarial-review skill |
|
|
16
|
+
| "Why is this broken / slow?" (root-cause of a known defect) | `diagnose` |
|
|
17
|
+
| "Clean this up — reuse, simplify, cut waste." (no bug-hunting) | a dedicated simplification pass |
|
|
18
|
+
|
|
19
|
+
## Preflight (fail-fast, before either axis starts)
|
|
20
|
+
|
|
21
|
+
1. **Fixed point** — whatever the requester names: a SHA, branch, tag, `main`, `HEAD~N`. Missing → ask; do not guess.
|
|
22
|
+
2. **Three-dot diff against the merge-base** — `git diff <fixed-point>...HEAD` (three dots, not two — two dots diffs tip-to-tip and pulls in unrelated upstream changes), plus the commit list: `git log <fixed-point>..HEAD --oneline`.
|
|
23
|
+
3. **Validate before working** — `git rev-parse <fixed-point>` must resolve, and the diff must be non-empty. A bad ref or an empty diff fails **here**, not silently inside a parallel sub-agent.
|
|
24
|
+
|
|
25
|
+
## Axis 1 — Standards
|
|
26
|
+
|
|
27
|
+
**Sources.** This repo's own documented conventions: a root convention file (`CLAUDE.md`/`AGENTS.md`/`CONTRIBUTING.md` — whichever this repo uses), any per-package convention files in a monorepo, a `docs/conventions/` folder. If `docs/agents/code-review.md` exists (this skill's project layer, seeded by `/setup-workflow`), read it first — it names exactly which sources count here and how this method relates to any other review tooling already running in this environment. Absent that file, gather the sources yourself from the repo root before reviewing.
|
|
28
|
+
|
|
29
|
+
**Plus a Fowler-smell baseline** (*Refactoring*, ch. 3) — applies even when the repo documents nothing. Each smell is a **judgment call** (flag as "possible X"), never a hard violation:
|
|
30
|
+
|
|
31
|
+
- **Mysterious Name** — a name that does not say what it does/holds → rename; a dishonest name hides a murky design.
|
|
32
|
+
- **Duplicated Code** — the same logic shape in ≥2 hunks/files → extract, have both call it.
|
|
33
|
+
- **Feature Envy** — a function reaches into another module's data more than its own → move it to the data it envies.
|
|
34
|
+
- **Data Clumps** — the same fields always travel together → bundle them into one type.
|
|
35
|
+
- **Primitive Obsession** — a primitive/string standing in for a domain concept → give it its own small type.
|
|
36
|
+
- **Repeated Switches** — the same `switch`/`if`-cascade on the same type recurring across the diff → polymorphism or a shared map.
|
|
37
|
+
- **Shotgun Surgery** — one logical change forces edits scattered across many files → consolidate into one module.
|
|
38
|
+
- **Divergent Change** — one module edited for many unrelated reasons → split it, one reason per module.
|
|
39
|
+
- **Speculative Generality** — an abstraction/hook built for a need the spec does not have → delete it, inline until real demand exists.
|
|
40
|
+
- **Message Chains** — a long `a.b().c().d()` → hide it behind one method on the first object.
|
|
41
|
+
- **Middle Man** — a class/function that only delegates onward → cut it out, call directly.
|
|
42
|
+
- **Refused Bequest** — a subclass ignoring most of what it inherits → drop inheritance, use composition.
|
|
43
|
+
|
|
44
|
+
**Two binding rules:** (1) **A documented repo standard overrides the baseline** — if the repo's own conventions explicitly sanction something the baseline would flag, suppress the flag. (2) **Skip what tooling already enforces** — a type checker, linter, or CI guard catches that class of issue mechanically; the review does not re-derive it.
|
|
45
|
+
|
|
46
|
+
## Axis 2 — Spec
|
|
47
|
+
|
|
48
|
+
**Source.** The originating issue/PRD, resolved through this project's issue-tracker workflow (`docs/agents/issue-tracker.md`, seeded by `/setup-workflow`) — pull the issue reference from the commit messages or the PR description. No issue reference → ask the requester for the spec path. No spec exists at all → report this axis as "no spec available" and skip it; never invent requirements to check against.
|
|
49
|
+
|
|
50
|
+
**Taxonomy**, each finding cited against a specific spec line:
|
|
51
|
+
- (a) **Missing/partial** — requirements the spec asks for that are absent or only half-built.
|
|
52
|
+
- (b) **Scope creep** — behavior in the diff the spec never asked for.
|
|
53
|
+
- (c) **Looks-right-but-wrong** — requirements that appear implemented but diverge from what the spec actually says on inspection.
|
|
54
|
+
|
|
55
|
+
## Execution
|
|
56
|
+
|
|
57
|
+
- Run both axes as **parallel sub-agents** — separate context each, so neither poisons the other's read. Give the Standards sub-agent the Standards sources **plus** the full Fowler baseline in its prompt; it has no other way to see the baseline.
|
|
58
|
+
- Report **side by side**, under `## Standards` and `## Spec` headers, verbatim or lightly cleaned — never merge or re-rank the two into one combined verdict.
|
|
59
|
+
- Cap each sub-agent's report under 400 words — findings, not padding.
|
|
60
|
+
- Close with a findings count **per axis** and the single worst issue **per axis** — never a cross-axis "winner"; picking one would be exactly the re-ranking this method exists to prevent.
|
|
61
|
+
|
|
62
|
+
## Relationship to adjacent review tooling
|
|
63
|
+
|
|
64
|
+
This skill governs one thing: a diff/branch/PR review split into Standards vs. Spec. It is not the only review-shaped tool an environment may have — a pre-code plan-review loop, a security-specific audit, a pure reuse/simplification pass, or a dedicated reviewer subagent can all coexist with it; each stays its own axis, not a replacement for this one. If this repo has seeded `docs/agents/code-review.md`, it names the concrete adjacent tools and how they relate; absent that, treat any other review tool you find as complementary unless it explicitly says otherwise.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Deepening
|
|
2
|
+
|
|
3
|
+
How to deepen a cluster of shallow modules safely, given its dependencies. Assumes the vocabulary in [SKILL.md](SKILL.md) — **module**, **interface**, **seam**, **adapter**.
|
|
4
|
+
|
|
5
|
+
## Dependency categories
|
|
6
|
+
|
|
7
|
+
When assessing a candidate for deepening, classify its dependencies. The category determines how the deepened module is tested across its seam.
|
|
8
|
+
|
|
9
|
+
### 1. In-process
|
|
10
|
+
|
|
11
|
+
Pure computation, in-memory state, no I/O. Always deepenable — merge the modules and test through the new interface directly. No adapter needed.
|
|
12
|
+
|
|
13
|
+
### 2. Local-substitutable
|
|
14
|
+
|
|
15
|
+
Dependencies that have local test stand-ins (PGLite for Postgres, in-memory filesystem). Deepenable if the stand-in exists. The deepened module is tested with the stand-in running in the test suite. The seam is internal; no port at the module's external interface.
|
|
16
|
+
|
|
17
|
+
### 3. Remote but owned (Ports & Adapters)
|
|
18
|
+
|
|
19
|
+
Your own services across a network boundary (microservices, internal APIs). Define a **port** (interface) at the seam. The deep module owns the logic; the transport is injected as an **adapter**. Tests use an in-memory adapter. Production uses an HTTP/gRPC/queue adapter.
|
|
20
|
+
|
|
21
|
+
Recommendation shape: *"Define a port at the seam, implement an HTTP adapter for production and an in-memory adapter for testing, so the logic sits in one deep module even though it's deployed across a network."*
|
|
22
|
+
|
|
23
|
+
### 4. True external (Mock)
|
|
24
|
+
|
|
25
|
+
Third-party services (Stripe, Twilio, etc.) you don't control. The deepened module takes the external dependency as an injected port; tests provide a mock adapter.
|
|
26
|
+
|
|
27
|
+
## Seam discipline
|
|
28
|
+
|
|
29
|
+
- **One adapter means a hypothetical seam. Two adapters means a real one.** Don't introduce a port unless at least two adapters are justified (typically production + test). A single-adapter seam is just indirection.
|
|
30
|
+
- **Internal seams vs external seams.** A deep module can have internal seams (private to its implementation, used by its own tests) as well as the external seam at its interface. Don't expose internal seams through the interface just because tests use them.
|
|
31
|
+
|
|
32
|
+
## Testing strategy: replace, don't layer
|
|
33
|
+
|
|
34
|
+
- Old unit tests on shallow modules become waste once tests at the deepened module's interface exist — delete them.
|
|
35
|
+
- Write new tests at the deepened module's interface. The **interface is the test surface**.
|
|
36
|
+
- Tests assert on observable outcomes through the interface, not internal state.
|
|
37
|
+
- Tests should survive internal refactors — they describe behaviour, not implementation. If a test has to change when the implementation changes, it's testing past the interface.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Design It Twice
|
|
2
|
+
|
|
3
|
+
When the user wants to explore alternative interfaces for a chosen deepening candidate, use this parallel sub-agent pattern. Based on "Design It Twice" (Ousterhout) — your first idea is unlikely to be the best.
|
|
4
|
+
|
|
5
|
+
Uses the vocabulary in [SKILL.md](SKILL.md) — **module**, **interface**, **seam**, **adapter**, **leverage**.
|
|
6
|
+
|
|
7
|
+
## Process
|
|
8
|
+
|
|
9
|
+
### 1. Frame the problem space
|
|
10
|
+
|
|
11
|
+
Before spawning sub-agents, write a user-facing explanation of the problem space for the chosen candidate:
|
|
12
|
+
|
|
13
|
+
- The constraints any new interface would need to satisfy
|
|
14
|
+
- The dependencies it would rely on, and which category they fall into (see [DEEPENING.md](DEEPENING.md))
|
|
15
|
+
- A rough illustrative code sketch to ground the constraints — not a proposal, just a way to make the constraints concrete
|
|
16
|
+
|
|
17
|
+
Show this to the user, then immediately proceed to Step 2. The user reads and thinks while the sub-agents work in parallel.
|
|
18
|
+
|
|
19
|
+
### 2. Spawn sub-agents
|
|
20
|
+
|
|
21
|
+
Spawn 3+ sub-agents in parallel using the Agent tool. Each must produce a **radically different** interface for the deepened module.
|
|
22
|
+
|
|
23
|
+
Prompt each sub-agent with a separate technical brief (file paths, coupling details, dependency category from [DEEPENING.md](DEEPENING.md), what sits behind the seam). The brief is independent of the user-facing problem-space explanation in Step 1. Give each agent a different design constraint:
|
|
24
|
+
|
|
25
|
+
- Agent 1: "Minimize the interface — aim for 1–3 entry points max. Maximise leverage per entry point."
|
|
26
|
+
- Agent 2: "Maximise flexibility — support many use cases and extension."
|
|
27
|
+
- Agent 3: "Optimise for the most common caller — make the default case trivial."
|
|
28
|
+
- Agent 4 (if applicable): "Design around ports & adapters for cross-seam dependencies."
|
|
29
|
+
|
|
30
|
+
Include both [SKILL.md](SKILL.md) vocabulary and CONTEXT.md vocabulary in the brief so each sub-agent names things consistently with the architecture language and the project's domain language.
|
|
31
|
+
|
|
32
|
+
Each sub-agent outputs:
|
|
33
|
+
|
|
34
|
+
1. Interface (types, methods, params — plus invariants, ordering, error modes)
|
|
35
|
+
2. Usage example showing how callers use it
|
|
36
|
+
3. What the implementation hides behind the seam
|
|
37
|
+
4. Dependency strategy and adapters (see [DEEPENING.md](DEEPENING.md))
|
|
38
|
+
5. Trade-offs — where leverage is high, where it's thin
|
|
39
|
+
|
|
40
|
+
### 3. Present and compare
|
|
41
|
+
|
|
42
|
+
Present designs sequentially so the user can absorb each one, then compare them in prose. Contrast by **depth** (leverage at the interface), **locality** (where change concentrates), and **seam placement**.
|
|
43
|
+
|
|
44
|
+
After comparing, give your own recommendation: which design you think is strongest and why. If elements from different designs would combine well, propose a hybrid. Be opinionated — the user wants a strong read, not a menu.
|