Skip to content

Lane G1: add planning screen and plan import - #148

Merged
mchwang merged 20 commits into
mainfrom
codex/lane-g1-planning-screen
Oct 8, 2026
Merged

mchwang merged 20 commits into
mainfrom
codex/lane-g1-planning-screen

Conversation

@mchwang

@mchwang mchwang commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Outcome

Adds the first Lane G planning screen: reviewers can inspect the complete current plan and import the next JSON or YAML revision without losing an unsent Review draft.

Tracks #145.

Scope

  • Add Plans navigation and an Evidence Desk-style plan view.
  • Render issue, summary, revision, questions, ordered items, dependencies, files (including rename source and destination), and acceptance checks.
  • Import through the existing F1 plan endpoint with exact idempotent retry semantics.
  • Guard Review, Plans, import, merge, question-poll, and merge-queue responses by their owning generations.
  • Preserve focus, newer file selections, and Review drafts across asynchronous responses.
  • Document the G1 display/import contract and current architecture status.

Validation

Validated head: 8eb624f77bcd383b96aac446d7996543dbc446c4 against base 29c6daa2ff91cf62d0fea717c86adb1d8882a3ce after integrating merged PR #143.

  • Focused Plans browser suite: 31/31 passed.
  • Combined Plans and Review browser suite: 92/92 passed locally and in the clean independent exact-head review.
  • Affected Review + Plans browser run: 73/75 initially passed; the two failures were strict-locator ambiguity introduced by the new hidden Plans error status, and both affected Review tests plus the two new regressions passed after the final adjustment.
  • Typecheck, JavaScript syntax, and diff checks passed.
  • Push CI run 37768169140 and pull-request CI run 37768177048 passed on the exact head, including the configured non-container unit suite and full browser suite.
  • Independent full-diff review: clean on the exact base/head above. Combined Plans and Review browser validation passed 92/92. Terminal authority, submitting-to-queued monotonicity in both response orders, same-state detail, and action-ID/reviewed-head boundaries were reread across every changed function; no earlier valid finding remains unresolved.
  • Full local Docker validation is not claimed: concurrent repository Docker work left the host unsuitable for a reliable run. CI does not run the excluded container suites.

Review rounds

  1. Fixed stale Review/Plans responses, rename display, exact retry and committed-reload reporting, static action-color misuse, and merge ownership.
  2. Added generation-scoped busy/status ownership and stale merge-poll invalidation.
  3. Kept ambiguous requests exact after an observed commit, released superseded Plans UI synchronously, resumed queue polling after failures, and made heavy race tests timeout-safe.
  4. Added the second merge-poll generation boundary around authoritative import reload and made its regression causally controlled.
  5. Final implementation pass reported no findings.
  6. Integrated current main twice without force-pushing and repeated exact-head validation and independent review after each base change.
  7. After PR Docs: refresh pre-merge roadmap #143 merged, updated docs/architecture.md to distinguish shipped G1 display/import from future G2-G4 work; the exact-pair review was clean.
  8. Copilot round 1 found two valid races: unresolved import retry identity and stale merge-poll application. Both were reproduced, fixed, and covered; independent review additionally found and covered the analogous Review-refresh merge race.
  9. Copilot round 2 had no open inline findings but surfaced two summary-only concerns: stale Plans UI after a Review load failure and a stale question poll overwriting a completed answer. Both were reproduced before patching and now pass controlled regressions. Independent review found one regression-settlement gap; the test now waits for the page continuation to consume the stale response, and the repeated full-diff review is clean.
  10. Copilot round 3 had no open inline findings but found the reverse question-poll ordering: a completed poll could be overwritten by the older pending Plans response. The new context-bound merge preserves a completed answer only when both note ID and immutable answer-attempt ID match; the reverse-order regression failed before, passes after, and fails under independent mutation testing when the preservation call is removed.
  11. Copilot round 4 found two valid reverse-order races: an older Plans refresh could overwrite a newer terminal merge result, and it could hide a newer failed answer and Retry control. Both regressions failed before the fix. Context-bound reconciliation now preserves terminal merge state only for the same action/head and preserves settled answers only for the same note/attempt, while retaining fresh blockers and stale-context metadata from the newer full response. Both regressions pass after the fix and the repeated independent full-diff review is clean.
  12. Copilot round 5 found the analogous ordinary Review terminal-merge race and a failed answer whose cancellation settled while Plans refresh was pending. It also identified two older regressions without explicit response-settlement barriers. All were reproduced and fixed. Independent review then found the same terminal race in the post-import reload after an exact ambiguous-import replay; that real replay regression failed before and passes after. The terminal mocks are removed before releasing each stale full response, and independent mutation testing proves the replay regression fails without its guard instead of being healed by a later poll.
  13. Copilot round 6 found that successful Review refreshes could update the Plans document while leaving an older revision or load-failure status displayed. Both cases failed before the fix. Review refresh now reconciles its settled Plans status only when the status generation captured at request start still owns the message, so a newer plan operation remains authoritative. Both regressions pass, fail under independent mutation, and the independent newer-owner check passes.
  14. Copilot round 7 had no open inline findings but surfaced a summary-only concern: an older failed Review refresh could replace newer Plans validation feedback. The controlled regression failed before the fix and passes after it. Failed Review refreshes still clear unavailable plan data, but replace the Plans status only while retaining the status generation they captured at request start. The repeated independent full-diff review is clean, its mutation check fails without the ownership guard, and an additional held-response scenario preserves a newer committed import's status, revision, and durable plan.
  15. Copilot round 8 had no open inline findings but surfaced two summary-only races: a poll started during a Review action could replace restored retry readiness, and an older Plans response could regress a confirmed queued merge to submitting. Both controlled regressions failed before and pass after. Independent review then found the reverse action/poll ordering, same-state queue detail updates, and missing mutation coverage for action/head identity. Accepted merge polls now advance an explicit observation generation; pending responses preserve newer queue data only for the same immutable action ID and reviewed head. The strengthened real-action regression proves its requested change remains visible and durable while position 3 advances to position 2, and separate mismatched-action and mismatched-head cases prove the authoritative response wins. Each identity case fails when its equality guard is removed. The repeated independent full-diff review is clean.
  16. Copilot round 9 found one valid poll-first retry-readiness race: when a terminal poll and a later full response described the same terminal attempt/state, preserving the poll discarded the full response's server-verified Retry action and blockers. The new controlled regression captures a real retry-ready Review response, visibly applies the matching terminal poll first, then releases and settles the full response. It failed before the fix and passes after. Same-action/same-head lifecycle progress remains preserved, while the full response now wins for matching merged, removed or failed states. The repeated independent full-diff review is clean.
  17. Copilot round 10 found the remaining active-poll/terminal-response ordering: a queued observation accepted during Refresh could overwrite a terminal full response and discard its verified Retry action. The new controlled regression asserts a real terminal retry-ready Review body, visibly applies queued position 2 first, then settles Refresh and proves Retry merge is enabled, the queued banner is gone, and durable state remains removed. It failed under the prior reconciliation and passes after. Terminal full responses are now authoritative over active or terminal observations; nonterminal full responses still preserve genuine same-action/same-head progress or terminal transitions. The repeated independent full-diff review is clean.
  18. Copilot round 11 had no open inline findings but surfaced a summary-only reverse-progress concern: a delayed submitting observation could overwrite a full response that already confirmed queued state and its position/phase. The controlled regression asserts a real queued position-3 full response, visibly applies the stale submitting/error observation first, holds all later polls, then settles Refresh and proves the stale error disappears while position 3 remains visible and durable. It fails without the monotonic guard. A queued full response now wins over submitting; the reverse submitting-full/queued-poll path and same-state queued detail updates remain preserved. The repeated independent full-diff review is clean.
  19. Copilot round 12 completed on the exact validated head with zero open findings. No new inline or summary concern remained, and every earlier valid finding was resolved.

No findings were declined.

