# Plan: Verdict-first assurance report, no Unknown Bloom, Assessment Design Playbook

Goal: make the assurance report understandable to a reader who is not inside the
framework, eliminate "Unknown" cognitive-demand weight, and ship a companion
"Assessment Design Playbook". Fold all of it into the skill so every user gets the
same experience. Apply the house style (APA capitalization, stop-slop, neutral tone,
design taste) throughout.

## A. Report structure — verdict-first (`scripts/assurance_report_html.py`)

Reorder and rename the report so the answer leads and the fine print trails. Drop the
"Dimension D/A/C/B/E" codes and all leaked jargon (FIRE, 5DF, `needs_ai_review`,
"counterfeit", "lane") from user-facing text. Keep all deterministic data; only the
presentation changes.

New section order and plain labels:
1. **The Verdict** — tier in a hero, one plain sentence of what it means for this
   course ("Students can complete the graded work with current AI, so the grade does
   not certify their own learning"), plus the headline metrics (grade secured % and
   graded-item count).
2. **What to Change** — the ranked recommendations (verbs rendered APA title case).
3. **The Evidence** — three subsections:
   - *Where the Grade Is Exposed* — substitutability table (Assessment | AI-substitutable? | Why).
   - *What the Course Measures* — the cognitive-demand distribution (see section B; no Unknown).
   - *Whether AI Use Is Addressed* — AIAS presence/level, plain.
4. **The Bottom Line** — the neutral summary.
5. **How to Read This** — data caveats + assumptions, moved to the END.

Acceptance:
- No "Dimension", "FIRE", "5DF", "needs_ai_review", "counterfeit", or "lane" tokens in
  the rendered user-facing text (these may stay in JSON field names, not on the page).
- Section order exactly as above. Existing renderer tests updated to the new headings.
- A reference render of 151110 matches the approved Sample A layout.

## B. No Unknown cognitive demand (`scripts/assurance_inventory.py` + report fold)

1. **Fix discussion module membership.** The module-membership map must resolve graded
   discussions by their discussion `content_id` (the module item's `content_id` equals
   the discussion topic id), not only by assignment id. After the fix, the 8 graded
   discussions in 151110 carry their content module and inherit its MLO Bloom level.
   Add a test with a module whose items include a Discussion referenced by content_id.
2. **Objective instruments that span modules.** An auto-graded objective quiz/exam whose
   own module carries no MLOs (exam-holder or start-here modules) is classified
   **Understand** deterministically (an auto-graded objective instrument cannot exceed
   Understand — same ceiling as the criterion-B cap). `bloom_source = "objective_floor"`.
   This covers Exam 1/2 and the Syllabus Quiz in 151110.
3. **Report fold.** The "What the Course Measures" distribution must show no Unknown when
   every weighted item resolves through steps 1–2. If any weighted item is still Unknown,
   the renderer folds the narrative's `bloom_resolved` map (Claude's inline classification
   of `bloom_content` items) into the displayed distribution and labels the source.

Acceptance:
- 151110 cognitive-demand distribution has 0% Unknown weight; discussions read Understand
  from their module MLO; exams/syllabus read Understand via the objective floor.
- No deterministic-tier math changes (Bloom feeds Dimension C display only).

## C. Assessment Design Playbook (`scripts/assessment_design_playbook.py` — new, ponytail-minimal)

A single generator that renders a styled playbook (HTML, optional PDF) matching the
report's design system (shared CSS: ASU maroon/gold, serif display, warm neutral).

- Title: **Assessment Design Playbook**. NO "Assessment Accelerator" naming anywhere.
- Five categories: Discussions, Quizzes & Exams, Papers & Written Assignments, Projects,
  Presentations & Oral Assessments. Each: what makes it vulnerable, AI-resistant moves,
  AI-forward moves, technologies, and the anchor.
- Content lives in ONE data structure in the script (no external deps, no template engine).
  Prose is original/paraphrased (not copied verbatim from any source), de-slopped, neutral,
  APA-capitalized headings.
- CLI: `--output PATH.html [--pdf PATH.pdf]`. Reuse the report's PDF-export path.
- ponytail: one file, one data dict, reuse the report CSS; no new dependency, no abstraction.

Acceptance:
- Generated playbook contains the five categories and the string "Assessment Design
  Playbook"; contains NO occurrence of "Assessment Accelerator".
- A self-check test asserts the five category headings render and the forbidden string is absent.

## D. Fold into the skill (`skills/assurance-audit/SKILL.md`)

Minimal edits: document the new report structure (Step 4 report order + plain labels),
the no-Unknown Bloom behavior, and the playbook generator (a new optional export in Step 5).
Point recommendation/narrative authoring at the house style (APA + stop-slop + neutral +
Playbook-grounded fixes). No new machinery.

## Out of scope
- No change to deterministic tier / coverage / lane math (except the lane work already
  merged). Bloom and presentation only.
- No embeddings, no LLM client in scripts.

## Verification
- Full `pytest tests/ -q` green on a clean checkout.
- 151110 re-render matches Sample A and shows 0% Unknown Bloom.
- Playbook renders five categories, no "Assessment Accelerator".
- Read the diff by hand before merge. Coder ≠ reviewer.
