You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The review-comment surfaces shipped across #859 (add from preview), #860 (summary panel), #861 (preview nav), and #863 (inline cards + minimap) are all built on a single flat on-disk marker:
<!-- REVIEW(@<author>): <text> -->
That format carries an author and a body and nothing else. It has no stable identity, no notion of a reply, no resolved flag, no reaction state. Every comment-lifecycle capability a reviewer expects is therefore either missing or half-present:
Edit an existing comment — not possible anywhere
Delete — works only from the editor gutter, not from the preview reading surface
Reply / threads — a marker is a single comment; thread.canReply = false
Resolve / unresolve — no state to store, so no way to mark feedback addressed or visually distinguish open vs. done
Reactions / acknowledgement — nowhere to record
These were each deferred (across #859/#860/#863's "out of scope" sections) to "the reply-storage decision." This issue IS that decision plus the lifecycle features it unblocks, scoped as one coherent unit because they share one root cause: the storage format.
The spine: storage format first
The keystone is a richer, durable comment representation that can carry:
a stable comment ID (so edit/delete/resolve target a specific comment, not a line)
thread membership (a reply belongs to a parent)
resolved / unresolved state
(optional, later) reaction counts
Constraints the format must respect:
Stays human-readable and diff-friendly in the .md source (markers are committed to git)
Backward-compatible: existing flat <!-- REVIEW(@a): t --> markers parse as a single-comment, unresolved, no-reply thread
Round-trips cleanly through the existing parse path (parseReviewMarkers), the editor-side Comments API (plan-review.ts), and the preview canvas (artifact-canvas)
Path eligibility unchanged: codev/(plans|specs|reviews)/*.md only
Proposed phasing
Format v2 + parser/codec — design the on-disk shape, extend the codec, migrate the read/write path. No user-visible feature yet; existing markers keep working.
Edit + preview-side delete — the two capabilities that need the least from the format (edit rewrites one comment; delete already exists editor-side). Carved out as independently shippable — could land before phase 1 as a quick slice against the current flat format, or fold in here.
Reply threads — multiple comments under one anchor, rendered in both the editor thread and the preview inline card stack.
Edit + preview-delete are independently shippable and must not be held hostage by the larger format design. Mentioned here for completeness; can split out if it accelerates delivery.
Notifications / @mentions / commit-from-comment ("suggested change") are explicitly out of scope — separate, much larger concerns.
This is SPIR-shaped, not a quick PIR/AIR. The format decision in phase 1 has long-lived blast radius (it's the on-disk contract every comment surface reads) and deserves a real spec and consultation. Bundling is correct because the design must be reasoned about as a whole.
Problem
The review-comment surfaces shipped across #859 (add from preview), #860 (summary panel), #861 (preview nav), and #863 (inline cards + minimap) are all built on a single flat on-disk marker:
That format carries an author and a body and nothing else. It has no stable identity, no notion of a reply, no resolved flag, no reaction state. Every comment-lifecycle capability a reviewer expects is therefore either missing or half-present:
thread.canReply = falseThese were each deferred (across #859/#860/#863's "out of scope" sections) to "the reply-storage decision." This issue IS that decision plus the lifecycle features it unblocks, scoped as one coherent unit because they share one root cause: the storage format.
The spine: storage format first
The keystone is a richer, durable comment representation that can carry:
Constraints the format must respect:
.mdsource (markers are committed to git)<!-- REVIEW(@a): t -->markers parse as a single-comment, unresolved, no-reply threadparseReviewMarkers), the editor-side Comments API (plan-review.ts), and the preview canvas (artifact-canvas)codev/(plans|specs|reviews)/*.mdonlyProposed phasing
Scope boundaries
Why this is design-heavy (protocol note)
This is SPIR-shaped, not a quick PIR/AIR. The format decision in phase 1 has long-lived blast radius (it's the on-disk contract every comment surface reads) and deserves a real spec and consultation. Bundling is correct because the design must be reasoned about as a whole.
Relationships
packages/vscode/src/comments/plan-review.ts,packages/vscode/src/review-decorations.tspackages/artifact-canvas/src/Acceptance criteria (sketch — to be firmed in the spec)
codev/(plans|specs|reviews)/*.md; theme variables throughout