# Plan: Playbook front matter + per-category sample-artifact pages

**Spec/review:** Opus (authored all content, stop-slop/APA clean) · **Coder:** Sonnet · **Skills:** ponytail, karpathy, honey
**File:** `scripts/assessment_design_playbook.py` (+ its test). Adds front matter and a sample-artifact page after each category. Category CARD pages stay exactly as-is (one page each).

## Structure (final)
1. Header + How to Use (unchanged).
2. **NEW front matter**: Key Terms, How to Triage Your Course (with grading-cost table + accessibility + escalation notes). Before "Assessment Categories".
3. Per category: the existing CARD page, then immediately a **NEW sample-artifact page** (its own `.category-block`, so it page-breaks). 5 cards + 5 artifact pages.
4. Footer gains a versioning line.

Target page count: ~2 front matter + (5 x 2) categories = **~12-13 Letter pages**, one page per card AND one page per artifact. Hard constraint: no card or artifact page spills to two pages.

## House rules for ALL new prose (enforced)
- NO dashes of any kind in prose: no `--`, no em/en dash. Use commas, colons, periods. (`var(--accent)` in CSS is fine; that is not prose.)
- Active voice, no empty adverbs, APA number style. This content was already run through stop-slop; keep it verbatim.

## Data-model change
Add a `sample_artifact` key to each category dict: `{"forward": {...}, "resistant": {...}}`. Render function emits, after each category's card block, a second `.category-block` titled "<Category>: Model Artifacts" containing the two models. Content is HTML-ready below (already escaped where needed; render as raw, these are trusted authored strings, not user input, so wrap in the existing markup, do not double-escape the tags).

## Front matter (insert before `<section class="section" id="categories">`)
Render this block verbatim (two `<section class="section">` blocks):

```html
<section class="section">
  <h2 class="section-heading">Key Terms</h2>
  <table class="considerations-table" style="margin-bottom:0;">
    <tbody>
      <tr><td style="width:22%;"><b>Lane 1: Secured</b></td><td>The assessments that certify the grade. Secured one of two ways: an identity control (a proctored or LockDown exam) or authorship evidence (staged drafts, a process or decision log, a short defense). Aim to secure roughly the top 40% or more of total grade weight here.</td></tr>
      <tr><td><b>Lane 2: Open</b></td><td>AI-permitted, lower-stakes work for learning and practice. It does not prove authorship, so keep its weight modest.</td></tr>
      <tr><td><b>Secured anchor</b></td><td>The specific assessment that carries the certified weight. A course needs at least one.</td></tr>
      <tr><td><b>TILT</b></td><td>Transparency in Learning and Teaching. Any move that asks students to verify, critique, or improve AI output ships with the rubric plus two or three annotated model examples up front, so students aim at the target.</td></tr>
    </tbody>
  </table>
</section>
<section class="section">
  <h2 class="section-heading">How to Triage Your Course</h2>
  <p class="description-text" style="margin-bottom:10px;">Before applying any category, find the assessment that carries the most unaddressed risk and secure it first. Work in order:</p>
  <ol style="margin:0 0 14px; padding-left:20px; font-size:13.5px; color:var(--secondary); line-height:1.5; max-width:68ch;">
    <li style="margin-bottom:6px;">List every graded assessment with its share of the final grade.</li>
    <li style="margin-bottom:6px;">Rate each for AI-substitutability: could a student produce it with AI and have it look the same?</li>
    <li style="margin-bottom:6px;">Rank by grade weight multiplied by substitutability. The highest-weight, most-substitutable item is the biggest unaddressed risk.</li>
    <li style="margin-bottom:6px;">Secure that item first using its category page, then work down the list until roughly 40% or more of the grade weight sits on Lane 1 anchors.</li>
    <li>Leave low-weight, low-risk work in Lane 2, open and AI-permitted.</li>
  </ol>
  <p class="subsection-heading">Match the Securing Move to Your Enrollment</p>
  <p class="description-text" style="margin-bottom:8px;">Securing costs grading time. Pick anchors you can sustain at your course size.</p>
  <table class="considerations-table" style="margin-bottom:12px;">
    <thead><tr><th>Securing move</th><th>Grading cost</th><th>Scales to</th></tr></thead>
    <tbody>
      <tr><td>Randomized or auto-varied application pool (New Quizzes)</td><td>Low, auto-graded</td><td>Any enrollment</td></tr>
      <tr><td>Staged drafts or a process or decision log, skimmed</td><td>Low to medium</td><td>Most course sizes</td></tr>
      <tr><td>AI-use appendix or verification log, read closely</td><td>Medium</td><td>Sample above about 40 students</td></tr>
      <tr><td>Recorded walkthrough or defense (VoiceThread)</td><td>Medium to high</td><td>Sample a rotating subset</td></tr>
      <tr><td>Live oral defense or viva</td><td>High</td><td>Highest-stakes only, always sampled</td></tr>
    </tbody>
  </table>
  <p class="description-text" style="margin-bottom:6px;"><b style="color:var(--accent);">Accessibility.</b> Timed exams and live synchronous defenses carry disability and accommodation implications. Coordinate timing extensions and alternative formats with the campus accommodations office before requiring them.</p>
  <p class="description-text" style="margin-bottom:0;"><b style="color:var(--accent);">If you suspect a violation.</b> This playbook prevents substitution by design; it is not a detection tool. If you still suspect a violation, follow the ASU Academic Integrity policy and your college Academic Integrity Officer (provost.asu.edu/academic-integrity) rather than acting on an AI-detector score.</p>
</section>
```

