Every file in an engagement’s data/ is one of two kinds, and the distinction is the
whole game:
- Authored (code time) — committed source you edit by hand:
requirements.json,
architectures.json, decisions.json, fillers.json, config.json.
- Build-time output — generated, gitignored (like
_site/), and never hand-edited.
The danger is editing a build output: your change is silently discarded the next time
the producer runs. So before you touch a data/ file, know which kind it is.
The machine-readable index of every producer is contract/pipelines.mjs (pinned, in
the contract layer). The docs site and this page are both reflections of it — the
solutions/research-index entries are derived from assemble.mjs’s own paths, so they
can’t drift. When in doubt, read that file.
The producers
| Output |
Built from |
Producer |
data/solutions.json |
data/solutions/<key>.yaml (one per solution) + _index.yaml |
assemble.mjs |
data/research-index.json |
data/rounds/<id>.yaml (one per round) + data/research-index.yaml |
assemble.mjs |
requirements.md |
requirements.json (regenerates the Gate/Fit/Risk tables from criteria[]) |
generate-requirements-md.mjs |
data/landscape.json |
research/landscape-results.json (the raw survey) |
build-landscape.mjs (per-engagement) |
The first two are the sharding projection (Plan 24): once solutions.json /
research-index.json outgrow hand-editing, they become generated artifacts assembled
from per-record YAML shards — the shards are the source of truth. The assembler is
additive: a no-op on an instance that still ships monolithic JSON.
The flow
author shards / JSON → assemble + generate → validate → 11ty build → served _site/
(code time) (build outputs) (gate) (cockpit)
- Edit the source — a shard, or an authored JSON file. Surgical shard edits go
through
data-edit.mjs (it auto-assembles after each change).
- Assemble —
assemble.mjs assemble data rebuilds the served monoliths from shards.
- Validate —
validate.mjs data: shape (Ajv 2020) + semantics (cross-refs) + the
MR-5 doc-lint (every field carries a description — that’s what makes the field
reference generatable).
- Build & deploy — 11ty renders the cockpit; CI ships
_site/.
The CLIs
All run from the engagement root; the contract CLIs live in the pinned _methodology
submodule.
validate.mjs <data> — full validation. --lint-only runs just the schema
doc-lint.
assemble.mjs <assemble|explode|verify> [dataDir] — assemble (shards → JSON,
the build step), explode (JSON → shards, one-shot migration), verify (round-trip
check that the live shards assemble losslessly).
data-edit.mjs <show|set-score|set-coverage|set-knowledge|add-fact> … — the
surgical editor over the shards, for the fiddly-shape edits, auto-assembling after each.
Adding a new producer? Declare it in contract/pipelines.mjs (or, if its paths come from
code, derive them there) — the reference and this page pick it up automatically.