Handoff: Finish round 7 backfill and checkpoint work fixes, then validate D on runners
Written 2026-10-27 08:16 UTC.
RE-VERIFY: Current snapshots only; use gh pr view https://github.com/CodexCoder21Organization/AiCliSupervisorManagerEmbedded/pull/48 --json state,headRefOid,baseRefName and git ls-remote for branches.
Design decisions in force
2026-10-27 round7 owner direction: "Three pieces of work, all in this round; do not stop after one"; "Change ONLY the test's setup" and keep UTF-8 assertions/count/byte check unchanged; separate approval-marked commit. Preserve the500-row backfill bound, all cleanup inputs/iterations and30s limit. No local timing gates or full suites; use authorized GitHub runner paths. "Never merge or enqueue." Production read-only; no deployment authorized.
Round 7 live progress
A setup-only commit 1a87ce6 is on the requested fd677d9 baseline. Local real-code pass and deliberately broken UTF8 red proof recorded; mutation never committed. Root branch now wip/fixD7-2026-10-25 at8d062bbae20921162627ad3debcd2cb4b61f1e78 includes compact-fold checkpoints and backfill decoded-row reuse. The temporary latestmain rebase described below was reverted because it changes unrelated IO observers and C history. Current Cbase remainsba04c64.
All seven requested tests are first-attempt clean twice (14/14) in https://github.com/CodexCoder21Organization/AiCliSupervisorManagerEmbedded/actions/runs/40473258019. Cleanup times now6.829–8.833s, near C's reported~7s; no original test assertions/inputs/iterations/timeouts/bounds changed except the authorized Asetup. Cwork guard exactfd red:7slices703746checkpointbytes; fixed guardpasses<=16384bytes/slice. Code review passes; test review identified a missing grid-widening-after-resume neighbor, and root added a separate public test. Its deliberate wrong-decoder discrimination is in progress; finalrunner/full suite still pending. PRbranch remains2553747 and is not eligible for update until cleanfullsuite.
Durable text findings, reviews and XML evidence are on the evidence branch, remoteheadf3a6b5a82eb53626930a357314df92bf13535cc4. Rawprofiler/environment recordings were neither created nor uploaded.
| Repository |
Branch |
Remote SHA |
PR |
State |
| Embedded |
checkpoint test on fd baseline |
ca88ae6e54e72b0686d7cc5f0f1a8f4b31aabc10 |
no PR |
test-only checkpoint; red runner pending |
| Embedded |
temporary red runner |
312fae7bf20a05f9ccecc73eeeb802beb312138a |
no PR |
only extra commit is scratch workflow; delete after download |
Root checkout rebased fd677d9 onto current main dfce350 per mandatory build rule; clean rebased baseline8f4c7f9. Three adjacent conflicts retained both interruption handling and D event reuse. Main adds interruption tests, so final suite count will increase. Root fixes are checkpointed at8d062bb; remaining work is the new neighbor test and exact-head full suite. All original rounds retained below for provenance; their statuses are historical.
No production deploy/publish/restart/upload/route mutation, merge, enqueue or PR closure has occurred in round7.
Current round 6 decision and remaining work
The operator requested a conversation info card and status timeline without the rolled-back 11 MB per-page transcript scan. This is chunk D (shared reader/timeline) built on C's persisted store. Round 6 must resolve the supplied full-suite failures before advancing the PR.
Design decisions in force (2026-10-27, brief verbatim):
- "if you believe the test itself must change, STOP and write the reasoning in findings.md (never weaken an assertion or bound yourself)."
- "Never merge or enqueue. Push a checkpoint at every commit."
- "Do NOT run timing gates or full suites locally. Use GitHub runners instead"
- "never raise the 30 s limit, cut iterations or shrink inputs."
- "Production is read-only: no restart, deploy, upload or route update."
ROUND 6 STOP: testConversationInsightsJournalPreservesUtf8Encoding captures the long supervisor alias key, renames the supervisor, then requires two old-key TEXT rows. D's round 5 ownership fix removed alias copies from conversation epochs and joins the sole current registry name. The old key therefore matches neither the current join nor persisted rows; zero items is explained without establishing any UTF-8 error. Commit d9d1b0df30361f8e105e551f041ef1381d01795e added the rename specifically to force the old persisted-alias path, before that path was removed. API v1 describes live pages and no unbounded old snapshots; it does not promise old registry values remain readable. The test setup therefore appears obsolete. No assertion or code was changed, per the explicit stop instruction.
Proposed decision: authorize a revised setup that still proves the full persisted UTF-8 encoding contract, with the same long input/cardinality/complete-text checks; a transcript-owned metadata value is a candidate, but must first verify that it tests the journal encoding boundary rather than parser normalization. Do not simply delete the rename or accept empty rows: those lose the persisted-path proof. Exact source evidence and caveats are in the findings link below.
Backfill source observation, NOT a verified fix: 200 candidate metadata decodes + 200 pending lookups + new ensureInsightsCatalog event application gets each legacy row again = 600 consistent with the runner measurement. Keep the 500 bound and remove redundant decode at its cause after confirming it. Cleanup regression has NOT been investigated in round 6; it remains an explicit next phase, not a resolved or refuted item.
| Repo |
Branch |
Remote head SHA |
PR |
What is on it |
State |
| AiCliSupervisorManagerEmbedded |
wip/fixD6-2026-10-25 |
583adba1851e71ef71d1b4d57066c09ff0bf5c2f |
no new PR |
fd677d9 plus round 6 findings and plan only |
pushed, ls-remote verified; no source/test changes or new test results |
| AiCliSupervisorManagerEmbedded |
wip/fixD5-2026-10-25 |
fd677d9a9b98c9ebad3d9f61e2488fbe70371bdf |
no PR adoption yet |
round 5 source |
supplied full runner 362/368 first attempt, six failures |
| AiCliSupervisorManagerEmbedded |
wip/insC-2026-10-26 |
ba04c6423bc0ecedc26601f0b109a1952853eaf5 |
https://github.com/CodexCoder21Organization/AiCliSupervisorManagerEmbedded/pull/47 |
C base |
live branch checked, supplied 327/327 baseline |
| AiCliSupervisorManagerEmbedded |
wip/insD-2026-10-26 |
2553747efb4145617278987b104588fdac8d80e4 |
https://github.com/CodexCoder21Organization/AiCliSupervisorManagerEmbedded/pull/48 |
prior D PR head |
freshly OPEN, unmerged, unchanged |
Round 6 findings and plan are durable. No build outputs, raw recordings, environment dumps or secrets uploaded. No deployment, artifact publication, production mutation, merge or enqueue was performed by this round; commit diff contains notes only.
Next steps: reverify refs; resolve the UTF-8 setup decision; finish required documentation reading (full testing guide and initial design before writing tests); fix redundant backfill reads without changing bounds; measure cleanup-added work and add a deterministic red work-count test; fix cause; run all requested targeted/cleanup repetitions on runners and one exact-head full suite, read FIRST-attempt XML; only if clean lease-update the existing PR branch from 2553747, rewrite why-first description, watch kotlin.build (remote) via tracked build-watchman 0.0.21. Never merge/enqueue. Full runner baseline: https://github.com/CodexCoder21Organization/AiCliSupervisorManagerEmbedded/actions/runs/40468065609 . Existing landD failure logs are local at the paths in the brief; no re-run this round.
Earlier handoff body retained for provenance (round 6 status above supersedes older progress claims)
Handoff: Make registry metadata changes bounded before finishing conversation insights validation
Written 2026-10-27T05:19:19.805712+00:00.
RE-VERIFY: this is a write-time snapshot. Recheck the remote branches with git ls-remote and https://github.com/CodexCoder21Organization/AiCliSupervisorManagerEmbedded/pull/48 with gh pr view --json state,headRefOid,baseRefName,statusCheckRollup before acting. Round5 implementation is under validation, not ready for PR-head adoption.
Design decisions in force (2026-10-27 round 5)
“all five are in scope for THIS round, and so is any further instance of the same class you find (a value owned by the manager registry or catalog being re-read, re-encoded, re-hashed or re-written on an append, a slice, or a page read when it has not changed). Fix them; do not stop for them. Stop only for a problem genuinely outside that class.” This supersedes round4's scope stop. No truncation, API caps, timeout increases, 2 MiB increase, or smaller fixtures. Never merge/enqueue or mutate production. Exact-head full-suite and timing-sensitive validation run on GitHub runners under the explicit host exception; read first-attempt uploaded XML.
Current round5 snapshot (2026-10-27 07:35 UTC)
RUNNING. Final source fd677d9a9b98c9ebad3d9f61e2488fbe70371bdf is pushed and remotely verified on wip/fixD5-2026-10-25, rebased onto current main and current C ba04c6423bc0ecedc26601f0b109a1952853eaf5 immediately before full validation. PR https://github.com/CodexCoder21Organization/AiCliSupervisorManagerEmbedded/pull/48 remains OPEN at old2553747; do not adopt round5 into its branch before exact-head full-suite validation.
All five original round4 regressions passed their first executed fixed attempts on runner40457742121, plus the heartbeat index guard. All40 inherited/adjusted focused files now have first-attempt passes after documented test/implementation corrections. Latest runner40467101603 proves AbandonedStaging2703ms, OfflineReclamation2304ms, unchanged300-model work1730ms, catalog-only models1823ms, source ordinal1615ms, all first-attempt clean.
Implemented owner-joined indexed name/title/cwd, separate name index persistence, immutable version hash reuse, bounded catalog-text retirement with transcript-epoch gate distinction, catalog-only model inventory change ownership and source-epoch-fenced admission, real model ordinals, old index migration including Unicode. Last defect was model pre-admission before source boundary verification, contaminating old published epochs; public guard red3/3 then fixed first-pass. Original alias inputs/turn counts/work assertions remain; transcript-owned data replaces alias-derived row volume (440/586/684/1954/64). Both original3*200 cleanup turns now pass with586 branch text/commit rows. Independent final source/test review found no remaining concrete issue. Oversized identity candidate refuted by existing4096-byte identity/32768-byte combined contract, no cap added.
Next: original workflow full-suite dispatch on exact fd677d9, inspect uploaded XML first-attempt results (not overall green), then check PR OPEN, push exact tested SHA to wip/insD-2026-10-26 with explicit lease, verify remote, update PR why/what/counts and watch required kotlin.build(remote) green with build-watchman0.0.21. No merge/enqueue/deploy/publication. Scratch branch cleanup, watcher cleanup, clone/cache removal on exit. Detailed evidence and reviews are pushed under investigations/registry-metadata-round5. out/findings.md is live local copy; preserve later full results in handoff/PR or separate evidence branch without changing exact tested source head.
Mission and reason
The operator wants a conversation info card and activity timeline after a whole11MB transcript scan was rolled back. Chunk D must feed persisted search/insights incrementally and keep work bounded for source appends, page reads and restart. Round3 fixed transcript encoding, but found that an unrelated short append rewrites a whole supervisor alias. Round4 was asked to remove manager-owned metadata from transcript deltas and finish validation. The required all-fields audit found the same ownership problem in title/cwd and a separate whole-model-inventory append cost; stopped under the explicit scope-growth instruction, before adopting a behavioral fix.
Prior round4 state (historical; round5 above supersedes)
- Remote WIP 9f26b2b5d8b740a2a50952b2975915c177370726 contains five enabled public regressions, the owner/encoded-byte invariant table, ordinary red XML/log evidence, and the joined-text work diagnostic. Only diagnostic production code changed; no registry-ownership or paging fix is implemented.
- Every new scenario fails its intended assertion on all three baseline attempts. Cwd3201/3259/3430ms; title3745/3186/3951ms; alias-many-appends3823/3621/3666ms; paging3643/3335/3558ms; unchanged-model append3054/3416/3644ms. One initial title fixture expected513 points where the existing daemon returns512; its three fixture failures are retained separately and excluded from the five reproductions.
- Alias proof:600000 quote characters stored with public setSupervisorAlias, then98 source bytes ->2613248 encoded event bytes, consumerIndexedBatch.
- Cwd proof: real daemon catalog owns30009-byte cwd from a late metadata record; each preceding transcript slice re-emits its whole TEXT inventory. Title is likewise copied into every delta header.
- Paging proof: one1024-character supervisor TEXT chunk processes3602048 UTF-16 code units. The public diagnostic counts units submitted to full-value counts/UTF-8 conversions/hashes and chunk traversal. Repeated whole-name hashes and filtering from the beginning are confirmed, not inferred.
- Model proof: real daemon seeds300 distinct models; one98-byte append with no new model performs307 insights record reads. delta() walks row.models.distinct and reads all300 stored model rows. Existing writes are deduplicated, existing work is not.
- Do not blindly delete catalog admission: daemon Codex response_item admits payload.message.model, but current TranscriptFactsConsumer.FACT_FIELDS and timeline model extraction omit that nested path. OBSERVED code gap; INFERRED consequence is that simple deletion can lose an already-known model form. Preserve catalog semantics with a bounded change-owned path or complete source-fold equivalence proofs.
- A naive title/cwd join through conversationMetadata.get decodes the whole metadata row, including its growing model list, on each snapshot. The unapplied candidate files are explicitly marked discarded sketches, not fixes or reviewed recommendations. They never ran.
- Cleanup fixtures in C use600000+ aliases to fill retired epochs. Preserve those original aliases, turn counts and work bounds, while also populating equivalent transcript-owned rows after alias copies are removed. Do not weaken the cleanup tests.
- The36 inherited remaining files and full local suite have NOT RUN in this lane. Round3's3 new and7 inherited first-attempt passes are inherited evidence, not revalidated here. No green count is claimed for round4.
- No deployed/published-but-unmerged code was produced by this session: the action log contains no publish, deploy, restart, upload or route mutation. No production state is inferred from old notes. No merge/enqueue/PR closure occurred.
Relevant PRs and branches
| Repository |
Branch |
Remote head |
PR |
Contents/state |
| AiCliSupervisorManagerEmbedded |
round4 |
9f26b2b5d8b740a2a50952b2975915c177370726 |
D, not adopted |
builds;5 enabled regressions reliably fail; diagnostic only; no behavioral fix |
| AiCliSupervisorManagerEmbedded |
round3 |
a0b01108e8eb8e5bb237faddf9ee169e3f0230e9 |
D, not adopted |
inherited encoded-text fix;3 new/7 inherited passed;36 remaining/full suite unrun |
| AiCliSupervisorManagerEmbedded |
PR branch |
2553747efb4145617278987b104588fdac8d80e4 |
D, OPEN/unmerged |
code unchanged by rounds2–4; description updated with incomplete validation |
| AiCliSupervisorManagerEmbedded |
C |
999067ad305ff35d31b139c5cbd655c086c15566 |
C |
moving base; recheck before rebase/build |
Findings and invariant table, all red XML/logs and sketches. These are sufficient to recover the work without the local checkout.
Next steps
- Re-verify all branches/PR state first. Clone fresh under the lane's ws/ with gh repo clone --recurse-submodules; read README/AGENTS. Use ~/bin/coursier. Do not copy this red WIP onto the PR code branch before final validation.
- Extend the ownership design to catalog model admission and title/cwd joins. A bounded changed-value protocol must preserve all admitted facts, avoid whole unchanged model walks, and avoid whole catalog-row decoding on bounded reads. Source-fold replacements need public coverage of all accepted daemon model shapes, including nested Codex messages.
- Implement against the five enabled red tests, keeping limits/inputs intact. Persist joined-name summary/seek positions with registry changes rather than hashing the full name for every page or first read after restart. Do not retain a second whole alias per conversation.
- Strengthen reachable-after-red checks: title search, latest title/cwd after one change and many appends, transcript-cwd precedence, full Unicode TEXT paging and restart; update retired-epoch fixture ownership while keeping all original sizes/turns/work guards. Run dedicated test and code review passes.
- Run remaining36 inherited files one by one (the43-file inventory in investigations/reader-followup-validation.md minus the7 first-attempt results listed in round3 findings), then one machine-exclusive full local suite on the final head. Stop at non-first-attempt outcomes; investigate locally, never use CI as the runner.
- Rebase on current C if it moved, verify latest main before builds, push checkpoints, and only after exact-head final green update wip/insD-2026-10-26 and the existing PR description with counts. Stop once the PR is open and CI starts; no merge/enqueue/deploy is authorized.
Example individual invocation (df/rebase first): scripts/test.bash --local --test tests/testConversationInsightsCatalogModelsAppendWorkIsBounded.kts --log /absolute/path/result.xml. Every scenario is isolated with a real in-process daemon/manager and3.4.0.2 FakeFileSystem. No mocks/reflection or external services in tests. No raw thread dumps/profiler recordings/environment captures were uploaded or committed; ordinary synthetic test failure stacks are remote. Startup preparation took1265402ms in the first cold build, while the cached build rule took29138ms next; thread samples were local. This is an observation, not a root-cause claim or a reason to loosen a test.
Verbatim original round-4 brief (2026-10-27)
Chunk D, round 4: stop copying manager-owned metadata into every append, then finish validation (pull request 48)
Context: the operator asked for a conversation info card (supervisor, conversation id, start/last-update times, PR status and links, handoffs linked to https://www.handoff.wasmserver.com/) and a buildtest-style status timeline on https://aiclisupervisor.wasmserver.com/conversation. A first version scanned the whole 11 MB transcript per page view and was rolled back. Direction: https://github.com/CodexCoder21Organization/DocumentationRepository/blob/main/playbooks/SLOW_SERVICES.md, a persisted incremental projection owned by the manager with bounded work per append, page view and restart. Design: /tmp/claude-1000/-code/f67b4d83-4ebc-4507-bde7-f1a83d72de59/scratchpad/card-design/out/design.md. API contract: /tmp/claude-1000/-code/f67b4d83-4ebc-4507-bde7-f1a83d72de59/scratchpad/fix47c/out/api-contract.md. Repository: https://github.com/CodexCoder21Organization/AiCliSupervisorManagerEmbedded. Chunk D (shared append reader + timeline) is PR https://github.com/CodexCoder21Organization/AiCliSupervisorManagerEmbedded/pull/48 (head 2553747, base wip/insC-2026-10-26 = chunk C, PR https://github.com/CodexCoder21Organization/AiCliSupervisorManagerEmbedded/pull/47, which another lane may still push to).
Read fully first: /tmp/claude-1000/-code/f67b4d83-4ebc-4507-bde7-f1a83d72de59/scratchpad/fixD3/out/findings.md and final.md (and its alias-event-probe.log/xml), plus fixD2/out/findings.md for background. Round 3's work is on branch wip/fixD3-2026-10-25 (head a0b01108e8eb8e5bb237faddf9ee169e3f0230e9; check git ls-remote): the encoded-size fix is implemented and audited, 3 new scenarios pass first attempt, 7 of 43 inherited files pass, 36 unrun, full suite not run.
Round 3 stopped on an OBSERVED fourth mechanism: ConversationInsightsIngestion.text() re-emits every chunk of supervisorDisplayName (and the whole catalog title and cwd) into each delta. A public setSupervisorAlias of 600,000 quote characters followed by a 98-byte transcript append produced a consumerIndexedBatch write of 2,613,248 bytes (> 2,097,152). The permanent test testConversationInsightsSupervisorNameEventIsBounded fails all three attempts on that branch, as intended.
Decision (from the orchestrator): values the manager already owns in its registry (supervisor alias / display name, catalog title, cwd, and any other registry field you find in the same helper) are NOT copied into per-append transcript deltas. Reads already join them from the registry; keep it that way. If the projection genuinely needs a stored copy of such a value (for example for search or the timeline), it is written only when that value changes, as its own bounded change split across events by the existing byte-bounded batching, never re-emitted on unrelated appends. Do not truncate the alias, do not add a size cap to setSupervisorAlias or any API, do not raise the 2 MiB limit or any timeout, do not shrink test inputs.
Your job, in order:
- Before code, extend the invariant table in findings.md: list every value text() / the ingestion helper puts into a delta, its owner (transcript vs manager registry), when it may be written, and its bound in ENCODED bytes. Look for the same pattern elsewhere in the ingestion and consumer code (the gap search): any other place that re-emits unchanged owned data per append.
- Make the existing red test pass, plus tests for: a long alias that changes once then many short appends (work per append stays bounded and the new name is readable/searchable if search covers it); title/cwd equivalents; restart after the change. Each new test must fail on the current branch first (record red, push) unless the gap search shows it already passes, in which case record that evidence.
- If the joined supervisor TEXT paging hashes/filters from the beginning on every page read (round 3's INFERRED concern), measure it with a public work-count test; fix only if it is confirmed unbounded per page.
- Run the remaining 36 inherited files one at a time, then one machine-exclusive full local suite on the exact head you will push. Every test must pass on its first attempt.
- Rebase onto the current wip/insC-2026-10-26 if C moved, push to PR 48's branch (normal push, or --force-with-lease after a rebase), verify the remote SHA, update the PR description with counts and why these rounds exist.
Push a checkpoint at every commit. If a phase blows up in scope again, push what you have, write exactly where it stands in findings.md and final.md, and stop.
Note: if handoff-cli fails, keep a local out/handoff.md and say so; do not retry in a loop.
Disk is at 95% (17 GB free); delete your checkout and caches on exit and stop if free space drops below 3 GB.
Rules (all lanes)
- Workspace. Clone into a NEW directory under your lane's
ws/ folder, using gh repo clone CodexCoder21Organization/<repo> <dir> -- --recurse-submodules. Read each README.md and AGENTS.md before working. Use ~/bin/coursier, never /usr/local/bin/coursier.
- Disk. The disk is ~98% full and shared with other jobs.
- Run
df -h / before every build. If less than 3 GB is free, stop and write that down in your findings instead of building.
- Delete build outputs you no longer need, and delete your clones' caches when you finish.
- Tests. Read https://github.com/CodexCoder21Organization/DocumentationRepository/blob/main/architecture/TESTING.md before writing tests. Tests are end-to-end through public API with real in-process instances; no mocks, no reflection. Verdicts are hardware-independent: assert work counts, never wall-clock thresholds.
- Never raise a timeout, cut iteration counts, weaken assertions, or skip tests. "Cap", "throttle", "retry" and "keep warm" are not fixes. "The host was overloaded" is never a root cause.
- Before pushing, run the repository's full local test suite once on the exact head, and report pass/fail counts. Do not use CI as your test runner.
- PRs. Open each PR with a description that starts with the why (given in your brief), followed by what changed. Publish the artifact version per the repo README if downstream consumers need it.
- Do NOT merge or enqueue any PR; the orchestrator decides merges.
- Production is read-only: no restart, deploy, upload or route update.
- Checkpoints. Push a
wip/<lane>-2026-10-25 branch at the first real milestone (failing work-count tests) and at each one after.
- Findings. Write findings incrementally to your lane's
out/findings.md, not only at the end. Every ~5 minutes, append one paragraph with your current state. Separate OBSERVED from INFER. Before claiming a mechanism, write: "the mechanism is X, and the evidence is Y."
- Waits and cleanup. Any wait loop must have a deadline and must exit on every terminal state. Never
pgrep -f or pkill -f on text in your own command line. Before your final message, kill every background process you started and check with ps -eo pid,args -ww.
- Stop condition: once the failing tests pass, the full suite is green and the PR is open with CI started, stop. Do not do extra verification rounds. If a phase blows up in scope, push what you have, write down exactly where it stands, and stop rather than drifting.
SECURITY RULE: never commit or upload raw profiler recordings, heap dumps, environment dumps or anything that may contain environment variables or tokens; keep raw files local, commit only text summaries. Any JFR recording must disable InitialEnvironmentVariable and InitialSystemProperty events.
Context: the operator asked for a conversation info card (supervisor, conversation id, start/last-update times, PR status and links, handoffs linked to https://www.handoff.wasmserver.com/) and a buildtest-style status timeline on https://aiclisupervisor.wasmserver.com/conversation. A first version scanned the whole 11 MB transcript per page view and was rolled back. Direction: https://github.com/CodexCoder21Organization/DocumentationRepository/blob/main/playbooks/SLOW_SERVICES.md, a persisted incremental projection owned by the manager with bounded work per append, page view and restart. Design: /tmp/claude-1000/-code/f67b4d83-4ebc-4507-bde7-f1a83d72de59/scratchpad/card-design/out/design.md. API contract: /tmp/claude-1000/-code/f67b4d83-4ebc-4507-bde7-f1a83d72de59/scratchpad/fix47c/out/api-contract.md (aicli.supervisormanager:api:0.0.19, https://github.com/CodexCoder21Organization/AiCliSupervisorManagerApi/pull/20). Repository: https://github.com/CodexCoder21Organization/AiCliSupervisorManagerEmbedded. Chunk C (store) = https://github.com/CodexCoder21Organization/AiCliSupervisorManagerEmbedded/pull/47 on wip/insC-2026-10-26 (still moving: a lane is adding reclamation of replaced epochs). Chunk D (shared append reader + timeline) = wip/insD-2026-10-26, now 03b084f, full suite 315/317; another lane is finishing D (fixing its last two failures, then opening its PR) and the branch will move.