packs

Opt-in by construction, refused when it does not fit.

A pack is a self-contained bundle that loads into a host's runner, uses the host's real surface as its vocabulary, and proves the contract it claims to enforce. monoforge carries no packs of its own yet, deliberately - the factory's rule of three holds until a second real provider appears. This page states the contract the family already agreed on.

The two pack shapes

The same SPEC v1 manifest grammar (kebab name, schemaVersion 1, relative entry) the whole family loads, in two roles.

Check-profile packs

The audits. The doctor's truth battery stays in monoforge; organization- or client-voice checks load from packs/public/<name>/ entries exporting{checks: [...]} - the same run(ctx)contract the family legs already run through packstruct lint --deep and audit-conformance.

Scenario-profile packs

The adversarial tests. A stamp's or a cut's acceptance surface gets its own crashtest lane - attacking generated output the way packstruct-lint-shapes attacks the linter: in-process, verdict records, refuse-never-fail. Stub manifests, fake entries, and falsely green truth slots are the threat class the doctor's stamp-manifest scoping exists to catch.

Where packs run today

The struct siblings carry working pack batteries and the factory's mount inherits the same SPEC. Every row is a real, committed lane, not a plan.

memberpacksstatus
packstructpackstruct-lint-shapes
the lint contract under a hostile manifest corpus, via an in-process double
carried
poststructeyes-reference + eleven ecosystem shape packs
baked-site checks per build shape (prestruct, freestruct, Jekyll, WordPress, Astro, Eleventy, Gatsby, Hugo, Liquid, eyestruct)
carried
eyestructeye-shapes, eye-text-leg, eye-ci-gate
the capture and canon lanes, linted and conformance-checked through packstruct 1.0.0, exact-pinned in its own lock
carried
govstructten check-profile packs + the govstruct-manifest-shapes lane
the source-consistency profile over its own tree, plus hostile member blocks over govstruct lint
carried
crashtestthe dogfood lanes
each member's crashtest.config.jsdrives an in-process double over the host's own lint contract
carried
monoforgenone yet
the rule of three: a pack lands when a second real provider or a first real client pack appears, not before
queued

Each member's manifests are linted once, at load, by the same rules packstruct lint --deep reports, so a pack that fails lint cannot quietly run. See the docs packs page for the fitting law and the authoring contract.

The fitting law

Packs are opt-in by construction. A pack applies when the host's own config enumerates it - monoforge never reads a pack because it exists on disk, and a pack that does not fit the stamped shape is refused, never silently bent.

# lint a packdir's manifest grammar (packstruct)
npx packstruct lint packs/ --deep

# audit a pack battery against the family runner shape
npx packstruct audit-conformance .