The harness
One invariant layer, hashed, under every home and every repo. Types and instances stack on top.
be-harness is one repo. Its contents land in two places and never
change in either — they change in be-harness, then get carried out.
be-harness
├── home/ ──▶ ~/ every employee's home on the box
│ CLAUDE.md AGENTS.md .claude/{settings,agents,commands,skills} .config/be/
└── repo/ ──▶ be-<type>-template ──▶ be-<type>-<name>
.be/ .claude/settings.json /gm /gn core agents
be-naming be-harness .mcp.json CLAUDE.md .gitignore
.be/MANIFEST ── sha256 of each of the above
Three layers, one hard line
INVARIANT be-harness hashed. Edit → validate fails → push refused
TYPE be-<type>-template be.conf · AGENTS.md · its agents/commands/skills/scripts
INSTANCE be-<type>-<name> the work
sh .be/check.sh reads the manifest and says which files are which.
sh .be/scripts/validate.sh runs it first, every time, and the autopush
hook runs validate before every push. Drift blocks. be upgrade restores
or updates from be-harness and touches nothing else.
be.conf — how a type talks to the harness
Four values. Everything the harness does that varies by type, varies through these:
BE_TYPE=wiki # which skill to load next: be-wiki
BE_CONTENT="docs" # roots autopush + validate watch; empty = off
BE_WORDS_MAX=500
BE_VALIDATE=scripts/validate.sh # the type's extra gate
A wiki watches docs/. A CLI has no content, so autopush is off and its
gate checks that every command answers the contract.
settings.json — permission to finish
advisorModel is on in every home and every repo. The allowlist covers
the loop — be, git, gh, the scripts — so an agent lands work without
stopping to ask. Nothing destructive is on it.
Two hooks: SessionStart prints orientation into context before the first
prompt (at home: the map; in a repo: that type’s help). PostToolUse on
writes under BE_CONTENT: validate, commit, push.
Home and repo, not a hierarchy
~/.claude/ ~/be-wiki-x/.claude/
provisioned, user level vendored, project level
the core four, /gm /gn /new core four + writer + reader, /dump …
└──────── the repo wins on a name clash ────────┘
Both are ours and both are the same core; the repo adds its type. Personal config does not exist on the box — the harness is the config.
Changing it
Edit be-harness, bump VERSION, sh bin/manifest.sh, push. Then
be upgrade in each template, and instances follow when their owners run
it. A harness change is a commit someone can read.