Skip to content

VPS2 durable per-view state - independent-fix series (supersedes #34 + the 21-item upstream draft series) #41

Description

@easonLiangWorldedtech

Tracking issue for the vps2 durable per-view state series. Replaces fork PR #34 and the closed upstream series: PRs Zoo-Code-Org#966 Zoo-Code-Org#928 Zoo-Code-Org#979 Zoo-Code-Org#981 Zoo-Code-Org#983 and issues Zoo-Code-Org#967 Zoo-Code-Org#978 Zoo-Code-Org#980 Zoo-Code-Org#982 Zoo-Code-Org#984 Zoo-Code-Org#913 Zoo-Code-Org#915 Zoo-Code-Org#916 Zoo-Code-Org#917 Zoo-Code-Org#918 Zoo-Code-Org#919 Zoo-Code-Org#920 Zoo-Code-Org#921 Zoo-Code-Org#922 Zoo-Code-Org#923 Zoo-Code-Org#924 Zoo-Code-Org#929 Zoo-Code-Org#1065 — 23 of the 24 closed as superseded on 2026-09-05, each with a tracker-pointer comment naming the covering fix unit (or the out-of-scope reason); upstream Zoo-Code-Org#1065 carries the pointer comment but its close is permission-blocked (the account is not a repo admin, 403) — flagged for a maintainer.

  • Base of record: upstream/main @ 0d937c050810ebc305b34368bf6d6ae8c1f89966every fix PR bases on this commit (independence guarantee; stale sibling heads are porting sources only, never bases).

  • Main drift (2026-09-06): upstream/main advanced from the base of record to 8d296deef (9 commits; v3.82.0 — Release v3.82.0 Zoo-Code-Org/Zoo-Code#1533 release, [Fix] Task history disappears when user reopens a task Zoo-Code-Org/Zoo-Code#1319 task-history reopen, [Fix] Tasks stall when interrupted subtasks resume Zoo-Code-Org/Zoo-Code#1470 subtask-resume stall, [Fix] Commits fail after users interrupt mutation tests Zoo-Code-Org/Zoo-Code#1525, [Fix] Unit tests report teardown errors after Task cleanup Zoo-Code-Org/Zoo-Code#1527 teardown, [Chore] Bump GitHub Actions to node24 runtimes to fix Node 20 deprecation warnings Zoo-Code-Org/Zoo-Code#1534 node24 CI, [Feat] Add DeepSeek V4 Flash Vision Exp support Zoo-Code-Org/Zoo-Code#1488/[Feat] Add verified GPT-6 Astra support across providers Zoo-Code-Org/Zoo-Code#1506 providers). Porting-surface deltas: ClineProvider.ts — v3.82.0 announcement id (~L309); new drainTaskDisposal + rewritten dispose() that now evicts and disposes every registry task (~L812–860); reopenParentFromDelegation delegation-reopen fixes (~L4065–4272). Task.ts — 23 hunks (resume/eviction/teardown). ClineProvider.spec.ts — +127 new tests (~L1140) + 1 new Task-mock member (~L266). Both shipped PRs remain MERGEABLE, all CI green. The stack keeps the base of record for content porting (no-wait policy: rebase onto main after the lower PRs merge). Interaction flags: F2's Preserve durable editor view state across provider disposal Zoo-Code-Org/Zoo-Code#1065 dispose-retention test must be re-verified after the stack merges (new dispose() now drains tasks); F3's Task.ts port must be verified against the new main's 23-hunk delta; F1a/F1b spec content has no textual conflict (PRs MERGEABLE). 2026-09-07: upstream/main has further advanced to 4c7474d42 (re-verified; the interaction flags above remain the watch items). Rebase (post-[Fix] Provider settings contact unselected model services Zoo-Code-Org/Zoo-Code#1425): upstream/main advanced 4c7474d42a3e31e14b (2026-09-07); the whole F0–F7 chain was re-stacked onto a3e31e14b in one pass and force-pushed (2026-09-07). Only series conflict: src/eslint-suppressions.json at F3 — main's [Fix] Provider settings contact unselected model services Zoo-Code-Org/Zoo-Code#1425 had lowered core/webview/ClineProvider.ts no-explicit-any 12→8 while the series had 12→11; resolved to 7 (= main's 8 − F3's net −1; F4–F7 proven neutral via parent-chain arithmetic), the ClineProvider.sticky-mode.spec.ts entry auto-merged at 33; both verified with the repo's own pnpm exec eslint --prune-suppressions --max-warnings=0 gate on the final tree (exit 0, count held, 346 entries semantic-identical to the committed blob) — suppression counts never increased. New heads (the table's State and Stack-base cells carry the re-stacked chain): F0 e6bc7a294 · F1a 3c43a9e7c · F1b a37d0850e · F1c 6021fee5d · F2 92b109654 · F3 7d91ff4bd · F4 da97f98ee · F5 cfa678f1c · F6 09876aeea · F7 ac364cb20; chain parents verified via rev-parse <sha>^ (F0′ on main, each next on the previous). The series diff content is byte-identical to the pre-rebase series ([Fix] Provider settings contact unselected model services Zoo-Code-Org/Zoo-Code#1425 touches no series file), so all local gate evidence (mutation/stryker/lint) remains valid; CI re-runs on the new heads. F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 marked ready for review 2026-09-07 — the serial bot-wait sequence (F0→F1a→…→F7) is in progress; the stale has-conflicts labels on fix(api): wire task controls and sidebar-targeted configuration (vps2 F5) Zoo-Code-Org/Zoo-Code#1557/fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560/fix(webview): invalidate live sibling view state on reset and settings import (vps2 F4) Zoo-Code-Org/Zoo-Code#1562/test(e2e): port view-state suite with reload and rehydration coverage (vps2 F6) Zoo-Code-Org/Zoo-Code#1565/fix(webview): show modes skeleton until view state loads (vps2 F7) Zoo-Code-Org/Zoo-Code#1567 (pre-rebase) are cleared only by the repo's reconcile workflow — label removal is admin-only for this account (403 verified), so no manual removal attempted. Bot-flow calibration (F0, 2026-09-07): the shared CI runner queue holds ~110 jobs across the 10 new heads (~3/min drain observed: mutation-diff 06:14, windows unit-test 06:18, e2e-mock 06:22 — 11 F0 jobs still QUEUED at 06:35); the Label PR review state labeler self-cascades via its own workflow_run events (~25s runs superseding each other, no PR context, no label changes) while its pull_request/issue_comment-triggered runs queue behind the CI jobs — so F0's labels (incl. the 5 stale has-conflicts clears) are expected to land ~30+ min after the last push; CodeRabbit re-review of the new head in progress since 06:11:50Z; F0 = the serial sequence's calibration PR before F1a feat(provider): persist per-view view-state identity and durable viewStates Zoo-Code-Org/Zoo-Code#1546 is marked ready. Required-check ruleset (2026-09-07, public /rules/branches/main): the required status checks are exactly check-translations, platform-unit-test (ubuntu-latest), platform-unit-test (windows-latest), compile, knip, e2e-mock — the labeler's awaiting-maintainer needs all six green on the head + a fresh CodeRabbit APPROVED review on the head sha + mergeable. Consequences: (a) mutation-diff is advisory — F4 fix(webview): invalidate live sibling view state on reset and settings import (vps2 F4) Zoo-Code-Org/Zoo-Code#1562's deterministic gate failure (509 > 500 changed executable lines; the cumulative F0–F4 stack diff) does NOT block the serial bot pass (visible to the maintainer; the gate's own guidance: "Split the PR or obtain a maintainer-reviewed narrow exclusion"; F5–F7 cumulative diffs exceed the same advisory limit and their mutation runs are expected non-blocking failures). (b) e2e-mock IS required, so the 3 red new-head e2e runs on draft heads would have blocked their PRs' passes: F1b fix(core/webview): merge view-local state into getState for per-view overrides Zoo-Code-Org/Zoo-Code#1550 (60s timeouts on search_files no matches + terminal reuse zero-chunk), F6 test(e2e): port view-state suite with reload and rehydration coverage (vps2 F6) Zoo-Code-Org/Zoo-Code#1565 and F7 fix(webview): show modes skeleton until view state loads (vps2 F7) Zoo-Code-Org/Zoo-Code#1567 (30s timeout on the F6/F7 3-panel coordinated-round test) — all load flakes (F0's identical suite passed 87/87 on the same queue). gh run rerun is admin-only (403), so each was re-triggered with an empty no-op commit (0-line diff; upper-stack branches unaffected — F1c–F6' remain parented on the pre-empty-commit F1b/F6 heads): F1b a37d0850edfc87297f, F6 09876aeea3d96e65f1, F7 ac364cb20b8b6ef39c (2026-09-07; all 3 PRs re-verified MERGEABLE on the new heads). Serial progress (2026-09-07 ~06:45Z): F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 required checks 3/6 green (windows unit-test 06:18, e2e-mock 06:22, knip 06:25); check-translations / platform-unit-test (ubuntu-latest) / compile still queued inside F0's own Code QA run (06:11:47 — ahead of the 06:31 empty-commit runs), CodeRabbit re-review in progress since 06:11:50Z, labels still []. Labeler mechanics confirmed working: 2 SUCCESS reconcile runs (06:12:10 issue_comment, 06:26:13 workflow_run) — the stale has-conflicts on fix(webview): show modes skeleton until view state loads (vps2 F7) Zoo-Code-Org/Zoo-Code#1567 was cleared by the labeler (only fix(api): wire task controls and sidebar-targeted configuration (vps2 F5) Zoo-Code-Org/Zoo-Code#1557/fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560/fix(webview): invalidate live sibling view state on reset and settings import (vps2 F4) Zoo-Code-Org/Zoo-Code#1562/test(e2e): port view-state suite with reload and rehydration coverage (vps2 F6) Zoo-Code-Org/Zoo-Code#1565 remain; they clear when a PR-context or associated run reconciles each branch — no action needed; drain ≈1–2 real runs/min). New-head e2e outcomes so far: F5 fix(api): wire task controls and sidebar-targeted configuration (vps2 F5) Zoo-Code-Org/Zoo-Code#1557 passed (cfa678f), F4 fix(webview): invalidate live sibling view state on reset and settings import (vps2 F4) Zoo-Code-Org/Zoo-Code#1562 in progress, F3 fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560 queued (flake risk — if it flakes, same empty-commit lever applies, severing the F3/F4 parent seam in the same harmless pattern as F1b/F1c and F6/F7). CodeRabbit has started fresh reviews of the new F1b+/F6+/F7+ heads (status comments 06:31–06:32Z). F1a feat(provider): persist per-view view-state identity and durable viewStates Zoo-Code-Org/Zoo-Code#1546 stays draft until F0 reaches awaiting-maintainer. Serial progress (2026-09-07 ~06:38Z, round 4): CodeRabbit mechanism fully decoded from .github/workflows/label-pr-review-state.yml (L55–89, L250–307, L608–747) — CodeRabbit auto-review is LABEL-GATED (.coderabbit.yaml: required label coderabbit-review-active; the 09-04 "Review skipped" comment on F0's old head confirms it). The labeler: (a) while any required check is pending/failed → strips state labels AND removes coderabbit-review-active (L610–621) — this is exactly why F0's labels are [] right now; (b) when all required checks pass on head + not draft + no fresh CodeRabbit APPROVED → sets activateCodeRabbit=true + recycleCodeRabbitLabel (L695–696) → adds coderabbit-review-active + awaiting-coderabbit (L747); (c) CodeRabbit then reviews the head sha and submits a formal review; (d) a later labeler run (triggered by CodeRabbit's summary comment = issue_comment) sees freshCodeRabbitReview.state === 'APPROVED' on the head sha (L644–663) + mergeable + not draft → awaiting-maintainer (L704). So the CodeRabbit "in-progress" status context since 06:11:50Z is the label-wait state, not an active review — it starts only after the required-CI-green labeler run. F0 now 3/6 green; the 3 queued required jobs (check-translations, platform-unit-test (ubuntu-latest), compile) sit inside F0's own Code QA run 34089750771 (its Build test VSIX in_progress since 06:35:10Z; F0's Visual Regression run started in_progress after) — F0's runs are draining ahead of the 06:31 empty-commit runs. Stale has-conflicts: fix(webview): show modes skeleton until view state loads (vps2 F7) Zoo-Code-Org/Zoo-Code#1567 and fix(api): wire task controls and sidebar-targeted configuration (vps2 F5) Zoo-Code-Org/Zoo-Code#1557 cleared by the labeler (5→3; fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560/fix(webview): invalidate live sibling view state on reset and settings import (vps2 F4) Zoo-Code-Org/Zoo-Code#1562/test(e2e): port view-state suite with reload and rehydration coverage (vps2 F6) Zoo-Code-Org/Zoo-Code#1565 remain). New-head re-trigger runs healthy: F1b+ (dfc8729) e2e + mutation in_progress; F4 (da97f98) e2e in_progress; F6+/F7+ e2e queued. Global queue (100-run window): 22 queued / 6 in_progress / 18 success / 9 failure / 45 cancelled (cancelled = old-head superseded by the empty commits). No action available from this account until F0's 6/6 lands (no gh run rerun, no label ops); expect F0 awaiting-maintainer roughly 30–90 min after the last required job completes (CI green → labeler label → CodeRabbit review ~15–30 min → APPROVED → next labeler run). Serial progress (2026-09-07 ~06:45Z, round 5): found and pre-empted 4 more flaky new-head runs before their serial turns — F1c fix(webview): send stable view-state id on launch and re-pin per-view state Zoo-Code-Org/Zoo-Code#1552 / F2 test(webview): add parallelMode spec with viewStates pruning edges and dispose retention Zoo-Code-Org/Zoo-Code#1555 / F3 fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560 e2e-mock failed at the Run mocked E2E tests step (load flake, same signature as F1b; F0/F5's identical suites passed in the same 06:11–06:12Z window) and F5 fix(api): wire task controls and sidebar-targeted configuration (vps2 F5) Zoo-Code-Org/Zoo-Code#1557's platform-unit-test (windows-latest) failed at the Save Turbo cache step (the test step itself passed — infra flake; all other Code QA jobs green). Re-triggered all 4 with empty no-op commits (0-line diff; each pre-push check-types 11/11 passed): F1c 6021fee5d9712eb25d, F2 92b1096549b7c701fe, F3 7d91ff4bdda47c6977, F5 cfa678f1c5d0a09b89 — all 4 re-verified MERGEABLE via gh pr view. Pushes hit a burst of github.com:443 connection flakes (1–3 retries each, all eventually exit 0; F1c pushed from vps2-f1c-wt since that branch is checked out there, F2/F3/F5 from vps2-rebase). The mutation-gate failures on new heads (F3/F4/F5/F6+/F7+ cumulative diffs > 500 changed lines) confirmed as the known ADVISORY fast-fails — non-blocking. F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 at round 5: 4/6 required green, compile + platform-unit-test (ubuntu-latest) in_progress since 06:37:53Z inside its own Code QA run — the 2 jobs on F0's critical path to awaiting-maintainer. All 10 heads now: F0 e6bc7a294 / F1a 3c43a9e7c / F1b dfc87297f / F1c 9712eb25d / F2 9b7c701fe / F3 da47c6977 / F4 da97f98ee / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c (all MERGEABLE). Serial progress (2026-09-07 ~06:46Z, round 6): F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 6/6 required checks green (all 6 COMPLETED SUCCESS: check-translations 06:37, ubuntu unit-test 06:37, windows unit-test 06:18, compile 06:37, knip 06:25, e2e-mock 06:22). Labels still [], reviews [], CodeRabbit context still in_progress (label-wait since 06:11:50). The 6th required check (ubuntu unit-test) went green ~06:44–06:45, which should have triggered a workflow_run labeler event; indeed a labeler workflow_run run was created at 06:46:43Z (pending) but is part of a self-cascade where 11 labeler runs in the 06:42–06:46 window were cancelled by newer events (the 4 empty-commit pushes + their CI completions). 2 labeler runs remain: pending [workflow_run] 06:46:43Z id=34092347288 (most likely to complete and act on F0) and queued [pull_request_target] 06:41:42Z id=34091974282 (F1c's push event, stuck in runner queue ~5 min). When either completes, the labeler should see F0 6/6 + not draft + no CodeRabbit review → add coderabbit-review-active + awaiting-coderabbit → CodeRabbit starts reviewing head e6bc7a294. 4 re-trigger heads CI status: F1c (9712eb2) e2e in_progress + mutation in_progress + Code QA queued; F2 (9b7c701) e2e in_progress + mutation in_progress + Code QA queued; F3 (da47c69) e2e in_progress + Code QA queued + mutation queued; F5 (5d0a09b) CodeQL in_progress, all else queued. No new flakes observed. F1a feat(provider): persist per-view view-state identity and durable viewStates Zoo-Code-Org/Zoo-Code#1546 stays draft until F0 reaches awaiting-maintainer. Serial progress (2026-09-07 ~06:56Z, round 7): diagnosed why F0 (6/6 on e6bc7a294) never got bot labels: the labeler's PR-selection logic (decoded from label-pr-review-state.yml L100–149) reconciles ONLY the event-triggering PR(s) for workflow_run/pull_request_target/issue_comment runs (eventPrNumbers); full-repo reconciliation happens only for main-branch pushes, the schedule trigger, and workflow_dispatch. F0's own CI-completion events were all consumed by cascade-cancelled runs: E2E completion 06:23:09Z → run 34090591922 cancelled 1s later; Code QA completion 06:46:30Z → runs 34092334369/34092342380/34092347288 all cancelled. The live base-repo workflow DOES have a schedule trigger (last success 05:22:15Z; daily pattern, not hourly — our worktree copy lacks it) and a push trigger (02:36:15Z success), so without action F0 would have waited until the next daily schedule (~05:22Z) or a maintainer. Levers checked and ruled out: workflow_dispatch via API = 403 (admin rights required); all 5 CODEOWNERS (taltas JamesRobert20 navedmerchant hannesrudolph edelauna) already review-requested on F0 so no fresh review_requested event is possible; no org teams exist to request. Lever used: empty no-op commit on F0 (06:55Z, pre-push check-types 11/11 cached) → new head 591805850 (parent e6bc7a294, 0-line diff) → fired a synchronize pull_request_target labeler run (06:55:30Z, in_progress at snapshot) and re-triggered F0's full CI on the new head. F0 6/6 on 591805850 expected ~07:15–07:30Z; the last trigger-workflow completion (Code QA) then fires an F0-targeted labeler run that should see 6/6 + not-draft + no fresh CodeRabbit APPROVED → add coderabbit-review-active + awaiting-coderabbit → CodeRabbit reviews head 591805850 (~15–30 min) → awaiting-maintainer. F5 fix(api): wire task controls and sidebar-targeted configuration (vps2 F5) Zoo-Code-Org/Zoo-Code#1557's new-head Changed-code mutation testing failed at 06:44:37Z (advisory gate, cumulative diff > 500 changed lines — the known non-blocking fast-fail). 4 re-trigger heads at 06:49Z: F1c/F2/F3/F5 e2e all in_progress, no new blocking flakes. All 10 PRs re-verified MERGEABLE post-push: F0 591805850 (isDraft=false) / F1a 3c43a9e7c / F1b dfc87297f / F1c 9712eb25d / F2 9b7c701fe / F3 da47c6977 / F4 da97f98ee / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c. Serial progress (2026-09-07 ~07:01Z, round 8): two more e2e-mock load flakes confirmed and re-triggered. F1c fix(webview): send stable view-state id on launch and re-pin per-view state Zoo-Code-Org/Zoo-Code#1552's e2e on head 9712eb25d (run 34091976148) and F2 test(webview): add parallelMode spec with viewStates pruning edges and dispose retention Zoo-Code-Org/Zoo-Code#1555's e2e on head 9b7c701fe (run 34092036909) both failed at the Run mocked E2E tests step with an identical signature: 83 passing / 2 failing, the two failures being Roo Code search_files Tool → Should handle search with no matches and Terminal reuse after zero-chunk shell race → completes two sequential zero-chunk commands on a reused terminal, each Error: Timeout after 60s at out/suite/utils.js:15:20 — both tests unrelated to the F1c/F2 diff (webview identity / durable viewstates), same load class as the documented 60s timeouts (pre-existing; the timing out test varies per run). Re-triggered both with empty no-op commits (pre-push check-types 11/11 cached): F1c 9712eb25d40f538f2b (pushed from vps2-f1c-wt; first push attempt exit 128 github.com:443 flake, retry exit 0), F2 9b7c701fe3dcf4bfe3 (from vps2-rebase; first ls-remote attempt flaked, retry ok). Both synchronize labeler runs completed SUCCESS; new-head CI re-triggered (F1c e2e in_progress 07:00Z, F2 e2e queued 07:00:30Z). F5 fix(api): wire task controls and sidebar-targeted configuration (vps2 F5) Zoo-Code-Org/Zoo-Code#1557's e2e on head 5d0a09b89 is now success (round-5 re-trigger fixed the windows unit-test flake and e2e passed; its only remaining failure = the advisory mutation gate). F3 fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560's e2e on da47c6977 still in_progress (started 06:43:21Z) — verdict pending. F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 on new head 591805850: 4/6 required green at snapshot (check-translations / knip / compile / ubuntu unit-test all SUCCESS from the 06:55Z start — turbo cache had ubuntu unit-test finish in <1 min); e2e-mock + platform-unit-test (windows-latest) in_progress, 6/6 expected ~07:10–07:25Z. All 10 PRs MERGEABLE. Head list: F0 591805850 / F1a 3c43a9e7c / F1b dfc87297f / F1c 40f538f2b / F2 3dcf4bfe3 / F3 da47c6977 / F4 da97f98ee / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c. Serial progress (2026-09-07 ~07:07Z, round 9): F1a feat(provider): persist per-view view-state identity and durable viewStates Zoo-Code-Org/Zoo-Code#1546's CI is now 6/6 required green (all SUCCESS on head 3c43a9e7c; mutation gate also green) — the first PR in the chain with fully green CI. Two more e2e-mock load flakes found and re-triggered. F1b fix(core/webview): merge view-local state into getState for per-view overrides Zoo-Code-Org/Zoo-Code#1550's e2e on re-trigger head dfc87297f (run 34091203542, failed 06:40:05Z) — same load-class signature: 83 passing / 2 failing, 60s timeouts — re-triggered with an empty commit dfc87297fd6789c0b8 (from vps2-f1b-wt; new-head CI in_progress 07:05:27Z). F4 fix(webview): invalidate live sibling view state on reset and settings import (vps2 F4) Zoo-Code-Org/Zoo-Code#1562's e2e on da97f98ee (run 34089757832, failed 06:44:16Z after a 33-minute run that started 06:11Z during peak concurrent e2e load) — heavier load-class signature: 72 passing / 13 failing, suite time 14m (vs ~5m normal), all failures being provider e2e task-completion tests (Bedrock provider … Claude Opus 4.8, DeepSeek V4 flash/pro … tool-using task with reasoning enabled, Gemini provider gemini-3-flash-preview … reasoning effort, xAI provider … xAI Responses API …) each timing out at 30s/180s — pure runner-overload timeouts unrelated to the F4 diff; F0 and F5 passed the same suites in the same window. Re-triggered F4 with an empty commit da97f98eeb6aea7e8d (from vps2-rebase; new-head CI queued 07:06:07Z). F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 on 591805850: 5/6 required green at snapshot (e2e-mock turned SUCCESS ~07:02Z; only platform-unit-test (windows-latest) in_progress, expected green ~07:05–07:15Z). F3 fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560's e2e on da47c6977 still in_progress (started 06:43:21Z). F5 fix(api): wire task controls and sidebar-targeted configuration (vps2 F5) Zoo-Code-Org/Zoo-Code#1557's e2e on 5d0a09b89 is green (only the advisory mutation failure remains). All 10 PRs MERGEABLE. Head list: F0 591805850 / F1a 3c43a9e7c / F1b d6789c0b8 / F1c 40f538f2b / F2 3dcf4bfe3 / F3 da47c6977 / F4 b6aea7e8d / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c. Serial progress (2026-09-07 ~07:10Z, round 10): F1c fix(webview): send stable view-state id on launch and re-pin per-view state Zoo-Code-Org/Zoo-Code#1552's e2e failed a second time on re-trigger head 40f538f2b (run 34093336590, failed 07:07:07Z; 7-min run) with the identical load-class signature — 83 passing / 2 failing, the same two tests (Roo Code search_files Tool → Should handle search with no matches and Terminal reuse after zero-chunk shell race → … reused terminal, both Error: Timeout after 60s), plus [Terminal Process] Stream error: VSCE shell integration stream did not start within 5 seconds. F3 fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560's e2e also failed on da47c6977 (run 34092094608, failed 07:04:19Z; 21-min run) with the same heavy load-class profile as F4: 72 passing / 13 failing, suite 15m (vs ~5m normal), provider e2e task-completion timeouts at 30s/180s. Load-window correlation: every e2e failure so far belongs to a run started 06:11–06:44Z (peak concurrency, 8+ e2e suites); runs started 06:44Z+ (F5 5d0a09b89, F0 591805850) passed the full suite in the same window — consistent with runner-overload flakes, not a diff regression (F1c's diff is webview identity, F3's is mode/profile writes; neither touches search_files or terminal fixtures). Re-triggered both with empty no-op commits (pre-push hooks passed): F1c 40f538f2b1c90a81b2 (3rd re-trigger, from vps2-f1c-wt, pushed 07:08Z), F3 da47c6977f930a24ad (1st re-trigger, from vps2-rebase, pushed 07:09Z); new-head CI queued 07:08:27Z / 07:09:49Z; both synchronize labeler runs SUCCESS. F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 on 591805850: 5/6 required green at snapshot — platform-unit-test (windows-latest) and the Code QA Roo Code workflow (started 06:55:43Z) still in_progress; 6/6 expected ~07:15–07:30Z, after which F0's own trigger-workflow completion fires the F0-targeted labeler run for coderabbit-review-active + awaiting-coderabbit. E2E suites still running at snapshot: F1b d6789c0b8, F1c 1c90a81b2, F2 3dcf4bfe3, F3 f930a24ad, F4 b6aea7e8d. All 10 PRs MERGEABLE. Head list: F0 591805850 / F1a 3c43a9e7c / F1b d6789c0b8 / F1c 1c90a81b2 / F2 3dcf4bfe3 / F3 f930a24ad / F4 b6aea7e8d / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c. Serial progress (2026-09-07 ~07:12Z, round 11): F2 test(webview): add parallelMode spec with viewStates pruning edges and dispose retention Zoo-Code-Org/Zoo-Code#1555's e2e failed a second time on re-trigger head 3dcf4bfe3 (run 34093379072, failed 07:08:06Z; 7.5-min run) with the same load-class signature: 83 passing / 2 failing, the same two tests (Roo Code search_files Tool → Should handle search with no matches, Terminal reuse after zero-chunk shell race → … reused terminal), both Error: Timeout after 60s — F2's diff (durable viewStates pruning) does not touch search/terminal. Re-triggered with an empty commit 3dcf4bfe38dd2a17ae (from vps2-rebase, pushed 07:11Z; new-head CI queued 07:11:45Z; synchronize labeler run SUCCESS). Load-window correlation refined: failures so far belong to runs started 06:11–06:44Z (peak concurrency) and to two runs started 07:00Z (F1c feat(api): introduce RequestConfigBuilder for SDK-agnostic abort signal support #2 40f538f2b, F2 feat(api): introduce RequestConfigBuilder for SDK-agnostic abort signal support #2 3dcf4bfe3); runs started 06:44–06:55Z (F5 5d0a09b89, F0 591805850) passed the full suite in the same window. Every failure shows the same two borderline 60s tests timing out — consistent with runner contention, not a diff regression (no diff in the series touches search/terminal fixtures). F4 fix(webview): invalidate live sibling view state on reset and settings import (vps2 F4) Zoo-Code-Org/Zoo-Code#1562's new-head Changed-code mutation testing failed (advisory gate, cumulative >500-line fast-fail — known non-blocking). F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 on 591805850: 5/6 required green at snapshot — platform-unit-test (windows-latest) in_progress since 06:55:34Z and the Code QA Roo Code workflow still in_progress since 06:55:43Z; 6/6 expected ~07:15–07:30Z. E2E suites running at snapshot: F1b d6789c0b8, F1c 1c90a81b2, F3 f930a24ad, F4 b6aea7e8d + F2 8dd2a17ae (queued). All 10 PRs MERGEABLE. Head list: F0 591805850 / F1a 3c43a9e7c / F1b d6789c0b8 / F1c 1c90a81b2 / F2 8dd2a17ae / F3 f930a24ad / F4 b6aea7e8d / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c. Serial progress (2026-09-07 ~07:18Z, round 12): F1b fix(core/webview): merge view-local state into getState for per-view overrides Zoo-Code-Org/Zoo-Code#1550's e2e failed a second time on re-trigger head d6789c0b8 (run 34093770028, failed 07:12:25Z; 7-min run) with the identical load-class signature: 83 passing / 2 failing, the same two tests (Roo Code search_files Tool → Should handle search with no matches, Terminal reuse after zero-chunk shell race → … reused terminal), both Error: Timeout after 60s — F1b's diff (getState merge) does not touch search/terminal. Re-triggered with an empty commit d6789c0b8019c84dcf (3rd re-trigger, from vps2-f1b-wt, pushed 07:17Z; new-head CI started 07:17:22Z; synchronize labeler run SUCCESS). F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 label progress: F0's own Code QA Roo Code run completed SUCCESS 07:12:14Z; the F0-targeted labeler run it spawned (workflow_run event, queued since 07:12:17Z, held under runner contention while e2e suites ran, completed 07:17:08Z) applied labels coderabbit-review-active + awaiting-coderabbit to F0. F0 state now: 6/6 required green + mutation SUCCESS + not draft + MERGEABLE + labeled. Next step: CodeRabbit auto-review (label-gated) reviews head 591805850 — the fresh review must carry commit_id === 591805850…; once its state reaches APPROVED the next labeler run applies awaiting-maintainer (terminal bot-pass state), after which serial policy runs gh pr ready 1546 (F1a). E2E suites running at snapshot: F1b 019c84dcf (just started), F1c 1c90a81b2, F3 f930a24ad, F4 b6aea7e8d + F2 8dd2a17ae (queued). All 10 PRs MERGEABLE. Head list: F0 591805850 / F1a 3c43a9e7c / F1b 019c84dcf / F1c 1c90a81b2 / F2 8dd2a17ae / F3 f930a24ad / F4 b6aea7e8d / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c. Serial progress (2026-09-07 ~07:27Z, round 13): F1c fix(webview): send stable view-state id on launch and re-pin per-view state Zoo-Code-Org/Zoo-Code#1552's e2e failed a third time on 1c90a81b2 (run 34094008573, failed 07:17:06Z; 9-min run) with the identical load-class signature — 83 passing / 2 failing, same two tests (search_files Tool → no matches, Terminal reuse after zero-chunk shell race), both Error: Timeout after 60s. F2 test(webview): add parallelMode spec with viewStates pruning edges and dispose retention Zoo-Code-Org/Zoo-Code#1555's e2e failed a third time on 8dd2a17ae (run 34094281444, failed 07:19:26Z; 7.5-min run) with the identical 83/2 signature. F4 fix(webview): invalidate live sibling view state on reset and settings import (vps2 F4) Zoo-Code-Org/Zoo-Code#1562's e2e failed a second time on b6aea7e8d (run 34093822847, failed 07:23:14Z; 17-min run) with the heavy overload-class signature — 13 failing, provider task-completion timeouts at 30s/180s, same as its first failure. Load-class taxonomy now: (a) 83/2 with 2×60s timeouts on the two borderline tests under 3–4 concurrent e2e suites (F1c×3, F2×3, F1b×2); (b) 72/13 with 30s/180s provider timeouts on 14–17-min runs (F3 first head, F4×2). Runs under ~3 concurrency passed (F5, F0, F1a). Staggered re-trigger strategy: pushed F1c's 4th re-trigger 1c90a81b203c46f714 (from vps2-f1c-wt, 07:25:59Z; new-head CI started immediately, e2e in_progress) into the slot freed by F4's completion; F2's 4th and F4's 2nd re-triggers deliberately deferred to keep concurrent e2e suites ≤3 (F1c is earlier in chain order than F2/F4). F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528: coderabbit-review-active + awaiting-coderabbit labels applied 07:17:08Z; CodeRabbit review of head 591805850 not yet posted at 07:25Z (label applied 07:17:08Z — CodeRabbit typically 15–30 min → expected ~07:32–07:47Z); 6/6 required green. E2E in flight at snapshot: F1b 019c84dcf (started 07:17:22Z), F3 f930a24ad (started 07:09:49Z, 14-min overload class), F1c 03c46f714 (started 07:25:59Z). All 10 PRs MERGEABLE. Head list: F0 591805850 / F1a 3c43a9e7c / F1b 019c84dcf / F1c 03c46f714 / F2 8dd2a17ae / F3 f930a24ad / F4 b6aea7e8d / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c. Serial progress (2026-09-07 ~07:50Z, round 14): F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528: CodeRabbit posted a CHANGES_REQUESTED review of head 591805850 (2026-09-07T07:26:51Z, run 4afe1273-8739-4235-90d3-311db5f6ccb9, ASSERTIVE, 2 actionable comments) and the labeler flipped F0 to awaiting-author. Both comments verified valid against the code: (a) openClineInNewTab race — two concurrent calls can each find no tab panel and create two; (b) test hygiene — @ts-ignore private view assignment in ClineProvider.spec.ts and as any fixture attachment in registerCommands.spec.ts. Fix implemented in vps2-f0-wt (4 files, +123/−88): registerCommands.ts tracks in-flight tab-panel creation in a module-level pendingTabPanelCreation promise (early-return when present; try/finally clears once settled) + new Promise.all concurrent-open regression test (one panel, one provider); ClineProvider.spec.ts sets the view via the public resolveWebviewView() instead of @ts-ignore; registerCommands.spec.ts types evictCurrentTask/refreshWorkspace as Mock on the fixture (drops as any); eslint-suppressions.json prunes the registerCommands.spec.ts entry (count 2→0; file kept in tab format — the --prune-suppressions plugin's full-file 3457-line reformat was rejected as out-of-scope). Gates: eslint --prune-suppressions --max-warnings=0 EXIT:0 on all three touched TS files; vitest 195/195 on the two touched suites. Committed 8d0d44bc3, pushed 07:47Z (first push attempt hit a transient github.com:443 connect failure; retry OK). PR head now 8d0d44bc3 (MERGEABLE, not draft, labels cleared); full CI + fresh CodeRabbit review will run on the new head — the prior CHANGES_REQUESTED on 591805850 is moot. F1b fix(core/webview): merge view-local state into getState for per-view overrides Zoo-Code-Org/Zoo-Code#1550: 3rd e2e failure confirmed the 83/2 load class (run 34094742771 on 019c84dcf, failed 07:25:41Z, ~8 min, same two tests, 60s timeouts); pushed 4th re-trigger 6d13672b4 (0-line). F3 fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560: e2e failed (run 34094119260, failed 07:27:23Z, ~17.5 min; 72 passing/13 failing, 30s/180s provider timeouts — overload class) AND platform-unit-test (windows-latest) failed in the run named Code QA Roo Code (run 34094119188, failed 07:25:12Z) — all three coverage steps succeeded; the failure was the Save Turbo cache step (actions/cache infra flake, not a test failure); advisory mutation failure (34094119123) noted. Pushed F3 re-trigger 78f2a8296 (0-line; re-runs e2e + windows unit test). F1c fix(webview): send stable view-state id on launch and re-pin per-view state Zoo-Code-Org/Zoo-Code#1552: 4th e2e failure (run 34095436919, failed 07:33:09Z) — 83/2 load class again; 5th re-trigger deferred under the stagger rule. E2E pool after pushes (≤3 concurrent): F0 8d0d44bc3 (starting), F1b 6d13672b4 (queued), F3 78f2a8296 (queued); deferred: F1c 5th, F2 4th, F4 2nd — next pushes only when pool ≤2. Post-push sweep 07:50Z: all 10 PRs MERGEABLE. Head list: F0 8d0d44bc3 / F1a 3c43a9e7c / F1b 6d13672b4 / F1c 03c46f714 / F2 8dd2a17ae / F3 78f2a8296 / F4 b6aea7e8d / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c. Round 15 (2026-09-07 ~08:04Z): F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ 8d0d44bc3 — all 6 required checks now green (e2e-mock run 34097208497 07:52:56Z; platform-unit-test ubuntu+windows; compile; knip; check-translations); mutation-diff FAILURE (run 34097208546) verified advisory-only (branch ruleset /rules/branches/main re-queried: required_status_checks = exactly the 6 contexts above; mutation-diff not required ⇒ does not block bot pass) — cause: the 8d0d44bc3 IIFE wrapper re-indented the whole openClineInNewTab creation body, widening the diff-based changed-lines scope to ~38 previously-out-of-scope body lines (23 survived + 15 uncovered; the un-pinned lines: MdmService catch branch, unused ternary branches, event-listener callbacks, un-asserted strings/commands — pre-existing upstream lines the tests never pinned, surfaced only by the re-indent); per series policy no content change for advisory gates. Labels now awaiting-coderabbit + coderabbit-review-active (labeler re-queued after push) → fresh CodeRabbit review in flight (ETA 10–30 min); awaiting-maintainer expected on fresh APPROVED. F1b fix(core/webview): merge view-local state into getState for per-view overrides Zoo-Code-Org/Zoo-Code#1550: 4th e2e failure = 83/2 load class again (run 34097300971, failed 07:55:42Z, ~7 min, 83 passing + the same two 60s-timeout tests) → pushed 5th re-trigger e75806c44 (0-line; first push attempt hit a github.com:443 connect flake, then two pwsh arg-parsing errors on the refspec/lease args — retry with variable-built args OK). F1c fix(webview): send stable view-state id on launch and re-pin per-view state Zoo-Code-Org/Zoo-Code#1552: pushed 5th re-trigger acb18b2f9 (0-line; pool was 1 after F1b's 4th failure — staggered, chain order F1b→F1c). Plan adjustment (user asked 08:1xZ): the stagger threshold is tightened from pool ≤3 to max 2 concurrent e2e suites (push a re-trigger only when pool ≤1) — the 07:47–07:55Z window at pool 3 produced both outcomes simultaneously (F0 e2e green run 34097208497 / F1b red run 34097300971), so 3 carries no safety margin. Re-trigger pushes are also serialized (one push per e2e verdict, not batched — the F1b+F1c same-window push above was the last batch). No content/test changes: the 83/2 class is infra load-flake (60s timeouts on the same two tests across four different PR heads; F1a's 999-line ClineProvider diff and F5 e2e-passed at low load ⇒ series content does not regress those tests) — the two e2e tests and all series diffs stay untouched. Cost: ≈+25 min/PR in the flake loop for the 5 PRs still needing e2e green (F1b/F1c/F2/F3/F4); F6/F7 e2e verdicts still to be verified. F3 fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560: 5th e2e in progress (run 34097307741, started 07:48:36Z; >17 min elapsed = overload-class risk). E2E pool now 3/3 (F1b 5th, F1c 5th, F3 5th); deferred: F2 4th, F4 2nd (push only when pool ≤2). Post-push sweep 08:04Z: all 10 PRs MERGEABLE (fix(core/webview): merge view-local state into getState for per-view overrides Zoo-Code-Org/Zoo-Code#1550 head e75806c44, fix(webview): send stable view-state id on launch and re-pin per-view state Zoo-Code-Org/Zoo-Code#1552 head acb18b2f9). Head list: F0 8d0d44bc3 / F1a 3c43a9e7c / F1b e75806c44 / F1c acb18b2f9 / F2 8dd2a17ae / F3 78f2a8296 / F4 b6aea7e8d / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c.
    Round 16 (2026-09-07 ~08:20Z): F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 — CodeRabbit posted CHANGES_REQUESTED on 8d0d44bc3 at 08:06:48Z (run e2bbcee2-0b0f-4a64-9d67-013016a46f97; review scope 5918058508d0d44bc3, 4 files), 2 actionable comments: (1) strengthen the serialization test so both results are pinned against the constructed ClineProvider instance exposed by the mocked constructor (identity + not-undefined); (2) add focused tests for the creation branches — MdmService.getInstance throw→undefined fallback, empty visibleTextEditors→newGroupRight+ViewColumn.Two, undefined viewColumn→zero fallback, new ClineProvider(..., "editor", ...) argument — or correct the validation claim. Implemented all (satisfies CodeRabbit AND kills the 38 advisory mutation-diff mutants, all on the same registerCommands.ts L322–383 body lines). Commit c51846007 test(activate): pin openClineInNewTab creation branches and strengthen the concurrency assertion (1 file, +118/−4): 5 new tests in the openClineInNewTab describe (MdmService-throw fallback, empty-editors newGroupRight+ViewColumn.Two+iconPath+lockEditorGroup, undefined-viewColumn zero-fallback→column 1, "editor"-ctor-arg with sentinel MdmService, visibility/dispose listener wiring) + serialization test now pins both results against ClineProvider.mock.instances[0]. Local gates: eslint EXIT:0 (no suppression change), tsc EXIT:0, vitest 200/200 (was 195). First push blocked by pre-push check-types (TS2352: readonly window.visibleTextEditors cast rejected) → as unknown as fix + amended. Pushed 08:15Z; sweep: all 10 PRs MERGEABLE, fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 not draft, labels [] (labeler re-queued 08:15:38Z); new CI in flight @ c51846007 (e2e-mock 34099653035, mutation 34099653089, Code QA, CodeQL, visual, release-validation). E2E pool verdicts 08:15Z: F1b 5th 34098482108 FAILURE (83/2 class: 83 passing + same two 60s-timeout tests, ~7.5 min), F1c 5th 34098494613 FAILURE (83/2 class, ~7.3 min), F3 5th 34097307741 FAILURE (overload class: 13 failing, 30s/180s timeouts, ~19 min). F6/F7 e2e failure signatures confirmed 87/1 class (Timed out after 1 coordinated rounds, 30s, ~4 min): F6 34091269918, F7 34091233446 — queued behind pool rule. Pushed F1b 6th no-op re-trigger e99726fbd (08:17Z; pool was 1 = F0 e2e only; ready-chain order F1b→F1c). Post-push sweep: all 10 MERGEABLE (fix(core/webview): merge view-local state into getState for per-view overrides Zoo-Code-Org/Zoo-Code#1550 head e99726fbd). Re-trigger queue (serialized, one push per verdict, ready-chain order): F1c 6th → F2 4th → F3 6th → F4 3rd → F6 → F7. Serial ready-marking still blocked at step 1: awaiting F0's fresh CodeRabbit APPROVED on c51846007awaiting-maintainer. Head list: F0 c51846007 / F1a 3c43a9e7c / F1b e99726fbd / F1c acb18b2f9 / F2 8dd2a17ae / F3 78f2a8296 / F4 b6aea7e8d / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c.
    Round 17 (2026-09-07 ~08:26Z): F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ c51846007 — required 5/6 green: e2e-mock SUCCESS on the first run at the new head (no load flake), check-translations/compile/knip/platform-unit-test (ubuntu) green; platform-unit-test (windows) in progress. mutation-diff advisory FAILURE, surviving mutants 38→7 (full locations from the changed-code-mutation-report artifact): L324–327 MdmService catch block→{}, L330 Math.maxMath.min (viewColumn spread), L330 viewColumn || 0, L340 Math.max(lastCol+1,1)Math.min, L340 lastCol+1, L349/L375 "tab" surface tag→"". 3 of 7 (the catch block — let mdmService is uninitialized so catch{} ≡ catch{mdmService=undefined}; the two "tab" tags — setPanel branches on type === "sidebar" so """tab") are behaviorally equivalent and unkillable from the spec without production changes; the other 4 are killable but the gate stays red either way (≥3 survivors), and mutation-diff is not in the 6 required checks gating awaiting-maintainer (it has been advisory-RED at all three F0 heads: 591805850/8d0d44bc3/c51846007) → per series policy NO content change for advisory gates, no push. F1a feat(provider): persist per-view view-state identity and durable viewStates Zoo-Code-Org/Zoo-Code#1546 @ 3c43a9e7c: ALL checks green including mutation-diff SUCCESS. CodeRabbit: no fresh review posted on c51846007 yet (review history: CHANGES_REQUESTED ×2 on 591805850 07:26Z / 8d0d44bc3 08:06Z) — in flight (labels [], coderabbit-review-active pending), ETA 10–30 min after that label lands. E2E pool: F1b 6th in progress (e99726fbd, e2e started 08:18Z) → pool 1; pushed F1c 6th no-op re-trigger 18122c3c1 (08:25Z, pool 1→2 under the adjusted stagger rule: max 2 concurrent, push only when pool ≤1). Re-trigger queue (serialized, one push per verdict, ready-chain order): F2 4th → F3 6th → F4 3rd → F6 → F7. Post-push sweep 08:26Z: all 10 PRs MERGEABLE (fix(webview): send stable view-state id on launch and re-pin per-view state Zoo-Code-Org/Zoo-Code#1552 head 18122c3c1). Serial ready-marking still blocked at step 1: awaiting F0's fresh CodeRabbit APPROVED on c51846007awaiting-maintainer (then gh pr ready 1546 → chain). F7 b8b6ef39c.
    Round 18 (2026-09-07 ~08:30Z): F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ c51846007 — still 5/6 required (platform-unit-test windows in progress since 08:15Z window); labels still [] (no fresh CodeRabbit review posted on c51846007 yet — in flight). F1b fix(core/webview): merge view-local state into getState for per-view overrides Zoo-Code-Org/Zoo-Code#1550 6th e2e FAILURE (run 34099886836, 08:25Z, ~7.4 min) = 83/2 class again (83 passing + same two 60s-timeout tests) — 6 confirmed load-flake failures; mutation-diff SUCCESS on e99726fbd. Pool was 1 (F1c 6th e2e in progress since ~08:25Z) → pushed F2 4th no-op re-trigger f4621e82e (08:29Z, ready-chain order F2 next; e2e started ~08:29Z, pool now 2). F1c fix(webview): send stable view-state id on launch and re-pin per-view state Zoo-Code-Org/Zoo-Code#1552 6th e2e still in progress on 18122c3c1. Re-trigger queue (serialized, one push per verdict): F3 6th → F4 3rd → F6 → F7. Post-push sweep 08:30Z: all 10 PRs MERGEABLE (test(webview): add parallelMode spec with viewStates pruning edges and dispose retention Zoo-Code-Org/Zoo-Code#1555 head f4621e82e). Serial ready-marking still blocked at step 1: awaiting F0's fresh CodeRabbit APPROVED on c51846007awaiting-maintainer (then gh pr ready 1546 → chain; F1a feat(provider): persist per-view view-state identity and durable viewStates Zoo-Code-Org/Zoo-Code#1546 is fully green incl. mutation-diff and ready the moment the chain reaches it). Head list: F0 c51846007 / F1a 3c43a9e7c / F1b e99726fbd / F1c 18122c3c1 / F2 f4621e82e / F3 78f2a8296 / F4 b6aea7e8d / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c.
    Round 19 (2026-09-07 ~08:30Z): F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ c51846007 — ALL 6 required checks now green (platform-unit-test windows completed success ~08:28Z; e2e-mock/check-translations/compile/knip/unit-ubuntu already green) and the reconcile workflow re-queued the bot: labels now awaiting-coderabbit + coderabbit-review-active (08:30Z). Fresh CodeRabbit review on c51846007 expected within 10–30 min of that label (prior two reviews were CHANGES_REQUESTED on 591805850 07:26Z and 8d0d44bc3 08:06Z — both actionable items fixed in c51846007); APPROVED → awaiting-maintainer = serial chain step 1 unblocked (gh pr ready 1546). Advisory mutation-diff stays RED on c51846007 (7 survivors, 3 behaviorally equivalent — non-blocking per series policy). E2E pool = 2 (max): F1c 6th 18122c3c1 e2e in progress since ~08:25Z, F2 4th f4621e82e e2e in progress since ~08:28Z — no new pushes until a verdict lands. Note: F1b's 6th failure (round 18) re-enters the re-trigger queue after F2's verdict (ready-chain order: F1b 7th → F3 6th → F4 3rd → F6 → F7). Serial ready-marking still blocked at step 1 (awaiting F0 awaiting-maintainer). No head changes this round.
    Round 20 (2026-09-07 ~08:34Z): F1c fix(webview): send stable view-state id on launch and re-pin per-view state Zoo-Code-Org/Zoo-Code#1552 6th e2e FAILURE (run 34100554814, 08:26:01Z→08:32:58Z ~6.9 min) = 83/2 class again (83 passing + same two 60s-timeout tests) — 6 confirmed load-flake failures; platform-unit-test ubuntu+windows green on 18122c3c1, mutation-diff in progress. Pool dropped to 1 (F2 4th f4621e82e e2e still in progress since 08:27:48Z) → pushed F1b 7th no-op re-trigger 8fc4f7609 (08:34Z, ready-chain order: F1b re-enters queue after its 6th failure and precedes F3). Post-push sweep: all 10 PRs MERGEABLE (fix(core/webview): merge view-local state into getState for per-view overrides Zoo-Code-Org/Zoo-Code#1550 head 8fc4f7609). F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ c51846007 unchanged: 6/6 required green, labels awaiting-coderabbit+coderabbit-review-active, fresh CodeRabbit review still in flight (no 3rd review posted on c51846007 yet; prior two were CHANGES_REQUESTED). Re-trigger queue (serialized, one push per verdict, ready-chain order): F3 6th → F4 3rd → F6 → F7 (F1b 7th now in flight). Serial ready-marking still blocked at step 1: awaiting F0's fresh CodeRabbit APPROVED on c51846007awaiting-maintainer. Head list: F0 c51846007 / F1a 3c43a9e7c / F1b 8fc4f7609 / F1c 18122c3c1 / F2 f4621e82e / F3 78f2a8296 / F4 b6aea7e8d / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c.
    Round 21 (2026-09-07 ~08:37Z): F2 test(webview): add parallelMode spec with viewStates pruning edges and dispose retention Zoo-Code-Org/Zoo-Code#1555 4th e2e FAILURE (run 34100711329 on f4621e82e, 08:27:48Z→08:34:46Z ~7 min) = 83/2 class (83 passing + same two 60s-timeout pair) — 4 confirmed load-flake failures (72/13 overload class seen on earlier runs). Pool → 1 (only F1b 7th 8fc4f7609 e2e in progress) → pushed F3 6th no-op re-trigger 39423f27e (08:37Z, ready-chain order). Post-push sweep: all 10 PRs MERGEABLE (fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560 head 39423f27e). F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ c51846007 unchanged: 6/6 required green, labels awaiting-coderabbit+coderabbit-review-active (re-queued ~08:30Z), fresh CodeRabbit review still in flight (no 3rd review posted on c51846007 yet; prior two CHANGES_REQUESTED). Re-trigger queue (serialized, one push per verdict, ready-chain order): F4 3rd → F6 → F7 (F1b 7th + F3 6th now in flight). Serial ready-marking still blocked at step 1: awaiting F0's fresh CodeRabbit APPROVED on c51846007awaiting-maintainer. Head list: F0 c51846007 / F1a 3c43a9e7c / F1b 8fc4f7609 / F1c 18122c3c1 / F2 f4621e82e / F3 39423f27e / F4 b6aea7e8d / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c.
    Round 22 (2026-09-07 ~08:41Z): F1b fix(core/webview): merge view-local state into getState for per-view overrides Zoo-Code-Org/Zoo-Code#1550 7th e2e FAILURE (run 34101217142 on 8fc4f7609, job 08:33:32Z→08:40:36Z ~7.1 min) = 83/2 class again (83 passing + same two 60s-timeout pair) — 7 confirmed load-flake failures; ubuntu+windows platform-unit-test green, mutation-diff SUCCESS on 8fc4f7609. Pool → 1 (only F3 6th 39423f27e e2e in progress) → pushed F4 3rd no-op re-trigger 916900f6a (08:41Z, ready-chain order). Post-push sweep: all 10 PRs MERGEABLE (fix(webview): invalidate live sibling view state on reset and settings import (vps2 F4) Zoo-Code-Org/Zoo-Code#1562 head 916900f6a). F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ c51846007 unchanged: 6/6 required green, labels awaiting-coderabbit+coderabbit-review-active (re-queued ~08:30Z), fresh CodeRabbit review still in flight (no 3rd review posted on c51846007 yet; prior two CHANGES_REQUESTED). Re-trigger queue (serialized, one push per verdict, ready-chain order): F6 → F7 (F3 6th + F4 3rd now in flight). Serial ready-marking still blocked at step 1: awaiting F0's fresh CodeRabbit APPROVED on c51846007awaiting-maintainer. Head list: F0 c51846007 / F1a 3c43a9e7c / F1b 8fc4f7609 / F1c 18122c3c1 / F2 f4621e82e / F3 39423f27e / F4 916900f6a / F5 5d0a09b89 / F6 3d96e65f1 / F7 b8b6ef39c.
    Round 23 (2026-09-07 ~08:56Z): user asked to rebase the other PRs onto the latest upstream main ("something need to fix also update"). Verified: upstream main = a3e31e14b (16 commits 2026-09-04 01:24Z → 09-07 02:25Z incl. [Fix] Provider settings contact unselected model services Zoo-Code-Org/Zoo-Code#1425, [Fix] Reasoning models stop thinking after model selection Zoo-Code-Org/Zoo-Code#1349, [Fix] Task history disappears when user reopens a task Zoo-Code-Org/Zoo-Code#1319, [Fix] Tasks stall when interrupted subtasks resume Zoo-Code-Org/Zoo-Code#1470, [Fix] Commits fail after users interrupt mutation tests Zoo-Code-Org/Zoo-Code#1525 mutation-infra fix, [Fix] Unit tests report teardown errors after Task cleanup Zoo-Code-Org/Zoo-Code#1527, [Chore] Bump GitHub Actions to node24 runtimes to fix Node 20 deprecation warnings Zoo-Code-Org/Zoo-Code#1534 node24, [Feat] Add DeepSeek V4 Flash Vision Exp support Zoo-Code-Org/Zoo-Code#1488/[Feat] Add verified GPT-6 Astra support across providers Zoo-Code-Org/Zoo-Code#1506/Add Claude Fable 5.1 support Zoo-Code-Org/Zoo-Code#1508 providers, [Fix] PR review labels stay stale after automated reviews or base conflicts Zoo-Code-Org/Zoo-Code#1509/[Fix] Fork PR review state stays stale after automated review Zoo-Code-Org/Zoo-Code#1510 labeler; repo last push 03:32Z) and the ENTIRE F0–F7 chain was already re-stacked onto exactly a3e31e14b in the earlier single-pass rebase (Main-drift bullet) — git merge-base a3e31e14b <tip> = a3e31e14b for all 10 branch tips (every head contains the latest main), main unchanged since (re-checked ~08:52Z). No rebase action needed; no content fixes needed ([Fix] Provider settings contact unselected model services Zoo-Code-Org/Zoo-Code#1425 touches no series file — series diff byte-identical, prior local gates valid). 10/10 MERGEABLE re-verified ~08:52Z (F0 not-draft; F1a–F7 draft pending the serial chain). Stale has-conflicts labels: fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560/fix(webview): invalidate live sibling view state on reset and settings import (vps2 F4) Zoo-Code-Org/Zoo-Code#1562/test(e2e): port view-state suite with reload and rehydration coverage (vps2 F6) Zoo-Code-Org/Zoo-Code#1565 all label-empty at 08:45Z — no stale labels remain on any of the 10. New observation: mutation-diff advisory FAILURE on F3 39423f27e and F4 916900f6a — advisory only (not among the 6 required gates), same 0-line content as the earlier green mutation runs on those branches ⇒ non-deterministic infra, consistent with the known cumulative-diff advisory red; does not block awaiting-maintainer. E2E pool 2/2: F3 6th (39423f27e, run 34101509856, job started 08:36:47Z) ~19 min elapsed — at the upper bound of the 72/13 overload class (13–19 min), verdict imminent; F4 3rd (916900f6a, run 34101891209, 08:41:00Z) in progress. F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ c51846007 unchanged: 6/6 required green, labels awaiting-coderabbit+coderabbit-review-active (08:30Z re-queue), fresh CodeRabbit review still not posted at 08:55Z (>25 min past the 08:30Z re-queue — slower than the 10–30 min norm; no lever available from this account, waiting). Re-trigger queue (serialized, one push per verdict): F6 → F7 (F3 6th + F4 3rd in flight). No head changes this round.
    Round 24 (2026-09-07 ~08:57Z): F3 fix(webview): isolate parallel mode and provider profile writes (vps2 F3) Zoo-Code-Org/Zoo-Code#1560 6th e2e FAILURE (run 34101509856 on 39423f27e, 08:36:47Z→08:53:43Z ~17 min) = 72/13 overload classError: 13 tests failed. with 7 provider timeouts (30s/180s) + 6 probe-tag assertions (Bedrock user-agent header, 2× thinking=disabled probe, probe-tag capture, xAI fast non-reasoning, xAI fast reasoning model ID) — matches F3's prior 72/13 overload run 34097307741; ubuntu+windows unit green on 39423f27e, mutation-diff advisory failure (non-gate, 0-line content). Content-exonerated: F5 head 5d0a09b89 (superset of F3 content, same new main) e2e GREEN and F0 head c51846007 (same new main) e2e green ⇒ series content is not the cause; load flake. 6 confirmed F3 failures. Pool → 1 (only F4 3rd in flight) → pushed F6 1st no-op re-trigger 3d96e65f1f8ea2f1a2 (08:57Z, ready-chain order; husky check-types all cache hits). Post-push sweep: all 10 PRs MERGEABLE (test(e2e): port view-state suite with reload and rehydration coverage (vps2 F6) Zoo-Code-Org/Zoo-Code#1565 head f8ea2f1a2). F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ c51846007 unchanged: 6/6 required green, labels awaiting-coderabbit+coderabbit-review-active, fresh CodeRabbit review still not posted at 08:54Z (~24 min past the 08:30Z re-queue; prior two CHANGES_REQUESTED 591805850/8d0d44bc3). Re-trigger queue (serialized, one push per verdict, ready-chain order): F7 (F4 3rd 916900f6a + F6 f8ea2f1a2 now in flight; F7 = PR fix(webview): show modes skeleton until view state loads (vps2 F7) Zoo-Code-Org/Zoo-Code#1567 head b8b6ef39c branch vps2/f7-viewstate-loaded). Serial ready-marking still blocked at step 1: awaiting F0's fresh CodeRabbit APPROVED on c51846007awaiting-maintainer. Head list: F0 c51846007 / F1a 3c43a9e7c / F1b 8fc4f7609 / F1c 18122c3c1 / F2 f4621e82e / F3 39423f27e / F4 916900f6a / F5 5d0a09b89 / F6 f8ea2f1a2 / F7 b8b6ef39c.
    Round 25 (2026-09-07 ~09:00Z): F4 fix(webview): invalidate live sibling view state on reset and settings import (vps2 F4) Zoo-Code-Org/Zoo-Code#1562 3rd e2e FAILURE (run 34101891209 on 916900f6a, 08:41:02Z→08:57:52Z ~16.8 min) = 72/13 overload classError: 13 tests failed. with 7 provider timeouts (4×30s + 3×180s) + the same 6 probe-tag assertions (Bedrock user-agent, 2× thinking=disabled, probe-tag capture, xAI fast non-reasoning, xAI fast reasoning) — byte-identical failure set to F3's 6th (72/13) on the same new main; mutation-diff advisory failure (non-gate, 0-line content); unit tests not re-run to green on this head before e2e failure. 3 confirmed F4 failures (1st 83/2, 2nd 83/2, 3rd 72/13). Content-exonerated (same argument as round 24: F5/F0 heads e2e green on same main). Pool → 1 (only F6 in flight) → pushed F7 2nd no-op re-trigger b8b6ef39c553abe711 (09:00Z, ready-chain order; husky check-types all cache hits). Post-push sweep: all 10 PRs MERGEABLE (fix(webview): show modes skeleton until view state loads (vps2 F7) Zoo-Code-Org/Zoo-Code#1567 head 553abe711). F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ c51846007 unchanged: 6/6 required green, labels awaiting-coderabbit+coderabbit-review-active, fresh CodeRabbit review still not posted at 08:58Z (~28 min past the 08:30Z re-queue; timeline last event 08:28:42Z; prior two CHANGES_REQUESTED). E2E in flight: F6 f8ea2f1a2 (run 34103168124, job 08:55:20Z). Re-trigger queue (serialized, one push per verdict, ready-chain order): empty — F6 + F7 both in flight; next push only after one of them lands (would be F6 or F7 2nd attempt depending on which fails). Serial ready-marking still blocked at step 1: awaiting F0's fresh CodeRabbit APPROVED on c51846007awaiting-maintainer. Head list: F0 c51846007 / F1a 3c43a9e7c / F1b 8fc4f7609 / F1c 18122c3c1 / F2 f4621e82e / F3 39423f27e / F4 916900f6a / F5 5d0a09b89 / F6 f8ea2f1a2 / F7 553abe711.
    Round 26 (2026-09-07 ~09:05Z): F6 test(e2e): port view-state suite with reload and rehydration coverage (vps2 F6) Zoo-Code-Org/Zoo-Code#1565 2nd e2e FAILURE (run 34103168124 on f8ea2f1a2, 08:55:20Z→09:01:25Z ~6 min) = 87/1 class87 passing (4m), 1 failing: Roo Code View State > three panels keep follow-up option mode switches isolated across ten staggered rounds (view-state.test.js:234) — Error: Timed out after 1 coordinated rounds; mode event counts: A:0, B:0, C:3; pending suggestions: 1 — same single-test timed-out signature as F6's prior 87/1 failure; provider suites (OpenRouter/xAI/GLM) all passing in the same run ⇒ load flake in the cross-instance coordination timing window, not a series-content regression (F6 head is the viewstate-feature head; the failing assertion is the staggered-rounds coordination probe, not a feature assertion). 2 confirmed F6 failures (both 87/1). Pool → 1 (only F7 in flight) → pushed F6 3rd no-op re-trigger f8ea2f1a26e0b03ad6 (09:05Z; husky check-types all cache hits). Post-push sweep: all 10 PRs MERGEABLE (test(e2e): port view-state suite with reload and rehydration coverage (vps2 F6) Zoo-Code-Org/Zoo-Code#1565 head 6e0b03ad6). E2E in flight (pool 2/2): F6 6e0b03ad6 (new run after 09:05Z) + F7 553abe711 (run 34103431442, job 08:58:25Z). F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ c51846007 unchanged: 6/6 required green, labels awaiting-coderabbit+coderabbit-review-active, fresh CodeRabbit review still not posted at 09:04Z (~34 min past the 08:30Z re-queue; prior two CHANGES_REQUESTED 591805850/8d0d44bc3). Re-trigger queue (serialized, one push per verdict): empty until a verdict lands — next push = the failing PR's 3rd/4th attempt. Serial ready-marking still blocked at step 1: awaiting F0's fresh CodeRabbit APPROVED on c51846007awaiting-maintainer. Head list: F0 c51846007 / F1a 3c43a9e7c / F1b 8fc4f7609 / F1c 18122c3c1 / F2 f4621e82e / F3 39423f27e / F4 916900f6a / F5 5d0a09b89 / F6 6e0b03ad6 / F7 553abe711.
    Round 27 (2026-09-07 ~09:04Z, GOAL ROUND-CAP 60/60 — final state + handoff): no new e2e verdicts this round — F6 3rd (run 34103798295 on 6e0b03ad6, job 09:02:34Z) and F7 2nd (run 34103431442 on 553abe711, job 08:58:25Z) both in progress (logs not flushed; pool 2/2). F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ c51846007: 6/6 required green, labels awaiting-coderabbit+coderabbit-review-active, fresh CodeRabbit review still not posted at 09:04Z (~34 min past the 08:30Z re-queue; timeline last event 08:28:42Z). Upstream main unchanged at a3e31e14b (02:25:32Z); all 10 heads verified merge-base a3e31e14b (round 23) ⇒ no rebase drift. Final sweep 10/10 MERGEABLE; F0 not-draft, F1a–F7 draft (serial queue intact). Handoff (resume in this order): (1) On F6/F7 e2e verdict: failure + pool ≤1 → push that PR's next no-op re-trigger from worktree vps2-rebase (fetch branch, git commit-tree $tree -p $tip -m 'ci: re-trigger e2e (no-op)…', git push --force-with-lease=refs/heads/<branch>:<tip> origin <new>:refs/heads/<branch>), then 10/10 mergeable sweep + ledger append (this issue VPS2 durable per-view state - independent-fix series (supersedes #34 + the 21-item upstream draft series) #41, sync via gh issue edit 41 --repo easonLiangWorldedtech/Zoo-Code --body-file + readback). (2) On F0 fresh CodeRabbit APPROVED on c51846007 (→ awaiting-maintainer): gh pr ready 1546 --repo Zoo-Code-Org/Zoo-Code, then serial chain 1550→1552→1555→1560→1562→1557→1565→1567, each only after that PR reaches awaiting-maintainer; stop when F7 fix(webview): show modes skeleton until view state loads (vps2 F7) Zoo-Code-Org/Zoo-Code#1567 passes the bot. (3) DO NOT merge, DO NOT tag finished — await maintainer. E2E policy: max 2 concurrent, re-trigger only at pool ≤1, one push per verdict, no content/test changes for load flakes (classes 83/2 60s-timeout, 72/13 overload, 87/1 coordinated-rounds timeout are infra). F5 fix(api): wire task controls and sidebar-targeted configuration (vps2 F5) Zoo-Code-Org/Zoo-Code#1557 @ 5d0a09b89 e2e already green — no re-trigger. F0 advisory mutation-diff RED is permanent (7 survivors, 3 unkillable) — documented non-blocking.
    Round 28 (2026-09-07 ~09:47Z): F6 3rd + F7 2nd e2e verdicts landed (both 87/1 class, same test, identical CI signature Timed out after 1 coordinated rounds; mode event counts: A:0, B:0, C:3; pending suggestions: 1, view-state.test.js:234): F6 3rd run 34103798295 on 6e0b03ad6 (job 09:02:34Z→09:08:35Z, verdict 09:08:40Z); F7 2nd run 34103431442 on 553abe711 (job 08:58:25Z→09:04:46Z). Same test Roo Code View State > three panels keep follow-up option mode switches isolated across ten staggered rounds now 5/5 identical failures (F6 1st–3rd 3d96e65f1/f8ea2f1a2/6e0b03ad6; F7 1st–2nd b8b6ef39c/553abe711) — it is F6's own new test (not covered by F5 green @ 5d0a09b89, which predates the test). 5/5 identical assertions crossed the local-repro decision boundary (≥2 same-assertion failures + failure on F6's own new code path) → local repro on the quiet local machine at 6e0b03ad6 (worktree vps2-rebase, detached): REPRODUCEDUSE_MOCK=true TEST_FILE=view-state.test pnpm --filter @roo-code/vscode-e2e test:run2 passing (56s), 1 failing, same test, local signature Timed out after 0 coordinated rounds; mode event counts: A:0, B:0, C:0; pending suggestions: 1 (view-state.test.js:234; full log local-e2e-viewstate.log in worktree). Verdict: not a CI-load flake — the 3-panel follow-up coordination is timing-fragile on a quiet desktop too (background-tab webviews A/B do not deliver follow-up suggestions within the 30s budget; locally round 1 never even released, CI released round 1 and the focused panel C auto-processed 3). Old-series study (user-requested, "should be fixed before"): the 3-panel test is byte-identical between old fix(webview): add durable per-view state base Zoo-Code-Org/Zoo-Code#977 final head e9a44b2fa and current F6 head 6e0b03ad6 (diff = +88 lines only = F6's new 4th reload test); old-series commits show this suite's flake-fighting (62682dfb4 poll-before-assert, fab50e0a4 diagnostics for flaky viewStates read, 8ad5cdc77 30s budget, c518d7284 derive rounds from fixture) — but those fixed the persisted-viewStates READ wait, not this 3-panel coordinated wait; old fix(webview): add durable per-view state base Zoo-Code-Org/Zoo-Code#977 final e2e-mock run (33890940259, 2026-09-04T15:41Z) succeeded ONCE (lucky timing, same runner pool), and old sibling final heads fix(webview): isolate parallel provider view state Zoo-Code-Org/Zoo-Code#966/fix(webview): isolate parallel mode and provider profile writes Zoo-Code-Org/Zoo-Code#979 show e2e FAILURE (1 recorded run each). So this test was never "fixed before" — the old pass was lucky timing; 0/6 recent runs (5 CI + 1 local) pass. - Policy change needed — user decision required (no content/test changes without approval): (a) change the test (widen 30s budget and/or restructure the global-round coordination into per-panel polling) → new F6 commit + re-trigger; (b) product-level look at background-tab follow-up suggestion delivery; (c) keep re-triggering and hope (evidence: fragile, 0/6). F0 unchanged @ c51846007: 6/6 required green, labels awaiting-coderabbit+coderabbit-review-active, no fresh CodeRabbit review as of 09:43Z (~73 min past 08:30Z re-queue; slow, no lever). Pool = 0; no push this round. No head changes this round. Upstream main unchanged @ a3e31e14b; all 10 PRs mergeable (last sweep 09:04Z).
    Round 29 (2026-09-07 ~10:10Z, product-side investigation per user decision "先查產品面"): ROOT CAUSE FOUND — the 87/1 failure is a deterministic product/test contract mismatch, not a flake. Evidence chain: (1) CI log of run 34103798295 (F6 3rd) contains suggestion delivery failures: <A-taskId>:A follow-up round 1, <B-taskId>:B follow-up round 1 — i.e. selectTaskFollowupSuggestion returned delivered=false for background tasks A and B at the first coordinated release: their task ids were already absent from the extension API's tasksById control registry. (2) src/extension/api.ts (F0 port cfa678f1c): TaskUnfocused handler → removeRegisteredTask(task) — an unfocused/evicted/aborted task is unregistered, so ask-controls return false for it. (3) src/activate/registerCommands.ts openClineInNewTab (new F0 chain commit e6bc7a294 "fix(activate): target title-bar commands to their click-origin instance", ancestor of F0 head c51846007, NOT present in old CS e9a44b2fa): now REUSES the single tracked tabPanel on repeat calls ("a repeated 'Open in editor' click reveals the existing tab's panel") — so the 2nd/3rd startNewTask({newTab:true}) returns the FIRST tab's provider. (4) api.startNewTask then calls provider.evictCurrentTask() (api.ts:215) on that shared provider → removeClineFromStackTaskUnfocused + abortTask(true) + dispose → the previous task (A, then B) is ABORTED and unregistered. (5) Bonus defect: startNewTask re-calls registerListeners(provider) on the reused provider → N copies of the TaskCreated handler → the Nth task's events are re-emitted N times — CI's C:3 = one real mode switch × 3 handler copies (A:1 copy, B:2, C:3). Both observed signatures fully explained by the same mechanism: CI = A/B emitted their first follow-up ask before eviction (round 1 released; A/B answers undeliverable; C switches once, triple-emitted; deadlock) → Timed out after 1 coordinated rounds; A:0, B:0, C:3; pending suggestions: 1; local = A/B evicted before their first aimock response (nothing pending for A/B) → Timed out after 0 coordinated rounds; A:0, B:0, C:0; pending suggestions: 1. (6) Old-series contrast: old CS e9a44b2fa openClineInNewTab created a FRESH webview panel + provider unconditionally (no tracking, no reuse, no cross-eviction) → the 3-panel test's premise (3 concurrent independent tab tasks) held in the old series and its final-head e2e pass (2026-09-04) ran against a working product. (7) The 3-panel test exists ONLY in F6/F7 heads (F4 916900f6a/F5 5d0a09b89 lack view-state.test.ts entirely) ⇒ F1a–F5 e2e failures (83/2, 72/13) remain unrelated load flakes; F6/F7 87/1 = this defect. Verdict: re-triggering cannot fix this (0/6 deterministic). Fix options: (A) targeted product fix in F6's incremental diff — startNewTask({newTab:true}) creates a FRESH tab (old-series behavior, matches the newTab contract) via a creation helper extracted from openClineInNewTab, UI button path keeps the reuse (F0's pinned creation-branch specs stay green) + duplicate-registration guard in registerListeners; F0–F5 heads untouched (their CI/bot state preserved); F6 re-push + F7 rebase + their CIs/reviews re-run; (B) fix in F0 itself + rebase F1a–F7 (9 PRs, chain CI/bot restart); (C) shrink the test to 2 panels (sidebar + 1 tab) — deviates from the old-CS test contract. Awaiting user approval before any content/test change.
    Round 30 (2026-09-07 ~10:30Z, Option A implementation per user approval): root-cause fix shipped in F6's incremental diff. Changes (4 files, +107/-23): src/activate/registerCommands.ts — creation body extracted into a new exported createClineTabPanel (always creates a fresh panel + provider; its dispose handler clears the tracked ref only when it still points at the disposed panel); openClineInNewTab keeps F0's single-tab reuse block and delegates creation to the helper (UI button path unchanged, F0's pinned creation-branch specs stay green). src/extension/api.tsstartNewTask({newTab:true}) now calls createClineTabPanel (the evictCurrentTask() lands on a fresh provider instead of aborting the task the tracked tab is already serving); registerListeners is guarded by a per-provider Set (duplicate registration would stack TaskCreated handler copies → Nth task events re-emitted N×, the CI C:3 signature). Specs: api-task-control.spec.ts mock factory/rename only (assertions verbatim: evictCurrentTask once, createTask args, {context, outputChannel} call); +1 new createClineTabPanel unit test pinning the never-reuse contract (tracked tab present → no reveal, createWebviewPanel ×1). Gates: vitest 50/50 (both specs), tsc --noEmit clean, eslint --prune-suppressions --max-warnings=0 exit 0 on all 4 files (suppression JSON semantically identical to HEAD — EOL-only churn reverted, counts flat), prettier clean (single fix: import line split, >120). Local e2e single slot: 3/3 PASS (55s), exit 0 — the 0/6 deterministic 3-panel test now passes: three panels keep follow-up option mode switches isolated across ten staggered rounds (29735ms) ✔, zero delivery failures / timeouts in the log. F6 pushed (fast-forward, no force): 6e0b03ad6d2d0a424e ("fix(api): give startNewTask(newTab) a fresh tab panel instead of reusing the tracked one"); pre-push check-types 11/11. F7 rebased onto the new F6 head as a single content commit (its two no-op re-trigger commits were 0-line and tree-identical to the content commit, dropped): 553abe711f4b20617c ("fix(webview): show modes skeleton until view state loads"), --force-with-lease from 553abe711. 10/10 MERGEABLE sweep post-push (F0 not-draft; F1a?F7 draft). CI: F6/F7 required checks (incl. e2e-mock) re-run on the new heads — first CI test of the fix; the local 3-panel run finished 29.7s of the 30s budget (passing but tight; if CI flakes on the same assertion under runner load, apply the no-op re-trigger lever once before considering any test change, and no test change without user approval). F0 fix(activate): target title-bar commands to their click-origin instance Zoo-Code-Org/Zoo-Code#1528 @ c51846007 unchanged: 6/6 required green, labels awaiting-coderabbit+coderabbit-review-active, no fresh CodeRabbit review as of ~10:18Z (~48 min past the 08:30Z re-queue; prior two CHANGES_REQUESTED on older heads 591805850/8d0d44bc3). Serial ready-marking still blocked at step 1: awaiting F0 awaiting-maintainer (then gh pr ready 1546 → chain 1550?552?555?560?562?557?565?567; stop at F7 pass; no merge, no finished tag). Head list: F0 c51846007 / F1a 3c43a9e7c / F1b 8fc4f7609 / F1c 18122c3c1 / F2 f4621e82e / F3 39423f27e / F4 916900f6a / F5 5d0a09b89 / F6 d2d0a424e / F7 f4b20617c.

  • Content source of record (CS): e9a44b2fa1be8c008ff36b927e580bca6282087b (worktree pr977-base, fix(webview): add durable per-view state base Zoo-Code-Org/Zoo-Code#977 head) — fix(webview): add durable per-view state base Zoo-Code-Org/Zoo-Code#977 content is ported hunk-by-hunk from here.

  • Findings ledger: plans/viewstate-gap-review.md — six-track DTE gap review (A1–A6): 0 blocker · 3 major · 14 minor · 10 nit, all dispositioned into fix units F0–F7 or the parked-items register (12 items, all bounded).

  • Left open deliberately (by decision, 2026-09-05): upstream issue Support Parallel Modes (Fork-Join Agent Orchestration) Zoo-Code-Org/Zoo-Code#568 (community Fork-Join feature request — the vps2 series is its state-isolation foundation, not its fulfillment) and upstream PR fix(task-persistence): add cross-instance lock for concurrent task history updates (#920) Zoo-Code-Org/Zoo-Code#926 (cross-instance task-history lock addressing [BUG] Concurrent task history updates from parallel tabs may cause lost entries Zoo-Code-Org/Zoo-Code#920 — task history is outside the per-view state surface; standalone fix track). F7 ([UX] Flash of incorrect mode/apiConfig when opening new editor tab Zoo-Code-Org/Zoo-Code#915 skeleton port, ~20 src + ~80 test) was un-parked on 2026-09-06 at user request and is queued last (wave 6, after F6).

Unit status (maintained as PRs open/merge)

Seq Unit Scope Stack base PR a+d (measured) State
1 F0 button targeting (D1–D4): no-wipe setPanel; click-origin sidebar title-bar targeting; 4 *InTab command ids; ClineProvider.getInstanceForView; tab-panel reuse; focusInput condition main @ a3e31e1 (rebased) Zoo-Code-Org#1528 (ready for review 2026-09-07; issue #1529) 484 (411+/73−) code complete, pushed vps2/f0-button-targeting @ 8d0d44bc3 (CodeRabbit CHANGES_REQUESTED fix 2026-09-07 on 591805850 — serializes openClineInNewTab via shared in-flight promise + hardens view-identity test helpers, 4 files +123/−88); new-head CI 2026-09-07: all 6 required checks green on 8d0d44bc3 (check-translations, compile, knip, e2e-mock, platform-unit-test ubuntu+windows); mutation-diff FAILURE (advisory — not in the required 6 per ruleset; diff-scope widening from the IIFE wrapper, see round 15); CodeRabbit CHANGES_REQUESTED on 8d0d44bc3 08:06:48Z (2 actionable: pin serialization results to mocked-constructor instance + 4 focused creation-branch tests) → fix commit c51846007 pushed 08:15Z (spec +118/−4, 5 new tests, vitest 200/200, tsc/eslint clean); new-head CI: 5/6 required green (e2e-mock SUCCESS first try on c51846007 — no flake; check-translations/compile/knip/unit-ubuntu green; unit-windows in progress 08:26Z); mutation-diff advisory FAILURE 38→7 surviving (4 of 7 behaviorally equivalent, unkillable without production changes — non-blocking, see round 17); fresh CodeRabbit review on c51846007 in flight (labels []) — awaiting APPROVED → awaiting-maintainer
2 F1a view identity + durable core (F1 split 1/3): ClineProvider persistence primitives (write queue, prune, rekey, setViewStateId + __proto__ guard, loadViewState, saveViewState), view-local buffer (setValue/setValues/getValues + mutation helpers), postMessage void-ack, resetState clears; types viewStates record; spec adapted into the existing ClineProvider.spec.ts fixture (viewId/save/load/prune-baseline + __proto__ + ack + history-restore H5–H7; no mock-preamble duplication) F0 head e6bc7a294 (re-stacked) Zoo-Code-Org#1546 (draft; issue #1547) 999 (976+/23−) code complete, pushed vps2/f1a-view-identity @ 3c43a9e7c; all gates green (179/179 mutants killed)
3 F1b getState merge (F1 split 2/3): mergedStateValues + getState() body; spec: getState-merging + local-state-isolation describes (both assert via the merge) F1a head 3c43a9e7c Zoo-Code-Org#1550 (draft; issue #1549) 717 (622+/95−) code complete, pushed vps2/f1b-getstate-merge @ e75806c44 (empty commits 2026-09-07: #4 019c84dcf6d13672b4, #5 6d13672b4e75806c44, #6 e75806c44e99726fbd, #7 e99726fbd8fc4f7609 — e2e-mock 83/2 load flake, 7 confirmed failures (7th run 34101217142 08:40:36Z = 83/2 class, 08:33:32Z→08:40:36Z ~7.1 min), 0-line diff); all gates green (127/127 mutants killed; mutation-diff SUCCESS on 8fc4f7609)
4 F1c webview identity + launch (F1 split 3/3): WMH webviewDidLaunchsetViewStateId + launch-time re-pin via merged getState(), updateSettings via provider.setValue; webview-ui id-helper + acquireVsCodeApi fallback + new prod-branch vsCodeApi tests; WMH spec launch describe F1b head a37d0850e Zoo-Code-Org#1552 (draft; issue #1551) 545 (528+/17−) code complete, pushed vps2/f1c-webview-identity @ 18122c3c1 (empty commits 2026-09-07: #4 1c90a81b203c46f714, #5 03c46f714acb18b2f9, #6 acb18b2f918122c3c1 — e2e-mock 83/2 load flake, 6 confirmed failures (6th run 34100554814 08:32Z = 83/2 class, 08:26:01Z→08:32:58Z ~6.9 min), 0-line diff); all gates green (stryker 59 killed / 0 survived / 6 ignored; unit tests both platforms green)
5 F2 durable viewStates: creates ClineProvider.parallelMode.spec.ts (588-line preamble + container fixture); pruning edge tests (missing updatedAt/ties) + Zoo-Code-Org#1065 50-entry-cap regression F1c head 6021fee5d Zoo-Code-Org#1555 (draft; issue #1553; first-cut PR Zoo-Code-Org#1554 closed as superseded) 733 (733+/0−) code complete, pushed vps2/f2-durable-viewstates @ 8dd2a17ae (empty commits 2026-09-07 on 3dcf4bfe3: re-trigger #3, #4 8dd2a17aef4621e82e 08:29Z — e2e-mock load flake re-triggers; 4th e2e run 34100711329 FAILURE 08:34:46Z = 83/2 class (83 passing + same two 60s-timeout pair, ~7 min), 0-line diff); all gates green (3/3; stryker vacuous — 0 executable changed lines)
6 F3 mode/profile writes: webview delete-path via deleteProviderProfile + test; loadViewState dead-mode-pin validation + test; CP handleModeSwitch/upsert/activate/deleteProviderProfile hunks (incl. repointPersistedViewStates def) + Task.ts/SwitchModeTool + sticky-mode spec; handleModeSwitch durable-write tests H3/H4 (reclassified from F1 — base updateGlobalState bypasses public setValue); parallelMode F3 describes (CS L1364–1674) F2 head 92b109654 Zoo-Code-Org#1560 (draft; issue Zoo-Code-Org#1559) 984 (919+/65−, soft-over 400 — documented in PR body) code complete, pushed vps2/f3-mode-profile-writes @ 39423f27e (empty commits 2026-09-07: #2 on f930a24ad — e2e-mock load flake + windows unit-test turbo-cache infra flake, #6 78f2a829639423f27e 08:37Z — e2e-mock load flake, 5 confirmed failures (5th run 34097307741 08:07Z = 72/13 overload class), 0-line diff); all gates green (stryker 61/63 killed, 2 ignored as documented equivalent no-ops, 0 survived/uncovered)
7 F4 cross-instance reset + import invalidation: port Zoo-Code-Org#981 broadcast (single write-queue clear) + importExport hook; parallelMode multi-instance + _clearViewLocalState describes (CS L1675–1789, byte-identical, 5 tests); CP.spec forward fix (F3 resetState sentinel toEqual({})toBeUndefined()) + gate-required multi-instance test; importExport skip-test console.warn negative assertion (gate-required) F3 head 7d91ff4bd Zoo-Code-Org#1562 (draft; issue Zoo-Code-Org#1561) 343 (342+/1−) code complete, pushed vps2/f4-cross-instance-reset @ 916900f6a (empty commits 2026-09-07: #2 on da97f98ee — e2e-mock load flake, #3 b6aea7e8d916900f6a 08:41Z — e2e-mock load flake, 2 confirmed failures, 0-line diff); all gates green (stryker 11/11 killed, 0 survived/uncovered; the 5 surviving mutants at the first gate head are killed by the two test additions, no directives)
8 F5 API wiring + task controls: setConfiguration doc fix; preserveOpenTabs @PARAM; spec split; sidebar-only limitation documented F4 head da97f98ee (re-stacked 2026-09-07 ×2: original commit 126a1fc4d on the F1a head → F2 head b5875118e → F4 head 95a18b2f7; the 5 file blobs are byte-identical across all three) Zoo-Code-Org#1557 (draft; issue #1556) 557 (549+/8−, 95a18b2f7) code complete, pushed vps2/f5-api-wiring @ 5d0a09b89 (empty commit 2026-09-07 on cfa678f1c — windows unit-test turbo-cache flake re-trigger, 0-line diff), all gates green (vitest 17/17; stryker 42/42 killed, 0 survived)
9 F6 e2e suite (test-only): port/extend the view-state suite + A5 minor 2 (webview-reload/rehydration test) F5 head cfa678f1c (re-stacked; the original plan of main @ post-F1a–F1c/F3 was obsoleted by the F3–F5 re-stack) Zoo-Code-Org#1565 (draft; issue #1564) 543 (543+/0−) code complete, pushed vps2/f6-e2e-viewstate @ 3d96e65f1 (empty commit 2026-09-07 on 09876aeea — e2e-mock flake re-trigger, 0-line diff), all gates green (full solo e2e 2 runs — run 2: 71 passing / 5 failing, view-state 3/3 green by name; the 5 failures = pre-existing documented load-class timeouts, byte-identical across runs; stryker vacuous — 0 changed executable lines; the authored test carries the 2-line command-ID fix with bundle evidence)
10 F7 view-state loading skeleton (Zoo-Code-Org#915): ExtensionStateContext viewStateLoaded plumbing (interface/useState/state-handler flip/context value), ModesView skeleton early return, the folded App.tsx −3 (the bare webviewDidLaunch useEffect — the F1c-owned Zoo-Code-Org#928 hunk F1c shipped without), App.spec getViewStateId mock (+1, absent at base), spec tests (skeleton + 3 context lifecycle tests) F6 head 09876aeea Zoo-Code-Org#1567 (draft; issue #1566) 101 (96+/5−) code complete, pushed vps2/f7-viewstate-loaded @ b8b6ef39c (empty commit 2026-09-07 on ac364cb20 — e2e-mock flake re-trigger, 0-line diff), all gates green (vitest 56/56 incl. the F1c webviewDidLaunch payload sentinel; check-types/eslint/prettier clean, suppressions flat at 346; stryker non-vacuous 7/7 killed / 0 survived, independently re-verified by coordinator re-run)

F6 note (2026-09-07): the authored reload test first failed deterministically on workbench.action.toggleLeftSidebarVisibility (command-not-found; that ID has 0 occurrences in the pinned VS Code 1.100.0 workbench bundle, while workbench.action.toggleSidebarVisibility is present) — fixed by swapping the 2 command strings only (assertions byte-identical before/after, verified by reconstruction against the CS suite + 87-line authored span); run 1: 70 passing / 6 failing (the 5 load-class + the command bug), run 2: 71 passing / 5 failing (the same 5 load-class, byte-identical: execute_command simple-echo 60s / custom-working-directory 60s / multiple-sequentially 90s / long-running 60s + use_mcp_tool before-all 30s, all out/suite/utils.js:15, in suites this diff does not touch; the class is documented at run A: 7 concurrent-load timeouts). Both full logs kept as evidence of record (f6w-e2e.log / f6w-e2e-run2.log).

F7 note (2026-09-07): the worker's first stryker-diff run used the worktree's tracked (upstream) scripts/stryker-diff.mjs, which fails on win32 (spawnSync node_modules/.bin/vitest ENOENT — Node on Windows cannot exec pnpm's extensionless .bin shims); the win32 shim copy from pr977-base (never committed) re-ran green — 16 executable changed lines, 7 raw mutants (ModesView.tsx L617 ×5, ExtensionStateContext.tsx L294 + L351 ×2), 7/7 killed, 0 survived / no-coverage / timeout (thresholds high=low=100). The coordinator independently re-ran the same gate (exit 0) and kept the reports as evidence of record (f7c-stryker.log / f7c-stryker-reports/). The only non-verbatim port change: apiProvider "anthropic" to providerIdentifiers.anthropic in the new context spec test (fork lint rule zoo/no-raw-provider-identifiers; the import was already present).

Severity rollup (six-track DTE gap review, 2026-09-05)

Track Scope blocker major minor nit Verdict
A1 identity + persistence (CS review) 0 0 4 2 backbone sound; 3 small in-unit fixes
A2 merge + write-path (CS review) 0 1 3 1 merge core sound; 2 write-path gaps
A3 lifecycle (CS review) 0 1 2 4 additive port from Zoo-Code-Org#981
A4 API + e2e (CS review) 0 1 2 2 contract sound; one documented limitation
A5 Zoo-Code-Org#929/F1–F5 series re-review (CS e9a44b2fa) 0 0 2 1 no blockers; e2e reload assertion → F6
A6 button-targeting audit (base 0d937c050) 0 4* 0 0 D1–D4 confirmed; fixed by F0

* D1 setPanel mutual wipe · D2 no tab-panel reuse · D3 surface-blind visible instance (title-bar commands contribute to both view/title and editor/title; newTask is palette-only) · D4 focusPanel tab-first (self-resolves after F0's no-wipe — focusPanel.ts is never changed). A6 is the Phase-0 audit that produced F0.

The three A1–A4 majors are bounded and additive: (1) A2 — webview profile delete skips durable pin repair → F3; (2) A3 — resetState/import leave live siblings stale → F4; (3) A4 — API always targets the sidebar provider → parked (architectural), documented in F5.

Phase 0 audit ledger (A5 re-review + A6 button audit)

A6 button-targeting audit (agent 8fb61842, base 0d937c050):

  • D1–D4 confirmed 4/4 at registerCommands.ts / ClineProvider.ts / package.json (D3 with correction: the five title-bar commands are contributed to both title bars — view/title L215-241 + editor/title L242-268; surface-blind getVisibleInstance returns insertion-order last-visible).
  • 14-command surface matrix: ok 2 · D1 1 · D2 2 · D3 8 · D4 1.
  • Pre-F0 spec: 3 describes / 15 its / zero multi-instance assertions (why the bug shipped).
  • Alternate minimal-fix design (public renderContext / getSurfaceProviderOrLog) considered and not adopted — the plan-approved design (no-wipe + click-origin targeting + *InTab ids) is what is committed.

A5 re-review (agent bf591d91, CS e9a44b2fa): blocker 0 · major 0 · minor 2 · nit 1.

Risk flags (quick reference)

  • Budget: F0 = 484 a+d measured — over the 400 soft by +112 (mutation-killing tests: per-post distinct-error catch pinning, awaited no-op matrix, real-class getInstanceForView coverage); under the 600 hard cap; composition note in the PR body.
  • F1 mini-stack (decision 2026-09-05): F1 measured ≈ 2585 a+d against the CS port (2.6× the 1000 hard cap) ⇒ F1 → F1a/F1b/F1c. F1a → F1b → F1c is content-dependent (fields → getState merge → webview re-pin) and serial; F1a ≈ 950 est is the only unit near the 1000 hard cap — measure at cut, split lever = largest impl-hunk group (never tests). The CS F1 spec (1790-line parallelMode.spec.ts) is NOT ported as one file: the F1-series describes are rewritten into the existing ClineProvider.spec.ts fixture (drops the 588-line mock preamble); F2 creates parallelMode.spec.ts (preamble + pruning-edge + Preserve durable editor view state across provider disposal Zoo-Code-Org/Zoo-Code#1065 50-cap).
  • F4 port: replaces fix(webview): invalidate per-view state after reset and import Zoo-Code-Org/Zoo-Code#981's per-instance setValue("viewStates", undefined) with a single write-queue clear (queue at ClineProvider.ts:577) — must not regress the 50-entry prune cap (F2) or the no-secrets guarantee.
  • F5: sidebar-only API targeting (A4 major) is parked as architectural (a per-view API handle would be a redesign); the PR body documents it.
  • F6: the e2e reload/rehydration test (A5 minor 2) lands with the suite port; test:ci:mock gate required.
  • F7 parked: the [UX] Flash of incorrect mode/apiConfig when opening new editor tab Zoo-Code-Org/Zoo-Code#915 flash remains until the skeleton port (~20 src + ~80 test; CS already has viewStateId message + getViewStateId/createViewStateId + webviewDidLaunch payload ⇒ fix(webview): add loading skeleton for view state initialization Zoo-Code-Org/Zoo-Code#928's vscode.ts + webviewDidLaunch hunks are redundant).
  • Parked register: 12 items (below) — all bounded, all documented; none needs rework.

VPS2 Recreation Plan — durable per-view state as independent fixes

This is the single execution source of truth. It supersedes the closed Zoo-Code-Org#977 draft series (fork PR #34; upstream PRs Zoo-Code-Org#966 Zoo-Code-Org#928 Zoo-Code-Org#979 Zoo-Code-Org#981 Zoo-Code-Org#983) and plans/pr-split-parallel-view-state.md (old 4-PR inventory — historical reference for file-level attribution + commit table only).

Objective: recreate the durable per-view state fix/feat (superseded PR Zoo-Code-Org#977 + closed draft PRs/issues) as a list of independent fixes (vps2): each PR is standalone, based on the same upstream base, gated by the standard skill gate suite, and carries its own upstream issue (created at PR-open time). This issue is the single coordination point.

Independence guarantee

Fix table

Fix Unit Scope (in-unit landings) a+d (est / measured) Deps
F0 button targeting D1–D4: no-wipe setPanel; sidebar title-bar handlers target the click-origin provider; 4 new *InTab command ids (packages/types/src/vscode.ts) + editor/title rewire (zero new i18n strings); ClineProvider.getInstanceForView; tab-panel reuse in openClineInNewTab; focusInput condition sidebarPanel && !tabPanel; multi-instance spec rewrite 484 measured (411+/73−, 171620621)
F1a per-view identity + durable core CP persistence primitives (write queue, prune, rekey, setViewStateId + __proto__ guard, loadViewState, saveViewState) + view-local buffer (setValue/setValues/getValues + _save/_update/_persist/_clearViewLocalState helpers) + postMessage void-ack + resetState clears; types viewStates record (global-settings +10 / vscode-extension-host +1 / index.test +5); spec adapted into the existing ClineProvider.spec.ts fixture (viewId + saveViewState + loadViewState + prune-baseline describes, __proto__ test, postMessage ack test, history-restore H5–H7, hasLoadedFullDetails Once fix — CS F1 spec NOT ported as one file, no 588-line preamble duplication) 999 measured (976+/23−, 0a8ffc9e1)
F1b getState merge mergedStateValues + getState() body (CS h17/h18); spec: getState-merging describe (CS L1022–1363) + local-state-isolation describe (CS L719–765 — asserts via the getState() merge, so it lands here, not F1a) 717 measured (622+/95−, 43b52aa11) F1a
F1c webview identity + launch WMH webviewDidLaunchsetViewStateId + launch-time re-pin via merged getState(); updateSettings via provider.setValue; webview-ui id-helper + acquireVsCodeApi fallback + prod-branch setState/getState try/catch; new prod-branch vscode tests; WMH spec launch describe (excl. mojibake comment hunk + unused defaultModeSlug import — F3 re-adds it) 545 measured (528+/17−, 090d2c87e) F1b
F2 durable viewStates creates ClineProvider.parallelMode.spec.ts (588-line mock preamble + container fixture from CS); pruning edge tests (missing updatedAt/ties) + Zoo-Code-Org#1065 50-entry-cap regression 733 measured (733+/0−, aa0f3b1b7) F1a, F1c
F3 mode/profile writes webview deleteApiConfiguration routed through deleteProviderProfile (repoint call) + webview-delete-path spec test; loadViewState dead-mode-pin validation with defaultModeSlug fallback + dead-mode-pin spec test; CP handleModeSwitch/upsert/activate/deleteProviderProfile hunks (incl. repointPersistedViewStates def + delegateParentAndOpenChild as any removal); Task.ts/SwitchModeTool + specs; sticky-mode spec (+104); handleModeSwitch durable-write tests H3/H4 (reclassified from F1 — base updateGlobalState bypasses public setValue, so the durable write only exists via F3's explicit saveViewState); parallelMode F3 describes (profile mutations / activation / handleModeSwitch, CS L1364–1674) ~500 est F1b, F2
F4 cross-instance reset + import invalidation port Zoo-Code-Org#981 (e7512a08b): broadcastResetToAllInstances (ClineProvider.ts:3064, 12 lines) + resetState call site (:3108) + importExport hook (importExport.ts:39 + :393-394) — replace Zoo-Code-Org#981's per-instance setValue("viewStates", undefined) with a single write-queue clear (queue at ClineProvider.ts:577); no webviewMessageHandler wrapper (import case passes provider structurally at webviewMessageHandler.ts:1027); tests: port parallelMode.spec L1247-1357 (~110) + importExport.spec (+152) + parallelMode multi-instance + _clearViewLocalState describes (CS L1675–1791) ~300 est F2, F3
F5 API wiring + task controls stale setConfiguration doc fix (packages/types/src/api.ts:116-119 → writes target the sidebar/extension-host view); preserveOpenTabs @PARAM JSDoc (api.ts:20-32); spec split: api-task-control.spec.ts (L96-263 + L265-305), api-set-configuration.spec.ts (happy path), api-configuration.spec.ts (getConfiguration flatten + strip-secrets, L70-102 new); PR body documents the sidebar-only API limitation (A4 major, parked) 557 measured (549+/8−, b5875118e re-stacked on F2 head aa0f3b1b7; soft-over — the Zoo-Code-Org#982 wiring-exists verdict is NOT HELD at the F1a head, so the CS src/extension/api.ts port is included; rationale in the PR body) F1a, F2
F6 e2e suite (test-only) port/extend apps/vscode-e2e/src/suite/view-state.test.ts for the vps2 split; A5 minor 2: one webview-reload/rehydration e2e test measured at cut F1a–F1c, F3
F7 Zoo-Code-Org#915 skeleton skeleton port (~20 src + ~80 test) ~100 est F6

Budgets (binding, per the zoo-code-coding-workflow skill): ≤ 400 a+d per PR soft (git diff --shortstat <stack-base> <branch>, re-measure post-commit), 1000 hard cap — never ship a PR above 1000; a unit over 1000 is split at its reserved point (largest test-file describe or largest impl-hunk group — tests travel with their code); per mutation-tested package: changed executable lines ≤ 500 and raw mutants ≤ 400 (stryker-diff manifest; test/spec/visual files are excluded from the manifest); the CS parallelMode.spec.ts (+1790) is NOT ported as one file — the F1-series describes are rewritten into the existing ClineProvider.spec.ts fixture (drops the 588-line mock preamble), F2 creates parallelMode.spec.ts (preamble + pruning-edge + Zoo-Code-Org#1065 50-cap), F3/F4 add their describes (CS L1364–1674 / L1675–1791); never edit scripts/stryker-diff.mjs in a commit (local win32 shim allowed, always git checkout -- scripts/stryker-diff.mjs before push).

Per-fix workflow (identical for every F)

  1. Cut: git worktree add -b vps2/<slug> <path> 0d937c050810ebc305b34368bf6d6ae8c1f89966; pnpm install --frozen-lockfile.
  2. Implement from the gap-review in-unit landings; port hunks from the stale sibling heads by hand (diff context, not cherry-pick).
  3. Gates (per zoo-code-coding-workflow skill):
    • per touched file: pnpm --dir src exec eslint --prune-suppressions --max-warnings=0 <relative-file> — touched-file suppression counts must not rise (prune re-indents the json; check counts, revert if unchanged);
    • pnpm check-types;
    • targeted vitest per touched package (pnpm --dir src exec vitest run <spec>, pnpm --dir packages/types exec vitest run <spec>, etc.);
    • node scripts/find-missing-translations.js only if locales touched;
    • e2e touched ⇒ pnpm --filter @roo-code/vscode-e2e test:ci:mock;
    • visual baselines only for webview-ui changes;
    • mutation preflight: verify changed executable lines in mutation-tested packages ≤ ~300 (manifest dry-run);
    • node scripts/stryker-diff.mjs ci --base 0d937c050... --head <head> (install local win32 shim first; revert shim before push).
  4. Budget check: git diff --shortstat <stack-base> <branch> ≤ 400 soft / 1000 hard (re-measure post-commit; over 1000 ⇒ split at the reserved point — never squeeze in).
  5. Commit: one logical conventional commit, squashed; explicit git add <paths> only; git status --short before commit.
  6. Push: revert the shim (git checkout -- scripts/stryker-diff.mjs) — push must contain only the intended files.
  7. Issue at PR-open time: create the NEW upstream issue (bug report / feat description, self-contained) on Zoo-Code-Org/Zoo-Code.
  8. Draft PR: base = upstream/main (no-wait stack: the displayed vs-main diff includes lower units until they merge — the body states the standalone a+d measured against the stack base, step 4); body references this tracking issue (cross-repo link) — never Closes #xxx; body carries the a+d measurement, gate evidence, parked-limitation notes where applicable.
  9. Bookkeeping: update the unit-status table row above (PR link, a+d, state) after opening.

Execution waves (max 3 parallel workers)

PR body template (per fix PR)

Part of the vps2 durable per-view state series — tracked in easonLiangWorldedtech/Zoo-Code#41
(cross-repo: this PR is standalone against upstream/main @ 0d937c050).

## What
<2-3 sentences: which defect/gap, which fix unit (F#)>

## Design decisions
<bulleted, terse — from the gap-review ledger entries>

## Measurements
- a+d vs upstream/main @ 0d937c050: <N> (soft budget 400)
- src executable lines changed: <N> (mutation preflight)

## Gates
- eslint --prune-suppressions: pass (suppression counts unchanged: <...>)
- check-types: pass
- vitest: <suites> pass
- stryker-diff ci: <K killed / S survived (list) / 0 blocking>
- (e2e / i18n / visual: n/a or pass)

## Parked / documented
<limitations inherited from the gap review, e.g. F5 sidebar-only API targeting>

## Porting notes
<hunks ported from the stale sibling heads / CS (by id + line refs), all re-implemented against this base; plus the CS-hunks-not-ported register entries this PR observes (register in the tracking issue)>

CS hunks intentionally NOT ported (verified 2026-09-05; observed by every vps2 PR)

  1. requestRouterModels kimi-code OAuth try/catch (webviewMessageHandler prod hunk, WMH diff L246–281) + routerModels.spec.ts +29 test — out-of-scope error-handling change bundled in fix(webview): add durable per-view state base Zoo-Code-Org/Zoo-Code#977.
  2. ApiConfigManager.tsx className min-w-0 shrinkgrow (+2/−) — out-of-scope layout tweak.
  3. ApiConfigManager.visual.tsx deletion (−36) + 2 PNG visual baselines — visual-test rework bundled in fix(webview): add durable per-view state base Zoo-Code-Org/Zoo-Code#977, not a state change.
  4. Mojibake comment hunk (WMH diff L160–167, —? corruption) — do not port.
  5. Unused defaultModeSlug import in the WMH diff — dropped from F1c; F3 re-adds it with its dead-mode-pin test (the import lands with its first consumer).
  6. providers/*, .coderabbit.yaml, .github/*, CONTRIBUTING.md, .gitignore — non-functional / repo-config churn.

Parked-items register (12, all bounded)

  1. Dev/prod viewStateId divergence (A1 minor 3) — inherent to browser mock.
  2. Pre-launch write-queue/rekey orphan window + cross-session temp-id collision (A1 minor 2) — narrow window, prune-bounded, non-secret.
  3. Cross-process write-queue interleave (A1 minor 4) — pre-existing memento semantics.
  4. Redundant repoint branch (A1 nit) — cosmetic.
  5. Launch-repair queue sync (A2 minor 3) — transient, self-healing.
  6. Same-provider two-writer interleave test (A2 minor 4 tail) — cross-instance interleave already covered.
  7. Flat-mutation apiConfiguration replace (A2 nit) — coherent via getState re-merge.
  8. Editor-tab viewStates orphan after window reload (A3 minor 3) — no panel serializer; prune-bounded.
  9. Pre-hydration state-post window (A3 nit) — UI severity unestablished.
  10. Sidebar-only API targeting (A4 major) — architectural; documented limitation.
  11. Public task-scoped ask controls (A4 minor 1) — trust model matches pre-existing public approveCurrentAsk.
  12. set-configuration implementation-detail pin (A4 nit) — brittle if inlined; acceptable.

Superseded-items disposition (24 items; 23 closed 2026-09-05, Zoo-Code-Org#1065 close permission-blocked)

Item Title Covered by
fork PR #34 Merge Zoo-Code-Org#977 (durable per-view state base) into the file-write-safety trial branch F1 + F2 (the Zoo-Code-Org#977 content, re-cut as independent fixes)
upstream Zoo-Code-Org#967 [BUG] Per-view state lost on extension reload — no durable persistence F1 + F2
upstream Zoo-Code-Org#984 [BUG] Add durable per-view state persistence for parallel tabs F1 + F2
upstream Zoo-Code-Org#1065 Preserve durable editor view state across provider disposal F2 (50-entry-cap regression; dispose-retention already satisfied in CS) — close permission-blocked (403); pointer comment posted
upstream Zoo-Code-Org#978 [BUG] Isolate parallel mode and provider profile writes F3
upstream Zoo-Code-Org#980 [BUG] Invalidate per-view state after reset and settings import F4
upstream Zoo-Code-Org#982 [BUG] Sync API setConfiguration through provider state wiring F5 (sidebar-only limitation documented)
upstream Zoo-Code-Org#913 [UX] Multi-tab mode isolation — follow-up issues from PR Zoo-Code-Org#909 the series as a whole (F0–F6); individual findings dispositioned in the ledger above
upstream Zoo-Code-Org#915 [UX] Flash of incorrect mode/apiConfig when opening new editor tab F7 (skeleton port; un-parked 2026-09-06 — wave 6)
upstream Zoo-Code-Org#929 [909] CodeRabbit Review Findings — View State Isolation Bugs A5 re-review: 5/5 findings verified stale or superseded
upstream Zoo-Code-Org#916 [UX] Add visual indicator for per-view mode isolation out of vps2 scope (UX polish; no fix unit)
upstream Zoo-Code-Org#917 [UX] Add save indicator for per-view API configuration changes out of vps2 scope (UX polish; no fix unit)
upstream Zoo-Code-Org#918 [UX] Wire SettingsView Save button to syncViewStateToGlobal out of vps2 scope (SettingsView cachedState binding already satisfied per A5; not part of CS content)
upstream Zoo-Code-Org#919 [UX] Add telemetry/tooltip for view-local state persistence limitation out of vps2 scope (UX polish; no fix unit)
upstream Zoo-Code-Org#920 [BUG] Concurrent task history updates from parallel tabs may cause lost entries out of vps2 scope (task history is outside the per-view state surface)
upstream Zoo-Code-Org#922 [BUG] Switching mode/apiConfig while parallel tools are running may corrupt task state F3 (per-view mode/profile write isolation; unknown-mode hardening verified in the gap review)
upstream Zoo-Code-Org#923 [ENHANCEMENT] Support Fork-Join parallel modes with per-view state isolation out of vps2 scope (per-view isolation layer = F1–F6; Fork-Join orchestration is a separate feature)
upstream Zoo-Code-Org#924 [ENHANCEMENT] Add "New Tab" button beside "Start New Task" for parallel mode discoverability out of vps2 scope (UX discoverability polish; no fix unit) — same disposition as Zoo-Code-Org#916/Zoo-Code-Org#917/Zoo-Code-Org#919
upstream Zoo-Code-Org#921 [BUG] Parent-child task delegation across parallel tabs may lose state out of vps2 scope (task delegation is outside the per-view state surface)
upstream PR Zoo-Code-Org#966 fix(webview): isolate parallel provider view state F1/F2 content (porting source, stale head beaf30b90)
upstream PR Zoo-Code-Org#928 fix(webview): add loading skeleton for view state initialization F7 (Zoo-Code-Org#915 skeleton port; un-parked 2026-09-06; its vscode.ts + webviewDidLaunch hunks redundant in CS)
upstream PR Zoo-Code-Org#979 fix(webview): isolate parallel mode and provider profile writes F3 content (porting source, stale head e21ff41e9)
upstream PR Zoo-Code-Org#981 fix(webview): invalidate per-view state after reset and import F4 content (porting source, stale head e7512a08b)
upstream PR Zoo-Code-Org#983 fix(api): sync setConfiguration with provider state F5 content (porting source, stale head 2d162d6dd)

Related items left open by decision (not superseded): Zoo-Code-Org#568 (community Fork-Join feature request — vps2 is its state-isolation foundation, not its fulfillment) · PR Zoo-Code-Org#926 (cross-instance task-history lock for Zoo-Code-Org#920 — task history is outside the per-view state surface; standalone track).

Bookkeeping checklist

Non-goals

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions