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
c2690cbf95
commit
c3d6cfa4cc
5 changed files with 1884 additions and 34 deletions
|
|
@ -1,7 +1,7 @@
|
|||
# anatomy.md
|
||||
|
||||
> Auto-maintained by OpenWolf. Last scanned: 2026-08-25T09:13:58.494Z
|
||||
> Files: 734 tracked | Anatomy hits: 0 | Misses: 0
|
||||
> Auto-maintained by OpenWolf. Last scanned: 2026-08-25T09:38:59.283Z
|
||||
> Files: 735 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> (~34231 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)
|
||||
- `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` (~3477 tok)
|
||||
- `meson.build` (~3488 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 (~93475 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)
|
||||
- `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> (~2374 tok)
|
||||
- `controller_test.c` — include <argp.h> (~2395 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)
|
||||
|
|
@ -1032,6 +1032,7 @@
|
|||
- `test_sched_worker_change.c` — Declares bug (~3893 tok)
|
||||
- `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_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)
|
||||
|
||||
|
|
@ -1098,9 +1099,9 @@
|
|||
|
||||
## src/include/
|
||||
|
||||
- `persist.h` — pragma once (~25274 tok)
|
||||
- `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 (~2459 tok)
|
||||
- `wal_types.h` — pragma once; bug-1689: documents WAL_JOB_FINISH's new native trailing payload (finish_time+exit_code) (~3178 tok)
|
||||
|
||||
## src/include/xce/
|
||||
|
||||
|
|
|
|||
|
|
@ -118,6 +118,8 @@
|
|||
|
||||
- **(2026-08-25, bug-1687) This worktree can have MULTIPLE concurrent agent sessions actively editing it at once — always re-check `.wolf/buglog.json`'s max id and `git status` for files you never touched immediately before writing, not just once at session start.** Mid-session, `.wolf/buglog.json`'s max id moved from 1685 to 1686 (a different session's `builtin_fcfs.c` SIGSEGV fix, bug-1686) between my first check and my write — required a bulk `sed -i 's/bug-1686/bug-1687/g'` across 6 already-edited files (job.c, persist.c, persist.h, wal_types.h, the new test file, and a test-fixture fix) to renumber every in-code comment reference before writing the buglog entry. Also: `git status` mid-session showed `src/scheduler/src/plugins/builtin_fcfs.c`/`.wolf/cerebrum.md`/`.wolf/buglog.json` as modified by that OTHER session, and a full top-level `ninja`/meson build can fail on THEIR uncommitted, unrelated changes even when your own target component builds fine — that other session's own bug-1686 entry documents hitting the mirror image of this same collision (my job.c/persist.c changes broke ITS full-tree `ninja` build). **Never assume `.wolf/*` files or the working tree are exclusively yours in this environment; re-verify immediately before any write that depends on "current state" (next bug id, clean baseline, etc), and scope builds/tests to your own component when a full-tree build fails on files you didn't touch.**
|
||||
- **(2026-08-25, bug-1687) When a WAL/wire fact type's payload grows past a previously-fixed size (e.g. adding trailing bytes to what used to be a bare fixed-size struct — the bug-1678/bug-1687 pattern), grep the WHOLE testsuite for any test helper that manually parses the raw WAL segment file and matches entries by an EXACT payload-length equality (`hdr.payload_len == sizeof(fixed_struct)`) — such a helper will silently start UNDER-COUNTING (returning 0 instead of the real count) the instant the payload legitimately grows, and if any OTHER test polls/waits on that count reaching a value, the undercounting can manifest as a genuine, reproducible DEADLOCK far downstream (all threads futex-blocked, near-zero CPU accrual) rather than a clean assertion failure at the actual call site. Found via `cbrp_count_jobstate_entries_ex()` in `test_commit_barrier_reply.c` (`hdr.payload_len == sizeof(wal_jobstate_t)` — fixed to `>=`, since jobid/state always live at the same fixed leading offset regardless of trailing bytes). This is a DIFFERENT, more dangerous failure mode than bug-1678 ever hit (that fix's own tests never counted WAL_JOB_DISPATCH via this exact helper, so it went unnoticed) — always grep for `sizeof(wal_jobstate_t)`-style exact-match parsers project-wide whenever changing a WAL fact's payload shape, don't just trust the direct callers/apply seams to be the whole blast radius.
|
||||
- **(2026-08-25, bug-1689) The bug-1687 apply-seam pattern (split a shared-payload WAL fact type out of `apply_wal_entry()`'s shared `case` group into its own case, extend `apply_committed_entry()`'s existing inline `else if (wal_type == X)` branch, add a `restore_job_<type>_state()` sibling in job.c, add a `persist_submit_job_<type>_fact()` sibling in persist.c/persist.h) generalizes cleanly to a THIRD job-fact type (WAL_JOB_FINISH) with one twist: not every such fact needs Cap'n Proto.** `job_exitinfo_t` (`xce/types.h`) is a single `{int exitcode;}` with no existing capnp mapping (confirmed via grep — no `JobExitInfo` in `controller.capnp`), so the trailing payload was a small NATIVE (raw memcpy) fixed-size trailer instead of a capnp-encoded blob — no malloc needed either, since the whole payload is fixed-size (unlike WAL_JOB_START's variable-length JobPIDInfo or WAL_JOB_DISPATCH's JobAlloc). General rule going forward: before reaching for capnp on a new WAL trailing payload, check whether the struct being carried already has a capnp mapping AND has any variable-length/nested-pointer fields — if it's a small fixed POD with neither, a raw `memcpy`'d native trailer (mirroring `wal_jobstate_t`'s own style) is simpler and correct, matching this codebase's own "small native trailing struct" precedent for `wal_jobstate_t` itself. Also discovered mid-fix: `apply_job_finish_transition()` (the "richer" core that DOES set exit_info/finish_time/run_time correctly) is effectively DEAD CODE on the real production apply path today — raft-apply-decoupling's redesign routes all real WAL_JOB_FINISH mutation through the leaner `apply_job_update_transition()` (state-only) instead, so `exit_info` was never populated through the live commit-apply pipeline at all, restart or not, prior to this fix (worse than "only breaks on restart"). When auditing a "richer transition function exists but the apply seam uses a leaner one" pattern (already documented for WAL_JOB_START in bug-1687's persist.h comment), always check whether the richer function has ANY live caller at all, not just whether it's correct.
|
||||
- **(2026-08-25, bug-1689) Reconfirms the bug-1687 "multiple concurrent sessions write `.wolf/buglog.json`" lesson with a fresh, independent collision — re-check the max id immediately before EVERY write, every time, not just once per session.** Checked max id at session start (1687, free), implemented the full fix using "bug-1688" throughout code comments/test file, then re-checked right before writing the buglog entry (per this project's own mandated protocol) and found bug-1688 had been claimed by a sibling session's unrelated scheduler REPL bug in the interim — required a `sed -i 's/bug-1688/bug-1689/g'` across all 5 touched files before writing the entry as bug-1689. Zero cost when caught by re-checking as instructed; would have been a duplicate-id buglog corruption if skipped.
|
||||
- **(2026-08-25, bug-1687) `ptrace` is fully unavailable in this sandbox — `gdb -p <pid>` fails with "Operation not permitted" even with `dangerouslyDisableSandbox: true`, and `/proc/<pid>/task/*/stack` is also unreadable (no permission).** The only process-introspection signal available without ptrace is `/proc/<pid>/task/*/{wchan,status,comm}` (shows which kernel function a thread is blocked in, e.g. `futex_do_wait`, and its state, e.g. `S (sleeping)`) plus `ps -o pid,etime,time` (wall-clock ELAPSED vs. CPU TIME — a process with large ELAPSED but near-zero TIME is genuinely blocked/deadlocked, not slow-computing; this distinction is what first proved the bug-1687 hang was a real deadlock and not just a slow test run). To actually isolate WHICH test in a monolithic Unity binary is hanging when `-t <group>` only filters at group-function granularity (see the existing entry on this): temporarily insert an early `return;` inside the group's own driver function (e.g. `test_commit_barrier_reply()`) right after a candidate `RUN_TEST()` call, rebuild+run with a bounded `timeout N`, and binary-search by moving the `return;` — each step is a full, clean process exit (no ptrace needed) so the log's last line IS trustworthy for that step (unlike a genuinely-hung run, where stdio is fully-buffered when redirected to a file/pipe and the last visible log line can be UP TO ~4KB of buffered-but-unflushed output stale relative to where the hang actually occurred — do not trust "last line before a real hang" as the hanging test's identity without this bisection). **After finishing this kind of diagnostic bisection, grep the group's own driver function for accidentally-DUPLICATED `RUN_TEST()` calls before considering the file clean** — inserting new `RUN_TEST()` lines ahead of a temporary `return;` marker and then later deleting only the marker (not the inserted lines) leaves the original, further-down calls to the same tests still present, silently double-running them (caught here via `git diff` showing a nonzero `+RUN_TEST`/`-RUN_TEST` net and a suspiciously-inflated total test count).
|
||||
|
||||
## Do-Not-Repeat
|
||||
|
|
|
|||
|
|
@ -118,13 +118,13 @@
|
|||
"first_read": "2026-08-25T07:27:17.276Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c": {
|
||||
"count": 25,
|
||||
"tokens": 93475,
|
||||
"count": 31,
|
||||
"tokens": 94955,
|
||||
"first_read": "2026-08-25T07:27:27.677Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/job.c": {
|
||||
"count": 16,
|
||||
"tokens": 33958,
|
||||
"count": 19,
|
||||
"tokens": 34660,
|
||||
"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": 1,
|
||||
"tokens": 2250,
|
||||
"count": 2,
|
||||
"tokens": 2459,
|
||||
"first_read": "2026-08-25T07:44:46.985Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/tools/xce-build.sh": {
|
||||
|
|
@ -218,7 +218,7 @@
|
|||
"first_read": "2026-08-25T07:45:30.532Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/include/xce/types.h": {
|
||||
"count": 2,
|
||||
"count": 3,
|
||||
"tokens": 5439,
|
||||
"first_read": "2026-08-25T07:46:57.369Z"
|
||||
},
|
||||
|
|
@ -258,8 +258,8 @@
|
|||
"first_read": "2026-08-25T07:58:23.880Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/include/persist.h": {
|
||||
"count": 1,
|
||||
"tokens": 24996,
|
||||
"count": 4,
|
||||
"tokens": 25274,
|
||||
"first_read": "2026-08-25T07:59:46.203Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/include/typemap.h": {
|
||||
|
|
@ -316,6 +316,26 @@
|
|||
"count": 1,
|
||||
"tokens": 0,
|
||||
"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,
|
||||
"tokens": 6378,
|
||||
"first_read": "2026-08-25T09:28:38.196Z"
|
||||
},
|
||||
"/home/rshen/projects/xce/worktrees/scheduler-framework/src/include/utils.h": {
|
||||
"count": 1,
|
||||
"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,
|
||||
"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,
|
||||
"first_read": "2026-08-25T09:35:28.617Z"
|
||||
}
|
||||
},
|
||||
"files_written": [
|
||||
|
|
@ -822,6 +842,90 @@
|
|||
"action": "edit",
|
||||
"tokens": 38,
|
||||
"at": "2026-08-25T09:13:58.500Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/test_wal_job_finish_fact.c",
|
||||
"action": "create",
|
||||
"tokens": 7397,
|
||||
"at": "2026-08-25T09:35:19.783Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/controller_test.c",
|
||||
"action": "edit",
|
||||
"tokens": 39,
|
||||
"at": "2026-08-25T09:35:37.240Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/testsuite/controller_test.c",
|
||||
"action": "edit",
|
||||
"tokens": 32,
|
||||
"at": "2026-08-25T09:35:58.768Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/meson.build",
|
||||
"action": "edit",
|
||||
"tokens": 36,
|
||||
"at": "2026-08-25T09:36:06.708Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/include/wal_types.h",
|
||||
"action": "edit",
|
||||
"tokens": 378,
|
||||
"at": "2026-08-25T09:36:16.554Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/include/persist.h",
|
||||
"action": "edit",
|
||||
"tokens": 448,
|
||||
"at": "2026-08-25T09:36:27.520Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 277,
|
||||
"at": "2026-08-25T09:36:36.743Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 343,
|
||||
"at": "2026-08-25T09:36:50.405Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 621,
|
||||
"at": "2026-08-25T09:37:06.231Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 133,
|
||||
"at": "2026-08-25T09:37:24.888Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 600,
|
||||
"at": "2026-08-25T09:37:35.200Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/persist.c",
|
||||
"action": "edit",
|
||||
"tokens": 628,
|
||||
"at": "2026-08-25T09:38:09.219Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/job.c",
|
||||
"action": "edit",
|
||||
"tokens": 485,
|
||||
"at": "2026-08-25T09:38:29.916Z"
|
||||
},
|
||||
{
|
||||
"file": "/home/rshen/projects/xce/worktrees/scheduler-framework/src/controller/job.c",
|
||||
"action": "edit",
|
||||
"tokens": 446,
|
||||
"at": "2026-08-25T09:38:59.290Z"
|
||||
}
|
||||
],
|
||||
"edit_counts": {
|
||||
|
|
@ -843,23 +947,24 @@
|
|||
"src/controller/ha.c": 2,
|
||||
"src/controller/testsuite/test_ha_durability.c": 3,
|
||||
"src/controller/CLAUDE.md": 1,
|
||||
"src/include/persist.h": 1,
|
||||
"src/include/wal_types.h": 1,
|
||||
"src/controller/persist.c": 5,
|
||||
"src/controller/job.c": 2,
|
||||
"src/include/persist.h": 2,
|
||||
"src/include/wal_types.h": 2,
|
||||
"src/controller/persist.c": 11,
|
||||
"src/controller/job.c": 4,
|
||||
"src/controller/testsuite/test_wal_job_start_fact.c": 1,
|
||||
"src/controller/meson.build": 1,
|
||||
"src/controller/testsuite/controller_test.c": 2,
|
||||
"src/controller/meson.build": 2,
|
||||
"src/controller/testsuite/controller_test.c": 4,
|
||||
"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_commit_barrier_reply.c": 9,
|
||||
"src/controller/testsuite/test_wal_job_finish_fact.c": 1
|
||||
},
|
||||
"anatomy_hits": 38,
|
||||
"anatomy_hits": 42,
|
||||
"anatomy_misses": 25,
|
||||
"repeated_reads_warned": 145,
|
||||
"repeated_reads_warned": 160,
|
||||
"cerebrum_warnings": 0,
|
||||
"stop_count": 33
|
||||
"stop_count": 35
|
||||
}
|
||||
|
|
@ -3981,3 +3981,21 @@
|
|||
| 02:06 | Edited src/controller/testsuite/test_commit_barrier_reply.c | 2→2 lines | ~39 |
|
||||
| 02:13 | Edited src/controller/testsuite/test_commit_barrier_reply.c | removed 10 lines | ~35 |
|
||||
| 17:35 | bug-1687 FIXED: WAL_JOB_START now carries job_pidinfo_t+start_time through both apply seams (mirrors bug-1678's WAL_JOB_DISPATCH pattern) — job.c (record_job_start_fact, restore_job_start_state), persist.c (capnp_encode_pidinfo/decode_pidinfo, persist_submit_job_start_fact, apply_wal_entry+apply_committed_entry WAL_JOB_START handling), persist.h/wal_types.h decls+docs, new testsuite/test_wal_job_start_fact.c (6 tests). RED (4/6 fail pre-fix) → GREEN (6/6) independently verified via git-stash. Also found+fixed a real deadlock my larger payload exposed in test_commit_barrier_reply.c's cbrp_count_jobstate_entries_ex (exact-size `==` match undercounted → downstream test spun forever; fixed to `>=`) plus applied bug-1452's teardown-ordering precedent to cbrp_teardown as defense-in-depth. Full suite: 1146 Tests, 2 Failures (pre-existing bug-1561 overlayfs flake only), zero hangs | src/controller/job.c, persist.c, testsuite/test_wal_job_start_fact.c, testsuite/test_commit_barrier_reply.c, testsuite/controller_test.c, meson.build, src/include/persist.h, wal_types.h, .wolf/buglog.json (bug-1687) | GREEN, full suite verified | ~large |
|
||||
| 02:24 | Session end: 84 writes across 30 files (persistence.md, SKILL.md, plugin.h, plugin.c, driver.c) | 63 reads | ~674849 tok |
|
||||
| 02:35 | Created src/controller/testsuite/test_wal_job_finish_fact.c | — | ~6904 |
|
||||
| 02:35 | Edited src/controller/testsuite/controller_test.c | 2→3 lines | ~36 |
|
||||
| 02:35 | Edited src/controller/testsuite/controller_test.c | 2→3 lines | ~30 |
|
||||
| 02:36 | Edited src/controller/meson.build | 2→3 lines | ~34 |
|
||||
| 02:36 | Edited src/include/wal_types.h | expanded (+17 lines) | ~353 |
|
||||
| 02:36 | Edited src/include/persist.h | expanded (+20 lines) | ~418 |
|
||||
| 02:36 | Edited src/controller/persist.c | added error handling | ~259 |
|
||||
| 02:36 | Edited src/controller/persist.c | added 2 condition(s) | ~320 |
|
||||
| 02:37 | Edited src/controller/persist.c | modified persist_submit_job_finish_fact() | ~580 |
|
||||
| 02:37 | Edited src/controller/persist.c | 16→15 lines | ~124 |
|
||||
| 02:37 | Edited src/controller/persist.c | added error handling | ~560 |
|
||||
| 02:38 | Edited src/controller/persist.c | added 4 condition(s) | ~587 |
|
||||
| 02:38 | Edited src/controller/job.c | added error handling | ~453 |
|
||||
| 02:38 | Edited src/controller/job.c | expanded (+18 lines) | ~416 |
|
||||
| 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 |
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue