14 KiB
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 guidedocs(scheduler-core):sync CLAUDE.md for core/driver/picker/sim/REPL architecturedocs(scheduler-core):commit accumulated brief/requirements/roadmap editsdocs(scheduler-core):backfill_Verifiednotes for tasks 2.1–2.6docs(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), fixedxcecd -hexiting before root/config checks (9ffb1d51, bug-1509 class), default logdir to/tmpwhen-lomitted (e959ee61), added-vverbose flag (0df1cf5f) - fix(xceadmin)/feat(controller):
OPCode_probeConfigTaghandler with Request-envelope reply, andprobe_configupdated 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 genericResource.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-implreopened component-failover-adoption: NO-GO (Aug 15, 13:10 UTC) — bug-1548 lives inside task 4.4's ownApiserverBackendBridgeboundary 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_gencounter toendpoint_t(src/include/netio.h,src/lib/xcectx.c), bumped on every successful transport reconnect;heartbeat.go'srunHeartbeat()replaced its failure-to-success transition detector with a per-tick generation comparison. New regression tests inheartbeat_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 viaGET /xce/v1/jobs - Decision flipped to GO (14:20 UTC)
- bug-1558 fixed:
make test-backendnow self-derivesCGO_CFLAGS/CGO_LDFLAGSviapkg-config - bug-1559 fixed:
xce-build.sh's scheduler case now runsmeson test --suite scheduler(all 41 registered targets, not just one binary by path) - New, separate uncommitted feature:
xceadmincluster-config dump/pretty-printer (build.py:dump_cluster_config+ formatters, ~236 new lines) and aparse_size_or_numberhelper inmapping.pyfor size-string threshold parsing, with new tests (test_cli.py,test_mapping.py, untrackedtest_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-implrun: 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
Commit the Phase 6 failover fix— Done (2026-08-15,d479b70). Verified via a fulllib asanrebuild (all libxce tests incl. the newtest_netio_reconnect_genpass) andmake test-backend(apiserver backend + auth suites pass) before committing. Scoped tonetio.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.mdwere 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.Commit or explicitly shelve the xceadmin config-dump feature— Done (2026-08-15,3afe3d5). Verified viaxce-build.sh xceadmin's full pinned out-of-tree install + pytest run (256 passed, 3 skipped) before committing. Scoped tobuild.py,cli.py,errors.py,mapping.py,hosts.schema.json,queues.schema.json(theSizeOrNumberschema type is tightly coupled tomapping.py's newparse_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 defaultresources.yamlnever declared, plusmem/tmpbyte-unit description fixes matchingnode_information.c's uncommitted change (worker-reportedmem/tmpnow actually returns bytes, not MB) andxcecd.c'smaxswap/maxtmpstub-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..wolf/dashboard-tokenis untracked, holds a live-looking token, and is not covered by.gitignore— add a gitignore rule before it lands in history via a broadgit add.- Triage the remaining uncommitted files not obviously tied to items 1, 2, or 10 (
deploy-ha.sh,xce-build.sh,controller/testsuite/test.c— thexce_testdetailed-help-text feature, unrelated to bug-1557's one-line default fix it happens to share a file with). - 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.
- bug-1508 (possible
handle_fetchfile()ownership/path-traversal gap) — flagged during a doc audit, never given a security-reviewer pass. - bug-1557 — one-line fix (
maxmemdefault should be64 * 1024 * 1024, not64), still open. - bug-1554 — swap/tmp-disk detection deferred by explicit user request; needs a design discussion when picked back up.
- Decide which of the three new brief-stage specs (component-rejoin-resync, worker-rejoin-resync, scheduler-sim-diagnostics) to move into
/kiro-spec-requirementsnext. - 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 what5bf123cc/e3b3ffaastarted (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.