Render F10 review proposals inline at their resolved anchor (not as trailing blocks) #31
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Render F10 review proposals inline at their resolved anchor (not as trailing blocks)
Summary
In the F10 review preview, render each pending Claude proposal at its resolved
anchor position within the rendered document — inline where the change would
land — instead of appending all proposals as trailing
cw-proposalblocks afterthe diff body.
Problem / pain
F10 shipped (#29) with
renderReviewappending every proposal as a trailingblock at the bottom of the preview (anchored ones first, then unanchored). The
graduated spec (
coauthoring-interactive-review.md§2 and §6.2) actually callsfor a pending proposal to be "rendered inline at its resolved anchor" — a blue
block in context, where the replaced text sits. The trailing-block behavior is a
deliberate v1 simplification (chosen for determinism + because inline injection
into the block-level diff body is materially more complex), recorded as a deferred
decision in session 0030. It is functional but lower-fidelity: when several
proposals are pending, the reviewer has to mentally map each trailing block back to
the place in the document it affects, which is exactly the "where does this change
go?" friction the inline-at-anchor design was meant to remove.
Who feels it
The human coauthor (PP-1) reviewing a session with multiple pending Claude
proposals — the more proposals, the more the trailing list loses the spatial
"this change happens here" cue.
Desired outcome / value
Resolved proposals appear in place in the rendered preview — the blue ✓/✗
block sits at the document location it would change, so "what is Claude proposing,
and where?" is answered by position, not by cross-referencing a trailing list.
Unanchored (unresolvable) proposals keep the trailing-block fallback (never
dropped — INV-34).
Acceptance — "done right"
cw-proposalblockat its resolved offset within the rendered body (in the block/paragraph that
contains the anchor), carrying its
data-proposal-id+ ✓/✗, the struck replacedtext, and the proposed text.
cw-proposal-unanchoredblock (the current fallback — never silently dropped,INV-34 preserved).
renderReviewstays pure, vscode-free, and deterministic (INV-33): sameinputs → identical HTML.
(INV-34/INV-21 unchanged).
proposals in different blocks each render in place; an unanchored proposal still
trails; determinism holds.
Scope / non-goals
In scope: the positional placement of resolved proposal blocks inside
renderReview's output; the unit tests for it.Non-goals: any change to the F4 propose/accept model, the accept/reject seam,
the sidecar, or
SCHEMA_VERSION; changing the visual styling of a proposal block;the unanchored-proposal fallback (keep it).
Assumptions · constraints · dependencies
renderReviewalready receivesProposalView[]with resolvedanchorStart/anchorEndoffsets — the dataneeded for placement is already in hand; the work is in the render composition.
diffBlocks) emits ops in document order;injecting a proposal "at its block" means associating each resolved offset with
the current-side block range it falls in (the same positional mapping F10 uses
for author-coloring) and emitting the proposal block adjacent to that block.
the same block.
Source / signal
Self-originated — capture session vscode-cowriting-plugin-0031 (2026-06-12),
from the deferred decision recorded in planning-and-executing session 0030
(F10 ship). Spec:
specs/coauthoring-interactive-review.md§2 / §6.2("rendered inline at its resolved anchor") and §9 (open items). Builds on F10
#29.Priority (WSJF)
Provisional: Value medium (sharpens the just-shipped review UX; the
trailing-block v1 is functional, so this is fidelity, not a fix) ·
Time-criticality low · Opportunity medium ÷ Size small →
provisional priority/P2. (Decision aid, not auto-scored.)
Decomposition
Single increment (Feature, small). Slice checklist:
ProposalViewwith the current-side block range itanchors into (reuse F10's positional range pointer).
cw-proposalblock at that position inrenderReview's output;keep unanchored proposals trailing.
same-block ordering determinism, unanchored fallback, overall determinism.
Solution notes (optional — NOT a design)
Non-binding: F10 already computes a positional
ranges/cimapping forauthor-coloring in
renderReview(src/trackChangesModel.ts); the same mapping canlocate the block a proposal's
anchorStartfalls in, and the proposal block can beemitted right after that block's HTML. Watch determinism for multiple proposals in
one block (stable sort by anchorStart then id).