# Session 0017.0 — Transcript > App: vscode-cowriting-plugin > Date: 2026-06-10T23-52 → 2026-06-11T06-59 (PST) > Type: brainstorming > Goal: Brainstorm Feature #17 (diff-view toggle) into its Solution Design — > the baseline fork (turn start / last accept / save / pinned) is the > load-bearing decision; constraints and non-goals in the issue body. > Outcome: **Spec graduated** — content `specs/coauthoring-diff-view.md` > (F6, v0.1.0, commit `36bc4e3`). All forks resolved; INV-18/INV-19 added. ## Launch prompt ``` /goal Brainstorm Feature #17 (diff-view toggle) into its Solution Design — the baseline fork (turn start / last accept / save / pinned) is the load-bearing decision; constraints and non-goals are in the issue body ``` ## Plan Brainstorm Feature #17 (diff-view toggle) into its Solution Design. - Read issue #17 (constraints + non-goals in the body) and the existing F2–F5 specs/code as input. - Work the load-bearing decision first: the **baseline fork** — what the diff view diffs *against* (turn start / last accept / save / pinned). - Explore the remaining design forks, write the Solution Design under the content repo's `specs/`, graduate it at finalize (autonomous default). ## Pre-session state - `main` at `611a180` (PR #16 — proposal threads decide-only fix), in sync with origin. Epic #1 fully shipped (F2 #4 · F3 #6 · F4 #12 · F5 #14). - One dirty file: `sandbox/playground.md` — a 1-line accidental truncation ("thre" for "thread") left from the operator's manual play before this session. Noted at init; restored at finalize. - Memory resume pointer (f5-cross-rung-shipped): "Next /goal: Brainstorm Feature #17 …" — exactly this session's goal. - No other in-flight sessions; claim of 0017 was uncontended. ## Turn-by-turn arc 1. **Init** — classified the `/goal` as brainstorming; claimed session 0017 (`--type brainstorming`, start 2026-06-10T23-52); seeded the Plan block; verified the CLAUDE.md org-context import; confirmed the baseline (noting the playground stray); resolved app facts (roadmap = this repo; content = `vscode-cowriting-plugin-content`; **no BDD corpus** — nothing to consume as gherkin input). 2. **Anchor gate** — fetched issue #17 from Gitea (`gitea-api.sh`, git.benstull.org): `type/feature`, P2, constraints + firm non-goals in the body. Eligible brainstorming anchor (R3: a feature produces its design first). 3. **Context exploration** — read the F4 spec (`coauthoring-propose-accept.md`) as the form reference, plus `model.ts`, `liveTurn.ts`, `proposalController.ts`, `extension.ts`, `store.ts`, and the seam (`attributionController.ts:232`). The decisive structural fact: **INV-9 + INV-10 mean the machine writes the document only through `applyAgentEdit`, only at accept time — so between machine landings, every buffer change is operator-authored.** 4. **The baseline fork (load-bearing)** — resolved to a **machine-landing–anchored auto-baseline + human pin**: initialize at first track, advance on every successful seam application; the diff is operator-authored *by construction* (new **INV-18**). The issue's other candidates fell away on the merits: turn-start collapses into accept under F4's propose-by-default (the document doesn't change at turn start); last-save duplicates native compare-with-saved/local-history; fixed session-start mixes machine landings in; a multi-baseline selector is YAGNI (pin covers the operator-chosen epoch). 5. **Secondary forks** — snapshot home = extension workspace storage via a vscode-free `BaselineStore`, never the sidecar (**INV-19**: no cross-rung contract impact, no `.threads/` churn); whose-changes = whole-document diff, no F3 filtering (state-not-history); view primitive = native `vscode.diff` with readonly `cowriting-baseline:` left and the **live document** right (editing continues in the diff view); landing signal = one additive `AttributionController.onDidApplyAgentEdit` event (one ingress → one signal); keybinding `ctrl+alt+d`. 6. **Spec written** — `coauthoring-diff-view.md` (F6), the full Solution Design form (handbook §3.3, F4/F5 precedent): BUC/PUC, INV-18/19, architecture (BaselineStore + DiffViewController + seam event), alternatives table, testing strategy (unit + host E2E, no LLM), failure modes (stale-epoch states are visible and pin-recoverable), 4-slice delivery plan, traceability to #17's acceptance. 7. **Self-review** — placeholder/consistency/scope/ambiguity pass; one fix (named `renderIfOpen` as the `ensureBaseline` hook). 8. **Finalize** — restored the playground stray; submitted the spec `--status graduated` (autonomous default) → content commit `36bc4e3`; synced the local content clone; memory updated (`f6-diff-view-spec-graduated` + index; cleared the stale Next /goal in `f5-cross-rung-shipped`); published this transcript. No wrong turns of substance this session; the one mid-course correction was realizing publication of the spec belongs to finalize's `submit-spec.sh` (not a hand commit/PR), and authoring the spec directly in the content repo's working tree as its canonical home. ## Deferred decisions _Autonomous-mode low-confidence calls the driver made and would have liked operator input on. Surfaced at finalize._ - **Absorb-on-advance semantics** (spec §6.7): the baseline advances to a whole-document snapshot at each machine landing, so operator edits made *before* an accept disappear from the diff ("my changes since the machine last landed", not "my whole session"). The alternative — splicing the accepted replacement into the baseline so older operator edits stay visible — was deferred as an additive refinement (murky edge cases when the machine edits operator-authored-since-baseline text). Confident in the invariant (INV-18 holds either way); less confident the absorb semantics match operator intuition — pin + the epoch-naming diff title are the mitigations. - **Default keybinding `ctrl+alt+d`** for `cowriting.toggleDiffView` (spec §6.7): chosen over `cmd+alt+d` (macOS Dock toggle) and `cmd+k d` (taken by compare-with-saved); cheap to change. - **Spec authored directly in the content repo working tree** (`vscode-cowriting-plugin-content/specs/coauthoring-diff-view.md`) — its canonical home — rather than a scratch `specs/` dir in the plugin repo; finalize's `submit-spec.sh` publishes from that path. - **Restored `sandbox/playground.md`** at finalize (discarded the 1-line pre-session truncation, restoring the committed text) — judged stray damage from manual play, not work; flagged here since discarding an operator working-tree edit is not reversible. ## Cut state (end of session) | Repo | State | | --- | --- | | `vscode-cowriting-plugin` | `main` @ `611a180`, clean, in sync (playground stray restored; no code changes this session) | | `vscode-cowriting-plugin-content` | `main` @ `36bc4e3` — **specs/coauthoring-diff-view.md added (status: graduated)**; local clone synced; 4 untracked `issues/*.md` capture drafts remain (Author's to publish) | | session-history (`sessions/0017/`) | this transcript, published at finalize | - Issue #17: open, unchanged — the spec is its design artifact; the issue closes when F6 ships. - Nothing implemented yet: F6 is spec-only as of this session. ## What lands on the operator's plate - **Review the graduated spec** (autonomous mode skipped the review gate): `/Users/benstull/git/benstull.org/benstull/vscode-cowriting-plugin-content/specs/coauthoring-diff-view.md` — especially the two deferred calls above (absorb-on-advance semantics; `ctrl+alt+d`). - The four untracked `issues/*.md` drafts in the content repo are still yours to commit/publish or discard (capture-session convention). ## Prompt the operator can paste into the next session ``` /goal Plan and execute Feature #17 (F6 diff-view toggle) from the graduated Solution Design at content specs/coauthoring-diff-view.md — 4 slices per §7.2, host-E2E tier, no LLM in CI ```