Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
14eea01
Add review-screen controls for the runner actions (#200)
mchwang Oct 23, 2026
c6f9bc0
Address the first independent review of the runner controls (#200)
mchwang Oct 23, 2026
bc86ed0
Address the second independent review of the runner controls (#200)
mchwang Oct 23, 2026
7e4f789
Bound the polling of a task between steps (#200, third review)
mchwang Oct 23, 2026
7fe53d5
Fix the fourth independent review of the runner controls (#200)
mchwang Oct 23, 2026
d91a111
Fix the fifth independent review of the runner controls (#200)
mchwang Oct 23, 2026
c69792a
Fix the sixth independent review of the runner controls (#200)
mchwang Oct 23, 2026
f0a6826
Show the runner note in three independent parts (#200, seventh review)
mchwang Oct 23, 2026
6aa0dd1
Fix the eighth independent review of the runner controls (#200)
mchwang Oct 23, 2026
ef03141
Fix the ninth independent review of the runner controls (#200)
mchwang Oct 23, 2026
7076dac
Fix the tenth independent review of the runner controls (#200)
mchwang Oct 23, 2026
347a37f
Answer the replay fake as publishActionResponse does (#200, eleventh …
mchwang Oct 23, 2026
dd23386
Fix the twelfth independent review of the runner controls (#200)
mchwang Oct 23, 2026
55d5fff
Fix the thirteenth independent review of the runner controls (#200)
mchwang Oct 23, 2026
ea5bbdc
Close the fourteenth review's test gaps (#200)
mchwang Oct 23, 2026
fbdf1ed
Read the runner state again when the merge state changes (#200)
mchwang Oct 23, 2026
54cb798
Read the runner after every merge click, once per reload (#200)
mchwang Oct 23, 2026
5814d11
Test the merge reads the seventeenth review found untested (#200)
mchwang Oct 24, 2026
29fdfe4
Read the runner after a plan import or Apply (#200)
mchwang Oct 24, 2026
c1fe9f4
Read the runner when the issue board loads or the issue's trust chang…
mchwang Oct 24, 2026
0023738
Close the twentieth review's gaps (#200)
mchwang Oct 24, 2026
9d47524
Test the runner read after a lost issue-board answer (#200)
mchwang Oct 24, 2026
cba4b4f
Treat an interrupted rebase as needing a restart (#200)
mchwang Oct 24, 2026
f92a4e4
Name a restart-time cancel and a check attempt's Stop (#200)
mchwang Oct 24, 2026
1fc37c0
Close the twenty-fourth review's nits (#200)
mchwang Oct 24, 2026
fcda157
Keep the review strip on one line at the 1280px minimum (#200)
mchwang Oct 24, 2026
c0135de
Keep the plan revision whole and prove the strip's one line (#200)
mchwang Oct 24, 2026
7342d6d
Space the revision, test the banner's restart reason, settle the layo…
mchwang Oct 24, 2026
36d34b9
Close the twenty-eighth review's nits (#200)
mchwang Oct 24, 2026
f7373b6
Close the twenty-ninth review's nits (#200)
mchwang Oct 24, 2026
9718478
Close the thirtieth review's nits (#200)
mchwang Oct 24, 2026
f7cfa67
Measure the strip's cut titles once the strip is laid out (#200)
mchwang Oct 24, 2026
cf815bc
Pin the per-render tooltip measurement to its case (#200)
mchwang Oct 24, 2026
e95f4a3
Close the thirty-third review's nits (#200)
mchwang Oct 24, 2026
f0e92bf
Address Copilot's review and a Linux-only test failure (#200)
mchwang Oct 24, 2026
95759b9
Pin the latest-settled rule and the single owed read (#200)
mchwang Oct 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ A configuration with a `github` block may also add a `runner` block. The runner
- `diagnosticsCapBytes`: the size retention trims that directory back to. It is a target, not a hard limit: the file just saved is always kept, even when it alone passes the cap. The default is 256 MiB.
- `limits`: task storage limits (`workBytes`, `workInodes`, `metadataBytes`, `metadataInodes`).

The runner needs Docker and `CLAUDE_CODE_OAUTH_TOKEN`. At start, before the server opens, codeboost recovers what an earlier run left and builds the agent image; a recovery it cannot finish safely stops startup with what to do. It then checks `pathIdentity` against the task storage the agent edits, a Linux tmpfs (`caseSensitive: true`, `unicodeNormalization: "none"`), and refuses to start when they differ. `POST /api/runner` with `start` or `resume` runs the plan; the review screen has no runner buttons yet. A task paused for an out-of-scope change stays paused until the plan is amended, every changed path is declared, the remaining items validate against the runner's audited tree, and a person sends `approve-continuation` with the current `expectedStateVersion`, `expectedReviewVersion`, and an action ID. Then `resume` starts at the first unfinished item. `GET /api/runner` reports the checkpoint and whether the continuation is approved. When a run has completed every item, codeboost pushes the task head to a `codeboost/…` branch with your `gh` credentials and opens a ready pull request into `baseBranch`; a task that needs a person gets a draft pull request with its problems. Before merge, `prepare-merge` refreshes the published PR's exact base/head, rebases onto a moved base, refreshes attribution and approvals, and runs allowed `cmd:` checks in a credential-free read-only container. The check result counts only for that exact head and command list. A publish that was refused (for example, the branch holds a commit codeboost did not make) is retried with the `publish` action, and `GET /api/runner` shows the last outcome under `publish`. When a task is cancelled, codeboost closes the open pull requests it opened for it (the branch is kept). A pull request a person moved is left open and reported, and `close-pull-requests` retries a close that failed. Merge PR then merges that pull request, so `github.pullRequest` can be left out; if it is set, it must name the task's pull request, or merging is blocked. Demos never publish.
The runner needs Docker and `CLAUDE_CODE_OAUTH_TOKEN`. At start, before the server opens, codeboost recovers what an earlier run left and builds the agent image; a recovery it cannot finish safely stops startup with what to do. It then checks `pathIdentity` against the task storage the agent edits, a Linux tmpfs (`caseSensitive: true`, `unicodeNormalization: "none"`), and refuses to start when they differ. Start or Resume on the review screen (`POST /api/runner` with `start` or `resume`) runs the plan. A task paused for an out-of-scope change stays paused until the plan is amended, every changed path is declared, the remaining items validate against the runner's audited tree, and a person sends `approve-continuation` with the current `expectedStateVersion`, `expectedReviewVersion`, and an action ID. Then `resume` starts at the first unfinished item. `GET /api/runner` reports the checkpoint and whether the continuation is approved. When a run has completed every item, codeboost pushes the task head to a `codeboost/…` branch with your `gh` credentials and opens a ready pull request into `baseBranch`; a task that needs a person gets a draft pull request with its problems. Before merge, `prepare-merge` refreshes the published PR's exact base/head, rebases onto a moved base, refreshes attribution and approvals, and runs allowed `cmd:` checks in a credential-free read-only container. The check result counts only for that exact head and command list. A publish that was refused (for example, the branch holds a commit codeboost did not make) is retried with the `publish` action, and `GET /api/runner` shows the last outcome under `publish`. When a task is cancelled, codeboost closes the open pull requests it opened for it (the branch is kept). A pull request a person moved is left open and reported, and `close-pull-requests` retries a close that failed. Merge PR then merges that pull request, so `github.pullRequest` can be left out; if it is set, it must name the task's pull request, or merging is blocked. Demos never publish.

## Library

Expand Down
6 changes: 3 additions & 3 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ Writing standard: plain language, ISO 24495-1:2023
- **Build state:**
- **In use:** plan and linking library, SQLite store, review screen, plan display/import/authoring screen, Ask (questions to a Claude agent), guarded merge with merge-queue support, ranked Issues screen, agent isolation boundary, and the single-runner lock.
- **In use for a non-demo review with a `github` block:** planning. `/api/plan/suggestions` and `/api/plan/drafts` ask Claude, through lane D, for suggestion cards or a whole next plan revision (#117, #124). Nothing becomes a revision until you apply it.
- **In use with an opt-in `runner` block in `review.json`:** the whole loop after planning. `start` and `resume` on `/api/runner` run a task's plan item by item with a Claude agent (#91). They require current plan-item approvals, bind both the task state and review version, recheck approvals before each later item, and refuse when a completed prefix no longer ends at the task's current head (#107). After an out-of-scope pause, an approved amended plan can reconcile the completed prefix and resume only the unfinished suffix (#88, PR #134). When a run ends, codeboost publishes the task's pull request, a draft if the task needs a person (#103). `prepare-merge` refreshes the published PR's exact base/head, rebases through the durable F3/F4 path, recomputes attribution and approvals, pushes a rewritten head whose review is still clear over exactly the PR head it rewrote, and runs allowlisted `cmd:` checks in a credential-free read-only container bound to the resulting head (#22). The **Merge PR** button (the design's Approve & merge) merges that pull request (#121). Cancelling a task closes its pull requests (#111). Apart from **Merge PR** and **Cancel merge** (which stops a running merge job without cancelling the task), these are API actions; the screen has no buttons for them yet.
- **In use with an opt-in `runner` block in `review.json`:** the whole loop after planning. `start` and `resume` on `/api/runner` run a task's plan item by item with a Claude agent (#91). They require current plan-item approvals, bind both the task state and review version, recheck approvals before each later item, and refuse when a completed prefix no longer ends at the task's current head (#107). After an out-of-scope pause, an approved amended plan can reconcile the completed prefix and resume only the unfinished suffix (#88, PR #134). When a run ends, codeboost publishes the task's pull request, a draft if the task needs a person (#103). `prepare-merge` refreshes the published PR's exact base/head, rebases through the durable F3/F4 path, recomputes attribution and approvals, pushes a rewritten head whose review is still clear over exactly the PR head it rewrote, and runs allowlisted `cmd:` checks in a credential-free read-only container bound to the resulting head (#22). The **Merge PR** button (the design's Approve & merge) merges that pull request (#121). Cancelling a task closes its pull requests (#111). The review screen has controls for these runner actions (#200): the header shows the task's status, one run action (Start, Resume, Publish PR or Close pull requests) and Retry when `GET /api/runner` says the server would admit them, Stop for the item in progress, and Cancel task while the task is open and no cancel is already stopping its work (the server refuses it while a merge is being submitted, and the screen shows that refusal); a banner shows a task that waits on a person. **Merge PR** and **Cancel merge** (which stops a running merge job without cancelling the task) run the merge.
- **In use for pre-merge automation (#22, closed):** the trusted local rebase engine records one-to-one commit mappings, verifies the resulting checkout byte for byte, owns its subprocesses durably, and recovers interrupted work (#22, PR #136). Its production conflict path gives a sandboxed agent only the bounded conflict files and imports only audited results for both foreign and plan-owned commits (PRs #138, #140 and #144). `prepare-merge` now invokes that path after current pull-request base/head reads, refreshes attribution and approvals, pushes the rewritten head behind a durable push marker (F6a, PR #153), and runs exact-head `cmd:` checks. With a runner, **Merge PR** runs one merge job that prepares, waits up to 30 minutes for GitHub's required checks, and hands the exact pair to the guarded merge, whose already-fixed check now covers every base commit after the task's original base (F6b, PR #161, `docs/implementation/merge-handoff.md`). `test` and `real-docker` run every offline T9 suite on every pull request, and the live Claude probes run nightly (F6c, PR #177, `docs/implementation/ci.md`).
- **Not built:** screens for the runner actions, review rounds, and the Queue and Learning screens.
- **Not built:** review rounds, and the Queue and Learning screens. The review screen has controls for the runner actions (#200); "Review anyway", "Continue" and "Review dependency change" for tasks that wait on a person are not built (#206; the needs-approval state itself is not in use yet).

## Terms used

Expand Down Expand Up @@ -424,7 +424,7 @@ These are the decisions that shape the structure. The full list, with the reason
- The container's guarantees are those of Docker. The agent can always reach its own vendor account.
- `cmd:` acceptance checks run during `prepare-merge`, and their passing evidence is bound to the exact reviewed head. A plan item without current passing evidence still blocks merging.
- One user, one machine, one runner per database. The lock refuses a second runner, and it refuses network filesystems, where OS locks are unreliable.
- The runner is opt-in: it needs a `runner` block and a `github` block in `review.json`, and it is always off in the demo. It runs through the API only; the screen has no runner start, resume or publish controls yet. Planning authoring, suggestions and revision-bound Apply are available when the planning provider is configured. Publishing also needs `github.baseBranch`.
- The runner is opt-in: it needs a `runner` block and a `github` block in `review.json`, and it is always off in the demo. The review screen has controls for the runner actions (#200); each is also an API action. Planning authoring, suggestions and revision-bound Apply are available when the planning provider is configured. Publishing also needs `github.baseBranch`.
- codeboost is Claude-only. Codex is refused in every phase (#93, PR #106), because it can read files only through its shell, which every phase turns off. `agent-isolation.md` says when to revisit this.

## Test this document with a reader
Expand Down
2 changes: 1 addition & 1 deletion docs/designs/codeboost-plan-indexed-review.md
Original file line number Diff line number Diff line change
Expand Up @@ -569,7 +569,7 @@ The numbers below identify delivery milestones, not a requirement to implement t
2. **Read-only review screen.** It works on any branch whose commits are in the commit ledger, with a plan loaded into the database. It shows rows, segments, the four checks, approvals, and the per-item conversation. It does not merge (engineering review, O8). *Done; the screen has since gained the merge gate from build step 4.*
3. **Optional validation.** A future real-PR comparison may test the assumptions in "How we will know it works," but it is non-blocking under the superseding decision above.
4. **Merge gate and merging** (product workflow step 9): the merge rules, the pre-merge sequence, and merging through `gh`. Increment 1 (PR #23), merge-queue support (#38, #46, closing #24) and the pre-merge automation (lane F, F3–F6, #22) have merged. *Done:* the last items are closed: #176 (PR #195), #174 (PR #197), and the merge job's step list and Cancel button (PR #194). The rest of D16 and DT7 (named failure banners, the Queue-row step, the blocker list with links) is tracked in #199. See the scope and completion criteria below.
5. **Running agents.** Per-task clones, containers, agent adapters, permissions, one invocation per plan item, review rounds, the "already fixed" check, and opening PRs (step 6). Isolation boundary merged (lane D, PRs #31, #40, #44, #47, #50), and the runner merged (lane F; see the lane table in `docs/architecture.md`). Not built: review rounds and screen buttons for the runner actions.
5. **Running agents.** Per-task clones, containers, agent adapters, permissions, one invocation per plan item, review rounds, the "already fixed" check, and opening PRs (step 6). Isolation boundary merged (lane D, PRs #31, #40, #44, #47, #50), and the runner merged (lane F; see the lane table in `docs/architecture.md`). The review screen has controls for the runner actions (#200). Not built: review rounds, and the "Review anyway", "Continue" and "Review dependency change" actions (#206; the needs-approval state itself is not in use yet).
6. **Planning screen.** Writing plans with an agent, and approving plan changes (steps 2 and 3). *Done for T18:* planning backend (lane E, E1–E4) and the Plans screen (lane G, G1–G4, #145; PRs #148, #150, #151, #152). Not built: paste import, in-screen editing, the amendment-proposal view, check warnings, answering questions and a whole-plan approval step (#155). The suggestion cards do not yet conform to the v1 contract (#159).
7. **Queue, schedule, and recovery** (steps 4 and 5).
8. **Issue list, sorted by how critical each issue is** (step 1). *Done:* ranking backend (H1–H3), the Issues screen (H4a, #55), and the author-bound "trust this issue" action and runner guard (H4b, #108, PR #139) have merged.
Expand Down
Loading
Loading