cp-j0gw.11: interactive M01 cohort-floor demo widget - #2
Conversation
Adds a standalone, mobile-readable widget that lets readers drag a slider between 16 and 30 and watch which illustrative programs flip between MEASURED and NOT MEASURED. Demonstrates M01 (cohort-visibility cascade) without any institutional data. New files - web/widgets/cohort-floor-demo.html — standalone page; mirrors the top-disclaimer + public-data-badge patterns from web/learn.html on cp-0on-ext-senate-plain-lang. - web/widgets/cohort-floor-demo.js — vanilla ES module. Exports computeVerdict / summarizeAt / detectFlips for unit testing; auto-wires the slider on DOMContentLoaded. - web/widgets/cohort-floor-demo.d.ts — type declarations matching the existing web/js/*.d.ts pattern. - web/widgets/cohort-floor-demo.css — page-specific styling, including inline copies of the public-data-badge + top-disclaimer rules so the page stays self-contained on main (where css/learn.css does not yet exist). - tests/ui/cohort-floor-demo.test.ts — 12 unit tests for the verdict-flip computation, including the cp-wssr AHEAD-published-flag override. Modified - web/index.html — adds a third persona-card linking to the demo. Spec hooks - Slider 16↔30 (cp-wssr methodology range). - 12 illustrative programs, synthetic completer counts, labeled "illustrative" on the page. - Caption cites M01 + cp-wssr + NPRM § 668.403(d)(1) + HEA § 454(c)(4)(A). - No external requests, no analytics, no LLM at request time. - Mobile viewport meta tag + touch/keyboard slider. Tests: 209/209 passing (197 baseline on main + 12 new). typecheck clean. Note: the bead requested a link from web/learn.html; that file lives only on cp-0on-ext-senate-plain-lang, not on main. Chair to add the learn.html link when that branch merges. Refs: cp-j0gw.11
Updates the Status section from "pre-implementation" to: - v1 (cp-0on epic) shipped 2026-04-30 with 197/197 tests - v1.1 (cp-j0gw extension) in PR review as of 2026-05-05 with pointer to docs/cp-j0gw-ext-changelog.md and the 3 stacked PRs (#1 main, #2 widget, #3 systemwide) Adds new Routes table covering: /, /persona-a, /persona-b, /learn/, /sources, /comment-draft, /widgets/cohort-floor-demo, /api/v1/... Each route tagged with its primary audience so a reader can find the right entry point without spelunking the codebase. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…hair review #2) Four refinements to the cp-j0gw.8 systemwide-context one-liner per chair recommendation: BUGS (build script) - data/build/build_systemwide_context.py: collapse runs of whitespace in cip4_title (source CSVs arrive with double spaces inside titles like "English Language and Literature General"). Renders cleanly now: "English Language and Literature General". - Empty title now stored as "" (not literal "(unknown)"); the UI omits the parenthetical entirely when missing rather than rendering "CIP 5006 ()". - Side effect: CIP 5006 now correctly resolves to "Film/Video and Photographic Arts" — earlier "(empty)" appearance was an artifact of the unified-exposure CSV ordering, not a true gap. UI REFINEMENTS (web/js/render.js) - Gate on n_unique_campuses >= 2: when only one CSU campus surfaces this CIP, the line "across 1 of 22 campuses" reads as false comfort. Suppress the systemwide-context line entirely in that case (no "systemwide context" if only the one institution shows it). - Source line now hyperlinks to /sources.html ("public data sources") instead of monospaced corpus path. Drives readers to the central provenance page; better UX. - Title fragment guarded: omit the parenthetical when title is empty/whitespace. Wording approved as-is in chair review: - "shows N exposure cells" — neutral, ties to senate-packet terminology - "of 22 CSU campuses" — correct denominator (1 campus has zero exposure cells; "of 23" would falsely imply otherwise) - A/C/D/E breakdown order — matches senate packet exactly content/systemwide-cip-context.json regenerated from the patched build script. 212/212 tests pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…hair review #2) Four refinements to the cp-j0gw.8 systemwide-context one-liner per chair recommendation: BUGS (build script) - data/build/build_systemwide_context.py: collapse runs of whitespace in cip4_title (source CSVs arrive with double spaces inside titles like "English Language and Literature General"). Renders cleanly now: "English Language and Literature General". - Empty title now stored as "" (not literal "(unknown)"); the UI omits the parenthetical entirely when missing rather than rendering "CIP 5006 ()". - Side effect: CIP 5006 now correctly resolves to "Film/Video and Photographic Arts" — earlier "(empty)" appearance was an artifact of the unified-exposure CSV ordering, not a true gap. UI REFINEMENTS (web/js/render.js) - Gate on n_unique_campuses >= 2: when only one CSU campus surfaces this CIP, the line "across 1 of 22 campuses" reads as false comfort. Suppress the systemwide-context line entirely in that case (no "systemwide context" if only the one institution shows it). - Source line now hyperlinks to /sources.html ("public data sources") instead of monospaced corpus path. Drives readers to the central provenance page; better UX. - Title fragment guarded: omit the parenthetical when title is empty/whitespace. Wording approved as-is in chair review: - "shows N exposure cells" — neutral, ties to senate-packet terminology - "of 22 CSU campuses" — correct denominator (1 campus has zero exposure cells; "of 23" would falsely imply otherwise) - A/C/D/E breakdown order — matches senate packet exactly content/systemwide-cip-context.json regenerated from the patched build script. 212/212 tests pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds three new sections to the changelog reflecting the 2026-05-05 evening polecat-return wave and chair-review track: 1. "Stacked PR record" — table of all 5 PRs (#1-#5) with branches, beads, authors, and post-merge test counts. Suggested chair merge order: #1 -> #3 -> #2 -> #4 -> #5. 2. Sub-bead ledger refreshed: cp-j0gw.8, .11, .13, .14, .15 all marked done with PR pointers; cp-j0gw.16 deferred until preview URL is live. 3. "Chair-review track applied" — the 4 reviews iterated inline this evening (#1 disclaimers approved, #2 systemwide refined, #3 groupings applied, #4 prose skipped + bug fix shipped). #5 comment-outline review not yet run. 4. "Smoke-stack record" — verifies all 5 PRs merge cleanly in order with one trivial conflict (web/index.html persona-card stack). Final stacked test count: 249/249. Production lint scan caught 3 dean-facing literal violations (OPEID6 + cascade) in PR #1's surfaces; fixed in commit 0993045. PR #2 (obsidian widget) has one analogous "cascade" literal in link text — surfaced as follow-up note. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Lint follow-up note (no merge block)While smoke-stacking PRs #1–#5 in a temp worktree, the broader-scope lint ( The glossary forbids the literal "cascade" in dean-facing prose; the M-doc identifier This does not block merge — the regression test ( PR #1 had three analogous violations (OPEID6 + cascade) on its own surfaces; fixed in commit Stacking record (all 5 PRs merged in order on a temp branch):
Full record in 🤖 Posted by Claude Code on behalf of crew/anthonybyrnes. |
design.v6 §13 forbids the literal "cascade" in dean-facing UI surfaces. Two surfaces in the cp-j0gw.11 widget commit tripped the linter: - web/widgets/cohort-floor-demo.html footer link text "M01 — Cohort visibility cascade" → "M01 — The cohort-expansion rule" (matches the existing M01 panel header in web/learn.html on cp-0on-ext-senate-plain-lang). - web/index.html persona-card body "the cohort-visibility cascade" → "the cohort-expansion rule" (same substitute). Verification: - npx tsx scripts/lint-glossary.ts content web → no violations - npm test → 209/209 passing on this branch
Stacked PR record updated: - 6 PRs now open (added PR #6, quartz batch-2 explainers M04/M07/M14) - PR #2 carries obsidian's cp-j0gw.17 lint fix (commit 38e236c) - Final stacked test count: 270/270 - Suggested chair merge order: #1 -> #3 -> #2 -> #4 -> #5 -> #6 - Broader lint scan: 0 OPEID6/cascade violations remaining; only formal cite names (STATS NPRM, RIA Table 3.19) kept per M-doc convention. Sub-bead ledger: cp-j0gw.17 + cp-j0gw.18 marked done with PR pointers. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
Adds an interactive demo widget for M01 — Cohort visibility cascade. Drag a slider between 16 (AHEAD
count_wne_p4single-window) and 30 (OBBBA statutory floor, NPRM § 668.403(d)(1)) and watch ~12 illustrative programs flip between MEASURED and NOT MEASURED. Demonstrates the cp-wssr AHEAD-published-flag override for the 16 ≤ n < 30 gap.Files
New
web/widgets/cohort-floor-demo.html— standalone page (mobile viewport, public-data badge, top-disclaimer aside, breadcrumb back to index).web/widgets/cohort-floor-demo.js— vanilla ES module. ExportscomputeVerdict/summarizeAt/detectFlipsfor unit testing; auto-wires the slider onDOMContentLoaded.web/widgets/cohort-floor-demo.d.ts— TypeScript declarations matching theweb/js/*.d.tspattern.web/widgets/cohort-floor-demo.css— page-specific styling, with inline copies of thepublic-data-badgeandtop-disclaimerrules so the page is self-contained onmain.tests/ui/cohort-floor-demo.test.ts— 12 unit tests covering the verdict-flip computation and the AHEAD-published-flag override.Modified
web/index.html— adds a third persona-card linking to the demo.Spec compliance (per cp-j0gw.11)
count_wne_p4is single-window; OBBBA's 30-floor is for the pooled cohort; cp-wssr override honors verdicts in the gaplearn.html)Outstanding
The bead also asked for a link from
web/learn.htmlin the M01 area.learn.htmllives only oncp-0on-ext-senate-plain-lang, not onmain. The chair should add that link when the senate-plain-lang branch merges; the widget itself is self-contained and accessible from the index persona-card.Verification
npm test→ 209 passed (209) (197 baseline on main + 12 new).npm run typecheck→ clean.Test plan
web/widgets/cohort-floor-demo.htmldirectly in a browser; confirm slider works on mouse + touch + keyboard arrow keys.public-data-badgeandtop-disclaimer(system preference).Refs: cp-j0gw.11 · parent epic cp-j0gw