Review lesson audit

  • Review rounds 1–4 and 8–18: stale Review, Plans, import, question and merge responses; reversed response order; retry identity; queue lifecycle monotonicity; action/head identity; status ownership; input preservation; and cancellation settlement are covered by the existing AGENTS.md rules under Async jobs and polling, Async review UI, and Required race regressions. No new operating rule is needed.
  • Review rounds 5–7: exact-head revalidation after fixes and base integration is covered by Review readiness and Stacked pull requests. No new operating rule is needed.
  • Regression-settlement and mutation-sensitivity findings in rounds 9, 12, 15, 16, 17 and 18 are covered by Review readiness, including its requirements that fixtures assert the disputed intermediate state, tests match production setup, and every behavioral claim be traced and tested. No new operating rule is needed.
  • Exact retry after ambiguous outcomes and preservation of committed results across later refresh/render failures are covered by Guarded external actions. No new operating rule is needed.
  • The strict-locator ambiguity observed during validation was a one-off test-selector adjustment, not a reusable lifecycle or collaboration rule.
  • Documentation and visual consistency corrections were one-off implementation findings governed by the existing repository instruction to read DESIGN.md and keep architecture status current; they do not justify another duplicated rule.

No AGENTS.md or CLAUDE.md rule change is required, so instruction synchronization is not applicable to this head.

Follow-up

@mchwang

mchwang commented Oct 7, 2026

Copy link
Copy Markdown
Contributor Author

Copilot request preflight

  • Base/head: 29c6daa2ff91cf62d0fea717c86adb1d8882a3ce..dd3ddb8194fe49f1791aa43badcdea26af18b3fb
  • CI: both push and pull-request workflows passed on this head
  • Mergeability: mergeable; merge state clean
  • Unresolved review threads: 0
  • Deferred follow-up: Align plan import request limit with valid schema payloads #146, owned by Lane F, aligns the plan-import HTTP limit with the valid schema payload bound
  • Independent review: clean full-diff pass on the exact base/head above
  • Focused validation: Plans browser 10/10, typecheck, JavaScript syntax and diff checks passed

PR #143 is merged and the architecture blocker is resolved. Requesting the first Copilot review for this exact head.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Unresolved imports can lose retry identity, and delayed merge polls can overwrite refreshed state.

2 open findings
What changed in this PR

Delivers Lane G1’s Plans screen using the existing planning API, leaving authoring and suggestion controls for later work.

Changes:

  • Displays complete plans and imports JSON/YAML revisions.
  • Adds asynchronous response guards and draft-preservation coverage.
  • Documents G1 behavior and remaining planning work.
File Description
web/​public/​style.css Styles plan display and import controls.
web/​public/​index.html Adds Plans navigation and workspace.
web/​public/​app.js Implements rendering, imports, retries, and response guards.
test/​browser/​plans.spec.ts Tests imports, preservation, and asynchronous races.
docs/​implementation/​planning-screen.md Defines G1 contracts and acceptance coverage.
docs/​architecture.md Updates planning delivery status.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread web/public/app.js Outdated
Comment thread web/public/app.js Outdated
@mchwang

mchwang commented Oct 7, 2026

Copy link
Copy Markdown
Contributor Author

Copilot re-review preflight

  • Base/head: 29c6daa2ff91cf62d0fea717c86adb1d8882a3ce..b12ef6fa6e416013684327bcca7e0d5206c996bf
  • CI: both push and pull-request workflows passed on this head
  • Mergeability: mergeable; merge state clean
  • Unresolved review threads: 0 (both first-round findings replied to and resolved)
  • Deferred follow-up: Align plan import request limit with valid schema payloads #146 remains owned by Lane F
  • Independent review: clean full-diff pass on this exact pair
  • Focused validation: Plans browser 12/12, affected service tests 37/37, typecheck, JavaScript syntax and diff checks passed

Round 1 findings and regressions:

  1. Ambiguous import A, definite refusal B, refresh, retry A: failed before because B replaced/cleared A identity; now A replays the exact request and durable revision remains r2.
  2. Merge poll started during a held Plans refresh: failed before by overwriting the newer full response; now invalidated immediately before apply.
  3. Independent review found the analogous ordinary Review-refresh interleaving; it also failed before and now passes with a response marker proving apply occurs before the stale poll is released.

Requesting Copilot re-review for this exact head.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Shared-load failure handling and a question-poll race can leave Plans or Review displaying incorrect state.

0 open findings

2 resolved since last review
Previously missed (2)

In code that hasn't changed since last review

Medium severity Review failure leaves stale Plans data and hides the error

web/​public/​app.js:135

If a Review refresh starts and the user switches to Plans before it fails, showFailure() clears data but leaves the displayed plan and any “Revision rN is current” status intact. The error is hidden in Review, and Import then silently returns because data is null. Update the shared failure handler to mark Plans unavailable and show the error with a refresh instruction. Add a regression covering navigation to Plans before the Review refresh fails.

Medium severity Stale question poll overwrites completed answer after Plans refresh

web/​public/​app.js:1189

Plans refresh leaves busy false, so a /api/questions poll can start while /api/review is pending. If the full response renders a completed answer before that older poll returns, the poll still passes its reviewGeneration check and replaces the answer with its earlier pending state. Advance the shared generation again before applying the full response, updating the refresh's ownership value so its cleanup still runs. Add a controlled regression that releases the older question poll after the completed answer is rendered.

🧠 Review effort: Balanced


Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.

@mchwang

mchwang commented Oct 8, 2026

Copy link
Copy Markdown
Contributor Author

Copilot round 3 preflight

  • Base/head: 29c6daa2ff91cf62d0fea717c86adb1d8882a3ce..04f6efe0582e21dee0dbfa5c8aa1c851a6d879cb
  • CI: push run 37705445118 and pull-request run 37705450475 passed on this head
  • Mergeability: mergeable; merge state clean after checks
  • Unresolved inline review threads: 0
  • Deferred follow-up: Align plan import request limit with valid schema payloads #146 remains owned by Lane F
  • Independent review: clean full-diff pass on this exact pair after one test-proof finding was fixed and the full review repeated
  • Focused validation: Plans browser 14/14; typecheck, JavaScript syntax and diff checks passed

Round 2 summary concerns and regressions:

  1. Review refresh starts, user opens Plans, refresh fails: failed before by leaving the old plan visible and hiding the error; now Plans clears to unavailable and displays the refresh instruction.
  2. A question poll starts during held Plans refresh, the full response renders a completed answer, then the old poll returns pending: failed before by replacing the completed answer; now the full response advances shared generation immediately before apply.
  3. Independent review found that the second regression initially proved only response arrival; it now waits through the page continuation before asserting the completed answer remains.

Requesting Copilot re-review for this exact head.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

A delayed Plans refresh can overwrite a newer completed question answer with pending state.

0 open findings

Previously missed (1)

In code that hasn't changed since last review

Medium severity Plan refresh can overwrite completed answers with stale review results

web/​public/​app.js:1198

Plans refresh leaves busy false, so question polling can apply a completed answer while /api/review is pending. If that older review response contains the pending answer, this assignment removes the completed answer and restores “Answering…”. Poll updates do not advance reviewGeneration, and the increment above only rejects polls returning after the refresh. Suspend question polling while planRefreshPending is true, or preserve newer answers with a context-bound merge. Add the reverse-order regression: completed poll first, older refresh second; the existing test covers only refresh first, stale poll second.

🧠 Review effort: Balanced


Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.

@mchwang

mchwang commented Oct 8, 2026

Copy link
Copy Markdown
Contributor Author

Copilot round 4 preflight

  • Base/head: 29c6daa2ff91cf62d0fea717c86adb1d8882a3ce..6b7fd1518476198c4126f6885d0aa40487194f3e
  • CI: push run 37732081770 and pull-request run 37732085723 passed on this head
  • Mergeability: mergeable; merge state clean after checks
  • Unresolved inline review threads: 0
  • Deferred follow-up: Align plan import request limit with valid schema payloads #146 remains owned by Lane F
  • Independent review: clean full-diff pass on this exact pair; the reviewer mutation-checked the reverse regression
  • Focused validation: Plans browser 15/15; typecheck, JavaScript syntax and diff checks passed

Round 3 summary concern and regression:

  • A completed question poll applied while an older Plans refresh was held, then the old pending full response returned. The regression failed before because “Answering…” replaced the completed answer. The fix preserves the completed answer only when the note ID and immutable answer-attempt ID match the pending copy; refreshed note metadata, including stale-context flags, remains authoritative.
  • The independent reviewer removed only the preservation call in an in-memory served response and confirmed the exact regression failed, while different-note and different-attempt cases remain unpreserved.

Requesting Copilot re-review for this exact head.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Delayed Plans responses can still overwrite newer merge-queue observations and failed question answers.

2 open findings

🧠 Review effort: Balanced


Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.

Comment thread web/public/app.js Outdated
Comment thread web/public/app.js Outdated
@mchwang

mchwang commented Oct 8, 2026

Copy link
Copy Markdown
Contributor Author

Copilot round 5 preflight

  • Base/head: 29c6daa2ff91cf62d0fea717c86adb1d8882a3ce..01ad35835693b66683c0eb71d1a4e1fab1ae1f95
  • CI: push run 37735009287 and pull-request run 37735014757 passed on this head
  • Mergeability: exact remote state will be read back after resolving the addressed threads
  • Deferred follow-up: Align plan import request limit with valid schema payloads #146 remains owned by Lane F
  • Independent review: clean full-diff pass on this exact pair; four terminal poll-order browser regressions and direct terminal/identity guard checks passed
  • Focused validation: Plans browser 17/17; typecheck, JavaScript syntax and diff checks passed

Round 4 findings and regressions:

  • A terminal merge poll could apply while an older Plans refresh was held, then be overwritten by that older queued response. The regression failed before and passes after context-bound terminal queue reconciliation. Fresh blockers from the later full response remain authoritative.
  • A failed answer poll could apply while an older Plans refresh was held, then lose its error and Retry control to the older pending answer. The regression failed before and passes after settled-answer reconciliation keyed by note ID and immutable attempt ID.

Requesting Copilot re-review for this exact head.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Refresh races can still restore stale lifecycle state, and two regressions lack reliable response-settlement barriers.

2 open findings
2 resolved since last review
Previously missed (1)

In code that hasn't changed since last review

Medium severity Regressions assert before stale response handlers complete

test/​browser/​plans.spec.ts:275

The post-release assertions already hold before the held response returns: #reload reads Refresh and r2 is rendered. The merge regression at lines 475–477 has the same gap: its refresh label and disabled merge button already match. Both tests can pass before the page consumes the stale response, so they do not reliably exercise the generation guards. Add an explicit response-consumption/handler-settlement barrier at both release points before asserting retained state, and verify that removing each guard makes its regression fail.

🧠 Review effort: Balanced


Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.

Comment thread web/public/app.js
Comment thread web/public/app.js Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Two remaining response-ordering races can regress merge-queue state or disable restored retry readiness.

0 open findings

Previously missed (2)

In code that hasn't changed since last review

Medium severity Invalidate stale merge polling before applying action response

web/​public/​app.js:243

A merge poll can start while /api/action is pending: selecting another item calls renderMerge() and schedules polling under the action's mergeGeneration. If the action response restores retry readiness after queue removal, a delayed queued poll still passes its guard. withMergeQueue() then restores the old queue and forces ready: false. Invalidate and clear merge polling before applying this response, as the refresh paths do. Add a controlled regression that releases the stale poll after the action response.

Medium severity Preserve confirmed queued state over stale submitting refresh

web/​public/​app.js:817

This only preserves terminal queue states. If a Plans refresh captures submitting, then a poll confirms queued before the refresh returns, the same-attempt reconciliation returns null. Applying the older response restores “Submitting…” and loses the confirmed queue position. Preserve queued over submitting when the action ID and reviewed head match, and add a controlled regression for this ordering.