Footer: after "Assessment Design Playbook &middot; ASU Canvas Course Builder" add `<br>Last reviewed: 2026-07-16 &middot; Owner: Michael Miller &middot; Review cycle: each session term`.

## Sample-artifact pages (one per category, rendered right after each card)
Each artifact page is a `<div class="category-block"><h3 class="category-title">{Category}: Model Artifacts</h3>` + an intro line + an "AI-Forward Model" subsection + an "AI-Resistant Model" subsection, each ending with a "Why it earns credit" line. Use `.subsection-heading`, `.considerations-table`, `.body-text`, `.table-list` exactly as the Papers example already validated. The five artifact bodies are in `docs/plan-playbook-artifacts-content.md` (companion file) to keep this plan readable -- author them verbatim from there.

(Coder: read the companion content file for the exact five artifact HTML bodies. Papers is the already-approved prototype; the other four follow the identical two-model structure.)

## Acceptance criteria
1. Front matter renders (Key Terms + How to Triage with the grading-cost table, accessibility note, escalation note) between How to Use and Assessment Categories.
2. Each of the 5 categories renders a card page followed by a "{Category}: Model Artifacts" page with an AI-Forward Model and an AI-Resistant Model, each with a "Why it earns credit" line.
3. Footer shows the versioning line with Owner: Michael Miller.
4. NO dashes in any prose (`grep -nE ' -- ' rendered.html` empty; no em/en dash). `var(--accent)` in style attributes is allowed.
5. PDF: every category CARD is one page and every ARTIFACT is one page (no spills). Report the page-by-page lead line.
6. Full suite green. Update `tests/test_assessment_design_playbook.py`: add checks for front matter (Key Terms, Triage), `sample_artifact` on each category with forward+resistant, footer owner line, and keep the existing card assertions. Do not weaken existing content/tone tests.

## Verify (reviewer, Opus)
Regenerate + PDF; confirm the page map (front matter, then card/artifact pairs), no prose dashes, one page per card and per artifact, content matches the authored copy. Read the diff. Re-run suite. Coder != reviewer.

## Workflow
Branch `feat/playbook-frontmatter-artifacts` -> implement -> full suite green -> PR against `main`, do NOT merge. Report branch, PR#, verbatim pytest line, the PDF page-by-page lead lines, a dash grep, files changed, any criterion unmet.
