Title: edit_note on a reviewed note needs a checksum that changes on every web-app comment, and the only way to fetch it is read_note, which returns the whole document
Concept. Two collaborators on one note: a human commenting in the web app, an agent appending and editing through MCP. Every comment the human adds bumps revision_checksum. Every MCP edit on a reviewed note requires expected_checksum to equal the current revision. So each comment silently voids the agent's next write, and the agent's only recovery path is a full read_note(review_mode="structured") — 120–240K characters returned just to obtain a 64-character token. The result is a document that cannot be worked on by two parties at the same time without one of them stopping.
Caleb's thought: This may also cost a lot of tokens for each and every check. Goal is to smooth, frictionless way to collaborate in realtime.
What happened.
- Agent appended chunk N with the checksum from its last successful write.
- Human added a comment in the web app between the agent's read and its write.
edit_note → "This note contains review threads. Call read_note(review_mode='structured') and retry edit_note with its current revision_checksum."
- Agent called
read_note → 117K-character payload → extracted the checksum with jq → retried. Repeated four times in forty minutes as comments kept arriving. Each failed retry re-sent a 38K-character append payload.
Why it matters. The checksum is doing two jobs: protecting prose from conflicting prose edits (good) and protecting the review layer (comments/suggestions) from being clobbered. A comment is not a prose change; it should not fence an append to the end of the document.
Proposal from Fable 5.1 (any one of these would fix the workflow; the first two together would be ideal).
- Split the checksum: a
content_checksum over prose only and a review_checksum over the review layer. edit_note checks content_checksum; review_note checks review_checksum. Comments stop invalidating prose edits.
- Add a lightweight
get_revision(identifier) (or a head/stat tool) returning {revision_checksum, content_checksum, review_summary, total_lines, size} without the body. Even without the split, this turns a 240K-character read into a 300-byte one.
- Scope the intersection check to the span being edited: an
append cannot intersect any anchor, so it should never be refused on review-layer grounds; find_replace should be refused only when the matched span overlaps an open anchor.
- Optional: accept a
section/line-range checksum (checksum of the target section) so concurrent edits in different sections do not conflict at all.
Drafted by Fable 5.1
Title:
edit_noteon a reviewed note needs a checksum that changes on every web-app comment, and the only way to fetch it isread_note, which returns the whole documentConcept. Two collaborators on one note: a human commenting in the web app, an agent appending and editing through MCP. Every comment the human adds bumps
revision_checksum. Every MCP edit on a reviewed note requiresexpected_checksumto equal the current revision. So each comment silently voids the agent's next write, and the agent's only recovery path is a fullread_note(review_mode="structured")— 120–240K characters returned just to obtain a 64-character token. The result is a document that cannot be worked on by two parties at the same time without one of them stopping.Caleb's thought: This may also cost a lot of tokens for each and every check. Goal is to smooth, frictionless way to collaborate in realtime.
What happened.
edit_note→"This note contains review threads. Call read_note(review_mode='structured') and retry edit_note with its current revision_checksum."read_note→ 117K-character payload → extracted the checksum with jq → retried. Repeated four times in forty minutes as comments kept arriving. Each failed retry re-sent a 38K-character append payload.Why it matters. The checksum is doing two jobs: protecting prose from conflicting prose edits (good) and protecting the review layer (comments/suggestions) from being clobbered. A comment is not a prose change; it should not fence an append to the end of the document.
Proposal from Fable 5.1 (any one of these would fix the workflow; the first two together would be ideal).
content_checksumover prose only and areview_checksumover the review layer.edit_notecheckscontent_checksum;review_notechecksreview_checksum. Comments stop invalidating prose edits.get_revision(identifier)(or ahead/stattool) returning{revision_checksum, content_checksum, review_summary, total_lines, size}without the body. Even without the split, this turns a 240K-character read into a 300-byte one.appendcannot intersect any anchor, so it should never be refused on review-layer grounds;find_replaceshould be refused only when the matched span overlaps an open anchor.section/line-range checksum (checksum of the target section) so concurrent edits in different sections do not conflict at all.Drafted by Fable 5.1