myxce/reports/aug08-aug15-2026.md
Rongsong Shen 69f44c2fde
docs: add weekly status report (Aug 8-15, 2026)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-16 10:20:07 +00:00

111 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# XCE Project Status — Aug 08 – Aug 15, 2026
## TL;DR
**component-failover-adoption: implementation-complete and GO-validated — but not yet committed.** The week opened with scheduler-core documentation cleanup (carried over from last week), then a worker CLI/config cleanup pass, then the bulk of the week (Aug 11–13) was the 21-task component-failover-adoption spec: unifying worker/scheduler/apiserver's dual connect paths into one candidate-list pipeline, adding rejoin-on-failover for all three components, and an apiserver backend-health circuit breaker. Live E2E validation during that work found two real production bugs (bug-1548/bug-1549: apiserver never rejoined a new primary during an idle/heartbeat-only failover, so job pushes silently stopped reaching it). `/kiro-validate-impl` caught this as an in-scope gap and returned **NO-GO** on Aug 15 at 13:10 UTC; a same-day Phase 6 remediation (a monotonic `reconnect_gen` counter) fixed it, live-reverified, and the decision flipped to **GO** at 14:20 UTC. That fix, plus a new `xceadmin` cluster-config dump feature and a batch of build-tooling fixes, are sitting validated-but-uncommitted in the working tree as of end of week — 57 modified/untracked files, no commits since Aug 13.
## Commits by day
### Aug 08 (Sat) — scheduler-core documentation cleanup (carried over from prior week)
5 commits, docs-only:
- `docs:` add scheduler recording/simulation/REPL to deployment guide
- `docs(scheduler-core):` sync CLAUDE.md for core/driver/picker/sim/REPL architecture
- `docs(scheduler-core):` commit accumulated brief/requirements/roadmap edits
- `docs(scheduler-core):` backfill `_Verified` notes for tasks 2.1–2.6
- `docs(scheduler-core):` commit design.md/research.md, sync design.md with as-built code
### Aug 09 (Sun) — no commits
### Aug 10 (Mon) — worker CLI/config cleanup + probeConfigTag fix
11 commits:
- **Worker cleanup:** removed the config-file mechanism and deprecated CLI flags entirely (`5e4baa27`, `f0f46f87`, `b3124767`), fixed `xcecd -h` exiting before root/config checks (`9ffb1d51`, **bug-1509** class), default logdir to `/tmp` when `-l` omitted (`e959ee61`), added `-v` verbose flag (`0df1cf5f`)
- **fix(xceadmin)/feat(controller):** `OPCode_probeConfigTag` handler with Request-envelope reply, and `probe_config` updated to match (`90d7dd82`, `b00e97ff` — **bug-1506, bug-1507**)
- `feat(scheduler):` working default record-dir, improved REPL output, job ID formatting (`c705cada`)
### Aug 11 (Tue) — component-failover-adoption: foundation + worker + scheduler connect unification
11 commits — Task groups 1–3 begin:
- **Group 1 (Foundation):** reconciled `N_MAX_MASTERS`/`MAX_HA_CANDIDATES` (`fe8b4b86`), added the candidate-list→client-config conversion helper (`210faa2b`)
- **Group 2 (Worker):** unified worker's dual connect paths into the single pipeline (`ce9f734a`), fixed startup ordering + added rejoin retry-on-failure (`331fa024`), validated thread isolation and fixed rejoin bugs found by live E2E (`619b119e`)
- **Group 3 (Scheduler):** unified scheduler's dual connect paths (`a9f283dc`), added decision-publish retry-until-success-or-shutdown (`7c260e0c`), validated backpressure + fixed candidate-name diagnostics (`b7df8d60`), added decision-redelivery queue coverage (`d383d043`)
### Aug 12 (Wed) — component-failover-adoption: apiserver connect unification + rejoin + circuit breaker
7 commits — Task group 4:
- Routed apiserver's candidate parsing through the real C parser (`8b1e13a5`)
- Unified apiserver's dual connect paths — found and fixed a genuine use-after-free on `ctx->conf->masters[i]` during failover rotation (`e6359039`, **bug-1532**)
- Added apiserver's rejoin logic with correctly-placed cgo registration (`2a205291`)
- Wired rejoin to trigger from the idle-period heartbeat path (`ecf5eddc`)
- Added the backend-health circuit breaker (`c8325e75`)
- Closed an apiserver concurrency coverage gap (`79273a7f`)
- Group 5 begins: full-cluster E2E reconnect-after-failover test passes (`6cb8f22b`) — **this run first surfaced bug-1548/bug-1549** (apiserver silently fails to rejoin on an idle/heartbeat-only failover)
### Aug 13 (Thu) — component-failover-adoption closes; resource/config bugfixes; buglog integrity hardening
15 commits (6 feature/fix, 9 wolf-buglog checkpoints):
- Task 5.2 doubly-confirms bug-1548 in an isolated heartbeat-only scenario (`04d41d29`); task 5.3 validates the circuit breaker live (`51589b68`); task 5.4 closes the spec on a full regression pass (`d170623b`) — bug-1548/1549 were (incorrectly, see below) treated as out-of-scope follow-up items at this point
- `chore(wolf):` buglog.json integrity guard, dedupe rule, auto-checkpoint hook (`ba4e5fd2`)
- `fix(controller,xceadmin):` zero-slot scheduling block, misleading resval logs, byte-unit display (`e3b3ffaa` — **bug-1555, bug-1556**)
- `refactor(controller,xceadmin):` dropped generic `Resource.unit`, hardcoded bytes for maxmem (`5bf123cc`)
### Aug 14–15 (Fri–Sat) — validation reopened, Phase 6 remediation, tooling fixes — all uncommitted
No commits landed, but substantial validated work sits in the working tree:
- `/kiro-validate-impl` reopened component-failover-adoption: **NO-GO** (Aug 15, 13:10 UTC) — bug-1548 lives inside task 4.4's own `ApiserverBackendBridge` boundary against an already-existing acceptance criterion, so it doesn't qualify as legitimately out-of-scope
- **Phase 6 remediation** (tasks 6.1/6.2): added a monotonic `reconnect_gen` counter to `endpoint_t` (`src/include/netio.h`, `src/lib/xcectx.c`), bumped on every successful transport reconnect; `heartbeat.go`'s `runHeartbeat()` replaced its failure-to-success transition detector with a per-tick generation comparison. New regression tests in `heartbeat_test.go`/`heartbeat_rejoin_test.go`. Live E2E re-run of the exact task-5.2 scenario passed: rejoin fired 22s after a primary kill (12s after election) with zero write traffic in the preceding 5.5 minutes; a post-recovery job submit correctly appeared via `GET /xce/v1/jobs`
- Decision flipped to **GO** (14:20 UTC)
- **bug-1558** fixed: `make test-backend` now self-derives `CGO_CFLAGS`/`CGO_LDFLAGS` via `pkg-config`
- **bug-1559** fixed: `xce-build.sh`'s scheduler case now runs `meson test --suite scheduler` (all 41 registered targets, not just one binary by path)
- **New, separate uncommitted feature:** `xceadmin` cluster-config dump/pretty-printer (`build.py`: `dump_cluster_config` + formatters, ~236 new lines) and a `parse_size_or_number` helper in `mapping.py` for size-string threshold parsing, with new tests (`test_cli.py`, `test_mapping.py`, untracked `test_config_dump.py`)
## Bugs opened/fixed this window
Named/significant bugs (55 total opened this window, `bug-1506`–`bug-1560`; most of the unlisted ones are terse review-catches — "significant refactor of X", "incorrect value in code" — logged during component-failover-adoption's two-round review process):
| Bug | Status | Summary |
|---|---|---|
| bug-1506, bug-1507 | Fixed (`90d7dd82`, `b00e97ff`) | `probeConfigTag` missing Request-envelope handling; SIGABRT in REPL breakpoint inspection |
| bug-1508 | **Open** | `handle_fetchfile()` — possible job-ownership/path-traversal gap found during doc audit; flagged, needs a security-reviewer pass |
| bug-1509 | Fixed | `extralib` flake dependency removed; ported trivial linked-list code local to autoscaler |
| bug-1514, bug-1515 | Fixed | design.md/requirements.md defects in component-failover-adoption's scheduler-backpressure description, found by `/kiro-validate-design` and a deep re-review |
| bug-1519 | **Open** | AddressSanitizer "joining already joined thread" abort under `unshare -r`; worked around, not root-caused |
| bug-1532 | Fixed (`e6359039`) | apiserver `tryConnect()` use-after-free on `ctx->conf->masters[i]` during failover rotation |
| bug-1542 | Fixed | Illegal `import "C"` in a `_test.go` file; exposed the needed constant via a plain-Go package var instead |
| **bug-1548** | Fixed (uncommitted, Phase 6) | apiserver never rejoined a new primary on an idle/heartbeat-only failover — root cause: `XCECLI_FF_CALL`'s silent inline reconnect was invisible to the old failure→success transition detector |
| **bug-1549** | Fixed (uncommitted, Phase 6) | Downstream symptom of bug-1548 — job pushes never reached apiserver's local store after failover |
| bug-1553 | **Open** | `controller_unit_test` segfaults intermittently (~1 in 3 runs); crash site not yet isolated |
| bug-1554 | **Open, deferred by user** | `maxswap`/`maxtmp` report hardcoded stub values instead of real hardware detection |
| bug-1555, bug-1556 | Fixed (`e3b3ffaa`) | Misleading `update_resval` error logs; zero-slot scheduling block on the documented `hosts.yaml` auto-detect default |
| bug-1557 | **Open** | `xce_test worker join` defaults `maxmem=64` (bytes, not MB) |
| bug-1558, bug-1559 | Fixed (uncommitted) | `make test-backend` CGO flags now self-derived via `pkg-config`; `xce-build.sh` scheduler suite now runs all 41 test targets |
| bug-1560 | **Open, low priority** | `test_recordstart_symlink_escape_replies_error` fails under sandbox root — confirmed pre-existing, environment-specific, not a regression |
## Spec status changes
- **component-failover-adoption** — tasks 1.1–5.4 (21 tasks) implemented and initially marked complete (Aug 13). Reopened same week by its own `/kiro-validate-impl` run: **NO-GO** (Aug 15, 13:10 UTC) → Phase 6 remediation (2 tasks) → **GO** (Aug 15, 14:20 UTC). **Implementation and validation are done; the fix itself is not yet committed to git.**
- **scheduler-core** — carried into this window only for Aug 08's documentation cleanup; no further status change.
- Three new specs created this week, all still at brief/pre-requirements stage, not yet started: **component-rejoin-resync** and **worker-rejoin-resync** (both born from this week's bug-1548/1549 investigation — full-state resend cost on rejoin), and **scheduler-sim-diagnostics** (limit/pend-reason visibility in the REPL; not yet even `spec.json`-initialized).
## Stats
- **49 commits** in the window (39 feature/fix/docs, 10 wolf-infra/checkpoint)
- **~124 files changed** across the week's commits (109,317 insertions / 18,170 deletions, dominated by component-failover-adoption)
- **55 bugs opened** (bug-1506–bug-1560), **48 fixed**, **7 still open** (bug-1508, 1519, 1553, 1554, 1557, 1560, plus bug-1548/1549 fixed-but-uncommitted)
- **1 spec closed and reopened same week**, remediated, now GO
- **3 new specs** opened at brief stage
- **0 commits on Aug 14–15** despite validated GO work landing — 57 files (modified + untracked) sitting uncommitted at week's end
## Open threads / to-do heading into next session
1. ~~**Commit the Phase 6 failover fix**~~ — **Done (2026-08-15, `d479b70`).** Verified via a full `lib asan` rebuild (all libxce tests incl. the new `test_netio_reconnect_gen` pass) and `make test-backend` (apiserver backend + auth suites pass) before committing. Scoped to `netio.h`, `xcectx.c`, `lib/meson.build`, `lib/testsuite/test.c`, `lib/testsuite/test_netio_reconnect_gen.c`, `heartbeat.go`, `clib.go`, `heartbeat_test.go`, `heartbeat_rejoin_test.go`, `spec.json`, `tasks.md`. Note: `design.md`/`requirements.md`/`research.md` were deliberately left out — they've been stale since the spec's very first commit (`4ad31d77`, never updated across all 21+2 tasks), so syncing them is a separate, broader doc-catch-up task, not part of the Phase 6 diff.
2. ~~**Commit or explicitly shelve the xceadmin config-dump feature**~~ — **Done (2026-08-15, `3afe3d5`).** Verified via `xce-build.sh xceadmin`'s full pinned out-of-tree install + pytest run (256 passed, 3 skipped) before committing. Scoped to `build.py`, `cli.py`, `errors.py`, `mapping.py`, `hosts.schema.json`, `queues.schema.json` (the `SizeOrNumber` schema type is tightly coupled to `mapping.py`'s new `parse_size_or_number`, so it had to travel with it), plus the three test files. **New discovery while scoping this:** `resources.yaml`'s diff also contains unrelated changes — new resource catalog entries (`r15m`, `ut`, `pg`, `ls`, `it`, `swp`, `io`) that the worker (`resource_sync.c`) already registers but the shipped default `resources.yaml` never declared, plus `mem`/`tmp` byte-unit description fixes matching `node_information.c`'s uncommitted change (worker-reported `mem`/`tmp` now actually returns bytes, not MB) and `xcecd.c`'s `maxswap`/`maxtmp` stub-value unit fix (bug-1554's stub, now byte-scaled). These three files (`resources.yaml`, `worker/src/node_information.c`, `worker/src/xcecd.c`) were deliberately left out of both commits so far — added as new item 10 below.
3. **`.wolf/dashboard-token`** is untracked, holds a live-looking token, and is not covered by `.gitignore` — add a gitignore rule before it lands in history via a broad `git add`.
4. **Triage the remaining uncommitted files** not obviously tied to items 1, 2, or 10 (`deploy-ha.sh`, `xce-build.sh`, `controller/testsuite/test.c` — the `xce_test` detailed-help-text feature, unrelated to bug-1557's one-line default fix it happens to share a file with).
5. **bug-1553** (intermittent controller test segfault) is the most concerning open item — a real memory-safety bug in the shared test binary, unisolated. Needs a bisect/gdb session.
6. **bug-1508** (possible `handle_fetchfile()` ownership/path-traversal gap) — flagged during a doc audit, never given a security-reviewer pass.
7. **bug-1557** — one-line fix (`maxmem` default should be `64 * 1024 * 1024`, not `64`), still open.
8. **bug-1554** — swap/tmp-disk detection deferred by explicit user request; needs a design discussion when picked back up.
9. Decide which of the three new brief-stage specs (component-rejoin-resync, worker-rejoin-resync, scheduler-sim-diagnostics) to move into `/kiro-spec-requirements` next.
10. **New (found while scoping item 2):** commit the worker-side byte-unit completion + resource-catalog sync (`resources.yaml`, `src/worker/src/node_information.c`, `src/worker/src/xcecd.c`) — finishes what `5bf123cc`/`e3b3ffaa` started (mem/tmp now genuinely report bytes, not just documented as bytes) and adds the 7 missing built-in resource entries (`r15m`, `ut`, `pg`, `ls`, `it`, `swp`, `io`) the worker already reports but the catalog never declared. Worth its own scoped commit with a build+test pass first, same as items 1 and 2.