geneseed 3.3.0 → 3.5.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 +323 -0
- package/DESIGN.md +11 -14
- package/QUICKSTART.md +3 -1
- package/README.md +53 -44
- package/SETUP.md +25 -27
- package/SHIPPED.md +26 -32
- package/adapters/bob/README.md +12 -9
- package/adapters/copilot/README.md +28 -26
- package/adapters/opencode/GLOBAL-HARNESS-SPEC.md +1 -1
- package/adapters/opencode/README.md +8 -4
- package/adapters/opencode/plugins/geneseed-context.js +5 -3
- package/adapters/opencode/plugins/geneseed-workflow.js +30 -3
- package/adapters/opencode/workflows/_runtime.js +97 -7
- package/bin/build-driver.mjs +5 -1248
- package/bin/geneseed-cli.mjs +11 -6
- package/bin/geneseed-hook.mjs +4 -2
- package/docs/candidate-hosts.md +1 -1
- package/docs/design-history.md +37 -37
- package/docs/extending.md +49 -27
- package/docs/token-footprint.md +52 -26
- package/docs/web/agents.md +1 -1
- package/docs/web/claude-hooks.md +3 -2
- package/docs/web/collaboration.md +2 -2
- package/docs/web/first-session.md +2 -2
- package/docs/web/footprint.md +2 -2
- package/docs/web/harnesses.md +1 -1
- package/docs/web/model.md +1 -1
- package/docs/web/plugin-workflow.md +1 -0
- package/docs/web/rules.md +3 -3
- package/docs/web/setup-choices.md +2 -2
- package/docs/web/skills.md +1 -1
- package/docs/web/themes-author.md +1 -1
- package/docs/web-ui.md +18 -10
- package/harness.config.json +1 -1
- package/js/README.md +6 -5
- package/js/build/driver.mjs +1191 -0
- package/js/build/emit-claude.mjs +17 -10
- package/js/build/emit-common.mjs +4 -4
- package/js/build/generate.mjs +1 -1
- package/js/build/render.mjs +48 -44
- package/js/build/stubs.mjs +1 -1
- package/js/build/themes.mjs +4 -4
- package/js/build/version.mjs +12 -0
- package/js/cli-table.json +21 -6
- package/js/hosts/hooks.mjs +89 -74
- package/js/hosts/hosts.mjs +19 -2
- package/js/hosts/mcp.mjs +14 -20
- package/js/hosts/native.mjs +85 -25
- package/js/hosts/opencode.mjs +14 -0
- package/js/hosts/settings.mjs +52 -104
- package/js/inspect/checks-authoring.mjs +117 -3
- package/js/inspect/diff.mjs +1 -1
- package/js/inspect/doctor.mjs +1 -1
- package/js/inspect/excludes.mjs +1 -1
- package/js/inspect/inventory.mjs +12 -7
- package/js/inspect/scan.mjs +3 -14
- package/js/inspect/status.mjs +2 -2
- package/js/inspect/validate.mjs +1 -1
- package/js/lib/fs.mjs +23 -8
- package/js/lib/json.mjs +7 -1
- package/js/lib/proc.mjs +6 -4
- package/js/maintain/migrate.mjs +1 -1
- package/js/maintain/setup.mjs +1 -1
- package/js/maintain/uninstall.mjs +17 -15
- package/js/ui/cli.mjs +19 -0
- package/js/ui/menu.mjs +1 -1
- package/js/web/actions.mjs +4 -4
- package/js/web/activity.mjs +4 -4
- package/js/web/api.mjs +14 -11
- package/js/web/daemon.mjs +1 -1
- package/js/web/docs.mjs +12 -12
- package/js/web/handler.mjs +12 -5
- package/js/web/jobs.mjs +1 -1
- package/package.json +1 -1
- package/registry.json +86 -79
- package/src/AGENT.md.tmpl +83 -48
- package/src/agents/architect.md +4 -1
- package/src/agents/developer.md +2 -2
- package/src/agents/explorer.md +2 -0
- package/src/agents/operator.md +13 -0
- package/src/agents/pragmatist.md +12 -0
- package/src/agents/researcher.md +72 -0
- package/src/agents/reviewer.md +5 -2
- package/src/agents/security.md +7 -1
- package/src/agents/skeptic.md +2 -1
- package/src/agents/tester.md +5 -1
- package/src/agents/user-advocate.md +13 -0
- package/src/doctrines/README.md +26 -3
- package/src/doctrines/craft.md +78 -5
- package/src/doctrines/ops.md +62 -0
- package/src/doctrines/process.md +91 -4
- package/src/doctrines/rigor.md +41 -1
- package/src/laws/universal.md +27 -21
- package/src/memory/README.md +4 -2
- package/src/modes/foreman.md +5 -5
- package/src/notebook/README.md +2 -1
- package/src/ontology/universal.md +71 -67
- package/src/postures/peer.md +3 -0
- package/src/skills/_self-improvement.md +19 -0
- package/src/skills/_template.md +1 -12
- package/src/skills/brainstorm.md +37 -19
- package/src/skills/bruno-collection-generator.md +2 -13
- package/src/skills/bruno-test-writer.md +3 -14
- package/src/skills/ci-fix.md +49 -0
- package/src/skills/codebase-design.md +1 -12
- package/src/skills/commit.md +1 -12
- package/src/skills/consolidate-memory.md +50 -0
- package/src/skills/council.md +1 -12
- package/src/skills/daydream/LICENSE +21 -0
- package/src/skills/daydream/VENDOR.md +3 -1
- package/src/skills/debug.md +1 -12
- package/src/skills/deps-audit.md +46 -0
- package/src/skills/develop.md +38 -20
- package/src/skills/document-project.md +1 -12
- package/src/skills/domain-modeling.md +1 -12
- package/src/skills/forge-mcp.md +1 -12
- package/src/skills/fresh-eyes.md +1 -12
- package/src/skills/frontend-design.md +1 -12
- package/src/skills/geneseed-code-review.md +7 -14
- package/src/skills/geneseed.md +1 -12
- package/src/skills/git-archaeology.md +1 -12
- package/src/skills/git-rescue.md +1 -12
- package/src/skills/handoff.md +1 -12
- package/src/skills/herdr.md +1 -12
- package/src/skills/ingest.md +1 -12
- package/src/skills/migrate.md +1 -12
- package/src/skills/opencode-theme.md +1 -12
- package/src/skills/parallel-agents.md +4 -15
- package/src/skills/pipeline.md +6 -17
- package/src/skills/plan.md +1 -12
- package/src/skills/ponytail.md +1 -12
- package/src/skills/profile.md +1 -12
- package/src/skills/prose.md +1 -12
- package/src/skills/prototype.md +1 -12
- package/src/skills/quiz.md +43 -0
- package/src/skills/react-view-transitions/VENDOR.md +7 -1
- package/src/skills/refactor.md +1 -12
- package/src/skills/release.md +1 -12
- package/src/skills/repo-map.md +1 -12
- package/src/skills/research.md +5 -13
- package/src/skills/review-response.md +1 -12
- package/src/skills/roast-me.md +1 -12
- package/src/skills/rule.md +1 -12
- package/src/skills/security-audit.md +51 -0
- package/src/skills/ship.md +1 -12
- package/src/skills/skill-forge.md +59 -0
- package/src/skills/teach.md +50 -0
- package/src/skills/tickets.md +1 -12
- package/src/skills/wayfinder.md +1 -12
- package/src/skills/wiki.md +1 -12
- package/src/skills/workflow.md +82 -26
- package/src/skills/worktree.md +52 -0
- package/themes/_TEMPLATE.json +15 -12
- package/themes/biker.json +14 -11
- package/themes/commentator.json +14 -11
- package/themes/cyberpunk.json +14 -11
- package/themes/gamer.json +14 -11
- package/themes/imperial.json +14 -11
- package/themes/joker.json +14 -11
- package/themes/marvin.json +14 -11
- package/themes/mean.json +14 -11
- package/themes/military.json +14 -11
- package/themes/neutral.json +15 -12
- package/themes/opencode/README.md +2 -2
- package/themes/pirate.json +14 -11
- package/themes/sports.json +14 -11
- package/themes/verstappen.json +14 -11
- package/themes/wizard.json +14 -11
- package/web/dist/assets/Activity-Flgf4kHy.js +1 -0
- package/web/dist/assets/ActivityDetail-DIpr85nh.js +1 -0
- package/web/dist/assets/CatalogRow-CjyLjaLb.js +1 -0
- package/web/dist/assets/Diff-Deisdha8.js +2 -0
- package/web/dist/assets/Docs-DGUdY4l4.js +2 -0
- package/web/dist/assets/Doctor-F74lJ69P.js +1 -0
- package/web/dist/assets/FilterInput-BakJLvaV.js +1 -0
- package/web/dist/assets/GreenhouseView-D072lBiD.js +2 -0
- package/web/dist/assets/Harness-DNRP2Va7.js +1 -0
- package/web/dist/assets/JournalView-DWFqZ0Iw.js +1 -0
- package/web/dist/assets/Laws-BN6g3HU7.js +3 -0
- package/web/dist/assets/Library-CDOv4emM.js +1 -0
- package/web/dist/assets/Markdown-BQAvN8xx.js +38 -0
- package/web/dist/assets/OperatorHudView-CwNIUVX8.js +2 -0
- package/web/dist/assets/Profile-CpP9BTne.js +1 -0
- package/web/dist/assets/Rules-DFXsUCB7.js +1 -0
- package/web/dist/assets/Settings-BqZVUtJ5.js +1 -0
- package/web/dist/assets/Skills-Cu6kBgfF.js +1 -0
- package/web/dist/assets/StatusBadge-Cg6j-NJL.js +1 -0
- package/web/dist/assets/activity-iWaWVtsR.js +1 -0
- package/web/dist/assets/drawable-BgfrEBer.js +1 -0
- package/web/dist/assets/index-CAqrWhKl.js +2 -0
- package/web/dist/assets/index-Ruh93A3A.css +1 -0
- package/web/dist/assets/jobBuckets-Dbq8ZlWW.js +1 -0
- package/web/dist/assets/lawCats-BLgxl151.js +1 -0
- package/web/dist/assets/react-DbkvxWG5.js +8 -0
- package/web/dist/assets/rolldown-runtime-CbXtAM7H.js +1 -0
- package/web/dist/index.html +4 -3
- package/web/src/pages/Laws.jsx +22 -8
- package/src/skills/clarify.md +0 -28
- package/src/skills/crash-course.md +0 -29
- package/src/skills/decode.md +0 -29
- package/src/skills/drill.md +0 -29
- package/src/skills/feynman.md +0 -27
- package/src/skills/gap-detector.md +0 -27
- package/src/skills/learning-path.md +0 -27
- package/src/skills/react-view-transitions/README.md +0 -42
- package/src/skills/tdd.md +0 -31
- package/web/dist/assets/Activity-BfVcLrda.js +0 -1
- package/web/dist/assets/ActivityDetail-CQXccGPl.js +0 -1
- package/web/dist/assets/CatalogRow-DALEQImZ.js +0 -1
- package/web/dist/assets/Diff-BIjxXx46.js +0 -5
- package/web/dist/assets/Doctor-CJLbgsrw.js +0 -1
- package/web/dist/assets/FilterInput-CkUCk_lY.js +0 -1
- package/web/dist/assets/GreenhouseView-DfC5IILJ.js +0 -2
- package/web/dist/assets/Harness-Dm5CCU-v.js +0 -1
- package/web/dist/assets/JournalView-Cpu2eI4s.js +0 -1
- package/web/dist/assets/Laws-DDDVFuQz.js +0 -3
- package/web/dist/assets/Library-Dao3T9na.js +0 -1
- package/web/dist/assets/Markdown-C__nuWX5.js +0 -46
- package/web/dist/assets/OperatorHudView-DEpCtAjP.js +0 -2
- package/web/dist/assets/Profile-BlXtUlh2.js +0 -1
- package/web/dist/assets/Rules-DIre6gxR.js +0 -1
- package/web/dist/assets/Skills-rY13ZPhM.js +0 -1
- package/web/dist/assets/StatusBadge-wW_RS_my.js +0 -1
- package/web/dist/assets/activity-DpYPKNrA.js +0 -1
- package/web/dist/assets/index-BEZvPvpF.js +0 -1
- package/web/dist/assets/index-DNQE5ydy.js +0 -10
- package/web/dist/assets/index-DzdQjvM1.css +0 -1
- package/web/dist/assets/index-PmQGRS1X.js +0 -2
- package/web/dist/assets/jobBuckets-DfTUJUxR.js +0 -1
- package/web/dist/assets/lawCats-DUS9UTH4.js +0 -1
- package/web/dist/assets/react-DOpiTn5v.js +0 -32
package/docs/token-footprint.md
CHANGED
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
What a deployed harness costs in context-window tokens, per host. Token counts are
|
|
4
4
|
chars/4 estimates and shift a little with theme and version.
|
|
5
5
|
|
|
6
|
-
**Treat every number below as a floor, not a reading.** They were measured on
|
|
7
|
-
`--footprint lean` build (the default) of the neutral theme
|
|
8
|
-
|
|
6
|
+
**Treat every number below as a floor, not a reading.** They were measured on
|
|
7
|
+
2026-09-12 on a `--footprint lean` build (the default) of the neutral theme with
|
|
8
|
+
four doctrine packs, 54 skills and 19 agents, and nothing re-measures this page
|
|
9
|
+
automatically. For a
|
|
9
10
|
live figure on your own install, ask the agent for the `token-report` skill —
|
|
10
11
|
that is what it is for. A `--footprint full` build runs roughly 5k tokens
|
|
11
12
|
heavier on the root file.
|
|
@@ -16,41 +17,65 @@ The context every host injects at session start, before you type anything:
|
|
|
16
17
|
|
|
17
18
|
| Component | Claude Code | OpenCode | Bob | Copilot |
|
|
18
19
|
|---|---|---|---|---|
|
|
19
|
-
| Root instruction file | ~
|
|
20
|
-
| Skill metadata (name + description) | ~
|
|
21
|
-
| Agent metadata | ~0.5k | ~0.
|
|
22
|
-
| Eager memory/notebook injection | ~1.2k (SessionStart hook) | ~1.2k (context plugin) | ~1.2k (SessionStart hook) |
|
|
23
|
-
| **Total** | **~
|
|
20
|
+
| Root instruction file | ~7.3k (`CLAUDE.md`) | ~7.3k (`AGENT.md`) | ~7.7k (`AGENTS.md`, §3 table inline) | ~9.0k (`AGENTS.md`, §3+§4 tables inline) |
|
|
21
|
+
| Skill metadata (name + description) | ~4.1k | ~4.1k | ~4.1k (native) | — (§4 table; native catalogue unverified) |
|
|
22
|
+
| Agent metadata | ~0.5k | ~0.5k | — (no agents directory) | — (§3 table) |
|
|
23
|
+
| Eager memory/notebook injection | ~1.2k (SessionStart hook) | ~1.2k (context plugin) | ~1.2k (SessionStart hook) | ~1.2k (sessionStart hook) |
|
|
24
|
+
| **Total** | **~13k** | **~13k** | **~13k** | **~10k** |
|
|
24
25
|
|
|
25
|
-
The emits are at parity by design: ~10–
|
|
26
|
-
window. Bob
|
|
26
|
+
The emits are at parity by design: ~10–13k tokens, about 6% of a 200k
|
|
27
|
+
window. Bob catalogues skills natively but has no agents directory, so its
|
|
28
|
+
root keeps the §3 Agents table and drops the §4 Skills table — the catalogue
|
|
29
|
+
flag is per kind (`hostCatalogsNatively`), not one boolean. Before the 2026-09 footprint pass every hooked host paid roughly double
|
|
30
|
+
this: the context hook re-injected the root file the host had already loaded
|
|
31
|
+
natively, and skill descriptions ran to 900 characters each — see the
|
|
32
|
+
"Where the tokens go" list below for what changed. Bob and Copilot carry the §3/§4 catalogue tables inline because their
|
|
27
33
|
hosts expose no native skill/agent inventory; Claude Code and OpenCode ship a
|
|
28
|
-
pointer to the host's own inventory instead, ~1.9k tokens lighter. Copilot
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
pointer to the host's own inventory instead, ~1.9k tokens lighter. Copilot's
|
|
35
|
+
eager injection rides its `sessionStart` hook, which the **global** emit wires;
|
|
36
|
+
a project-scope Copilot install has no hooks, so there the memory/notebook
|
|
37
|
+
indexes load when the agent reads them, not eagerly. The
|
|
38
|
+
eager-injection path is budget-capped identically everywhere — 16 KB per file
|
|
39
|
+
(cut at a line break, with a marker saying so) and 48 KB per session (files past
|
|
40
|
+
the budget are listed lazy with the reason) — so a 40k-character README no
|
|
41
|
+
longer leaves whole every session, and growing Memory degrades every host the
|
|
42
|
+
same way instead of one silently falling behind. The hook also **never injects
|
|
43
|
+
the root file the host loads by itself** (`CLAUDE.md` on Claude Code,
|
|
44
|
+
`AGENTS.md` on Bob and Copilot, `AGENT.md`/`AGENTS.md`/`CLAUDE.md` on OpenCode):
|
|
45
|
+
until 2026-09 it did, and the whole harness was paid twice per session.
|
|
34
46
|
|
|
35
47
|
## Where the tokens go
|
|
36
48
|
|
|
37
49
|
- **The root file is ~65% of the bill**, and the constitution inside it is the
|
|
38
|
-
bulk of that — no longer one section but three: the
|
|
50
|
+
bulk of that — no longer one section but three: the Ethos, the nine Rules,
|
|
39
51
|
and the doctrine packs this install built in. **Two** levers move it, not one.
|
|
40
52
|
The [footprint dial](#/docs/footprint) (`lean`, the default, swaps each Rule,
|
|
41
|
-
the
|
|
42
|
-
Wiki — for their hand-written condensations
|
|
43
|
-
|
|
53
|
+
each doctrine rule, the Ethos and the longest prose sections — the preamble,
|
|
54
|
+
§6 Notebook, §8 Wiki — for their hand-written condensations; `full` inlines
|
|
55
|
+
every rationale). And the
|
|
44
56
|
[doctrine packs](#/docs/setup-choices) — `geneseed-build --doctrines craft,rigor`
|
|
45
57
|
drops whole blocks of §2 at build time, which removes far more than the
|
|
46
58
|
footprint dial trims. Anything else is noise.
|
|
47
59
|
|
|
48
60
|
The lean condensations are authored, not generated. An earlier design shipped
|
|
49
|
-
the
|
|
61
|
+
the Ethos *whole* under `lean` on the grounds that truncating four flowing
|
|
50
62
|
sections to four orphan sentences would ship a worldview nobody could read —
|
|
51
|
-
the `LEAN:` blocks answer that by hand-writing the short form instead
|
|
52
|
-
|
|
53
|
-
|
|
63
|
+
the `LEAN:` blocks answer that by hand-writing the short form instead. The
|
|
64
|
+
doctrine packs were the last tier still cut at the first full stop, and they
|
|
65
|
+
now author their halves too — which *adds* text at `lean` rather than removing
|
|
66
|
+
it, deliberately: eleven of the twenty-four rules were shipping a slogan with
|
|
67
|
+
no verb an agent could act on. Read the carrier size off the ceiling in
|
|
68
|
+
`tests/unit/emit_smoke.test.mjs` rather than a byte count quoted here; the
|
|
69
|
+
figure moved twice while this paragraph went on stating the old one.
|
|
70
|
+
- **Skill descriptions are the second bill** on a host that catalogues natively.
|
|
71
|
+
Each is the skill's purpose line plus the *first sentence* of its trigger,
|
|
72
|
+
capped at 320 characters (`skillDescription` in `js/hosts/native.mjs`); at
|
|
73
|
+
the earlier 900-character cap the catalogue weighed ~5.6k tokens. The later
|
|
74
|
+
trigger sentences still live in the body, read as soon as the skill is chosen.
|
|
75
|
+
- **§5–§10 carry authored lean halves too** (Memory, Notebook, Workspace, Wiki,
|
|
76
|
+
Context, Scripts): each keeps its obligations — read `MEMORY.md`, read
|
|
77
|
+
`context.json` before the first reply, the git-ignored folders — and points at
|
|
78
|
+
the on-disk README or config file for the rest.
|
|
54
79
|
- **Skill bodies (~53k) and agent bodies (~10k) are lazy** on every host —
|
|
55
80
|
loaded only when invoked. A typical skill costs ≤3k per invocation; the
|
|
56
81
|
heaviest (`react-view-transitions`, ~17.5k with its reference files) loads
|
|
@@ -72,8 +97,9 @@ token counter also includes, none of which Geneseed controls:
|
|
|
72
97
|
definitions. On OpenCode this is typically 5–10k tokens before any
|
|
73
98
|
harness content loads.
|
|
74
99
|
2. **Your repo's docs, injected eagerly** — the context delivery
|
|
75
|
-
(plugin on OpenCode, SessionStart hook on Claude Code / Bob
|
|
76
|
-
hook
|
|
100
|
+
(plugin on OpenCode, SessionStart hook on Claude Code / Bob, `sessionStart`
|
|
101
|
+
hook on a global Copilot install; a project-scope Copilot install has no
|
|
102
|
+
hooks, so it reads docs on demand instead) discovers and
|
|
77
103
|
injects `README.md`, `CONTRIBUTING.md`, and files under `docs/`, up to the
|
|
78
104
|
48 KB budget (≈12k tokens). A doc-heavy repo fills it.
|
|
79
105
|
3. **Wiki eager entries** plus the lazy listing of the rest, if a wiki is
|
package/docs/web/agents.md
CHANGED
|
@@ -5,4 +5,4 @@ title: "Agents"
|
|
|
5
5
|
kind: "concept"
|
|
6
6
|
link: {"hash": "#/section/agents", "label": "Browse the catalog →"}
|
|
7
7
|
---
|
|
8
|
-
{N_AGENTS} capability specialists — `reviewer`, `tester`, `architect`, `developer`, `docs`, `security`, `explorer`, plus a debate **council** the [[council]] skill convenes (`advocate`, `skeptic`, `pragmatist`, `steward`, `visionary`, `user-advocate`, `framer`, `empiricist`, `operator`, `historian`). You delegate by capability, not by folder: the harness picks the right specialist from the request.
|
|
8
|
+
{N_AGENTS} capability specialists — `reviewer`, `tester`, `architect`, `developer`, `docs`, `security`, `explorer`, `researcher`, plus a debate **council** the [[council]] skill convenes (`advocate`, `skeptic`, `pragmatist`, `steward`, `visionary`, `user-advocate`, `framer`, `empiricist`, `operator`, `historian`). You delegate by capability, not by folder: the harness picks the right specialist from the request.
|
package/docs/web/claude-hooks.md
CHANGED
|
@@ -6,11 +6,12 @@ kind: "concept"
|
|
|
6
6
|
---
|
|
7
7
|
Claude Code has no `instructions` array and no JS plugin dir — the harness reaches it through **`settings.json` hooks** instead: the same capabilities the OpenCode plugins provide, each driven by a `geneseed-hook` subcommand. `CLAUDE.md` itself auto-loads by location, so it needs no hook at all.
|
|
8
8
|
|
|
9
|
-
### The
|
|
9
|
+
### The hooks
|
|
10
10
|
|
|
11
11
|
- **Context injection** — `SessionStart` (startup, clear, resume) runs `geneseed-hook context`: auto-discovers the repo's docs by convention and injects them before your first turn, plus your machine wiki. It honours the same `GENESEED_CONTEXT` manifest as the OpenCode context plugin.
|
|
12
12
|
- **Git gate** — `PreToolUse` on Bash runs `geneseed-hook git-gate`: a `git commit` or `git push` anywhere in the command line — a compound one-liner and a `-C <path>` form included — asks first, at the tool boundary and before the shell runs it (**Doctrine process 5**). It is the one hook that rides a doctrine pack: an install built without **process** never gets this group, because a boundary that keeps asking for a rule the install did not adopt is a gate arguing with its own harness.
|
|
13
13
|
- **Rule gate** — `PreToolUse` on the write tools runs `geneseed-hook rule-gate`: a write to `user-rules.md` or to a memory file asks first, because whether something you want kept is a standing rule or a durable fact is *your* call, settled through the [rule skill](#/docs/skills) (**Doctrine process 1**). Ordinary edits are untouched.
|
|
14
|
+
- **Tool gate** — `geneseed-hook tool-gate` is the git gate and the rule gate fused behind one command, for hosts whose hook config has no per-tool matcher (Copilot, Bob). Claude Code matches per tool, so its `settings.json` wires the two gates above instead.
|
|
14
15
|
- **Learn** — `Stop` and `SubagentStop` run `geneseed-hook learn`: distils durable memories into the install's `memory/` store at session end; a subagent's stop routes to the per-agent lesson path (`memory/agents/<name>.md`).
|
|
15
16
|
|
|
16
17
|
### Where they live
|
|
@@ -19,7 +20,7 @@ The emit merges the hook groups surgically into your `settings.json` (global `~/
|
|
|
19
20
|
|
|
20
21
|
### The hook shim
|
|
21
22
|
|
|
22
|
-
Hooks run with the project as their working directory, so every command has to be an absolute path. Rather than write the interpreter and this checkout into your `settings.json`, the emit points
|
|
23
|
+
Hooks run with the project as their working directory, so every command has to be an absolute path. Rather than write the interpreter and this checkout into your `settings.json`, the emit points every hook at one stable file — the **hook shim**, at `~/.geneseed/bin/geneseed-hook` (`geneseed-hook.cmd` on Windows). The shim holds the two volatile paths; the config holds none.
|
|
23
24
|
|
|
24
25
|
That indirection is what lets the checkout move. Before it, relocating or replacing the clone silently broke the gates in every install at once, and the only repair was re-emitting every config. Now a single build rewrites the shim and every install is live again. The shim is refreshed on **every** emit, so an ordinary `geneseed build` is the repair; `geneseed doctor` reports it if it was ever stale.
|
|
25
26
|
|
|
@@ -16,7 +16,7 @@ A **mode** is the session's operating register — *how* work gets executed, as
|
|
|
16
16
|
|
|
17
17
|
### The Pact — a two-way contract
|
|
18
18
|
|
|
19
|
-
Where the Rules bind the agent, the **Pact** binds the collaboration — and it is not a layer beside them: it is stated inside
|
|
19
|
+
Where the Rules bind the agent, the **Pact** binds the collaboration — and it is not a layer beside them: it is stated inside **Telos**, the first Ethos section, the tier that is always in force, so it holds in every task and every repository. It carries three ranked laws — protect the user, the code's future maintainer included; serve their intent; keep the agent's own honesty — each yielding only to the one above, and — unusually — names what *you* owe back: don't punish candour that honours the pact, give context up front, decide when shown a fork. Your half is not enforceable against you; the agent's half is binding on it.
|
|
20
20
|
|
|
21
21
|
### Typed memory — binding force
|
|
22
22
|
|
|
@@ -24,4 +24,4 @@ A memory may carry an optional `force` — **constraint** (imposed, not the agen
|
|
|
24
24
|
|
|
25
25
|
### Your profile — identity
|
|
26
26
|
|
|
27
|
-
`PROFILE.md`, seeded once beside `AGENT.md` and never overwritten, holds *who you are*: role, habits, register preferences. It is identity, not rules — it colours how the agent works but never binds (precedence is the
|
|
27
|
+
`PROFILE.md`, seeded once beside `AGENT.md` and never overwritten, holds *who you are*: role, habits, register preferences. It is identity, not rules — it colours how the agent works but never binds (precedence is the Ethos and the Rules, then `user-rules.md`, then the active Doctrines, then the profile). Edit it here under the **Profile** tab, or in the file directly — or let the agent draft it: the [[profile]] skill interviews you (who you are, how you work, how you like answers pitched) and writes the file only with your consent, routing anything that is really a standing rule to `user-rules.md` instead.
|
|
@@ -8,7 +8,7 @@ Once installed, the agent doesn't change *how* you talk to your tool — it chan
|
|
|
8
8
|
|
|
9
9
|
### What loaded automatically
|
|
10
10
|
|
|
11
|
-
- **`AGENT.md`** — the [constitution](#/docs/rules): the
|
|
11
|
+
- **`AGENT.md`** — the [constitution](#/docs/rules): the {N_ONTOLOGY} Ethos sections, {N_LAWS} always-on Rules, and the {N_DOCTRINE_RULES} doctrine rules from the packs this install built in.
|
|
12
12
|
- **Your repo's docs** — `README.md`, `CONTRIBUTING.md`, anything under `docs/` the harness discovers.
|
|
13
13
|
- **Your machine's wiki** (if you [set one up](#/docs/configure-wiki)) — eager entries and a lazy listing of the rest.
|
|
14
14
|
- **The skill and agent catalogue** — invokable by name.
|
|
@@ -16,7 +16,7 @@ Once installed, the agent doesn't change *how* you talk to your tool — it chan
|
|
|
16
16
|
### Try these prompts
|
|
17
17
|
|
|
18
18
|
- *"Use the **profile** skill"* — a short interview that drafts `PROFILE.md` (seeded empty at install), so the agent knows who you are and how you like answers pitched.
|
|
19
|
-
- *"Use the **
|
|
19
|
+
- *"Use the **brainstorm** skill on this feature request."*
|
|
20
20
|
- *"Delegate to the **reviewer** agent on the staged diff."*
|
|
21
21
|
- *"Use **brainstorm** then **plan** for how to add X."*
|
|
22
22
|
- *"Use **council** to debate whether we should ship Y now."*
|
package/docs/web/footprint.md
CHANGED
|
@@ -9,8 +9,8 @@ link: {"hash": "#/settings", "label": "Toggle it in Settings →"}
|
|
|
9
9
|
|
|
10
10
|
### The difference
|
|
11
11
|
|
|
12
|
-
- **Full** — `AGENT.md` inlines the
|
|
13
|
-
- **Lean** — each Rule and each doctrine rule is carried as its **heading + the rule
|
|
12
|
+
- **Full** — `AGENT.md` inlines the Ethos, every Rule and every rule of the **active** doctrine packs, complete text and reasoning included, on every single turn.
|
|
13
|
+
- **Lean** — each Rule and each doctrine rule is carried as its **heading + an authored short form** — the rule and its mechanism, written by hand rather than cut at the first full stop — each tier closing with a pointer to its complete text shipped beside `AGENT.md` — the agent reads the reasoning on demand when a rule's application is unclear. The Ethos is condensed the same way, as **one authored short form for the whole tier**: it is flowing prose rather than numbered blocks, so cutting it section by section would have left orphan fragments instead of a shorter argument.
|
|
14
14
|
|
|
15
15
|
### What ships on disk either way
|
|
16
16
|
|
package/docs/web/harnesses.md
CHANGED
|
@@ -6,7 +6,7 @@ kind: "concept"
|
|
|
6
6
|
---
|
|
7
7
|
One source, **five emit targets** — each with a per-repo and a global (`-global`) variant, plus a portable `files` bundle any `AGENT.md`-aware tool can read. **OpenCode** runs its own engine (JS plugins, colour themes, LSP); **Claude Code**, **Bob**, and **Copilot** share one Claude-shaped engine that diverges only by host dialect.
|
|
8
8
|
|
|
9
|
-
The harness *content* — the constitution (
|
|
9
|
+
The harness *content* — the constitution (Ethos, Rules, Doctrines), Agents, Skills, Memory, and the preamble voice — is **identical on every host**: one build renders the same text for all five targets. What differs is how much of it the host can *automate* (via plugins or hooks) versus carry as preamble discipline.
|
|
10
10
|
|
|
11
11
|
| Capability | OpenCode | Claude | Bob | Copilot |
|
|
12
12
|
| --- | :---: | :---: | :---: | :---: |
|
package/docs/web/model.md
CHANGED
|
@@ -4,7 +4,7 @@ order: 0
|
|
|
4
4
|
title: "The harness model"
|
|
5
5
|
kind: "concept"
|
|
6
6
|
---
|
|
7
|
-
Geneseed assembles its runtime pieces around a single `AGENT.md` entrypoint: an **
|
|
7
|
+
Geneseed assembles its runtime pieces around a single `AGENT.md` entrypoint: an **Ethos** (how the agent thinks, decides and speaks — always on), **Rules** (the always-on invariants it never breaks), **Doctrines** (practice packs this repository chose at build time), **Agents** (capability specialists you delegate to), **Skills** (repeatable workflows the agent can invoke), **Memory** (one-fact-per-file durable knowledge), and a **Notebook** (the agent's own sovereign space). The first three are the [constitution](#/docs/rules), in that order of precedence — with your own `user-rules.md` sitting between the Rules and the Doctrines.
|
|
8
8
|
<!--harness:opencode-->
|
|
9
9
|
On OpenCode, {N_PLUGINS} **Plugins** bind the pieces to the host: context injection, learn-at-session-end, the safety guard, the saved workflow runner, end-of-run notifications, a live-activity feed for this console, and an opt-in minimal-code mode.
|
|
10
10
|
<!--/harness-->
|
|
@@ -9,6 +9,7 @@ Registers one custom tool, `workflow`, that runs saved, code-driven orchestratio
|
|
|
9
9
|
- **Saved scripts only (v1):** the tool loads `<name>.js` from the sibling `workflows/` dir. No model-authored scripts are eval'd.
|
|
10
10
|
- **Call shape:** `workflow({ name, args })` — call with no name to list what's available. Shipped: `council`, `review`, `research-plan-implement`.
|
|
11
11
|
- **Runtime API:** scripts get `agent()`, `parallel()`, `pipeline()`, `phase()`, `log()`, `budget`, `args`. Child work runs as real OpenCode sessions; concurrency is capped at `min(16, cores − 2)`.
|
|
12
|
+
- **Worktree isolation:** `agent(prompt, { isolation: "worktree" })` runs that child on its own branch in its own git worktree (under the OS temp dir), the same option Claude Code's Workflow takes. A worktree with no change is removed with its branch; one with changes is kept, and the tool's summary lists every kept branch and every file more than one agent changed (`rt.worktrees()`, `rt.overlaps()` inside the script). Nothing is merged or committed for you. The worktree holds tracked files only — an agent that must build or test installs dependencies first. Without git the agent fails; it never falls back to the shared tree.
|
|
12
13
|
|
|
13
14
|
### Install
|
|
14
15
|
|
package/docs/web/rules.md
CHANGED
|
@@ -7,9 +7,9 @@ link: {"hash": "#/laws", "label": "Browse the constitution →"}
|
|
|
7
7
|
---
|
|
8
8
|
The agent's standing rules come in **three tiers**, and the tier decides how a rule binds and whether this install carries it at all. All three are authored under `src/` and rendered into `AGENT.md`; the console shows them as three bands under **Constitution**.
|
|
9
9
|
|
|
10
|
-
###
|
|
10
|
+
### Ethos — always on
|
|
11
11
|
|
|
12
|
-
{N_ONTOLOGY} sections of flowing prose in `src/ontology/universal.md`: what the agent is for, how it grades evidence, how it decides, how it conducts itself. It is the mind the other tiers govern — never numbered, never toggleable, and it is where the **Pact** (the mutual contract between you and the agent) is stated. Cited by section name, `
|
|
12
|
+
{N_ONTOLOGY} sections of flowing prose in `src/ontology/universal.md`: what the agent is for, how it grades evidence, how it decides, how it conducts itself. It is the mind the other tiers govern — never numbered, never toggleable, and it is where the **Pact** (the mutual contract between you and the agent) is stated. Cited by section name, `Ethos: Decisions`, and its section names are theme-independent so a citation and its heading can never drift apart.
|
|
13
13
|
|
|
14
14
|
### Invariants — always on
|
|
15
15
|
|
|
@@ -25,6 +25,6 @@ Rules toggle **individually** too — `geneseed-build --exclude-rules "process 7
|
|
|
25
25
|
|
|
26
26
|
### Which outranks which
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
Ethos and Invariants first, then your own `user-rules.md`, then the active Doctrines, then `PROFILE.md`. A rule you write in `user-rules.md` **outranks a doctrine rule** — a practice pack chosen at build time never overrides an instruction you wrote for your own repo — and nothing outranks an invariant: a user rule or a doctrine rule may tighten one, never repeal it.
|
|
29
29
|
|
|
30
30
|
Themes rename the nouns, never the structure: an imperial deploy reads the invariants as *Dictates*, a neutral deploy as *Rules*. The tier, the address and the rule itself do not move.
|
|
@@ -29,7 +29,7 @@ Pick **direct** unless you want the session managing a crew for you. Switch back
|
|
|
29
29
|
|
|
30
30
|
### Doctrine packs — which practices bind
|
|
31
31
|
|
|
32
|
-
Which practice rules this install adopts, fixed at build time. Unlike the dials above this one really does change *which rules apply*: the [
|
|
32
|
+
Which practice rules this install adopts, fixed at build time. Unlike the dials above this one really does change *which rules apply*: the [Ethos and the Rules](#/docs/rules) are always on, the doctrines are yours to pick. All four ship enabled, and leaving one out is a deliberate choice, not a default:
|
|
33
33
|
|
|
34
34
|
- **craft** — how code is written: reuse first, house conventions, docs in step, the smallest diff.
|
|
35
35
|
- **rigor** — how work is proven: idempotence, honest tests, coverage, gates that can actually fail.
|
|
@@ -56,7 +56,7 @@ The switches are on the **Constitution** page, one per rule, staged locally and
|
|
|
56
56
|
|
|
57
57
|
How much of the constitution `AGENT.md` carries inline every turn. A token-cost dial, not a rules cut — whatever this install adopted always applies:
|
|
58
58
|
|
|
59
|
-
- **lean** *(default)* — the
|
|
59
|
+
- **lean** *(default)* — the Ethos, each Rule and each doctrine rule in an authored short form — the rule and its mechanism, hand-written beside the full text — with a pointer to the complete text shipped beside `AGENT.md` and read on demand.
|
|
60
60
|
- **full** — every Rule's and every active doctrine rule's complete text *and* rationale inline. Best when token cost is a non-issue or you run a smaller model, which applies a rule's nuance more reliably with the *why* eagerly in context.
|
|
61
61
|
|
|
62
62
|
---
|
package/docs/web/skills.md
CHANGED
|
@@ -5,4 +5,4 @@ title: "Skills"
|
|
|
5
5
|
kind: "concept"
|
|
6
6
|
link: {"hash": "#/section/skills", "label": "Browse the catalog →"}
|
|
7
7
|
---
|
|
8
|
-
{N_SKILLS} repeatable workflows the agent can invoke by name — from [[brainstorm]], [[
|
|
8
|
+
{N_SKILLS} repeatable workflows the agent can invoke by name — from [[brainstorm]], [[plan]], [[develop]] and [[debug]] through [[council]], [[research]] and [[ship]] to [[roast-me]]. A skill is a markdown playbook under `src/skills/`; the agent reads it before acting. The catalog link lists every one, live.
|
|
@@ -15,6 +15,6 @@ Every rule in the constitution gets its title from a theme key, and a theme that
|
|
|
15
15
|
- `DOC_*` — one title per doctrine rule, named after its address (`DOC_CRAFT_1`, `DOC_PROCESS_5`, …). `doctor` reads the pack files under `src/doctrines/` and requires exactly the set they name — a missing one is a blank heading, an extra one is a dead key.
|
|
16
16
|
- `PACK_*` — one name per pack (`PACK_CRAFT`, `PACK_RIGOR`, `PACK_OPS`, `PACK_PROCESS`), used for the pack's own sub-heading.
|
|
17
17
|
|
|
18
|
-
The
|
|
18
|
+
The Ethos section names are **not** theme keys: a citation reads `({{ONTOLOGY}}: {{ONT_TELOS}})`, token on both sides, so heading and reference always move together. They live in the build's fixed structure table and you neither declare nor rename them.
|
|
19
19
|
|
|
20
20
|
> ⚠ `LAW` and `DOCTRINE` must each be a **single word**. Both heading parsers match the tier noun with `\S+`, so a two-word value does not error — the heading simply stops matching and the whole tier parses to nothing, in silence. `doctor` gates this for every real voice (`_TEMPLATE.json` is exempt; its values are placeholders).
|
package/docs/web-ui.md
CHANGED
|
@@ -61,7 +61,7 @@ It is hidden where the rail collapses to icons (≤960px) and returns with the p
|
|
|
61
61
|
|
|
62
62
|
A global **Spotlight** search lives in the topbar — press <kbd>/</kbd> to focus it (or
|
|
63
63
|
<kbd>Ctrl</kbd>/<kbd>⌘</kbd>+<kbd>K</kbd>, which also works from inside a text field), type
|
|
64
|
-
to jump to any agent, skill, doc,
|
|
64
|
+
to jump to any agent, skill, doc, MCP server, or constitutional rule — the `laws`
|
|
65
65
|
catalog it indexes is the whole constitution, so an ontology section, an invariant and a
|
|
66
66
|
doctrine rule are all reachable by name; <kbd>↑</kbd>/<kbd>↓</kbd> to
|
|
67
67
|
move, <kbd>Enter</kbd> to open, <kbd>Esc</kbd> to clear. A bottom **Console** drawer
|
|
@@ -69,7 +69,7 @@ streams the output of background jobs and keeps their history across reloads.
|
|
|
69
69
|
|
|
70
70
|
## Views
|
|
71
71
|
|
|
72
|
-
###
|
|
72
|
+
### Dashboard
|
|
73
73
|
|
|
74
74
|
- **Dashboard** (`#/`) — a live readout of what's deployed. Three lenses: **Status**
|
|
75
75
|
(readiness ring, a KPI band, a genome grid, recent activity), **Lineage** (the
|
|
@@ -84,6 +84,9 @@ streams the output of background jobs and keeps their history across reloads.
|
|
|
84
84
|
puts an active-packs fraction under the tile (`3/4 packs · N rules`), and the Operator HUD
|
|
85
85
|
gives it its own cell (`PACKS 3/4`). That is what makes a narrowed install *look* different
|
|
86
86
|
from a full one at a glance.
|
|
87
|
+
|
|
88
|
+
### 📖 Codex
|
|
89
|
+
|
|
87
90
|
- **Rules** (`#/rules`) — your own standing rules, read from and written to the
|
|
88
91
|
`user-rules.md` beside the deployed AGENT.md (the seed-once file no update ever
|
|
89
92
|
touches). List with scope (user/project) and trial chips, add/edit/retire forms, a
|
|
@@ -92,7 +95,7 @@ streams the output of background jobs and keeps their history across reloads.
|
|
|
92
95
|
content the page last read — if an agent session edited the file meanwhile, the save
|
|
93
96
|
409s and the page reloads instead of clobbering it.
|
|
94
97
|
- **Constitution** (`#/laws`) — the whole governance surface on one page, in three bands:
|
|
95
|
-
the **
|
|
98
|
+
the **Ethos** (four prose sections), the **Invariants** (the nine numbered Rules, with
|
|
96
99
|
a class facet — only non-empty classes render, and two of the six have had no invariant
|
|
97
100
|
since the split), and the **Doctrines** (one group per pack, each marked active or not for
|
|
98
101
|
this install). Every row expands to its full body, lazily fetched. The rail entry is
|
|
@@ -108,17 +111,22 @@ streams the output of background jobs and keeps their history across reloads.
|
|
|
108
111
|
**Promote to rule** control turns a recurring lesson into a trial rule in
|
|
109
112
|
`user-rules.md` — provenance recorded, the source fact deleted so it isn't loaded
|
|
110
113
|
twice — landing you on the Rules page.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
+
- **Profile** (`#/profile`) — `PROFILE.md` beside the deployed AGENT.md: who you are and
|
|
115
|
+
how you like to work. Opens rendered; **Edit** is a whole-file editor. The save carries
|
|
116
|
+
the fingerprint it loaded — if an agent session changed the file first, your edit stays
|
|
117
|
+
on screen and a second Save replaces the newer version.
|
|
118
|
+
- **Skills** (`#/skills`) and **Agents** (`#/agents`) — the deployed catalogue, each entry
|
|
119
|
+
with its purpose line and full spec.
|
|
114
120
|
- **Docs** (`#/docs`) — rendered documentation: markdown pages, concept pages, a CLI
|
|
115
121
|
reference (generated from the harness argument parser), and a glossary, grouped into
|
|
116
|
-
Get started / Core concepts / How-to / MCP servers / Plugins / Reference / Deeper.
|
|
117
|
-
|
|
118
|
-
|
|
122
|
+
Get started / Core concepts / How-to / MCP servers / Plugins / Reference / Deeper. Filtered
|
|
123
|
+
for one host family (OpenCode, or Claude Code — which Bob and Copilot share); with no
|
|
124
|
+
choice stored it follows the deployed install.
|
|
119
125
|
|
|
120
|
-
###
|
|
126
|
+
### 🩺 Care
|
|
121
127
|
|
|
128
|
+
- **Activity** (`#/activity`) — the agent sessions on this machine: each one's status,
|
|
129
|
+
the files it touched and its todo progress; open one for its detail.
|
|
122
130
|
- **Changes** (`#/diff`) — the diff between the deployed harness and the source: edited /
|
|
123
131
|
added / missing files with per-file expansion and coloured unified-diff lines. Select
|
|
124
132
|
files to **export an `improvements.md`** back-port, or **restore** them to source.
|
package/harness.config.json
CHANGED
|
@@ -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": "3.
|
|
5
|
+
"version": "3.5.0"
|
|
6
6
|
}
|
package/js/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# `js/` — the module map
|
|
2
2
|
|
|
3
|
-
Fifty-
|
|
3
|
+
Fifty-seven modules in seven folders. This page is the address book: **what each one owns**, and
|
|
4
4
|
**which file to open first** for a given task. It is not documentation of behaviour — every module
|
|
5
5
|
has a docblock for that, and the docblock is the thing to read before editing.
|
|
6
6
|
|
|
@@ -14,7 +14,7 @@ a module that does not exist, is a test failure. `geneseed doctor` reports the s
|
|
|
14
14
|
```
|
|
15
15
|
bin/geneseed-cli.mjs the `geneseed` CLI — 20+ verbs, may NOT spawn
|
|
16
16
|
bin/geneseed-hook.mjs the hook entry — 5 verbs, loads on EVERY tool call (~14 ms)
|
|
17
|
-
bin/build-driver.mjs `geneseed-build` —
|
|
17
|
+
bin/build-driver.mjs `geneseed-build` — a thin entry over js/build/driver.mjs
|
|
18
18
|
|
|
19
19
|
js/build/ src/ + themes/ → rendered text → a bundle → a per-host install
|
|
20
20
|
js/hosts/ where it stops being a renderer and touches the machine
|
|
@@ -45,7 +45,8 @@ as a per-host install at project or global scope.
|
|
|
45
45
|
| `emit-common.mjs` | Constants, tree walkers, and the three writers BOTH global emits share. Decides no host |
|
|
46
46
|
| `stubs.mjs` | Write-once seed files: context, wiki, rules, excludes, profile, `.gitignore`, memory/notebook indexes |
|
|
47
47
|
| `version.mjs` | The release marker: fingerprint the sources, read/compare/write an install's version, warn on downgrade |
|
|
48
|
-
| `
|
|
48
|
+
| `driver.mjs` | The generator driver: `--emit`/`--theme`/`--footprint` flag parsing, the nine emit targets, per-host emit orchestration, the prune and the manifest. `bin/build-driver.mjs` is only its entry |
|
|
49
|
+
| `generate.mjs` | CLI verbs `build`, `prompt`, `theme`, `rebuild-all` — the thin face over `driver.mjs` |
|
|
49
50
|
| `catalog.mjs` | `geneseed catalog` — prints the shipped roster. Classifies nothing itself |
|
|
50
51
|
| `themes.mjs` | Maintainer-only `--sync-themes`: inserts `_TEMPLATE.json`'s missing keys into the committed themes |
|
|
51
52
|
|
|
@@ -181,8 +182,8 @@ and inline lists are held against a surface list written out in
|
|
|
181
182
|
|
|
182
183
|
| I want to | open first | then |
|
|
183
184
|
|---|---|---|
|
|
184
|
-
| a doctrine rule | `src/doctrines/<pack>.md` — APPEND, ids run contiguously | `docs/extending.md` §2a — five files, `--sync-themes`, restyle 14 voices by hand |
|
|
185
|
-
| a law (invariant) | `src/laws/universal.md` — **APPEND, never insert** | `docs/extending.md` §2c.
|
|
185
|
+
| a doctrine rule | `src/doctrines/<pack>.md` — APPEND, ids run contiguously | `docs/extending.md` §2a — five files, `--sync-themes`, restyle 14 voices by hand. Author BOTH LEAN halves |
|
|
186
|
+
| a law (invariant) | `src/laws/universal.md` — **APPEND, never insert** | `docs/extending.md` §2c. Author both LEAN halves: the lean footprint ships nothing else |
|
|
186
187
|
| a skill or an agent | `src/skills/<name>.md` or `src/agents/<name>.md` | `docs/extending.md` §3 — eight steps. Write the FILE before the table row or the build aborts |
|
|
187
188
|
| a doctor check | `js/inspect/checks-{build,repo,authoring}.mjs` | register with `ran(...)` in `doctor.mjs`, then a PLANTED FAULT in `tests/unit/harness.test.mjs` |
|
|
188
189
|
| a web endpoint | GET → `js/web/api.mjs`; POST → `js/web/actions.mjs` | declare it in `js/web/routes.mjs`; the partition test probes the real handler |
|