Conversation
Planning endpoints over E3's coordinator and the Store: import, suggestion start/read/cancel/apply, each through Store.userAction; E3's settlement writes use the shutdown capability and the coordinator closes at shutdown. Starting a suggestion is refused until a planning provider is injected. ReviewService.planContext builds the trusted plan context from the base tree. Review actions: change notes, segment accept and assign require an actionId and record their feedback event in the same transaction; a later choice links to the earlier event; choice sources are fixed-size fingerprints. The UI sends an actionId per action. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mchwang
added a commit
that referenced
this pull request
Sep 26, 2026
A caller that dropped the returned RunnerLock let its SQLite connection be garbage-collected, which released the OS lock while the runner was still alive. Found by a CI failure of the cross-process lock test on #60. The new test drops the lock and forces GC in a child, and fails without the fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mchwang
force-pushed
the
feat/f1e-planning-feedback
branch
from
September 26, 2026 11:02
b36e017 to
bfe30df
Compare
mchwang
added a commit
that referenced
this pull request
Sep 26, 2026
mchwang
added a commit
that referenced
this pull request
Sep 26, 2026
* docs: reconcile the design plan with the code Record where the code differs from the approved plan and update stale status: - Record Ask as an interim exception to R1: it runs the vendor CLI on the host with tools off until lane F moves it into the lane D container. - Amend D20: there is no "Merge anyway"; to override a blocker, merge on GitHub. Matches docs/implementation/guarded-merge.md. - Tick T1, T2, T4, T5, T10, T13, T14 with test evidence; point Files lines at core/linking.ts and core/approvals.ts instead of never-created modules. - Mark increment 1 merged; add a lane status table (C, D, K done; E, F, H progress); record decided open questions (issue ranking, AgentDiff). - Add a verified status note for design tasks DT2-DT15; none newly ticked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs: note merge-queue support in the guarded merge doc The guarded merge gate doc still said merge-queue branches stay blocked. #46 (closing #24) added queue lifecycle support. Point to merge-queue.md, and state that adapters without queue inspection still fail closed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs: bring plan status up to date with F1 and H4a Merge main. Record the F1 lifecycle contract (#49) and open F1a-F1c (#53, #56, #57); record the ranked Issues screen (H4a, #55) with H4b's trust action remaining; Issues is now a menu link, not a placeholder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs: add F1d and Ask PRs to lane status Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Align merge-queue wording with the merged K2/K3 support README no longer says merge queues block merging; it describes the enqueue-then-confirm behaviour. The plan's wave-3 note records the old block as history instead of a live instruction. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Record the K-lane queue block as history in the task table Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * README: disclose that Ask runs the agent CLI on the host The plan (R1 exception) says README states this limit; it did not. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Add F1e (#60) and the #51 merge condition to the F lane row Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * README: distinguish queue-removal retry from changed-head review Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Plan: mark the install preflight and npx entry as planned The CLI checks only the Node version today; say so instead of describing the git/gh/container/sign-in preflight as current. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.
Lane F, step F1, slice F1e: the planning API for lane G, and feedback from review actions. Stacked on #59 (F1d) → #57 → #56 → #53. This is the last F1 slice. Related: #22, #51.
What this does
Planning endpoints for G4 (
web/server.ts, per the contract's "Planning API for lane G"):POST /api/plan/importStore.importRevisionwith the expected revisionPOST /api/plan/suggestionsSuggestionCoordinator.start, bound to the expected revision and snapshot, with the user'sfeedbacktext (4,000 characters or fewer)GET /api/plan/suggestions/:idPOST /api/plan/suggestions/:id/cancelpending:handle.cancelon the retainedSuggestionHandle. Otherwise, or with no handle in this process:Store.cancelSuggestionsPOST /api/plan/suggestions/:id/applyStore.applySuggestionwith the trusted plan contextPOSTgoes throughStore.userAction, so it replays exactly byactionId.completeSuggestions, andsettleSuggestioninclose()) run with the shutdown capability. The coordinator closes at shutdown step 6.PlanningDepsprovider is injected (live planning goes through D, D follow-ups required by the F1 runner lifecycle contract #51).ReviewService.planContext()builds the trusted plan context: base entries fromgit ls-treeat the snapshot's base, and the configured path identity.Feedback from review actions:
actionId(400 without one). The action and its feedback event (change-request,segment-accept,segment-assign) are written in one transaction, insideStore.userAction.supersedes) to the latest earlier event for it.sourceRefischoice:<sha256 of the stored choice key>: fixed-size and recomputable.actionId, and stay backward-compatible without one. A replayed question does not start its agent again.web/public/app.js) sendscrypto.randomUUID()with every review action.Validation (head
bfe30df, rebased onto F1d5d163f2)npm run typecheck: passes.CI's unit set: 529 passed, 0 failed (includes F1d's new lock test). 10 of those are new, in
test/runner-planning-feedback.test.ts, over real HTTP on the demo fixture:actionId;npm run test:browser: 53 passed.Mutation check: six of seven broken versions were caught:
supersedeLatestignored;Not caught: removing the
!replayedquestion guard.Questions.start()already refuses a note that is being answered or answered, so the guard is a second layer with no observable effect.CI failure on the first push
The first CI run failed F1d's cross-process lock test. The cause is fixed on #59 (
5d163f2, a lock connection garbage-collected when the caller dropped it), and this branch is rebased onto it.Test changes to existing tests
test/browser/review.spec.ts("can assign a large foreign change…") and threerunner-shutdowntests now send theactionIdthat the API requires for feedback-producing actions. What they assert is unchanged.runner-shutdown.test.tsand the new planning/feedback test use a 20 s test timeout. Each review load reads git history, so these integration tests take 3–6 s under a full parallel run, over vitest's 5 s default. CI passed on F1c: shutdown wiring and /api/runner #57 with the default, but the margin is small.Deferred
supersedesis reachable only when that action exists. It is tested at the Store level.user_actions(contract round 16) needs the merge coordinator to update the saved response when the outcome is recorded. Deferred to F6, the merge handoff.describe()wait for D follow-ups required by the F1 runner lifecycle contract #51 and G4.🤖 Generated with Claude Code