geneseed 4.15.1 → 4.17.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.
Files changed (61) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +4 -4
  3. package/SHIPPED.md +1 -1
  4. package/adapters/bob/README.md +6 -3
  5. package/docs/concepts/enforcement-table.md +2 -1
  6. package/docs/concepts/foreman-mode.md +6 -4
  7. package/docs/concepts/rules.md +2 -1
  8. package/docs/extending.md +5 -2
  9. package/docs/guides/install-bob.md +1 -1
  10. package/docs/guides/upgrade.md +2 -0
  11. package/harness.config.json +1 -1
  12. package/js/hosts/hooks.mjs +16 -2
  13. package/js/hosts/native.mjs +39 -6
  14. package/js/inspect/cost.mjs +1 -1
  15. package/js/web/api.mjs +6 -2
  16. package/js/web/daemon.mjs +2 -2
  17. package/js/web/handler.mjs +11 -0
  18. package/package.json +1 -1
  19. package/src/AGENT.md.tmpl +2 -1
  20. package/src/doctrines/comms.md +23 -0
  21. package/src/modes/foreman.md +13 -5
  22. package/src/skills/pipeline.md +22 -10
  23. package/themes/_TEMPLATE.json +1 -0
  24. package/themes/biker.json +1 -0
  25. package/themes/commentator.json +1 -0
  26. package/themes/cyberpunk.json +1 -0
  27. package/themes/gamer.json +1 -0
  28. package/themes/imperial.json +1 -0
  29. package/themes/joker.json +1 -0
  30. package/themes/marvin.json +1 -0
  31. package/themes/mean.json +1 -0
  32. package/themes/military.json +1 -0
  33. package/themes/neutral.json +1 -0
  34. package/themes/pirate.json +1 -0
  35. package/themes/sports.json +1 -0
  36. package/themes/verstappen.json +1 -0
  37. package/themes/wizard.json +1 -0
  38. package/web/dist/assets/{Activity-M5qj6CxJ.js → Activity-DMgUkz1y.js} +1 -1
  39. package/web/dist/assets/{ActivityDetail-DVCdNy73.js → ActivityDetail-0NQav1Ct.js} +1 -1
  40. package/web/dist/assets/Dashboard-BrtpmSc7.js +2 -0
  41. package/web/dist/assets/Docs-BgSOOv3c.js +5 -0
  42. package/web/dist/assets/{GreenhouseView-BvA4t12P.js → GreenhouseView-BCpp3_J7.js} +1 -1
  43. package/web/dist/assets/{Installs-DP4WjTpD.js → Installs-CJuwb-R_.js} +3 -3
  44. package/web/dist/assets/JournalView-DoSufCu0.js +1 -0
  45. package/web/dist/assets/{KitApply-aORiqjFC.js → KitApply-Csb2NKOJ.js} +1 -1
  46. package/web/dist/assets/{Kits-DpIEozdv.js → Kits-Dtq7aDW7.js} +1 -1
  47. package/web/dist/assets/{Laws-cM_4CG9i.js → Laws-CV584w6U.js} +2 -2
  48. package/web/dist/assets/{Library-I1zEH3UW.js → Library-DfXSs4so.js} +1 -1
  49. package/web/dist/assets/{Loops-CDa_mxP9.js → Loops-_D1DPJVK.js} +2 -2
  50. package/web/dist/assets/{OperatorHudView-CMf1DQMB.js → OperatorHudView-Dh5gW8Bt.js} +1 -1
  51. package/web/dist/assets/{Personal-BqU9Pzt1.js → Personal-Bk6kfmgc.js} +1 -1
  52. package/web/dist/assets/{Tabs-JZ2FQBcz.js → Tabs-CjSgf4wz.js} +1 -1
  53. package/web/dist/assets/drawable-DlKtGexn.js +1 -0
  54. package/web/dist/assets/index-DbwBkTjy.js +2 -0
  55. package/web/dist/index.html +1 -1
  56. package/web/src/pages/Laws.jsx +5 -0
  57. package/web/dist/assets/Dashboard-B1rpgTz-.js +0 -2
  58. package/web/dist/assets/Docs-D-EixVuX.js +0 -5
  59. package/web/dist/assets/JournalView-hf2eO133.js +0 -1
  60. package/web/dist/assets/drawable-svc6-2Gp.js +0 -1
  61. package/web/dist/assets/index-CZFrNe4N.js +0 -2
package/CHANGELOG.md CHANGED
@@ -8,6 +8,40 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [4.17.0] — 2026-10-23
12
+
13
+ Minor: doctrine comms 5 Mark the Ask; a version bump on main now releases itself; two Bob fixes.
14
+
15
+ ### Upgrade notes
16
+ - Run `geneseed rebuild-all`; nothing changes on a machine until something re-emits.
17
+
18
+ ### Added
19
+ - **Doctrine comms 5, Mark the Ask.** When a reply stops and waits on the user (a question, a choice, an approval, a blocker), the agent marks the ask so a reader who skims finds it first: one leading emoji marker for its kind (`❓` question, `👉` act to do, `⚠️` risk or blocker, `✅` done, waits on sign-off), placed before the reference code (`❓ **Q3** — keep the v1 route?`), arrows (`→`) for options and flows with the recommended option first, and one ask per block. Colour is used only where the host renders it, never as raw ANSI in plain text. Routine output stays plain, and the prose around a marker keeps Simplified Technical English. It is in the toggleable comms pack, not a law, per DESIGN.md Decision 7: `--exclude-rules "comms 5"` turns it off. The carrier ceilings rise by 1 114 characters (full) and 512 (lean). Run `geneseed rebuild-all` to get it.
20
+
21
+ ### Changed
22
+ - **The version bump is the release.** `publish.yml` now also runs when CI finishes green on a push to `main`. If the version in `harness.config.json` is not on npm yet, it re-runs its gates against the commit CI tested, publishes it, and creates the `v<version>` tag and the GitHub release from that version's CHANGELOG section; otherwise it stops after one cheap check. A PR's CI run, a red one or a fork's never publishes. The manual dispatch stays, still a dry run by default.
23
+
24
+ ### Fixed
25
+ - Bob: a gate block no longer promises a confirmation Bob cannot give. Bob has no ask tier, so "Confirm this specific command" sent the model round the gate (a retry with `-Confirm:$false`, then `git clean`) and finally to "disable the Geneseed hook". Every Bob block now says that nothing in the chat lifts it, and that the user can act outside Bob. Claude's wording is unchanged.
26
+ - Bob: read-only agents now stay read-only. Bob ignores Claude's `disallowedTools`, so every reviewer, explorer and council seat got Bob's default `read, edit, execute`. The Bob emit now writes Bob's own `groups:` key (`read`, plus `execute` for an agent that opts into bash). An `agent-overrides.json` value is not applied on Bob and a warning says so: Bob drops an agent that carries `model:`. Run `geneseed rebuild-all`.
27
+
28
+ ## [4.16.0] — 2026-10-23
29
+
30
+ Minor: foreman mode now really delegates, and the web console updates and rebuilds a clone without a manual restart.
31
+
32
+ ### Upgrade notes
33
+ - Run `geneseed rebuild-all`; nothing changes on a machine until something re-emits. The precedence table changes in every install, not only in foreman ones.
34
+
35
+ ### Changed
36
+ - Foreman mode: the mode now binds how work runs. It has its own row in the precedence table; `PROFILE.md`, posture and theme still only inform.
37
+ - Foreman triage is a count, not a judgement: a task is substantial when it changes 2 or more files, needs a new or changed test, needs about 5 reads before the first edit, or asks for a feature, a fix, a review, an audit or an investigation. When unsure, the session delegates.
38
+ - Pipelines: the parent session dispatches one background crew lead and goes back to the user. The crew lead picks the crew from the whole agent roster (the floor is only the minimum) and runs the relay. `pipeline` now has a per-host table; on a host where the crew lead cannot start subagents, it plays each role in turn.
39
+
40
+ ### Fixed
41
+ - Web console: a git clone always gets the **Update** button, also when the npm release check gets no answer.
42
+ - Web console: a rebuild on a console running old code (after a manual `git pull`) now restarts it and reloads the page.
43
+ - Docs: the pipeline loop limit is 2 repair rounds, then one fresh developer, not "five rounds".
44
+
11
45
  ## [4.15.1] — 2026-10-23
