Conversation
In-memory jobs with two-step admission and a slot reservation; abortable preparation with task-budget and deadline timers; a synchronous launch check before D's start; first-reason stops that keep the slot until D settles; Store-chosen terminal states; unresolved markers on storage failure; cancel task; and shutdown that keeps existing reasons and waits for every job. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced 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 F1b: runner coordinator. Stacked on #53 (F1a, the Store); merge #53 first. Related: #22, #51.
What this does
Adds
runner/coordinator.ts, the per-process owner of in-memory jobs, slots and unresolved markers, as specified indocs/implementation/runner-lifecycle.md. D is injected (RunnerDeps.start), so this runs against a fake D until #51 lands; nothing is wired to the server yet.Store.admitAttemptruns. A refused transaction releases the reservation in the same turn. Writable kinds share one slot and read-only kinds share another; both limits are configurable.AbortSignal. The task budget timer recordstime-limit. The attempt deadline, before launch, fails the attempt with "Timed out" and records no first reason.pending, there is no first reason (saved or in memory), there is time left and the context is current. ThencaptureInvocation, then D's start. A context change during preparation endsstalewithout calling D. A stop during launch ends from its first reason. A start error endsfailedwith the launch error.markRunningis refused because a first reason exists, the handle is cancelled and settles normally. If the write fails with a storage error, the handle is cancelled withcapture-failure, settled, and the slot stays held under astart-not-savedmarker.status().stopRequested.savedshows when saving failed. The slot is never freed on cancel, only aftersettled.result-not-savedmarker that holds the slot until restart.cancelTaskgoes through the Store and stops the running work.close()rejects admission, recordsshutdownonly where no reason exists, and awaits every job with no timer. It leaves the Store open for the caller to close.Validation (head
3767065)npm run typecheck: passes.CI's unit set (
npm testminus the Docker suites): 488 passed, 0 failed. 18 of those tests are new, intest/runner-coordinator.test.ts, using a fake D whose promises the test controls, and real SQLite.Mutation check: six guards were broken one at a time, and each was caught:
close()not waiting;AGENTS.md race regressions covered here:
The Store-level cases (an old attempt settling after a retry, two processes admitting at once) are in F1a.
Browser tests weren't rerun: this slice doesn't touch
web/.Not in this slice
/api/runner, and the merge-coordinator catches.preparation_pgidis part of F1d, together with the abortable D helpers from D follow-ups required by the F1 runner lifecycle contract #51.🤖 Generated with Claude Code