feat(planning): interview round-format legibility levers (#1042)#1048
Conversation
Interview rounds could present as a wall of dense prose. These levers fix legibility at the producer without changing the frontier protocol (a hard per-round question cap was considered and rejected — it contradicts frontier doctrine and adds latency without information). - Session-hop anchor: the round-header restate re-grounds a resumed reader before any question; per-question context capped at one line, used only when the header restate doesn't reach the question or after a session gap. - Single verdict marker: the `My recommendation:` line is the sole marker — no stacked `(RECOMMENDED)` badge, no repeated tag in the Alternatives list. - Session-shorthand glossary: session-local shorthand defined once at first use and parked in the ledger (distinct from the project's ubiquitous language). - Artifact escape hatch: a dense round can render its whole frontier as an HTML decision-table artifact (rows numbered to the terminal Q<N>, answers still by number, degrading to a fenced markdown table) — a rendering surface, never a round split or question cap. - AskUserQuestion guidance sharpened to simple selections / binary confirms. Guidance-only; no new skill, action, or config. Patch bump 0.24.5. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 34s —— View job PR Review — feat(planning): interview round-format legibility levers
Overall the changes are well-scoped and internally consistent. The guidance is clear, the cross-references between Finding 1 — Stale
|
|
Claude finished @kyle-sexton's task in 1m 7s —— View job Security Review
Scope: 4 files — Finding: No security vulnerabilities introduced. All changes are guidance-only edits to LLM skill documents and a patch version bump. Here is the analysis per security surface: Plugin manifest ( Shell injection (pre-computed context block in HTML artifact escape hatch — The new guidance instructs the LLM to render a dense round as an "HTML decision-table artifact." The content filling the table cells (question text, recommendations, alternatives) is LLM-generated and informed by the user's codebase. If raw codebase strings (e.g. a variable named
No CRITICAL or IMPORTANT findings. No authorization gaps, no secret/credential exposure, no path traversal, no supply-chain risk, no dangerous GitHub Actions patterns (no workflow files touched). |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 77b86732e7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ing in table fallback (#1042) Addresses two P2 review findings on the dense-round artifact escape hatch: - Delivery path was unspecified — "render an artifact and leave a link" gave an agent no actionable mechanism. Now: write a self-contained HTML file to the topic's memory slice (`<memory_dir>/<topic-slug>/interview-round-<n>.html`), give the user its path, ledger/terminal stay the tracked record — matching the repo's HTML-view idiom (knowledge:youtube-digest). - The markdown fallback dropped the recommendation's grounded basis and the round's closing constraint probe, breaking the inline Q&A contract. Now the Recommendation column carries the 2-3 sentence codebase-grounded basis (not a terse label) and the closing probe renders with the table, in both the HTML and the fenced-table fallback — so grounding and the challenge mechanism are preserved. Guidance-only; no behavior/protocol change beyond specifying the surface. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 18s —— View job PR Review — feat(planning): interview round-format legibility levers
What the new commit (1d00f08) addressesThe fix commit targets the two Codex P2 findings and correctly resolves both: Codex P2 #1 — Concrete delivery path ✅ Resolved Codex P2 #2 — Preserve rationale and probe in table fallback ✅ Resolved Claude finding 2 — Column count/name mismatch ✅ Implicitly resolved Remaining issues from the prior reviewFinding 1 — Stale
This sentence is unchanged and still contradicts the lever 3 rule added at line 103:
The reconciliation at line 119 ("in an inline round that marker IS the Suggested fix — update line 79:
Finding 3 — Missing trailing period in
Every other numbered list item in the file ends with a full stop. New minor observation from the fix commit
SummaryThe fix commit correctly resolves both Codex P2 findings and the column-mismatch noted in the prior Claude review. Two items remain open: the |
|
Claude finished @kyle-sexton's task in 2m 16s —— View job Security Review
Scope: 4 files — The new commit ( Finding 1 — HTML artifact cells contain codebase-derived content with no escaping instructionSeverity: SUGGESTION | Confidence: Medium
If a repository contains adversarially crafted content — a filename, comment, or identifier like This differs from the prior review's assessment: that review treated the HTML as a Claude Code in-session artifact (sandboxed renderer); the delivery spec in commit Suggested fix — add an explicit escaping instruction to the "Columns" bullet in
Or restrict the recommendation to markdown-only rendering (the degrade path already does this safely). Attack chain requires repo write access or a malicious dependency with crafted content, so real-world exploitability is low in most consumer threat models. Finding 2 — topic-slug is LLM-derived and used as a path component without sanitization guidanceSeverity: SUGGESTION | Confidence: Low
Confidence is low: this reuses the same path pattern as the pre-existing Everything else is clean
|
|
Both P2 findings addressed in 1d00f08: (1) the dense-round artifact now has a concrete delivery path — a self-contained HTML file written to the topic's memory slice ( |
#1048 (P15a) squash-merged to main, so the un-squashed P15a commits in this branch conflicted with main's squashed + Codex-fixed versions. Resolution: take main's Codex-fixed interview/SKILL.md and loop.md, keep this branch's 0.25.0 version bump + CHANGELOG entry, and re-apply the one audit-answers Composition seam row. Net diff vs main is the P18 skill only. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ct (#1073) Closes #1070 ## Summary Adds `/adhd:clarify`: an on-demand, one-shot reshape of a dense, decision-heavy message already on screen so a reader (especially one offloading working memory) can act on it. It **restructures faithfully** — chunks the content one-decision-at-a-time, defines the session's own jargon, and surfaces exactly what must be decided — and it renders an HTML **decision table** for big content. This is the consumer-side counterpart to the producer-side interview-format levers already shipped (planning PR #1048); where those fix the flagship producer, this rescues any dense artifact reactively. The core discipline: **change STRUCTURE, never altitude**. Lowering the reading level (plain words / ELI5 / lossy simplification) is `education:explain`'s lane; this holds precision and reading level fixed and only reorganizes — it makes the same content clear without simplifying it. ## Fix - **New skill** `plugins/adhd/skills/clarify/` (SKILL.md + evals.json). Default target is the previous assistant response (anaphora); an explicit target overrides. - **Hard fidelity rules** (a clarification of a decision doc must not corrupt the decisions): operative terms of every recommendation quoted **verbatim**; original item numbers kept as **back-links** (distinct from the table's own answer-mapping row numbers); **omissions listed** explicitly; closing line that the clarification is a **lens** — validate answers against the original. - **Artifact-forward** rendering: decision table `item | recommendation | alternative | what-you're-deciding`, rows numbered so terminal answers map back; honors the Artifact tool contract via the `artifact-design` skill; degrades to a local HTML file, then structured terminal markdown, when the Artifact surface is unavailable. Static table — no runtime capabilities declared. - **CRITICAL trigger-collision fix** vs `education:explain` (both auto-fire and default to the previous response): the altitude-vs-structure decision rule is written into **both** descriptions with disjoint triggers, so routing is on intent, not overlapping phrases. All 7 of explain's trigger keywords are preserved (verified by skill-quality's keyword-preservation check). - **In-plugin boundary** line added to `adhd:shape` (standing session posture vs one-shot reshape); its 5 trigger keywords preserved. - Version bumps: `adhd` 0.1.0 -> 0.2.0 (new skill), `education` 0.5.1 -> 0.5.2 (explain routing boundary). Changelogs updated; root catalog regenerated; adhd README updated for the second skill. ### Naming Name **`clarify`** is human-locked (chosen over digest/untangle/decode and the blind-lens picks restructure/chunk — clarify carries faithfulness in the word: make clear without changing substance). The trigger phrase "help me digest this" is kept as a genuine user reflex. ### One PR, not two (deliberate) The two-plugin touch ships as **one PR** because the mutual-exclusion boundary is atomic: splitting it opens a window where either `explain` auto-fires on `clarify`'s triggers (adhd-first) or `explain`'s description references a not-yet-existent boundary (education-first). The two descriptions are a matched pair implementing one disjoint-trigger contract. ## Verification All run locally on the branch (post-rename): - `skill-quality` check — `clarify` PASS (0 errors, 0 warnings; 189/500 lines, desc 1058/1536 chars); `explain` PASS (all 7 trigger phrases preserved); `shape` PASS (all 5 preserved; one pre-existing Gotchas-surface WARN, not introduced here). - `claude plugin validate` — `adhd` and `education` both pass. - `check-changelog-parity.sh --check-bump origin/main` — both bumped plugins have matching `## [<version>]` entries. - `generate-catalog.mjs --check` — catalog in sync. - `validate-plugin-contracts.mjs` — pass. - `check-skill-leaf-names.sh --check` — `clarify` is a unique leaf, no collision. - `check-skill-portability.sh origin/main` — no coupling tokens. - `markdownlint-cli2` on changed docs — 0 errors. - `clarify` `evals.json` — valid against the bundled schema (5 cases). ## Related - Refs #1065 (visualize plugin) and #1068 (presentation/output taxonomy category) — adjacent output-presentation work; clarify is comprehension-driven restructure, visualize is form-driven rendering. - Refs #1042 / PR #1048 — the producer-side interview-format levers this complements. --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Closes #1042.
What
Legibility levers for
/planning:interviewrounds, fixing the wall-of-dense-prosefailure at the producer without touching the frontier protocol.
My recommendation:is the sole marker — no stacked(RECOMMENDED)badge, no repeat tag in AlternativesQ<N>, degrading to a fenced markdown table) — a rendering surface, never a round split or question capAskUserQuestionscoped to simple selections / binary confirmsLever 2 (a hard per-round question cap) is deliberately rejected — it
contradicts frontier doctrine (the whole frontier is one numbered set) and adds
latency without information. Lever 5 gives a rendering escape hatch instead.
Where
skills/interview/SKILL.md— per-question template (levers 1, 3), Questionsurface (levers 5, 6), Recommended-answers reconciliation (lever 3), Step 2
restate (lever 1).
skills/interview/context/loop.md— progressive-disclosure detail: session-hopanchor, artifact column spec, session-shorthand glossary shape.
CHANGELOG.md+plugin.json— patch bump 0.24.5 (guidance-only).Verification
markdownlint-cli2clean on all touched files.skill-quality:check interview→ PASS, 0 errors. Two WARNs are pre-existing(SKILL.md soft-cap >200, and the description's non-
Use when:trigger style),neither introduced here; all 5 base-ref trigger phrases preserved.
Related
branch; both touch interview SKILL.md). Not closed by this PR.
Notes
🤖 Generated with Claude Code