Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
172 commits
Select commit Hold shift + click to select a range
12e96ba
F6a: push the rewritten head behind a durable marker
mchwang Oct 9, 2026
a63e5cf
Settle pushes cancel-safely and wait for the pushed head
mchwang Oct 9, 2026
b1eaaae
Wait for the pushed head even when the base moves
mchwang Oct 9, 2026
9e98ad7
State the pushed-head wait bound exactly
mchwang Oct 9, 2026
50ba765
Settle a stranded push on cancel; wait for the PR head after a refusal
mchwang Oct 9, 2026
e5ce306
Bind a post-push visibility failure; test startup settlement faithfully
mchwang Oct 9, 2026
496d4b3
Retry push settlement on a repeated cancel; test the push boundary
mchwang Oct 9, 2026
d0639c9
Trace a moved PR head through the whole rewrite lineage
mchwang Oct 9, 2026
6ab346d
Test the push boundary's state check and every settlement bound
mchwang Oct 9, 2026
0be7462
Cover cancel-safe settlement, admission and shutdown reads
mchwang Oct 9, 2026
7cc5477
Test that a failed push is reported as current
mchwang Oct 9, 2026
cedd594
Bind a failed push to the state its own settlement left
mchwang Oct 9, 2026
a0ecaf0
Bind every push exit to the state that push left
mchwang Oct 9, 2026
fc26627
Refuse checks after a push if the task changed while it was in flight
mchwang Oct 9, 2026
365cda0
Describe the pusher's expected-head rule in its doc comments
mchwang Oct 9, 2026
87dd3bf
Test the push claim's admission guards and the busy settlement skip
mchwang Oct 10, 2026
58e63e0
Address Copilot: capture the claim version, finalize at Git start, re…
mchwang Oct 10, 2026
9e1f695
State that a deadline-ended push leaves its marker unread
mchwang Oct 10, 2026
3ade421
F6b: scan for an earlier fix from the last clear check's base
mchwang Oct 12, 2026
4a3d23e
F6b: one-click merge job with a required-check wait
mchwang Oct 12, 2026
7cc6ab2
Stop the job's guarded merge on shutdown; end cancelled at every step
mchwang Oct 12, 2026
79b7fd5
Test the readiness hand-off for real; stop jobs as shutdown begins
mchwang Oct 12, 2026
e9575aa
Scan from the PR's own pre-PR check; settle a job from its attempt first
mchwang Oct 12, 2026
ffb995e
Settle a restarted job from its attempt; offer merge for a base conflict
mchwang Oct 12, 2026
922007f
Let a merge-blocked task start an amended plan; fix cancel test setups
mchwang Oct 12, 2026
def4b0a
Block job and task together; decide a job only from its own attempt
mchwang Oct 12, 2026
19d5abc
Scan from where the pre-PR check stopped; document the 250-commit limit
mchwang Oct 12, 2026
18fc568
Address Copilot: continuous scan, replayed refusals, strict wait, focus
mchwang Oct 12, 2026
727f279
Keep saved merge refusals out of the task's latest job
mchwang Oct 12, 2026
db189ae
Admit issue trust before a merge job starts; correct two doc claims
mchwang Oct 12, 2026
841e395
Say exactly when shutdown stops a merge job's preparation
mchwang Oct 12, 2026
fc57d20
Correct the task status the merge-handoff doc gives for queued and fa…
mchwang Oct 12, 2026
76c81f2
Test that a retried job's queue leaves the task approved, merge blocked
mchwang Oct 12, 2026
368495c
Keep the Merge button focused when a merge-job click is refused; qual…
mchwang Oct 12, 2026
9e0ee39
Draw an aria-disabled Merge button as inactive
mchwang Oct 12, 2026
1234091
Update only the merge control when a merge job ends
mchwang Oct 12, 2026
ab74aec
Scan for an earlier fix from the task's first clear check, whichever …
mchwang Oct 12, 2026
be4f391
Scan from the first opening into the current base branch
mchwang Oct 12, 2026
f6eb190
Scan from the task's original base when the first opening's check did…
mchwang Oct 12, 2026
887f0cd
Explain correctly why the already-fixed scan covers a rebase's commits
mchwang Oct 12, 2026
7302d68
Reflow the already-fixed range comment
mchwang Oct 12, 2026
b3ba376
Block a task only with its still-running job, and test the shared tra…
mchwang Oct 12, 2026
4ea8724
Test a queued attempt at startup and a failed GitHub read while waiting
mchwang Oct 12, 2026
3293278
Test that shutdown awaits a merge job before the store closes
mchwang Oct 12, 2026
2e3e860
Test that closing the merge job waits for it to settle
mchwang Oct 12, 2026
777c9b5
Name the pre-v19 fallback in the guarded-merge scan description
mchwang Oct 12, 2026
143b5f6
Merge origin/main (22e76a8) into F6a
mchwang Oct 12, 2026
93af176
Name schema version 18 in the architecture doc
mchwang Oct 12, 2026
0180256
Address Copilot: block only while readiness holds; shutdown answers 503
mchwang Oct 12, 2026
7180aad
Fail the job when GitHub refuses a changed head; answer 503 when shut…
mchwang Oct 12, 2026
cbacd19
Name the shutdown reload test for what it checks
mchwang Oct 12, 2026
f3bc3e1
Address Copilot: a branch read never waits on an escaped pipe holder
mchwang Oct 12, 2026
2c5ccc3
Merge F6a (f3bc3e1, with main 22e76a8) into F6b
mchwang Oct 12, 2026
97b6305
Address Copilot: bound only escaped pipe holders on branch reads
mchwang Oct 12, 2026
1b81ee9
Address Copilot: closed tasks never offered, refusals bound to their …
mchwang Oct 12, 2026
230e5b6
Say which branch-read case the settlement bound excludes
mchwang Oct 12, 2026
33450c8
Name both unbounded subprocess cases, and an inspection's full settle…
mchwang Oct 12, 2026
7604a79
Name the review-change case in the merge-handoff shutdown row
mchwang Oct 12, 2026
57b7ccb
Bound cat-file reads like ls-remote; correct stale rebaser doc line
mchwang Oct 12, 2026
d61da98
Merge F6a (57b7ccb) into F6b
mchwang Oct 12, 2026
749a977
Address Copilot: review a collaborator head found after an unknown pu…
mchwang Oct 12, 2026
8b36586
Test admission guards; say a retry after a refused merge and a rebase…
mchwang Oct 12, 2026
1874e6a
Merge F6a (749a977) into F6b
mchwang Oct 12, 2026
ad00767
Test the retry after a refused merge and a rebase through real prepar…
mchwang Oct 12, 2026
8c3b171
Word the replacement-review blocker by its cause
mchwang Oct 12, 2026
702d11e
Address Copilot: recheck the push binding before reviewing a refused …
mchwang Oct 13, 2026
da0204a
Address Copilot: new key after a job ends, keep in-flight drafts, ans…
mchwang Oct 13, 2026
f7754db
Test the binding check after the fetch; document the stale outcome
mchwang Oct 13, 2026
a734646
Test that the binding check before the fetch runs first
mchwang Oct 13, 2026
c265333
Merge F6a (a734646) into F6b
mchwang Oct 13, 2026
2a9534d
Drop a retained merge key once another job is the latest
mchwang Oct 13, 2026
7fa9e07
Merge origin/main (#170, #171, #172) into F6a
mchwang Oct 14, 2026
a23ac78
Refuse a push whose post-rebase review reload adopted a change (F6a, …
mchwang Oct 14, 2026
9578d8c
Guard every preparation reload and report its refusals as stale (F6a,…
mchwang Oct 14, 2026
df8966a
Bind preparation failures as current or stale by their cause (F6a, #170)
mchwang Oct 14, 2026
0069d8f
Refuse a command check whose context changed after it settled (F6a, #…
mchwang Oct 14, 2026
aa34f36
Give the preparation reload rules their own doc section
mchwang Oct 14, 2026
a752482
Restore the blank line before the push table
mchwang Oct 14, 2026
1ac194c
Merge F6a (with main: #170, #171, #172) into F6b
mchwang Oct 14, 2026
7717bf8
Settle merge job admission and reload races introduced by #170 (F6b)
mchwang Oct 15, 2026
0605a85
Follow a started job when its click cannot reload the review (F6b)
mchwang Oct 15, 2026
3b74ef7
Ask for a refresh when a click's merge job has already ended (F6b)
mchwang Oct 15, 2026
445081f
Give the ended-job browser test a runner server's merge view
mchwang Oct 15, 2026
79ed50c
Wait for the Merge button before pressing it in the refused-click foc…
mchwang Oct 15, 2026
7fe156d
Give a second merge request time to arrive before counting clicks (F6b)
mchwang Oct 15, 2026
7b1b5fa
Await the merge job's admission in the check-wait limit test (F6b)
mchwang Oct 15, 2026
19a1049
Refuse a rewritten-head push once shutdown has begun, and kill every …
mchwang Oct 15, 2026
14c2942
Answer merge-job clicks from durable records after failed reads and u…
mchwang Oct 15, 2026
fbde7d4
Keep a retry's key past an earlier job and newer job observations pas…
mchwang Oct 15, 2026
7ffd084
Scope the shutdown comment on the push failure path to its own read
mchwang Oct 15, 2026
82661d6
Merge F6a 7ffd084 (shutdown push guard) into F6b
mchwang Oct 15, 2026
0eb8a21
Log a merge job that could not be ended, and document that it stays r…
mchwang Oct 15, 2026
45bff7a
Never reject a merge job's run, log quoted, and test the restart that…
mchwang Oct 15, 2026
96cdee5
Merge main 209707e (F6a #153 squash) into F6b
mchwang Oct 15, 2026
cffdf4c
Log, not reject, when following a settled merge job fails; test the s…
mchwang Oct 15, 2026
715329b
Test that the wait between required-check inspections doubles to its cap
mchwang Oct 15, 2026
f684da4
Describe the merge_jobs table as stored: id, plan_key and a JSON record
mchwang Oct 15, 2026
b721ca6
Scan from the original base for a pre-v19 opening, never another bran…
mchwang Oct 15, 2026
d1f99fc
Pin that publish is refused while a merge job runs, and document why
mchwang Oct 15, 2026
94c3557
Refuse start and resume while a merge job runs, and state what plan i…
mchwang Oct 15, 2026
25444dd
Describe getAlreadyFixed as the look-up by check ID it is
mchwang Oct 15, 2026
d2de1b3
Keep the Merge button pending across renders, and pin every full-resp…
mchwang Oct 15, 2026
c1a329d
Count neutral and skipped required checks as passing, and read a chec…
mchwang Oct 15, 2026
de892bf
Keep a GitHub failure that precedes the required-check wait limit
mchwang Oct 15, 2026
fbfe4ce
Order merge jobs by a per-task sequence when keeping a poll's newer r…
mchwang Oct 15, 2026
105ea74
Show a merge job's outcome, not the blockers it resolved, once it ends
mchwang Oct 15, 2026
a76b453
Drop job-settled blockers only after a job reached the merge, from th…
mchwang Oct 15, 2026
0857fa2
Pin the served settled-codes field on a runner server, not on a body …
mchwang Oct 15, 2026
9d46828
Word merge-job messages as what the person does, and follow another t…
mchwang Oct 15, 2026
f83b657
Word a merge job's guarded-merge refusal and an unsettled push in job…
mchwang Oct 15, 2026
3a2251a
Test that a refused merge click follows only a running, later job
mchwang Oct 15, 2026
536a18d
Require both a check run and a commit status that share a required ch…
mchwang Oct 15, 2026
3fbf1cd
Order records of one merge job by a durable revision, not its update …
mchwang Oct 15, 2026
fc7834c
End a merge job the poll no longer reports without a TypeError
mchwang Oct 15, 2026
d49aeb7
Decide merge job endings from cancel, attempt state and the wait clock
mchwang Oct 16, 2026
cd78734
Say the checks passed after the limit when a late ready inspection ti…
mchwang Oct 16, 2026
0ef1040
Tighten merge job cancel, readiness and startup settlement tests
mchwang Oct 16, 2026
084b5df
Put the gh adapter's doc comment back on its class; say when shutdown…
mchwang Oct 16, 2026
674b986
Test that a job stopped before the guarded merge asks GitHub nothing
mchwang Oct 16, 2026
d440544
Save the store's running-job refusal so a resend replays it
mchwang Oct 16, 2026
d3cbaa8
Follow a job's queued attempt, and the later job a resent click's ans…
mchwang Oct 16, 2026
bd77939
Build F6b browser fixtures' job records with every field the server s…
mchwang Oct 16, 2026
f899661
Keep the attempt a polled job ended queued in when a held full respon…
mchwang Oct 16, 2026
7fcf94e
Test that a job's queue follow ignores another attempt and shows an e…
mchwang Oct 16, 2026
84c4ab1
Give F6b fixture job records increasing revisions along the job's course
mchwang Oct 16, 2026
835d0a4
Show a job's own attempt when the merge click's answer carries it ended
mchwang Oct 16, 2026
d490184
Give merge-job test records production revision sequences
mchwang Oct 16, 2026
c4414d3
Serve the queue-handoff tests' review a merging record at the revisio…
mchwang Oct 16, 2026
51a9b3c
Give the 30-minute-timeout fixture the revision its waits would reach
mchwang Oct 16, 2026
fea2785
Test the two merge-job timeout wordings that name no waiting check
mchwang Oct 16, 2026
42d4f67
Give the 30-minute-timeout fixture the highest revision its waits can…
mchwang Oct 16, 2026
ca91302
Give blocked merge-job fixtures the reason production saves, with its…
mchwang Oct 16, 2026
371fd3e
Test the merge route's busy refusal while a preparation's command che…
mchwang Oct 16, 2026
a457013
Test the plural wording when several required checks fail
mchwang Oct 16, 2026
b4e6f4b
Assert the exact reason of every merge job startup settles
mchwang Oct 16, 2026
09a3192
Use texts production sends in merge-job and history-failure fixtures
mchwang Oct 16, 2026
c4acbf5
Test the control label and banner of each ended merge job, and the me…
mchwang Oct 16, 2026
d1c0959
Test that merging clears listed checks and the exact prepare-merge re…
mchwang Oct 16, 2026
32ff4ec
Pin the merge job's shutdown handling around its first load and prepa…
mchwang Oct 16, 2026
2d65a23
Replace unreachable refused-click job variants with a reachable one
mchwang Oct 16, 2026
57c7786
Reload the click's review with a body-less GET in browser merge fixtures
mchwang Oct 16, 2026
dba9e7c
Pin the merge job's admission and status claims with tests
mchwang Oct 16, 2026
1a0aa0f
Pin the merge job's production timing defaults and timing check
mchwang Oct 16, 2026
f717220
Pin the merge-job poll back-off, the draft kept on a failed click, an…
mchwang Oct 16, 2026
5ec39ee
Pin the merge-job poll delays directly, including a checks-only change
mchwang Oct 16, 2026
00298e4
Pin that a foreign ledger commit is not passed as the task's own
mchwang Oct 16, 2026
abdcc65
Label the unreachable busy and active-attempt guards as defensive
mchwang Oct 16, 2026
f9bfa8d
Test that updating an ended merge job leaves it unchanged
mchwang Oct 16, 2026
82b857f
Pin the store's merge-job refusals and say which refusals start() saves
mchwang Oct 16, 2026
0c7171c
Say how start() refuses a tokenless click, and use production's 503 a…
mchwang Oct 16, 2026
250abad
Test that a resent merge click replays its own job after a later job …
mchwang Oct 16, 2026
986a517
Say why the stopping check after a merge job is defensive
mchwang Oct 16, 2026
365a720
Refuse a merge click with a too-long token as stale without saving it
mchwang Oct 16, 2026
cda7852
Give the ended-job browser fixture the revision production saves
mchwang Oct 16, 2026
84d93f0
Refuse a reused click ID before checking its token, and pin a job's g…
mchwang Oct 16, 2026
38e54cc
Test that a merge click ID saved under another plan is refused as reused
mchwang Oct 16, 2026
03f11fd
Test the snapshot and plan-revision terms of a refused job merge, and…
mchwang Oct 16, 2026
98db23f
Label the already-fixed range's outcome check defensive
mchwang Oct 16, 2026
69b3e05
Test queue-poll and plan-import interleavings in their reachable order
mchwang Oct 16, 2026
4465a5d
Label the merge click's shutdown check before its trust read as defen…
mchwang Oct 16, 2026
b1808ef
Test the direct Merge button across a render in flight, and deliver t…
mchwang Oct 16, 2026
355a794
Test the job wording of the guarded merge's later refusals
mchwang Oct 16, 2026
f63fecc
Mark snapshot-observation merge job paths as defensive
mchwang Oct 16, 2026
98ce3f7
Never let a completed check run without a start time outrank a starte…
mchwang Oct 16, 2026
d945617
Reach the F6b tests' mergeable review as a runner server does
mchwang Oct 16, 2026
eab5d2e
End a merge job whose review changed before its first load
mchwang Oct 16, 2026
2742712
Build the F6b browser fixtures' merge status as a runner server does
mchwang Oct 16, 2026
8028cba
Test the no-start-time rule for commit statuses; label a defensive re…
mchwang Oct 16, 2026
9f8f01f
Tie a required check observation with no time to the latest
mchwang Oct 16, 2026
c0d0a4b
Fail closed for a completed check with no start time
mchwang Oct 17, 2026
5f9350d
Pin the strict boundary of the dropped-record rule, and retitle a cas…
mchwang Oct 17, 2026
23cadee
Say where the already-fixed scan starts in the v19 comment and its te…
mchwang Oct 17, 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
10 changes: 5 additions & 5 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ Writing standard: plain language, ISO 24495-1:2023
- **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). Approve & merge merges that pull request (#121). Cancelling a task closes its pull requests (#111). These are API actions; the screen has no buttons for them yet.
- **Partly built for pre-merge automation:** 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), and runs exact-head `cmd:` checks; required-check refresh, the already-fixed rerun, and the one-click guarded merge handoff remain for F6b.
- **Not built:** screens for the runner actions, the required-check refresh and one-click merge handoff (F6b), review rounds, and the Queue and Learning screens.
- **Partly built for pre-merge automation:** 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), and runs exact-head `cmd:` checks. With a runner, Approve & merge 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, `docs/implementation/merge-handoff.md`).
- **Not built:** screens for the runner actions, the merge job's full step list and Cancel button, review rounds, and the Queue and Learning screens.

## Terms used

Expand Down Expand Up @@ -357,7 +357,7 @@ The diagram shows the designed transitions. With the `runner` block, running, ne

### Stored data

All state is in one SQLite file, opened with WAL and full synchronization. Each write takes an immediate write lock. The schema version is `PRAGMA user_version`, and migrations run in explicit steps (version 18 today); an unknown version fails.
All state is in one SQLite file, opened with WAL and full synchronization. Each write takes an immediate write lock. The schema version is `PRAGMA user_version`, and migrations run in explicit steps (version 19 today); an unknown version fails.

| Group | Tables | Notes |
|---|---|---|
Expand Down Expand Up @@ -410,7 +410,7 @@ These are the decisions that shape the structure. The full list, with the reason
| C, K | Guarded merge, merge queue | Done |
| D | Agent isolation boundary | Done. Since the isolation gate: bounded diff export (#76), task-change inspection and the runner's commit as a bounded `git bundle` (#66, PRs #85 and #90), owner-scoped recovery for Ask (#95), the plan schema for Claude (#97), gitlink mounts and the pre-launch tree check (#81, #99, PR #100), and Codex refused in every phase (#93, PR #106). The runner-contract follow-ups (#51) are closed: the last one tests export and removal through a recovery handle after a real restart (PR #109). |
| E | Planning library and suggestions | Done. E4 (PR #45) added the acceptance fixtures and recorded Claude output that replays through validation and the Store. |
| F | Runner | Merged: F1 (lifecycle store, coordinator, shutdown wiring, startup recovery and the lock, planning API, feedback events, and stops that wait for their commit: #53, #74, #57, #59, #60, #96); F2a–F2b (execute prompts, audit, per-item execution, real workspace, durable safety findings: #67, #68, #92, #94, #128); F2d (already-fixed check, PR opening, branch pusher, production publishing, closing PRs on cancel: #84, #101, #110, #115, #116, #119, #123); production wiring and `start`/`resume` (#91, PRs #102, #105); planning through lane D (#117, #124, PRs #118, #120, #125); merging the task's own PR (#121, PR #126); start/resume approval, review-version, recovery and completed-prefix guards (#107, PR #130); continuation after a scope pause (#88, PR #134); the F3 durable trusted local-rebase foundation (#22, PR #136); the F4 foreign-conflict engine plus production sandbox adapter (#22, PRs #138 and #140); and sandboxed owned-commit conflict resolution (#22, PR #144). F5 (PR #149) added current base/head refresh, rebase admission, post-rebase attribution and approval refresh, and head-bound `cmd:` execution. This branch adds F6a: the durable push of the rewritten head. F6b owns fresh required-check refresh, the already-fixed rerun, and the one-click exact-pair guarded-merge handoff; F6c owns common CI. |
| F | Runner | Merged: F1 (lifecycle store, coordinator, shutdown wiring, startup recovery and the lock, planning API, feedback events, and stops that wait for their commit: #53, #74, #57, #59, #60, #96); F2a–F2b (execute prompts, audit, per-item execution, real workspace, durable safety findings: #67, #68, #92, #94, #128); F2d (already-fixed check, PR opening, branch pusher, production publishing, closing PRs on cancel: #84, #101, #110, #115, #116, #119, #123); production wiring and `start`/`resume` (#91, PRs #102, #105); planning through lane D (#117, #124, PRs #118, #120, #125); merging the task's own PR (#121, PR #126); start/resume approval, review-version, recovery and completed-prefix guards (#107, PR #130); continuation after a scope pause (#88, PR #134); the F3 durable trusted local-rebase foundation (#22, PR #136); the F4 foreign-conflict engine plus production sandbox adapter (#22, PRs #138 and #140); and sandboxed owned-commit conflict resolution (#22, PR #144). F5 (PR #149) added current base/head refresh, rebase admission, post-rebase attribution and approval refresh, and head-bound `cmd:` execution. F6a (PR #153) added the durable push of the rewritten head. This branch adds F6b: the one-click merge job (preparation, the required-check wait, the exact-pair guarded merge) and an already-fixed scan covering every base commit after the task's original base; F6c owns common CI. |
| Hardening | Allowlisted subprocess environments | Done: every Git command (#82, #83) and every `gh` runner (#84, #86). |
| Tests | Test suite reliability | Done. The full suite runs ordinary tests first and Docker-backed files serially; CI and the real-Docker gate passed on PR #132 (#129). |
| G | Planning screen | Done (#145). The screen displays/imports the current plan, requests and renders a next-revision draft or suggestion cards, and applies results with revision-bound exact ambiguous replay. G4 composes the browser with the production planning setup, D-backed provider boundary, F endpoints and SQLite persistence; focused adapter, recorded-output and exact-head real-Docker planning suites cover the lower boundary. |
Expand All @@ -419,7 +419,7 @@ These are the decisions that shape the structure. The full list, with the reason

## Known limits

- `prepare-merge` invokes the trusted rebase and sandboxed conflict machinery, refreshes the review, pushes the rewritten head, and runs head-bound `cmd:` checks. Until F6b of #22 lands, it does not wait for fresh required checks, rerun the already-fixed check, or hand the exact pair to guarded merge; a person clicks Merge once GitHub's checks on the pushed head pass.
- With a runner, Approve & merge runs one merge job in the background: preparation, a wait of up to 30 minutes for GitHub's required checks, then the guarded merge. A failing or slow check, or GitHub's refusal, leaves the task approved, merge blocked; the browser shows only the job's current step, not the design's full step list, and has no Cancel button for the job yet (cancel the task instead).
- Linking is line-based. It cannot see an unrelated edit inside a declared file; only the review agent and you can catch that.
- 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.
Expand Down
Loading
Loading