geneseed 3.11.0 → 3.13.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/CHANGELOG.md +160 -0
- package/README.md +5 -5
- package/SHIPPED.md +2 -2
- package/adapters/bob/README.md +1 -1
- package/adapters/claude-code/README.md +1 -1
- package/adapters/openclaude/README.md +1 -1
- package/adapters/opencode/README.md +3 -3
- package/adapters/opencode/plugins/geneseed-guard.js +157 -2
- package/bin/geneseed-cli.mjs +4 -0
- package/docs/README.md +41 -22
- package/docs/concepts/agents.md +3 -1
- package/docs/concepts/collaboration.md +3 -1
- package/docs/concepts/exclusions.md +4 -2
- package/docs/concepts/footprint.md +3 -1
- package/docs/concepts/foreman-mode.md +4 -2
- package/docs/concepts/hook-gates.md +61 -0
- package/docs/concepts/hooks.md +8 -56
- package/docs/concepts/host-matrix.md +38 -0
- package/docs/concepts/hosts.md +6 -32
- package/docs/concepts/loop-branch.md +66 -0
- package/docs/concepts/loop-bricks.md +48 -0
- package/docs/concepts/loop-contracts.md +33 -0
- package/docs/concepts/loop-gates.md +30 -0
- package/docs/concepts/loop-notes.md +43 -0
- package/docs/concepts/loop-risk.md +36 -0
- package/docs/concepts/loop-templates.md +50 -0
- package/docs/concepts/loops.md +73 -0
- package/docs/concepts/lsp.md +2 -0
- package/docs/concepts/memory.md +3 -1
- package/docs/concepts/notebook.md +3 -1
- package/docs/concepts/rules.md +4 -2
- package/docs/concepts/skills.md +3 -1
- package/docs/concepts/themes.md +3 -1
- package/docs/extending.md +28 -8
- package/docs/guides/autostart.md +3 -1
- package/docs/guides/choose-your-setup.md +5 -66
- package/docs/guides/headless.md +5 -3
- package/docs/guides/install-agent-md.md +37 -0
- package/docs/guides/install-bob.md +20 -0
- package/docs/guides/install-claude-code.md +22 -0
- package/docs/guides/install-clone.md +34 -0
- package/docs/guides/install-openclaude.md +25 -0
- package/docs/guides/install-opencode.md +35 -0
- package/docs/guides/install-scripted.md +21 -0
- package/docs/guides/install.md +9 -118
- package/docs/guides/loop-finish.md +54 -0
- package/docs/guides/loop-running.md +66 -0
- package/docs/guides/loop-which-template.md +35 -0
- package/docs/guides/mcp-filesystem.md +41 -0
- package/docs/guides/mcp-gitlab.md +66 -0
- package/docs/guides/mcp-markitdown.md +36 -0
- package/docs/guides/mcp.md +8 -137
- package/docs/guides/migrate.md +3 -1
- package/docs/guides/project-context.md +4 -2
- package/docs/guides/read-non-markdown.md +17 -0
- package/docs/guides/run-a-loop.md +64 -0
- package/docs/guides/run-anywhere.md +2 -0
- package/docs/guides/setup-doctrines.md +55 -0
- package/docs/guides/setup-footprint.md +48 -0
- package/docs/guides/uninstall.md +3 -1
- package/docs/guides/upgrade.md +3 -1
- package/docs/guides/verify.md +3 -1
- package/docs/guides/wiki.md +3 -1
- package/docs/guides/worktree.md +3 -1
- package/docs/reference/about.md +3 -1
- package/docs/reference/cli.md +2 -0
- package/docs/reference/env-context.md +40 -0
- package/docs/reference/environment.md +10 -59
- package/docs/reference/glossary.md +7 -1
- package/docs/reference/loop-actions.md +20 -0
- package/docs/reference/opencode-plugins.md +14 -116
- package/docs/reference/plugin-activity.md +20 -0
- package/docs/reference/plugin-context.md +27 -0
- package/docs/reference/plugin-guard.md +27 -0
- package/docs/reference/plugin-learn.md +27 -0
- package/docs/reference/plugin-notify.md +20 -0
- package/docs/reference/plugin-ponytail.md +19 -0
- package/docs/reference/plugin-workflow.md +25 -0
- package/docs/reference/troubleshoot-doctor.md +50 -0
- package/docs/reference/troubleshoot-hooks.md +99 -0
- package/docs/reference/troubleshoot-install.md +108 -0
- package/docs/reference/troubleshoot-tools.md +56 -0
- package/docs/reference/troubleshoot-update.md +23 -0
- package/docs/reference/troubleshoot-web.md +66 -0
- package/docs/reference/troubleshooting.md +13 -337
- package/docs/understand/a-day.md +3 -1
- package/docs/understand/enforced-vs-asked.md +3 -1
- package/docs/understand/harness.md +2 -0
- package/docs/understand/machine-bob.md +17 -0
- package/docs/understand/machine-claude.md +35 -0
- package/docs/understand/machine-opencode.md +36 -0
- package/docs/understand/on-your-machine.md +12 -55
- package/docs/understand/take-it-out.md +13 -0
- package/docs/web-ui.md +36 -5
- package/harness.config.json +1 -1
- package/js/README.md +32 -2
- package/js/build/driver.mjs +14 -8
- package/js/build/generate.mjs +10 -6
- package/js/build/render.mjs +5 -0
- package/js/build/source.mjs +5 -1
- package/js/cli-table.json +261 -0
- package/js/hosts/gitref.mjs +99 -0
- package/js/hosts/hooks.mjs +88 -1
- package/js/hosts/installs.mjs +21 -0
- package/js/hosts/mcp.mjs +1 -1
- package/js/hosts/native.mjs +43 -5
- package/js/inspect/checks-authoring.mjs +10 -0
- package/js/inspect/checks-build.mjs +28 -0
- package/js/inspect/diff.mjs +3 -0
- package/js/inspect/doctor.mjs +2 -1
- package/js/inspect/inventory.mjs +1 -0
- package/js/inspect/status.mjs +1 -1
- package/js/loop/catalog.mjs +127 -0
- package/js/loop/cli.mjs +173 -0
- package/js/loop/graph.mjs +163 -0
- package/js/loop/registry.mjs +196 -0
- package/js/loop/score.mjs +182 -0
- package/js/loop/state.mjs +436 -0
- package/js/maintain/migrate.mjs +4 -2
- package/js/maintain/setup.mjs +1 -1
- package/js/web/actions.mjs +34 -3
- package/js/web/api.mjs +51 -2
- package/js/web/daemon.mjs +43 -5
- package/js/web/docs.mjs +64 -12
- package/js/web/handler.mjs +1 -0
- package/js/web/jobs.mjs +3 -1
- package/js/web/routes.mjs +5 -1
- package/js/web/server.mjs +5 -3
- package/package.json +1 -1
- package/registry.json +14 -0
- package/src/AGENT.md.tmpl +2 -0
- package/src/agents/explorer.md +2 -2
- package/src/agents/researcher.md +3 -3
- package/src/bricks/README.md +34 -0
- package/src/bricks/_template.md +32 -0
- package/src/bricks/adr-challenge.md +20 -0
- package/src/bricks/adr-draft.md +15 -0
- package/src/bricks/apply.md +17 -0
- package/src/bricks/baseline-green.md +17 -0
- package/src/bricks/bruno-test.md +16 -0
- package/src/bricks/characterize.md +17 -0
- package/src/bricks/ci-fix.md +18 -0
- package/src/bricks/ci-triage.md +20 -0
- package/src/bricks/compat-check.md +16 -0
- package/src/bricks/deps-audit.md +14 -0
- package/src/bricks/docs-update.md +15 -0
- package/src/bricks/done-check.md +16 -0
- package/src/bricks/fitness-define.md +22 -0
- package/src/bricks/flake-check.md +17 -0
- package/src/bricks/flake-repro.md +18 -0
- package/src/bricks/identify.md +23 -0
- package/src/bricks/lint.md +14 -0
- package/src/bricks/migration-plan.md +21 -0
- package/src/bricks/mutation-check.md +18 -0
- package/src/bricks/plan.md +17 -0
- package/src/bricks/red-test.md +16 -0
- package/src/bricks/reproduce.md +16 -0
- package/src/bricks/review.md +19 -0
- package/src/bricks/security-scan.md +17 -0
- package/src/bricks/spec.md +18 -0
- package/src/bricks/test.md +14 -0
- package/src/bricks/upgrade-scout.md +16 -0
- package/src/doctrines/process.md +11 -8
- package/src/loops/api-endpoint.json +31 -0
- package/src/loops/architecture-decision.json +22 -0
- package/src/loops/bugfix.json +23 -0
- package/src/loops/ci-repair.json +19 -0
- package/src/loops/deps-upgrade.json +29 -0
- package/src/loops/enforce-architecture-rule.json +28 -0
- package/src/loops/feature.json +24 -0
- package/src/loops/fix-flaky-tests.json +30 -0
- package/src/loops/legacy-refactor.json +26 -0
- package/src/loops/legacy-tests.json +29 -0
- package/src/loops/refactor.json +24 -0
- package/src/loops/remove-dead-code.json +30 -0
- package/src/loops/spec-first-feature.json +29 -0
- package/src/loops/tdd.json +25 -0
- package/src/loops/update-contract.json +33 -0
- package/src/skills/brick-forge.md +48 -0
- package/src/skills/bruno-collection-generator.md +3 -3
- package/src/skills/bruno-test-writer.md +3 -3
- package/src/skills/ci-fix.md +3 -3
- package/src/skills/consolidate-memory.md +4 -4
- package/src/skills/council.md +1 -1
- package/src/skills/fresh-eyes.md +1 -1
- package/src/skills/geneseed.md +1 -1
- package/src/skills/git-archaeology.md +1 -1
- package/src/skills/git-rescue.md +4 -3
- package/src/skills/handoff.md +1 -1
- package/src/skills/herdr.md +1 -1
- package/src/skills/learn-mode.md +2 -2
- package/src/skills/loop.md +111 -0
- package/src/skills/opencode-theme.md +3 -3
- package/src/skills/ponytail.md +1 -1
- package/src/skills/profile.md +3 -4
- package/src/skills/prose.md +2 -3
- package/src/skills/quiz.md +1 -1
- package/src/skills/react-view-transitions/SKILL.md +1 -1
- package/src/skills/react-view-transitions/VENDOR.md +8 -3
- package/src/skills/research.md +3 -3
- package/src/skills/review-response.md +2 -2
- package/src/skills/rule.md +3 -3
- package/src/skills/security-audit.md +4 -4
- package/src/skills/teach.md +1 -1
- package/src/skills/wiki.md +3 -3
- package/src/skills/workflow.md +4 -4
- package/src/skills/worktree.md +2 -2
- package/themes/_TEMPLATE.json +2 -0
- package/themes/biker.json +2 -0
- package/themes/commentator.json +2 -0
- package/themes/cyberpunk.json +2 -0
- package/themes/gamer.json +2 -0
- package/themes/imperial.json +2 -0
- package/themes/joker.json +2 -0
- package/themes/marvin.json +2 -0
- package/themes/mean.json +2 -0
- package/themes/military.json +2 -0
- package/themes/neutral.json +2 -0
- package/themes/pirate.json +2 -0
- package/themes/sports.json +2 -0
- package/themes/verstappen.json +2 -0
- package/themes/wizard.json +2 -0
- package/web/dist/assets/Activity-Ca2Aruu7.js +1 -0
- package/web/dist/assets/ActivityDetail-Bo7v4Z_r.js +1 -0
- package/web/dist/assets/Dashboard-BuMq46aT.js +2 -0
- package/web/dist/assets/Docs-BzccCllG.js +5 -0
- package/web/dist/assets/FilterInput-CBcJBQPI.js +1 -0
- package/web/dist/assets/GreenhouseView-BCIKcnGG.js +2 -0
- package/web/dist/assets/Installs-DMFJvq7s.js +2 -0
- package/web/dist/assets/JournalView-o1rmd1_1.js +1 -0
- package/web/dist/assets/Laws-BANxq_I_.js +3 -0
- package/web/dist/assets/Library-DW4x0fbh.js +1 -0
- package/web/dist/assets/Loops-DEBibbBP.js +2 -0
- package/web/dist/assets/{Markdown-qjM2_ofS.js → Markdown-CdTX0kLe.js} +14 -14
- package/web/dist/assets/OperatorHudView-CLD0fYaA.js +2 -0
- package/web/dist/assets/Personal-6uMJvyBG.js +1 -0
- package/web/dist/assets/Tabs-BubnyZhF.js +1 -0
- package/web/dist/assets/activity-CObqyxkL.js +1 -0
- package/web/dist/assets/{api-Dc8f3ca-.js → api-D_ixdyEY.js} +1 -1
- package/web/dist/assets/drawable-C_x5xncq.js +1 -0
- package/web/dist/assets/index-CMPgezFm.js +2 -0
- package/web/dist/assets/index-DMsT4Aa6.css +1 -0
- package/web/dist/assets/{react-B9Z_tXRV.js → react-Bbzhmq4v.js} +1 -1
- package/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/web/dist/assets/sections-Dg23Hel5.js +1 -0
- package/web/dist/assets/usePoll-BOqeunzF.js +1 -0
- package/web/dist/index.html +6 -5
- package/web/dist/assets/Activity-C52LEb-2.js +0 -1
- package/web/dist/assets/ActivityDetail-CjNLRvXg.js +0 -1
- package/web/dist/assets/Dashboard-B6_sSCHi.js +0 -2
- package/web/dist/assets/Docs-Dj7BmCSA.js +0 -5
- package/web/dist/assets/FilterInput-CVyqmYWM.js +0 -1
- package/web/dist/assets/GreenhouseView-BALwjQsA.js +0 -2
- package/web/dist/assets/Installs-BbffDQm3.js +0 -2
- package/web/dist/assets/JournalView-JpAQ8Hqe.js +0 -1
- package/web/dist/assets/Laws-DK7eCWSm.js +0 -3
- package/web/dist/assets/Library-CoamHelE.js +0 -1
- package/web/dist/assets/OperatorHudView-DVx1HlBx.js +0 -2
- package/web/dist/assets/Personal-eaXb1zcj.js +0 -1
- package/web/dist/assets/Tabs-BmGtt8E2.js +0 -1
- package/web/dist/assets/drawable-Du_PZrQj.js +0 -1
- package/web/dist/assets/index-Bz_KMRDH.css +0 -1
- package/web/dist/assets/index-CNFH7o55.js +0 -2
- package/web/dist/assets/sections-GalMS0Zv.js +0 -1
- package/web/dist/assets/usePoll-O0sJEw1Y.js +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: adr-challenge
|
|
3
|
+
description: Attack the ADR this iteration drafted; the user reviews the ADR that survives.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: skeptic
|
|
6
|
+
gate: human
|
|
7
|
+
gateOn: pass
|
|
8
|
+
outcomes: pass, fail
|
|
9
|
+
---
|
|
10
|
+
Read the ADR this iteration wrote as a skeptic reading it cold. Is a decision driver missing? Is
|
|
11
|
+
a rejected option strawmanned? Is a consequence — cost, risk, the way back — left unstated? Does
|
|
12
|
+
it contradict an accepted ADR in the same folder, or the code as it stands? A gate amendment in
|
|
13
|
+
LOOP.md's notes for this ADR is a finding: report `fail` until the ADR answers it.
|
|
14
|
+
|
|
15
|
+
Never edit any file — findings go back to `adr-draft`, which revises the ADR.
|
|
16
|
+
|
|
17
|
+
Report `fail` only on findings that would change the decision or its consequences, never on
|
|
18
|
+
wording or style: write each one to a file in the OS temp directory and report that file's path
|
|
19
|
+
with the outcome. Report `pass` otherwise — the user then reviews the ADR before the loop
|
|
20
|
+
continues: write its path and the decision in one line to a temp file and report that path.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: adr-draft
|
|
3
|
+
description: Write or revise one architecture decision record for the card's decision.
|
|
4
|
+
effect: mutate
|
|
5
|
+
agent: architect
|
|
6
|
+
outcomes: pass
|
|
7
|
+
---
|
|
8
|
+
Write or revise the ADR file the card's write set names, in Nygard form: Status: Proposed,
|
|
9
|
+
Context, Decision, Consequences — the costs as well as the gains — and at least two options
|
|
10
|
+
considered, each with why it lost. Touch only that file; never change code.
|
|
11
|
+
|
|
12
|
+
If LOOP.md's notes carry `adr-challenge` findings or a gate amendment for this ADR, answer each
|
|
13
|
+
one: change the decision, or record it under Consequences.
|
|
14
|
+
|
|
15
|
+
Report `pass` once the ADR is written.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: apply
|
|
3
|
+
description: Implement the current card's intent, touching only its declared write set.
|
|
4
|
+
effect: mutate
|
|
5
|
+
agent: developer
|
|
6
|
+
outcomes: pass
|
|
7
|
+
---
|
|
8
|
+
Implement the card's intent exactly, touching only the files in its `writeSet`. If the card
|
|
9
|
+
carries an `amend`, that supersedes the original intent — follow the amendment, not the plan it
|
|
10
|
+
replaced.
|
|
11
|
+
|
|
12
|
+
Make no unrelated edits: no drive-by rename, no incidental cleanup, no touching a file the card
|
|
13
|
+
did not declare. If the change genuinely needs a file outside the write set, stop and report that
|
|
14
|
+
rather than widening scope unasked — the diff is scored against the declared set, not your
|
|
15
|
+
judgement of what else looked wrong.
|
|
16
|
+
|
|
17
|
+
Report `pass` once the change is made, with a short account of what changed and where.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: baseline-green
|
|
3
|
+
description: Confirm the suite and linter are green before the loop changes anything.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: tester
|
|
6
|
+
outcomes: pass, fail
|
|
7
|
+
---
|
|
8
|
+
Run this project's full test suite and its linter, unchanged — no fix, no skip, no retry with
|
|
9
|
+
different flags. This is the loop's starting line, not a chance to tidy up first.
|
|
10
|
+
|
|
11
|
+
Report `pass` only if every test and the linter both exit clean. Include the raw command output
|
|
12
|
+
in your report either way, so a `fail` carries the actual failure rather than a summary of it.
|
|
13
|
+
|
|
14
|
+
Report `fail` on the first red suite or linter run, and stop there: a loop that starts on a red
|
|
15
|
+
baseline cannot tell its own changes apart from pre-existing breakage.
|
|
16
|
+
|
|
17
|
+
Never edit, create or delete any file: this brick only reads.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bruno-test
|
|
3
|
+
description: Write or update Bruno requests for the endpoints this iteration touched.
|
|
4
|
+
effect: mutate
|
|
5
|
+
skill: bruno-test-writer
|
|
6
|
+
outcomes: pass, fail
|
|
7
|
+
---
|
|
8
|
+
Follow the bruno-test-writer skill for every endpoint this iteration's diff added or changed.
|
|
9
|
+
Touch only the Bruno collection — new or updated `.bru` requests and their expectations — never
|
|
10
|
+
the application code.
|
|
11
|
+
|
|
12
|
+
Report `pass` once every touched endpoint has a request that exercises it and asserts on the
|
|
13
|
+
response.
|
|
14
|
+
|
|
15
|
+
Report `fail` if an endpoint cannot be exercised this way (missing auth fixture, no reachable
|
|
16
|
+
instance, an endpoint the diff removed), naming which one and why.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: characterize
|
|
3
|
+
description: Pin what legacy code does today with characterization tests, touching tests only.
|
|
4
|
+
effect: mutate
|
|
5
|
+
agent: tester
|
|
6
|
+
outcomes: pass, fail
|
|
7
|
+
---
|
|
8
|
+
For the card's change point (with no card, the code the requirement names), write tests that pin
|
|
9
|
+
what the code DOES today, not what it should do: assert a value you expect to be wrong, run it,
|
|
10
|
+
and copy the observed value in. Touch only test files — never production code.
|
|
11
|
+
|
|
12
|
+
Pin odd behaviour as it is and name it in the test's title; do not fix it here. If LOOP.md's notes
|
|
13
|
+
list surviving mutants for this card, add the assertions that kill them.
|
|
14
|
+
|
|
15
|
+
Report `pass` once the new tests run green against the unchanged code.
|
|
16
|
+
Report `fail` if the code cannot be put under test without breaking a dependency first — that is
|
|
17
|
+
a refactor in its own right — naming the dependency.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ci-fix
|
|
3
|
+
description: Fix the failing CI check named in the card.
|
|
4
|
+
effect: mutate
|
|
5
|
+
skill: ci-fix
|
|
6
|
+
outcomes: pass, fail
|
|
7
|
+
---
|
|
8
|
+
Follow the ci-fix skill against the failing check the card names — read its actual log, not a
|
|
9
|
+
guess from the check's title, before changing anything.
|
|
10
|
+
|
|
11
|
+
Touch only what that failure requires; this is a repair, not a chance to improve the pipeline
|
|
12
|
+
along the way.
|
|
13
|
+
|
|
14
|
+
Report `pass` once the named check is fixed and green LOCALLY — CI itself is re-read after the
|
|
15
|
+
push, not here.
|
|
16
|
+
|
|
17
|
+
Report `fail` if the check cannot be fixed from this repo alone (an infra outage, a flake with no
|
|
18
|
+
reproducible cause, a required secret that is missing), naming why.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ci-triage
|
|
3
|
+
description: Read the failing CI checks for this commit and pick one code failure to fix, or stop.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: explorer
|
|
6
|
+
outcomes: more, done
|
|
7
|
+
---
|
|
8
|
+
Key on the commit, not the branch: `gh run list --commit <HEAD sha> --json databaseId,status,conclusion`.
|
|
9
|
+
A commit pushed moments ago may not have a run yet — poll that command for up to ~2 minutes
|
|
10
|
+
before concluding none exists. Wait on a pending run with `gh run watch <id>`, then read
|
|
11
|
+
`gh run view <id> --log-failed` — never guess from a check's title. Classify each failure as
|
|
12
|
+
code, flaky or infra. Never edit any file. `ci-repair` needs CI to run on `loop/*` branches: if
|
|
13
|
+
still no run after that poll, write "CI does not run for <sha>" to a file in the OS temp
|
|
14
|
+
directory and report `done` with that file's path — never as green.
|
|
15
|
+
|
|
16
|
+
Write the classification, one failure per line, to a file in the OS temp directory and report
|
|
17
|
+
that file's path with the outcome. Report `more` with a card for ONE code failure:
|
|
18
|
+
{"intent": "<fix check X: cause>", "writeSet": ["<files the fix touches>"],
|
|
19
|
+
"actions": ["<each of: format, imports, rename, logic, new-file, api, delete, architecture>"]}
|
|
20
|
+
Report `done` when CI is green for HEAD, or only flaky or infra failures remain — naming them.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: compat-check
|
|
3
|
+
description: Confirm consumers of the old and the new interface both still work after this iteration.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: tester
|
|
6
|
+
outcomes: pass, fail
|
|
7
|
+
---
|
|
8
|
+
Run the tests of every consumer this change can reach — those still on the old shape as well as
|
|
9
|
+
those already moved — and, where the repo records consumer contracts (Pact, Spring Cloud
|
|
10
|
+
Contract), the provider verification against them. In a contract step, where the old shape is
|
|
11
|
+
removed on purpose, check instead that no consumer still uses it. Never edit any file: send
|
|
12
|
+
reports to the OS temp directory.
|
|
13
|
+
|
|
14
|
+
Report `pass` if every consumer works. Report `fail` naming the broken consumer, the check and
|
|
15
|
+
its raw failure, written to a file in the OS temp directory — report that file's path with the
|
|
16
|
+
outcome.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deps-audit
|
|
3
|
+
description: Audit this iteration's dependency changes for known vulnerabilities.
|
|
4
|
+
effect: read
|
|
5
|
+
skill: deps-audit
|
|
6
|
+
outcomes: pass, fail
|
|
7
|
+
---
|
|
8
|
+
Follow the deps-audit skill against the dependency manifest this iteration's diff touched (or the
|
|
9
|
+
whole manifest, if nothing else scopes it). Never edit any file; this brick only observes.
|
|
10
|
+
|
|
11
|
+
Report `pass` if the audit finds nothing at high severity or above.
|
|
12
|
+
|
|
13
|
+
Report `fail` on any finding at high severity or above, naming the package, the version, the
|
|
14
|
+
advisory, and the fix the skill recommends (upgrade, pin, or removal).
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: docs-update
|
|
3
|
+
description: Update the documentation this iteration's diff made stale.
|
|
4
|
+
effect: mutate
|
|
5
|
+
agent: docs
|
|
6
|
+
outcomes: pass
|
|
7
|
+
---
|
|
8
|
+
Read this iteration's diff and find every doc it made stale: a changed signature, a renamed
|
|
9
|
+
flag, a moved file, a behaviour the README or docs still describe the old way.
|
|
10
|
+
|
|
11
|
+
Update only those docs, only to match what the diff actually changed. Do not rewrite unrelated
|
|
12
|
+
prose, reorganize a page, or fix an unrelated staleness you happen to notice while in there.
|
|
13
|
+
|
|
14
|
+
Report `pass` once every doc the diff touched is back in sync, naming the files you changed — or
|
|
15
|
+
that none needed it, if the diff left nothing stale.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: done-check
|
|
3
|
+
description: Verify the requirement is met — every acceptance criterion proven by a passing test or a stated manual check.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: reviewer
|
|
6
|
+
outcomes: pass, fail
|
|
7
|
+
---
|
|
8
|
+
Read the requirement's acceptance criteria — `specs/<slug>/spec.md` when the branch has one, else
|
|
9
|
+
the requirement in LOOP.md — and the branch's full diff against its base. Run the suite. For
|
|
10
|
+
every criterion, name the test that proves it, or the manual check (what to do, what to see) when
|
|
11
|
+
no test can. Never edit any file. Judge only the stated criteria — never style or extras.
|
|
12
|
+
|
|
13
|
+
Report `pass` only if every criterion maps to a passing test or a stated manual check.
|
|
14
|
+
Report `fail` otherwise: write each unmet criterion, one per line, with what is missing (no test,
|
|
15
|
+
a failing test, a half-built behaviour) to a file in the OS temp directory and report that file's
|
|
16
|
+
path — the next iteration's `identify` builds from it.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fitness-define
|
|
3
|
+
description: Encode the requirement's architecture rule as a test, with an allowlist of today's violations.
|
|
4
|
+
effect: mutate
|
|
5
|
+
agent: architect
|
|
6
|
+
gate: human
|
|
7
|
+
outcomes: pass, fail
|
|
8
|
+
---
|
|
9
|
+
Turn the requirement's architecture rule into an executable test in the suite, with the repo's
|
|
10
|
+
own tools first: ArchUnit for Java (a `FreezingArchRule`, whose violation store is the
|
|
11
|
+
allowlist), then dependency-cruiser, import-linter, eslint-plugin-boundaries or size-limit.
|
|
12
|
+
Record today's violations in an allowlist beside the test so the suite stays green — each later
|
|
13
|
+
iteration removes one entry. Touch only the test, its allowlist and the tool's test-scoped setup,
|
|
14
|
+
and declare the tool's generated store as a glob in the write set (`--write-set '**/archunit_store/**'`
|
|
15
|
+
— single-quote it, the same as any glob in `--write-set`).
|
|
16
|
+
|
|
17
|
+
The user reviews the rule before the loop continues: write the rule in one sentence, the test's
|
|
18
|
+
path, the allowlist's path and its entry count to a file in the OS temp directory and report that
|
|
19
|
+
file's path with the outcome.
|
|
20
|
+
|
|
21
|
+
Report `pass` once the test runs green with the allowlist in place. Report `fail` if the rule
|
|
22
|
+
cannot be checked deterministically, with the note file naming what is ambiguous.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flake-check
|
|
3
|
+
description: Rerun the card's test until it proves stable — a retry or a sleep is not a fix.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: tester
|
|
6
|
+
outcomes: stable, flaky
|
|
7
|
+
---
|
|
8
|
+
Rerun the card's test 20 times alone, then 20 with its suite, as `flake-repro` did (Maven: a
|
|
9
|
+
loop of `mvn test -Dtest=<Class>#<method>`, shuffled). Never edit any file.
|
|
10
|
+
|
|
11
|
+
Read this iteration's diff first. Polling on the awaited condition (Awaitility
|
|
12
|
+
`await().atMost(…).until(…)`, `waitFor`) in place of a fixed sleep is a fix; adding a sleep or
|
|
13
|
+
raising an existing timeout is not, and neither is a retry (`rerunFailingTestsCount`,
|
|
14
|
+
`@RetryingTest`, `jest.retryTimes`) — report `flaky` naming it, whatever the runs say.
|
|
15
|
+
|
|
16
|
+
Report `stable` only on 0 failures in all runs. Report `flaky` otherwise, with the failure count
|
|
17
|
+
and one failure's output in a file in the OS temp directory — report that file's path.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flake-repro
|
|
3
|
+
description: Confirm which suspected tests are flaky by repeated runs, before anything is fixed.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: tester
|
|
6
|
+
outcomes: flaky, stable, broken
|
|
7
|
+
---
|
|
8
|
+
Run each suspected test the requirement names 20 times (or the N it gives) alone, then 20 with
|
|
9
|
+
its suite in a shuffled order — no code change, no retry option. Maven: loop `mvn test
|
|
10
|
+
-Dtest=<Class>#<method>` (multi-module: add `-pl <module> -Dsurefire.failIfNoSpecifiedTests=false`),
|
|
11
|
+
shuffled with `-Dsurefire.runOrder=random` and, under JUnit 5,
|
|
12
|
+
`-Djunit.jupiter.testmethod.order.default=org.junit.jupiter.api.MethodOrderer$Random`. Never
|
|
13
|
+
`-Dsurefire.rerunFailingTestsCount`: it hides the failures you count. Never edit any file. Write
|
|
14
|
+
each test as `<test>: <failures>/<runs>` with one failure's output to a file in the OS temp
|
|
15
|
+
directory and report that file's path.
|
|
16
|
+
|
|
17
|
+
Report `broken` if any test fails every run — a bug for `bugfix`, not a flake. Report `flaky` if a
|
|
18
|
+
test failed some runs, listing the confirmed ones. Report `stable` if none failed.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: identify
|
|
3
|
+
description: Choose the next iteration of the loop, or declare the requirement done.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: explorer
|
|
6
|
+
outcomes: more, done
|
|
7
|
+
---
|
|
8
|
+
Read the requirement and the loop's history (LOOP.md, `git log --format=%(trailers)` on this
|
|
9
|
+
branch). If the requirement is fully met and the suite is green, report `done`.
|
|
10
|
+
|
|
11
|
+
Otherwise pick the SMALLEST next change that moves the requirement forward and can be tested on
|
|
12
|
+
its own — when the branch has `specs/*/spec.md`, its next unfinished task. If the latest note is
|
|
13
|
+
`done-check`'s unmet criteria, report `more` with a card for one of them, never `done`. Report
|
|
14
|
+
`more` with a card, as JSON:
|
|
15
|
+
{"intent": "<one line>", "writeSet": ["<every file ANY brick this iteration writes, tests/docs too>"],
|
|
16
|
+
"actions": ["<each of: format, imports, rename, logic, new-file, api, delete, architecture>"]}
|
|
17
|
+
|
|
18
|
+
Declare every action honestly: the diff is scored again before commit, and anything outside the
|
|
19
|
+
write set or under-declared escalates to a blocking stop. If LOOP.md's notes say the previous
|
|
20
|
+
attempt was re-split, make this card strictly smaller than that one. The card obeys every
|
|
21
|
+
instruction in the template's `rules` (e.g. its intent cites the proof that code is unused).
|
|
22
|
+
|
|
23
|
+
Never edit, create or delete any file: this brick only reads.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lint
|
|
3
|
+
description: Run the project's linter alone, without the test suite.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: tester
|
|
6
|
+
outcomes: pass, fail
|
|
7
|
+
---
|
|
8
|
+
Run this project's linter only — not the test suite, which is `test`'s job. Never edit any file;
|
|
9
|
+
this brick only observes.
|
|
10
|
+
|
|
11
|
+
Report `pass` if the linter exits clean.
|
|
12
|
+
|
|
13
|
+
Report `fail` otherwise, with the raw linter output (every violation, not a count or a summary)
|
|
14
|
+
so the next `apply` can act on the actual finding.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: migration-plan
|
|
3
|
+
description: Plan a breaking interface change as expand, migrate each consumer, contract — for the user to review.
|
|
4
|
+
effect: read
|
|
5
|
+
skill: migrate
|
|
6
|
+
gate: human
|
|
7
|
+
outcomes: pass, fail
|
|
8
|
+
---
|
|
9
|
+
Following the migrate skill, plan the change as ordered steps: expand (add the new shape beside
|
|
10
|
+
the old), migrate (one consumer or call-site group per step), contract (remove the old shape).
|
|
11
|
+
Every step must leave the system deployable and fit one `identify` card. Name the contract files
|
|
12
|
+
the expand and contract steps touch — API specs, schema migrations, event schemas. Never edit any
|
|
13
|
+
file.
|
|
14
|
+
|
|
15
|
+
The user reviews the plan before the loop continues: write the steps, one per line, then the
|
|
16
|
+
contract files, to a file in the OS temp directory and report that file's path with the outcome.
|
|
17
|
+
Those files belong in LOOP.md's `contracts`, so the expand and contract steps stop for a human:
|
|
18
|
+
the user adds any the template's defaults miss to LOOP.md's `contracts` before answering ok.
|
|
19
|
+
|
|
20
|
+
Report `pass` with the plan. Report `fail` if no backward-compatible path exists, naming what
|
|
21
|
+
forces the break.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mutation-check
|
|
3
|
+
description: Prove the new tests bite, by mutation testing scoped to the code the card names.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: tester
|
|
6
|
+
outcomes: pass, fail, unavailable
|
|
7
|
+
---
|
|
8
|
+
Run the project's mutation tool scoped to the production code the card's intent names. Java: PIT
|
|
9
|
+
first — `mvn test-compile org.pitest:pitest-maven:mutationCoverage -DtargetClasses=<fq.Class*>
|
|
10
|
+
-DreportsDirectory=<OS temp dir> -DtimestampedReports=false`, or Gradle's `pitest` task; else
|
|
11
|
+
Stryker, mutmut or cargo-mutants. Never edit any file — reports and caches (.mutmut-cache,
|
|
12
|
+
mutants.out/, .stryker-tmp/) go to the OS temp dir, or are removed.
|
|
13
|
+
|
|
14
|
+
Report `pass` if no surviving mutant sits on a line the new tests target. Report `fail` with each
|
|
15
|
+
survivor as `file:line`, the mutation, and the assertion that would kill it, in a file in the OS
|
|
16
|
+
temp directory — report its path. Report `unavailable` when no tool is configured — the pom lacks
|
|
17
|
+
`pitest-junit5-plugin` under JUnit 5, or Gradle does not apply `info.solidsoft.pitest`: never add
|
|
18
|
+
it to the build; write what you checked to a temp file and report its path.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan
|
|
3
|
+
description: Split the requirement into an ordered list of iterations before any code changes.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: architect
|
|
6
|
+
outcomes: pass
|
|
7
|
+
---
|
|
8
|
+
Read the requirement and survey the code it touches. Split the work into an ordered list of
|
|
9
|
+
small iterations, each one sized to a single `identify` card — one testable change apiece.
|
|
10
|
+
|
|
11
|
+
Do not edit any code; this brick only plans it. `plan` is not an iteration head, so its card is
|
|
12
|
+
never recorded — write the ordered list, one iteration per line, to a file in the OS temp
|
|
13
|
+
directory (never inside the worktree) and report that file's path with the outcome, so it is
|
|
14
|
+
recorded into LOOP.md's notes. Report `pass`.
|
|
15
|
+
|
|
16
|
+
If the requirement cannot be split — it is already one atomic change — say so in the note file
|
|
17
|
+
and let the loop proceed with a single iteration.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: red-test
|
|
3
|
+
description: Write the failing test for the card's intent before any production code changes.
|
|
4
|
+
effect: mutate
|
|
5
|
+
agent: tester
|
|
6
|
+
outcomes: red, green, untestable
|
|
7
|
+
---
|
|
8
|
+
Write the smallest test that expresses the card's intent at its seam, touching only the test
|
|
9
|
+
files in the card's `writeSet` — never production code; making it pass is `apply`'s job. Run it.
|
|
10
|
+
|
|
11
|
+
Report `red` if it fails FOR THE REASON the intent states — not an import error, a typo, or a
|
|
12
|
+
broken fixture in the test itself.
|
|
13
|
+
Report `green` if it already passes: the behaviour exists, so keep the test as coverage.
|
|
14
|
+
Report `untestable` if no seam lets a test reach the behaviour without changing production code
|
|
15
|
+
first, naming what blocks it. If the card's `writeSet` names no test file, report `untestable`
|
|
16
|
+
and say so.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reproduce
|
|
3
|
+
description: Write the smallest test that reproduces the bug and watch it fail.
|
|
4
|
+
effect: mutate
|
|
5
|
+
agent: tester
|
|
6
|
+
outcomes: pass, fail
|
|
7
|
+
---
|
|
8
|
+
Write the smallest possible test that demonstrates the bug the requirement describes. Run it and
|
|
9
|
+
confirm it fails, and that it fails FOR THE STATED REASON — not for an unrelated error.
|
|
10
|
+
|
|
11
|
+
Touch only the new test file; do not change any production code here, and do not try to make the
|
|
12
|
+
test pass. A reproduction that already passes proves nothing.
|
|
13
|
+
|
|
14
|
+
Report `pass` once a failing reproduction exists, with the test's path and the failure it shows.
|
|
15
|
+
Report `fail` if the bug cannot be reproduced from the requirement as written — say what you
|
|
16
|
+
tried and why each attempt did not fail the way the requirement claims.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review
|
|
3
|
+
description: Review this iteration's diff against the card it was supposed to implement.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: reviewer
|
|
6
|
+
outcomes: pass, fail
|
|
7
|
+
---
|
|
8
|
+
Read the card's intent and write set, then read the diff this iteration actually produced. Check
|
|
9
|
+
that the diff matches the intent, stays inside the declared write set, does not smuggle in an
|
|
10
|
+
unrelated change, and keeps any rule in `rules` (e.g. a cited proof that code is unused).
|
|
11
|
+
|
|
12
|
+
Never edit any file — findings go back to `apply`, which makes the fix.
|
|
13
|
+
|
|
14
|
+
Report `pass` if the diff is a faithful, scoped implementation of the card.
|
|
15
|
+
|
|
16
|
+
Report `fail` with concrete findings — `file:line`, what is wrong, what to do instead — if the
|
|
17
|
+
diff drifts from the intent, touches an undeclared file, breaks a rule, or leaves an obvious defect behind.
|
|
18
|
+
The outcome alone does not carry the findings to `apply` — write them to a file in the OS temp
|
|
19
|
+
directory (never inside the worktree) and report that file's path with the outcome.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: security-scan
|
|
3
|
+
description: Security review of this iteration's diff.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: security
|
|
6
|
+
outcomes: pass, fail
|
|
7
|
+
---
|
|
8
|
+
Read this iteration's diff and review it for security issues: injected input reaching a
|
|
9
|
+
dangerous sink, a widened trust boundary, a secret written to disk or logs, a weakened auth or
|
|
10
|
+
permission check — anything that would not survive a real security review.
|
|
11
|
+
|
|
12
|
+
Never edit any file; this brick only observes and reports.
|
|
13
|
+
|
|
14
|
+
Report `pass` if nothing in the diff raises a security concern.
|
|
15
|
+
|
|
16
|
+
Report `fail` with each finding as `file:line`, the concrete risk, and the fix — severe enough to
|
|
17
|
+
block the iteration, not a style nit that belongs in `review` instead.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec
|
|
3
|
+
description: Write the feature's spec — scope, EARS acceptance criteria, ordered tasks — for the user to review.
|
|
4
|
+
effect: mutate
|
|
5
|
+
agent: architect
|
|
6
|
+
gate: human
|
|
7
|
+
outcomes: pass, fail
|
|
8
|
+
---
|
|
9
|
+
Write `specs/<slug>/spec.md` (the slug of the loop's title) and touch nothing else — no code: the
|
|
10
|
+
problem, what is out of scope, acceptance criteria in EARS form ("WHEN <trigger> THE SYSTEM SHALL
|
|
11
|
+
<response>"), each one testable, and an ordered task list sized to one `identify` card apiece,
|
|
12
|
+
ending with an end-to-end verification task. A gate amendment in LOOP.md's notes answers your
|
|
13
|
+
open questions or corrects the spec: revise the spec to follow it.
|
|
14
|
+
|
|
15
|
+
The user reviews the spec before the loop continues. Report `pass` once every criterion is
|
|
16
|
+
testable, with the spec's path and its criteria count in a file in the OS temp directory — report
|
|
17
|
+
that file's path. Report `fail` if a criterion cannot be stated testably: list the open questions
|
|
18
|
+
in such a file and report its path; the user answers them with an amend.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test
|
|
3
|
+
description: Run the suite and linter over this iteration's change.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: tester
|
|
6
|
+
outcomes: pass, fail
|
|
7
|
+
---
|
|
8
|
+
Run this project's full test suite and its linter over the current change. Never edit any file —
|
|
9
|
+
this brick only observes; a fix belongs in `apply`, not here.
|
|
10
|
+
|
|
11
|
+
Report `pass` only if both exit clean.
|
|
12
|
+
|
|
13
|
+
Report `fail` otherwise, with the raw failures (not a paraphrase) so `apply` can act on the actual
|
|
14
|
+
error rather than your summary of it. Name every failing test and lint violation you saw.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: upgrade-scout
|
|
3
|
+
description: Pick the next dependency upgrade and read its breaking changes, or declare all done.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: researcher
|
|
6
|
+
outcomes: more, done
|
|
7
|
+
---
|
|
8
|
+
Read the requirement and the loop's history (LOOP.md, `git log --format=%(trailers)` on this
|
|
9
|
+
branch). Pick the next package or group the requirement names that is not yet upgraded, skipping
|
|
10
|
+
any release younger than 14 days, and read its changelog or migration guide. Never edit any file.
|
|
11
|
+
|
|
12
|
+
Report `done` when every named package is upgraded. Otherwise report `more` with a card:
|
|
13
|
+
{"intent": "<bump X to N and adapt>", "writeSet": ["<manifest, lockfile, every file to adapt>"],
|
|
14
|
+
"actions": ["<each of: format, imports, rename, logic, new-file, api, delete, architecture>"]}
|
|
15
|
+
Write the breaking changes that hit this repo to a file in the OS temp directory and report that
|
|
16
|
+
file's path with the outcome — the card alone does not carry them to `apply`.
|
package/src/doctrines/process.md
CHANGED
|
@@ -85,7 +85,9 @@ time — a personal feature branch included. A one-time approval is not standing
|
|
|
85
85
|
consent. Consent may cover a **named batch**: "commit as you go on this branch"
|
|
86
86
|
stands for commits on that branch until the session ends or the scope changes; a
|
|
87
87
|
new session, a new branch, or a widened scope re-asks. Push earns no such default
|
|
88
|
-
and stays per-ask unless granted in the same named form.
|
|
88
|
+
and stays per-ask unless granted in the same named form. A launched loop's batch
|
|
89
|
+
covers commit and push on its own `loop/*` branch; merging that branch into a
|
|
90
|
+
shared one never is. Before each, present in
|
|
89
91
|
order (1) a plain-language summary of what changed and why and (2) the exact
|
|
90
92
|
commit message you intend to use, then wait. Never push on your own initiative.
|
|
91
93
|
On a **shared branch** — `main`, `master`, `develop`, `development`, a
|
|
@@ -97,13 +99,14 @@ through the git-rescue {{SKILL}} behind a backup. The host gates commit and push
|
|
|
97
99
|
the tool boundary too, so this consent cannot be lost to a sticky allowlist.
|
|
98
100
|
<!-- LEAN:else -->
|
|
99
101
|
Recording and sharing code is consented, never unilateral: **every** `git commit` and
|
|
100
|
-
`git push` needs
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
`main`, `master`, `develop`,
|
|
105
|
-
take the same gate. Never force-push,
|
|
106
|
-
(git-rescue {{SKILL}} for a
|
|
102
|
+
`git push` needs **explicit acceptance**, every branch, every time; one-time approval is
|
|
103
|
+
not standing consent. A named batch ("commit as you go") stands until the session ends or
|
|
104
|
+
scope changes; push earns no default. A launched loop's batch covers commit and push on
|
|
105
|
+
its own `loop/*` branch only; merging it never. Show the plain summary and the exact
|
|
106
|
+
commit message before each, then wait. Shared branches — `main`, `master`, `develop`,
|
|
107
|
+
`development`, `release`/`hotfix`, any unsure — take the same gate. Never force-push,
|
|
108
|
+
hard-reset, or rebase one: undo with a revert commit (git-rescue {{SKILL}} for a
|
|
109
|
+
legitimate rewrite). The host gates both at the tool boundary.
|
|
107
110
|
<!-- LEAN:end -->
|
|
108
111
|
|
|
109
112
|
### {{DOCTRINE:bound-the-loop}} Bound the Loop
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "api-endpoint",
|
|
3
|
+
"description": "Build an HTTP API feature (a Spring MVC controller, say) one endpoint change per iteration: plan, apply, test, write or update the endpoint's Bruno request, run a security review, and review.",
|
|
4
|
+
"category": "development",
|
|
5
|
+
"rules": [
|
|
6
|
+
"The card's write set names the endpoint's .bru requests too, not only the code.",
|
|
7
|
+
"An OpenAPI or Swagger spec edit stops for a human by design; the aggressive preset or trimming LOOP.md's contracts relaxes it."
|
|
8
|
+
],
|
|
9
|
+
"nodes": ["plan", "identify", "apply", "test", "bruno-test", "security-scan", "review"],
|
|
10
|
+
"start": "plan",
|
|
11
|
+
"edges": [
|
|
12
|
+
{ "from": "plan", "on": "pass", "to": "identify" },
|
|
13
|
+
{ "from": "identify", "on": "more", "to": "apply" },
|
|
14
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
15
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
16
|
+
{ "from": "test", "on": "pass", "to": "bruno-test" },
|
|
17
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
18
|
+
{ "from": "bruno-test", "on": "pass", "to": "security-scan" },
|
|
19
|
+
{ "from": "bruno-test", "on": "fail", "to": "$stop" },
|
|
20
|
+
{ "from": "security-scan", "on": "pass", "to": "review" },
|
|
21
|
+
{ "from": "security-scan", "on": "fail", "to": "apply" },
|
|
22
|
+
{ "from": "review", "on": "pass", "to": "identify" },
|
|
23
|
+
{ "from": "review", "on": "fail", "to": "apply" }
|
|
24
|
+
],
|
|
25
|
+
"loops": [
|
|
26
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "test", "bruno-test", "security-scan", "review"], "max": 20, "iteration": true },
|
|
27
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
28
|
+
{ "name": "review-fix", "nodes": ["apply", "test", "bruno-test", "security-scan", "review"], "max": 3 }
|
|
29
|
+
],
|
|
30
|
+
"contracts": ["**/openapi*.yaml", "**/openapi*.yml", "**/openapi*.json", "**/swagger*.yaml", "**/swagger*.yml", "**/swagger*.json"]
|
|
31
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "architecture-decision",
|
|
3
|
+
"description": "Record one architecture decision record per decision the requirement names: draft it, have a skeptic attack it, and let the user review the ADR that survives, until every decision is recorded as Proposed.",
|
|
4
|
+
"category": "architecture",
|
|
5
|
+
"rules": [
|
|
6
|
+
"Pick the next undocumented decision; the card's write set is its ADR file."
|
|
7
|
+
],
|
|
8
|
+
"nodes": ["identify", "adr-draft", "adr-challenge"],
|
|
9
|
+
"start": "identify",
|
|
10
|
+
"edges": [
|
|
11
|
+
{ "from": "identify", "on": "more", "to": "adr-draft" },
|
|
12
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
13
|
+
{ "from": "adr-draft", "on": "pass", "to": "adr-challenge" },
|
|
14
|
+
{ "from": "adr-challenge", "on": "pass", "to": "identify" },
|
|
15
|
+
{ "from": "adr-challenge", "on": "fail", "to": "adr-draft" }
|
|
16
|
+
],
|
|
17
|
+
"loops": [
|
|
18
|
+
{ "name": "iterations", "nodes": ["identify", "adr-draft", "adr-challenge"], "max": 8, "iteration": true },
|
|
19
|
+
{ "name": "challenge-fix", "nodes": ["adr-draft", "adr-challenge"], "max": 3 }
|
|
20
|
+
],
|
|
21
|
+
"weights": { "new-file": 0.2, "architecture": 0.2 }
|
|
22
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "bugfix",
|
|
3
|
+
"description": "Reproduce the bug with a failing test, then iterate: apply the fix, test, and review, until the requirement is met and the reproduction passes.",
|
|
4
|
+
"category": "development",
|
|
5
|
+
"nodes": ["reproduce", "identify", "apply", "test", "review"],
|
|
6
|
+
"start": "reproduce",
|
|
7
|
+
"edges": [
|
|
8
|
+
{ "from": "reproduce", "on": "pass", "to": "identify" },
|
|
9
|
+
{ "from": "reproduce", "on": "fail", "to": "$stop" },
|
|
10
|
+
{ "from": "identify", "on": "more", "to": "apply" },
|
|
11
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
12
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
13
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
14
|
+
{ "from": "test", "on": "pass", "to": "review" },
|
|
15
|
+
{ "from": "review", "on": "pass", "to": "identify" },
|
|
16
|
+
{ "from": "review", "on": "fail", "to": "apply" }
|
|
17
|
+
],
|
|
18
|
+
"loops": [
|
|
19
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "test", "review"], "max": 20, "iteration": true },
|
|
20
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
21
|
+
{ "name": "review-fix", "nodes": ["apply", "test", "review"], "max": 3 }
|
|
22
|
+
]
|
|
23
|
+
}
|