# APEX Portfolio v2 — Rock Solid Checklist
_Created 2026-05-23_

---

## Course Builder Kit audit ✓

- [x] Test S1, S2, S5 tabs end-to-end: toggle cards in/out, add custom cards, remove custom cards, export, copy to clipboard
- [x] Test S4 tab: select BSU pattern, select DCS pattern, fill out Step 1 form, copy answers, copy both prompts
- [x] Verify S4 reference file download links work (`v1/Standard4BSU.html`, `v1/Standard4DCS.html`) — relative to Kit location
- [x] Confirm course picker updates the export output (course name appears in copied text)
- [x] Remove dead no-op line in Kit: `div.outerHTML; // just for clarity` in `submitCustomCard`

---

## Bug fixes

- [x] **Sign-out redirect loop** — `signOut()` in `v2/js/auth.js` redirected to `Dashboard.html` (auth-gated → OAuth loop). Fixed to `index.html`.
- [x] **Broken nav link** — All 6 nav menus had a dead `Standard4.html` link. Temporarily disabled, then re-enabled once page was built.
- [x] **Broken playbook paths** — Dashboard linked to `../Video Production Playbook.html` but files live in `v1/`. Copied DCS playbooks into `v2/` and updated paths.

---

## Standard 4 — build it

- [x] Build `v2/Standard4.html` for DCS (Guided Process, based on `v1/Standard4DCS.html`)
- [x] Wire up S4 on Dashboard: `STANDARDS` array updated — `url: 'Standard4.html'`, `key: 'apex_s4_v2'`, `fmt: 'phase'`, `phases: 5`. Fixed hardcoded phase total of 4 → now reads from `std.phases`.
- [ ] After colleagues submit Course Builder Kit configs, paste config here — Claude builds the page, drops it in v2/, and adds the entry to COURSE_PAGES in Dashboard.html
- [x] Decide on naming convention: **separate files per course** — `Standard4-BSU.html`, `Standard4-ETR.html`, etc. DCS stays as `Standard4.html`. Dashboard routes automatically via `COURSE_S4` in `Dashboard.html` — add one line per new course file.

---

## IT request — Google Cloud project

- [ ] Submit request: "Can you create a Google Cloud project under the waukeeschools.org domain, then give me Editor role on that project?"
- [ ] Have this ready when they respond — the redirect URI they'll need for the OAuth credential:
  `https://dashboard.dwtapex.com/v2/auth-callback.html`
- [ ] Once you have Editor access: enable Drive API + OAuth2 API, set consent screen to **Internal** (waukeeschools.org only — no Google verification needed, all school accounts sign in automatically)

---

## Full flow testing (before fall launch)

