chore(wolf): sync anatomy/cerebrum/memory/hooks/token-ledger bookkeeping
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AgYRU3zDTqNGV5Jk8aiKLg
This commit is contained in:
parent
f7b732a300
commit
b2a8fe4ce9
5 changed files with 4226 additions and 41 deletions
|
|
@ -1,7 +1,7 @@
|
|||
# anatomy.md
|
||||
|
||||
> Auto-maintained by OpenWolf. Last scanned: 2026-08-25T09:38:59.283Z
|
||||
> Files: 735 tracked | Anatomy hits: 0 | Misses: 0
|
||||
> Auto-maintained by OpenWolf. Last scanned: 2026-08-25T10:38:09.375Z
|
||||
> Files: 736 tracked | Anatomy hits: 0 | Misses: 0
|
||||
|
||||
## ../../../../../../tmp/
|
||||
|
||||
|
|
@ -957,16 +957,16 @@
|
|||
- `ha_convergence.c` — Declares char (~8389 tok)
|
||||
- `ha.c` — define _GNU_SOURCE (~126128 tok)
|
||||
- `ha.h` — ifndef HA_H (~34172 tok)
|
||||
- `job.c` — include <assert.h>; bug-1689: adds restore_job_finish_state(), record_job_finish_fact() now calls persist_submit_job_finish_fact() carrying receipt-time finish_time+exit_code (~35694 tok)
|
||||
- `job.c` — include <assert.h> (~36630 tok)
|
||||
- `join.c` — include "config.h" (~2994 tok)
|
||||
- `main.c` — build-time-versioning task 3.2 (argp_program_version runtime-composed into static `version_buf[128]`, "My name is..." startup INFO reads that buffer) PLUS dirty-content-fingerprint task 3.2 (2026-08-21): new static `version_display_buf[128]` composed via `xce_compose_version_ex()` (adds `STR(VERSION_DIRTY_FINGERPRINT)`) feeds `argp_program_version` instead; `version_buf`'s composition + the startup INFO log are byte-identical/untouched (Req 3.2). Live-verified: `--version` -> `7ebcba6d-cdb7cc7d`, startup log -> `7ebcba6d-dirty` (~5346 tok)
|
||||
- `meson.build` (~3488 tok)
|
||||
- `meson.build` (~3499 tok)
|
||||
- `misc.c` — include <errno.h> (~1359 tok)
|
||||
- `myapp.c` — define _GNU_SOURCE (~6287 tok)
|
||||
- `myconf.c` — define _GNU_SOURCE (~1180 tok)
|
||||
- `opget.c` — include "config.h" (~1730 tok)
|
||||
- `opupd.c` — include "config.h" (~714 tok)
|
||||
- `persist.c` — define _GNU_SOURCE; bug-1689: adds decode_jobexitinfo()/persist_submit_job_finish_fact(), splits WAL_JOB_FINISH into its own apply_wal_entry() case + extends apply_committed_entry()'s inline branch to decode wire finish_time/exit_code (~97521 tok)
|
||||
- `persist.c` — define _GNU_SOURCE (~98160 tok)
|
||||
- `queue.c` — include <errno.h> (~1554 tok)
|
||||
- `repl.c` — include <assert.h> (~9240 tok)
|
||||
- `reply.c` — include "config.h" (~590 tok)
|
||||
|
|
@ -989,7 +989,7 @@
|
|||
- `clean_failover_preservation.sh` — clean_failover_preservation.sh — ha-term-safety task 5.2 live integration test. (~5327 tok)
|
||||
- `configcompare.c` — define _GNU_SOURCE (~2273 tok)
|
||||
- `configcompare.h` — pragma once (~1186 tok)
|
||||
- `controller_test.c` — include <argp.h> (~2395 tok)
|
||||
- `controller_test.c` — include <argp.h> (~2417 tok)
|
||||
- `ctrlstatus_fmt.h` — ifndef _CTRLSTATUS_FMT_H_ (~631 tok)
|
||||
- `resval_typeresolve.c` — resval_resolve_type(): resource-name -> Value_u_which table lookup (14 known names unchanged) + task 2.1's numeric-default fallback / `-t` type_override for unrecognized names (~499 tok)
|
||||
- `resval_typeresolve.h` — declares resval_resolve_type()/RESVAL_TYPE_UNKNOWN; task 2.1 fallback now implemented (~676 tok)
|
||||
|
|
@ -1033,6 +1033,7 @@
|
|||
- `test_term_safety_adapter.c` — define _GNU_SOURCE (~29920 tok)
|
||||
- `test_wal_job_dispatch_fact.c` — Declares in (~5222 tok)
|
||||
- `test_wal_job_finish_fact.c` — Declares as (~6904 tok)
|
||||
- `test_wal_job_rusage_fact.c` — bug-1690 regression suite: WAL_JOB_RUSAGE restart-drop fix for job.run_usage. 8 tests covering both apply seams, backward compat, restart replay via the real persist_job_hook_fun(), and (key test) a merge-safety proof using a real makeString()'d host_name to confirm the fix never frees a live/xstring-backed pointer (~9250 tok)
|
||||
- `test_wal_job_start_fact.c` — Declares as (~6378 tok)
|
||||
- `test.c` — include <argp.h>. jobid-%lu-to-fmt_jobid task (2026-08-21): all 10 remaining raw `%lu` jobid printfs (cmd_jobkill, cmd_jobckpt, run_task_local, handle_notify x3, handle_runtasks x2, check_run_jobs, check_run_tasks) converted to `fmt_jobid(buf, sizeof(buf) - 1, ...)` + `%s`, matching this file's existing convention (buf/jobidStr/wantStr precedents at ~1559/1980/2405-2422); no new #include needed. Loop-scoped buffers repopulated fresh per iteration where the jobid varies (check_run_jobs, check_run_tasks, handle_notify's per-case union fields); reused a single populate when the jobid is loop-invariant (handle_runtasks: same runmsg->jobid across the task loop) (~40184 tok)
|
||||
|
||||
|
|
@ -1101,7 +1102,7 @@
|
|||
|
||||
- `persist.h` — pragma once; bug-1689: declares persist_submit_job_finish_fact() (~26004 tok)
|
||||
- `utils.h` — dirty-content-fingerprint task 3.1: new `xce_compose_version_ex()` extern decl (--version-only sibling of xce_compose_version(), adds optional `dirty_fingerprint` param); startup-log call sites keep calling the untouched xce_compose_version() (~2720 tok)
|
||||
- `wal_types.h` — pragma once; bug-1689: documents WAL_JOB_FINISH's new native trailing payload (finish_time+exit_code) (~3178 tok)
|
||||
- `wal_types.h` — pragma once (~3360 tok)
|
||||
|
||||
## src/include/xce/
|
||||
|
||||
|
|
@ -1210,7 +1211,7 @@
|
|||
|
||||
## src/schema/
|
||||
|
||||
- `controller.capnp` — Declares OPCode (~14664 tok)
|
||||
- `controller.capnp` — Declares OPCode (~15094 tok)
|
||||
|
||||
## src/tools/
|
||||
|
||||
|
|
|
|||
|
|
@ -168,6 +168,7 @@
|
|||
- `resource-value-verification` task 7.1 round 2 (2026-08-18, bug-1582, round-1 REJECTED -- see Do-Not-Repeat entry for the mechanism): `main()`'s OWN record-building loop (feeding `aggregate_verdict()`, distinct from `aggregate_verdict()`/`build_verdict_record()` themselves, which were and remain correct) had the actual bug -- `sched_ok`/`api_ok` derived from `*_OBSERVED` array-key existence instead of the `*_CHECK_RESULTS` classification strings, masking every genuine scheduler/apiserver UNREACHABLE as MISMATCH. Fixed by switching to a leading-`UNREACHABLE:` check on `SCHEDULER_CHECK_RESULTS`/`APISERVER_CHECK_RESULTS` (the controller layer's `ctrl_ok` derivation from `CONTROLLER_OBSERVED` array-key existence was independently confirmed fine and left untouched -- that layer has no separate UNREACHABLE concept). Also extracted the loop into a standalone `build_verdict_records_from_tsv()` function (populates global `VERDICT_RECORDS`) specifically so a synthetic test can exercise `main()`'s actual data-marshaling code, not just `aggregate_verdict()` called with hand-built records -- the round-1 gap was that no test exercised the code that BUILDS records from the `*_OBSERVED`/`*_CHECK_RESULTS` globals, only the pure aggregation function itself. Live-reproduced by killing the scheduler process right after `confirm_deployment_up()` returns (before `inject_resources()`/`query_scheduler_resvals()` ever run) -- deterministic, no race window, and confirmed the controller/apiserver layers are unaffected by an isolated scheduler kill (each layer's check is independent).
|
||||
- `build-time-versioning` task 4.2 (2026-08-20): `apiserver/meson.build`/`xcecli/meson.build`'s existing `CURRENT_SOURCE_DIR="@CURRENT_SOURCE_DIR@"`/`BUILD_ROOT="@BUILD_ROOT@"` command-array entries (passed to `env_program = find_program('env')`, no shell involved) put literal double-quote characters INTO the env var value seen by the child process — meson's `command:` list is exec'd directly, so shell-style quoting around a placeholder is not stripped by anything; `go_build`'s own `fix_input_envs()` explicitly `sed -e 's@"@@g'`s those two vars to compensate, proving this empirically. When adding new KEY=VALUE entries to this SAME mechanism (`XCE_GIT_COMMIT`/`XCE_BUILD_TIME`, sourced from `get_option('commit_id')`/`get_option('build_time')`, task 1's options — no meson placeholder substitution needed since they're already resolved strings), deliberately did NOT wrap them in quotes (`'XCE_GIT_COMMIT=' + get_option('commit_id')`, not `'XCE_GIT_COMMIT="..."'`) — `go_build`'s task-4.1 code reads `$XCE_GIT_COMMIT`/`$XCE_BUILD_TIME` directly with no quote-stripping, so quoting these would have embedded literal `"` characters into the linked `-X main.GitCommit=...` value. Live-verified via `DEBUG=1` (`go_build`'s own `set -x` trace mode) meson-driven build: clean values (`18ae0cc3`, ISO8601 timestamp) reached `go build -ldflags`, and `xce-build.sh apiserver`/`xcecli` end-to-end produced binaries with `-X main.GitCommit=<hash>-dirty -X main.BuildTime=<ts>` in their `go version -m` build info, no stray quotes. General lesson: "mirror the existing mechanism" doesn't mean copy-paste every byte of an existing established pattern — check whether the DOWNSTREAM consumer (here, `go_build`) actually expects/strips the same decoration before reusing it verbatim.
|
||||
- `resource-value-verification` spec (2026-08-17): verify scheduler/apiserver resource-value propagation via a one-line trace/debug log at each layer's point of application (`core_events.c`'s RESVALS_DELTA case; apiserver's `OnResourceLocationUpdated`), grepped live, instead of record+replay+REPL or a REST/CLI query — matches how bug-1568/1569 were actually root-caused, and is a stronger read of "the scheduler's own resource state" than a replayed reconstruction. Trade-off accepted: doesn't exercise the real query/REST path, only storage correctness. Load-bearing gotcha: `TRACE`=`tlog_debug3` needs `-vvv`; apiserver's `logger.Debug` needs `logger.yaml`'s `logging.level: debug` — both silently no-op otherwise, producing false timeouts. Also: extend `xce-deploy-ha`'s `deploy-ha.sh` (opt-in, conditional-on-binary-present, mirroring its existing worker/scheduler pattern) plus a generated `start-all.sh`, rather than building a parallel standalone deploy script — avoids re-implementing the same deploy conventions twice.
|
||||
- bug-1690 (2026-08-25, WAL_JOB_RUSAGE/job.run_usage restart-drop fix): established a NEW apply-seam pattern, distinct from bug-1678/1687/1689's "decode, free-and-replace" shape — **merge, don't replace**, whenever the field being restored can also be the job's LIVE structure (a fact type whose live-mutation call site runs synchronously BEFORE persisting, the same "mutate-then-persist" shape DISPATCH/START/FINISH/RUSAGE all share) and any of that structure's nested pointers can originate from something other than a plain `malloc()` (here: `makeString()`'s xstring pool). `merge_job_runusage()` (job.c) is the reference implementation: overwrite scalar fields unconditionally in place, match-and-update existing nested entries by key (never freeing their pointers), only adopt genuinely-new nested entries by ownership transfer. Also established: for a fact type whose LIVE mutation almost never itself changes `job.state` (a rusage report keeps reporting the same RUN state), gate the type-specific field adoption on nothing narrower than "trailing bytes present" — do NOT reuse START/FINISH/DISPATCH's `result==JOB_TRANSITION_APPLIED` gate, since that would make the new field's adoption dead code for the realistic repeated-report case. Both of these are genuine deviations from the just-established sibling-bug precedent, found by reading the real code (`update_host_runusage()`, `persist_apply_pump_run()`'s doc comment, `apply_job_update_transition()`'s guard) rather than pattern-matching the fix shape — worth treating "mirror the precedent" instructions as a strong prior to verify against the actual code for THIS field, not a template to copy blindly, especially around allocator provenance and state-transition gating.
|
||||
- **This project's existing home for a standalone, CLI-runnable regression/integration check that needs a REAL build or live deployment (not a meson `test()`) is `src/tools/test-<topic>.sh`** — `test-commit-durability.sh` and `test-heartbeat-tolerance.sh` are the established precedent (shared header-comment style documenting the invariant under test + its spec, `green()`/`red()`/`yellow()` colour helpers, a `pass()`/`fail()` counter convention). Followed this for `build-time-versioning` task 6.1's `test-build-version-regression.sh` rather than inventing a meson test() (two full `rm -rf`+`meson setup`+compile cycles per profile is far too expensive for `meson test`) or a new top-level test-framework directory. When a task explicitly says "use judgment / follow existing convention if the design doc doesn't pin down an exact path," check `src/tools/` first for this class of check before reaching for `testsuite/` or inventing something new.
|
||||
- **`xce-build.sh` has `set -euo pipefail`, and every profile's `RUN_TESTS` block (asan only, currently) runs the FULL component meson test suite unconditionally as the LAST step of the invocation — so ANY single failing test in that suite (even a pre-existing, unrelated one, e.g. bug-1560's scheduler symlink-escape flake) makes the WHOLE `xce-build.sh <component> <profile> ...` invocation exit non-zero, even though `meson compile` already fully succeeded and the real binary exists on disk.** A caller/wrapper script that treats a non-zero `xce-build.sh` exit as "the build failed, binary unusable" will incorrectly skip/abort real post-build work (e.g. checking `--version` output, as `test-build-version-regression.sh` needs to). Fix pattern: never bare-call it under your own `set -e` — capture the exit code via `cmd || rc=$?` (NOT `if cmd; then ...; fi` with no else, which loses the real nonzero code — POSIX defines an `if` with a false condition and no `else` as exiting 0, discovered live re-deriving this), print a WARNING distinguishing "compile succeeded, only the bundled test run failed" from a genuine failure, and let a SEPARATE binary-existence check be the actual pass/fail signal for "did the build produce something real."- **A `sched_account_jobs()`-shaped no-op stub already present in SOME white-box test files that `#include "../src/sim_loop.c"` directly does NOT mean it's present in ALL of them — adding a genuinely NEW production call inside a white-box-#include'd file breaks every sibling TU that lacks the matching stub, and the only reliable way to find them all is to build and read the linker errors, not to grep-and-guess.** scheduler-sim-decision-parity task 2.1 (2026-08-22): `sim_loop.c`'s round boundary gained a real call to `sched_account_jobs(&(sim->core))` (previously never called there at all, bug-1613). `test_sim_equivalence.c`/`test_sim_resource_contention.c` (task 1.2-era files) already carried a no-op stub anticipating this; 8 OTHER sibling files that also `#include "../src/sim_loop.c"` (`test_sim_event_loop.c`, `test_sim_verify.c`, `test_sim_alt_events.c`, `test_sim_record_output.c`, `test_repl_breakpoints_inspection.c`, `test_repl_snapshot_params.c`, `test_repl_execution_control.c`, `test_repl_equivalence.c`) did NOT, since none of them ever needed the symbol before. `grep -rl '#include "../src/sim_loop.c"' testsuite/` first, then just build — the linker's `undefined reference to sched_account_jobs` errors enumerated the exact fix list precisely, faster and more reliably than reasoning about it from source alone.
|
||||
- **`xce_request()`/every `xce_*_req()` wrapper (`src/lib/request.c`) is a genuinely non-blocking, fire-and-forget send — it capnp-encodes the request and `endpoint_enq()`s it onto `ep->outq`, then returns; it never waits for a reply itself** (the synchronous `xceapi.c` wrappers like `xce_hello`/`xce_jobsubmit` layer a separate `cbuf_timedget()` wait on top, but the raw `xce_*_req()` call a controller-side handler like `dispatch_a_job_()` makes does not). `endpoint_enq()` (`netio.c`) succeeds unconditionally against a **zeroed `endpoint_t` with `ep->iomgr == NULL`**: `dataq_enq()` has no failure path at all, and `endpoint_update_epoll()` is a pure no-op whenever `ep->iomgr == NULL` (skips the whole `iomgr_update_poll` branch). Net: to make a controller-side `xce_*_req()` call "succeed" in a unit test, you do NOT need a live peer, a synthetic reply thread, or a socketpair — a `static endpoint_t` (or embedded field) zeroed with `.fd = -1` and left with no `iomgr` is sufficient, and packets just accumulate on `ep->outq` for the test to `endpoint_deq()`/`free_packet()` afterward. This exact pattern is already established/proven live by `test_commit_barrier_reply.c`'s `g_wkr_disp_ep`/`cbrp_arrange_jobdispatch()` fixture (its own file header even documents it: "a zeroed static endpoint_t with no iomgr... packets stay queued") — reused directly for `scheduler-dispatch-commit` task 3.1's `test_dispatch_commit.c` success-path tests, no mocking/round-trip machinery needed.
|
||||
|
|
@ -179,3 +180,5 @@
|
|||
- **`dispatch_a_job_()`'s `key_find(c->workermgr, ...)` for a genuinely UNREGISTERED worker key returns `rc>=0` with `w` left NULL (hits `XCE_DISPATCH_FAIL_SITE_WORKER_NULL`), not `rc<0` (`XCE_DISPATCH_FAIL_SITE_WORKER_LOOKUP`)** — confirmed empirically (task 3.3), matching `test_dispatch_commit.c`'s own prior comment. A genuine `key_find()` internal failure (rc<0, the WORKER_LOOKUP site) has no known black-box trigger from a test without reaching into librtti's own (external, opaque) internals — `test_dispatch_fail_retry.c`'s `test_worker_notfound_resolves_retryable` deliberately documents that it covers "whichever of WORKER_LOOKUP/WORKER_NULL the runtime takes" rather than claiming to isolate one, since both sites share the exact same classify/resolve code shape and the test's assertions hold for either.
|
||||
- **A real, unregistered-with-its-iomgr socket fd (`socket(AF_INET,...)` + a live `iomgr_t` via `iomgr_init()`, `ssl_handshake_done=1`, `flags=0`, never `EPOLL_CTL_ADD`'d) is a reusable, deterministic technique for forcing an `xce_*_req()` call to fail** — `EPOLL_CTL_MOD` on the unregistered fd fails ENOENT every time (`endpoint_update_epoll()`), and since `ep->flags` never advances past 0 on failure, the SAME broken endpoint can be dispatched against repeatedly in a loop for a bounded-retry-escalation test, no per-attempt endpoint reconstruction needed. First established by `src/lib/testsuite/test_netio_arm_failure.c`/`test_request_send_propagation.c` (bug-646/650); reused directly at the controller layer for `test_dispatch_fail_retry.c`'s `XCE_DISPATCH_FAIL_SITE_RPC_FAILURE` tests (task 3.3) by pointing a `worker_t.ep` at the broken endpoint instead of the established "zeroed, no-iomgr ep always succeeds" fixture task 3.1 uses for the success path.
|
||||
- **A prior task's own test file can pre-emptively flag a specific assertion as "this will need to change once task N.M lands" in its own comment/message string — grep for the LATER task's own number in sibling test files before assuming "task boundary == only my new file changes."** Task 3.1's `test_dispatch_commit.c::test_dc_worker_not_found_leaves_job_pend_and_alloc_uncommitted` asserted `dispatch_fail_count` stayed unchanged with the message "incrementing it is task 3.3's job, not 3.1's" — a deliberate, anticipated staleness, not an accidental regression. Confirmed via the mandated RED (git-stash job.c only, rebuild, run new tests → fail as expected) → GREEN (restore, rebuild) cycle: the GREEN pass surfaced this ONE pre-existing sibling-test failure (seeded counter 2 → now correctly 3), fixed by updating that one assertion + its message, not by touching my own new file. This is explicitly within "test infrastructure under testsuite/ may change" boundary language even when the task brief's boundary section only names the NEW file — a task boundary permitting "test infrastructure" changes covers fixing a sibling test's own foreseen staleness, not just adding new tests.
|
||||
- **A "mirror the precedent's free-and-replace pattern exactly" instruction (bug-1678/1687/1689's own established shape) can be actively WRONG for a new field if that field's live-mutation path sources any nested pointer from `makeString()` (bug-1690, WAL_JOB_RUSAGE/job.run_usage).** `update_host_runusage()` (misc.c) builds `xce_host_runusage_t.host_name` from `makeString()` — an RTTI-managed, refcounted, HEADER-BEFORE-DATA pointer (confirmed by reading librtti's actual source in the nix store, `RTTI_DATA_TO_OBJ`: `((meta_obj_t*)(((char*)v) - RTTI_OBJ_HEADER_SIZE))`), NOT a plain `malloc()`. `persist_apply_pump_run()` (the LIVE online-apply pump, confirmed via its own doc comment to run continuously on the primary itself, not just boot replay) re-applies every committed fact — including one the SAME process just live-mutated moments earlier via the synchronous "mutate-then-persist" pattern (the SAME pattern bug-1678's `dispatch_a_job_()` uses for `job.allocs`). For DISPATCH this is safe because `job.allocs`'s nested `host` field is genuinely capnp-wire-decoded end-to-end (arrives from the scheduler already deserialized) — `free_JobAlloc_ptr()` on it is always consistent. For RUSAGE it is NOT safe: calling the capnp-generated `free_JobRunusage_ptr()` on the LIVE (xstring-backed) structure would `free()` a non-malloc'd pointer — guaranteed ASAN heap-corruption abort on the very first live report for a new host. **General check before reusing this "free-and-replace at apply time" precedent for any NEW WAL fact type: grep the field's LIVE-mutation call site for `makeString()` (or any other non-malloc allocator) on any pointer the apply seam might later free — if found, replace with a MERGE (overwrite scalars in place, only adopt genuinely-new nested pointers by ownership transfer, never free an existing one) instead of a free-and-replace.** Proved with a real regression test using an actual `makeString()`'d pointer and asserting POINTER IDENTITY survives the merge (not just value equality) — a value-only check would not have caught this class of bug. Also found, but explicitly NOT fixed (separate file/component, out of scope): `job_destroy()` (`src/lib/jobj.c`)'s own existing manual `FREEUP`-based walk over `run_usage` has this exact same latent host_name/xstring mismatch, independent of and pre-dating this fix.
|
||||
- **This project's Unity build has `TEST_ASSERT_EQUAL_DOUBLE` silently non-functional (fails every call with "Unity Double Precision Disabled") because `unity_dep = dependency('unity')` is a prebuilt nix package with no `-DUNITY_INCLUDE_DOUBLE`** (Unity's own default is double support OFF unless explicitly opted in; float support is ON by default). Grep any existing test file comparing a C `double` field before assuming `TEST_ASSERT_EQUAL_DOUBLE` works — the established codebase convention (e.g. `test_apply_committed_entry.c`, `test_dispatch_commit.c`, `test_worker_join.c`) is `TEST_ASSERT_EQUAL_FLOAT` even for genuinely-`double`-typed fields (implicit narrow to float; fine for clean/round test fixture values). Caught only by actually running the RED build and reading the real failure message, not by reasoning from Unity's public API alone.
|
||||
|
|
|
|||
|
|
@ -118,13 +118,13 @@
|
|||
"first_read": "2026-08-25T07:27:17.276Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c": {
|
||||
"count": 31,
|
||||
"tokens": 94955,
|
||||
"count": 45,
|
||||
"tokens": 97979,
|
||||
"first_read": "2026-08-25T07:27:27.677Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/job.c": {
|
||||
"count": 19,
|
||||
"tokens": 34660,
|
||||
"count": 23,
|
||||
"tokens": 36631,
|
||||
"first_read": "2026-08-25T07:27:28.858Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/ha.c": {
|
||||
|
|
@ -208,8 +208,8 @@
|
|||
"first_read": "2026-08-25T07:41:57.960Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/include/wal_types.h": {
|
||||
"count": 2,
|
||||
"tokens": 2459,
|
||||
"count": 4,
|
||||
"tokens": 3178,
|
||||
"first_read": "2026-08-25T07:44:46.985Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/tools/xce-build.sh": {
|
||||
|
|
@ -258,8 +258,8 @@
|
|||
"first_read": "2026-08-25T07:58:23.880Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/include/persist.h": {
|
||||
"count": 4,
|
||||
"tokens": 25274,
|
||||
"count": 5,
|
||||
"tokens": 26004,
|
||||
"first_read": "2026-08-25T07:59:46.203Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/include/typemap.h": {
|
||||
|
|
@ -308,8 +308,8 @@
|
|||
"first_read": "2026-08-25T08:29:24.263Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/test_commit_barrier_reply.c": {
|
||||
"count": 3,
|
||||
"tokens": 45509,
|
||||
"count": 4,
|
||||
"tokens": 45624,
|
||||
"first_read": "2026-08-25T08:33:18.529Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/scheduler/testsuite/test_picker_fcfs_session.c": {
|
||||
|
|
@ -318,24 +318,64 @@
|
|||
"first_read": "2026-08-25T08:36:03.086Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/test_wal_job_start_fact.c": {
|
||||
"count": 1,
|
||||
"count": 2,
|
||||
"tokens": 6378,
|
||||
"first_read": "2026-08-25T09:28:38.196Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/include/utils.h": {
|
||||
"count": 1,
|
||||
"count": 2,
|
||||
"tokens": 2720,
|
||||
"first_read": "2026-08-25T09:29:39.634Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/meson.build": {
|
||||
"count": 1,
|
||||
"tokens": 3477,
|
||||
"count": 3,
|
||||
"tokens": 3488,
|
||||
"first_read": "2026-08-25T09:31:05.167Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/controller_test.c": {
|
||||
"count": 2,
|
||||
"tokens": 2386,
|
||||
"count": 4,
|
||||
"tokens": 2407,
|
||||
"first_read": "2026-08-25T09:35:28.617Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/schema/controller.capnp": {
|
||||
"count": 4,
|
||||
"tokens": 14664,
|
||||
"first_read": "2026-08-25T10:02:50.227Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/lib/meson.build": {
|
||||
"count": 1,
|
||||
"tokens": 0,
|
||||
"first_read": "2026-08-25T10:04:27.003Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/xceadmin/meson-build.sh": {
|
||||
"count": 1,
|
||||
"tokens": 2100,
|
||||
"first_read": "2026-08-25T10:05:27.202Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/test_commit_barrier_rollout.c": {
|
||||
"count": 1,
|
||||
"tokens": 29654,
|
||||
"first_read": "2026-08-25T10:18:53.927Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/lib/jobj.c": {
|
||||
"count": 1,
|
||||
"tokens": 6130,
|
||||
"first_read": "2026-08-25T10:21:31.165Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/lib/xstring.c": {
|
||||
"count": 1,
|
||||
"tokens": 0,
|
||||
"first_read": "2026-08-25T10:23:00.512Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/build-asan/lib/controller.capnp.c": {
|
||||
"count": 1,
|
||||
"tokens": 0,
|
||||
"first_read": "2026-08-25T10:25:05.547Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/test_wal_job_rusage_fact.c": {
|
||||
"count": 1,
|
||||
"tokens": 9012,
|
||||
"first_read": "2026-08-25T10:36:21.330Z"
|
||||
}
|
||||
},
|
||||
"files_written": [
|
||||
|
|
@ -926,6 +966,144 @@
|
|||
"action": "edit",
|
||||
"tokens": 446,
|
||||
"at": "2026-08-25T09:38:59.290Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/schema/controller.capnp",
|
||||
"action": "edit",
|
||||
"tokens": 543,
|
||||
"at": "2026-08-25T10:11:42.490Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 280,
|
||||
"at": "2026-08-25T10:12:11.594Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 697,
|
||||
"at": "2026-08-25T10:12:27.675Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 563,
|
||||
"at": "2026-08-25T10:13:15.888Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 491,
|
||||
"at": "2026-08-25T10:13:53.370Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 184,
|
||||
"at": "2026-08-25T10:14:47.180Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 356,
|
||||
"at": "2026-08-25T10:15:02.296Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 316,
|
||||
"at": "2026-08-25T10:15:14.534Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/include/wal_types.h",
|
||||
"action": "edit",
|
||||
"tokens": 414,
|
||||
"at": "2026-08-25T10:15:26.028Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/job.c",
|
||||
"action": "edit",
|
||||
"tokens": 443,
|
||||
"at": "2026-08-25T10:15:38.017Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/test_wal_job_rusage_fact.c",
|
||||
"action": "create",
|
||||
"tokens": 8014,
|
||||
"at": "2026-08-25T10:20:49.706Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/job.c",
|
||||
"action": "edit",
|
||||
"tokens": 1788,
|
||||
"at": "2026-08-25T10:33:45.571Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/job.c",
|
||||
"action": "edit",
|
||||
"tokens": 22,
|
||||
"at": "2026-08-25T10:33:55.640Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 321,
|
||||
"at": "2026-08-25T10:34:08.240Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 611,
|
||||
"at": "2026-08-25T10:34:31.733Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/include/wal_types.h",
|
||||
"action": "edit",
|
||||
"tokens": 317,
|
||||
"at": "2026-08-25T10:34:51.310Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/test_wal_job_rusage_fact.c",
|
||||
"action": "edit",
|
||||
"tokens": 1642,
|
||||
"at": "2026-08-25T10:36:01.471Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/test_wal_job_rusage_fact.c",
|
||||
"action": "edit",
|
||||
"tokens": 62,
|
||||
"at": "2026-08-25T10:36:12.091Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/test_wal_job_rusage_fact.c",
|
||||
"action": "edit",
|
||||
"tokens": 320,
|
||||
"at": "2026-08-25T10:36:34.638Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/controller_test.c",
|
||||
"action": "edit",
|
||||
"tokens": 39,
|
||||
"at": "2026-08-25T10:37:00.691Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/controller_test.c",
|
||||
"action": "edit",
|
||||
"tokens": 32,
|
||||
"at": "2026-08-25T10:37:18.007Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/meson.build",
|
||||
"action": "edit",
|
||||
"tokens": 37,
|
||||
"at": "2026-08-25T10:37:25.104Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/job.c",
|
||||
"action": "edit",
|
||||
"tokens": 36,
|
||||
"at": "2026-08-25T10:38:09.382Z"
|
||||
}
|
||||
],
|
||||
"edit_counts": {
|
||||
|
|
@ -948,23 +1126,25 @@
|
|||
"src/controller/testsuite/test_ha_durability.c": 3,
|
||||
"src/controller/CLAUDE.md": 1,
|
||||
"src/include/persist.h": 2,
|
||||
"src/include/wal_types.h": 2,
|
||||
"src/controller/persist.c": 11,
|
||||
"src/controller/job.c": 4,
|
||||
"src/include/wal_types.h": 4,
|
||||
"src/controller/persist.c": 20,
|
||||
"src/controller/job.c": 8,
|
||||
"src/controller/testsuite/test_wal_job_start_fact.c": 1,
|
||||
"src/controller/meson.build": 2,
|
||||
"src/controller/testsuite/controller_test.c": 4,
|
||||
"src/controller/meson.build": 3,
|
||||
"src/controller/testsuite/controller_test.c": 6,
|
||||
"src/scheduler/testsuite/test_limit_plugin.c": 2,
|
||||
"src/scheduler/testsuite/meson.build": 4,
|
||||
"src/scheduler/src/plugins/limit.c": 1,
|
||||
"src/scheduler/src/plugins/builtin_fcfs.c": 10,
|
||||
"src/scheduler/testsuite/test_builtin_fcfs_cursor_uaf.c": 3,
|
||||
"src/controller/testsuite/test_commit_barrier_reply.c": 9,
|
||||
"src/controller/testsuite/test_wal_job_finish_fact.c": 1
|
||||
"src/controller/testsuite/test_wal_job_finish_fact.c": 1,
|
||||
"src/schema/controller.capnp": 1,
|
||||
"src/controller/testsuite/test_wal_job_rusage_fact.c": 4
|
||||
},
|
||||
"anatomy_hits": 42,
|
||||
"anatomy_misses": 25,
|
||||
"repeated_reads_warned": 160,
|
||||
"anatomy_hits": 47,
|
||||
"anatomy_misses": 28,
|
||||
"repeated_reads_warned": 191,
|
||||
"cerebrum_warnings": 0,
|
||||
"stop_count": 35
|
||||
"stop_count": 39
|
||||
}
|
||||
|
|
@ -3999,3 +3999,31 @@
|
|||
| 02:41 | Session end: 98 writes across 31 files (persistence.md, SKILL.md, plugin.h, plugin.c, driver.c) | 67 reads | ~704342 tok |
|
||||
| 09:56 | bug-1689: fixed WAL_JOB_FINISH silent field drop (exit_info/finish_time/run_time) on replay, mirroring bug-1687's WAL_JOB_START pattern exactly (native trailer, no capnp needed for job_exitinfo_t) | job.c, persist.c, persist.h, wal_types.h, test_wal_job_finish_fact.c (new) | RED (4 fail, git-stash-verified) -> GREEN (6/6 new tests, 1152 suite tests, only pre-existing bug-1561 flaky failures) | ~large |
|
||||
| 09:56 | Logged bug-1689 to buglog.json (re-checked max id twice, renumbered bug-1688->bug-1689 after sibling-session collision); updated cerebrum.md Key Learnings (2 entries) | buglog.json, cerebrum.md, anatomy.md | done | ~medium |
|
||||
| 03:00 | Session end: 98 writes across 31 files (persistence.md, SKILL.md, plugin.h, plugin.c, driver.c) | 67 reads | ~704342 tok |
|
||||
| 03:11 | Edited src/schema/controller.capnp | modified mapname() | ~507 |
|
||||
| 03:12 | Edited src/controller/persist.c | added error handling | ~261 |
|
||||
| 03:12 | Edited src/controller/persist.c | added 3 condition(s) | ~651 |
|
||||
| 03:13 | Edited src/controller/persist.c | added error handling | ~526 |
|
||||
| 03:13 | Edited src/controller/persist.c | added 3 condition(s) | ~458 |
|
||||
| 03:14 | Edited src/controller/persist.c | modified switch() | ~172 |
|
||||
| 03:15 | Edited src/controller/persist.c | added 1 condition(s) | ~333 |
|
||||
| 03:15 | Edited src/controller/persist.c | added 2 condition(s) | ~295 |
|
||||
| 03:15 | Edited src/include/wal_types.h | expanded (+19 lines) | ~386 |
|
||||
| 03:15 | Edited src/controller/job.c | added error handling | ~414 |
|
||||
| 03:20 | Created src/controller/testsuite/test_wal_job_rusage_fact.c | — | ~7480 |
|
||||
| 03:31 | Session end: 109 writes across 33 files (persistence.md, SKILL.md, plugin.h, plugin.c, driver.c) | 74 reads | ~774573 tok |
|
||||
| 03:31 | Session end: 109 writes across 33 files (persistence.md, SKILL.md, plugin.h, plugin.c, driver.c) | 74 reads | ~774573 tok |
|
||||
| 03:33 | Edited src/controller/job.c | added 4 condition(s) | ~1669 |
|
||||
| 03:33 | Edited src/controller/job.c | inline fix | ~20 |
|
||||
| 03:34 | Edited src/controller/persist.c | modified c() | ~300 |
|
||||
| 03:34 | Edited src/controller/persist.c | expanded (+9 lines) | ~570 |
|
||||
| 03:34 | Edited src/include/wal_types.h | expanded (+10 lines) | ~296 |
|
||||
| 03:36 | Edited src/controller/testsuite/test_wal_job_rusage_fact.c | added 3 condition(s) | ~1532 |
|
||||
| 03:36 | Edited src/controller/testsuite/test_wal_job_rusage_fact.c | 2→3 lines | ~58 |
|
||||
| 03:36 | Edited src/controller/testsuite/test_wal_job_rusage_fact.c | expanded (+14 lines) | ~299 |
|
||||
| 03:36 | Session end: 117 writes across 33 files (persistence.md, SKILL.md, plugin.h, plugin.c, driver.c) | 75 reads | ~788544 tok |
|
||||
| 03:37 | Edited src/controller/testsuite/controller_test.c | 2→3 lines | ~36 |
|
||||
| 03:37 | Edited src/controller/testsuite/controller_test.c | 2→3 lines | ~30 |
|
||||
| 03:37 | Edited src/controller/meson.build | 2→3 lines | ~35 |
|
||||
| 03:38 | Edited src/controller/job.c | 3→3 lines | ~34 |
|
||||
| 10:51 | bug-1690: WAL_JOB_RUSAGE/job.run_usage restart-drop fixed -- new capnp HostRunusage/JobRunusage schema, merge_job_runusage() safety fix (avoids freeing a live makeString()-backed host_name), both apply seams, 8 new tests, RED(6 fail)/GREEN(1160 tests 0 new fail) verified | src/schema/controller.capnp, src/controller/{job,persist}.c, src/include/wal_types.h, test_wal_job_rusage_fact.c | GREEN, buglog.json updated | ~n/a |
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue