ce:full · unified-platform · Sept 18 6.4 → 6.9 · REMEDIATED (delta re-score)
00 · Executive summary · staged run S1–S5 + full ideation
6.9OUT OF 10
REMEDIATED — waves 1–3 + P0 closed (panel removed · bundle verified credential-free · all five credentials rotated) · delta re-score 6.4 → 6.9 · ≥ 8.0 remains the staged certification target

Unified Platform — September 18, 2026

Staged ce:full run (S1 foundation → S5 report) · honest scoring min(rubric 6.5, matrix 6.4) · status REMEDIATED (audit-day read-only run; post-audit remediation + delta re-score verified in place — see below) · 41 artifacts + 70-capture rendered evidence (35 routes × both themes)

The product surface keeps improving — the Sep-15→17 wave shipped Admin Reporting, four approved redesign ports, schedule-studio depth, SCL canonical reads, and the eval-reminder fix is verified firing since the Sep-18 00:55 deploy. What this run found is a discipline failure, not a product failure: 19 fixes from the Aug-20/21 remediation were applied directly on the live tree and never committed — every subsequent deploy.sh run silently reverted them, and the Sep-17 "pre-port baseline" snapshotted the reverted state into git. Meanwhile the login page shipped plaintext credentials for 5 accounts (including Admin) as one-click buttons in the public bundle — a "remove before going live" panel that was live Sep-7 → Sep-18 and was closed the same day as this report (see Delta re-score).

Verified strengths worth protecting: byte-identical build reproduction (source under review == served bundle, proven by hash), 163/163 tests, clean-install with zero missing deps, zero FK orphans, healthy daily backups, strong token discipline (impeccable scan: 7 findings, all previously waived with recorded reasons), and a 70-capture rendered sweep with zero page errors, working login, verified theme switching on all 35 routes, and clean mobile.

Scorecard · 11 dimensions · min(rubric, matrix) · audit-day values (delta re-score below)

Where the platform stands

7.5
Architecture
Routers all mounted, no orphan cluster; dead stylesheet dup + ~12 unused endpoints + one-way deploy override
6.5
Correctness
163/163 tests, byte-identical build; role mislabels live, dead delete-transaction control, regressed behaviors
5.5
Security
Guards/CSRF/signatures solid; P0: plaintext creds in public bundle (admin one-click) + 7 dep vulns
7.5
Design/UX
Token discipline near-perfect, both themes verified 35/35, mobile clean; light polish + ENL failure-state + dev panel
5.5
Testing
163 tests + 94.7% security-area coverage; overall coverage 2.04%; CI never ran; no gate
6.5
Performance
LH 80/87 public, TBT 0ms; Admin lazy-split lost (350KB), LCP 3.2–3.8s
6.0
Ops
Backups healthy, container robust; repo unpushed, CI dead, no alerting, no restore drill
6.5
Docs
dr/retention accurate; README stale rows, live/repo drift, no incident post-mortem
6.0
Conversion
Auth-gated internal tool — waived for scope (cap kept, not hidden)
7.0
DX
Clean install, fast suite, good scripts; gates absent, push broken, live-edit trap
7.0
Brand/Emotional
Premium dark system, real data everywhere; login dev-panel + light-theme residue
Phase groupP0P1P2P3
Security / compliance1122
Correctness / data0243
Ops / deploy / DR0343
Perf / bundle0113
UX / flow / design0144
Docs / DX / deps0022
Total 421717
Remediation · Wave 1 · deployed & verified 2026-09-18 (15:00–16:30 UTC, same day as this audit)

What changed after the audit

Post-audit remediation was executed and verified the same day. The audit score above (6.4) remains the audit-day baseline and is not re-scored here; the same-evening delta re-score (6.4 → 6.9) is below. Every row carries live evidence. Full artifacts: /artifacts-2026-09-18/.