- [ ] **Student-associate flow**: sign in → course selection → dashboard → all standard pages → check-in → verify check-in appears on dashboard
- [ ] **Instructor flow**: sign in → instructor dashboard → switch courses → heatmap tabs → Associate View → Exit Associate View
- [ ] **New student flow**: first-ever sign-in, course selection, empty-state dashboard — verify all empty states look correct
- [ ] **Dev override testing**: confirm `apex_dev_user` localStorage shortcut still works for local testing without OAuth
- [ ] ~~**Add Henry to Google Cloud Console test users**~~ — not needed if IT sets consent screen to Internal (all @waukeeschools.org accounts sign in automatically)
- [ ] **Test with Henry** (when he's home) — real OAuth round-trip with @waukeeschools.org account, first-time course selection, empty-state dashboard, Drive folder creation on first sign-in, end-to-end file upload to Drive

---

## Dashboard — Quick Links ✓

- [x] Reworked "Your Playbooks" → "Quick Links" with WILC Slack, Google Drive, collapsible Playbooks group, custom links, and drag-to-reorder

---

## Instructor Dashboard — demo/testing

- [x] **Associate View course routing** — was hardcoded to DCS. Fixed to use instructor's own `courseIds[0]`, falling back to `activeCourse` only if it belongs to them. Instructor dashboard renamed to `instructor/dashboard.html` to bust LiteSpeed cache.
- [x] **LiteSpeed cache** — resolved on its own; EHSM/AVS columns confirmed working.
- [x] **Roster backfill** — `backfillRosters()` run successfully; 35 entries added. Test student course_ids still need section-ID updates (see Section-level course IDs section).
- [x] **Instructor demo mode** — `v2/instructor/demo.html` built with simulated data, name-list tooltips on heatmap bars.

---

## Artifact card UI polish

- [x] Replace "+ Up Next" button on cards with 🔖 icon; replace sidebar toggle with "🔖 Up Next · N" showing live count; fix toggle placement (sidebar opens left, button is upper-right)
- [x] Replace standalone "Duplicate" button with a "..." menu containing: Duplicate card, Clear card (wipes link + reflection)

---

## Kathleen Sender — Program Director Dashboard

Kathleen has no `course_ids` (intentional — she's the WILC Program Director, not an instructor). Her current dashboard shows empty rosters. Design needed for a program-wide view. Ping her with these ideas and gather her input.

Brainstormed 2026-05-29. Nothing coded yet.

- [ ] **Program health view** — total active student-associates across all courses; % who have checked in this week; which courses have the lowest portfolio activity
- [ ] **Course comparison table** — each course as a row; columns = avg S1/S2/S5 completion + check-in rate; lets Kathleen see at a glance which cohorts are thriving and which are behind
- [ ] **Instructor engagement signal** — has each instructor's Associate View been used recently (proxy for: are instructors actually using the system with their students)
- [x] **Implementation path** — `isProgramDirector` detection built; program-wide heatmap (`getProgramHeatmap`) built and wired up. Kathleen sees all-APEX heatmap with name tooltips when she signs in.

**Kathleen's specific requests (added 2026-05-29):**
- [ ] **Skill growth over time** — particularly professional skills (S5); show that student-associates are progressing, not just completing cards. Could be artifact completion trend across the semester rather than a static count.
- [ ] **Instructor opportunity coverage** — evidence that instructors are providing *multiple* opportunities for student-associates to demonstrate proficiency, not just one. Heatmap-style view showing breadth of cards across a cohort would address this.
- [ ] **Feedback cycle visibility** — something that surfaces when student-associates are receiving and acting on feedback (connects to S2 Beyond GPA). Could be check-in frequency paired with artifact updates — a proxy for the reflect → improve loop in action.

---

## Future features (post-launch)

- [ ] **Instructor card push** — instructor can add a new artifact card to all student-associates in their course mid-semester (e.g. Lori adds a new skills lab without telling every student to manually add a custom card). Requires: new Sheet tab or column for instructor-defined cards per course, new `getInstructorCards(courseId)` Apps Script endpoint, and standard pages fetching + merging those cards on load alongside defaults. Do not build for v1 launch.
- [ ] **Shared card pool** (name TBD — leaning "Idea Pool" or "The Commons"): student-associates can share custom cards they've created to a browsable pool others can draw from for inspiration. Needs backend write to Sheets + browse UI on Standard pages. Do not build for v1 launch.

---

## Pre-launch polish

- [x] **Mobile nav** — `js/mobile-nav.js` built and added to all 10 student-facing pages. Hamburger ☰ opens a slide-in drawer with Dashboard, Portfolio S1–S5 links, and a pinned Check-In button. Skips instructor dashboard automatically. **Still needs upload + mobile testing at 375px.**
- [ ] **`CURRENT_YEAR`** — already set to `'2026-27'` in `v2/js/config.js` ✓
- [ ] **Apps Script backend** — verify deployed script URL is live; test each action (getUser, getArtifacts, getCheckins, getClassProgress, getHeatmapData)
- [ ] **`saveArtifact` upsert logic** — confirm it matches on `user_id + artifact_id + standard` (not just `artifact_id`) so that un-marking Done writes `done: 'false'` over the existing row instead of appending a duplicate. This is what keeps the per-artifact heatmap counts accurate.
- [x] **Non-DCS courses** — BSU gets Business Startup playbook; all others get no playbook (Mock Client Project was DCS-specific and removed from default). `COURSE_PLAYBOOKS` lookup now resolves section IDs via `SECTION_TO_COURSE`.
- [ ] **Auth callback** — test full OAuth round-trip on the live domain (dashboard.dwtapex.com)
- [ ] **Instructor dashboard loading** — roster and heatmap spinners were caused by a null tooltip crash (fixed 2026-06-02). Verify on live site that roster and heatmap load after the fix. If still spinning, check browser console for new errors and confirm `getClassProgress` returns data for Russ's user ID.

---

## Section-level course IDs ✓

Full design saved in Claude memory (`project_section_ids`). Built 2026-05-29.

- [x] **config.js** — added `CURRENT_SEMESTER`, `FALL_START`, `SPRING_START`, `SECTION_TO_COURSE` lookup table
- [x] **index.html** — `APEX_COURSES` updated with section-level entries for all multi-section courses; `route()` re-shows course picker when `user.courseSemester !== CURRENT_SEMESTER`; `finishOnboarding()` saves `course_semester`
- [x] **Standard1/2/5** — `_courseExt` lookup resolves section IDs → base course via `SECTION_TO_COURSE` before matching
- [x] **Dashboard.html** — `COURSE_PAGES` lookup resolves section ID → base course via `SECTION_TO_COURSE`
- [x] **api.js** — semester param added to `getClassProgress` and `getHeatmapData`
- [x] **auth-callback.html** — reads `course_semester` from profile on sign-in
- [x] **Sheet: users tab** — `course_semester`, `fall_course_ids`, `spring_course_ids` columns added via `migrateSchema()`
- [x] **Sheet: rosters tab** — `semester` column added via `migrateSchema()`
- [x] **APPS_SCRIPT.js** — `getUser` auto-switches Brian's IDs by date; `saveUser` handles new fields; auto-roster tags rows with semester; `getClassProgress`/`getHeatmapData` filter by semester (backward compat); `migrateSchema()` added
- [x] **instructor/dashboard.html** — passes `CURRENT_SEMESTER` to `getClassProgress`
- [ ] **Instructor Sheet data** — update each instructor's `course_ids` to section IDs; set Brian's `fall_course_ids` / `spring_course_ids`; see table in session notes
- [ ] **Test student course_ids** — update multi-section test students (bsu→bsu-g, fbi→fbi-12, ae→ae-bc-34, sport→sport-12, ehsm→section ID); clear rosters tab; re-run `backfillRosters()`
- [ ] **Combined section views** — SPORT and FBI are co-taught; both instructors see same roster because they share a section ID. Verify this works end-to-end once real students sign up.

---

## After colleagues submit Course Builder Kit configs

- [ ] Receive Standard 4 configs via email per Kit Step 4 checklist (subject: "Standard 4: [Course Name]" → rgoerend@waukeeschools.org)
- [ ] Build each Standard 4 HTML file, test it locally, then deploy
- [ ] For each new Standard 4 page built: add that course's artifact titles + briefs to the `BRIEFS` object in `v2/instructor/index.html` — this powers the heatmap label tooltips for that instructor's dashboard
