Entry profiles
An entry is an ES module with a default export. The manifest/dir/entry surface never forks between hosts; execution semantics are declared as profiles, and a pack never changes its own semantics based on the host. The spec declares exactly two; a host may extend with an app-namespaced third.
Scenario profile - crashtest
Default export carries name, description, and an attacks[] array:
hostile scenarios executed against a transport. Because scenarios attack,
hosts of this profile provide isolation (fake transport, opt-out postures)
and support the armedByKey ceremony when the manifest carries it.
Full module contract: the module-shape contract is host-owned by design (doc drift beats indirection, ruled on crashtest#19) - read it at crashtest’s scenario contract.
Check profile - poststruct
Default export = { checks: [Check] }: declarative, pure-reading
verifiers over files on disk. No transport, no network by default. Arming
defaults to config enumeration - being listed in the host’s packs:
config IS the arm; no separate key ceremony. (poststruct is not shipping
yet; the shape is declared here, loader receipts follow engine-first.)
The one-address rule
The canonical profile pages live with the spec, not the hosts:
profiles/scenario.md
and
profiles/check.md
in the repo. The scenario page LINKS to crashtest’s reference rather than
copying it, so a host-side contract edit can never quietly fork from the
spec’s copy of it.
More in these docs: SPEC v1 · conformance harness · linter