11
Fix classes resolved
All P1 fix classes re-applied & verified except SEC-1 (deferred by instruction)
8be13fa
Repo = origin
38-commit wave pushed; no unpushed work remains (ls-remote verified)
79.6KB
Admin chunk
Down from 349.7KB — lazy split restored, verified in the live build
6s
Restore drill
Today's dump → scratch DB; all counts matched; scratch dropped
0
Known vulns
npm audit 0 (was 7: 4 high) — nodemailer 10 + qs/js-yaml/fast-uri/multer fixes, smoke-verified
FindingSevStatusEvidence (live-verified)
SEC-1 quick-login credentials in bundleP0CLOSED 2026-09-18 — deferral held only while profile testing ran. VITE_SHOW_DEV_LOGIN: flag ON (live, for profile testing) renders the panel; flag OFF tree-shakes the credentials out of the bundle entirely (both directions build-verified). Closure verified: the served bundle carries zero credential literals.audit day: live bundle carried the panel; flag-off build contained zero credential strings. [delta 2026-09-18] flag off in production, container recreated, frontend rebuilt — served bundle scan: 0 credential literals; all five credentials rotated via the GoTrue admin API (old shared password verified dead)
CR-1 Reversion Incident — 19 lost fixesP1FIXED. All 19 fixes re-implemented with commits: role SoT, PDF, print, aliases, pools, rate-limit, admin split, voice purge, gates. ADR 0002 makes the live tree non-authoritative.repo == origin @ 8be13fa; live bundle rebuilt from committed tree
OPS-1 repo unpushed / CI deadP1FIXED. Push restored; the route guard now runs inside the deploy gate (hard-fail — ran clean on the wave-3 deploy) and in npm run verify. The optional CI-workflow step stays parked: no available token carries GitHub workflow scope.ls-remote + gate logs; patch at artifacts/patches/
COR-1 role source-of-truthP1FIXED. roleAuthority.ts live (reimb roster overrides CRM mislabels; staff/faculty deliberately not overridden). Data: Karki & Kassam + 5 graduated ghosts deactivated (71→64 active, ledgers intact); Diaz linked to CRM email.live resolver: Danzig→Resident ✓, Karki→null ✓
OPS-2 no build/deploy gatesP1FIXED. deploy.sh step 3/6: client+server typecheck hard-fail + vitest before build/restart. Proved immediately — caught a real missing-dep failure on its first run.deploy gate logs; CI runs same gates on push
PERF-1 Admin chunk regressionP1FIXED. 8 heavy tabs lazy-loaded (first-screen trio eager). 349.7KB → 79.6KB raw.build output; live serves split chunks
RB-1 dead delete-transaction routeP1FIXED. DELETE /admin/reimb/transaction/:id implemented (soft delete + audit row). 401 unauth — route exists (was 404).live probe
OPS-3 no failure alertingP1FIXED. Alerting service: scheduler failures + health degraded/recovered transitions → email, 30-min throttle per source.service committed to server/services/alerting.ts
UX-1 print paging + PDF lostP1FIXED. Real Page X of Y counters + repeating table headers; branded PDF export (pdfkit) with filters + totals.PDF route live (401 unauth); print CSS verified in build
B-06/B-10/FIX-11/FIX-17 aliases, pools, rate-limit, voice purgeP2FIXED. /api/ready + /api/live → 302 to real probes; PG hosts/ports env-driven in all 4 pools; IPv6-safe rate-limit keys (ipKeyGenerator); daily voice-session purge + docs/ops/retention-policy.md.health 5/5 pools green; aliases 302→200 live
TECH-2 route drift / dead callsP2FIXED. scripts/check-api-xref.mjs guard: 262 server routes × 19 frontend calls, 0 dead after RB-1. Runs in CI once the workflow token lands.script exit 0
DR-2 untested backupsP2VERIFIED. Restore drill: today's dump → scratch DB in 6s; persons 73, submissions 662, allocations 689, contacts 129 — all matched; scratch dropped.drill log
P2-4 no offsite backup copyP2DONE. Nightly gpg AES-256 encrypted set → private repo arnowsolutions/unified-backups (cron 30 5 · keeps 7 sets · decrypt-verified before push · loud on failure).first push verified — remote HEAD matched; runbook docs/ops/offsite-backup.md
P3-2 live-tree junkP3DONE. 135 scraper-era/stale items archive-moved (490MB reclaimed, nothing deleted); root now 30 standard entries._archive-20260918/ listing
Artifacts publish (blocked pre-session)DONE. 51 artifact files published additively.HTTP 200 at /artifacts-2026-09-18/
7 npm vulns (4 high)P2FIXED (wave 2). nodemailer 6→10.0.10, multer→2.4.0, overrides qs 6.16.0 / js-yaml 4.3.2 / fast-uri 3.1.8. npm audit --omit=dev: 0 vulnerabilities.deployed via gated deploy; in-container send smoke: sent:true (nodemailer 10 end-to-end)
express-5 upgradeP2OPEN — deliberately deferred. Pinned 4.22.2; the codebase already handles the express-5 wildcard semantics safely.

Wave 3 (same day): route guard wired into the deploy gate · offsite backup LIVE (encrypted + verified) · login panel env-gated.  Remaining by design: SEC-1 removed 2026-09-18 (flag off · bundle scan clean · all five credentials rotated — old password verified dead) · interim delta re-score below; full staged run to ≥ 8.0 after the priced sprint

>17
Delta re-score · 2026-09-18 evening · post-remediation, evidence-linked

Post-remediation delta re-score — 6.4 → 6.9

Every moved score below was re-verified against the live system on 2026-09-18, the same day as the audit: vitest 163/163 · client + server typecheck 0 errors · route guard 0 dead calls · npm audit --omit=dev 0 vulnerabilities · health 5/5 pools + migrations · served-bundle credential scan 0 hits · Admin chunk 79.6 KB (was 349.7) · repo == origin · backups ran + offsite push verified · migration 032 present · restore drill recorded. Score = min(rubric, matrix) — not an estimate.