🧠 Review effort: Balanced


Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.

@mchwang

mchwang commented Oct 8, 2026

Copy link
Copy Markdown
Contributor Author

Copilot round 9 preflight

  • Base/head: 29c6daa2ff91cf62d0fea717c86adb1d8882a3ce..ff74fde4b3184cec710f55439095e05dae4621f8
  • CI: push run 37756477028 and pull-request run 37756482445 passed on this head
  • Mergeability: exact remote state will be read back before this request
  • Deferred follow-up: Align plan import request limit with valid schema payloads #146 remains owned by Lane F
  • Independent review: clean full-diff pass on this exact pair; combined Plans and Review browser validation passed 89/89, and no earlier valid finding remains
  • Focused validation: Plans browser 28/28; typecheck, JavaScript syntax and diff checks passed

Round 8 summary-only concerns and regressions:

  • A merge poll started during a Review action could replace retry readiness restored by the action response.
  • A response captured before queue progress could overwrite submitting-to-queued, terminal or same-state position/phase/error observations.
  • Review actions and full responses now capture accepted-poll ownership before their request, invalidate polls that settle afterward, and preserve a newer accepted observation only when immutable action ID and reviewed head both match.
  • Controlled tests cover both action/poll response orders, submitting-to-queued progress, a real Review write with queued position 3 advancing to position 2, and mismatched action/head observations. The real action note remains visible and durable. State-only, action-ID and reviewed-head mutations each make their corresponding regression fail.

Requesting Copilot re-review for this exact head.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Queue reconciliation can discard server-confirmed retry readiness when a terminal poll completes before Refresh.

1 open finding

🧠 Review effort: Balanced


Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.

Comment thread web/public/app.js Outdated
@mchwang

mchwang commented Oct 8, 2026

Copy link
Copy Markdown
Contributor Author

Copilot round 10 preflight

  • Base/head: 29c6daa2ff91cf62d0fea717c86adb1d8882a3ce..993599a2a1ad9cc578f5db26c7b4a1fbd4b83c80
  • CI: push run 37760781341 and pull-request run 37760789049 passed on this head
  • Mergeability: exact remote state will be read back before this request
  • Deferred follow-up: Align plan import request limit with valid schema payloads #146 remains owned by Lane F
  • Independent review: clean full-diff pass on this exact pair; combined Plans and Review browser validation passed 90/90, and no earlier valid finding remains
  • Focused validation: Plans browser 29/29; typecheck, JavaScript syntax and diff checks passed

Round 9 finding and regression:

  • A same-action/same-head terminal poll accepted during Refresh could replace the full response even when both reported the same terminal state, discarding server-verified retry readiness.
  • Queue reconciliation now preserves accepted lifecycle progress and identity boundaries, but lets the authoritative full response win for matching merged, removed or failed states.
  • The controlled test captures a real retry-ready Review response, applies and visibly asserts the matching terminal poll first, then settles the held Refresh and proves Retry merge is enabled. It fails under the old reconciliation and cannot self-heal because terminal state schedules no further poll.

Requesting Copilot re-review for this exact head.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Queue reconciliation can overwrite terminal full responses with active poll state and discard verified retry readiness.

1 open finding
1 resolved since last review

🧠 Review effort: Balanced


Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.

Comment thread web/public/app.js Outdated
@mchwang

mchwang commented Oct 8, 2026

Copy link
Copy Markdown
Contributor Author

Copilot round 11 preflight

  • Base/head: 29c6daa2ff91cf62d0fea717c86adb1d8882a3ce..7883fc3ab2514cf3f871188747b80d84a24628bb
  • CI: push run 37764410407 and pull-request run 37764417204 passed on this head
  • Mergeability: exact remote state will be read back before this request
  • Deferred follow-up: Align plan import request limit with valid schema payloads #146 remains owned by Lane F
  • Independent review: clean full-diff pass on this exact pair; combined Plans and Review browser validation passed 91/91, and no earlier valid finding remains
  • Focused validation: Plans browser 30/30; typecheck, JavaScript syntax and diff checks passed

