From 68c278e3b690dee40c87dd968368c2e9cb68d9d9 Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Sun, 27 Sep 2026 13:08:27 +0000 Subject: [PATCH] docs: add weekly report and change log for Sep 20-26, 2026 Co-Authored-By: Claude Opus 5.5 (1M context) --- CHANGES.md | 111 ++++++++++++++++++++++++++++++++++++ reports/sep20-sep26-2026.md | 90 +++++++++++++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100644 reports/sep20-sep26-2026.md diff --git a/CHANGES.md b/CHANGES.md index e7d33d1d..d405fbdd 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,117 @@ Auto-generated by /xce-changes — component-grouped, newest week first. `.wolf/` bookkeeping commits are excluded. +## Sep 20, 2026 - Sep 26, 2026 + + +### controller +- `63fd3d2a` fix(controller): checkpoints no longer punch a hole in the replicated log (bug-1870) (2026-09-26) +- `e4bb492a` fix(controller): checkpoints keep a job's exit code (bug-1867) (2026-09-26) +- `1d6c04c2` fix(controller): persist a failed job's finish_time through WAL_JOB_FAIL (bug-1747) (2026-09-26) +- `6876e4f6` fix(controller): persist a failed job's exit code through WAL_JOB_FAIL (bug-1754) (2026-09-26) +- `910b43cd` fix(controller): never close() the primary channel's raw fd (bug-1865) (2026-09-25) +- `b5d59253` fix(controller): stop a failed test from hanging the unit suite (bug-1429); mkstemp for upgrade temp file (bug-1861) (2026-09-25) +- `ca4db13a` fix(controller): string resvals own their bytes -- rejoin use-after-free killed new primary (bug-1851) (2026-09-24) +- `1f6f219d` fix(controller): resync_resolve_round never told scheduler RECONCILING cleared (bug-1841) (2026-09-22) +- `e1da9f1e` fix(controller): standby-endpoint err handler freed ep->data under a live vtask (bug-1839) (2026-09-22) +- `cd9ecb41` fix(controller): CtrlHelloRequest.key Data field crashed HA leader election (bug-1835) (2026-09-21) + +### worker +- `5df33e69` fix(worker): xcecd's fixed /tmp files never follow planted links (bug-1869) (2026-09-26) +- `7864a3da` fix(worker): don't follow links planted at a job's output file name (bug-1868) (2026-09-26) +- `7723a4f4` fix(worker): fetchfile only reads the job's own output file (bug-1508) (2026-09-26) +- `c29518b2` fix(worker): lock the worker list against vtask-thread readers (bug-1862) (2026-09-25) +- `7c98c056` fix(worker): don't let a failover outage expire a finished job's retained outcome (bug-1859) (2026-09-25) + +### scheduler +- `663ea63c` fix(scheduler): re-pushed resource definitions are not errors (bug-1854) (2026-09-25) +- `601b245e` fix(scheduler): a failed COMPOUND leaves no partial allocation (bug-1766) (2026-09-25) +- `aea34738` fix(scheduler): allocate every primary of a COMPOUND, not only the last (bug-1863) (2026-09-25) +- `b4e9a099` fix(scheduler): check slots/rusage for primaries nested in COMPOUND/ALTER (bug-1768) (2026-09-25) +- `1ecd348f` fix(scheduler): ALTER allocation type confusion (bug-1769); NULL queue in legacy fcfs hooks (bug-1771) (2026-09-25) +- `9e9f2798` fix(scheduler): release interned queue resreq with dereference, not free (bug-1858) (2026-09-24) +- `9c02184f` fix(scheduler): record events before the core applies them (bug-1852) (2026-09-24) +- `ac033f47` fix(scheduler): record config pushes, free hlimits lists, quiet benign picker WARN (bug-1847/1848/1849) (2026-09-24) +- `a9feded8` fix(scheduler): mid-round rejoin config push truncated live rounds (bug-1846 part 2) (2026-09-24) +- `77f047f2` fix(scheduler): host-scoped limit staged N times per dispatch (bug-1846 part 1) (2026-09-24) +- `fcf119b4` fix(scheduler): 3 --sim-verify false positives + snapshot resreq_fp gap (bug-1844/1845/1772) (2026-09-23) +- `5ee329b1` fix(scheduler): recorder silently truncated a round's decisions on realloc failure (bug-1843) (2026-09-23) +- `7901db57` fix(scheduler): --sim-verify false-flagged every DISPATCH decision on wall-clock drift (bug-1842) (2026-09-23) +- `4f94638a` fix(scheduler): route sim reconciliation's on_dispatch() through the allocator thread (bug-1837) (2026-09-21) +- `94115b00` fix(scheduler): sim mode force-dispatched recorded decisions past live capacity (bug-1836, bug-1838) (2026-09-21) +- `ea76f477` fix(scheduler): percent-limit capacity reads maxmem/maxswap, not mem/swap (bug-1834) (2026-09-20) +- `0ce71254` fix(scheduler): percent-based limit display shows raw fraction, not percent (bug-1831) (2026-09-20) +- `bf61f595` test(scheduler-sim-diagnostics): close cross-cutting gaps for Requirement 6 (task 10.2) (2026-09-20) +- `51255366` test(scheduler-sim-diagnostics): strengthen coincidentally-passing assertions (task 10.1) (2026-09-20) +- `70190107` fix(scheduler-sim-diagnostics): correct usage display's resource classification (task 9) (2026-09-20) +- `8477f677` feat(scheduler-sim-diagnostics): wire info limit to fmt_limit_units (task 8.2) (2026-09-20) +- `eb23c158` feat(scheduler-sim-diagnostics): promote byte-unit formatting to shared lib (task 7) (2026-09-20) + +### xceadmin +- `7982f285` feat(xceadmin): validate percent-based limit values are in [0.0, 1.0] (bug-1833) (2026-09-20) + +### lib +- `663ea63c` fix(scheduler): re-pushed resource definitions are not errors (bug-1854) (2026-09-25) +- `6b1862f8` fix(lib): retry a NOT_READY controller in place instead of failing over (bug-1850) (2026-09-25) +- `0d3bb965` fix(lib): keep per-endpoint message order in the vtask dispatcher (bug-1864) (2026-09-25) +- `aea34738` fix(scheduler): allocate every primary of a COMPOUND, not only the last (bug-1863) (2026-09-25) +- `e71d91bf` chore(libxce-failover): log the status that triggered each failover rotation (bug-1850) (2026-09-24) +- `ca4db13a` fix(controller): string resvals own their bytes -- rejoin use-after-free killed new primary (bug-1851) (2026-09-24) +- `ea76f477` fix(scheduler): percent-limit capacity reads maxmem/maxswap, not mem/swap (bug-1834) (2026-09-20) +- `0ce71254` fix(scheduler): percent-based limit display shows raw fraction, not percent (bug-1831) (2026-09-20) +- `9f54c575` feat(scheduler-sim-diagnostics): add fmt_limit_units() sibling (task 8.1) (2026-09-20) +- `eb23c158` feat(scheduler-sim-diagnostics): promote byte-unit formatting to shared lib (task 7) (2026-09-20) + +### include +- `63fd3d2a` fix(controller): checkpoints no longer punch a hole in the replicated log (bug-1870) (2026-09-26) +- `1d6c04c2` fix(controller): persist a failed job's finish_time through WAL_JOB_FAIL (bug-1747) (2026-09-26) +- `6876e4f6` fix(controller): persist a failed job's exit code through WAL_JOB_FAIL (bug-1754) (2026-09-26) +- `663ea63c` fix(scheduler): re-pushed resource definitions are not errors (bug-1854) (2026-09-25) +- `6b1862f8` fix(lib): retry a NOT_READY controller in place instead of failing over (bug-1850) (2026-09-25) +- `0d3bb965` fix(lib): keep per-endpoint message order in the vtask dispatcher (bug-1864) (2026-09-25) +- `aea34738` fix(scheduler): allocate every primary of a COMPOUND, not only the last (bug-1863) (2026-09-25) +- `b5d59253` fix(controller): stop a failed test from hanging the unit suite (bug-1429); mkstemp for upgrade temp file (bug-1861) (2026-09-25) +- `1f6f219d` fix(controller): resync_resolve_round never told scheduler RECONCILING cleared (bug-1841) (2026-09-22) +- `cd9ecb41` fix(controller): CtrlHelloRequest.key Data field crashed HA leader election (bug-1835) (2026-09-21) +- `ea76f477` fix(scheduler): percent-limit capacity reads maxmem/maxswap, not mem/swap (bug-1834) (2026-09-20) +- `9f54c575` feat(scheduler-sim-diagnostics): add fmt_limit_units() sibling (task 8.1) (2026-09-20) +- `eb23c158` feat(scheduler-sim-diagnostics): promote byte-unit formatting to shared lib (task 7) (2026-09-20) + +### schema +- `e4bb492a` fix(controller): checkpoints keep a job's exit code (bug-1867) (2026-09-26) +- `cd9ecb41` fix(controller): CtrlHelloRequest.key Data field crashed HA leader election (bug-1835) (2026-09-21) + +### specs +- `b63bb581` chore(buglog): point fix references at the re-signed commit hashes (2026-09-25) +- `4ba0f327` chore(scheduler-allocation): mark implementation complete (2026-09-25) +- `b0f2aea4` chore(gitea-sync): record first status-driven Gitea sync (2026-09-24) +- `6e0463e7` chore: persist OpenWolf state and libxce-alloc-preason-equality spec (2026-09-24) +- `668e3f68` chore: persist OpenWolf state, controller-peers-env-fallback spec, and scheduler backlog notes (2026-09-23) +- `4f94638a` fix(scheduler): route sim reconciliation's on_dispatch() through the allocator thread (bug-1837) (2026-09-21) +- `94115b00` fix(scheduler): sim mode force-dispatched recorded decisions past live capacity (bug-1836, bug-1838) (2026-09-21) +- `bf61f595` test(scheduler-sim-diagnostics): close cross-cutting gaps for Requirement 6 (task 10.2) (2026-09-20) +- `51255366` test(scheduler-sim-diagnostics): strengthen coincidentally-passing assertions (task 10.1) (2026-09-20) +- `70190107` fix(scheduler-sim-diagnostics): correct usage display's resource classification (task 9) (2026-09-20) +- `8477f677` feat(scheduler-sim-diagnostics): wire info limit to fmt_limit_units (task 8.2) (2026-09-20) +- `9f54c575` feat(scheduler-sim-diagnostics): add fmt_limit_units() sibling (task 8.1) (2026-09-20) +- `eb23c158` feat(scheduler-sim-diagnostics): promote byte-unit formatting to shared lib (task 7) (2026-09-20) + +### build +- `3cc2f6e3` fix(xce-test-multihost): deploy with a fixture config set that clears limits (bug-1857) (2026-09-24) +- `7982f285` feat(xceadmin): validate percent-based limit values are in [0.0, 1.0] (bug-1833) (2026-09-20) +- `a8fb7685` fix(config): night_mem_pct's percent value was 100x too large (bug-1832) (2026-09-20) + +### misc +- `ff4e2cb8` chore: gitea-sync --ids, sync recent bugs (#264-#286), refresh STATUS.md (2026-09-26) +- `3cc2f6e3` fix(xce-test-multihost): deploy with a fixture config set that clears limits (bug-1857) (2026-09-24) +- `e915f8de` fix(gitea-sync): survive live Gitea replies; point project memory at /buglog (2026-09-24) +- `19104f19` feat(buglog): status field, buglog skill, status-driven gitea-sync (2026-09-24) +- `5b891b50` fix(xce-test-ha): chaotic mid-round walcompare false committed divergence (bug-1853) (2026-09-24) +- `d9ff02cd` test(xce-test-ha): scheduler replay-parity gate in sequential/chaotic soaks (2026-09-24) +- `668e3f68` chore: persist OpenWolf state, controller-peers-env-fallback spec, and scheduler backlog notes (2026-09-23) +- `e592e921` test(xce-test-ha): add --worker-capacity-soak mode for bug-1841 regression (2026-09-22) +- `0a983a74` docs: add weekly report and change log for Sep 13-19, 2026 (2026-09-20) + ## Sep 13, 2026 - Sep 19, 2026 diff --git a/reports/sep20-sep26-2026.md b/reports/sep20-sep26-2026.md new file mode 100644 index 00000000..00117a71 --- /dev/null +++ b/reports/sep20-sep26-2026.md @@ -0,0 +1,90 @@ +# XCE Project Status — Sep 20 – Sep 26, 2026 + +> Note: the calendar-default window (Sep 14–Sep 19) is already covered by +> `sep13-sep19-2026.md`; this report covers the actual gap — Sun Sep 20 +> through Sat Sep 26, the last completed day before this report was generated. + +## TL;DR + +A bug-burn-down week driven by live evidence rather than spec work. Sunday closed out `scheduler-sim-diagnostics` Requirement 6 (human-readable limit units) and fixed a cluster of percent-limit bugs it surfaced. Monday–Thursday were a run of user-driven live scheduler replays and HA soaks: the replays found 11 scheduler/sim bugs (over-dispatch past live capacity, `--sim-verify` false positives, a recorder that silently truncated decisions, mid-round rejoin truncation), and the soaks found three controller SIGSEGVs (HA election, standby-endpoint handler, rejoin use-after-free). Thursday also rebuilt the bug log's bookkeeping: an explicit `status` field backfilled on all 1,193 entries, a `buglog` skill, and a status-driven `gitea-sync`. That resolves last report's buglog-integrity and Gitea-backlog threads. Friday cleared a backlog of scheduler COMPOUND/ALTER allocation bugs and closed the `scheduler-allocation` spec; Saturday made WAL failure facts and checkpoints field-complete (exit code and finish time) and hardened the worker's root-owned `/tmp` opens against planted symlinks. **41 new bugs logged (bug-1830 – bug-1870): 37 fixed, 2 cannot-reproduce, 2 still open**, plus 8 older bugs fixed. + +## Commits by day + +### Sun 09-20 (Sunday) — scheduler-sim-diagnostics Req 6 to done, percent-limit fallout +- **`eb23c158`..`bf61f595`** (6 commits) — tasks 7–10: promoted byte-unit formatting to the shared lib, added `fmt_limit_units()` and wired `info limit` to it, corrected the usage display's resource classification (task 9), then strengthened coincidentally-passing assertions and closed cross-cutting test gaps (10.1/10.2). +- **`0ce71254`, `a8fb7685`, `7982f285`, `ea76f477`** — the user's own retest of Req 6 found **bug-1831** (percent limits displayed as a raw fraction), **bug-1832** (`night_mem_pct` in `limits.yaml` was 100× too large), **bug-1833** (xceadmin now validates percent values are in [0.0, 1.0]) and **bug-1834** (percent-limit capacity read `mem`/`swap` instead of `maxmem`/`maxswap`). **bug-1830** was logged then corrected same-day (`07b5c989`) after a retest showed mem-limit usage does populate. +- **`0a983a74`** — last week's report and change log. + +### Mon 09-21 (Monday) — HA election crash + sim over-dispatch +- **`cd9ecb41`** — **bug-1835**: a live 3-node HA cluster SIGSEGV in leader election, caused by `CtrlHelloRequest.key`'s Data field. +- **`94115b00`, `4f94638a`** — **bug-1836/1838**: sim mode force-dispatched recorded decisions past live capacity (user-reported live over-dispatch during `xce_scheduler -i -s `); **bug-1837**: sim reconciliation's `on_dispatch()` now routes through the allocator thread (found by `/xce-audit-invariants scheduler`). + +### Tue 09-22 (Tuesday) — HA soak crash + RECONCILING never cleared +- **`e1da9f1e`** — **bug-1839**: the standby-endpoint error handler freed `ep->data` under a live vtask (controller SIGSEGV in the same soak run that produced bug-1840). +- **`1f6f219d`, `e592e921`** — **bug-1841**: `resync_resolve_round` never told the scheduler that RECONCILING had cleared (user-reported from a live replay). Added a `--worker-capacity-soak` mode to `xce-test-ha` as its regression gate. + +### Wed 09-23 (Wednesday) — `--sim-verify` correctness +- **`7901db57`, `5ee329b1`, `fcf119b4`** — replaying real captures turned up **bug-1842** (every DISPATCH decision false-flagged on wall-clock drift), **bug-1843** (the recorder silently truncated a round's decisions on realloc failure), **bug-1844/1845** (three more `--sim-verify` false positives) and **bug-1772** (snapshot `resreq_fp` gap). +- **`668e3f68`** — new spec `controller-peers-env-fallback` (design generated) and scheduler backlog notes. + +### Thu 09-24 (Thursday) — replay/soak fixes + buglog status overhaul +- **`77f047f2`, `a9feded8`, `ac033f47`** — **bug-1846** (host-scoped limit staged N times per dispatch; a mid-round rejoin config push truncated live rounds) and its follow-ups **bug-1847/1848/1849** (config pushes now recorded, an `hlimits` leak, a benign picker WARN quieted). +- **`ca4db13a`** — **bug-1851**: string resvals now own their bytes; a rejoin use-after-free was killing a newly promoted primary during a sequential HA soak. +- **`9c02184f`, `d9ff02cd`, `5b891b50`** — **bug-1852** (scheduler records events before the core applies them), a scheduler replay-parity gate added to the sequential/chaotic soaks, and **bug-1853** (a chaotic-soak `walcompare` false divergence — a harness bug, not a safety bug). +- **`19104f19`, `e915f8de`, `b0f2aea4`** — **buglog `status` field**: backfilled on all 1,193 entries, with the 85 whose text said not-fixed/pending checked against HEAD. Also a `buglog` skill (`scripts/buglog.py`), the `.claude/rules/buglog-status.md` convention, and a status-driven `gitea-sync` that fixes **bug-1855** (gitea-sync closed any issue with a non-empty `fix` text, including "NOT FIXED" ones). The first sync wrote Gitea milestone/issue IDs into 65 `spec.json` files. +- **`3cc2f6e3`, `9e9f2798`** — **bug-1857** (`xce-test-multihost` now deploys a fixture config that clears limits) and **bug-1858** (ASAN invalid free: release an interned queue resreq with dereference, not `free`). +- **`6e0463e7`** — new spec `libxce-alloc-preason-equality` (tasks generated, 0/8). + +### Fri 09-25 (Friday) — allocation backlog cleared, scheduler-allocation complete +- **`1ecd348f`, `b4e9a099`, `aea34738`, `601b245e`** — **bug-1769/1771** (ALTER allocation type confusion; NULL queue in the legacy fcfs hooks), **bug-1768** (slots/rusage checks for primaries nested in COMPOUND/ALTER), **bug-1863** (a COMPOUND with 2+ primaries kept only the last one's allocation) and **bug-1766** (a failed COMPOUND left a partial allocation behind). **`4ba0f327`** then marked `scheduler-allocation` implementation-complete (22/22). +- **`b5d59253`, `7c98c056`, `c29518b2`** — **bug-1429** (a failed test hung the whole unit suite), **bug-1861** (`mkstemp` for the config-upgrade temp file), **bug-1859** (a failover outage no longer expires a finished job's retained outcome) and **bug-1862** (the worker list is locked against vtask-thread readers; ASAN UAF in `xcecd_virtual`). +- **`0d3bb965`, `910b43cd`, `6b1862f8`, `663ea63c`** — **bug-1864** (the vtask dispatcher now keeps per-endpoint message order; standbys were NACKing in-order catch-up), **bug-1865** (never `close()` the primary channel's raw fd), **bug-1850** (libxce retries a NOT_READY controller in place instead of failing over — the root trigger of bug-1846's mid-round rejoins) and **bug-1854** (re-pushed resource definitions are not errors). All were soak-verified (`d87b78dc`). +- **`1ba643b8`** — **bug-1714** and **bug-1840** set to cannot-reproduce on current builds; **bug-1866** logged (LeakSanitizer: `remove_worker` never frees `launch_type`). + +### Sat 09-26 (Saturday) — persistence field-completeness + worker `/tmp` hardening +- **`6876e4f6`, `1d6c04c2`, `e4bb492a`** — `WAL_JOB_FAIL` now carries the exit code (**bug-1754**) and the worker-reported finish time (**bug-1747** FAIL half, via `record_job_fail_fact_at()`), and checkpoints keep `Job.exitInfo` in the capnp schema (**bug-1867**). These close the save/restore field-completeness gaps `persistence.md` calls out. +- **`63fd3d2a`** — **bug-1870**: checkpoints no longer punch a hole in the replicated log (the checkpoint marker was never replicated). Found because the force-snapshot soak could not submit enough jobs to trigger a checkpoint. +- **`7723a4f4`, `7864a3da`, `5df33e69`** — worker hardening: `fetchfile` only reads the job's own output file (**bug-1508**), and neither a job's output file (**bug-1868**) nor any other fixed root-owned `/tmp` name (**bug-1869**) follows a planted symlink. +- **`ff4e2cb8`, `21e72726`** — `gitea-sync --ids`; bugs synced to Gitea #264–#289. + +## Bugs opened/fixed this window + +- **41 new bugs** (bug-1830 – bug-1870; no ID collisions — the duplicate-ID census is now **0**): **37 fixed**, **2 cannot-reproduce** (bug-1830 — framing corrected by the user's retest; bug-1840 — scheduler SIGABRT, no ASAN repro, strongest candidate fixed via bug-1769), **2 open** (bug-1856 — an upstream OpenWolf duplicate-ID hook defect, mitigated locally by `openwolf.buglog.auto_detect=false`; bug-1866 — `xcecd_virtual` leak at exit). +- **8 older bugs fixed** in the window: bug-1429, bug-1508, bug-1747, bug-1754, bug-1766, bug-1768, bug-1769, bug-1771. bug-1714 moved to cannot-reproduce. +- **Carry-over status from last week's report**: + - Buglog integrity (the Sep 19 mass retag) — **resolved structurally**: `status` is now the single source of truth, and tags/`fix` text are explicitly not status signals. One loose end: **bug-1811** reads `fixed` with no `status_note`, although last week's report recorded its fix as reverted and reclassified as a design decision. + - Gitea sync backlog (32 bugs) — **resolved**: status-driven `gitea-sync` pushed #264–#289. (The `gitea` MCP server still fails to connect; the sync script works without it.) + - **bug-1714** → cannot-reproduce (Sep 25). **bug-1726** → cannot-reproduce (Sep 24 triage). **bug-1632** — still **open**, 4th window. **bug-1728** — still open at window close; fixed Sep 27 (`33c4f28c`, next window). + - **bug-1777/1793/1796/1797** — still **open**, now explicitly tracked as such; 4th window unowned. + - **bug-1824** — still open (deferred). +- Highest-severity fixes: **bug-1835/1839/1851** — three live HA-cluster controller SIGSEGVs, all fixed within a day of being found. **bug-1864/1865** — standby catch-up NACKs and a WAL fd closed out from under a standby at failover. **bug-1870** — a hole in the replicated log at every checkpoint. **bug-1868/1869/1508** — root-owned worker file opens following planted symlinks or reading arbitrary paths (security-relevant). + +## Spec status changes + +- **`scheduler-sim-diagnostics`** — Requirement 6 (human-readable units) was built and validated end to end on Sunday (tasks 7–10), so the whole spec is now functionally complete. `tasks.md` shows 17/19 because the parent headers for tasks 8 and 10 are unchecked while their subtasks are done (the same convention gap as last week). `spec.json` still reads `tasks-generated`. +- **`scheduler-allocation`** — marked `implementation-complete`, 22/22 (`4ba0f327`, Fri), after the COMPOUND/ALTER bug sweep. +- **`controller-peers-env-fallback`** — new; `design-generated`, not ready for implementation (Wed). +- **`libxce-alloc-preason-equality`** — new; `tasks-generated`, 0/8, `ready_for_implementation: false` (Thu). +- **Metadata lag — not addressed, now 4 specs**: `controller-status` (29/30, both deltas GO), `scheduler-sim-live-allocation` (14/19, `ready: false` though the spec shipped), `xce-test-cli-ux` (23/27, 3rd window) and now `scheduler-sim-diagnostics` all still read `tasks-generated`. +- 65 `spec.json` files gained a `gitea` block (milestone and issue IDs) from the first status-driven sync. This is bookkeeping, not phase changes. + +## Stats + +- **82 commits** — **56 touching at least one non-`.wolf` file**, **26 `.wolf`-only** (mostly `chore(buglog)` status updates plus OpenWolf syncs). +- **347 non-`.wolf` file changes**, **+14,670 / −1,200** (non-wolf headline; raw incl. `.wolf`: +20,285 / −5,774). +- Busiest areas by distinct files touched: `.kiro` (80 — 65 of them from the one Gitea-ID commit), `src/scheduler` (67), `src/controller` (29), `src/lib` (17), `src/worker` (16), `src/include` (11), `.claude` (10). +- By commit scope: `buglog` (24), `scheduler` (17), `controller` (10), `scheduler-sim-diagnostics` (6), `worker` (5), `xce-test-ha` (3). +- **1 spec completed** (`scheduler-allocation`), **1 requirement delta finished** (`scheduler-sim-diagnostics` Req 6), **2 new specs** started. +- **11 sessions** logged in `.wolf/memory.md` (Sep 21 ×2, Sep 22 ×2, Sep 23 ×1, Sep 24 ×5, Sep 26 ×1). The busiest logged day was **Sep 21** (156 actions). Sep 20 and Sep 25 have commits but no session headers. +- Commits landed on all 7 days. The peak day was **Fri 09-25** (25 commits, 13 of them fixes), followed by **Thu 09-24** (18) and **Sat 09-26** (17). +- Everything is on `scheduler-framework` / `origin/scheduler-framework`; 55 of the 82 are also on `for_test`. + +## Open threads / to-do heading into next session + +1. **HA / async-I/O group landed just after the window closed** (Sep 27 UTC, `7aac018c`..`c21ca0b7`, pushed): bug-1450/1451/1728/1433/1474/1469/1741, a bug-1870 follow-up (`load_snapshot` resumed at the checkpoint instead of checkpoint+1, `cb1415d7`) and opcode names for tracing. Next week's report covers these. The one new thread is **bug-1871** (investigating): an HA snapshot transfer stalls 3+ s mid-stream on a rejoining standby, seen in 2 of 4 force-snapshot runs; suspected edge-triggered epoll not re-signalling data buffered while the endpoint was blocked. +2. **Spec metadata sync, now 4 specs** — `controller-status`, `scheduler-sim-live-allocation`, `xce-test-cli-ux`, `scheduler-sim-diagnostics` all read `tasks-generated` despite being functionally complete. One batch phase-sync pass (plus flipping the unchecked parent headers) clears them all. +3. **Gitea is behind the buglog again**: bug-1450, 1451, 1744, 1860 and 1867 are closed locally but open/partial on Gitea, and bug-1847–1849, 1851–1853, 1870 and 1871 have no Gitea issue yet. Run `gitea-sync`. +4. **`xce_test` harness batch**: bug-1866 (`remove_worker` leaks `launch_type`) plus bug-1777/1793/1796/1797 (stale join maxswap/maxtmp defaults, workerlist ignoring the `hosts.yaml` override, stale `perror` errno, `cmd_qctrl` leak) — all small, all in `src/harness`/worker, 4th window unowned. +5. **bug-1632** (ASAN stack-use-after-return in `test_sim_verify.c`) — open for a 4th window. **bug-1824** (`repl_info.c` bounds check) is still deferred. Both need a fix-or-wontfix decision. +6. **bug-1811** — set its status to `wontfix` (or add a `status_note`) so it matches last week's record of a reverted fix reclassified as a design decision. +7. **New specs awaiting approval**: `controller-peers-env-fallback` (design review) and `libxce-alloc-preason-equality` (tasks review, `ready_for_implementation: false`).