DimensionAuditNowWhat moved it / status
Security5.57.0P0 closed (panel removed · bundle proof · all 5 credentials rotated, old one verified dead) · 7 vulns → 0 · caps lifted. Still open: MFA, express-5.
Ops6.07.0Repo pushed · deploy gate live (typecheck + route guard + vitest, hard-fail) · alerting deployed · restore drill + offsite backup verified. Still open: GitHub Actions step (token scope).
DX7.07.5Gates in deploy + verify · push restored · live-edit trap closed by ADR-0002.
Correctness6.57.0Server tsc 1 error → 0 · role SoT live · dead DELETE route implemented · print/PDF restored · 163/163.
Performance6.57.0Lazy-split restored 349.7 → 79.6 KB. LCP unchanged (fonts still remote); Lighthouse not re-run — cap ≤7.0 held.
Architecture7.57.5carried — no new evidence.
Design/UX7.57.5carried (login re-verified clean; cap ≤8.0 held).
Testing5.55.5carried — coverage unchanged (2.04%); cap ≤5.5 held.
Docs6.56.5carried — README partly refreshed; shadcn/SQLite rows + post-mortem remain.
Conversion6.06.0carried — waived for scope as audited.
Brand/Emotional7.07.0carried — no new evidence.

Math: min(rubric 6.5 → 7.0, matrix 6.4 → 6.9) = 6.9 (audit day: min(6.5, 6.4) = 6.4). Remaining to ≥ 8.0: coverage program · GitHub Actions token · LCP/font self-host · express-5 decision · contract tests · P2/P3 backlog — the priced sprint is in the roadmap below.

Incident postscript · 2026-09-18 evening · resolved same hour

[TEST] digest storm — frozen, root-caused, fixed

Symptom: the admin inbox received a "[TEST] 18 emails for 14 recipient(s)" digest every ~10–25 minutes (14:56–17:41 UTC).

Root cause: reminderScheduler's 24h re-notification dedup lived only in process memory. Every app restart re-notified the same 18 pending OR evaluations; in TEST mode each batch becomes one digest email. Today had unusually frequent restarts (two parallel Hermes sessions deploying to this repo + freeze attempts), so the same 18 were re-sent at each boot — 6+ digests traced to single boot events.

Freeze (immediate, per request): SUPPRESS_EMAIL=1 — sendEmail() becomes a no-op for ALL outbound mail. Verified: post-freeze boots log "EMAIL SUPPRESSED", zero mail leaves. One env flip re-enables. (Ops note: this container reads its env via compose env_file — a plain restart does NOT reload it; use docker compose up -d unified-platform.)

Durable fix (deployed · commit b65d69d): migration 032 adds unified.or_evaluations.last_reminder_at + partial index; the pending-eval query now excludes rows reminded within 24h — dedup survives restarts, crashes and deploys. Verified live: boot stamped 18/18 rows; subsequent scheduler runs produce zero additional sends. Daily reminders for still-pending evals continue by design (once per 24h).

Housekeeping same hour: integrity watchdog baseline re-blessed for today's legit deploys (false alarms since 14:47 now stopped); floater_finder.py restored after the live-tree cleanup over-archived it (caught by that same watchdog — it earns its keep).

P0 · Fix first — public credential exposure

Critical — 1 item

P0-1 · SECURITY

The production login page ships plaintext credentials for 5 accounts — including Admin — as one-click buttons

Present in the SERVED bundle: grep on dist/assets/index-DoLPDwpa.js finds the Quick-login panel (source: src/pages/Login.tsx DEV_ACCOUNTS, marked "DEV QUICK LOGIN — remove before going live"; live since Sep-7) · Admin + Resident + Manager + Faculty + Staff emails and passwords embedded · the 4 non-admin accounts share the weak password Welcome1! · any visitor to the public URL gets one-click Admin sign-in

The platform holds reimbursement ledgers, evaluation text and personnel data, and its admin surface includes the audit-log reverter. An admin credential reachable by anyone with the URL is the highest-severity finding this run can produce; the code comment own says the panel should not exist in production.

Fix: env-gate or delete the panel (import.meta.env.DEV), rotate all five passwords via the GoTrue admin API, rebuild, and prove the served bundle contains zero credential literals; then re-run the rendered sweep on the login page.

P1 · This cycle — 7 items

High — the safety net and the regressions

P1-1 · PROCESS ROOT CAUSE

The Reversion Incident: 19 remediation fixes were destroyed because live-tree edits are silently overwritten by deploys — and git is not a safety net

Fixes applied directly on the VPS tree / container were never committed · every deploy.sh run rsyncs server/ src/ package.json from the repo and reverts them · verified absent today: role source-of-truth, branded PDF, print paging, probe aliases, pools env, rate-limit fix, admin lazy-split, voice purge, gated build, express-5 · repo is 37 commits ahead of origin (last push Sep-4) so CI has never run · recovery audit: no backup contains the fixes (Sep-9 + Sep-17 tarballs checked)

The Sep-17 commits literally call the baseline "stale" ("wip: partial ports on stale baseline — do not deploy"). Every subsequent feature deploys onto a tree whose fixes can vanish again.

Fix: Restore push credentials → commit + push now (37 commits) → make the rule explicit (ADR: never edit live; deploy only from git; live tree gets git for rollback) → re-implement the lost 19 from the Aug remediation log with commits this time.

P1-2 · CORRECTNESS · LIVE USER IMPACT

Role source-of-truth regression — real users mislabeled, two blocked at login, ledgers inflated