12
46
 
13
47
  Patch: two host fixes. The first npm release since 4.14.0, so it also carries 4.15.0's comms 4 doctrine.
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  [![Themes](https://img.shields.io/badge/themes-14-9cf)](themes/)
14
14
  [![Skills](https://img.shields.io/badge/skills-47-blueviolet)](src/skills/)
15
15
  [![Agents](https://img.shields.io/badge/agents-20-orange)](src/agents/)
16
- [![Laws and doctrines](https://img.shields.io/badge/laws-9%20%2B%2030%20doctrines-critical)](src/doctrines/)
16
+ [![Laws and doctrines](https://img.shields.io/badge/laws-9%20%2B%2031%20doctrines-critical)](src/doctrines/)
17
17
  [![Plugins](https://img.shields.io/badge/plugins-7-teal)](adapters/opencode/plugins/)
18
18
  [![OpenCode · Claude Code · Bob · OpenClaude · AGENT.md](https://img.shields.io/badge/works%20with-OpenCode%20·%20Claude%20Code%20·%20Bob%20·%20OpenClaude%20·%20AGENT.md-1f6feb)](#-supported-harnesses)
19
19
 
@@ -294,7 +294,7 @@ Geneseed/
294
294
  │ Docs pages; maintainer notes beside them (extending, design-history…);
295
295
  │ specs/, reviews/, superpowers/ are local working docs — git-ignored
296
296
  ├── adapters/ per-host glue (opencode/, claude-code/, bob/, openclaude/)
297
- └── .github/workflows/ ci.yml (doctor + tests) · publish.yml (npm, OIDC, manual only)
297
+ └── .github/workflows/ ci.yml (doctor + tests) · publish.yml (npm, OIDC, on a version bump)
298
298
  ```
299
299
 
300
300
  ## 🧪 Validate & test
@@ -304,7 +304,7 @@ node bin/geneseed-cli.mjs doctor # every theme + parity + authoring + drift
304
304
  node --test --test-reporter=tap "tests/**/*.test.mjs" # the suites (node expands the glob)
305
305
  ```
306
306
 
307
- `doctor` checks each theme for unresolved tokens, dead/non-hermetic links, theme-key parity, author-time gates (every spec has a purpose line, the plugins parse, the learn-prompt literal stays extractable), and that a committed bundle still matches a fresh render of `src/`. CI (`.github/workflows/ci.yml`) runs both on every push and PR, on both Linux and Windows. Publishing is a separate, manually-triggered workflow (`.github/workflows/publish.yml`) — see [Contributing](#-contributing).
307
+ `doctor` checks each theme for unresolved tokens, dead/non-hermetic links, theme-key parity, author-time gates (every spec has a purpose line, the plugins parse, the learn-prompt literal stays extractable), and that a committed bundle still matches a fresh render of `src/`. CI (`.github/workflows/ci.yml`) runs both on every push and PR, on both Linux and Windows. Publishing is a separate workflow (`.github/workflows/publish.yml`) that runs when CI finishes green on `main` and releases only a version npm does not have yet — see [Contributing](#-contributing).
308
308
 
309
309
  ### AI Harness Scorecard
310
310
 
@@ -365,7 +365,7 @@ Three things that bite when you don't know them:
365
365
 
366
366
  - **`js/cli-table.json` IS the CLI.** The argument parser is data, and that file is the owned document — not a generated one. `bin/geneseed-cli.mjs` cannot parse a single verb without it, `bin/geneseed-hook.mjs` renders `--help` from it, and the console's `cli` docs page is a filtered view of it. What holds it honest is `tests/unit/cli_table.test.mjs` — change a flag here and that suite is what tells you.
367
367
  - **The version has one owner: `harness.config.json`.** `package.json` mirrors it and a test fails the fork. Never `npm version` — it edits one of the two.
368
- - **Publishing is deliberate and manual.** `.github/workflows/publish.yml` uses npm trusted publishing (OIDC); there is no `NPM_TOKEN` in this repository and there must not be one. It runs only from Actions → publish → Run workflow, and the npm-side trusted publisher is keyed on that workflow's **filename** — renaming the file breaks publishing with no local symptom, which is why the file names itself in its own header and a test asserts the two agree.
368
+ - **The version bump is the release.** `.github/workflows/publish.yml` uses npm trusted publishing (OIDC); there is no `NPM_TOKEN` in this repository and there must not be one. When CI finishes green on a push to `main` and the version in `harness.config.json` is not on npm yet, it publishes that version, then creates the `v<version>` tag and the GitHub release from the CHANGELOG. Actions → publish → Run workflow still works by hand (a dry run by default), and the npm-side trusted publisher is keyed on that workflow's **filename** — renaming the file breaks publishing with no local symptom, which is why the file names itself in its own header and a test asserts the two agree.
369
369
 
370
370
  ## 🙏 Credits
371
371
 
package/SHIPPED.md CHANGED
@@ -20,7 +20,7 @@ historical references, not files distributed with the repo.
20
20
  > **On version numbers.** [`harness.config.json`](harness.config.json)'s `version` is a
21
21
  > human-readable label only. The canonical identity of an installed harness is the
22
22
  > **source fingerprint** stamped in `.geneseed-version` (see `geneseed version`), not the
23
- > string. Current label: **4.15.1**.
23
+ > string. Current label: **4.17.0**.
24
24
 
25
25
  ## Capabilities
26
26
 
@@ -20,8 +20,11 @@ limitation to be aware of on a shared repo.
20
20
  preamble as a delimited **managed block** (your prose around it survives a
21
21
  re-emit; the block is replaced, never stacked).
22
22
  - **`.bob/`** layer:
23
- - `agents/<name>.md` — the **Claude subagent dialect** verbatim (`name` +
24
- `description` + a `disallowedTools:` denylist for read-only agents).
23
+ - `agents/<name>.md` — **Bob's agent dialect**: `name` + `description`, and for a
24
+ read-only agent a `groups:` list of `read` (plus `execute` when the spec opts into
25
+ bash). An editing agent states no groups and keeps Bob's default `read, edit, execute`.
26
+ Bob ignores Claude's `disallowedTools`, and an `agent-overrides.json` value is not
27
+ applied (Bob refuses a `model:` key).
25
28
  - `skills/<name>/SKILL.md` — **byte-identical** to every other host; skills
26
29
  are model-invoked via the `skill` tool. The one exception is the folder skills'
27
30
  own directory — see *Bob-ism 3*.
@@ -99,7 +102,7 @@ What the global emit writes into `~/.bob/settings/settings.json`:
99
102
  | event | verb | how the verdict travels |
100
103
  | --- | --- | --- |
101
104
  | `SessionStart` | `context --host bob` | plain stdout, as on Claude |
102
- | `PreToolUse` | `tool-gate --host bob` — one group, no matcher | Laws I/IV, rigor-5 and ops-2: **exit 2**, reason on stderr; process 1/5: a stderr line, exit 0 |
105
+ | `PreToolUse` | `tool-gate --host bob` — one group, no matcher | Laws I/IV, rigor-5 and ops-2: **exit 2**, reason on stderr — it says no chat confirmation lifts the block, since Bob has no ask tier; process 1/5: a stderr line, exit 0 |
103
106
  | `Stop` | `learn` | never a verdict |
104
107
 
105
108
  No matcher on `PreToolUse`, deliberately: Bob's tools page already drifts from its own
@@ -64,7 +64,8 @@ follow them, not because a tool call was ever inspected.
64
64
  **Doctrine: rigor** — `idempotent-by-default` · `honest-tests` · `cover-and-verify` ·
65
65
  `prove-the-gate`.
66
66
 
67
- **Doctrine: comms** — `codes-that-persist` · `structure-beside-prose` · `declare-the-judgment-calls`.
67
+ **Doctrine: comms** — `codes-that-persist` · `structure-beside-prose` · `declare-the-judgment-calls` ·
68
+ `simplified-technical-english` · `mark-the-ask`.
68
69
 
69
70
  ---
70
71
 
@@ -21,8 +21,10 @@ The agent works every task itself, turn by turn. Nothing is spawned; you talk to
21
21
 
22
22
  The session sorts every request:
23
23
 
24
- - **Trivial** — a quick answer, a one-file tweak, a question: done directly, as in direct mode.
25
- - **Substantial** — handed to a **pipeline** running in the background. The session tells you it is running and stays free to answer you.
24
+ - **Substantial** — handed to a **pipeline** running in the background. The session tells you it is running and stays free to answer you. A task counts as substantial when any one of these holds: it changes two or more files, it needs a new or changed test, it needs about five reads or searches before the first edit, or it asks for a feature, a fix, a review, an audit or an investigation.
25
+ - **Trivial** — none of those holds: a question answered from what is already in context, a one-file tweak, a single command. Done directly, as in direct mode.
26
+
27
+ When the session is unsure, it delegates. The count exists because "substantial" left to judgement lost every time to the host's own default of doing small work in place.
26
28
 
27
29
  Expect a substantial task to cost more (a crew runs instead of one agent) in exchange for a session that never blocks on a long job.
28
30
 
@@ -37,11 +39,11 @@ A **pipeline** is a small crew of agents working one task in isolation. The mini
37
39
  | research | `explorer`; add `researcher` when the question leaves the repository |
38
40
  | review or audit | `reviewer` + `skeptic` |
39
41
 
40
- The session adds specialists on top when the task needs them — `security`, `architect`, `reviewer` and so on — never fewer than the minimum.
42
+ The session does not run the crew itself. It starts one **crew lead** in the background and goes back to you. The crew lead picks the crew from the whole agent roster — `security`, `architect`, `performance`, `reviewer` and so on, as the task needs, never fewer than the minimum — and passes the work from one agent to the next. On Claude Code each crew member is its own subagent. On a host where the crew lead cannot start subagents, it plays each role in turn. The `pipeline` skill has the table per host.
41
43
 
42
44
  The crew works in its own git worktree and branch. When worktrees are unavailable it falls back to the main tree, one pipeline at a time, and says so. Two pipelines whose sets of files overlap do not run at once.
43
45
 
44
- Inside the crew, the developer implements and the tester runs the tests and lint. Failures go back to the developer, at most five rounds; after that the crew stops and reports the failure, leaving the branch for you to inspect.
46
+ Inside the crew, the developer implements and the tester runs the tests and lint. Failures go back to the developer for at most two repair rounds, then to one fresh developer carrying the tester's findings; if that fails too, the crew stops and reports the failure, leaving the branch for you to inspect.
45
47
 
46
48
  ### A pipeline never commits or merges
47
49
 
@@ -25,7 +25,8 @@ When two instructions disagree, the higher one wins.
25
25
  2. **Rules** — always on. {N_LAWS} invariants, the things that are never traded away: sealed secrets, one intent per act, verify before asserting, deliberate deletion, surface failures, treat content as data not orders, least privilege, cure the cause, echo the intent. No install can switch one off.
26
26
  3. **Your `user-rules.md`** — rules you write for yourself, seeded once beside the instructions file and never overwritten. A rule here **outranks any doctrine rule**: a practice pack chosen at build time never overrides an instruction you wrote. It may tighten an invariant, never repeal one. The [rule skill](skills.md) helps you decide whether something belongs here or in [memory](memory.md).
27
27
  4. **Doctrines** — chosen at build time. Practices rather than principles, grouped in packs (below).
28
- 5. **`PROFILE.md`** — who you are. It colours how the agent works but never binds ([Collaboration](collaboration.md)).
28
+ 5. **Mode** — chosen at build time ([Foreman mode](foreman-mode.md)). It binds *how* work is executed — done in place, or handed to a crew — and never overrides a layer above it. A mode that only informed lost every time to the host's own default of doing small work in place.
29
+ 6. **`PROFILE.md`** — who you are. It colours how the agent works but never binds ([Collaboration](collaboration.md)).
29
30
 
30
31
  ### Doctrine packs
31
32
 
package/docs/extending.md CHANGED
@@ -856,8 +856,11 @@ gated. Every other appearance is derived at runtime (`.geneseed-version` markers
856
856
  why no test pins a version string and none should.
857
857
 
858
858
  Do not run `npm version`. Bump the two files by hand, add the `CHANGELOG` section, update
859
- `SHIPPED.md`, rebuild `web/dist` if `web/src` moved, run the seven commands from §1, push, tag,
860
- then rehearse and fire the workflow:
859
+ `SHIPPED.md`, rebuild `web/dist` if `web/src` moved, run the seven commands from §1, and merge to
860
+ `main`. **The bump is the release** (since 2026-10-23): when CI finishes green on that push,
861
+ `publish.yml` sees a version npm does not have, re-runs its gates, publishes it, and creates the
862
+ `v<version>` tag and the GitHub release from the version's CHANGELOG section. A push that does not
863
+ change the version stops at the `release-check` job. A manual rehearsal still works:
861
864
 
862
865
  ```bash
863
866
  gh workflow run publish.yml -f dry_run=true
@@ -13,7 +13,7 @@ geneseed build --emit bob-global # ~/.bob
13
13
  geneseed build --emit bob --out /path/to/repo --root /path/to/repo # one repo
14
14
  ```
15
15
 
16
- Bob is shaped like Claude Code, so it gets the same agents and skills. Per repo, the preamble goes into a root `AGENTS.md` and the rest into `.bob/`. Globally, everything goes under `~/.bob` (`$BOB_CONFIG_DIR` moves it), and the preamble rides `rules/geneseed.md`, because Bob does not auto-load a global `AGENTS.md`. Bob's hooks refuse an action with exit code 2, and Bob has no `SubagentStop` or `PreCompact` events.
16
+ Bob is shaped like Claude Code, so it gets the same agents and skills. A read-only agent is limited with Bob's own `groups:` key, because Bob ignores Claude's `disallowedTools`. Per repo, the preamble goes into a root `AGENTS.md` and the rest into `.bob/`. Globally, everything goes under `~/.bob` (`$BOB_CONFIG_DIR` moves it), and the preamble rides `rules/geneseed.md`, because Bob does not auto-load a global `AGENTS.md`. Bob's hooks refuse an action with exit code 2, and Bob has no `SubagentStop` or `PreCompact` events.
17
17
 
18
18
  Both scopes open Bob's carrier with a short first-reply override, so the theme's readiness line (for example "🧬 Gene-seed implanted…") starts the first reply. Without it, Bob's own greeting outranked the instruction lower in the file. A bare greeting such as "hi" still gets Bob's fixed welcome; the line appears on the first real request. That much was checked by hand in the Bob IDE (2026-10); the rest of the Bob support has not been verified against a live install.
19
19
 
@@ -34,6 +34,8 @@ geneseed upgrade imperial # the same, switching the theme
34
34
 
35
35
  A dirty working tree, or a folder that is not a git clone, is reported rather than force-updated. `update` and `sync-self` are aliases of `upgrade`. `bootstrap` does the same and then opens the setup wizard (`--no-setup` skips the wizard).
36
36
 
37
+ In the web console, the **Update** button on the Overview runs `upgrade`. On a clone it is always there, also when the release check cannot reach npm, because `main` moves between releases. When the update is done, the console restarts and the page reloads. If you ran `git pull` yourself, the Overview shows a banner that the console runs old code. Click **Rebuild** on an install that is behind: the console restarts after the rebuild and reloads the page. If no install is behind, click **Restart** in the banner.
38
+
37
39
  ## What an upgrade keeps
38
40
 
39
41
  A rebuild only replaces files the install's manifest says Geneseed owns. It leaves these alone:
@@ -2,5 +2,5 @@
2
2
  "_comment": "version is a human-readable release label only; the canonical identity of an installed harness is the source fingerprint stamped in .geneseed-version (see `harness version`), not this string.",
3
3
  "theme": "neutral",
4
4
  "product": "Geneseed",
5
- "version": "4.15.1"
5
+ "version": "4.17.0"
6
6
  }
@@ -196,6 +196,20 @@ const setHost = (args) => { HOST = (args && args.host) || 'claude'; };
196
196
  */
197
197
  const BOB_DENY_EXIT = 2;
198
198
 
199
+ /**
200
+ * Said after every Bob block. Exit 2 is final on Bob — no ask tier, and consent typed in the
201
+ * chat never reaches the hook — so a reason that invites a confirmation sends the model looking
202
+ * for a way round: live (2026-10-23) it retried with `-Confirm:$false`, then `git clean`, then
203
+ * told the user to disable the Geneseed hook. This names the one real way out instead.
204
+ */
205
+ const BOB_FINAL = ' Bob has no approval step for this gate: neither a confirmation in the chat '
206
+ + 'nor a retry in another form lifts it. Leave it, or ask the user to do it themself, outside '
207
+ + 'Bob. Never suggest disabling the Geneseed hook.';
208
+
209
+ /** Law IV's real-loss tail, where the host can ask. Bob's is `BOB_FINAL`, appended by `ask`. */
210
+ const confirmTail = () => (HOST === 'bob' ? 'Leave the data in place.'
211
+ : 'Confirm this specific command, or leave the data in place.');
212
+
199
213
  /**
200
214
  * On Bob, which has no ask tier, which rules are worth a hard block. Laws I and IV: a
201
215
  * credential in a tracked file and a history-discarding git act are wrong in every context,
@@ -260,7 +274,7 @@ function ask(args, verb, rule, reason) {
260
274
  }
261
275
  ledger(args && args.root, verb, rule);
262
276
  // stdout is not read on Bob's PreToolUse; the reason goes where Bob's hook log looks.
263
- err(`[geneseed] BLOCKED: ${reason}\n`);
277
+ err(`[geneseed] BLOCKED: ${reason}${BOB_FINAL}\n`);
264
278
  return BOB_DENY_EXIT;
265
279
  }
266
280
  ledger(args && args.root, verb, rule);
@@ -458,7 +472,7 @@ function gitDecide(args, payload) {
458
472
  { split: lossSegments });
459
473
  if (loss) {
460
474
  return ask(args, 'git-gate', 'law-4', `Geneseed (Deletion Is Deliberate) \u2014 ${loss}. `
461
- + 'Confirm this specific command, or leave the data in place.');
475
+ + confirmTail());
462
476
  }
463
477
  }
464
478
  // Before `--no-consent`: that flag drops the process pack's rule, not this one.
@@ -376,6 +376,24 @@ function claudeAgentFrontmatter(stem, text, overrides) {
376
376
  return fm;
377
377
  }
378
378
 
379
+ /**
380
+ * Bob's agent dialect, read from its 2.2.3 runtime (`bob-code/dist/extension.js`; Bob's persona
381
+ * docs pages 404). Bob ignores Claude's `disallowedTools`, so the Claude dialect left every
382
+ * read-only agent with Bob's default groups `read, edit, execute` (live review 2026-10-23, F2).
383
+ * An ALLOWLIST of capability groups rather than a `denyTools` list of tool names: a tool Bob adds
384
+ * to the edit group later is shut without an emit change. `browser`/`mcp` stay out for every
385
+ * read-only agent, the webfetch marker included — which group holds Bob's web fetch is unverified.
386
+ * No `model:`: Bob throws on the key and drops the agent silently (`warnBobIgnored` says so).
387
+ */
388
+ function bobAgentFrontmatter(stem, text) {
389
+ const fm = [`name: ${stem}`, `description: ${jsonDumps(agentDescription(text))}`];
390
+ if (isReadonly(text)) {
391
+ fm.push('groups:', ' - read');
392
+ if (text.includes(BASH_MARKER)) fm.push(' - execute');
393
+ }
394
+ return fm;
395
+ }
396
+
379
397
  /** `_build_emit._opencode_agent_frontmatter`. */
380
398
  function opencodeAgentFrontmatter(stem, text, overrides, theme = null) {
381
399
  const fm = [`description: ${jsonDumps(agentDescription(text))}`, 'mode: subagent'];
@@ -467,6 +485,19 @@ function warnClaudeIgnored(overrides) {
467
485
  }
468
486
  }
469
487
 
488
+ /** Bob's agents take none of the four override keys — `model:` would even drop the agent. */
489
+ function warnBobIgnored(overrides) {
490
+ const keys = new Set();
491
+ for (const entry of Object.values(overrides)) {
492
+ if (!isDict(entry)) continue;
493
+ for (const key of OVERRIDE_KEYS) if (key === 'model' ? isTruthy(entry[key]) : given(entry[key])) keys.add(key);
494
+ }
495
+ for (const key of keys) {
496
+ warn(`[geneseed] WARN: agent-overrides.json sets '${key}', which Bob's agents do not `
497
+ + 'support — it is not applied');
498
+ }
499
+ }
500
+
470
501
  /**
471
502
  * Claim-on-create, as a closure over one emit's prior manifest: `claim(dest)` is true when
472
503
  * `dest` may be (over)written, false for a pre-existing file no previous emit owned — the
@@ -568,14 +599,15 @@ export function writeNativeLayer(items, agentsDir, skillsDir, overrides = null,
568
599
  // `disable-model-invocation` — and giving it the Claude-dialect alias SKILL.md (the
569
600
  // `host === 'claude'` branch below) would be an unverified key PLUS a visible duplicate
570
601
  // in the model's catalogue (exactly the OpenCode problem this file already dodges for
571
- // aliases). `bobDialect` suppresses both for Bob only, while `host: 'claude'` keeps every
572
- // OTHER Claude-dialect choice (agent frontmatter, `warnClaudeIgnored`) — Bob still renders
573
- // those verbatim. The caller (`emit-claude.mjs`) routes the suppressed names through
602
+ // aliases). `bobDialect` suppresses both for Bob only, and gives its agents Bob's own
603
+ // frontmatter (`bobAgentFrontmatter`) — `host: 'claude'` keeps every OTHER Claude-dialect
604
+ // choice. The caller (`emit-claude.mjs`) routes the suppressed names through
574
605
  // `writeAliasCommands(..., alsoUserOnly: true)` into `.bob/commands/*.md` instead (O2).
575
606
  bobDialect = false,
576
607
  } = {}) {
577
608
  const ov = overrides || {};
578
- if (host === 'claude') warnClaudeIgnored(ov);
609
+ if (bobDialect) warnBobIgnored(ov);
610
+ else if (host === 'claude') warnClaudeIgnored(ov);
579
611
  let nAgents = 0;
580
612
  let nSkills = 0;
581
613
  const written = [];
@@ -653,8 +685,9 @@ export function writeNativeLayer(items, agentsDir, skillsDir, overrides = null,
653
685
  let kind;
654
686
  let userOnly = false;
655
687
  if (folder === 'agents') {
656
- fm = host === 'claude' ? claudeAgentFrontmatter(stem, text, ov)
657
- : opencodeAgentFrontmatter(stem, text, ov, theme);
688
+ if (bobDialect) fm = bobAgentFrontmatter(stem, text);
689
+ else if (host === 'claude') fm = claudeAgentFrontmatter(stem, text, ov);
690
+ else fm = opencodeAgentFrontmatter(stem, text, ov, theme);
658
691
  dest = path.join(agentsDir, `${stem}.md`);
659
692
  kind = 'agent';
660
693
  } else {
@@ -35,7 +35,7 @@ import { isFile, readText } from '../lib/fs.mjs';
35
35
  * console draws it on the cost chart, so it lives here, once, where both read it. Raise it by
36
36
  * exactly the measured overrun and say why in that test's docblock, which keeps its history.
37
37
  */
38
- export const CARRIER_CEILING = { full: 63_266, lean: 39_628 };
38
+ export const CARRIER_CEILING = { full: 64_413, lean: 40_173 };
39
39
 
40
40
  /**
41
41
  * A frontmatter value as the host shows it. The emit writes descriptions JSON-escaped
package/js/web/api.mjs CHANGED
@@ -8,7 +8,7 @@
8
8
  * bind paths to these functions are `routes.mjs`. This file imports none of its route siblings,
9
9
  * which is what keeps the old `api ↔ actions` and `api ↔ activity` cycles from coming back.
10
10
  */
11
- import { readdirSync, statSync } from 'node:fs';
11
+ import { existsSync, readdirSync, statSync } from 'node:fs';
12
12
  import path from 'node:path';
13
13
 
14
14
  import { CONFIG, CREDIT_RE, ROOT, SRC, THEMES, discoverNames, loadKits, makeCfg, upstreamOf } from '../build/source.mjs';
@@ -500,7 +500,11 @@ export function apiLoopsActive() {
500
500
  }
501
501
 
502
502
  /** Is a newer release on npm than the source this console serves? See update-check.mjs. */
503
- export const apiUpdate = (state) => updateStatus(state, releaseLabel());
503
+ // `git`: a clone updates by `git pull` whatever npm says — main moves between releases, and a
504
+ // work proxy can leave the release check unanswered — so the console always offers Update there.
505
+ // `.git` is a file in a worktree, a folder in a clone; existence covers both.
506
+ export const apiUpdate = (state) => ({ ...updateStatus(state, releaseLabel()),
507
+ git: existsSync(path.join(ROOT, '.git')) });
504
508
 
505
509
  /** The source's release label, or null when it cannot be read. */
506
510
  function releaseLabel() {
package/js/web/daemon.mjs CHANGED
@@ -357,7 +357,7 @@ export async function statusDaemon(theme = null, port = null) {
357
357
  * `rebuild-all` when the running one is stale. EXCEPT inside a web job (`GENESEED_WEB_JOB`,
358
358
  * set by `js/web/jobs.mjs`): restarting here would kill the process tracking that very job,
359
359
  * leaving the console stuck on 'running'; the server restarts itself after an update job, and
360
- * shows its stale banner otherwise. `onlyIfStale` is `rebuild-all`'s: after an `upgrade`
360
+ * after a rebuild-all job when it is stale (`js/web/handler.mjs`). `onlyIfStale` is `rebuild-all`'s: after an `upgrade`
361
361
  * (which bounces, then runs `rebuild-all`) the console is current, and bouncing it again
362
362
  * would drop the open tab for nothing. Never throws — no rebuild fails over a console.
363
363
  */
@@ -368,7 +368,7 @@ export async function bounceDaemonIfRunning(theme, log, { onlyIfStale = false }
368
368
  }
369
369
  if (process.env.GENESEED_WEB_JOB) {
370
370
  log(onlyIfStale
371
- ? '[geneseed] the web console is running old code — use its Restart banner.'
371
+ ? '[geneseed] the web console is running old code — it restarts itself after this job.'
372
372
  : '[geneseed] web daemon will restart itself after this job to load the new code.');
373
373
  return;
374
374
  }
@@ -300,6 +300,17 @@ export function makeHandler(state, jm, token, dist, holder = null) {
300
300
  if (jid === null) return sendJson(res, { error: 'busy' }, 409, ae);
301
301
  return sendJson(res, { job_id: jid }, 202, ae);
302
302
  }
303
+ // A rebuild-all on a STALE server (a manual `git pull` under it) restarts it afterwards, as
304
+ // an update does: otherwise the rebuild lands and the page keeps serving the old code.
305
+ // `restarts` tells the console to wait for the new server and reload.
306
+ if (action === 'build-all' && state.daemonStale?.()) {
307
+ const jid = jm.start(action, actionCommands(action), (rc) => {
308
+ state.refresh();
309
+ if (rc === 0) requestRestart(state.theme);
310
+ });
311
+ if (jid === null) return sendJson(res, { error: 'busy' }, 409, ae);
312
+ return sendJson(res, { job_id: jid, restarts: true }, 202, ae);
313
+ }
303
314
  // Build resolves its argv off the install (`buildActionCmds`); the other actions take no
304
315
  // axes and self-resolve the deployed theme downstream.
305
316
  const cmds = action === 'build' ? buildActionCmds(state, body) : actionCommands(action);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "//": "Every field here is argued and gated in tests/unit/package_manifest.test.mjs. `files`, `bin` and `engines` each have a test that fails when reality drifts from this file; `version` mirrors harness.config.json and is gated too. Read that docblock before editing this one.",
3
3
  "name": "geneseed",
4
- "version": "4.15.1",
4
+ "version": "4.17.0",
5
5
  "description": "A portable, theme-able harness you implant once and use everywhere to grow a disciplined AI coding agent.",
6
6
  "keywords": [
7
7
  "ai",
package/src/AGENT.md.tmpl CHANGED
@@ -59,7 +59,8 @@ never move.
59
59
  | 2 | `user-rules.md` (§1) | may tighten a {{LAW}}, never repeal one |
60
60
  | 3 | The {{ONTOLOGY}} | never against a user rule |
61
61
  | 4 | The active {{DOCTRINES}} (§2) | may tighten, never repeal |
62
- | 5 | `PROFILE.md`, posture, mode, theme | inform only; never bind |
62
+ | 5 | The mode | binds how work runs |
63
+ | 6 | `PROFILE.md`, posture, theme | inform only; never bind |
63
64
 
64
65
  ---
65
66
 
@@ -91,3 +91,26 @@ most in an instruction, 25 in a description. Instructions: imperative, one actio
91
91
  condition first. Active voice, no -ing forms, no dropped articles, one word per meaning
92
92
  (`use`, not `utilize`). In another language, keep it and these rules.
93
93
  <!-- LEAN:end -->
94
+
95
+ ### {{DOCTRINE:mark-the-ask}} Mark the Ask
96
+ <!-- LEAN:begin -->
97
+ When a reply stops and waits on the user — a question, a choice, an approval, a blocker —
98
+ make the ask stand apart from the work around it, so a reader who skims finds it first. Open
99
+ the ask with one emoji marker that names its kind: `❓` a question, `👉` an act the user must
100
+ do, `⚠️` a risk or a blocker, `✅` work done that waits on their sign-off. The marker comes
101
+ before the code ({{DOCTRINE:codes-that-persist}}): `❓ **Q3** — keep the v1 route?`. Lay out
102
+ the options and the flows with arrows — `→ yes: keep it · → no: remove it` — one option per
103
+ line past two, the recommended one first and named as such. Put one ask in each block; where
104
+ the answer to one question changes the next, ask them one at a time. Use colour only where
105
+ the surface renders it, such as markdown or a rich host; never write ANSI escapes or colour
106
+ markup into plain text that prints them raw. Routine output stays plain: a reply that waits
107
+ on nothing carries no marker, and a marker on every line marks nothing. The markers are
108
+ signs, not words, so the prose around them keeps {{DOCTRINE:simplified-technical-english}}.
109
+ <!-- LEAN:else -->
110
+ When a reply waits on the user — a question, a choice, an approval, a blocker — mark the
111
+ ask. Open it with one marker: `❓` question, `👉` act to do, `⚠️` risk or blocker, `✅` done,
112
+ waits on sign-off; it comes before the code: `❓ **Q3** — keep the v1 route?`. Arrows (`→`)
113
+ lay out options and flows, the recommended option first. One ask per block. Colour only
114
+ where the host renders it, never raw ANSI in plain text. Routine output stays plain; markers
115
+ are signs, not words.
116
+ <!-- LEAN:end -->
@@ -3,11 +3,19 @@ crews for what's substantial, and keeps answering the user without blocking.
3
3
 
4
4
  - **Stay responsive.** Answer the user immediately; never let a running pipeline
5
5
  block the conversation.
6
- - **Triage every incoming task.** *Trivial* (a quick answer, a one-file tweak, a
7
- question) → do it directly, no pipeline. *Substantial* → spawn a pipeline (the
8
- `pipeline` {{SKILL}}) in the background and tell the user it's running.
9
- - **Compose the crew dynamically** from the agent roster, never below the floor
10
- for the task type — floors and roles live in the pipeline {{SKILL}}, not here.
6
+ - **Triage every incoming task by count, not by feel.** A task is *substantial* when
7
+ any one of these holds: it will change two or more files; it needs a new or changed
8
+ test; it needs about five reads or searches before the first edit; or it asks for a
9
+ feature, a fix, a review, an audit or an investigation. Substantial → spawn a
10
+ pipeline (the `pipeline` {{SKILL}}) in the background and tell the user it's
11
+ running. *Trivial* — none of these holds: a question answered from what is already
12
+ in context, a one-file tweak, a single command → do it directly, no pipeline.
13
+ **When unsure, delegate.** A host default to do small work yourself does not apply
14
+ here: this mode is the user's standing choice to delegate.
15
+ - **Dispatch one crew lead, then step away.** The crew lead composes the crew from
16
+ the whole agent roster, never below the floor for the task type, and runs the relay
17
+ itself. Never run the hand-offs from this session. Floors, roles and per-host
18
+ mechanics live in the pipeline {{SKILL}}, not here.
11
19
  - **Isolate.** Each pipeline works in its own git worktree/branch; falls back to a
12
20
  single tree, one pipeline at a time, when worktrees are unavailable.
13
21
  - **Merge on proof you re-ran.** A pipeline hands back its worktree, uncommitted, with
@@ -8,11 +8,13 @@
8
8
 
9
9
  ## What it is
10
10
 
11
- A pipeline is a small crew of {{AGENTS}} — analyst, developer, tester, plus whatever specialists the task demands — working a single task in isolation from the rest of the session, so the parent can keep answering the user while the crew runs. The parent never merges on the crew's word: it re-runs the crew's proof commands itself and merges only once the user accepts.
11
+ A pipeline is a small crew of {{AGENTS}} working a single task in isolation from the rest of the session, so the parent can keep answering the user while the crew runs. The parent dispatches **one crew lead** in the background and steps away. The crew lead composes the crew, runs the relay, and returns one result envelope. The parent never merges on the crew's word: it re-runs the crew's proof commands itself and merges only once the user accepts.
12
+
13
+ The parent does not run the relay itself. Each hand-off it ran would pull it back from the user, which is the one thing this {{SKILL}} exists to prevent.
12
14
 
13
15
  ## Crew floors
14
16
 
15
- The minimum roster per task type. The parent may add specialists on top — security, architect, reviewer, docs, historian, or any other {{AGENT}} the task genuinely needs — but never dispatches below the floor.
17
+ The minimum roster per task type. The crew lead chooses the crew from the whole {{AGENT}} roster: any {{AGENT}} the task genuinely needs — security, architect, performance, reviewer, docs, historian, researcher, or any other — in any order the task needs. The floor is the least it may dispatch, never the most.
16
18
 
17
19
  | Task type | Floor |
18
20
  |---|---|
@@ -23,14 +25,24 @@ The minimum roster per task type. The parent may add specialists on top — secu
23
25
 
24
26
  ## Procedure
25
27
 
26
- 1. Confirm the task is genuinely substantial — a trivial one-file tweak or a question does not warrant a crew; do it directly instead.
27
- 2. Compose the crew from the floor above, adding specialists only where the task demands them.
28
- 3. Isolate the crew's work in its own git worktree/branch. Where worktrees are unavailable, fall back to a single tree, one pipeline at a time, and say so. Give the crew a **write set** and check it against every other pipeline in flight ({{DOCTRINE:one-writer-per-file}}): two crews whose sets overlap do not run at once, and shared append files (registries, index tables, lockfiles, generated bundles) are the parent's to apply, never a crew's.
29
- 4. **The dev↔tester loop:** the developer implements, the tester validates — runs the tests and lint, produces raw logs. On failure, the findings go back to the developer — two repair rounds at most, then one fresh developer (a higher model tier where the host offers one) carrying the tester's findings ({{DOCTRINE:bound-the-loop}}); if that fails too, stop, do not merge, and report the failure with the branch left in place for inspection. A conflict or ambiguity between the plan, the findings and the code is yours to decide: decide it, record `Ruling: <choice> — <why> — <cost if wrong>` in the worklog, and continue. Stop only for what {{LAW:echo-the-intent}}, {{LAW:deletion-is-deliberate}} or {{DOCTRINE:consent-before-push}} names; every ruling goes in the final report ({{DOCTRINE:declare-the-judgment-calls}}). When the plan names a `Spec:`, the analyst reads it once; the spec outranks the plan.
30
- 5. **Two execution shapes**, chosen by host capability (same pattern as the [workflow {{SKILL}}](workflow.md)):
31
- - *Deterministic:* where the host exposes a `workflow` tool, run a saved script encoding analyst → developer → (tester ⇄ developer)×≤2 → fresh developer → proof.
32
- - *Model-driven fallback:* everywhere else, run the same stages via the [parallel-agents {{SKILL}}](parallel-agents.md) or sequential personas, with the same handoff envelopes and the same delivery contract.
33
- 6. On success, hand the worktree back to the parent uncommitted, with the mechanical proof (test + lint output, exit codes) and the list of files it changed in the result envelope, rebased on the current base so a conflict with a sibling resolves on the crew's branch. The pipeline never commits, pushes, or merges ({{DOCTRINE:consent-before-push}}): the parent records BASE before dispatch and, before re-running the proof, confirms the branch descends from it and the diff is non-empty (an empty diff is a failure; never `HEAD~1`); it re-runs the proof commands itself, shows the user the diff and the output, and commits and merges once the user accepts.
28
+ 1. Take the triage as given. Under foreman mode the task reached you because it met the mode's count; invoked directly, the user's request is the trigger. Do not weigh it again and fall back to doing the work yourself.
29
+ 2. **Dispatch the crew lead** in the background, using the host's general-purpose {{AGENT}}. Before dispatch, record BASE and set the crew's **write set**; check it against every other pipeline in flight ({{DOCTRINE:one-writer-per-file}}) — two crews whose sets overlap do not run at once. The brief carries: the task as the user stated it, the task type, BASE, the write set, the proof commands, a pointer to this {{SKILL}}, and the rule that it never commits, pushes or merges. Tell the user the pipeline is running, then go back to the user. Do not wait on the crew lead.
30
+ 3. **The crew lead composes the crew** from the floor above and adds any {{AGENT}} the task needs. It dispatches each crew member as its own subagent, each handed what the previous one produced. Where the crew lead holds no dispatch tool (see *Hosts* below), it plays each role in turn itself, with the same hand-offs and the same envelope. Steps 4 to 7 are the crew lead's, except where they name the parent.
31
+ 4. Isolate the crew's work in its own git worktree/branch. Where worktrees are unavailable, fall back to a single tree, one pipeline at a time, and say so. The crew writes only inside its write set; shared append files (registries, index tables, lockfiles, generated bundles) are the parent's to apply, never a crew's.
32
+ 5. **The dev↔tester loop:** the developer implements, the tester validates — runs the tests and lint, produces raw logs. On failure, the findings go back to the developer — two repair rounds at most, then one fresh developer (a higher model tier where the host offers one) carrying the tester's findings ({{DOCTRINE:bound-the-loop}}); if that fails too, stop, do not merge, and report the failure with the branch left in place for inspection. A conflict or ambiguity between the plan, the findings and the code is yours to decide: decide it, record `Ruling: <choice> — <why> — <cost if wrong>` in the worklog, and continue. Stop only for what {{LAW:echo-the-intent}}, {{LAW:deletion-is-deliberate}} or {{DOCTRINE:consent-before-push}} names; every ruling goes in the final report ({{DOCTRINE:declare-the-judgment-calls}}). When the plan names a `Spec:`, the analyst reads it once; the spec outranks the plan.
33
+ 6. **Pick the shape by host** (table below). Where the host offers a workflow tool the {{SKILL}} may use without a fresh opt-in, a saved script may stand in for the crew lead: analyst → developer → (tester ⇄ developer)×≤2 → fresh developer → proof ([workflow {{SKILL}}](workflow.md)). Everywhere else the crew lead runs the same stages, with the same hand-offs and the same delivery contract.
34
+ 7. On success, hand the worktree back to the parent uncommitted, with the mechanical proof (test + lint output, exit codes) and the list of files it changed in the result envelope, rebased on the current base so a conflict with a sibling resolves on the crew's branch. The pipeline never commits, pushes, or merges ({{DOCTRINE:consent-before-push}}): the parent records BASE before dispatch and, before re-running the proof, confirms the branch descends from it and the diff is non-empty (an empty diff is a failure; never `HEAD~1`); it re-runs the proof commands itself, shows the user the diff and the output, and commits and merges once the user accepts.
35
+
36
+ ## Hosts
37
+
38
+ | Host | Crew lead runs in the background | Crew lead can dispatch the crew | Shape |
39
+ |---|---|---|---|
40
+ | Claude Code | yes — a subagent started from the main conversation runs in the background by default | yes — subagents nest up to three layers by default (`CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH`), and a background subagent keeps the `Agent` tool | crew lead → crew subagents. Not the `Workflow` tool: it refuses without the user's opt-in for that task, and the mode is not one |
41
+ | OpenCode | the `task` tool starts a child session; whether the parent's turn waits is unverified | unverified — `permission.task` decides which subagents an agent may start | crew lead → crew subagents where it holds `task`; else roles in turn. A saved `workflow` script (no opt-in needed) may stand in for the crew lead |
42
+ | OpenClaude | expected as Claude Code (it reads Claude's subagent dialect); unverified | unverified | as Claude Code; else roles in turn |
43
+ | Bob | unverified — Bob reads Claude's subagent dialect | unverified | crew lead plays the roles in turn |
44
+
45
+ Check, do not assume: before the first pipeline of a session on a host marked unverified, look at the tools you and the crew lead actually hold ({{DOCTRINE:tool-discovery}}). When a fact above proves wrong, report it through this {{SKILL}}'s self-improvement loop.
34
46
 
35
47
  ## Delivery contract
36
48
 
@@ -123,6 +123,7 @@
123
123
  "DOC_STRUCTURE_BESIDE_PROSE": "<themed title for the comms rule Structure Beside Prose>",
124
124
  "DOC_DECLARE_THE_JUDGMENT_CALLS": "<themed title for the comms rule Declare the Judgment Calls>",
125
125
  "DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "<themed title for the comms rule Simplified Technical English>",
126
+ "DOC_MARK_THE_ASK": "<themed title for the comms rule Mark the Ask>",
126
127
  "INTRO_DOC": "<themed intro: this file is the entry point an AI agent reads in this repo>",
127
128
  "INTRO_AGENTS": "<themed intro to the Agents section — delegate focused work to a specialist>",
128
129
  "INTRO_SKILLS": "<themed intro to the Skills section — run the written procedure before improvising>",
package/themes/biker.json CHANGED
@@ -123,6 +123,7 @@
123
123
  "DOC_STRUCTURE_BESIDE_PROSE": "Draw the Route Only If It Turns · Structure Beside Prose",
124
124
  "DOC_DECLARE_THE_JUDGMENT_CALLS": "Own Up to Every Back Road Taken · Declare the Judgment Calls",
125
125
  "DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Short Words, Clear Signals · Simplified Technical English",
126
+ "DOC_MARK_THE_ASK": "Flash the Lights When You Need an Answer · Mark the Ask",
126
127
  "INTRO_DOC": "This file is the route briefing a coding rider reads when it joins this repository.",
127
128
  "INTRO_AGENTS": "Send the right rider for focused work instead of riding the whole run yourself; each has one job and reports exactly what it did.",
128
129
  "INTRO_SKILLS": "A Skill is a move you've drilled for a recurring task. Run the matching move before you wing it.",
@@ -123,6 +123,7 @@
123
123
  "DOC_STRUCTURE_BESIDE_PROSE": "Track Map Only When the Lines Matter · Structure Beside Prose",
124
124
  "DOC_DECLARE_THE_JUDGMENT_CALLS": "Replay the Calls Made Off the Radio · Declare the Judgment Calls",
125
125
  "DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Every Call Clear Over the Noise · Simplified Technical English",
126
+ "DOC_MARK_THE_ASK": "Big Moment, Big Graphic · Mark the Ask",
126
127
  "INTRO_DOC": "This file is the race briefing a coding driver reads when it joins this repository.",
127
128
  "INTRO_AGENTS": "Put the right driver in the car for focused work instead of running the whole race yourself; each has one job and reports exactly what it did.",
128
129
  "INTRO_SKILLS": "A Skill is a rehearsed manoeuvre for a recurring task. Run the matching manoeuvre before you improvise.",
@@ -123,6 +123,7 @@
123
123
  "DOC_STRUCTURE_BESIDE_PROSE": "Trace the Wires, Skip the Chrome · Structure Beside Prose",
124
124
  "DOC_DECLARE_THE_JUDGMENT_CALLS": "Log Every Off-Grid Call · Declare the Judgment Calls",
125
125
  "DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Clean Signal, Zero Noise · Simplified Technical English",
126
+ "DOC_MARK_THE_ASK": "Ping the Operator in Neon · Mark the Ask",
126
127
  "INTRO_DOC": "This file is the boot sequence a coding daemon reads when it jacks into this repository.",
127
128
  "INTRO_AGENTS": "Spin the right daemon for focused work instead of running the whole job on one thread; each has one function and returns a clean log of what it changed.",
128
129
  "INTRO_SKILLS": "A Skill is a proven routine for a recurring task. Run the matching routine before you freestyle.",
package/themes/gamer.json CHANGED
@@ -123,6 +123,7 @@
123
123
  "DOC_STRUCTURE_BESIDE_PROSE": "Minimap Only When There Is a Route · Structure Beside Prose",
124
124
  "DOC_DECLARE_THE_JUDGMENT_CALLS": "Show the Branches You Picked · Declare the Judgment Calls",
125
125
  "DOC_SIMPLIFIED_TECHNICAL_ENGLISH": "Patch Notes Anyone Can Read · Simplified Technical English",
126
+ "DOC_MARK_THE_ASK": "Quest Marker Over the Choice · Mark the Ask",
126
127
  "INTRO_DOC": "This file is the loading screen a coding co-op partner reads when it joins this repository.",
127
128
  "INTRO_AGENTS": "Pick the right class for focused work instead of soloing the whole raid; each has one role and reports exactly what it did.",
128
129
  "INTRO_SKILLS": "A Skill is a practiced combo for a recurring task. Run the matching combo before you freestyle.",