Record decision #16: concurrent drafts (W8), and propagate it - #7
Merged
Conversation
W8 ruled by the user 2026-07-24: optimistic concurrency with semantic, output-level conflict detection, and no user-visible branches. Seven rulings recorded in REVIEW.md §6 #16: 1. A draft is a named change; the branch is an implementation detail. The author names the change, the Studio derives the ref, and the vocabulary is propose -> review -> apply. A draft opens implicitly on first edit. 2. Optimistic concurrency, no locks at any granularity — a lock is a second control plane over Git, goes stale, blocks across teams, and needs the identity work that is deliberately deferred. 3. Conflict detection is semantic at the effective-config level, never textual: render base, draft, main-now and merge(draft, main-now) and compare outputs. This catches what Git cannot see — two drafts touching different files, no textual conflict, changed effective config. 4. Rebase is continuous and invisible; a moved base surfaces as a consequence diff, not a Git conflict. 5. Detect and surface, never auto-resolve. Scope delete/rename across drafts is an unconditional conflict. 6. Presence is advisory, not a claim. 7. Apply is the host's PR merge, gated by CODEOWNERS (register #10). Two consequences recorded with it: the write path forces a Git-credential decision (ship a bot/App identity behind the same port as per-user acting-as-user OAuth; design for the latter), and the authorization posture must not drift — authentication buys attribution and acting-as-user, never a role system; authorization stays CODEOWNERS + branch protection on the host. Propagated in the same change: the W8 finding and the "remains open" line in REVIEW.md; REVIEW-UI F2 and M8; PLAN.md (write path unblocked, W8 struck from the open list); the deck's two draft cards, which said the UI "creates a Git branch and locks the editing context" — both now wrong on two counts; and the mock's draft chip, which showed a raw ref and now shows the change's title. Also fixes a regression from #6: seven deck links still pointed at mock pages that PR deleted. They now resolve to the single-page mock, and the mock gained minimal hash deep-linking (#area=Releases, #tab=Config) so those links land where they claim. Verified: all six hash forms resolve to the right selection and tab, and the full sweep is still clean (264 screen states, 0 rationale leaks). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LsX7cWVGLszurNYMVwMJGo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
W8 — the last open register item gating the write path — is ruled. Recorded as REVIEW.md §6 #16 and propagated in the same change.
The ruling
Optimistic concurrency, semantic output-level conflict detection, no user-visible branches.
base,draft,main-now,merge(draft, main-now)and compare outputs. This catches what Git cannot see: two drafts touching different files (one re-parents a node, another edits the layer at its old scope) — no textual conflict, changed effective config.Two consequences recorded with it
Propagated in the same change
The W8 finding and the stale "remains open" line; REVIEW-UI F2 and M8;
PLAN.md(write path unblocked, W8 struck from the open list); the deck's two draft cards, which said the UI "creates a Git branch and locks the editing context" — wrong on both counts now; and the mock's draft chip, which showed a raw ref and now shows the change's title.Also: a regression fix from #6
Seven deck links still pointed at mock pages that PR deleted. They now resolve to the single-page mock, which gained minimal hash deep-linking (
#area=Releases,#tab=Config) so those links land where they claim. Verified all six hash forms resolve to the correct selection and tab; the full mock sweep is still clean (264 screen states, 0 rationale leaks).🤖 Generated with Claude Code
https://claude.ai/code/session_01LsX7cWVGLszurNYMVwMJGo