Live DB joins: Danzig = CRM Faculty (resident; roster patched manually; eval flags wrong) · Karki + Kassam = Archived → hard 403 at login while their reimb rows stay active (still counted in "active residents") · Allen = Fellow · 5 residents + Sabin Sajin ×2 have empty email/EZ (unauthenticable ghost rows) · 21 "active residents" is really ~12 clean + 4 mismatched + 5 ghosts

The Aug fix (derive role from unified.reimb_persons.beneficiary_type) was in the lost set (34-baseline).

Fix: Re-apply the beneficiary_type resolution in server/middleware/auth.ts (+ expose in /api/me), correct the CRM rows, deactivate graduated rows, resolve the ghost rows.

P1-3 · BUILD/DEPLOY GATES

No gate between code and production: build skips tsc, deploy skips tests, CI never runs

build = vite build only (no typecheck script ever in any commit) · deploy.sh has no test/typecheck step · server tsc currently has 1 real error (eval.ts:481) that ships · ci.yml exists with the right gates but is dead weight (unpushed repo)

Fix: Fix eval.ts:481 → add typecheck + typecheck:server scripts → wire into build or deploy step 0 → restore the push so Actions runs.

P1-4 · PERFORMANCE REGRESSION

Admin lazy-split lost — Admin chunk back to 349.7 KB raw (was 83 KB after the Aug split)

Zero React.lazy in Admin.tsx; all 9 heavy tabs eager · fresh build reproduces 349.7 KB / 56.1 KB gz; prod identical

Fix: Re-apply the proven split (lazy 9 tabs, keep Dashboard/UserAccess/Audit eager) — mechanical, verified pattern from the Aug wave.

P1-5 · DEAD CONTROL

The admin "delete transaction" button calls an endpoint that does not exist

Frontend: api.delete(/api/v1/admin/reimb/transaction/:id) (ResidentReimbProfile) · server: only PUT exists — no DELETE anywhere (263-route scan) · clicking yields an error toast; nothing deletes

Fix: Implement the route (requireAdmin + audit) or remove the affordance — decide which; then add the route-existence CI check (TECH-2).

P1-6 · USER-PRIORITY FEATURES LOST

Print paging and branded PDF export — both regressed to nothing

CallSchedulePrint.tsx:296 hardcodes "Page 1 of 1" again · no pdfkit / no /reports/pdf route / no frontend call — the branded reimbursement PDF is simply gone · institutional documents (GME/PD reports) rely on browser print

Fix: Re-implement both from the Aug remediation log descriptions (they are detailed); verify paging multi-page + PDF branded with real data.

P1-7 · OBSERVABILITY

No failure alerting — the eval-reminder failure ran ~1000 times silently for two days

Logs existed; nobody was told · same class would hide a scheduler stop, a health degradation, an email-path break · SMTP + Telegram alert paths already exist at infra level

Fix: Minimal failure hook: scheduler error counters + health transitions → email/Telegram. Verify with a forced failure.

P2 · Backlog (17) — P3 (17) below

Medium & low — priced, verifiable

#ItemWhere / effort
P2-1Re-apply lost /schedule critique fixes (plural guards "sessions"; "Updates on load" pill)roster/ScheduleViewTab.tsx · 2SP
P2-2ENL vs load-failure split + retry surface in ProtectedRoute (429s show "Email Not Linked")components/ProtectedRoute.tsx · 3SP
P2-3Rebuild voice-session retention purge job per retention-policy.md (currently 0 rows — no live exposure)server/services + scheduler · 3SP
P2-4Off-VPS backup copy + documented RPO/RTO + quarterly restore drillops scripts/docs · 3SP
P2-5Field-level API contract tests (reimb + eval surfaces)server tests · 5SP
P2-6Route-existence CI check from the _api-xref recipe (catches dead calls like RB-1)ci + script · 3SP
P2-7npm audit fix (7 vulns: multer ×4 DoS classes, nodemailer, fast-uri, js-yaml, qs) + retest uploads/emailpackage.json · 2SP
P2-8Consolidate 4 eval-admin surfaces into one command center (R-1)nav + pages · 8SP
P2-9Manager/episodic guards via flags, not category checks; add Fellow + Medical Student to fallback map (R-3/R-5)auth map + App.tsx · 3SP
P2-10Post-mortem/ADR for the reversion incident + "never edit live" deploy ruledocs/adr · 2SP
P2-11Move slop-waivers.md into the repo; delete stale live copies (README/dr.md/e2e)repo + VPS · 1SP
P2-12reimb_persons hygiene: ghosts, duplicates, is_active graduation rule (DI-1/DI-2)data + admin flow · 3SP
P2-13README stack-table refresh + runbook pointer (Express version, roster pool, Postgres reimb)README · 1SP
P2-14Dependency: drop unused `compression`; decide express-5 (skip/retry)package.json · 1SP
P2-15Delete dead duplicate stylesheet src/index.css (main.tsx imports styles/index.css)src/index.css · 15min
P2-16429-burst hardening: review limiter policy for SPA bursts + friendlier messagingserver/index.ts · 2SP
P2-17Auth deep-link aliases for admin tabs (?tab=user-access → users)Admin.tsx · 15min
#ItemWhere / effort
P3-1Self-host Inter/JetBrains fonts (drop fonts.googleapis.com from PHI-adjacent surface)index.html · 1hr
P3-2Prune live-tree junk: dist.old, 5× _bak-*, _clobbered-*, scraper scratch, cookies.txtVPS tree · 30min
P3-3DB-persisted reminder dedup (in-memory window resets on restart)reminderScheduler · 2SP
P3-4Log-noise cleanup: rate-limit IPv6 keyGenerator, pg@9 reentrant-query deprecationserver · 1SP
P3-5Junk rows: empty-email app_access + 2 empty contacts; leftover backup tables; EZ-format varianceDB · 30min
P3-6Public-router contract tests (public-schedule editor, attending-swap)tests · 3SP
P3-7Skip-to-content link (Layout)Layout.tsx · 15min
P3-8Frontend Sentry: wire it or drop the depmain.tsx · 30min
P3-9N+1 spot-check on the heavy list endpoints (schedule matrix, reporting)open verification · 2SP
P3-10Migration prefix collisions (2×026, 2×027) rename hygienemigrations · 15min
P3-11"spender delta on empty month" copy — suppress -100% when $0Dashboard · 15min
P3-12Motion/reduced-motion explicit guard in CSS (motion is minimal; belt-and-braces)index.css · 30min
P3-13Label-the-dash sweep (any remaining bare "—")dashboard cards · 30min
P3-14e2e live copy refresh (api.spec.ts targets retired /api/qgenda path)e2e · 15min
P3-15Runbook: document cron entries (backup, OR-eval feeder) in repo ops/docs · 30min
P3-16Write the missing regression test for eval-reminder date normalizationtests · 1SP
P3-17Prune ~12 dead endpoints after external-consumer grep (swap-requests, colleagues, team-list, upcoming/float-shifts, reimb/trash…)server routes · 2SP
Quick wins (time-boxed) — this week

