geneseed 2.1.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 +108 -0
- package/DESIGN.md +112 -61
- package/QUICKSTART.md +1 -1
- package/README.md +24 -14
- package/SETUP.md +83 -17
- package/SHIPPED.md +5 -4
- 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/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 +72 -6
- package/docs/extending.md +164 -55
- package/docs/limits.md +4 -4
- package/docs/token-footprint.md +15 -4
- 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/harness.config.json +1 -1
- package/js/catalog.mjs +29 -4
- package/js/checkout.mjs +24 -1
- package/js/cli-table.json +8 -6
- package/js/diff.mjs +8 -3
- package/js/doctor.mjs +307 -4
- 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 -21
- package/js/migrate.mjs +10 -4
- package/js/render.mjs +110 -7
- package/js/settings.mjs +218 -27
- package/js/setup.mjs +95 -5
- package/js/status.mjs +45 -4
- package/js/tui.mjs +44 -1
- package/js/uninstall.mjs +25 -6
- package/js/web/actions.mjs +56 -5
- 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 +6 -0
- 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 -336
- 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 -36
- package/themes/biker.json +37 -36
- package/themes/commentator.json +37 -36
- package/themes/cyberpunk.json +37 -36
- package/themes/gamer.json +37 -36
- package/themes/imperial.json +37 -36
- package/themes/joker.json +37 -36
- package/themes/marvin.json +37 -36
- package/themes/mean.json +37 -36
- package/themes/military.json +37 -36
- package/themes/neutral.json +37 -36
- package/themes/pirate.json +37 -36
- package/themes/sports.json +37 -36
- package/themes/verstappen.json +37 -36
- package/themes/wizard.json +37 -36
- package/web/dist/assets/{About-BYXlmbyo.js → About-C0Mk0igT.js} +1 -1
- package/web/dist/assets/{Activity-us5MPf4u.js → Activity-C4aJJVXz.js} +1 -1
- package/web/dist/assets/{ActivityDetail-CiaQXUk2.js → ActivityDetail-DaQ85za0.js} +1 -1
- package/web/dist/assets/{Diff-Bh0qbZ2s.js → Diff-B3tlO2Yj.js} +1 -1
- package/web/dist/assets/{Doctor-BIlQME45.js → Doctor-BNC-5Dmo.js} +1 -1
- package/web/dist/assets/{Graph-4dYD1dPG.js → Graph-us0T6ZcV.js} +1 -1
- package/web/dist/assets/{Harnesses-PzYZ3LOC.js → Harnesses-DAMgyfM_.js} +1 -1
- package/web/dist/assets/Laws-rOxegJ75.js +1 -0
- package/web/dist/assets/{Library-CjMbksJW.js → Library-KmwrHA1J.js} +1 -1
- package/web/dist/assets/{Markdown-Bk81c3aZ.js → Markdown-0eQOVGSF.js} +1 -1
- package/web/dist/assets/{Profile-Curui_-j.js → Profile-ZU7WV6Xl.js} +1 -1
- package/web/dist/assets/{Rules-Bm283wdv.js → Rules-CtDoPhhf.js} +1 -1
- package/web/dist/assets/{Skills-gruqYuhl.js → Skills-BhoOxdkD.js} +1 -1
- package/web/dist/assets/{StatusBadge-EiM_FPqv.js → StatusBadge-CGvYVCwa.js} +1 -1
- package/web/dist/assets/{Themes-DU99j4Hr.js → Themes-Dr7OOkD7.js} +1 -1
- package/web/dist/assets/{activity-0rvQ6Vra.js → activity-B8aq3qtl.js} +1 -1
- package/web/dist/assets/index-2wqPDxuN.css +1 -0
- package/web/dist/assets/{index-0b2hobOo.js → index-AhMzkdbI.js} +1 -1
- package/web/dist/assets/index-CRftEtBX.js +12 -0
- package/web/dist/assets/{index-IiGFmCW_.js → index-D0lPN_qW.js} +1 -1
- package/web/dist/index.html +2 -2
- package/web/src/pages/Laws.jsx +282 -91
- package/web/dist/assets/Laws-DtZweXal.js +0 -1
- package/web/dist/assets/index-D5VY3TY_.js +0 -12
- package/web/dist/assets/index-DUCsDv7z.css +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,114 @@ labels in `harness.config.json`. The canonical identity of an *installed* harnes
|
|
|
6
6
|
is the source fingerprint in `.geneseed-version` (see `geneseed version`), not this
|
|
7
7
|
label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
|
|
8
8
|
|
|
9
|
+
## [3.0.0] — 2026-08-20
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- **The constitution is three tiers, and the law numbering contract breaks.** Forty flat
|
|
14
|
+
laws become an always-on **Ontology**, nine always-on **Invariants**, and twenty-three
|
|
15
|
+
**Doctrine** rules in four build-time-toggleable packs. This is the major: every
|
|
16
|
+
`Law <numeral>` citation above IX now addresses something else or nothing at all, in
|
|
17
|
+
this repo and in anyone's memories, notes and forks. There is no compatibility shim and
|
|
18
|
+
no migration path — a deployed install predating 3.0.0 is brought forward by
|
|
19
|
+
`geneseed upgrade`, not by code.
|
|
20
|
+
|
|
21
|
+
- **Ontology** (`src/ontology/universal.md`, new) — four prose sections, *Telos*,
|
|
22
|
+
*Evidence*, *Decisions*, *Conduct*. It is the mind the other tiers govern: what the
|
|
23
|
+
agent is for, how it grades evidence, how it decides, how it conducts itself. It
|
|
24
|
+
absorbs the **Pact** whole — the Pact is now a concept stated inside Telos rather than
|
|
25
|
+
a section beside the rules — along with old laws VIII, IX, XXIX, XXX, XXXI and XXXIX.
|
|
26
|
+
Cited by section name, `(Ontology: Decisions)`. The four names are theme-INDEPENDENT,
|
|
27
|
+
so a citation and its heading are the same token on both sides and a rename cannot
|
|
28
|
+
desync them.
|
|
29
|
+
- **Invariants** (`src/laws/universal.md`, rewritten) — nine, Roman I–IX, never
|
|
30
|
+
toggleable: what is *never* done. I Sealed Secrets · II One Intent, One Act ·
|
|
31
|
+
III Verify Before Asserting · IV Deletion Is Deliberate · V Surface Failures ·
|
|
32
|
+
VI Data, Not Orders · VII Least Privilege · VIII Cure the Cause · IX External Gate.
|
|
33
|
+
- **Doctrines** (`src/doctrines/{craft,rigor,ops,process}.md`, new) — twenty-three rules
|
|
34
|
+
in four packs: **craft** 6 (how code is written), **rigor** 4 (how work is proven),
|
|
35
|
+
**ops** 6 (how the machine is operated), **process** 7 (how a task is run). Cited
|
|
36
|
+
`Doctrine process 5`. Chosen per install with `geneseed-build --doctrines craft,rigor`
|
|
37
|
+
(or `none`), through the setup wizard, or in `harness.config.json`; all four default
|
|
38
|
+
to on.
|
|
39
|
+
|
|
40
|
+
Old XVI and XVIII cease to exist as rules and have **no numeral successor** — their
|
|
41
|
+
content was already duplicated in the AGENT.md sections that describe that machinery,
|
|
42
|
+
and folds back into them.
|
|
43
|
+
|
|
44
|
+
Precedence, stated in the template and enforced by nothing but reading: **Ontology and
|
|
45
|
+
Invariants → `user-rules.md` → active Doctrines → `PROFILE.md`.** A doctrine rule may
|
|
46
|
+
tighten an invariant, never repeal one — and the user's own file outranks a practice
|
|
47
|
+
pack chosen at build time.
|
|
48
|
+
|
|
49
|
+
⚠ **An always-on tier may never cite a toggleable one.** A `--doctrines craft` build
|
|
50
|
+
would otherwise ship an invariant instructing the agent to read text the install does
|
|
51
|
+
not contain. A doctor arm refuses `{{DOCTRINE}}` anywhere under `src/laws/` or
|
|
52
|
+
`src/ontology/`; doctrine→doctrine citations across packs stay legal, because every pack
|
|
53
|
+
file ships in every bundle whether or not it was built in.
|
|
54
|
+
|
|
55
|
+
- **A pack that is not built in is visible everywhere, never absent.** `geneseed catalog`
|
|
56
|
+
marks its rules `(off)`, the status panel and the dashboard carry an active-packs
|
|
57
|
+
fraction, and the console lists the pack greyed with the exact command that enables it.
|
|
58
|
+
Hiding it would make "not built in" indistinguishable from "never shipped", which is the
|
|
59
|
+
one thing a build-time toggle must not look like.
|
|
60
|
+
|
|
61
|
+
- **The commit/push consent gate rides the `process` pack.** It is the boundary half of
|
|
62
|
+
Doctrine process 5, so a build without that pack installs no `git-gate` hook and writes
|
|
63
|
+
no `git commit*` / `git push*` permission — prompt and boundary are never allowed to
|
|
64
|
+
disagree. `rm -rf *` and force-push refusals are Invariant IV's territory and stay in
|
|
65
|
+
every build. ⚠ On OpenCode this holds for a *fresh* install: an `opencode.json` that
|
|
66
|
+
already carries a `git commit*` entry keeps it and is reported, because Geneseed cannot
|
|
67
|
+
tell its own entry from one you typed and will not delete what it may not own.
|
|
68
|
+
|
|
69
|
+
Unknown always resolves to the **full** pack set, never to a config value. An install
|
|
70
|
+
with no `Active packs:` marker — every install predating this release — keeps its
|
|
71
|
+
consent gate on upgrade.
|
|
72
|
+
|
|
73
|
+
- **The console's Laws page is the Constitution page.** One nav entry, three bands, read
|
|
74
|
+
top to bottom. Deep links address all three tiers: `#/item/law/ont:telos`,
|
|
75
|
+
`#/item/law/IV`, `#/item/law/process.5`. The route, the section id and the filename stay
|
|
76
|
+
`laws`.
|
|
77
|
+
|
|
78
|
+
- **The lean footprint grew ~17%, deliberately.** Measured on `neutral`, `AGENT.md` goes
|
|
79
|
+
from 31,457 to 36,882 bytes at `lean` and 53,378 to 54,810 at `full`. Lean truncates
|
|
80
|
+
each invariant and each doctrine rule to its first line, but ships the **ontology
|
|
81
|
+
whole** — four flowing prose sections reduced to four orphan sentences would have been a
|
|
82
|
+
worldview nobody could read. `--doctrines` is now the larger lever on that cost.
|
|
83
|
+
|
|
84
|
+
### Added
|
|
85
|
+
|
|
86
|
+
- `--doctrines` on the generator, a doctrine-packs question in the setup wizard that
|
|
87
|
+
pre-selects what the install already carries, and an `Active packs:` marker in every
|
|
88
|
+
carrier so an install remembers its selection across upgrades.
|
|
89
|
+
- Doctor gates for the whole constitution: dangling `{{DOCTRINE}}` citations, per-pack
|
|
90
|
+
rule contiguity, `DOC_*` theme coverage in both directions, an exact `LEX_I..LEX_IX`
|
|
91
|
+
equality (a presence check had already missed four keys the renumber orphaned), a
|
|
92
|
+
single-word tier noun in every voice — both heading parsers match it with `\S+`, so a
|
|
93
|
+
two-word value makes a whole tier parse to nothing in silence — and a `DOCTRINE_META`
|
|
94
|
+
parity check whose class arm is an equality against the rule's own pack.
|
|
95
|
+
- A `[note]` channel in `doctor`: printed, never counted. Its one producer reports which
|
|
96
|
+
body citations point into packs a narrowed build did not render. That state must be
|
|
97
|
+
visible, but failing the doctor over a configuration its owner chose would be wrong.
|
|
98
|
+
- Count tokens `{N_ONTOLOGY}`, `{N_PACKS}`, `{N_PACKS_ACTIVE}` and `{N_DOCTRINE_RULES}`
|
|
99
|
+
for the in-app docs. `{N_LAWS}` stays the **invariant** count — the rail badge, the
|
|
100
|
+
README prose and SHIPPED.md's triple are all held to that one number by a frozen gate.
|
|
101
|
+
|
|
102
|
+
### Fixed
|
|
103
|
+
|
|
104
|
+
- **Four `§N` cross-references that render into every bundle** pointed at the section that
|
|
105
|
+
used to be there: inserting `## 2. Doctrines` pushed every later AGENT.md section down
|
|
106
|
+
one and the sweep stopped at the template. `src/skills/wiki.md`,
|
|
107
|
+
`src/skills/daydream/SKILL.md`, `src/skills/handoff.md`, `src/agents/_template.md`, plus
|
|
108
|
+
six in the two OpenCode plugins — one of them a live deny message a user reads. A doctor
|
|
109
|
+
arm now refuses a `§N` the template declares no section for; the half it cannot catch (a
|
|
110
|
+
pointer that still resolves and now means something else) is recorded as a manual sweep
|
|
111
|
+
in `docs/extending.md`.
|
|
112
|
+
- An `opencode.json` whose `permission` Geneseed cannot see inside — a blanket
|
|
113
|
+
`"bash": "allow"` — made the reconcile a no-op and the merge then returned before any of
|
|
114
|
+
its warnings. A rule stated in AGENT.md with nothing behind it at the boundary, in
|
|
115
|
+
silence. Now reported, naming the shape and the gates left unwired.
|
|
116
|
+
|
|
9
117
|
## [2.1.0] — 2026-08-19
|
|
10
118
|
|
|
11
119
|
### Added
|
package/DESIGN.md
CHANGED
|
@@ -31,22 +31,32 @@ vault or a specific tool's hooks.
|
|
|
31
31
|
3. **Theme is voice + vocabulary; the scaffolding is theme-independent.** A single
|
|
32
32
|
neutral source renders to any theme via token substitution, split into two classes:
|
|
33
33
|
- **Structure** (always plain English, every theme, every emit) — the section
|
|
34
|
-
*layout*, the harness name (`HARNESS`), the law *numbers*,
|
|
35
|
-
|
|
36
|
-
`
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
*layout*, the harness name (`HARNESS`), the law *numbers*, the four ontology section
|
|
35
|
+
names (`ONT_TELOS`, `ONT_EVIDENCE`, `ONT_DECISIONS`, `ONT_CONDUCT`), a few rare
|
|
36
|
+
technical nouns (`Context`, `Scripts`, `Charter`), and the folder names (`laws/`,
|
|
37
|
+
`ontology/`, `doctrines/`, `agents/`, `skills/`, `memory/`, `notebook/` via `DIR_*`).
|
|
38
|
+
These live in the `STRUCTURE` map in `js/render.mjs` and are laid on top of every
|
|
39
|
+
render, so a theme can never move a path, a link, or a heading number. No theme file
|
|
40
|
+
defines a `DIR_*` or an `ONT_*` key, and none may: an ontology citation spells the
|
|
41
|
+
section on both sides (`{{ONTOLOGY}}: {{ONT_TELOS}}`), so heading and reference move
|
|
42
|
+
together or not at all. Tooling stays stable.
|
|
39
43
|
- **Voice + vocabulary** (themed) — how the AI *responds* (`VOICE`), a top `BANNER`,
|
|
40
|
-
and the prose words the docs use: the core nouns `LAW(S)`/`
|
|
41
|
-
`MEMORY`/`NOTEBOOK`/`VAULT`/`WIKI`, plus `TAGLINE`,
|
|
42
|
-
`
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
and the prose words the docs use: the core nouns `LAW(S)`/`DOCTRINE(S)`/`ONTOLOGY`/
|
|
45
|
+
`AGENT(S)`/`SKILL(S)`/`MEMORY`/`NOTEBOOK`/`VAULT`/`WIKI`, plus `TAGLINE`,
|
|
46
|
+
`LOADED_SIGIL`, `EPI_*`, `BENEDICTION`, `DESC_*`, `ROAST_PERSONA`, the invariant
|
|
47
|
+
titles `LEX_I`..`LEX_IX`, the 23 doctrine-rule titles `DOC_<PACK>_<n>`, the four pack
|
|
48
|
+
names `PACK_CRAFT`/`PACK_RIGOR`/`PACK_OPS`/`PACK_PROCESS`, and the section intros
|
|
49
|
+
`INTRO_*`. Each theme defines its own nouns; **neutral keeps the plain words** (Rule,
|
|
50
|
+
Doctrine, Agent, Skill, Memory, Workspace), so neutral output is unchanged.
|
|
51
|
+
`{{LAW}}` and `{{DOCTRINE}}` must each be a **single word** — both heading parsers
|
|
52
|
+
match the tier noun with `\S+`, so a two-word value makes the whole tier parse to
|
|
53
|
+
nothing in silence. `constitutionProblems` refuses one.
|
|
45
54
|
|
|
46
55
|
So `imperial` flavours the agent's tone *and* the page — the banner, the readiness
|
|
47
|
-
sigil, the epigraphs, and the words themselves (the
|
|
48
|
-
as *
|
|
49
|
-
|
|
56
|
+
sigil, the epigraphs, and the words themselves (the invariants read as *Dictates*,
|
|
57
|
+
doctrine rules as *Doctrinae*, agents as *Adepts*) — while every folder is still
|
|
58
|
+
`agents/`/`skills/`, an invariant is still numbered `IV` and a doctrine rule is still
|
|
59
|
+
addressed `process 5`, and links resolve identically across themes. The source
|
|
50
60
|
tree under `src/` stays neutral for sane authoring. Toggle = one flag.
|
|
51
61
|
|
|
52
62
|
The OpenCode emits add only: native skills at `skills/<name>/SKILL.md` (not slash
|
|
@@ -76,61 +86,102 @@ vault or a specific tool's hooks.
|
|
|
76
86
|
documentation* maintained elsewhere. It also subsumes what a baked-in project
|
|
77
87
|
rules file used to do: point at the project's own conventions instead.
|
|
78
88
|
|
|
79
|
-
7. **Lean governance — every line must change behaviour.** The
|
|
80
|
-
and skills are the product, and a bloated
|
|
81
|
-
runtime, not obeyed: an over-long rule set dilutes
|
|
82
|
-
|
|
83
|
-
|
|
89
|
+
7. **Lean governance — three tiers, and every line must change behaviour.** The
|
|
90
|
+
constitution, the agent specs, and the skills are the product, and a bloated
|
|
91
|
+
instruction surface is ignored at runtime, not obeyed: an over-long rule set dilutes
|
|
92
|
+
the rules that matter. The governance surface is split into three tiers, each answering
|
|
93
|
+
a different question:
|
|
94
|
+
|
|
95
|
+
- **Ontology** (`src/ontology/universal.md`) — *who is deciding*. Four sections of
|
|
96
|
+
flowing prose: **Telos** (what the agent is for, and the Pact it works under),
|
|
97
|
+
**Evidence** (how a claim is graded by how it was obtained), **Decisions** (classify
|
|
98
|
+
and tier by reversibility; show the real forks), **Conduct** (answer what was asked,
|
|
99
|
+
once). It absorbed the Pact, which is now stated *inside* Telos rather than standing
|
|
100
|
+
as a peer of the rules.
|
|
101
|
+
- **Invariants** (`src/laws/universal.md`) — *what is never traded*. Nine numbered
|
|
102
|
+
Rules, `I`..`IX`, headed `### {{LAW}} <roman> — {{LEX_<roman>}}`.
|
|
103
|
+
- **Doctrines** (`src/doctrines/{craft,rigor,ops,process}.md`) — *how work is done
|
|
104
|
+
here*. Practice rules addressed by pack and number, cited as `Doctrine process 5`.
|
|
105
|
+
`PACK_ORDER` (`js/checkout.mjs`) fixes the order craft → rigor → ops → process, which
|
|
106
|
+
is narrative and deliberately not alphabetical.
|
|
107
|
+
|
|
108
|
+
**The Ontology and the Invariants are never toggleable** — every build carries both,
|
|
109
|
+
whole. The Doctrine packs are the only tier a repository may narrow, chosen once at
|
|
110
|
+
build time (`--doctrines craft,rigor`, `--doctrines none`, or the setup wizard) and
|
|
111
|
+
defaulting to all four on. There is no runtime toggle. Every pack file ships on disk at
|
|
112
|
+
both footprints whether or not it was built in, which is what lets a citation into an
|
|
113
|
+
inactive pack still resolve.
|
|
114
|
+
|
|
115
|
+
**Conflict order, exactly:** Ontology + Invariants → the user's own `user-rules.md` →
|
|
116
|
+
the active Doctrines → `PROFILE.md`. A doctrine rule may *tighten* an invariant, never
|
|
117
|
+
repeal one; a user rule outranks a doctrine rule outright; nothing outranks an
|
|
118
|
+
invariant. And an always-on tier may never cite a toggleable one — a `--doctrines craft`
|
|
119
|
+
build would otherwise ship an invariant pointing at text its `AGENT.md` does not
|
|
120
|
+
contain — so `constitutionProblems` (`js/doctor.mjs`) refuses a `{{DOCTRINE}}` token
|
|
121
|
+
anywhere under `src/ontology/` or `src/laws/`.
|
|
122
|
+
|
|
123
|
+
The bar for a **new invariant** is the highest in the tree: universal (it binds *every*
|
|
124
|
+
task, in *every* repository), agent-behavioural (something the model does, not infra it
|
|
84
125
|
cannot instantiate), and not already covered. A principle that is app-code craft,
|
|
85
|
-
host-specific infrastructure, or single-domain
|
|
86
|
-
|
|
87
|
-
folded in as a clause, not minted as a new number. This is the
|
|
88
|
-
counterpart to
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
126
|
+
host-specific infrastructure, or single-domain now has a home one tier down — a doctrine
|
|
127
|
+
pack — or in an agent, a skill, or `context.json`. A rule that overlaps an existing
|
|
128
|
+
invariant is folded in as a clause, not minted as a new number. This is the
|
|
129
|
+
authoring-time counterpart to Doctrine `process 3`'s runtime context economy.
|
|
130
|
+
|
|
131
|
+
**The satellites differ per tier, and that difference is the design** — a doctrine rule
|
|
132
|
+
is cheap on purpose, so the expensive slot stays scarce:
|
|
133
|
+
|
|
134
|
+
| Satellite | A new invariant | A new doctrine rule | A whole new pack |
|
|
135
|
+
|---|---|---|---|
|
|
136
|
+
| body | append to `src/laws/universal.md` — never insert; nothing resolves a cross-reference against the canon | append to `src/doctrines/<pack>.md`, `### {{DOCTRINE}} <pack> <n> — {{DOC_<PACK>_<n>}}`; ids must run contiguously from 1 | a new `src/doctrines/<pack>.md` with its `**Name** — lead line` |
|
|
137
|
+
| themed title | `LEX_<roman>` in all 15 theme files | `DOC_<PACK>_<n>` in all 15 theme files | `PACK_<NAME>` in all 15, plus each rule's `DOC_*` |
|
|
138
|
+
| class | `LAW_CLASS` in `js/inventory.mjs`, one of the six in `LAW_CLASSES` | **none** — a doctrine rule's class *is* its pack, and there is no second taxonomy over it | — |
|
|
139
|
+
| console copy | a `LAW_META` row in `web/src/pages/Laws.jsx` (keyed by arabic number) | a `DOCTRINE_META` row in the same file (keyed `<pack>.<n>`) | one `DOCTRINE_META` row per rule |
|
|
140
|
+
| registration | the numeral is the registration | the number is the registration | the pack name in `PACK_ORDER`, `js/checkout.mjs` |
|
|
141
|
+
| renumber risk | high — appending is the only safe move | none — packs are numbered independently | none |
|
|
142
|
+
| counts | README badge + the `N universal laws` prose, `SHIPPED.md`'s triple, the web onboarding copy | **none** — the console spends the `N_PACKS` / `N_PACKS_ACTIVE` / `N_DOCTRINE_RULES` count tokens, all computed at request time | none, same reason |
|
|
143
|
+
| changelog | `CHANGELOG.md` | `CHANGELOG.md` | `CHANGELOG.md` |
|
|
144
|
+
|
|
145
|
+
"All 15 theme files" is the 14 voices **and** `themes/_TEMPLATE.json`: theme parity
|
|
146
|
+
skips underscore-prefixed names, but `constitutionProblems` reads the template too,
|
|
147
|
+
because it is what `geneseed-build --sync-themes` seeds a new voice from. That flag is
|
|
148
|
+
the *generator's*, not the CLI's — `geneseed build --sync-themes` is an error, not a
|
|
149
|
+
synonym. `--sync-themes` writes the template's placeholder and only *prints* which keys
|
|
150
|
+
to restyle; a shipped placeholder passes every gate.
|
|
151
|
+
|
|
152
|
+
Almost all of it is gated, across six named checks in `js/doctor.mjs` —
|
|
153
|
+
`themeParityProblems` (key parity across the voices), `lawMetaProblems` and
|
|
154
|
+
`doctrineMetaProblems` (the console's Principle column, in both directions),
|
|
155
|
+
`constitutionProblems` (pack numbering and filing, `LEX_I..LEX_IX` as an *equality*, the
|
|
156
|
+
`DOC_*` vocabulary, and every `{{DOCTRINE}}` citation in `src/`), and
|
|
157
|
+
`countTableProblems` / `proseMirrorProblems` (badges and prose). So `geneseed doctor
|
|
158
|
+
--all` is the check; the table above only says what it will ask for. `CHANGELOG.md` has
|
|
159
|
+
no gate and never has.
|
|
160
|
+
|
|
161
|
+
Two things the table cannot tell you, and `docs/extending.md` can: the default footprint
|
|
162
|
+
is **lean**, which keeps an invariant's or a doctrine rule's heading and its *first
|
|
163
|
+
sentence* only — so an amendment written into the second paragraph does not exist for
|
|
164
|
+
most installs — and `LEX_I` is one of seven theme keys frozen byte-for-byte in a
|
|
165
|
+
recording nothing can re-make, so Rule I's themed titles are the one part of this list
|
|
166
|
+
that cannot be edited. The Ontology is exempt from the truncation: it ships whole at
|
|
167
|
+
both footprints, because four flowing sections cut to their first sentences would read
|
|
168
|
+
as four orphan sentences.
|
|
120
169
|
|
|
121
170
|
## 🧩 Components
|
|
122
171
|
|
|
123
|
-
|
|
124
|
-
|
|
172
|
+
Every folder name in the `Harness/` output column is theme-independent (Decision 3): no
|
|
173
|
+
theme file defines a `DIR_*` key, so `laws/` is `laws/` in all fourteen voices.
|
|
125
174
|
|
|
126
175
|
| Component | Source | `Harness/` output | Purpose |
|
|
127
176
|
| --- | --- | --- | --- |
|
|
128
|
-
| Entrypoint | `src/AGENT.md.tmpl` | `AGENT.md` | what the tool reads; inlines the
|
|
129
|
-
|
|
|
130
|
-
|
|
|
131
|
-
|
|
|
132
|
-
|
|
|
133
|
-
|
|
|
177
|
+
| Entrypoint | `src/AGENT.md.tmpl` | `AGENT.md` | what the tool reads; inlines the constitution, links the rest |
|
|
178
|
+
| Ontology | `src/ontology/` | `ontology/` | the mind the rules govern — Telos, Evidence, Decisions, Conduct; always on, never toggleable |
|
|
179
|
+
| Governance | `src/laws/` | `laws/` | the nine universal invariants; always on, never toggleable |
|
|
180
|
+
| Doctrines | `src/doctrines/` | `doctrines/` | the four practice packs — the one build-time axis that changes *which rules ship*; the whole catalogue is written to disk either way |
|
|
181
|
+
| Delegation | `src/agents/` | `agents/` | capability specialists with output contracts |
|
|
182
|
+
| Workflows | `src/skills/` | `skills/` | repeatable procedures |
|
|
183
|
+
| Memory | `src/memory/` | `memory/` | one-fact-per-file convention + index |
|
|
184
|
+
| Notebook | `src/notebook/` | `notebook/` | the agent's sovereign space — any medium, seed-once charter the agent may rewrite; only `.gitignore` re-asserted |
|
|
134
185
|
| Posture | `src/postures/` | inlined into `AGENT.md` | how much ceremony the agent brings to a task |
|
|
135
186
|
| Mode | `src/modes/` | inlined into `AGENT.md` | the working axis (solo, foreman, …) — orthogonal to posture |
|
|
136
187
|
| Context | `js/emit.mjs` | `context.json` | empty per-repo manifest, written once and never overwritten; git-ignore it |
|
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
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
[](themes/)
|
|
13
13
|
[](src/skills/)
|
|
14
14
|
[](src/agents/)
|
|
15
|
-
[](src/laws/universal.md)
|
|
16
16
|
[](adapters/opencode/plugins/)
|
|
17
17
|
[](#-supported-harnesses)
|
|
18
18
|
|
|
@@ -38,7 +38,7 @@ The lineage is also why an **imperial** theme ships alongside the neutral one: i
|
|
|
38
38
|
|
|
39
39
|
### How it works
|
|
40
40
|
|
|
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…)
|
|
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.
|
|
42
42
|
|
|
43
43
|
```bash
|
|
44
44
|
geneseed-build # default theme (neutral)
|
|
@@ -148,11 +148,13 @@ No browser? Every action the console offers is also a verb: `build`, `doctor`, `
|
|
|
148
148
|
|
|
149
149
|
## 📦 4 · What you get
|
|
150
150
|
|
|
151
|
-
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:
|
|
152
152
|
|
|
153
153
|
| Layer | What it is |
|
|
154
154
|
| --- | --- |
|
|
155
|
-
|
|
|
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 |
|
|
156
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` |
|
|
157
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** |
|
|
158
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 |
|
|
@@ -181,16 +183,20 @@ Pick with `--theme NAME` or via the setup wizard. The theme is remembered in a `
|
|
|
181
183
|
|
|
182
184
|
### 🪶 Footprint (lean vs full)
|
|
183
185
|
|
|
184
|
-
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).
|
|
185
187
|
|
|
186
|
-
| Footprint |
|
|
188
|
+
| Footprint | The Ontology + Sections 1–2 of `AGENT.md` | Trade-off |
|
|
187
189
|
| --- | --- | --- |
|
|
188
|
-
| **lean** *(default)* | each Rule
|
|
189
|
-
| **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 |
|
|
190
192
|
|
|
191
|
-
|
|
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.
|
|
192
194
|
|
|
193
|
-
|
|
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.
|
|
196
|
+
|
|
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.
|
|
194
200
|
|
|
195
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).
|
|
196
202
|
|
|
@@ -214,10 +220,10 @@ is **identical on every host**. What differs is how much of it the host can
|
|
|
214
220
|
| **Agents** (capability specialists) | ✅ native | ✅ | ✅ | ✅ `.agent.md` |
|
|
215
221
|
| **Skills** (byte-identical) | ✅ | ✅ | ✅ | ✅ |
|
|
216
222
|
| **Memory & Notebook** | ✅ | ✅ | ✅ | ✅ |
|
|
217
|
-
| **Context injection**
|
|
223
|
+
| **Context injection** | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 📄 preamble |
|
|
218
224
|
| **Memory write-back** (learn) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 📄 preamble |
|
|
219
|
-
| **Git-gate consent** (
|
|
220
|
-
| **Rule-gate consent** (
|
|
225
|
+
| **Git-gate consent** (process 5) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 📄 preamble |
|
|
226
|
+
| **Rule-gate consent** (process 1) | ⚙️ plugin² | 🪝 hook | 🪝 hook¹ | 📄 preamble |
|
|
221
227
|
| **Sovereign-repo excludes** | ⚙️ plugin | ✅ `claudeMdExcludes` | ✅ rules-shadow | ➖ none |
|
|
222
228
|
| **MCP server wiring** | ✅ `mcp` | ✅ `mcpServers` | ✅ `mcpServers` | ✅ `mcp-config.json` |
|
|
223
229
|
| **Colour themes** | ✅ full palette | ➖ | ➖ | ➖ |
|
|
@@ -253,7 +259,11 @@ Geneseed/
|
|
|
253
259
|
├── harness.config.json default theme + metadata (the one owner of the version)
|
|
254
260
|
├── src/ canonical source — edit here
|
|
255
261
|
│ ├── AGENT.md.tmpl the entrypoint, rendered to AGENT.md
|
|
256
|
-
│ ├──
|
|
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
|
|
257
267
|
│ ├── agents/ capability specialists
|
|
258
268
|
│ ├── skills/ repeatable workflows
|
|
259
269
|
│ ├── memory/ memory convention + index
|
package/SETUP.md
CHANGED
|
@@ -165,9 +165,11 @@ your repo's `.claude/settings.json` (paths assume the bundle is at the repo root
|
|
|
165
165
|
It wires:
|
|
166
166
|
|
|
167
167
|
- **PreToolUse** (matcher `Bash`) — runs `harness git-gate`, a tool-boundary backstop
|
|
168
|
-
for
|
|
169
|
-
or `git push` (even chained or `-C`-flagged), un-suppressible by a
|
|
170
|
-
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.
|
|
171
173
|
- **SessionStart** (`startup`/`clear`) — prints `AGENT.md` and injects the project
|
|
172
174
|
context (`harness context`, which auto-discovers the repo's docs);
|
|
173
175
|
- **SessionStart** (`resume`) — refreshes the project context only, without re-printing
|
|
@@ -286,17 +288,79 @@ doubles as a CI drift check: `1` when it had to change files, `0` when every the
|
|
|
286
288
|
already in sync, and `2` when `_TEMPLATE.json` itself is missing or unreadable — the one
|
|
287
289
|
case where a `0` would have meant "in sync" without having checked anything.
|
|
288
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
|
+
|
|
289
346
|
### Footprint (lean vs full)
|
|
290
347
|
|
|
291
|
-
**Footprint** sets how much of the
|
|
348
|
+
**Footprint** sets how much of the constitution `AGENT.md` carries *inline* on every turn — a
|
|
292
349
|
token-cost dial, not a change to which Rules apply. Both states keep all Rules in force:
|
|
293
350
|
|
|
294
|
-
- **
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
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.
|
|
300
364
|
|
|
301
365
|
**Why:** context is scarce and metered. Lean reclaims that budget — and the tokens you
|
|
302
366
|
pay for it — for the task, moving the *rationale* one read away while keeping the rules
|
|
@@ -310,10 +374,11 @@ you run a smaller model.
|
|
|
310
374
|
can *do*: lean and full emit identical files (same agents, skills, plugins, commands, memory,
|
|
311
375
|
notebook, hooks) and every Rule is present and binding. The only structural difference is
|
|
312
376
|
that a lean install on a global / Claude / Bob / Copilot target also ships the standalone
|
|
313
|
-
`laws/universal.md` (project bundles already carry
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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.
|
|
317
382
|
|
|
318
383
|
Set it with `--footprint lean|full` (alongside any `--emit`), the **Footprint** toggle in
|
|
319
384
|
the web Settings, the per-harness dropdown in the Harnesses tab, or the setup wizard. It is
|
|
@@ -418,7 +483,7 @@ opt-in, now simply matches the default. To drop injection entirely, set
|
|
|
418
483
|
If you keep a personal knowledge base on this machine — an Obsidian vault, or any
|
|
419
484
|
folder of interlinked markdown — declare it once in **`wiki.jsonc`** and the agent
|
|
420
485
|
becomes a citizen of it: entry notes load each session (eager) or on demand (lazy),
|
|
421
|
-
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,
|
|
422
487
|
the `wiki` skill). Unlike `context.json` this is **per machine, not per repo**.
|
|
423
488
|
|
|
424
489
|
The build seeds `wiki.jsonc` beside `AGENT.md` (for a global install:
|
|
@@ -462,7 +527,7 @@ list keeps the feature off. The file may hold private paths — it is host-speci
|
|
|
462
527
|
covered by the bundle `.gitignore`, and never committed.
|
|
463
528
|
|
|
464
529
|
On tools without the plugins (plain `AGENT.md`, Claude Code), the same contract
|
|
465
|
-
holds through prose: AGENT.md §
|
|
530
|
+
holds through prose: AGENT.md §8 instructs the agent to read `wiki.jsonc` at session
|
|
466
531
|
start and honour it.
|
|
467
532
|
|
|
468
533
|
### Memory
|
|
@@ -963,7 +1028,8 @@ capability agent. Notes:
|
|
|
963
1028
|
|
|
964
1029
|
- **Permissions still gate.** The consent-before-commit/push / `rm -rf` `ask` rules
|
|
965
1030
|
will *block* in a non-interactive run (nothing to answer the prompt). Both
|
|
966
|
-
`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
|
|
967
1033
|
commits must opt those commands back to `"allow"` in its own `permission.bash` map,
|
|
968
1034
|
or scope the run to read-only work — don't blanket-disable the guards.
|
|
969
1035
|
- **`--pure`** runs OpenCode ignoring local/global config — handy to reproduce a bug
|