geneseed 3.11.0 → 3.12.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 +39 -0
- package/README.md +3 -3
- package/SHIPPED.md +2 -2
- package/adapters/opencode/plugins/geneseed-guard.js +157 -2
- package/bin/geneseed-cli.mjs +4 -0
- package/docs/concepts/foreman-mode.md +1 -1
- package/docs/concepts/loops.md +165 -0
- package/docs/extending.md +5 -0
- package/docs/guides/choose-your-setup.md +14 -0
- package/docs/guides/install.md +1 -1
- package/docs/reference/glossary.md +4 -0
- package/docs/reference/opencode-plugins.md +3 -1
- package/docs/web-ui.md +12 -1
- package/harness.config.json +1 -1
- package/js/README.md +24 -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 +235 -0
- package/js/hosts/gitref.mjs +99 -0
- package/js/hosts/hooks.mjs +88 -1
- package/js/hosts/installs.mjs +21 -0
- package/js/inspect/checks-authoring.mjs +10 -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 +116 -0
- package/js/loop/cli.mjs +151 -0
- package/js/loop/graph.mjs +145 -0
- package/js/loop/score.mjs +143 -0
- package/js/loop/state.mjs +322 -0
- package/js/maintain/migrate.mjs +4 -2
- package/js/web/actions.mjs +9 -3
- package/js/web/api.mjs +38 -2
- package/js/web/daemon.mjs +43 -5
- package/js/web/handler.mjs +1 -0
- package/js/web/jobs.mjs +3 -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/bricks/README.md +32 -0
- package/src/bricks/_template.md +32 -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/ci-fix.md +17 -0
- package/src/bricks/deps-audit.md +14 -0
- package/src/bricks/docs-update.md +15 -0
- package/src/bricks/identify.md +20 -0
- package/src/bricks/lint.md +14 -0
- package/src/bricks/plan.md +17 -0
- package/src/bricks/reproduce.md +16 -0
- package/src/bricks/review.md +17 -0
- package/src/bricks/security-scan.md +17 -0
- package/src/bricks/test.md +14 -0
- package/src/doctrines/process.md +11 -8
- package/src/loops/bugfix.json +22 -0
- package/src/loops/feature.json +21 -0
- package/src/loops/refactor.json +20 -0
- package/src/skills/brick-forge.md +46 -0
- package/src/skills/geneseed.md +1 -1
- package/src/skills/loop.md +99 -0
- 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-C52LEb-2.js → Activity-GaaZWXTY.js} +1 -1
- package/web/dist/assets/{ActivityDetail-CjNLRvXg.js → ActivityDetail-4t7d45Du.js} +1 -1
- package/web/dist/assets/{Dashboard-B6_sSCHi.js → Dashboard-CYn7Tp16.js} +2 -2
- package/web/dist/assets/{Docs-Dj7BmCSA.js → Docs-BeFKLg2T.js} +1 -1
- package/web/dist/assets/{GreenhouseView-BALwjQsA.js → GreenhouseView-C6ibc8IE.js} +1 -1
- package/web/dist/assets/Installs-DRYjYnxs.js +2 -0
- package/web/dist/assets/{JournalView-JpAQ8Hqe.js → JournalView-1HbU1mfg.js} +1 -1
- package/web/dist/assets/{Laws-DK7eCWSm.js → Laws-DFoG8JWB.js} +1 -1
- package/web/dist/assets/{Library-CoamHelE.js → Library-DDjgNwz_.js} +1 -1
- package/web/dist/assets/Loops-D9VEoO0F.js +1 -0
- package/web/dist/assets/{OperatorHudView-DVx1HlBx.js → OperatorHudView-Bs7paWmh.js} +1 -1
- package/web/dist/assets/{Personal-eaXb1zcj.js → Personal-BY5n4gTw.js} +1 -1
- package/web/dist/assets/Tabs-ho-EYD8i.js +1 -0
- package/web/dist/assets/{api-Dc8f3ca-.js → api-CyMRbU2x.js} +1 -1
- package/web/dist/assets/{drawable-Du_PZrQj.js → drawable-CLS9drMb.js} +1 -1
- package/web/dist/assets/{index-Bz_KMRDH.css → index-CX_hXMi5.css} +1 -1
- package/web/dist/assets/index-Cjr7XCA3.js +2 -0
- package/web/dist/index.html +3 -3
- package/web/dist/assets/Installs-BbffDQm3.js +0 -2
- package/web/dist/assets/Tabs-BmGtt8E2.js +0 -1
- package/web/dist/assets/index-CNFH7o55.js +0 -2
package/registry.json
CHANGED
|
@@ -134,6 +134,13 @@
|
|
|
134
134
|
"added": "2026-06-03",
|
|
135
135
|
"last_verified": "2026-09-06"
|
|
136
136
|
},
|
|
137
|
+
"skills/brick-forge": {
|
|
138
|
+
"status": "experimental",
|
|
139
|
+
"version": "0.1.0",
|
|
140
|
+
"owner": "Guillaume Lemer",
|
|
141
|
+
"added": "2026-10-03",
|
|
142
|
+
"last_verified": ""
|
|
143
|
+
},
|
|
137
144
|
"skills/bruno-collection-generator": {
|
|
138
145
|
"status": "experimental",
|
|
139
146
|
"version": "1.0.0",
|
|
@@ -302,6 +309,13 @@
|
|
|
302
309
|
"added": "2026-10-02",
|
|
303
310
|
"last_verified": ""
|
|
304
311
|
},
|
|
312
|
+
"skills/loop": {
|
|
313
|
+
"status": "experimental",
|
|
314
|
+
"version": "0.1.0",
|
|
315
|
+
"owner": "Guillaume Lemer",
|
|
316
|
+
"added": "2026-10-03",
|
|
317
|
+
"last_verified": ""
|
|
318
|
+
},
|
|
305
319
|
"skills/migrate": {
|
|
306
320
|
"status": "approved",
|
|
307
321
|
"version": "1.0.0",
|
package/src/AGENT.md.tmpl
CHANGED
|
@@ -266,6 +266,8 @@ the ten council seats are convened by the [council {{SKILL}}]({{DIR_SKILLS}}/cou
|
|
|
266
266
|
| [council]({{DIR_SKILLS}}/council.md) | a decision, change, or discussion needs debating from several points of view before committing |
|
|
267
267
|
| [workflow]({{DIR_SKILLS}}/workflow.md) | deterministic, code-driven orchestration of subagents (fan-out, find→verify, phased handoff) and the host exposes a workflow tool |
|
|
268
268
|
| [pipeline]({{DIR_SKILLS}}/pipeline.md) | foreman mode triages a substantial task, or the user asks to run a crew (analyst → developer → tester) on one, isolated in its own worktree and merged on mechanical proof |
|
|
269
|
+
| [loop]({{DIR_SKILLS}}/loop.md) | the user asks to run a loop |
|
|
270
|
+
| [brick-forge]({{DIR_SKILLS}}/brick-forge.md) | a new or adapted loop brick |
|
|
269
271
|
| [wiki]({{DIR_SKILLS}}/wiki.md) | consulting or growing the user's machine-wide knowledge base declared in `wiki.jsonc` (§8) |
|
|
270
272
|
| [herdr]({{DIR_SKILLS}}/herdr.md) | running inside a [herdr](https://herdr.dev) pane (`HERDR_ENV=1`) and a task needs another pane — a sibling server, a watched build, a spawned agent |
|
|
271
273
|
| [rule]({{DIR_SKILLS}}/rule.md) | anything the user wants to outlive this session — a standing rule of their own (§1) or a durable fact to remember (§5); also a recurring {{MEMORY}} lesson due for promotion |
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Bricks
|
|
2
|
+
|
|
3
|
+
A brick is one node of a loop graph: a single prompt, handed to one agent or skill, that reports
|
|
4
|
+
back one of a declared set of outcomes. `geneseed loop next` reads the current node's brick and
|
|
5
|
+
hands its body to the model verbatim — the model never sees this file as a file, only as the
|
|
6
|
+
instructions inside it.
|
|
7
|
+
|
|
8
|
+
A brick is a markdown file, `<name>.md`, with flat YAML-ish frontmatter (`name`, `description`,
|
|
9
|
+
`effect`, exactly one of `agent` or `skill`, `outcomes`) and a plain-prose body. See
|
|
10
|
+
`_template.md` for the field-by-field shape.
|
|
11
|
+
|
|
12
|
+
## The three origins
|
|
13
|
+
|
|
14
|
+
A brick's name is looked up across three levels, each one able to override the level before it
|
|
15
|
+
by name:
|
|
16
|
+
|
|
17
|
+
| origin | path | who writes it |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| shipped | `src/bricks/` (this directory) | Geneseed itself |
|
|
20
|
+
| global | `$XDG_CONFIG_HOME/geneseed/bricks/` | the user, for every project on this machine |
|
|
21
|
+
| project | `<repo>/.geneseed/bricks/` | a team, committed and shared |
|
|
22
|
+
|
|
23
|
+
A global or project brick named `apply` replaces the shipped `apply` everywhere a loop template
|
|
24
|
+
references it — the template does not have to change, and `geneseed loop check` reports the
|
|
25
|
+
override rather than hiding it.
|
|
26
|
+
|
|
27
|
+
## Writing one
|
|
28
|
+
|
|
29
|
+
Start from `_template.md`, or ask the `brick-forge` skill to draft one for an agent or skill you
|
|
30
|
+
already have. Keep the body to 4-10 lines of direct instruction, and end it with how the model
|
|
31
|
+
should choose among the outcomes you declared — that sentence is what turns a vague brief into a
|
|
32
|
+
loop that actually terminates.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
A brick template — copy this file to `<name>.md` (kebab-case, matching the `name:` field
|
|
3
|
+
below) under `bricks/` at whichever level you are authoring for: shipped (this package's
|
|
4
|
+
`src/bricks/`), global ($XDG_CONFIG_HOME/geneseed/bricks/), or project (<repo>/.geneseed/bricks/).
|
|
5
|
+
A later level overrides an earlier one BY NAME. Leading-underscore files (like this one) and
|
|
6
|
+
README.md are never loaded as bricks.
|
|
7
|
+
|
|
8
|
+
Everything below the closing `---` is the brick's BODY: the prompt `geneseed loop next` hands
|
|
9
|
+
the agent, verbatim, plus the card fields it receives. No double-brace substitution tokens in
|
|
10
|
+
the body — the loop CLI reads this file raw and hands it straight to the model, unrendered.
|
|
11
|
+
-->
|
|
12
|
+
---
|
|
13
|
+
name: my-brick
|
|
14
|
+
# One line, shown wherever the catalogue is listed. Not the instructions themselves.
|
|
15
|
+
description: One line describing what this brick does.
|
|
16
|
+
# `read` never touches a file — the engine does not score or diff its iteration.
|
|
17
|
+
# `mutate` may change files — its diff is scored against the declared card before commit.
|
|
18
|
+
effect: read
|
|
19
|
+
# Exactly one of agent OR skill (never both, never neither) — who carries out the body below.
|
|
20
|
+
# `agent: <name>` names a spec under `src/agents/`.
|
|
21
|
+
agent: tester
|
|
22
|
+
# `skill: <name>` names a spec under `src/skills/` instead of an agent — delete `agent:` above
|
|
23
|
+
# if you use this.
|
|
24
|
+
# skill: some-skill
|
|
25
|
+
# Every outcome the body can report, comma-separated — these become the edge labels a loop
|
|
26
|
+
# template routes on (`{from, on: "<outcome>", to}`). A loop template's graph check requires
|
|
27
|
+
# exactly one edge per outcome declared here.
|
|
28
|
+
outcomes: pass, fail
|
|
29
|
+
---
|
|
30
|
+
Say, in direct instructions, what the agent or skill should do with the card it receives — 4 to
|
|
31
|
+
10 lines, no more. End with exactly how to choose between the declared outcomes, so the model's
|
|
32
|
+
last read is the decision it has to make.
|
|
@@ -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: 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.
|
|
15
|
+
|
|
16
|
+
Report `fail` if the check cannot be fixed from this repo alone (an infra outage, a flake with no
|
|
17
|
+
reproducible cause, a required secret that is missing), naming why.
|
|
@@ -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,20 @@
|
|
|
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. Report `more` with a card, as JSON:
|
|
13
|
+
{"intent": "<one line>", "writeSet": ["<every file you expect to touch>"],
|
|
14
|
+
"actions": ["<each of: format, imports, rename, logic, new-file, api, delete, architecture>"]}
|
|
15
|
+
|
|
16
|
+
Declare every action honestly: the diff is scored again before commit, and anything outside the
|
|
17
|
+
write set or under-declared escalates to a blocking stop. If LOOP.md's notes say the previous
|
|
18
|
+
attempt was re-split, make this card strictly smaller than that one.
|
|
19
|
+
|
|
20
|
+
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,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. Report `pass` with a card whose intent carries
|
|
12
|
+
the ordered list, one iteration per line, so it lands in LOOP.md's notes for `identify` to work
|
|
13
|
+
through one at a time:
|
|
14
|
+
{"intent": "<iteration 1>\n<iteration 2>\n...", "writeSet": [], "actions": []}
|
|
15
|
+
|
|
16
|
+
If the requirement cannot be split — it is already one atomic change — say so in the intent and
|
|
17
|
+
let the loop proceed with a single iteration.
|
|
@@ -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,17 @@
|
|
|
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, and does not smuggle in an
|
|
10
|
+
unrelated change.
|
|
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, or leaves an obvious defect behind.
|
|
@@ -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,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.
|
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,22 @@
|
|
|
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
|
+
"nodes": ["reproduce", "identify", "apply", "test", "review"],
|
|
5
|
+
"start": "reproduce",
|
|
6
|
+
"edges": [
|
|
7
|
+
{ "from": "reproduce", "on": "pass", "to": "identify" },
|
|
8
|
+
{ "from": "reproduce", "on": "fail", "to": "$stop" },
|
|
9
|
+
{ "from": "identify", "on": "more", "to": "apply" },
|
|
10
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
11
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
12
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
13
|
+
{ "from": "test", "on": "pass", "to": "review" },
|
|
14
|
+
{ "from": "review", "on": "pass", "to": "identify" },
|
|
15
|
+
{ "from": "review", "on": "fail", "to": "apply" }
|
|
16
|
+
],
|
|
17
|
+
"loops": [
|
|
18
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "test", "review"], "max": 20, "iteration": true },
|
|
19
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
20
|
+
{ "name": "review-fix", "nodes": ["apply", "test", "review"], "max": 3 }
|
|
21
|
+
]
|
|
22
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "feature",
|
|
3
|
+
"description": "Plan the feature into ordered iterations, then build each one: apply, test, and review, until the plan is complete.",
|
|
4
|
+
"nodes": ["plan", "identify", "apply", "test", "review"],
|
|
5
|
+
"start": "plan",
|
|
6
|
+
"edges": [
|
|
7
|
+
{ "from": "plan", "on": "pass", "to": "identify" },
|
|
8
|
+
{ "from": "identify", "on": "more", "to": "apply" },
|
|
9
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
10
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
11
|
+
{ "from": "test", "on": "pass", "to": "review" },
|
|
12
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
13
|
+
{ "from": "review", "on": "pass", "to": "identify" },
|
|
14
|
+
{ "from": "review", "on": "fail", "to": "apply" }
|
|
15
|
+
],
|
|
16
|
+
"loops": [
|
|
17
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "test", "review"], "max": 20, "iteration": true },
|
|
18
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
19
|
+
{ "name": "review-fix", "nodes": ["apply", "test", "review"], "max": 3 }
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "refactor",
|
|
3
|
+
"description": "Confirm the suite is green before touching anything, then iterate on the shape of the code alone. Tests are not edited by this template — a refactor that needs a different test is a behaviour change, not a refactor.",
|
|
4
|
+
"nodes": ["baseline-green", "identify", "apply", "test"],
|
|
5
|
+
"start": "baseline-green",
|
|
6
|
+
"edges": [
|
|
7
|
+
{ "from": "baseline-green", "on": "pass", "to": "identify" },
|
|
8
|
+
{ "from": "baseline-green", "on": "fail", "to": "$stop" },
|
|
9
|
+
{ "from": "identify", "on": "more", "to": "apply" },
|
|
10
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
11
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
12
|
+
{ "from": "test", "on": "pass", "to": "identify" },
|
|
13
|
+
{ "from": "test", "on": "fail", "to": "apply" }
|
|
14
|
+
],
|
|
15
|
+
"loops": [
|
|
16
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "test"], "max": 20, "iteration": true },
|
|
17
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 }
|
|
18
|
+
],
|
|
19
|
+
"weights": { "logic": 0.6 }
|
|
20
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# {{SKILL}}: brick-forge
|
|
2
|
+
|
|
3
|
+
> {{DESC_BRICK_FORGE}}
|
|
4
|
+
|
|
5
|
+
**Trigger:** the user wants a new loop brick, or to adapt an existing one to their stack — "make
|
|
6
|
+
a brick for…", "our tests run differently, change the `test` brick", "the loop needs a step
|
|
7
|
+
that…".
|
|
8
|
+
|
|
9
|
+
## Procedure
|
|
10
|
+
|
|
11
|
+
1. **Interview, one question at a time:**
|
|
12
|
+
- **name** — kebab-case, the file stem.
|
|
13
|
+
- **what it does** — one line; it becomes `description`.
|
|
14
|
+
- **effect** — does it ever create, edit or delete a file? Yes → `mutate`; never → `read`;
|
|
15
|
+
unsure → `mutate`. A `read` brick that writes stops the loop.
|
|
16
|
+
- **who runs it** — exactly one of an `agent` (one of the {{AGENTS}}) or a `skill`.
|
|
17
|
+
- **outcomes** — every result it can report, comma-separated. Each becomes an edge label a
|
|
18
|
+
loop graph must route (`{from, on: "<outcome>", to}`).
|
|
19
|
+
- **level** — project `<repo>/.geneseed/bricks/` (committed, shared with the team), global
|
|
20
|
+
`$XDG_CONFIG_HOME/geneseed/bricks/` (default `~/.config/geneseed/bricks/`, every project on
|
|
21
|
+
this machine), or shipped `src/bricks/` — only inside the Geneseed repository itself.
|
|
22
|
+
2. **Write `<level>/<name>.md`**, the file stem equal to `name`:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
---
|
|
26
|
+
name: <kebab-name>
|
|
27
|
+
description: <one line>
|
|
28
|
+
effect: read | mutate
|
|
29
|
+
agent: <agent> (or skill: <skill> — exactly one of the two)
|
|
30
|
+
outcomes: <a>, <b>
|
|
31
|
+
---
|
|
32
|
+
<4-10 lines of direct instructions, ending with exactly how to choose among the outcomes>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
No double-brace tokens in the body: the loop hands it to the model raw.
|
|
36
|
+
3. **Overriding by name** — a project or global brick named like a shipped one replaces it in
|
|
37
|
+
every template. That is allowed; say so to the user. `geneseed loop check` lists overrides under `overridden`.
|
|
38
|
+
4. **Check it:** `geneseed loop check --brick <path>` (this file alone), then
|
|
39
|
+
`geneseed loop check` from the repository (the whole catalogue, including every template that
|
|
40
|
+
now routes through it). Fix every listed problem and re-run both.
|
|
41
|
+
|
|
42
|
+
## Done when
|
|
43
|
+
|
|
44
|
+
- The brick file exists at the chosen level, and both checks print `ok: true`.
|
|
45
|
+
|
|
46
|
+
<!-- INCLUDE: skills/_self-improvement.md -->
|
package/src/skills/geneseed.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
1. **Locate.** Run `geneseed status --json` first: `installs` lists every install on this machine — host, scope, root, state, theme, footprint, posture, mode, packs, excluded rules — and `rebuild`, the command that reproduces each one exactly. `geneseed` not on PATH → ask the user before using `npx geneseed` (it downloads the package), and prefix every command below the same way. Still nothing → look for a host root file: `~/.config/opencode/AGENT.md` or `.opencode/AGENT.md` (OpenCode), `~/.claude/CLAUDE.md` or `.claude/` (Claude Code), `.openclaude/` (OpenClaude), `AGENTS.md` beside `.bob/` (Bob). None → say so; never install to "fix" it.
|
|
9
9
|
2. **Read state** with the read-only verbs, cheapest first ({{DOCTRINE:context-economy}}): `geneseed status --json`, `geneseed version`, `geneseed catalog` (optionally `agents|skills|laws|ontology|doctrines`), `geneseed doctor`, `geneseed diff`, `geneseed mcp`, `geneseed memory list`, `geneseed exclude list`.
|
|
10
10
|
3. **Read a piece** from disk, not from recall ({{LAW:verify-before-asserting}}): `<root>/agents/<name>.md`, `<root>/skills/<name>/SKILL.md`, `<root>/memory/`, `<root>/notebook/`. The {{ONTOLOGY}}, the {{LAWS}} and the active {{DOCTRINES}} are numbered `## N. …` sections of the install's root file.
|
|
11
|
-
4. **Change an install only when the user asked for that change** ({{LAW:one-intent-one-act}}). Take that install's `rebuild` command from step 1, edit only the flag the user named (add it if the command omits it — `--posture` and `--
|
|
11
|
+
4. **Change an install only when the user asked for that change** ({{LAW:one-intent-one-act}}). Take that install's `rebuild` command from step 1, edit only the flag the user named (add it if the command omits it — `--posture`, `--mode` and `--trust` are left out at their defaults) — `--theme`, `--footprint lean|full`, `--posture`, `--mode direct|foreman`, `--trust prudent|balanced|aggressive`, `--doctrines craft,rigor|none`, `--exclude-rules "process 7"|none` — dry-run it first by running the same flags through `geneseed validate`, show the command, and run it once the user agrees. Never rebuild from a bare `geneseed build`: every omitted flag resets that setting to the generator default. Confirm with `geneseed status`.
|
|
12
12
|
5. **Other writes also need the user's word:** `geneseed memory rm <name>`, `geneseed exclude add|remove <path>`, `geneseed web start|stop`, `geneseed uninstall --target <root> --yes`. Personal rules and the profile belong to their own {{SKILLS}}; do not edit `user-rules.md` or `PROFILE.md` from here.
|
|
13
13
|
6. **Never on your own initiative:** `geneseed setup` (interactive only), `geneseed upgrade`, `geneseed update`, `geneseed bootstrap`, `geneseed sync-self`, `geneseed rebuild-all`, `geneseed migrate`, `geneseed link`, `geneseed unlink`. `learn`, `context` and the `*-gate` verbs are `geneseed-hook` verbs the host's hooks run — never run them by hand.
|
|
14
14
|
7. Directory and section names are plain English in every theme; only prose changes. Do not search by flavour words.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# {{SKILL}}: loop
|
|
2
|
+
|
|
3
|
+
> {{DESC_LOOP}}
|
|
4
|
+
|
|
5
|
+
**Trigger:** the user asks to run a loop, or to work a requirement in small validated
|
|
6
|
+
iterations, each one committed on its own; or names a loop template (`bugfix`, `refactor`,
|
|
7
|
+
`feature`).
|
|
8
|
+
|
|
9
|
+
Default trust preset: **{{TRUST_LABEL}}**
|
|
10
|
+
|
|
11
|
+
The preset passed to `init` is `{{TRUST}}` unless the user names another (`prudent`,
|
|
12
|
+
`balanced`, `aggressive`).
|
|
13
|
+
|
|
14
|
+
## What it is
|
|
15
|
+
|
|
16
|
+
`geneseed loop` is a state machine kept in `LOOP.md` at the worktree's root. It decides every
|
|
17
|
+
transition, ceiling, score and stop; you run the node it hands you and report the outcome. Every
|
|
18
|
+
action prints one JSON object — act on its keys, never on your own reading of the graph.
|
|
19
|
+
|
|
20
|
+
## Setup
|
|
21
|
+
|
|
22
|
+
1. `git worktree add ../<repo>-loop-<slug> -b loop/<slug>`, then make that worktree the session's
|
|
23
|
+
working directory with its own command. Every later command runs there **as written below**:
|
|
24
|
+
no `cd` prefix, no `git -C`, no quoted refspec — any of those makes the git gate ask.
|
|
25
|
+
2. On a `loop/*` branch with a launched loop, the git gate lets exactly the commit form below
|
|
26
|
+
through without asking. Merging into a shared branch is never yours.
|
|
27
|
+
|
|
28
|
+
## Compose
|
|
29
|
+
|
|
30
|
+
3. Use a template when the user names one. Otherwise run `geneseed loop check`: it lists the
|
|
31
|
+
`templates` and every brick (`name`, `description`, `effect`, `agent`/`skill`, `outcomes`,
|
|
32
|
+
`available`). Compose a graph JSON from available bricks — skip one marked unavailable or whose
|
|
33
|
+
`skill` you do not have: `name`, `nodes`, `start`, `edges` of `{from, on, to}` (one per
|
|
34
|
+
outcome; `$close`/`$stop` are terminals), `loops` with exactly one `"iteration": true`. The
|
|
35
|
+
iteration loop's first node is where every iteration begins (normally `identify`).
|
|
36
|
+
Write it to `<name>.json` in the OS temp directory — never inside the worktree, where it would
|
|
37
|
+
be scored and committed — and validate it: `geneseed loop check --graph <file>`.
|
|
38
|
+
4. `geneseed loop init --title "<title>" --requirement "<requirement>" --graph <template|file> --preset {{TRUST}}`.
|
|
39
|
+
A refused graph prints `problems` — fix them and retry.
|
|
40
|
+
|
|
41
|
+
## The cycle
|
|
42
|
+
|
|
43
|
+
Repeat `geneseed loop next` and act on its JSON:
|
|
44
|
+
|
|
45
|
+
- **`{awaiting}`** — a person must decide. Present it: `launch` → the graph in `LOOP.md`;
|
|
46
|
+
`declared` → the card, its score and the threshold; `actual` → `git diff --cached` and the
|
|
47
|
+
`reasons`. Then **end the run** and wait. On their answer:
|
|
48
|
+
`geneseed loop decide --verdict ok|no|amend --note "<their words>"` and continue.
|
|
49
|
+
- **`{verify, run}`** — run exactly the `run` command it prints.
|
|
50
|
+
- **`{node, validate: true}`** — score the card before the brick runs:
|
|
51
|
+
`geneseed loop score --declared` (the card `identify` recorded), or for a setup brick with no
|
|
52
|
+
card `geneseed loop score --declared --actions <kinds> --write-set <files> --intent <label>`.
|
|
53
|
+
`blocking` turns into an `{awaiting}` on the next `next`.
|
|
54
|
+
- **`{node}`** — run the brick: dispatch its `agent` (or follow its `skill`) with the `prompt`,
|
|
55
|
+
the `card` and the `notes`. Then report the outcome, one of its `outcomes`:
|
|
56
|
+
`git status --porcelain | geneseed loop record --outcome <outcome>` — `identify` adds
|
|
57
|
+
`--card '<card json>'` when it reports `more`.
|
|
58
|
+
- **`{terminal: "$close"}`** — see *The end*. **`{terminal: "$stop"}`** — report the `reason`
|
|
59
|
+
and the `summary`, and leave the branch as it is.
|
|
60
|
+
|
|
61
|
+
What `score --diff`, `decide` and `record` print back:
|
|
62
|
+
|
|
63
|
+
- **`{commit: true, message_file}`** — close the unit with exactly this command, nothing added:
|
|
64
|
+
`git add -A && git commit -F <message_file> && git push -u origin HEAD:loop/<slug>`
|
|
65
|
+
Never `git commit -m`: only this form is exempt; anything else asks. It assumes a remote named
|
|
66
|
+
`origin` and a `message_file` path without spaces: if the path has a space, quote it and accept
|
|
67
|
+
that the gate asks; with no remote, report and stop instead of retrying.
|
|
68
|
+
- **`{discard: true}`** (with `resplit` when an inner ring was exhausted) — set the attempt aside,
|
|
69
|
+
keeping `LOOP.md`: `git stash -u -m loop-discarded -- . :^LOOP.md` (never `git stash push` —
|
|
70
|
+
the word `push` trips the git gate mid-run).
|
|
71
|
+
- **`{done: true}`**, **`{empty}`**, **`{resumed}`**, **`{dropped}`**, **`{node}`**, **`{verify}`**,
|
|
72
|
+
**`{stopped}`**, a declared score, and any result with `commit: false` (a blocking diff score
|
|
73
|
+
included — it surfaces as `{awaiting}`) — call `next` again.
|
|
74
|
+
- **`{error}`** — read it; it names the step you skipped (`score --declared` before a mutate
|
|
75
|
+
brick, `score --diff` before `record`). Do the step, never edit the state block to get past it.
|
|
76
|
+
An `{error}` from `record` that mentions JSON means the shell mangled the card's quotes: retry
|
|
77
|
+
with the card on a single line and no single quotes inside it.
|
|
78
|
+
|
|
79
|
+
## The end
|
|
80
|
+
|
|
81
|
+
5. On `$close`: `git rm -f LOOP.md` (the engine rewrote it after the last commit), then
|
|
82
|
+
`git commit -m "loop(<slug>): close" && git push -u origin HEAD:loop/<slug>`.
|
|
83
|
+
This final commit is outside the exemption — the loop is no longer running — so the gate
|
|
84
|
+
asks: that ask is the user's consent to close the loop.
|
|
85
|
+
6. Report: the iteration count, the **soft** iterations from `summary.review` under
|
|
86
|
+
"to review", the `notes`, and the branch to merge. **Never merge.**
|
|
87
|
+
|
|
88
|
+
## Resume
|
|
89
|
+
|
|
90
|
+
After a crash or an answered `awaiting`, from the worktree: `geneseed loop next`. The state is
|
|
91
|
+
`LOOP.md` plus the branch — nothing else to restore. The user may edit `preset` or `contracts`
|
|
92
|
+
in `LOOP.md`; they apply from the next score.
|
|
93
|
+
|
|
94
|
+
## Done when
|
|
95
|
+
|
|
96
|
+
- `$close` is reported with the branch pushed and `LOOP.md` removed, or `$stop` is reported with
|
|
97
|
+
its reason — and in both cases nothing was merged.
|
|
98
|
+
|
|
99
|
+
<!-- INCLUDE: skills/_self-improvement.md -->
|
package/themes/_TEMPLATE.json
CHANGED
|
@@ -56,6 +56,8 @@
|
|
|
56
56
|
"DESC_PONYTAIL": "<one-line description: force the laziest working solution — minimal, shortest path, stdlib/native before custom code; lite/full/ultra intensity>",
|
|
57
57
|
"DESC_PARALLEL_AGENTS": "<one-line description: fan independent subtasks to concurrent subagents, then converge>",
|
|
58
58
|
"DESC_PIPELINE": "<one-line description: spawn a small crew — analyst, developer, tester — to work a substantial task in isolation, merging only on mechanical proof (tests + lint green)>",
|
|
59
|
+
"DESC_LOOP": "<one-line description: work a requirement in small scored iterations on a loop/* branch, stepping the geneseed loop state machine>",
|
|
60
|
+
"DESC_BRICK_FORGE": "<one-line description: author or adapt a loop brick at project, global or shipped level, checked by geneseed loop check>",
|
|
59
61
|
"DESC_DEVELOP": "<one-line description: drive a code change through cover-and-verify — smallest change, tests written for it, affected suite green, committed slice by slice>",
|
|
60
62
|
"DESC_TEACH": "<one-line description: teach toward a result — crash course, decode confusing material, or a day-by-day path to a deadline>",
|
|
61
63
|
"DESC_QUIZ": "<one-line description: test what the user knows instead of explaining — drill, explain-it-back check, or mastery claim stress-tested>",
|
package/themes/biker.json
CHANGED
|
@@ -56,6 +56,8 @@
|
|
|
56
56
|
"DESC_PONYTAIL": "The laziest fix that rides — least code, shortest road; stock parts before custom builds, one line before fifty. lite/full/ultra.",
|
|
57
57
|
"DESC_PARALLEL_AGENTS": "Send several riders on independent runs at once, then bring in what they gather.",
|
|
58
58
|
"DESC_PIPELINE": "Send a small crew of riders — scout, wrench, test rider — to work a job in their own lane, rolling it into the pack only once the road-test comes back clean.",
|
|
59
|
+
"DESC_LOOP": "Ride a requirement in short, scored laps on its own loop/* lane, the loop engine calling every turn.",
|
|
60
|
+
"DESC_BRICK_FORGE": "Build or re-tune a loop brick, then run it past geneseed loop check.",
|
|
59
61
|
"DESC_DEVELOP": "Push a change through the run — the smallest turn of the wrench, a test written to cover it, the touched trials green, sealed slice by slice.",
|
|
60
62
|
"DESC_TEACH": "Get a rider road-ready — a crash course from never-ridden to rolling, a confusing manual decoded till it clicks, or a day-by-day route to a deadline.",
|
|
61
63
|
"DESC_QUIZ": "Test what they've actually got instead of explaining it — drill a move to reflex, make them talk you through it, or call the bluff on a claimed skill — with a straight readout of the gaps.",
|
package/themes/commentator.json
CHANGED
|
@@ -56,6 +56,8 @@
|
|
|
56
56
|
"DESC_PONYTAIL": "The laziest line that finishes — least code, shortest path; standard kit before custom builds, one line before fifty. lite/full/ultra.",
|
|
57
57
|
"DESC_PARALLEL_AGENTS": "Send several drivers out on independent stints at once, then bring in what they gather.",
|
|
58
58
|
"DESC_PIPELINE": "Send a small crew — scout, mechanic, test driver — out on their own stint, and only wave them into the results once the timing sheet comes back clean.",
|
|
59
|
+
"DESC_LOOP": "Run a requirement in short, scored laps on a loop/* branch, the loop engine calling every move.",
|
|
60
|
+
"DESC_BRICK_FORGE": "Build or adapt a loop brick, then put it through geneseed loop check.",
|
|
59
61
|
"DESC_DEVELOP": "Drive the change through cover-and-verify — the smallest setup tweak, a trial written to time it, the affected laps green, sealed corner by corner.",
|
|
60
62
|
"DESC_TEACH": "Bring a rookie up to speed — a crash course to race-ready, a confusing regulation decoded until it clicks, or a day-by-day programme to the deadline.",
|
|
61
63
|
"DESC_QUIZ": "Test the driver instead of briefing them — a drill to reflex, an explain-it-back debrief, or a claimed mastery stress-tested — with a frank readout of the gaps.",
|