UNRELEASED DEVELOPMENT SNAPSHOT · READ-ONLY EXCERPT
docs/architecture.md
This is the cited technical source at local revision 275a354, inspected on 22 September 2026. It differs from the public release. This reference publishes only the cited sections, not an installable release or the development branch.
Line numbers refer to the complete recorded file. Uncited lines are omitted. Full-file SHA-256: fc01bbe2145ea8f9de285f3ae70124da9ef8fe064de11f48191a30bcc92644b7.
1
# Architecture3
How Lintel is put together, and why. If you want the workflow rather than the structure, read4
[the cycle](the-cycle.md) first.6
---8
## One sentence10
Lintel is a **spine** — a company-neutral execution engine of skills, agents and hooks — plus one11
active **pack** that supplies identity. The spine decides *how* work runs; the pack decides *what12
counts as correct* for your team.14
Everything else in this document is a consequence of that split.16
---… omitted uncited lines …
203
Each runs at three granularities — full, loop, or a single capability — so the module is useful both204
as a half-day architecture pass and as a two-minute question.206
`full-engineering-pass` composes all five in dependency order: architecture first, then data and207
security in parallel, then hosting, then testing.209
---211
## Cross-cutting constructs213
**Hand-off envelopes.** Work crossing a boundary — spawning a subagent, transitioning a phase,214
passing to a cold executor — can be wrapped in a standardised envelope and scored by the active215
pack's evaluators before it is allowed through. The schema, helpers and evaluator policy ship, but216
there is no universal automatic interceptor: a workflow must invoke Brief Forge explicitly, as the217
swarm profile does before dispatch. Pack configuration selects behavior for an invocation; it does218
not install a host hook.220
**Meta-infra discipline.** Changes to the harness's own structure ripple into every downstream221
cycle, so they run under four extra gates — a structure-impact entry, a compatibility audit, the222
shape-test suite, and a future-operator recap. See [the cycle](the-cycle.md#the-gates-in-one-list).224
---226
## Where state lives228
Four roots. Two are machine-global, two live in your repo:230
| Root | Scope | Holds |231
|---|---|---|232
| `~/.lintel/` | machine-global | operator identity — `profile.yaml` (active pack, mode, role), installed packs, cross-repo job registry, operator audit log |233
| `~/.claude/` | machine-global | your CLI's own home — `settings.json`, and hooks you armed by hand on a bare install |234
| `<repo>/.claude/` | per-repo, **committed** | `memory/` (lessons, working state, personas), `decisions/`, `plans/` including optional swarm topology and evidence |235
| `<repo>/.claude/runtime/` | per-repo, **gitignored** | cycle state, job data, session saves, repo event log |237
The committed/gitignored split is the load-bearing part. Knowledge that should be reviewed in a pull238
request is committed. Churn that would only create merge conflicts is not.240
A repo carrying `.claude/lintel-layout.yaml` is on this layout. One without it predates the move and241
still uses the legacy locations.243
---245
## Multi-CLI without duplication