Highest-value, lowest-effort

P0: env-gate/delete the credential panel + rotate 5 passwords + prove the bundle is clean
Fix eval.ts:481 → add typecheck scripts → wire the gate (P1-3 unblocked)
Delete dead src/index.css (main.tsx imports styles/index.css) — kills the edit-the-wrong-file trap
Restore git push credentials; commit + push the 37-commit backlog (safety net back on)
Copy slop-waivers.md into the repo (it is live-only today)
Add ?tab=user-access → users alias (bookmark rot)
Re-scan the bundle for credential literals after SEC-1; re-run the rendered sweep on /login
Off-VPS copy of /var/backups/unified (one rsync line) — cheapest DR upgrade
Page flow & journeys · artifact 29

Every happy path works end-to-end; the failures cluster around artifacts & failure-states

J1 Resident reimbursement: dashboard → ledger → submit (draft/upload/submit) → status — ≤3 clicks, states legible. Gap: no branded PDF download.

J2 Manager call-out: /scl intake (PIN, 3–4 digit date, no-replacement notice) → /coverage (reassign/float/assign) → notifications (test mode). Rebuilt Aug–Sep; verified rendered + source.

J3 Admin review→report: review queue → inline actions (audited live) → Reports Explore/saved views/CSV → fund views. Rough edges: dead delete-transaction (P1-5), tab alias (P2-17).

J4 Faculty eval + swap: eval links + /call-swap (authenticated in-portal) + /attending-swap standalone. J5 Schedule studio: OR-per-row procedures, helper pickers, templates, pool/blocks — richest surface, renders healthy; regressed pill/plural fixes (P2-1).

Flow findings: PF-1 dead-end only on the failure path (ENL vs load-failure) · PF-3 two category-based guards drift from the flag system · PF-4 four separate eval-admin nav items · PF-5 the print journey breaks at the artifact step. Verified: all retired URLs redirect correctly (no nav dead ends).

Architecture · artifacts 01–02

Sound shape; the structural risk is the deploy loop

React 18 + Vite SPA (32 routes) → Express 4.22 (tsx runtime, node 20) → 4 PG pools (postgres / urology_roster / milestone_evaluations / or_schedule) + legacy SQLite import path. 26 routers all mounted (263 routes); 21 v1 mounts + 5 public routers; boot migrations fail-loud; health endpoint genuinely deep (5 pools + migrations).

Structural risk (P1-1 class): deploy = one-way rsync from the repo working tree into a non-git live directory — any live-side edit is silently reverted on the next deploy; there is no server-side history for rollback. That loop is exactly how 19 fixes died and is the single change with the highest blast-radius reduction.

Hygiene: dead duplicate src/index.css; stale live copies of README/dr.md/e2e contradicting the repo; ~12 no-caller endpoints; 15 .bak files; live tree doubling as a scratch workspace (scrapers, cookies.txt, 1.1 GB incl .venv/dist.old).

Code review Δ since Aug-20 · artifact 03

New wave is clean; the Δ is the reversion set

Positives (verified): Admin Reporting (+migrations 030/031) fully gated and audited; token discipline near-perfect (3 literal grays across admin); zero TODO/FIXME; public routers have documented access policies; reminder fix proven in logs (0 failures in 10 h).

