Verbs
Every command is one short process, never a daemon. The only state that
survives between looks is labs/.eyes/ - committed, chain-shared via git.
Exit contract: 0 green or explained, 1 drift or refusal with a named
reason, 2 setup or capability trouble. No bare stack traces.
Memory setup
eyestruct init [--browser-image TAG] [--renderer resvg@V]
Writes labs/.eyes/manifest.yml (the pin + route matrix, a strict
hand-editable subset) and an empty ledger. The default home itself is
labs/.eyes/ now - beside the PRD and the crash-harness state (the
gistory shape) - and hosts that keep theirs elsewhere re-point it with
--manifest/--ledger.
Looking and diffing
eyestruct look <url> [--viewport WxH] [--theme T] [--region SEL] [--browser-exec P]
eyestruct diff <url> [--against PATH]
look captures one route/view into labs/.eyes/ and appends a ledger row.
diff compares a fresh capture against the committed baseline; a local
look followed by adopt is how a change gets proposed.
Proposing and reading
eyestruct adopt <route/view> --note "why this change is expected"
eyestruct ledger list [ROUTE] | show ID
Local adopts are unratified proposals - the note is required at write time, and canon baselines are cut by CI. The ledger is append-only and refuses corruption loudly.
Gating and validating
eyestruct gate
eyestruct raster [file...]
gate is the CI job: exit 1 on unexplained labs/.eyes/ drift. raster
does strict SVG parse + render + byte-size sanity - it never fake-passes
without a renderer.
Canon and coverage
eyestruct ratify <base-url>
eyestruct walk <base-url>
ratify re-captures every manifest route in the pinned environment and
cuts byte-identical slots as append-only ratify rows. walk runs every
route x viewport x theme in one pass.
Never glyph-counting
The ledger gates look for mask-invariant drift - text edges are masked so a typo never hides a real visual change, and a policy re-render never invents one.
Flags that work everywhere
--json (machine output), --manifest PATH, --ledger PATH (host-owned
memory locations).
More in these docs: start ยท discussions