# Plan: Playbook -- moves-as-table + Lane 1 / Lane 2 / TILT considerations; hard one-page-per-category

**Spec/review:** Opus · **Coder:** Sonnet · **Skills:** ponytail, karpathy, honey
**File:** `scripts/assessment_design_playbook.py` (+ test). Source: Michael Miller feedback + user hard constraint: **each category MUST fit one Letter page (shared as PDF).**

## Goal
1. Put **AI-Resistant** and **AI-Forward** moves side by side in a two-column table (saves vertical space).
2. Replace the single Two-Lane/TILT callout with a compact **three-column considerations table**: Lane 1 (Secured) | Lane 2 (Open / AI-permitted) | TILT -- 2-3 brief bullets each.
3. Keep the per-category Technologies That Help grid.
4. Everything for one category fits ONE Letter page.

## Per-category layout (final order)
1. `category-title`
2. **Where It Is Substitutable** -- trim to 2-3 sentences max.
3. **Moves** -- a 2-column table `.moves-table`: left col header "AI-Resistant Moves", right col header "AI-Forward Moves". Each cell = a compact `<ul>` of at most 4 short bullets. Keep the first AI-Resistant bullet's "Start here:" lead. (AI-Resistant stays left/first.)
4. **Technologies That Help** -- the existing per-category `.tech-mini-grid` (keep; compact).
5. **Two-Lane & TILT Considerations** -- a 3-column table `.considerations-table`: headers "Lane 1 -- Secured", "Lane 2 -- Open / AI-Permitted", "TILT". Each cell = 2-3 short bullets from §Content. Remove the old single `.anchor-callout` twolane_tilt callout.

Model semantics (verified): Lane 1 = the secured/controlled anchor lane (identity or authorship evidence); Lane 2 = the open, AI-permitted lane (Sydney Two-Lane). Lane content is principle-level, NOT a repeat of the tactical moves.

## Data model
Replace the `twolane_tilt` string key on each category with `lanes = {"lane1": [...], "lane2": [...], "tilt": [...]}` (lists of short bullet strings). Keep `resistant`, `forward`, `tech`, `vulnerable`, `title`.

## Content to author (verbatim; short bullets, no em/en dashes)

**Discussions**
- lane1: ["Bind every prompt to cohort-specific evidence (a case, a peer's post) so a generic answer visibly fails.", "Gate posting (submit before seeing peers) and grade specificity, not length.", "A generic discussion cannot carry secured weight -- keep its weight low unless anchored."]
- lane2: ["Let students use AI openly to draft, then require a short disclosure of what they kept or changed.", "Keep it low-stakes and formative -- its value is practice, not certification."]
- tilt: ["Post the rubric and two annotated model posts up front.", "State explicitly what AI use is allowed for this discussion."]

**Quizzes and Exams**
- lane1: ["Secure with a large randomized or auto-varied application pool -- recall items alone do not hold.", "Reserve proctoring (Honorlock/Respondus) for the highest-stakes exam only, named last."]
- lane2: ["Use frequent low-stakes checks as open retrieval practice -- AI lookup matters little at low weight.", "Allow AI as a study partner and grade the exam, not the practice."]
- tilt: ["Give a worked model of a strong open-AI correction before any verify-the-AI item.", "State the AI policy for each quiz explicitly."]

**Papers and Written Assignments**
- lane1: ["Secure through documented process: staged drafts, version history, a short defense -- grade the process, not just the product.", "Situate the prompt in internal course material so a reusable prompt cannot answer it."]
- lane2: ["Permit AI for brainstorming or drafting when the graded artifact is the disclosed judgment (an AI-use appendix).", "Keep unsecured drafts low-weight relative to the process-anchored final."]
- tilt: ["Share the rubric plus an annotated model of a strong verification or revision log up front.", "State per assignment which AI uses are allowed and must be disclosed."]

**Projects**
- lane1: ["Secure with milestone check-ins and a dated process or decision log (individual or team) that create a development record.", "Use a unique or local scope (a real dataset, client, or problem) a generic solution cannot fit."]
- lane2: ["Let individual students or teams use AI as a tool and grade the judgment that overrode it, logged in the deliverable.", "Keep exploratory or practice components open and low-stakes."]
- tilt: ["Provide models of a strong AI-use log and a clear rubric before the project starts.", "State the AI policy and the individual-accountability expectation up front."]

**Presentations and Oral Assessments**
- lane1: ["Secure through process evidence (staged pieces, a decision log) plus, for the highest stakes only, a live unscripted check.", "Ground the work in the student's own context so a generic script fails."]
- lane2: ["Allow AI-assisted prep when the student opens by disclosing what AI contributed and what they changed.", "Keep low-stakes practice talks open and formative."]
- tilt: ["Share the rubric and an annotated model before students prepare.", "State what AI use is allowed in preparation and what must be disclosed."]

## CSS (flat editorial, matches reports -- no fills, hairline rules)
- `.moves-table`, `.considerations-table`: `width:100%; border-collapse:collapse;`. Header cells: uppercase 10.5px, `color:var(--accent)`, `border-bottom:1.5px solid var(--gold)`, left-aligned, `padding:6px 10px`. Body cells: `vertical-align:top; padding:8px 10px; border:1px solid var(--border);` no fill; font-size 12px. `break-inside: avoid` on rows.
- Compact `<ul>` inside cells: `margin:0; padding-left:15px; font-size:12px; line-height:1.45;` li `margin-bottom:4px`.
- Keep flat `.section`/`.category-block` (already fill-free). Remove the now-unused `.anchor-callout` rule (or leave it unused -- ponytail, but prefer removing since nothing uses it).
- Tighten `.description-text`/intro spacing to help one-page fit.

## HARD constraint: one Letter page per category
Author for density. If content still overflows in verification, trim in this priority order: (a) shorten the "Where It Is Substitutable" intro, (b) drop the weakest 4th move bullet, (c) tighten cell padding/font by 0.5px. Do NOT drop the tech grid or a whole considerations column.

## Acceptance criteria
1. Each category renders: intro, 2-col moves table (Resistant left, Forward right, Start-here preserved), tech grid, 3-col considerations table (Lane 1 / Lane 2 / TILT).
2. No `twolane_tilt` single callout remains; the 3-col considerations table replaces it.
3. Only Wes-approved tools + Honorlock/Respondus; flat design (no fills/radii) preserved.
4. No em/en dashes; full suite green: `.venv/bin/python3 -m pytest tests/ -q`. Update the playbook test to the new structure (moves table, considerations table cols, lane keys) -- do not weaken tone/content assertions.
5. **Each category fits one Letter page** -- verified by the reviewer via PDF (below).

## Verify (reviewer, Opus)
Regenerate; generate the PDF (`--pdf`, Playwright now installed) and confirm the PDF has exactly ONE page per category (5 categories + the intro "How to Use" page = page count check). Read the diff; re-run suite. If any category spills to a 2nd page, send back to trim per the priority order. Coder != reviewer.

## Workflow
Branch `feat/playbook-tables-lanes` -> implement -> full suite green -> PR against `main`, do NOT merge. Report branch, PR#, verbatim pytest line, files changed, grep confirming the two tables + lane content, and (if Playwright available to you) the PDF page count. Opus does the authoritative PDF page-count check.