The Δ review found: CR-1 reversion incident · CR-2 role regression · CR-3 admin split · CR-4 critique-fix reversion · CR-5 live-tree pollution · CR-6 debris/stale copies · CR-7 runtime warnings (rate-limit IPv6 active in logs; pg@9 deprecation) · CR-8 migration prefix collisions. Every one is dispositioned in the ledger and backlog.

Data integrity · artifact 08a

Referential integrity clean; people-layer hygiene is the work

Migrations all applied (through 031, tracked + fail-loud). FK orphans: 0 on reimb allocations/submissions/files. Call-schedule current (2026-07 → 2027-01, 561 rows). No seed-drift trap (the old 503 class absent).

People-layer: 9 active reimb rows with no email/EZ (5 ghosts + duplicates) · 2 archived-but-active residents · 1 junk empty-email app_access row + 2 empty contacts · leftover backup tables in-schema · EZ format variance (000517772 vs 517772) breaks ez-id joins. All priced in P2-12/P3-5.

Dependencies · artifact 04

Lean and complete — with 7 known vulns

32 prod + 29 dev deps · npm ci clean-install exit 0 · npm ls missing = 0 · @e965/xlsx present (the Aug P0 class is gone). Real unused deps: 1 (compression).

Vulns (prod): 7 — 4 high, 3 moderate — multer (4× DoS classes; uploads are live in reimb), nodemailer (IDN domain bypass + legacy resolveContent file access), fast-uri (SSRF/host-confusion badges), js-yaml, qs via express. `npm audit fix` available. → P2-7.

Test health · artifact 05

163/163 green — deep where it matters, thin everywhere else

163/163 pass (3.56 s) in a clean throwaway against the live DBs; integration tests isolate safely (900000+ id ranges with hard-delete cleanup; roster write-path on a disposable clone DB with clean skips). Security area coverage 94.7% (twilio/vapi signatures, eval/editor tokens, caps, GR compliance).

Honesty anchor: overall coverage 2.04% — pages/routes/services ≈ 0. CI exists but has never run (unpushed). 2× act() warnings. Missing regression test for the eval-reminder date class (P3-16). Testing dimension capped accordingly (≤5.5).

Documentation · artifact 06

Ops docs accurate; README stale; the incident has no post-mortem

dr.md + restore.sh verified against live behavior (backups ran today 03:05). Commit messages are receipt-grade. Stale: README stack rows (Express 4.21, "Prisma QGenda", "SQLite reimb", shadcn) · live copies of README/dr.md/e2e contradict the repo (say QGenda where code says roster) · slop-waivers.md exists only on the VPS (same loss risk that killed the fixes). No ADR/post-mortem for the reversion incident → P2-10/P2-11/P2-13.

API surface · artifacts 08 + 15

263 routes, 26 mounted routers — one dead frontend call found

Every frontend call (117 extracted) cross-referenced: 1 real dead call — the DELETE transaction route (P1-5). 4 other "unmatched" were scanner artifacts (fetch-with-POST, dynamic suffixes) and were mis-flagged, corrected, and verified by hand. Health probes: real paths /api/health/ready|live = 200; /api/ready|live aliases still 308 (lost — cosmetic, in 34). Swagger + contract test live. ~12 endpoints have no in-app caller (verify-then-remove list).

Gaps: no field-level contract tests (CT-1) and no route-existence CI check (CT-3) — the tools that would have caught P1-5 in CI.

Mobile · artifact 09

Rendered at 390px: no overflow, drawer works

423 responsive utilities; `lg:hidden` slide-in drawer + backdrop verified opening at 390×844; 44×44 targets on new controls. Rendered spot-check (5 routes, touch): no horizontal overflow on any route, zero console errors. Dense schedule grids scroll inside their containers, not the page. Older h-9 controls remain a polish item.

Design quality & strategy · artifacts 10a–10b + 26 + 28

Strong system, verified under both themes

Impeccable gate (mandatory): 7 findings — one family (the semantic colored left-edge bar) — all previously waived with recorded reasons (slop-waivers.md, Sep-17); zero new findings, zero drift. Token discipline near-perfect (3 literal grays across admin; CoverageCenter 0).

Rendered: both themes verified on 35/35 routes (dark rgb(8,9,10) ↔ light rgb(238,240,243)); fonts Inter + JetBrains Mono (computed); motion restrained (0–7 animations/page; tokenized easings); above-fold is real working content everywhere; honest empty states. Light-theme contrast now passes at token level (tertiary 4.8:1 AA). Sep-14 lens F1/F2/F4 resolved; F3 substantially improved; F5 not reproduced.

Open design items: dead stylesheet (P2-15) · the login dev panel (P0-1) · ENL failure-state redesign (P2-2) · self-host fonts (P3-1).

Deploy, IaC & DR · artifacts 17 + 21 + 30

Deploys work; the release discipline doesn't

deploy.sh verified accurate (rsync → conditional npm install → vite build in container → restart → health gate). Container compose-managed, restart=unless-stopped, up since 00:55 with 0 restarts. Backup suite runs daily 03:05 (4× pg_dump + uploads + env, 14-day retention; ran today).

