The schemas were wrong, not the content.
Every bec JSON schema was audited against what the LMS sync actually consumes — importer parsers first, then Zod, then Drizzle. verified edits later, full-repo validation went from 645 passing to 2,547. Each edit below carries its LMS evidence (file:line) and was independently re-verified by an adversarial agent against ≥3 real content items.
Schema edits
Policy: LMS wins everywhere. Constraints the importer doesn't enforce were relaxed; fields it consumes were documented; enums it ignores were opened. Click a card for rationale, LMS evidence and content impact. Cards marked corrected were rejected by the adversarial verifier and applied with its correction instead.
Code findings
From a 4-dimension review of the CLI, each finding adversarially confirmed before fixing — all fixed in PR #4547.
Headline: BIP39 chapter IDs would have broken LMS sync (it uuidValidates them); scaffolds now emit UUIDs.
Content errors
87 items · report-onlyGenuine defects in the content itself, surfaced once schemas stopped lying. Deliberately untouched in this PR.
Dominant pattern: machine-translated quiz YAML with unquoted colons ("10 000 BTC:n siirto…" parses as a YAML mapping).
Follow-ups
~2,451 .yml bios are never traversed by bec validate; the relaxed professor-content schema is ready. Small validate.py change.
The LMS importer consumes id, company, assignment_name, mentor, telegram from it — bec doesn't know the file exists.
Mechanical, scriptable: mostly quoting colons in machine-translated quiz YAML; one missing question.yml (btc102/065).
The importer reads test_only; dev301's key is silently ignored, so the course syncs to mainnet.
Link keys the LMS never reads ('Github' capitalized in 53 project files, 'nost' typo, conference 'youtube') — valid but dead data.
Concurrent bec add quiz can race; numbering breaks at 1000 quizzes per course.