geneseed 2.0.0 → 3.0.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 +217 -5
- package/DESIGN.md +149 -1326
- package/QUICKSTART.md +1 -1
- package/README.md +30 -22
- package/SETUP.md +98 -24
- package/SHIPPED.md +6 -5
- package/adapters/bob/README.md +3 -3
- package/adapters/claude-code/README.md +6 -4
- package/adapters/claude-code/skills/geneseed/SKILL.md +10 -6
- package/adapters/copilot/README.md +5 -4
- package/adapters/opencode/GLOBAL-HARNESS-SPEC.md +11 -6
- package/adapters/opencode/HOW-OPENCODE-LOADS.md +1 -1
- package/adapters/opencode/README.md +15 -9
- package/adapters/opencode/agents/orchestrator.md +1 -1
- package/adapters/opencode/opencode.json +0 -9
- package/adapters/opencode/plugins/geneseed-context.js +7 -7
- package/adapters/opencode/plugins/geneseed-guard.js +6 -6
- package/adapters/opencode/workflows/dispatch.js +1 -1
- package/bin/geneseed.mjs +74 -8
- package/docs/declined.md +53 -2
- package/docs/design-history.md +1290 -0
- package/docs/extending.md +672 -0
- package/docs/limits.md +141 -82
- package/docs/token-footprint.md +15 -4
- package/docs/web/agents.md +1 -1
- package/docs/web/authoring.md +1 -1
- package/docs/web/claude-hooks.md +2 -2
- package/docs/web/collaboration.md +3 -3
- package/docs/web/first-session.md +2 -2
- package/docs/web/footprint.md +14 -7
- package/docs/web/foreman-mode.md +2 -2
- package/docs/web/harnesses.md +5 -3
- package/docs/web/install-quick.md +1 -1
- package/docs/web/model.md +3 -3
- package/docs/web/plugin-context.md +2 -2
- package/docs/web/plugin-guard.md +3 -3
- package/docs/web/plugin-ponytail.md +1 -1
- package/docs/web/rules.md +23 -3
- package/docs/web/setup-choices.md +20 -7
- package/docs/web/themes-author.md +13 -1
- package/docs/web-ui.md +36 -12
- package/geneseed +0 -0
- package/harness.config.json +1 -1
- package/js/catalog.mjs +29 -4
- package/js/checkout.mjs +24 -1
- package/js/cli-table.json +9 -7
- package/js/diff.mjs +8 -3
- package/js/doctor.mjs +374 -26
- package/js/emit.mjs +48 -11
- package/js/generate.mjs +39 -5
- package/js/hooks.mjs +8 -7
- package/js/installs.mjs +101 -4
- package/js/inventory.mjs +150 -20
- package/js/lib/fs.mjs +6 -2
- package/js/mcp.mjs +3 -15
- package/js/migrate.mjs +10 -4
- package/js/render.mjs +116 -11
- package/js/settings.mjs +297 -28
- package/js/setup.mjs +95 -5
- package/js/status.mjs +45 -4
- package/js/themes.mjs +1 -1
- package/js/tui.mjs +46 -3
- package/js/uninstall.mjs +30 -11
- package/js/web/actions.mjs +76 -9
- package/js/web/api.mjs +95 -16
- package/js/web/docs.mjs +33 -5
- package/js/web/jobs.mjs +12 -3
- package/js/web/server.mjs +59 -2
- package/package.json +1 -1
- package/src/AGENT.md.tmpl +75 -65
- package/src/agents/_template.md +4 -4
- package/src/agents/advocate.md +4 -4
- package/src/agents/architect.md +2 -2
- package/src/agents/developer.md +5 -5
- package/src/agents/docs.md +2 -2
- package/src/agents/empiricist.md +3 -3
- package/src/agents/explorer.md +3 -3
- package/src/agents/framer.md +3 -3
- package/src/agents/historian.md +3 -3
- package/src/agents/operator.md +3 -3
- package/src/agents/pragmatist.md +3 -3
- package/src/agents/reviewer.md +2 -2
- package/src/agents/security.md +2 -2
- package/src/agents/skeptic.md +4 -4
- package/src/agents/steward.md +3 -3
- package/src/agents/tester.md +2 -2
- package/src/agents/user-advocate.md +3 -3
- package/src/agents/visionary.md +3 -3
- package/src/doctrines/README.md +41 -0
- package/src/doctrines/craft.md +51 -0
- package/src/doctrines/ops.md +61 -0
- package/src/doctrines/process.md +87 -0
- package/src/doctrines/rigor.md +52 -0
- package/src/laws/universal.md +17 -301
- package/src/memory/README.md +2 -2
- package/src/modes/README.md +2 -2
- package/src/modes/foreman.md +1 -1
- package/src/notebook/README.md +2 -2
- package/src/ontology/universal.md +89 -0
- package/src/postures/README.md +3 -3
- package/src/postures/artisan.md +3 -3
- package/src/postures/assistant.md +1 -1
- package/src/postures/expert.md +1 -1
- package/src/postures/mentor.md +1 -1
- package/src/postures/peer.md +2 -2
- package/src/skills/_template.md +2 -2
- package/src/skills/brainstorm.md +2 -2
- package/src/skills/clarify.md +2 -2
- package/src/skills/codebase-design.md +1 -1
- package/src/skills/commit.md +5 -5
- package/src/skills/council.md +4 -4
- package/src/skills/crash-course.md +1 -1
- package/src/skills/daydream/SKILL.md +1 -1
- package/src/skills/debug.md +2 -2
- package/src/skills/decode.md +1 -1
- package/src/skills/develop.md +6 -6
- package/src/skills/document-project.md +4 -4
- package/src/skills/domain-modeling.md +1 -1
- package/src/skills/drill.md +1 -1
- package/src/skills/feynman.md +1 -1
- package/src/skills/forge-mcp.md +3 -3
- package/src/skills/fresh-eyes.md +4 -4
- package/src/skills/frontend-design.md +1 -1
- package/src/skills/gap-detector.md +1 -1
- package/src/skills/geneseed-code-review.md +1 -1
- package/src/skills/geneseed.md +4 -4
- package/src/skills/git-archaeology.md +1 -1
- package/src/skills/git-rescue.md +3 -3
- package/src/skills/handoff.md +4 -4
- package/src/skills/herdr.md +1 -1
- package/src/skills/ingest.md +3 -3
- package/src/skills/learning-path.md +1 -1
- package/src/skills/migrate.md +5 -5
- package/src/skills/opencode-theme.md +1 -1
- package/src/skills/parallel-agents.md +2 -2
- package/src/skills/pipeline.md +2 -2
- package/src/skills/plan.md +2 -2
- package/src/skills/ponytail.md +1 -1
- package/src/skills/profile.md +1 -1
- package/src/skills/prose.md +2 -2
- package/src/skills/prototype.md +2 -2
- package/src/skills/refactor.md +2 -2
- package/src/skills/release.md +4 -4
- package/src/skills/repo-map.md +5 -5
- package/src/skills/research.md +6 -6
- package/src/skills/review-response.md +3 -3
- package/src/skills/roast-me.md +1 -1
- package/src/skills/rule.md +5 -5
- package/src/skills/ship.md +3 -3
- package/src/skills/tdd.md +2 -2
- package/src/skills/tickets.md +1 -1
- package/src/skills/wayfinder.md +1 -1
- package/src/skills/wiki.md +4 -4
- package/src/skills/workflow.md +2 -2
- package/themes/README.md +17 -7
- package/themes/_TEMPLATE.json +37 -33
- package/themes/biker.json +37 -33
- package/themes/commentator.json +37 -33
- package/themes/cyberpunk.json +37 -33
- package/themes/gamer.json +37 -33
- package/themes/imperial.json +37 -33
- package/themes/joker.json +37 -33
- package/themes/marvin.json +37 -33
- package/themes/mean.json +37 -33
- package/themes/military.json +37 -33
- package/themes/neutral.json +37 -33
- package/themes/pirate.json +37 -33
- package/themes/sports.json +37 -33
- package/themes/verstappen.json +37 -33
- package/themes/wizard.json +37 -33
- package/web/dist/assets/{About-DX1-VTBP.js → About-C0Mk0igT.js} +1 -1
- package/web/dist/assets/{Activity-Dp9NaXOn.js → Activity-C4aJJVXz.js} +1 -1
- package/web/dist/assets/{ActivityDetail-HpOBtrXS.js → ActivityDetail-DaQ85za0.js} +1 -1
- package/web/dist/assets/{Diff-Ct4G3Se8.js → Diff-B3tlO2Yj.js} +1 -1
- package/web/dist/assets/{Doctor-DGjkZFuA.js → Doctor-BNC-5Dmo.js} +1 -1
- package/web/dist/assets/{Graph-b8o-S6kv.js → Graph-us0T6ZcV.js} +1 -1
- package/web/dist/assets/Harnesses-DAMgyfM_.js +1 -0
- package/web/dist/assets/Laws-rOxegJ75.js +1 -0
- package/web/dist/assets/{Library-BEZscyaQ.js → Library-KmwrHA1J.js} +1 -1
- package/web/dist/assets/{Markdown-k_LSLBGq.js → Markdown-0eQOVGSF.js} +1 -1
- package/web/dist/assets/{Profile-DydukTxP.js → Profile-ZU7WV6Xl.js} +1 -1
- package/web/dist/assets/{Rules-CIRG4Ldt.js → Rules-CtDoPhhf.js} +1 -1
- package/web/dist/assets/{Skills-Buoi1IBr.js → Skills-BhoOxdkD.js} +1 -1
- package/web/dist/assets/{StatusBadge-CE_AJttl.js → StatusBadge-CGvYVCwa.js} +1 -1
- package/web/dist/assets/{Themes-CI4o3gJC.js → Themes-Dr7OOkD7.js} +1 -1
- package/web/dist/assets/{activity-BCW7e6Cy.js → activity-B8aq3qtl.js} +1 -1
- package/web/dist/assets/index-2wqPDxuN.css +1 -0
- package/web/dist/assets/{index-B1PIx7RM.js → index-AhMzkdbI.js} +1 -1
- package/web/dist/assets/index-CRftEtBX.js +12 -0
- package/web/dist/assets/{index-Ck2iCdaC.js → index-D0lPN_qW.js} +1 -1
- package/web/dist/index.html +2 -2
- package/web/src/pages/Laws.jsx +282 -88
- package/web/dist/assets/Harnesses-gr3-aHBF.js +0 -1
- package/web/dist/assets/Laws-DTwF5tTC.js +0 -1
- package/web/dist/assets/index-BnTQUSUz.js +0 -12
- package/web/dist/assets/index-DUCsDv7z.css +0 -1
package/QUICKSTART.md
CHANGED
|
@@ -10,7 +10,7 @@ repo inherits it, nothing committed into your projects. The only prerequisite is
|
|
|
10
10
|
|
|
11
11
|
Same command on macOS, Linux and Windows (cmd, PowerShell, or any POSIX shell).
|
|
12
12
|
|
|
13
|
-
Pick a **theme**, pick **OpenCode global** when asked for the install mode, confirm.
|
|
13
|
+
Pick a **theme**, then accept the defaults for posture, mode, doctrine packs and footprint (or pick deliberately — see [setup choices](docs/web/setup-choices.md)), pick **OpenCode global** when asked for the install mode, confirm.
|
|
14
14
|
The wizard builds the harness and offers a health check.
|
|
15
15
|
|
|
16
16
|
Want the command to stay? `npm install -g geneseed`, then plain `geneseed …` from
|
package/README.md
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**A portable, theme-able harness you implant once and use everywhere to grow a disciplined AI coding agent.**
|
|
6
6
|
|
|
7
|
+
[](https://www.npmjs.com/package/geneseed)
|
|
7
8
|
[](https://github.com/Arylmera/Geneseed/actions/workflows/ci.yml)
|
|
8
9
|
[](LICENSE)
|
|
9
10
|
[](package.json)
|
|
@@ -11,7 +12,7 @@
|
|
|
11
12
|
[](themes/)
|
|
12
13
|
[](src/skills/)
|
|
13
14
|
[](src/agents/)
|
|
14
|
-
[](src/laws/universal.md)
|
|
15
16
|
[](adapters/opencode/plugins/)
|
|
16
17
|
[](#-supported-harnesses)
|
|
17
18
|
|
|
@@ -37,7 +38,7 @@ The lineage is also why an **imperial** theme ships alongside the neutral one: i
|
|
|
37
38
|
|
|
38
39
|
### How it works
|
|
39
40
|
|
|
40
|
-
One canonical source in `src/` renders, via a tiny zero-dependency generator (`geneseed-build`), into a ready-to-use bundle. **A theme controls only *voice*** — how the AI responds and how the prose inside the docs reads (tagline, greeting, descriptions). **Structure is theme-independent**: section names (Rules, Agents, Skills, Memory…)
|
|
41
|
+
One canonical source in `src/` renders, via a tiny zero-dependency generator (`geneseed-build`), into a ready-to-use bundle. **A theme controls only *voice*** — how the AI responds and how the prose inside the docs reads (tagline, greeting, descriptions). **Structure is theme-independent**: section names (Rules, Agents, Skills, Memory…), folder names (`laws/`, `ontology/`, `doctrines/`, `agents/`, `skills/`, `memory/`, `notebook/`) and the four ontology section headings (Telos, Evidence, Decisions, Conduct) are always plain English, so the scaffolding stays tool-friendly while the flavour lives in the words.
|
|
41
42
|
|
|
42
43
|
```bash
|
|
43
44
|
geneseed-build # default theme (neutral)
|
|
@@ -50,7 +51,7 @@ geneseed-build --theme imperial # Warhammer 40k voice, identical structure
|
|
|
50
51
|
|
|
51
52
|
### ⚡ The short way — `npx`
|
|
52
53
|
|
|
53
|
-
One command, nothing cloned, nothing else to install. The only prerequisite is **Node ≥ 22.3**.
|
|
54
|
+
The harness is published on npm as **[`geneseed`](https://www.npmjs.com/package/geneseed)** — three commands (`geneseed`, `geneseed-hook`, `geneseed-build`), zero dependencies. One command, nothing cloned, nothing else to install. The only prerequisite is **Node ≥ 22.3**.
|
|
54
55
|
|
|
55
56
|
```bash
|
|
56
57
|
npx geneseed setup # the guided wizard
|
|
@@ -88,13 +89,11 @@ cd Geneseed
|
|
|
88
89
|
|
|
89
90
|
Both launchers are thin shims over the Node CLI: they need `node` (22.3+) on `PATH`, and nothing else. Set `GENESEED_NODE` to an absolute path if `node` is not on `PATH` — under a version manager that only patches interactive shells, say. The wizard is plain text prompts on every console, old or new.
|
|
90
91
|
|
|
91
|
-
**Already installed from a clone?** `geneseed migrate` moves every install you have onto the npm shape in one pass, all-or-nothing, without touching hooks or login items it did not write. Your old clone keeps working for a full release — there is no cliff. See [Migrate an existing install](docs/web/migrate.md).
|
|
92
|
-
|
|
93
92
|
### 🟩 One runtime — Node, and nothing else
|
|
94
93
|
|
|
95
|
-
Node ≥ 22.3 is the entire dependency list. Every subcommand, all four hooks, every web-console endpoint and both generators run from it, and
|
|
94
|
+
Node ≥ 22.3 is the entire dependency list. Every subcommand, all four hooks, every web-console endpoint and both generators run from it, and every commit runs the whole unit suite plus `doctor --all` across every theme × host × footprint, on Linux and Windows both. So an install needs no second interpreter — not for the harness, and not for anything it ships. (Until 2026-08-17 the generator's output was also replayed byte for byte against recordings taken from the Python implementation. Those were retired — see [`docs/limits.md`](docs/limits.md) for the measurement that licensed it and the coverage it cost.)
|
|
96
95
|
|
|
97
|
-
- **0 commands have no Node twin**: 25 of the 25 subcommands, and all four hook verbs, answer from the Node entry points. `catalog`, `mcp` and `memory` are Node-native faces the CLI table declares on top of that roster. There is no full-screen browse panel — `geneseed tui` and `geneseed menu` are verbs that refuse it by name and print the command list instead
|
|
96
|
+
- **0 commands have no Node twin**: 25 of the 25 subcommands, and all four hook verbs, answer from the Node entry points. `catalog`, `mcp` and `memory` are Node-native faces the CLI table declares on top of that roster. There is no full-screen browse panel — `geneseed tui` and `geneseed menu` are verbs that refuse it by name and print the command list instead, off a terminal as well as on one.
|
|
98
97
|
- **Nothing you install needs an interpreter.** The `token-report` skill is a script rather than prose, and it ships as `scripts/token_report.mjs`, run with `node`; `daydream` and `herdr` hand their inline code to `node -e`. So **every bundle carries** nothing that needs one: no Python file, and no skill that shells out to an interpreter, on any host, theme or footprint. Three tests freeze that — one scans every tracked file for inline code handed to an interpreter, one globs the bundle source, and one replays the report script over seeded transcripts for all four hosts and compares the bytes.
|
|
99
98
|
- **`upgrade` / `update` / `sync-self` / `bootstrap` are for a git checkout.** They `git pull` the install's own origin. From an npm install they stop before touching anything and name `npm install -g geneseed@latest` as the update instead.
|
|
100
99
|
|
|
@@ -149,11 +148,13 @@ No browser? Every action the console offers is also a verb: `build`, `doctor`, `
|
|
|
149
148
|
|
|
150
149
|
## 📦 4 · What you get
|
|
151
150
|
|
|
152
|
-
The harness ships as a small set of layers,
|
|
151
|
+
The harness ships as a small set of layers, and the web console's rail is the same shape — Constitution, Skills and Agents each have their own entry; Memory, Notebook and the wiki sit under Library:
|
|
153
152
|
|
|
154
153
|
| Layer | What it is |
|
|
155
154
|
| --- | --- |
|
|
156
|
-
|
|
|
155
|
+
| **🧭 Ontology** (`ontology/`) | the mind the rules govern, in four prose sections — **Telos** (the Pact: protect the user, the truth, the agent), **Evidence** (every claim graded by how it was obtained), **Decisions** (classify and tier by reversibility, show the real forks), **Conduct** (answer what was asked, once). Always in force, never toggleable |
|
|
156
|
+
| **🛡️ Rules** (`laws/`) | 9 universal laws the agent obeys — always in force, never toggleable: sealed-secrets, one-intent-one-act, verify-before-assert, deletion-is-deliberate, surface-failures, data-not-orders, least-privilege, root-cause, external-gate |
|
|
157
|
+
| **📐 Doctrines** (`doctrines/`) | practice packs, chosen per install at build time: **craft** (how code is written), **rigor** (how work is proven), **ops** (how the machine is operated), **process** (how a task is run). A doctrine rule may tighten a Rule, never repeal one, and the user's own `user-rules.md` outranks it. Pick with `geneseed-build --doctrines craft,rigor` (or `none`), or in the setup wizard; all four pack files ship on disk either way, so a citation into a pack you left out still resolves |
|
|
157
158
|
| **🤖 Agents** (17) | capability specialists: `reviewer`, `tester`, `architect`, `docs`, `security`, `explorer`, `developer` — plus a debate **council** the `council` skill convenes: `advocate`, `skeptic`, `pragmatist`, `steward`, `visionary`, `user-advocate`, `framer`, `empiricist`, `operator`, `historian` |
|
|
158
159
|
| **🛠 Skills** (47) | repeatable workflows: brainstorm · **clarify** · plan · **codebase-design** · **domain-modeling** · **wayfinder** · **tickets** · tdd · **develop** · debug · **prototype** · refactor · **ponytail** · **forge-mcp** · geneseed-code-review · **fresh-eyes** · **review-response** · commit · **ship** · **release** · **migrate** · **git-archaeology** · **git-rescue** · repo-map · document-project · **frontend-design** · **prose** · **ingest** · **research** · **learning-path** · **gap-detector** · **feynman** · **crash-course** · **drill** · **decode** · handoff · roast-me · **council** · parallel-agents · **workflow** · **wiki** · **geneseed** · **rule** · **profile** · **opencode-theme** · **herdr** · **pipeline** |
|
|
159
160
|
| **🔌 Plugins** (OpenCode) | `geneseed-context` injects project docs *and your machine wiki* every session (and across compaction); `geneseed-learn` distils memory at session end; `geneseed-guard` enforces the safety Laws and protected wiki folders at the tool boundary; `geneseed-workflow` registers the `workflow` tool that runs saved orchestration scripts; `geneseed-notify` sends a native OS notification when a long run finishes; `geneseed-ponytail` holds a minimal-code mode (`/ponytail lite\|full\|ultra\|off`), opt-in, injecting the laziest-that-works ruleset every turn so it doesn't drift; `geneseed-activity` streams what each session is doing to the web console's Activity view |
|
|
@@ -182,16 +183,20 @@ Pick with `--theme NAME` or via the setup wizard. The theme is remembered in a `
|
|
|
182
183
|
|
|
183
184
|
### 🪶 Footprint (lean vs full)
|
|
184
185
|
|
|
185
|
-
A second per-install dial, **footprint**, sets how much of the
|
|
186
|
+
A second per-install dial, **footprint**, sets how much of the constitution `AGENT.md` carries *inline* every turn — a token-cost knob, not a change to which Rules apply (every Rule is always in force, and so is the whole of the Ontology).
|
|
186
187
|
|
|
187
|
-
| Footprint |
|
|
188
|
+
| Footprint | The Ontology + Sections 1–2 of `AGENT.md` | Trade-off |
|
|
188
189
|
| --- | --- | --- |
|
|
189
|
-
| **lean** *(default)* | each Rule
|
|
190
|
-
| **full** | every Rule
|
|
190
|
+
| **lean** *(default)* | the Ontology **whole**; each Rule and each active doctrine rule as its heading + the rule line, then a pointer to the full text | lighter every turn; rationale is one on-demand read away |
|
|
191
|
+
| **full** | the Ontology, every Rule and every active doctrine rule at complete text **and** rationale, inlined | maximum guidance density; largest per-turn token cost |
|
|
192
|
+
|
|
193
|
+
**The Ontology is never truncated.** Lean keeps only the first sentence of each `### ` block, and the four ontology sections are flowing prose rather than numbered rules — truncating them would leave four orphan sentences, so they ship whole at both footprints. The invariants and the doctrine rules *are* truncated at lean, each to its heading plus its first sentence.
|
|
191
194
|
|
|
192
|
-
|
|
195
|
+
Both footprints put the full text on disk beside `AGENT.md`: `laws/`, `ontology/` and `doctrines/` all ship in the bundle, and **all four pack files ship whether or not the pack was built in** — which is what lets a citation into an inactive pack resolve. So lean is a context/token optimization, **not** a rules cut. Measured on `neutral`, adding the ontology and doctrine tiers moved the always-loaded `AGENT.md` from 31,457 to 36,882 bytes at lean (+17.2%) and from 53,378 to 54,810 at full (+2.7%) — the lean growth is the price of shipping the ontology whole, and it was taken deliberately.
|
|
193
196
|
|
|
194
|
-
|
|
197
|
+
Lean is the default: the rationale is one read away and the context it frees is paid back on every turn. Switch to **full** when token cost is a non-issue or you run a smaller model, which leans harder on always-present rationale. Set it with `--footprint lean|full`, the Settings toggle, the per-harness dropdown in the Harnesses tab, or the setup wizard. It's remembered in a `.geneseed-footprint` marker and preserved across rebuilds, on every host (OpenCode, Claude Code, Bob, Copilot).
|
|
198
|
+
|
|
199
|
+
Either way the harness is otherwise identical — same files, Rules, capabilities, and guards; lean only relocates the *reasoning* to on-demand (and adds the standalone law, ontology and doctrine files to global/Claude/Bob installs). The one behavioural edge: with the rationale always in context, **full** applies a rule's nuance more reliably on subtle edge cases — or with a weaker model that may not reach for the pointer.
|
|
195
200
|
|
|
196
201
|
Want to check a build before it touches anything real? `geneseed-build --validate-only --theme NAME --emit MODE --out TARGET` renders and validates into a throwaway sandbox — nothing under `--out`/`--root` is written — and exits non-zero on any problem. Details: [SETUP.md](SETUP.md#dry-run-a-build-validate).
|
|
197
202
|
|
|
@@ -215,10 +220,10 @@ is **identical on every host**. What differs is how much of it the host can
|
|
|
215
220
|
| **Agents** (capability specialists) | ✅ native | ✅ | ✅ | ✅ `.agent.md` |
|
|
216
221
|
| **Skills** (byte-identical) | ✅ | ✅ | ✅ | ✅ |
|
|
217
222
|
| **Memory & Notebook** | ✅ | ✅ | ✅ | ✅ |
|
|
218
|
-
| **Context injection**
|
|
223
|
+
| **Context injection** | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 📄 preamble |
|
|
219
224
|
| **Memory write-back** (learn) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 📄 preamble |
|
|
220
|
-
| **Git-gate consent** (
|
|
221
|
-
| **Rule-gate consent** (
|
|
225
|
+
| **Git-gate consent** (process 5) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 📄 preamble |
|
|
226
|
+
| **Rule-gate consent** (process 1) | ⚙️ plugin² | 🪝 hook | 🪝 hook¹ | 📄 preamble |
|
|
222
227
|
| **Sovereign-repo excludes** | ⚙️ plugin | ✅ `claudeMdExcludes` | ✅ rules-shadow | ➖ none |
|
|
223
228
|
| **MCP server wiring** | ✅ `mcp` | ✅ `mcpServers` | ✅ `mcpServers` | ✅ `mcp-config.json` |
|
|
224
229
|
| **Colour themes** | ✅ full palette | ➖ | ➖ | ➖ |
|
|
@@ -254,14 +259,19 @@ Geneseed/
|
|
|
254
259
|
├── harness.config.json default theme + metadata (the one owner of the version)
|
|
255
260
|
├── src/ canonical source — edit here
|
|
256
261
|
│ ├── AGENT.md.tmpl the entrypoint, rendered to AGENT.md
|
|
257
|
-
│ ├──
|
|
262
|
+
│ ├── ontology/ how the agent thinks — Telos, Evidence, Decisions, Conduct
|
|
263
|
+
│ ├── laws/ the universal invariants
|
|
264
|
+
│ ├── doctrines/ the four practice packs (craft, rigor, ops, process)
|
|
265
|
+
│ ├── postures/ the relationship register, inlined into AGENT.md
|
|
266
|
+
│ ├── modes/ the operating register, inlined into AGENT.md
|
|
258
267
|
│ ├── agents/ capability specialists
|
|
259
268
|
│ ├── skills/ repeatable workflows
|
|
260
269
|
│ ├── memory/ memory convention + index
|
|
261
270
|
│ └── notebook/ the agent's own freeform space — convention + index
|
|
262
271
|
├── themes/ voice token maps (14 themes shipped)
|
|
263
272
|
├── web/ Vite + React UI source; the committed web/dist/ build is what ships
|
|
264
|
-
├── tests/ Node test suites + the
|
|
273
|
+
├── tests/ Node test suites + the pure-function/help recordings they replay
|
|
274
|
+
│ (tests/__snapshots__/ — the emit/cli/web corpora retired 2026-08-17)
|
|
265
275
|
├── docs/ guides (web-ui, wiki, …) + docs/web/ (the console's Docs pages);
|
|
266
276
|
│ specs/, reviews/, superpowers/ are local working docs — git-ignored
|
|
267
277
|
├── adapters/ per-host glue (opencode/, claude-code/, bob/, copilot/)
|
|
@@ -294,8 +304,6 @@ geneseed rebuild-all # re-render every registered install in its own theme + m
|
|
|
294
304
|
./geneseed upgrade # just the content refresh (remembers theme + emit mode)
|
|
295
305
|
```
|
|
296
306
|
|
|
297
|
-
**Moving from a clone to npm** — `geneseed migrate` re-emits every install you already have onto the npm shape, all-or-nothing, and reports (never rewrites) the hooks and login items it did not write. `--dry-run` prints the plan first. See [Migrate an existing install](docs/web/migrate.md).
|
|
298
|
-
|
|
299
307
|
**Local edits survive.** The self-improvement loops let the agent refine its deployed agent/skill files in place. Before setup, re-theme, or upgrade overwrites them, any drift is auto-exported to a markdown **improvements file** under `improvements/` *inside the deployed harness dir* (e.g. `~/.config/opencode/improvements/` for the global install) — beside the install it describes, untouched by rebuilds and uninstall. Hand it to an agent in this repo to back-port the changes into `src/`. On demand: `./geneseed diff --out FILE`, or the **Changes** page in the web console.
|
|
300
308
|
|
|
301
309
|
Details and precedence rules: [SETUP.md → Upgrade](SETUP.md#upgrade).
|
package/SETUP.md
CHANGED
|
@@ -100,9 +100,11 @@ hand? Pick a path below.
|
|
|
100
100
|
> **Every `geneseed-build …` below is the generator.** `npm install -g geneseed` puts it
|
|
101
101
|
> on your `PATH`; without installing anything, `npx -p geneseed geneseed-build --emit
|
|
102
102
|
> opencode-global` is the same command. From a checkout it is
|
|
103
|
-
> `node bin/geneseed.mjs` with the same flags.
|
|
104
|
-
>
|
|
105
|
-
>
|
|
103
|
+
> `node bin/geneseed.mjs` with the same flags. Every commit re-emits with it across every
|
|
104
|
+
> theme × host × footprint combination and checks the result with `doctor --all`, on Linux
|
|
105
|
+
> and Windows both. Until 2026-08-17 that output was also compared byte for byte against
|
|
106
|
+
> recordings taken from the Python implementation; those were retired, and `docs/limits.md`
|
|
107
|
+
> says why and what it cost.
|
|
106
108
|
|
|
107
109
|
---
|
|
108
110
|
|
|
@@ -163,9 +165,11 @@ your repo's `.claude/settings.json` (paths assume the bundle is at the repo root
|
|
|
163
165
|
It wires:
|
|
164
166
|
|
|
165
167
|
- **PreToolUse** (matcher `Bash`) — runs `harness git-gate`, a tool-boundary backstop
|
|
166
|
-
for
|
|
167
|
-
or `git push` (even chained or `-C`-flagged), un-suppressible by a
|
|
168
|
-
ask again". Every other Bash command is deferred to the normal
|
|
168
|
+
for Doctrine `process 5`. The hook inspects the command and forces an `ask` on every
|
|
169
|
+
`git commit` or `git push` (even chained or `-C`-flagged), un-suppressible by a
|
|
170
|
+
one-time "don't ask again". Every other Bash command is deferred to the normal
|
|
171
|
+
permission flow. It is wired only when the **process** pack is active — build with
|
|
172
|
+
`--doctrines` leaving `process` out and this hook is not installed at all.
|
|
169
173
|
- **SessionStart** (`startup`/`clear`) — prints `AGENT.md` and injects the project
|
|
170
174
|
context (`harness context`, which auto-discovers the repo's docs);
|
|
171
175
|
- **SessionStart** (`resume`) — refreshes the project context only, without re-printing
|
|
@@ -284,17 +288,79 @@ doubles as a CI drift check: `1` when it had to change files, `0` when every the
|
|
|
284
288
|
already in sync, and `2` when `_TEMPLATE.json` itself is missing or unreadable — the one
|
|
285
289
|
case where a `0` would have meant "in sync" without having checked anything.
|
|
286
290
|
|
|
291
|
+
### Doctrine packs
|
|
292
|
+
|
|
293
|
+
The constitution is three tiers, and only one of them is a choice. The **Ontology** (how the
|
|
294
|
+
agent thinks — Telos, Evidence, Decisions, Conduct) and the nine **Rules** (what it never
|
|
295
|
+
trades away) are always on and cannot be switched off. The **Doctrines** are practices rather
|
|
296
|
+
than principles, and they ship as four packs:
|
|
297
|
+
|
|
298
|
+
| Pack | What it governs |
|
|
299
|
+
| --- | --- |
|
|
300
|
+
| **craft** | how code is written — reuse first, house conventions, docs in the same change, the smallest diff |
|
|
301
|
+
| **rigor** | how work is proven — idempotence, honest tests, cover-and-verify, gates that can actually fail |
|
|
302
|
+
| **ops** | how the machine is driven — tool discovery, commands that return, complete teardowns, restart is not reload |
|
|
303
|
+
| **process** | how a session runs — planning, context economy, docs first, bounded loops, and the consent gate on every commit and push |
|
|
304
|
+
|
|
305
|
+
They are picked **at build time**, once, on the generator — there is no runtime toggle — and
|
|
306
|
+
the default is all four:
|
|
307
|
+
|
|
308
|
+
geneseed-build --doctrines craft,rigor # two packs
|
|
309
|
+
geneseed-build --doctrines none # ontology and the nine Rules only
|
|
310
|
+
geneseed-build # all four (the default)
|
|
311
|
+
|
|
312
|
+
`harness.config.json`'s `doctrines` array sets this checkout's own default, and `doctor`
|
|
313
|
+
refuses one that names a pack the checkout does not ship. Order is fixed by the harness
|
|
314
|
+
(craft → rigor → ops → process) regardless of the order you type.
|
|
315
|
+
|
|
316
|
+
The setup wizard asks too — one *all* / *choose* gate, then a yes/no per pack with its
|
|
317
|
+
one-line description — and it **pre-selects what the install already carries**, read off the
|
|
318
|
+
`Active packs:` marker line in the deployed `AGENT.md`. So re-running the wizard and holding
|
|
319
|
+
Enter cannot silently widen a set you deliberately narrowed.
|
|
320
|
+
|
|
321
|
+
**The whole catalogue always ships.** Every pack file lands under `doctrines/` beside
|
|
322
|
+
`AGENT.md` at both footprints whether or not it was built in, so a rule that cites a pack you
|
|
323
|
+
left out is still readable on disk — only the rendered `AGENT.md` is narrower. `doctor` reports
|
|
324
|
+
such citations as a `[note]`, printed and not counted, because a narrowed build is a
|
|
325
|
+
configuration you chose rather than a defect.
|
|
326
|
+
|
|
327
|
+
⚠ **Turning `process` off also removes the commit/push consent gate.** Doctrine `process 5`
|
|
328
|
+
(*Consent Before Push*) is enforced twice: as prose in `AGENT.md`, and at the tool boundary —
|
|
329
|
+
the `git-gate` PreToolUse hook on Claude Code and Bob, and the `git commit*` / `git push*`
|
|
330
|
+
permission entries on OpenCode. A build without the `process` pack wires neither, and
|
|
331
|
+
rebuilding an install that had them takes the Claude hook back out of `settings.json`. That is
|
|
332
|
+
deliberate and it is the rule the tiering rests on: **prompt and boundary must never
|
|
333
|
+
disagree.** A gate that stops every command to ask consent for a rule the install did not adopt
|
|
334
|
+
is a gate the agent cannot explain and you did not ask for. Two details worth knowing:
|
|
335
|
+
|
|
336
|
+
- **What stays in every build regardless:** `rm -rf *`, `git push --force*` and `git push -f*`.
|
|
337
|
+
Those are Rule IV's territory — an always-on invariant — not the process pack's.
|
|
338
|
+
- **On OpenCode, an existing `opencode.json` is not stripped.** That file is co-owned, nothing
|
|
339
|
+
on disk records who wrote a given permission entry, and Geneseed will not delete a line you
|
|
340
|
+
might have typed yourself. A pack-off rebuild leaves an already-written `git commit*` in
|
|
341
|
+
place and *reports* it instead. A fresh install has no git gate at all.
|
|
342
|
+
|
|
343
|
+
`process` is the only pack whose removal changes what the machine does rather than only what
|
|
344
|
+
the agent reads — which is why the wizard's blurb for it says so.
|
|
345
|
+
|
|
287
346
|
### Footprint (lean vs full)
|
|
288
347
|
|
|
289
|
-
**Footprint** sets how much of the
|
|
348
|
+
**Footprint** sets how much of the constitution `AGENT.md` carries *inline* on every turn — a
|
|
290
349
|
token-cost dial, not a change to which Rules apply. Both states keep all Rules in force:
|
|
291
350
|
|
|
292
|
-
- **
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
351
|
+
- **lean** (default) — Sections 1–2 carry the heading and rule line of each Rule and each
|
|
352
|
+
active doctrine rule, then a pointer to the full text. Lighter every turn; the complete
|
|
353
|
+
`laws/universal.md`, `ontology/` and `doctrines/` still ship beside `AGENT.md` and the agent
|
|
354
|
+
reads them on demand (and is told to before acting on secrets, deletion, git history, scope,
|
|
355
|
+
or untrusted content).
|
|
356
|
+
- **full** — Sections 1–2 inline every Rule's and every active doctrine rule's complete text
|
|
357
|
+
*and* rationale. Maximum guidance density; the largest always-loaded block in the harness.
|
|
358
|
+
|
|
359
|
+
**The Ontology is never truncated.** Lean keeps only the first sentence of each `### ` block,
|
|
360
|
+
and the four ontology sections are flowing prose rather than numbered rules — cutting them
|
|
361
|
+
would leave four orphan sentences, so they ship whole at both footprints. That is why adding
|
|
362
|
+
the ontology tier grew the lean carrier proportionally more than the full one; it was taken as
|
|
363
|
+
a deliberate cost.
|
|
298
364
|
|
|
299
365
|
**Why:** context is scarce and metered. Lean reclaims that budget — and the tokens you
|
|
300
366
|
pay for it — for the task, moving the *rationale* one read away while keeping the rules
|
|
@@ -308,10 +374,11 @@ you run a smaller model.
|
|
|
308
374
|
can *do*: lean and full emit identical files (same agents, skills, plugins, commands, memory,
|
|
309
375
|
notebook, hooks) and every Rule is present and binding. The only structural difference is
|
|
310
376
|
that a lean install on a global / Claude / Bob / Copilot target also ships the standalone
|
|
311
|
-
`laws/universal.md` (project bundles already carry
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
377
|
+
`laws/universal.md` and `ontology/` (project bundles already carry them, and `doctrines/`
|
|
378
|
+
ships at both footprints on every target); the only behavioural difference is that the
|
|
379
|
+
reasoning loads on demand instead of every turn. Lean is the default; full, with the rationale
|
|
380
|
+
always in front of the model, applies a rule's nuance more reliably on subtle edge cases or
|
|
381
|
+
with a weaker model, and is one flag away.
|
|
315
382
|
|
|
316
383
|
Set it with `--footprint lean|full` (alongside any `--emit`), the **Footprint** toggle in
|
|
317
384
|
the web Settings, the per-harness dropdown in the Harnesses tab, or the setup wizard. It is
|
|
@@ -416,7 +483,7 @@ opt-in, now simply matches the default. To drop injection entirely, set
|
|
|
416
483
|
If you keep a personal knowledge base on this machine — an Obsidian vault, or any
|
|
417
484
|
folder of interlinked markdown — declare it once in **`wiki.jsonc`** and the agent
|
|
418
485
|
becomes a citizen of it: entry notes load each session (eager) or on demand (lazy),
|
|
419
|
-
and it reads *and writes* notes under your vault's own conventions (AGENT.md §
|
|
486
|
+
and it reads *and writes* notes under your vault's own conventions (AGENT.md §8,
|
|
420
487
|
the `wiki` skill). Unlike `context.json` this is **per machine, not per repo**.
|
|
421
488
|
|
|
422
489
|
The build seeds `wiki.jsonc` beside `AGENT.md` (for a global install:
|
|
@@ -460,7 +527,7 @@ list keeps the feature off. The file may hold private paths — it is host-speci
|
|
|
460
527
|
covered by the bundle `.gitignore`, and never committed.
|
|
461
528
|
|
|
462
529
|
On tools without the plugins (plain `AGENT.md`, Claude Code), the same contract
|
|
463
|
-
holds through prose: AGENT.md §
|
|
530
|
+
holds through prose: AGENT.md §8 instructs the agent to read `wiki.jsonc` at session
|
|
464
531
|
start and honour it.
|
|
465
532
|
|
|
466
533
|
### Memory
|
|
@@ -602,7 +669,9 @@ command serves gitlab.com and any private instance.
|
|
|
602
669
|
scopes `api` and `read_repository`. Treat it like a password.
|
|
603
670
|
|
|
604
671
|
**2. Register one entry per instance** — same command, different `GITLAB_API_URL`
|
|
605
|
-
and token. Two instances (e.g. gitlab.com plus a self-hosted server) → two entries
|
|
672
|
+
and token. Two instances (e.g. gitlab.com plus a self-hosted server) → two entries.
|
|
673
|
+
The MCP screen ships a one-click row for the **first** entry only; a second instance is a
|
|
674
|
+
hand-added copy of that block, which is all it ever was:
|
|
606
675
|
|
|
607
676
|
<!--harness:opencode-->
|
|
608
677
|
On OpenCode, under the `mcp` key of `opencode.json`:
|
|
@@ -642,6 +711,11 @@ The entry key is just a label — name them `gitlab` / `gitlab-2`, or after each
|
|
|
642
711
|
(`gitlab`, `gitlab-acme`). What separates the two is the `GITLAB_API_URL` + token pair;
|
|
643
712
|
keep the `/api/v4` suffix on the URL.
|
|
644
713
|
|
|
714
|
+
**Don't know where this file lives?** Run `geneseed web`, open **Harnesses**, and expand an
|
|
715
|
+
active install — each MCP target prints the full path of the config file it writes, right
|
|
716
|
+
above its server rows. That is the file the token and the URL go into. From the terminal,
|
|
717
|
+
`geneseed mcp` prints the same paths without starting anything.
|
|
718
|
+
|
|
645
719
|
#### Filesystem
|
|
646
720
|
|
|
647
721
|
Give the agent scoped file access via
|
|
@@ -954,7 +1028,8 @@ capability agent. Notes:
|
|
|
954
1028
|
|
|
955
1029
|
- **Permissions still gate.** The consent-before-commit/push / `rm -rf` `ask` rules
|
|
956
1030
|
will *block* in a non-interactive run (nothing to answer the prompt). Both
|
|
957
|
-
`git commit` and `git push` are gated
|
|
1031
|
+
`git commit` and `git push` are gated on every branch whenever the **process** pack
|
|
1032
|
+
is active (Doctrine `process 5`; a build without it wires neither), so a CI job that
|
|
958
1033
|
commits must opt those commands back to `"allow"` in its own `permission.bash` map,
|
|
959
1034
|
or scope the run to read-only work — don't blanket-disable the guards.
|
|
960
1035
|
- **`--pure`** runs OpenCode ignoring local/global config — handy to reproduce a bug
|
|
@@ -981,9 +1056,8 @@ anything, naming the `npm install -g` line above instead.
|
|
|
981
1056
|
**Installed from a clone:**
|
|
982
1057
|
|
|
983
1058
|
```
|
|
984
|
-
./geneseed upgrade # track
|
|
985
|
-
./geneseed upgrade
|
|
986
|
-
./geneseed upgrade main imperial # force a theme
|
|
1059
|
+
./geneseed upgrade # track the checkout's current branch; keep theme + emit mode
|
|
1060
|
+
./geneseed upgrade imperial # force a theme
|
|
987
1061
|
```
|
|
988
1062
|
|
|
989
1063
|
It git-pulls the install's own origin (fast-forward only), validates it (a blocking
|
package/SHIPPED.md
CHANGED
|
@@ -20,7 +20,7 @@ historical pointers, 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: **
|
|
23
|
+
> string. Current label: **3.0.0**.
|
|
24
24
|
|
|
25
25
|
> **Spec status audit (2026-06-15).** Every dated spec authored before today was
|
|
26
26
|
> verified against the source tree and confirmed implemented (code + tests + docs);
|
|
@@ -35,7 +35,8 @@ Every row below is present in the tree today; "Spec" links the design record.
|
|
|
35
35
|
| Capability | What it is | Spec |
|
|
36
36
|
| --- | --- | --- |
|
|
37
37
|
| **Themed generator** | One neutral `src/` → 14 themed bundles via `geneseed-build` (zero dependencies); structure stays theme-independent | [DESIGN.md](DESIGN.md) |
|
|
38
|
-
| **Laws / Agents / Skills / Memory / Notebook** |
|
|
38
|
+
| **Laws / Agents / Skills / Memory / Notebook** | 9 laws, 17 agents, 47 skills, the memory convention, and the agent's sovereign notebook | [notebook](docs/specs/2026-06-11-notebook-sovereign-space.md) · [agent-own-space](docs/specs/2026-06-10-notebook-agent-own-space.md) |
|
|
39
|
+
| **Three-tier constitution** | The governance surface splits into an always-on **Ontology** (Telos, Evidence, Decisions, Conduct — the Pact absorbed into Telos), the nine always-on **Invariants**, and four toggleable **Doctrine** packs (craft, rigor, ops, process) addressed `<pack> <n>`. Packs are chosen at build time with `--doctrines` or the setup wizard; the whole catalogue ships on disk either way, so a citation into an inactive pack still resolves. Precedence, in order: Ontology + Invariants, then the user's `user-rules.md`, then the active Doctrines, then `PROFILE.md`. `doctor`'s `constitutionProblems` gates pack numbering, the per-rule Principle column, every `{{DOCTRINE}}` citation in `src/`, and the rule that an always-on tier may never cite a toggleable one | [three-tier-constitution](docs/specs/2026-08-19-three-tier-constitution-design.md) |
|
|
39
40
|
| **`doctor`** | One check: unresolved tokens, dead/non-hermetic links, theme-key parity, authoring gates, rendered-bundle drift | [theme-aware doctor/diff](docs/specs/2026-06-07-theme-aware-doctor-diff.md) |
|
|
40
41
|
| **`diff` + improvements export** | Deployed-vs-source drift report; export an `improvements.md` back-port | [improvements-export](docs/specs/2026-06-12-improvements-export.md) |
|
|
41
42
|
| **`status` / `version`** | Headless dashboard + fingerprint verdict (no TUI needed) | [status-command](docs/specs/2026-06-07-status-command.md) · [version-and-uninstall](docs/specs/2026-06-07-version-and-uninstall.md) |
|
|
@@ -46,10 +47,10 @@ Every row below is present in the tree today; "Spec" links the design record.
|
|
|
46
47
|
| **Per-agent memory** | Each capability agent keeps durable lessons in `memory/agents/<name>.md`: read at dispatch, written back mechanically by `learn` on session/subagent end (OpenCode plugin + claude/bob `SubagentStop`); `learn --consolidate` rebuilds the index | [orchestration-memory-upgrade](docs/specs/2026-07-04-orchestration-memory-upgrade.md) |
|
|
47
48
|
| **Wiki integration** | Machine-wide knowledge base (`wiki.jsonc`): eager/lazy loading, conventions, protected folders enforced at the tool boundary | [wiki-knowledge-base](docs/specs/2026-06-11-wiki-knowledge-base.md) |
|
|
48
49
|
| **Collaboration layer** | Negotiated postures (peer/mentor/expert/assistant/artisan, chosen at setup, inlined in AGENT.md), the bidirectional Pact, epistemically-typed memory (`force:` + Bridge rule), and a seed-once `PROFILE.md` identity with a web editor tab and a `profile` skill that interviews the user to draft it | [collaboration-layer](docs/specs/2026-07-12-collaboration-layer.md) |
|
|
49
|
-
| **Rule front door** | Both durable stores enter through the `rule` skill's fork (*standing rule, or fact to remember?* — always asked, never inferred): the memory branch elicits the binding `force` and shows the file before writing, the rule branch pressure-tests by reformulation and a mandatory counter-example.
|
|
50
|
+
| **Rule front door** | Both durable stores enter through the `rule` skill's fork (*standing rule, or fact to remember?* — always asked, never inferred): the memory branch elicits the binding `force` and shows the file before writing, the rule branch pressure-tests by reformulation and a mandatory counter-example. Doctrine process 1 carries the norm on every host; a `rule-gate` PreToolUse hook (Claude, Bob) and a `geneseed-guard` speed bump (OpenCode) hold it at the tool boundary | [rule-front-door](docs/specs/2026-07-30-rule-front-door.md) |
|
|
50
51
|
| **Entity registry** | `registry.json` records a lifecycle status, version, owner and add-date for every agent and skill in the tree (maintainer-side — never rendered into a bundle, so it costs no session context). `doctor` gates it against `src/` in both directions, sweeps everything that ships for credentials, and holds each vendored skill folder to an immutable upstream commit. The status surfaces as a badge in the web catalog, shown only where it deviates from `approved` | [entity-registry](docs/specs/2026-07-31-entity-registry.md) |
|
|
51
|
-
| **Node runtime + npm package** | The whole harness runs from Node: every command `js/cli-table.json` declares, all four hook verbs, every web-console endpoint (the OS-native folder picker excepted, and declined on purpose) and both generators.
|
|
52
|
-
| **Runtime awareness** | MCP discovery, web research, tool-call batching, review discipline
|
|
52
|
+
| **Node runtime + npm package** | The whole harness runs from Node: every command `js/cli-table.json` declares, all four hook verbs, every web-console endpoint (the OS-native folder picker excepted, and declined on purpose) and both generators. Every commit runs the unit suite, `doctor --all` across every theme × host × footprint, and the generator's two self-comparisons, on Linux and Windows both; the frozen emit/cli/web recordings that also gated it retired on 2026-08-17 (`docs/limits.md`). It ships as the zero-dependency `geneseed` package (`geneseed`, `geneseed-hook`, `geneseed-build`), so `npx geneseed setup` needs no clone and nothing else installed; `geneseed migrate` moves an existing checkout install across. Node is the only runtime it asks for: the `token-report` skill's own script is `token_report.mjs`, gated over seeded transcripts for all four hosts, and `daydream` and `herdr` call `node -e` | [npx-distribution](docs/specs/2026-08-06-npx-distribution.md) |
|
|
53
|
+
| **Runtime awareness** | MCP discovery, web research, tool-call batching, review discipline — carried by the doctrine packs (`ops 1` tool discovery, `process 4` read the docs first, `rigor 2`/`rigor 3` honest tests and cover-and-verify), not by the invariants | [runtime-awareness](docs/specs/2026-06-07-runtime-awareness-and-review-discipline.md) |
|
|
53
54
|
| **Run from anywhere / uninstall** | `link`/`unlink` onto PATH; global uninstall that keeps the memory store | [version-and-uninstall](docs/specs/2026-06-07-version-and-uninstall.md) |
|
|
54
55
|
|
|
55
56
|
## Workplans (not features)
|
package/adapters/bob/README.md
CHANGED
|
@@ -65,9 +65,9 @@ project-bypasses-global need. An older Bob install that wrote a stale exclude is
|
|
|
65
65
|
## Hooks — best-effort
|
|
66
66
|
|
|
67
67
|
The `settings.json` hooks use the **Claude dialect** (a `PreToolUse:Bash`
|
|
68
|
-
git-gate for
|
|
69
|
-
`Stop`/`SubagentStop` learn/memory
|
|
70
|
-
subcommands the OpenCode plugins drive). Bob's hook execution is **unverified**:
|
|
68
|
+
git-gate for Doctrine process 5 consent — present only when the `process` pack is
|
|
69
|
+
built in — `SessionStart` context injection, and `Stop`/`SubagentStop` learn/memory
|
|
70
|
+
capture, the same `geneseed-hook` subcommands the OpenCode plugins drive). Bob's hook execution is **unverified**:
|
|
71
71
|
if Bob honours Claude-shaped hooks they fire; if not, they are inert and the
|
|
72
72
|
harness still works fully through the `AGENTS.md`/`rules` preamble prose. This is
|
|
73
73
|
the same behaviour-contract parity every non-OpenCode host gets — the mechanism
|
|
@@ -14,8 +14,10 @@ bin/geneseed-hook.mjs …` — so at user scope they would fire and fail in ever
|
|
|
14
14
|
repo that doesn't vendor the harness. A generated global install wires
|
|
15
15
|
absolute-path hooks instead — `geneseed setup` does that for you.) It:
|
|
16
16
|
|
|
17
|
-
- on **PreToolUse** (matcher `Bash`),
|
|
18
|
-
|
|
17
|
+
- on **PreToolUse** (matcher `Bash`), **on an install that built the `process` pack in**,
|
|
18
|
+
runs `harness git-gate` — the tool-boundary half of Doctrine process 5 (*consent before
|
|
19
|
+
every commit and push*). Drop that pack and this hook is not written at all; the
|
|
20
|
+
invariant-territory refusals (`rm -rf`, force-push) stay in every build. The hook inspects
|
|
19
21
|
command and, when it runs a `git commit` or `git push` (bare, flagged, `-C <path>`,
|
|
20
22
|
or chained like `git add . && git commit … && git push`), returns
|
|
21
23
|
`permissionDecision: "ask"` so Claude Code **prompts on every such call**. Crucially
|
|
@@ -31,7 +33,7 @@ absolute-path hooks instead — `geneseed setup` does that for you.) It:
|
|
|
31
33
|
doesn't recognise as a commit/push, so over-matching the tool surface is harmless.
|
|
32
34
|
- on **SessionStart** (`startup`/`clear` only — a fresh context), prints `AGENT.md`
|
|
33
35
|
so the harness is in context from the first turn, then runs `harness context` to
|
|
34
|
-
**inject the project context** directly into the session — so
|
|
36
|
+
**inject the project context** directly into the session — so the project-context load is
|
|
35
37
|
by the hook, not left to the agent to remember (lazy entries are only listed). On
|
|
36
38
|
**`resume`** it runs `harness context` *without* re-`cat`ting `AGENT.md`: the resumed
|
|
37
39
|
conversation already carries the harness, so re-injecting the static file each resume
|
|
@@ -59,7 +61,7 @@ absolute-path hooks instead — `geneseed setup` does that for you.) It:
|
|
|
59
61
|
Adjust the paths if your harness bundle is not at the repository root. On Windows
|
|
60
62
|
the commands are identical (`node bin/geneseed-hook.mjs …`).
|
|
61
63
|
|
|
62
|
-
Why inject rather than instruct?
|
|
64
|
+
Why inject rather than instruct? The constitution tells the agent to read the project
|
|
63
65
|
context at startup, but startup rituals are exactly what agents skip. The
|
|
64
66
|
`harness context` hook removes the choice: the eager files' contents land in
|
|
65
67
|
context before the first turn regardless of agent discipline. On tools without
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: geneseed
|
|
3
|
-
description: "Interact with a deployed Geneseed harness from any repo — locate the install, read its
|
|
3
|
+
description: "Interact with a deployed Geneseed harness from any repo — locate the install, read its ontology/rules/doctrines/agents/skills/memory/notebook by name, run status/doctor/diff, distill memory with learn, and manage the local web UI. Use when the user mentions Geneseed, AGENT.md, the harness, an agent operating system, or asks you to inspect, refresh, or read from the deployed bundle."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# geneseed — agent skill
|
|
7
7
|
|
|
8
|
-
Geneseed is a portable AI-agent harness deployed once and used everywhere. This skill lets you talk to whichever deployment is in scope from any repo: read the canonical files (
|
|
8
|
+
Geneseed is a portable AI-agent harness deployed once and used everywhere. This skill lets you talk to whichever deployment is in scope from any repo: read the canonical files (the three constitution tiers, agents, skills, memory, notebook), probe state (status, version, doctor, diff), distill durable memory, and drive the local web UI. The harness is theme-independent in structure — directory and section names are always plain English — so the paths below are stable across themes.
|
|
9
9
|
|
|
10
10
|
## Find the deployed harness before doing anything
|
|
11
11
|
|
|
@@ -19,7 +19,9 @@ Pick the first that resolves; remember the path for the rest of the session.
|
|
|
19
19
|
|
|
20
20
|
If none resolve, the user does not have Geneseed deployed here — say so and stop. Do not run `setup`, `build`, or `upgrade` on your own to "fix" this; that is a user decision.
|
|
21
21
|
|
|
22
|
-
A live harness root contains: `AGENT.md`, `agents/<name>.md`, `skills/<name>/SKILL.md`, `memory/MEMORY.md`, `notebook/NOTEBOOK.md`, `themes/`, and (on OpenCode) `plugins/`, `workflows/`, `opencode.jsonc`, `wiki.jsonc`.
|
|
22
|
+
A live harness root contains: `AGENT.md`, `ontology/universal.md`, `laws/universal.md`, `doctrines/<pack>.md`, `agents/<name>.md`, `skills/<name>/SKILL.md`, `memory/MEMORY.md`, `notebook/NOTEBOOK.md`, `themes/`, and (on OpenCode) `plugins/`, `workflows/`, `opencode.jsonc`, `wiki.jsonc`.
|
|
23
|
+
|
|
24
|
+
The constitution is **three tiers**: an always-on **Ontology** (four prose sections — Telos, Evidence, Decisions, Conduct), nine always-on **Rules** numbered I–IX, and the **Doctrines** — practice packs (`craft`, `rigor`, `ops`, `process`) chosen per install at build time. `AGENT.md` carries all three inline (whole at the `full` footprint, heading-plus-first-line at `lean`), *and* the complete text ships as files beside it. All four pack files ship even when a pack was not built in, so a citation into an inactive pack still resolves on disk — which is why a question about a rule is answered from the tier file, never only from `AGENT.md`.
|
|
23
25
|
|
|
24
26
|
## Read-only verbs (safe, no confirmation needed)
|
|
25
27
|
|
|
@@ -32,11 +34,13 @@ A live harness root contains: `AGENT.md`, `agents/<name>.md`, `skills/<name>/SKI
|
|
|
32
34
|
- **Read a specific piece** — read the file directly:
|
|
33
35
|
- Agent by name: `<harness>/agents/<name>.md`
|
|
34
36
|
- Skill by name: `<harness>/skills/<name>/SKILL.md`
|
|
35
|
-
-
|
|
37
|
+
- Ontology section by name: `<harness>/ontology/universal.md` — `#### Telos` / `Evidence` / `Decisions` / `Conduct` (theme-independent names)
|
|
38
|
+
- Rule by numeral I–IX: `<harness>/laws/universal.md` — heading `### <Rule-noun> <ROMAN> — <title>`
|
|
39
|
+
- Doctrine rule by pack and number: `<harness>/doctrines/<pack>.md` — heading `### <Doctrine-noun> <pack> <n> — <title>`
|
|
36
40
|
- Memory fact: `<harness>/memory/<file>.md`; index at `MEMORY.md`
|
|
37
41
|
- Notebook entry: `<harness>/notebook/<file>.md`; index at `NOTEBOOK.md`
|
|
38
42
|
|
|
39
|
-
When the user asks "what does the X skill say"
|
|
43
|
+
When the user asks "what does the X skill say", "what's Rule VI" or "what does Doctrine process 5 say", read the file directly — do not summarise from memory.
|
|
40
44
|
|
|
41
45
|
## Side-effecting verbs (confirm with the user first)
|
|
42
46
|
|
|
@@ -59,7 +63,7 @@ If the user asks for any of these, run them as requested. Do not run them as a s
|
|
|
59
63
|
## Common patterns
|
|
60
64
|
|
|
61
65
|
- **"What harness do I have here?"** — `geneseed status` (if launcher on PATH); else resolve via the fallback list and report theme, install mode, path, and version.
|
|
62
|
-
- **"What does the `<X>` skill / agent /
|
|
66
|
+
- **"What does the `<X>` skill / agent / rule say?"** — read the file directly. A Rule is `### <Rule-noun> <ROMAN> —` in `laws/universal.md`; a doctrine rule is `### <Doctrine-noun> <pack> <n> —` in `doctrines/<pack>.md`; an ontology section is `#### <Name>` in `ontology/universal.md`. The tier noun is themed, the address never is.
|
|
63
67
|
- **"Show me what's drifted in my install."** — `geneseed diff`. Offer to write the output to a file (`--out`) if it's long.
|
|
64
68
|
- **"Distill what we did today into memory."** — confirm scope, then `geneseed learn`. Afterwards, `git status` inside the harness dir to show what landed.
|
|
65
69
|
- **"Open the dashboard / web UI."** — `geneseed web start`. Tell the user the URL it printed and that it binds to localhost only.
|
|
@@ -43,12 +43,12 @@ page is mostly about *what it does not automate* and why the harness still holds
|
|
|
43
43
|
Copilot has **no `settings.json` and no lifecycle-hook mechanism**, so the whole
|
|
44
44
|
settings/hooks/excludes stage is skipped. Concretely, Copilot does **not** get:
|
|
45
45
|
|
|
46
|
-
- **automated context injection** —
|
|
46
|
+
- **automated context injection** — the project-context load falls back
|
|
47
47
|
to the preamble instructing the agent to read the docs itself;
|
|
48
48
|
- **automated memory / learn write-back** — no `Stop`/`SubagentStop` hook; the
|
|
49
49
|
memory convention rides the preamble's instructions (the agent writes its own
|
|
50
50
|
memories) rather than a session-end distiller;
|
|
51
|
-
- **the git-gate consent backstop** —
|
|
51
|
+
- **the git-gate consent backstop** — Doctrine process 5 (*consent before every commit and
|
|
52
52
|
push*) is enforced by the **preamble prose only**, not at the tool boundary.
|
|
53
53
|
There is no hook to force the prompt;
|
|
54
54
|
- **sovereign-repo excludes** — Copilot documents no exclude/shadow mechanism
|
|
@@ -58,8 +58,9 @@ settings/hooks/excludes stage is skipped. Concretely, Copilot does **not** get:
|
|
|
58
58
|
installs already exist.
|
|
59
59
|
|
|
60
60
|
None of this is a build gap — it is Copilot's ceiling. The harness still applies
|
|
61
|
-
in full: every Rule,
|
|
62
|
-
|
|
61
|
+
in full: the Ontology, every Rule, every doctrine rule the install built in, and
|
|
62
|
+
every agent and skill are present; only the *automation* of a few of them degrades
|
|
63
|
+
to instruction-only. This is behaviour-contract parity, the same
|
|
63
64
|
principle every non-OpenCode host follows.
|
|
64
65
|
|
|
65
66
|
## MCP
|
|
@@ -190,7 +190,7 @@ enforcement paths read the same. Adds a machine marker (first line) for §4.
|
|
|
190
190
|
|
|
191
191
|
```
|
|
192
192
|
<!-- geneseed-context:v2 -->
|
|
193
|
-
=== PROJECT CONTEXT — binding for this repo
|
|
193
|
+
=== PROJECT CONTEXT — binding for this repo ===
|
|
194
194
|
|
|
195
195
|
----- <path> — <description> -----
|
|
196
196
|
<full file contents, trailing newlines stripped>
|
|
@@ -204,7 +204,7 @@ enforcement paths read the same. Adds a machine marker (first line) for §4.
|
|
|
204
204
|
- [demoted: README.md exceeded 16 KB — read on demand]
|
|
205
205
|
```
|
|
206
206
|
|
|
207
|
-
- Header keeps the exact `=== PROJECT CONTEXT
|
|
207
|
+
- Header keeps the exact `=== PROJECT CONTEXT — binding for this repo ===` wording.
|
|
208
208
|
- A `MISSING` eager file emits `[context] MISSING eager file: <err>` inline (as today).
|
|
209
209
|
- The `<!-- geneseed-context:v2 -->` marker is the idempotency sentinel.
|
|
210
210
|
|
|
@@ -269,12 +269,17 @@ exactly one copy and the setup guide (§10) removes project copies. Document thi
|
|
|
269
269
|
|
|
270
270
|
---
|
|
271
271
|
|
|
272
|
-
## 8. Fallback
|
|
272
|
+
## 8. Fallback rule (for tools without the plugin)
|
|
273
273
|
|
|
274
|
-
|
|
275
|
-
|
|
274
|
+
⚠ HISTORICAL. This was written when the corpus was a flat, open-ended list of laws.
|
|
275
|
+
It is not one now: the invariants are a closed set of nine, and project-context
|
|
276
|
+
discovery is one of the two old laws absorbed into AGENT.md's own **§9 Context**
|
|
277
|
+
section, which every build carries as prose. Nothing an adapter spec writes is
|
|
278
|
+
added to the invariants. The text below survives as the *instruction* tier behind
|
|
279
|
+
the *injection* tier, and `{{DOCTRINE}} process 4` (Read the Docs First) is its
|
|
280
|
+
nearest live citation:
|
|
276
281
|
|
|
277
|
-
> **
|
|
282
|
+
> **Rule (Project Context Discovery).** When project context has not already been
|
|
278
283
|
> injected, before substantive work read the repo's agent-directed rules and entry
|
|
279
284
|
> docs — `AGENTS.md`/`AGENT.md`/`CLAUDE.md`, root `README.md`, and any `.harness/`
|
|
280
285
|
> manifest — and treat `docs/`, `adr/`, and architecture notes as lazy: consult
|
|
@@ -30,7 +30,7 @@ rules. It accepts:
|
|
|
30
30
|
- globs (`"laws/*.md"`),
|
|
31
31
|
- URLs.
|
|
32
32
|
|
|
33
|
-
Geneseed points it at the bundle's **`AGENT.md`** (which inlines the laws). That is
|
|
33
|
+
Geneseed points it at the bundle's **`AGENT.md`** (which inlines all three constitution tiers — the Ontology, the nine Rules and the active doctrine packs; at the default `lean` footprint the rules are heading-plus-first-line, with the complete text in `ontology/`, `laws/` and `doctrines/` beside it). That is
|
|
34
34
|
all you need there — the rest of the harness is loaded by the plugins below.
|
|
35
35
|
|
|
36
36
|
## 3. Plugins — event-driven JS/TS
|