Gaps: no gate step in deploy (P1-3) · live tree not git + fixes lost (P1-1) · 37 unpushed commits (P1-1) · no restore drill (P2-4) · no off-VPS backup copy (P2-4) · RPO 24 h / RTO undocumented. Integration probes: clean-install PASS, byte-identical build PASS, health PASS, signature gates PASS, cron integrity PASS, bundle-credential scan FAIL (P0-1), git/Actions FAIL (P1-1).

TypeScript · artifact 07

Client 0 errors; server 1 — and nothing checks either at deploy

tsc --noEmit client (strict) = 0 (verified twice; an earlier 2-error reading was a harness artifact and was retracted) · server (strict) = 1 real error: routes/eval.ts:481 null→string|number|undefined. 264 explicit `any`/`as any` remain (burn-down item). No typecheck script exists; build skips tsc → P1-3.

Performance & bundle · artifacts 22 + 10 (+ live Lighthouse)

Fast server, honest client weights — one regression

Lighthouse (live, today): /login 80 perf · 95 a11y · 100 BP · 82 SEO (LCP 3.8 s, CLS 0.001, TBT 0 ms) · /public-schedule 87 · 100 · 96 · 45 (LCP 3.2 s). Server-response 0–10 ms.

Bundle (reproduced byte-identical): 8.0 MB dist · 58 chunks + 58 gz · Schedule 568 KB raw/99 gz · vendor-charts 435 · xlsx 364 · Admin 350 raw (lazy-split lost — P1-4) · index 335 · gzip pipeline healthy. P1-4 is the single biggest client-perf lever; LCP improvement path = fonts self-host + hero trim (P3-1).

Page-flow & realtime/lens audits · artifacts 29 + 13 + 14 + 16

Events, identity threading, accessibility

Event architecture (13): scheduler trio runs idempotently (reminders verified every 30 min since the fix; swapIntervention live; ptoReminder documented no-op). Voice-purge job missing (P2-3; 0 rows currently). No failure alerting (P1-7). VPS crons (OR-eval feeder 22:30; backups) verified present.

Identity (14): req.user threaded via JWT→CRM+DB with fail-closed flags; audit trail live (482 rows; write actions logged). Role regression = P1-2. EMAIL_MODE=test is a deliberate built-but-suppressed state — flip deliberately at go-live.

Accessibility (16): A11y 95–100 live; Table primitives with captions/scope; focus-ring tokens; 44px targets in new UI. Open: skip-link (P3-7), reduced-motion guard (P3-12). Substitution note: design-gate.py absent in this profile → impeccable detect + rendered sweep used.

Role experience · artifact 31

Right architecture, wrong source data

role_defaults (8 roles) + per-user app_access overrides + fail-closed — the right pattern, admin-editable, audited. The experience defects are data/metrics: P1-2 role regression (largest user group affected), Manager guards via category checks (P2-9), four eval-admin surfaces for one persona (P2-8), Fellow/Medical Student missing from the hardcoded fallback map.

Verified by nav/guard mapping + live DB probes: 8-role × 12-surface matrix in artifact 31.

Baseline disposition (all prior reports) · artifact 34

The ledger: what held, what died

✅ Held: B-01 dedupe (structure re-architected Sep-9), B-07 swap SQL safe, B-08 admin kit (near-zero bypass), FIX-13 DR (healthy backups), /schedule critique fixes #1/#4/#5, eval-reminder fix (Sep-18), /dashboard 404 fix, F2/F4 light+avatar fixes.

🔴 Regressed (the lost set): B-02 role SoT · B-03 gate · B-04 PDF · B-05 print paging · B-06 aliases · B-10 pools env · FIX-11 rate-limit · FIX-14 admin split · FIX-16 partial · FIX-17 voice purge · FIX-18 CI · FIX-19 express 5 · critique fixes #2 (partial)/#3.

⏳ Verified this run: F1 ✅ F2 ✅ (token-level) F3 improved F4 ✅ F5 not reproduced; Lighthouse re-measured; impeccable = same 7 waived.

Net: 12 resolved/still-true · 11 regressed · 3 superseded · 8 verified-this-run.

Logic & policy verification · artifact 32

Money math and window rules are test-backed

Reimbursement caps ($1,250/AY GME, $10k/CY stipend class) verified via the passing cap/access suites (94.7% area coverage) + fund rows live; submission→review→approve gate audited live; eval 2×/AY pair cap tested; date-window logic TZ-safe with the reminder fix. Policy gaps: role→access math wrong for mislabeled users (P1-2), `is_active` graduation rule undefined (P2-12), manager guards non-flag (P2-9). Never assumed — every row carries its receipt in artifact 32.

Operational reporting · artifacts 33 + 26 (merged)

Reports got stronger exactly where trust matters

Admin Reporting rebuild (Explore + Reports + saved views + CSV; cents on totals; requireAdmin; audited) = the flagship. GME fund status, SCL analytics, coverage center, schedule reports, eval tracker all answer real operational questions. Weaknesses: people-layer over-count (P1-2/P2-12 feeds reports), PDF/print artifact regressions (P1-6), no scheduled digests (recommendation), chart-level review still open (P3-9).

Accessibility AAA note & ops misc

Session log

