Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
561ed01
Show the merge job's step list and let a person cancel the merge alon…
mchwang Oct 21, 2026
6f00799
Address independent review round 1 of the merge step list
mchwang Oct 21, 2026
8753af0
Address independent review round 2 of the merge step list
mchwang Oct 21, 2026
2dd2266
Address independent review round 3 of the merge step list
mchwang Oct 21, 2026
a741b97
Address independent review round 4 of the merge step list
mchwang Oct 21, 2026
d15f269
Address independent review round 5 of the merge step list
mchwang Oct 21, 2026
546f6fc
Address independent review round 6 of the merge step list
mchwang Oct 21, 2026
1b4ded6
Address Copilot review of the merge step list
mchwang Oct 21, 2026
db6e7eb
Tidy the cancel-answer doc bullet and say what clears the step list (…
mchwang Oct 21, 2026
84e6b14
Say that a restart settles a cancelled merge as cancelled (#194 revie…
mchwang Oct 21, 2026
9e49746
Address independent review round 10 of the merge step list
mchwang Oct 21, 2026
40d1563
Keep a cancel refusal in the banner until the job's record changes (#…
mchwang Oct 21, 2026
ac6dd8f
Show a held cancel refusal again on each poll, and list the step-list…
mchwang Oct 21, 2026
17db340
Merge remote-tracking branch 'origin/main' into feat/merge-step-list
mchwang Oct 21, 2026
891e6c3
Mark build step 4 done: #174, #176 and the step list are closed (#194…
mchwang Oct 21, 2026
25e67d2
List D16's unbuilt failure banners and Queue row as missing; qualify …
mchwang Oct 21, 2026
8b9c9ad
Address independent review round 15 of the merge step list
mchwang Oct 21, 2026
03957d6
Cite #199 on the build step 4 checklist line, word the checks-write c…
mchwang Oct 21, 2026
3d975e7
Add the Stopped and Unknown marks to DESIGN.md, record the step list'…
mchwang Oct 21, 2026
dc6e6df
Test the older-job poll guard, the poll speed on a list-step change a…
mchwang Oct 21, 2026
9883bec
Move focus off Merge PR and its blockers button when a reload hides t…
mchwang Oct 21, 2026
7e22563
Merge remote-tracking branch 'origin/main' into feat/merge-step-list
mchwang Oct 21, 2026
5910440
Decide Merge status's visibility once, so a running job's poll keeps …
mchwang Oct 21, 2026
188b68d
Move focus off a hidden merge control only after the render sets its …
mchwang Oct 21, 2026
ae68419
Check Cancel's focus against the control focused before the update, a…
mchwang Oct 21, 2026
69ea536
Merge renderMergeSteps' doc comments, and say Cancel is marked unavai…
mchwang Oct 21, 2026
abeeda8
Test the display-only onAsking guard and a queued job's Merge step, a…
mchwang Oct 21, 2026
1d9f910
Keep Cancel unavailable until a poll stops reporting the cancelled jo…
mchwang Oct 21, 2026
acddd76
Read the in-flight Cancel state once, test that a replayed click does…
mchwang Oct 21, 2026
38f6625
Test the older-record poll guard, an inspection answering after shutd…
mchwang Oct 21, 2026
8da81cf
Test on the real preparation path that Fetch is still running when a …
mchwang Oct 21, 2026
cf0cb23
Test that Merge stays waiting when the attempt is not saved, and Reba…
mchwang Oct 21, 2026
e7c405b
Test a restart while a task cancel is stopping, a cancel refused afte…
mchwang Oct 21, 2026
b745931
Test each merge step state's mark, word and DESIGN.md color (#194 rev…
mchwang Oct 21, 2026
7c3f5b7
Test that a pending cancel stays with its own merge job (#194 review …
mchwang Oct 21, 2026
c942590
Keep a cancel's wait when a poll answers for an older merge job (#194…
mchwang Oct 21, 2026
3763af7
Bind a cancel's wait to the job shown when its answer arrives (#194 C…
mchwang Oct 22, 2026
1c34a40
Hold the ended record a cancel's answer carried (#194 review round 35)
mchwang Oct 22, 2026
abf2412
Test a Refresh answered after a cancel; name Cancel merge in the runn…
mchwang Oct 22, 2026
2c21f14
Wait for each cancel test's answer to be shown, not a fixed time (#19…
mchwang Oct 22, 2026
aa3325f
Wait for Cancel's render, not a response or a fixed time, in the canc…
mchwang Oct 22, 2026
08c3c8c
Wait for a render or the next poll in every D16 no-change check (#194…
mchwang Oct 22, 2026
ccd1091
Add the no-change race check rule to AGENTS.md (#194 review rounds 37…
mchwang Oct 22, 2026
1ce7c8d
Prove the step timer ran; widen the no-poll window past the poll dela…
mchwang Oct 22, 2026
5ce1a86
Check an unavailable Cancel sends nothing over the poll-delay window …
mchwang Oct 22, 2026
cdd94d4
Poll for the recorded cancel instead of reading it at once (#194 revi…
mchwang Oct 22, 2026
ffb7c16
Keep the latest ended record when a cancel answers late (#194 Copilot…
mchwang Oct 22, 2026
ff7efd5
Test that a later ended record replaces the held one (#194 review rou…
mchwang Oct 22, 2026
ff6ab69
Present and keep a newer ended job a late cancel answer carries (#194…
mchwang Oct 22, 2026
bda752d
Poll until a newer ended job is shown; drop an older job's queue atte…
mchwang Oct 22, 2026
e38fe9b
Test the cancel-answer path alone, polling's stop, and a later job's …
mchwang Oct 22, 2026
f535d3a
Drop an older job's queue attempt when a full reload keeps a newer jo…
mchwang Oct 22, 2026
147cd58
Keep observations made while a merge click is on its way over its ans…
mchwang Oct 22, 2026
02dc1f1
Keep an ended job's view against a poll read earlier; keep a followed…
mchwang Oct 23, 2026
83e0763
Follow an ended job's own attempt by action ID; drop only earlier or …
mchwang Oct 23, 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
3 changes: 3 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ For features with background jobs, polling, retries, cancellation, or shutdown:
- Preserve completed historical results, but visibly mark them stale when their snapshot, plan revision, assignment, or referenced code no longer matches.
- When polling updates one part of the screen, update only that state. Preserve scroll position unless the user was already following the bottom.
- While a request is in flight, do not disable the control that has keyboard focus; disabling it drops focus to the page. Mark it `aria-disabled`, ignore repeat activation with an in-flight guard, and test that focus stays on the control after the response.
- When a background update (a poll, a reload, an answer) hides or removes the control that has keyboard focus, move focus to a named fallback that is still shown and not `disabled` (an `aria-disabled` control qualifies) once the update has set every control's final state, and test that focus lands there for each way the control can be hidden. Decide a focusable control's visibility once per update: hiding it and showing it again blurs it.
- When a row or control's visual selection determines the current content or input, expose the same state with the appropriate accessibility attribute, such as `aria-current` or `aria-selected`, and test it across navigation.

## Required race regressions
Expand All @@ -53,6 +54,8 @@ Every reproduced race requires a failing-before and passing-after regression. As

A race regression must assert that the interleaving it names actually happened (for example which abort stopped which stage, or that a deadline fired before a release) before it uses the outcome as evidence. Otherwise machine load can turn it into a test of a different order that still passes.

A check that an event changed nothing (a late answer, a stale poll, a reload read earlier) must first prove the page handled that event, then read the state once: wait for a render or a state the event causes, or for a request the page sends only after handling it, and hold any later answer that could repair the state before the read. A fixed wait, the network response alone, or a retrying assertion on a state that already held before the event is not that proof: a page that handles the event late, or wrongly, then passes. A check that nothing is sent after an event can only be made over a window: wait longer than the shortest delay after which the page would send it, and say so beside the check.

## Review readiness

- Before requesting or re-requesting an automated Copilot review, self-review the full current diff, fix every issue found, and repeat the self-review and fix cycle until a complete pass finds no new issues. Re-run the relevant validation after fixes, then complete the mandatory independent-agent review loop below before requesting Copilot review.
Expand Down
12 changes: 9 additions & 3 deletions DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,11 @@ components:
| Token | Meaning | Icon and word |
|---|---|---|
| `success` | OK: passed, in scope, approved | ✓ plus a word such as "OK" or "Passed" |
| `warning` | Attribution warning, stale | ! plus a word such as "Stale" or "Ambiguous" |
| `warning` | Attribution warning, stale, or a step that did not finish normally | ! plus a word such as "Stale" or "Ambiguous" ("Stopped" for a cancelled merge step, "Unknown" when GitHub's merge outcome is not known) |
| `error` | Scope or test failure, blocker, unplanned | ✕ plus a word such as "Fail" or "Unplanned" |
| `neutral-status` | Not applicable | – plus "N/A" |
| `neutral-status` | Not applicable | – plus "N/A" (or "Skipped" for a step that was not needed) |
| `neutral-status` | Not started yet (a step that is waiting) | ○ plus "Waiting" |
| `text` | In progress (a step that is running) | ● plus "Running" |

- `success` is much lighter than `error`. This lets red-green color-blind users still tell them apart by brightness. Never rely on hue alone.
- **Contrast (checked 2026-09-22):** every text and status color is at least 5.0:1 on every surface. Body text is 14.6:1 on `surface`.
Expand Down Expand Up @@ -174,7 +176,7 @@ components:
| 1280–1439px | The conversation pane collapses to a tab. The plan list narrows to 208px |
| Below 1280px | A notice asks for a wider window |

**Frame:** a 44px app bar (the shared menu, design review D13), then a 48px review strip (issue, PR, revision, progress, blockers), then full-height panes. Panes can be resized and collapsed.
**Frame:** a 44px app bar (the shared menu, design review D13), then a 48px review strip (issue, PR, revision, progress, blockers), then, while a merge job runs and until the review reloads, the merge step bar, then full-height panes. Panes can be resized and collapsed.

**Rhythm:** a 4px base grid. Rows are 32px. Pane padding is 12px. Space between sections is 16px or 24px. Keep density tight inside lists and give the code pane the most room.

Expand Down Expand Up @@ -257,3 +259,7 @@ There are no shadows and no glows. Depth comes from the surface brightness steps
| 2026-09-22 | The serif "second voice" for the user's own words was not adopted | The user chose variant B. Two faces are enough |
| 2026-09-22 | Logo: terminal-prompt mark (`>_`) in a rounded square, in `text` color | Taken from the approved review-screen mockup. It was left out of the first HTML screen and restored at the user's request |
| 2026-09-22 | Contrast-checked values kept instead of values extracted from the mockup image | The extracted values (for example error #DA1E28) failed contrast on dark surfaces |
| 2026-10-21 | Two progress marks for the merge step list: ○ "Waiting" in `neutral-status` and ● "Running" in `text` | Steps that have not started or are under way are not outcomes, so they take no outcome color. Approved by the user (PR #194) |
| 2026-10-21 | The not-applicable mark also reads "Skipped" for a merge step that was not needed | Same meaning as N/A, worded for a step. Part of the step list the user approved (PR #194) |
| 2026-10-21 | The warning mark also reads "Stopped" (a cancelled merge step) and "Unknown" (GitHub's merge outcome not known) | Both mean "look at this, it did not finish normally". Approved by the user (PR #194) |
| 2026-10-21 | While a merge job runs, and after it ends until the review reloads, a step bar sits between the review strip and the panes | It shows the merge step list and Cancel merge without replacing the review strip's merge control. Approved by the user (PR #194) |
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Review agent-made Git changes one plan item at a time. The approved plan lists each item's files and acceptance checks; the review engine shows which item produced each change and flags foreign or overlapping work.

**Status:** the plan/linking library, SQLite store, local review screen, Plans screen (plan import, plus agent drafts and suggestions with revision-bound Apply; drafts and suggestions need a configured `github` review, not the demo), opt-in code-writing runner, durable local rebase, exact-head plan command checks, and the one-click merge job are implemented. Run `npm run demo` and open its private local URL. Ask, planning and the runner use Claude Code inside locked-down containers; Codex is refused because it reads code only by running commands ([why](docs/implementation/agent-isolation.md#codex-is-refused-in-every-phase)). They need Docker, plus `CLAUDE_CODE_OAUTH_TOKEN` (from `claude setup-token`). Startup builds the agent image, which can take a few minutes. A configured GitHub review can merge only after the guarded exact-head gate passes. The agent container, vendor-only network, credential-free command-check profile, and Claude/Codex adapters are described in [agent isolation](docs/implementation/agent-isolation.md). With a runner, the **Merge PR** button pushes the rebased head, waits for its required checks, and hands that exact pair to the guarded merge ([merge handoff](docs/implementation/merge-handoff.md)). The paired human review experiment was cancelled before results were recorded and no longer blocks roadmap work; optional future validation is tracked in [#19](https://github.com/codeabovelab/codeboost/issues/19).
**Status:** the plan/linking library, SQLite store, local review screen, Plans screen (plan import, plus agent drafts and suggestions with revision-bound Apply; drafts and suggestions need a configured `github` review, not the demo), opt-in code-writing runner, durable local rebase, exact-head plan command checks, and the one-click merge job (with its step list and a **Cancel merge** button) are implemented. Run `npm run demo` and open its private local URL. Ask, planning and the runner use Claude Code inside locked-down containers; Codex is refused because it reads code only by running commands ([why](docs/implementation/agent-isolation.md#codex-is-refused-in-every-phase)). They need Docker, plus `CLAUDE_CODE_OAUTH_TOKEN` (from `claude setup-token`). Startup builds the agent image, which can take a few minutes. A configured GitHub review can merge only after the guarded exact-head gate passes. The agent container, vendor-only network, credential-free command-check profile, and Claude/Codex adapters are described in [agent isolation](docs/implementation/agent-isolation.md). With a runner, the **Merge PR** button pushes the rebased head, waits for its required checks, and hands that exact pair to the guarded merge ([merge handoff](docs/implementation/merge-handoff.md)). The paired human review experiment was cancelled before results were recorded and no longer blocks roadmap work; optional future validation is tracked in [#19](https://github.com/codeabovelab/codeboost/issues/19).

## Development

Expand Down
Loading