Satisfies the Phase 1 Definition of Done:
- content/ validates cleanly against the frozen schema. `make validate`
reports OK: 40 document(s) validated, 0 violations.
- Six areas exist, each with an L1 entry: ai-overview, platform-overview,
edge-overview, products-overview, history-overview, about-overview.
- All six areas have an L2 entry: ai-systems, platform-estate, edge-fleet,
products-business, history-engagements, about-narrative.
- 28 L3 artefact stubs under content/<area>/l3/. Every artefacts[].url in
every document resolves to one of them; the validator proves there are no
dangling references (and a deliberately broken copy exits 1).
- Every metric value traces to a source line in the evidence notes or the
approved metric set in reference/content-map.md (per-metric citations are
recorded in the AUD-131 completion comment).
- Every document carries confidence and last_verified=2026-10-26; the
validator rejects a missing or non-canonical value.
- docs/content-redaction.md records the redaction pass: identifiers, third
party personal data, credentials and infrastructure detail excluded, with
reasons, plus the two numbers that are reported rather than smoothed.
Honesty positions held: 3 businesses active (12 adoptions over time),
Where-Woof deployed and pre-market, failures kept in (edge-failures), no
promotion of in-progress work to delivered.
No site code, no templates, no CSS, no rendering (Phase 2).
Implements AGENTS.md section 7 front-matter schema as a single-file,
standard-library-only Python validator; no third-party YAML dependency
and no framework. Adds the `make validate` gate, a 20-case fixture set
and docs/content-schema.md.
DoD satisfied:
- make validate runs and exits 0 on an empty/clean content/ tree
(missing dir and empty dir both exit 0; fixture ok-empty covers it).
- Every violation class has a fixture under test/fixtures/fail-*; each
exits non-zero with one line per violation (file:line: field: rule).
`make test` runs all 20 cases: 20/20 pass.
- Dangling artefact reference is fatal (fail-dangling-artefact;
artefacts[].url must resolve to an existing in-repo L3 stub or asset).
- Unknown front-matter field is fatal (fail-unknown-field), including
unknown keys nested inside artefacts[]/metrics[].
- docs/content-schema.md committed; states the frozen schema, links to
AGENTS.md section 7, and records that any later schema change is a
breaking change requiring Sam's approval.
- Scope respected: no content authored, no rendering, no site code.
Files: Makefile, tools/validate_content.py, test/fixtures/**,
docs/content-schema.md, .gitignore (__pycache__).