Read-only run: zero application changes. Two harness corrections were logged (evidence integrity): the anchored-rsync fix (retracted 2 fake tsc/build findings) and the /api/v1 prefix matcher fix (retracted 114 fake unmatched calls). Both are in artifact 23 so the retraction trail is auditable. Rendered evidence (70 captures + mini + mobile) lives on the VPS at /opt/webcapture/ce-full-20260918/.

Backlog · artifact 12 (epics, priced)

42 findings → 1 P0 · 7 P1 · 17 P2 · 17 P3

Epics: SEC-1 (P0, 3 SP) · COR-1 role (8 SP) · OPS-1 safety net (5 SP) · OPS-2 gates (3 SP) · OPS-3 alerting (3 SP) · COR-2 dead route (2 SP) · PERF-1 split (3 SP) · UX-1 artifacts (5 SP) · UX-2 critique re-apply (2 SP) + the P2/P3 tables above (full text in artifact 12). Every P1 is committed-by-default: re-implement with a commit, deploy through the gate, verify live.

Total priced: ~58 SP core sprint + ~45 SP P2 sweep. Nothing in the list requires new architecture — this is disciplined re-application of proven patterns plus one security fix.

Roadmap · artifact 11

2-week sprint → 6-month vision

Projection after the sprint: ≈8.0–8.3 (each move re-verified live before its score moves — rule 12). Non-goals for 8.0: full coverage program, express-5, multi-host DR.

What to add next · feature recommendations (forward-looking)

Five ideas worth building — grounded in this run's evidence

System Health tab (admin)

One screen answering "is everything running?": 5 pool statuses, last backup age, scheduler last-runs/error counts, last email sent, deploy SHA. Ties directly to P1-7 and kills the silent-failure class where it starts.

Eval Command Center

Merge the four eval-admin surfaces into one tabbed hub with per-cycle progress rings ("who still owes evaluations") — the consolidation the role lens has flagged twice (P2-8).

Weekly digests (email)

Program-spend + coverage + call-out digest Sundays via the existing SMTP path, reusing saved views as the query layer. Pull-based reporting becomes pulse-based.

Schedule change log (weekly diff view)

A before/after view of the week's schedule edits (who changed what, when) — the audit middleware already records the writes; surface them as a readable diff for the coordinator.

Staff PWA quick-actions

Installable PWA with shortcuts for the two staff flows that happen away from a desk: report a call-out and check today's coverage. SCL is already the most mobile-shaped module.

Design & UX recommendations (forward-looking) · rendered evidence

What to change visually — from the 70-capture sweep

Login page, minus the panel

Remove the credential panel (P0); the login design itself is strong — keep the value strip, tighten LCP with self-hosted fonts (3.8 s → target <2.5 s).

Failure states that tell the truth

Split "Email Not Linked" (a data state) from "couldn't load your profile" (a temporary state with Retry) — the sweep caught 429s producing the misleading dead-end.

Admin per-tab payload diet

Re-apply the lazy-split (P1-4) and add per-tab loading skeletons — admin opens should feel instant like the rest of the app does.

Print & PDF artifacts

Restore real page numbers + branded PDF headers/footers — the print path is the last rough surface for institutional documents.

Micro-polish pass

Label remaining bare "—" states, suppress "-100%" delta on empty months, alias admin tab deep-links, add a skip-link. Small, visible, cheap.

Integration probes (live) · artifact 30

The probes that separate "looks fine" from "is fine"

Clean-install reproducibility PASS (npm ci exit 0, zero missing) · declared-vs-installed PASS · ambient build PASS (hash-identical to served dist) · live health PASS (5/5 pools) · auth POST-path behavior PASS · supervisor/script drift PASS · cron integrity PASS · integration-test wins PASS (163/163) · domain capabilities PASS (reminders firing since fix; backups ran today) · suppression knobs audited (EMAIL_MODE=test, declared) · served-bundle credential scan FAIL (P0-1) · git/release probes FAIL (P1-1) · DNS/TLS PASS.
Post-audit re-run (2026-09-18 evening): served-bundle credential scan PASS (0 literals) · git/release PASS (repo == origin) · login render PASS (panel gone, form clean) · tests / typecheck / route-guard / vulns re-run PASS — see the delta re-score.

REMEDIATED — 6.4 → 6.9 / 10

verified by ce:full · staged run (S1–S5) · Sept 18, 2026 · honest scoring min(rubric 6.5, matrix 6.4) · status REMEDIATED (audit-day read-only run; Lighthouse run on public pages; auth-gated pages covered by the rendered sweep instead) · delta re-score 6.4 → 6.9 (2026-09-18)

1 P07 P117 P217 P3✓ build byte-identical to prod✓ 163/163 tests✓ backups ran today✓ rendered 35×2 themes, 0 pageerrors✓ P0 closed · delta 6.9~58 SP sprint

Gate conditions for a FULL certification: ✓ P0-1 closed (panel removed · bundle proof · rotations) · ✓ lost set re-applied via commits · ✓ gates on + repo pushed · ✓ role SoT live-verified · ✓ restore drill + offsite backup · remaining: full staged delta run ≥ 8.0 (interim delta re-score 2026-09-18: 6.4 → 6.9)