Round 10 finding and regression:

  • An active queued poll accepted during Refresh could replace a terminal full response for the same action/head, discarding verified retry readiness.
  • Terminal full responses are now authoritative over active or terminal poll state; nonterminal full responses still preserve genuine same-action/same-head active progress or terminal transitions.
  • The controlled test asserts a real terminal retry-ready Review response, visibly applies queued position 2 first, settles the held Refresh, then proves Retry merge is enabled, the queued banner is gone, and durable state is removed. It fails under the prior reconciliation.

Requesting Copilot re-review for this exact head.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Merge reconciliation can replace confirmed queued progress with a stale submitting observation.

0 open findings

1 resolved since last review
Previously missed (1)

In code that hasn't changed since last review

Medium severity Preserve newer queued state over stale submitting poll

web/​public/​app.js:833

A poll accepted during Refresh can still describe an older lifecycle state. The inspection-error path in runner/merge.ts:470 returns the attempt captured when polling started. If that attempt was submitting, but the pending full response confirms queued for the same action/head, this condition preserves submitting and discards the confirmed queue position and phase. Observation generation tracks when a response was applied, not its freshness. Keep the full response when it advances submitting to queued, and add a controlled regression that applies the delayed submitting poll before releasing the queued full response.

🧠 Review effort: Balanced


Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.

@mchwang

mchwang commented Oct 8, 2026

Copy link
Copy Markdown
Contributor Author

Copilot round 12 preflight

  • Base/head: 29c6daa2ff91cf62d0fea717c86adb1d8882a3ce..8eb624f77bcd383b96aac446d7996543dbc446c4
  • CI: push run 37768169140 and pull-request run 37768177048 passed on this head
  • Mergeability: exact remote state will be read back before this request
  • Deferred follow-up: Align plan import request limit with valid schema payloads #146 remains owned by Lane F
  • Independent review: clean full-diff pass on this exact pair; combined Plans and Review browser validation passed 92/92, and no earlier valid finding remains
  • Focused validation: Plans browser 31/31; typecheck, JavaScript syntax and diff checks passed

Round 11 summary concern and regression:

  • A delayed submitting observation accepted during Refresh could replace a full response that already confirmed queued state, position and phase.
  • Queue reconciliation now treats queued as monotonic over submitting while retaining the reverse submitting-to-queued progress, same-state details, terminal transitions, and action/head identity boundaries.
  • The controlled test asserts a real queued position-3 full response, visibly applies the stale submitting/error state first, holds later polls, settles Refresh, then verifies the stale error is gone and position 3 remains visible and durable. It fails without the new guard.

Requesting Copilot re-review for this exact head.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Cross-screen response reconciliation affects irreversible merge-state handling and warrants final human review despite extensive regression coverage.

0 open findings

🧠 Review effort: Balanced


Give feedback about Copilot approvals in this survey to enter a drawing for a $150 gift card.

@mchwang

mchwang commented Oct 8, 2026

Copy link
Copy Markdown
Contributor Author

Lane G1 review loop converged on exact base/head 29c6daa2ff91cf62d0fea717c86adb1d8882a3ce..8eb624f77bcd383b96aac446d7996543dbc446c4.

  • Copilot round 12: zero open findings and no new summary concern
  • Unresolved review threads: zero
  • Independent full-diff review: clean on this exact pair; no earlier valid finding remains unresolved
  • Exact-head CI: push 37768169140 and pull request 37768177048 passed
  • Browser validation: Plans 31/31; combined Plans + Review 92/92 locally and independently
  • Typecheck, JavaScript syntax and diff checks passed
  • Docker/container suites were not run locally and are excluded from CI; this limitation remains explicit

The PR remains draft and unmerged pending owner direction.

@mchwang
mchwang marked this pull request as ready for review October 8, 2026 15:12
@mchwang
mchwang merged commit 26d03e6 into main Oct 8, 2026
3 checks passed
@mchwang
mchwang deleted the codex/lane-g1-planning-screen branch October 8, 2026 15:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants