From 8c11655e5329234c78104a6488530f5cd3e3da59 Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Tue, 16 Jun 2026 08:24:28 +0000 Subject: [PATCH] fix(persist): interruptible fsync_worker sleep so persist_stop joins promptly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fsync_worker slept the full wal_sync_ms in one uninterruptible nanosleep() before re-checking fsync_stop. persist_stop sets the flag and immediately pthread_join()s, so the join blocked until the in-flight sleep returned — up to a full wal_sync_ms per teardown. Tests set wal_sync_ms=5000 ("slow fsync — no races"), so each persist_stop cost ~5s; across the ~7 suites that use it the cumulative teardown time blew past the 300s controller-test meson cap, killing the suite with SIGTERM. Replace the nanosleep with pthread_cond_timedwait on a new fsync_mutex/ fsync_cond (added to persist_t, init in persist_init, destroyed in persist_fini). persist_stop now sets fsync_stop and signals fsync_cond under fsync_mutex before joining, so the worker wakes immediately. fdatasync still runs under p->lock, released before re-acquiring fsync_mutex — no lock nesting. The "commit: WAIT deadline expired" log lines were unrelated intentional negative tests (50-300ms), not the cause. Full controller suite now completes in ~10s (was >300s TIMEOUT); 0 failures. Logged as bug-604. --- .wolf/buglog.json | 902 +++++++++++++++++++++------------------ .wolf/memory.md | 23 + src/controller/persist.c | 39 +- src/include/persist.h | 2 + 4 files changed, 552 insertions(+), 414 deletions(-) diff --git a/.wolf/buglog.json b/.wolf/buglog.json index 515ff57..24df7b5 100644 --- a/.wolf/buglog.json +++ b/.wolf/buglog.json @@ -7,7 +7,7 @@ "error_message": "Significant refactor of ", "file": "CLAUDE.md", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 23→30 lines (3 removed)", + "fix": "Rewrote 23\u219230 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -39,7 +39,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_config_repl.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 14→19 lines (2 removed)", + "fix": "Rewrote 14\u219219 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -55,7 +55,7 @@ "error_message": "Wrong reference: g_tmpdir should be g_instdir", "file": "src/controller/testsuite/test_config_repl.c", "root_cause": "Used \"g_tmpdir\" instead of \"g_instdir\"", - "fix": "Changed g_tmpdir → g_instdir", + "fix": "Changed g_tmpdir \u2192 g_instdir", "tags": [ "auto-detected", "wrong-reference", @@ -87,7 +87,7 @@ "error_message": "Significant refactor of ", "file": "src/docs/config-replication-design.md", "root_cause": "7 lines replaced/restructured", - "fix": "Rewrote 17→20 lines (7 removed)", + "fix": "Rewrote 17\u219220 lines (7 removed)", "tags": [ "auto-detected", "refactor", @@ -135,7 +135,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.h", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 6→9 lines (2 removed)", + "fix": "Rewrote 6\u21929 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -151,7 +151,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 11→5 lines (5 removed)", + "fix": "Rewrote 11\u21925 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -167,7 +167,7 @@ "error_message": "Significant refactor of ", "file": "src/docs/config-replication-impl-status.md", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 10→12 lines (4 removed) | Also: | `handle_config_request()` (primary handler) | ✅ ; | `fetch_config_from_primary()` (standby fetch) | | Also: | `handle_upgrade_config()` | ✅ Compiled, gated | ; | `push_config_to_standbys()` | ⚠ Stub (returns 0)", + "fix": "Rewrote 10\u219212 lines (4 removed) | Also: | `handle_config_request()` (primary handler) | \u2705 ; | `fetch_config_from_primary()` (standby fetch) | | Also: | `handle_upgrade_config()` | \u2705 Compiled, gated | ; | `push_config_to_standbys()` | \u26a0 Stub (returns 0)", "tags": [ "auto-detected", "refactor", @@ -183,7 +183,7 @@ "error_message": "Significant refactor of ", "file": "src/docs/config-replication-impl-status.md", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 17→21 lines (4 removed)", + "fix": "Rewrote 17\u219221 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -199,7 +199,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 6→7 lines (3 removed)", + "fix": "Rewrote 6\u21927 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -215,7 +215,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/brief.md", "root_cause": "6 lines replaced/restructured", - "fix": "Rewrote 13→24 lines (6 removed)", + "fix": "Rewrote 13\u219224 lines (6 removed)", "tags": [ "auto-detected", "refactor", @@ -231,7 +231,7 @@ "error_message": "Significant refactor of ", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 4→10 lines (4 removed)", + "fix": "Rewrote 4\u219210 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -247,7 +247,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/brief.md", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 8→9 lines (4 removed)", + "fix": "Rewrote 8\u21929 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -262,7 +262,7 @@ "timestamp": "2026-05-25T11:05:06.112Z", "error_message": "Missing error handling in send", "file": ".kiro/specs/ha-config-bootstrap/brief.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -278,7 +278,7 @@ "timestamp": "2026-05-25T11:06:26.871Z", "error_message": "Missing error handling in unknown", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -295,7 +295,7 @@ "error_message": "Significant refactor of ", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 23→40 lines (2 removed)", + "fix": "Rewrote 23\u219240 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -326,7 +326,7 @@ "timestamp": "2026-05-25T11:32:18.221Z", "error_message": "Missing error handling in types", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -343,7 +343,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/brief.md", "root_cause": "36 lines replaced/restructured", - "fix": "Rewrote 63→79 lines (36 removed) | Also: 6. **No simultaneous primaries**: Only one node ca; 7. **Majority-commit WAL replication (CP writes)** | Also: - `handle_request_vote()` handler on all peers; - Config tag + LSN comparison for vote decision", + "fix": "Rewrote 63\u219279 lines (36 removed) | Also: 6. **No simultaneous primaries**: Only one node ca; 7. **Majority-commit WAL replication (CP writes)** | Also: - `handle_request_vote()` handler on all peers; - Config tag + LSN comparison for vote decision", "tags": [ "auto-detected", "refactor", @@ -391,7 +391,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/brief.md", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 11→28 lines (3 removed)", + "fix": "Rewrote 11\u219228 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -439,7 +439,7 @@ "error_message": "Significant refactor of ", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 13→28 lines (2 removed)", + "fix": "Rewrote 13\u219228 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -471,7 +471,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/brief.md", "root_cause": "11 lines replaced/restructured", - "fix": "Rewrote 17→28 lines (11 removed)", + "fix": "Rewrote 17\u219228 lines (11 removed)", "tags": [ "auto-detected", "refactor", @@ -487,7 +487,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/brief.md", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 28→45 lines (4 removed)", + "fix": "Rewrote 28\u219245 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -519,7 +519,7 @@ "error_message": "Significant refactor of ", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", "root_cause": "13 lines replaced/restructured", - "fix": "Rewrote 22→35 lines (13 removed) | Also: **Files**: `src/controller/main.c`, `src/lib/netio; 1. **Peer-count validation in `main.c`** (before `", + "fix": "Rewrote 22\u219235 lines (13 removed) | Also: **Files**: `src/controller/main.c`, `src/lib/netio; 1. **Peer-count validation in `main.c`** (before `", "tags": [ "auto-detected", "refactor", @@ -567,7 +567,7 @@ "error_message": "Significant refactor of ", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→7 lines (2 removed)", + "fix": "Rewrote 4\u21927 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -583,7 +583,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/brief.md", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 9→11 lines (2 removed)", + "fix": "Rewrote 9\u219211 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -631,7 +631,7 @@ "error_message": "Significant refactor of ", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", "root_cause": "18 lines replaced/restructured", - "fix": "Rewrote 29→34 lines (18 removed)", + "fix": "Rewrote 29\u219234 lines (18 removed)", "tags": [ "auto-detected", "refactor", @@ -679,7 +679,7 @@ "error_message": "Significant refactor of ", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 13→29 lines (8 removed) | Also: 8. **Register OP_requestVote handler** in cluster'; switch at line ~195): since vtaskmgr and iomgr run", + "fix": "Rewrote 13\u219229 lines (8 removed) | Also: 8. **Register OP_requestVote handler** in cluster'; switch at line ~195): since vtaskmgr and iomgr run", "tags": [ "auto-detected", "refactor", @@ -695,7 +695,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/brief.md", "root_cause": "9 lines replaced/restructured", - "fix": "Rewrote 13→60 lines (9 removed) | Also: 3. **Replace timestamp polling with `EPOLLRDHUP`**; is replaced by an epoll event handler. On `EPOLLRD | Also: - **Split vote recovery**: After failing quorum, s; (using existing `jitter_seed` xorshift64), retry o", + "fix": "Rewrote 13\u219260 lines (9 removed) | Also: 3. **Replace timestamp polling with `EPOLLRDHUP`**; is replaced by an epoll event handler. On `EPOLLRD | Also: - **Split vote recovery**: After failing quorum, s; (using existing `jitter_seed` xorshift64), retry o", "tags": [ "auto-detected", "refactor", @@ -711,7 +711,7 @@ "error_message": "Significant refactor of ", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 8→34 lines (8 removed) | Also: 2. **Replace `ha_check_heartbeat_nocluster()` with; - On `EPOLLRDHUP` from `primary_ctrl_fd`: **close ", + "fix": "Rewrote 8\u219234 lines (8 removed) | Also: 2. **Replace `ha_check_heartbeat_nocluster()` with; - On `EPOLLRDHUP` from `primary_ctrl_fd`: **close ", "tags": [ "auto-detected", "refactor", @@ -726,7 +726,7 @@ "timestamp": "2026-05-26T13:51:32.274Z", "error_message": "Missing error handling in unknown", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block | Also: - [ ] `test_heartbeat_carries_committed_lsn`: heartbeat payl; `committed_lsn`; standby updates `ha.last_known_committed_ls", "tags": [ "auto-detected", @@ -742,7 +742,7 @@ "timestamp": "2026-05-26T13:52:49.044Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-config-bootstrap/brief.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block | Also: // Catch-up gate (Clarification 6): behind nodes must not in; if (c->ha.in_catch_up) {", "tags": [ "auto-detected", @@ -758,7 +758,7 @@ "timestamp": "2026-05-27T03:02:34.912Z", "error_message": "Missing error handling in unknown", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block | Also: name, key, applied_lsn, and config_tag immediately after TCP; - [ ] `test_ctrl_hello_registers_standby_in_repl`: handle_ct", "tags": [ "auto-detected", @@ -774,7 +774,7 @@ "timestamp": "2026-05-27T03:03:26.016Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-config-bootstrap/brief.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -791,7 +791,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/brief.md", "root_cause": "9 lines replaced/restructured", - "fix": "Rewrote 37→51 lines (9 removed)", + "fix": "Rewrote 37\u219251 lines (9 removed)", "tags": [ "auto-detected", "refactor", @@ -807,7 +807,7 @@ "error_message": "Significant refactor of ", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 8→23 lines (8 removed) | Also: - [ ] `test_persistent_conn_single_node_noop`: ha_; when n_peers == 1; primary_ctrl_fd remains -1 (uni", + "fix": "Rewrote 8\u219223 lines (8 removed) | Also: - [ ] `test_persistent_conn_single_node_noop`: ha_; when n_peers == 1; primary_ctrl_fd remains -1 (uni", "tags": [ "auto-detected", "refactor", @@ -823,7 +823,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/brief.md", "root_cause": "10 lines replaced/restructured", - "fix": "Rewrote 34→51 lines (10 removed)", + "fix": "Rewrote 34\u219251 lines (10 removed)", "tags": [ "auto-detected", "refactor", @@ -838,7 +838,7 @@ "timestamp": "2026-05-27T03:56:41.037Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-config-bootstrap/brief.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -855,7 +855,7 @@ "error_message": "Significant refactor of ", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", "root_cause": "11 lines replaced/restructured", - "fix": "Rewrote 21→28 lines (11 removed)", + "fix": "Rewrote 21\u219228 lines (11 removed)", "tags": [ "auto-detected", "refactor", @@ -870,7 +870,7 @@ "timestamp": "2026-05-27T03:59:16.145Z", "error_message": "Missing error handling in unknown", "file": "../../../../../claude/.claude/plans/prancy-herding-nest.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -887,7 +887,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/brief.md", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 10→13 lines (2 removed) | Also: **Replace LSF priority election with Raft-style qu; Five focused changes: | Also: 8. **Hard SSL/cert gate**: Controller refuses to b; 9. **Observable via logs**: Election results, vote", + "fix": "Rewrote 10\u219213 lines (2 removed) | Also: **Replace LSF priority election with Raft-style qu; Five focused changes: | Also: 8. **Hard SSL/cert gate**: Controller refuses to b; 9. **Observable via logs**: Election results, vote", "tags": [ "auto-detected", "refactor", @@ -902,7 +902,7 @@ "timestamp": "2026-05-27T06:45:34.951Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-config-bootstrap/brief.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -919,7 +919,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/brief.md", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 8→11 lines (2 removed)", + "fix": "Rewrote 8\u219211 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -967,7 +967,7 @@ "error_message": "Significant refactor of ", "file": "src/schema/controller.capnp", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 5→7 lines (2 removed)", + "fix": "Rewrote 5\u21927 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -982,7 +982,7 @@ "timestamp": "2026-05-28T02:55:40.362Z", "error_message": "Missing error handling in unknown", "file": "src/schema/controller.capnp", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -999,7 +999,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.h", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 5→40 lines (2 removed)", + "fix": "Rewrote 5\u219240 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -1014,7 +1014,7 @@ "timestamp": "2026-05-28T03:39:14.341Z", "error_message": "Missing error handling in struct", "file": "src/controller/ha.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -1030,7 +1030,7 @@ "timestamp": "2026-05-28T03:40:17.891Z", "error_message": "Missing error handling in struct", "file": "src/include/typemap.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -1047,7 +1047,7 @@ "error_message": "Significant refactor of ", "file": "src/include/typemap.h", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→6 lines (2 removed)", + "fix": "Rewrote 4\u21926 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -1095,7 +1095,7 @@ "error_message": "Wrong reference: vcpus should be nres", "file": "src/include/clusterconfig.h", "root_cause": "Used \"vcpus\" instead of \"nres\"", - "fix": "Changed vcpus → nres", + "fix": "Changed vcpus \u2192 nres", "tags": [ "auto-detected", "wrong-reference", @@ -1111,7 +1111,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 12→6 lines (8 removed)", + "fix": "Rewrote 12\u21926 lines (8 removed)", "tags": [ "auto-detected", "refactor", @@ -1143,7 +1143,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_startup.c", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 12→18 lines (8 removed)", + "fix": "Rewrote 12\u219218 lines (8 removed)", "tags": [ "auto-detected", "refactor", @@ -1159,7 +1159,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 109→144 lines (4 removed)", + "fix": "Rewrote 109\u2192144 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -1206,7 +1206,7 @@ "timestamp": "2026-05-28T07:13:42.089Z", "error_message": "Missing error handling in struct", "file": "src/controller/ha.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -1222,7 +1222,7 @@ "timestamp": "2026-05-28T07:14:03.724Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -1255,7 +1255,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "14 lines replaced/restructured", - "fix": "Rewrote 92→344 lines (14 removed)", + "fix": "Rewrote 92\u2192344 lines (14 removed)", "tags": [ "auto-detected", "refactor", @@ -1271,7 +1271,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/myapp.c", "root_cause": "6 lines replaced/restructured", - "fix": "Rewrote 25→49 lines (6 removed)", + "fix": "Rewrote 25\u219249 lines (6 removed)", "tags": [ "auto-detected", "refactor", @@ -1335,7 +1335,7 @@ "error_message": "Wrong reference: capn_str_null should be str", "file": "src/controller/config_repl.c", "root_cause": "Used \"capn_str_null\" instead of \"str\"", - "fix": "Changed capn_str_null → str", + "fix": "Changed capn_str_null \u2192 str", "tags": [ "auto-detected", "wrong-reference", @@ -1351,7 +1351,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "7 lines replaced/restructured", - "fix": "Rewrote 17→84 lines (7 removed)", + "fix": "Rewrote 17\u219284 lines (7 removed)", "tags": [ "auto-detected", "refactor", @@ -1398,7 +1398,7 @@ "timestamp": "2026-05-28T13:34:49.513Z", "error_message": "Missing error handling in unknown", "file": "src/controller/repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -1415,7 +1415,7 @@ "error_message": "Significant refactor of ", "file": "src/include/repl.h", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 3→4 lines (3 removed) | Also: /* ACK handling — call from io_worker read callbac; /* Majority-quorum ACK wait — stub until task 7.3 ", + "fix": "Rewrote 3\u21924 lines (3 removed) | Also: /* ACK handling \u2014 call from io_worker read callbac; /* Majority-quorum ACK wait \u2014 stub until task 7.3 ", "tags": [ "auto-detected", "refactor", @@ -1430,7 +1430,7 @@ "timestamp": "2026-05-28T13:52:52.636Z", "error_message": "Missing error handling in unknown", "file": "src/controller/repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -1447,7 +1447,7 @@ "error_message": "Wrong reference: in_catch_up should be acked_config_lsn", "file": "src/controller/repl.c", "root_cause": "Used \"in_catch_up\" instead of \"acked_config_lsn\"", - "fix": "Changed in_catch_up → acked_config_lsn", + "fix": "Changed in_catch_up \u2192 acked_config_lsn", "tags": [ "auto-detected", "wrong-reference", @@ -1479,7 +1479,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/persist.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 20→29 lines (4 removed)", + "fix": "Rewrote 20\u219229 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -1495,7 +1495,7 @@ "error_message": "Wrong reference: ha_state_t should be _Atomic", "file": "src/controller/ha.h", "root_cause": "Used \"ha_state_t\" instead of \"_Atomic\"", - "fix": "Changed ha_state_t → _Atomic", + "fix": "Changed ha_state_t \u2192 _Atomic", "tags": [ "auto-detected", "wrong-reference", @@ -1511,7 +1511,7 @@ "error_message": "Wrong reference: socket should be epoll", "file": "src/controller/ha.c", "root_cause": "Used \"socket\" instead of \"epoll\"", - "fix": "Changed socket → epoll", + "fix": "Changed socket \u2192 epoll", "tags": [ "auto-detected", "wrong-reference", @@ -1559,7 +1559,7 @@ "error_message": "Wrong reference: XCE_ERR_STANDBY should be E_XCE_STANDBY", "file": "src/lib/request.c", "root_cause": "Used \"XCE_ERR_STANDBY\" instead of \"E_XCE_STANDBY\"", - "fix": "Changed XCE_ERR_STANDBY → E_XCE_STANDBY", + "fix": "Changed XCE_ERR_STANDBY \u2192 E_XCE_STANDBY", "tags": [ "auto-detected", "wrong-reference", @@ -1575,7 +1575,7 @@ "error_message": "Wrong reference: XCE_ERR_NOT_READY should be E_XCE_NOT_READY", "file": "src/lib/testsuite/test_libxce_retry.c", "root_cause": "Used \"XCE_ERR_NOT_READY\" instead of \"E_XCE_NOT_READY\"", - "fix": "Changed XCE_ERR_NOT_READY → E_XCE_NOT_READY", + "fix": "Changed XCE_ERR_NOT_READY \u2192 E_XCE_NOT_READY", "tags": [ "auto-detected", "wrong-reference", @@ -1590,7 +1590,7 @@ "timestamp": "2026-05-29T03:27:20.556Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -1606,7 +1606,7 @@ "timestamp": "2026-05-29T03:29:44.753Z", "error_message": "Missing error handling in unknown", "file": "src/controller/config_repl.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -1623,7 +1623,7 @@ "error_message": "Wrong reference: data should be ctrl_hello_reply_t", "file": "src/include/typemap.h", "root_cause": "Used \"data\" instead of \"ctrl_hello_reply_t\"", - "fix": "Changed data → ctrl_hello_reply_t", + "fix": "Changed data \u2192 ctrl_hello_reply_t", "tags": [ "auto-detected", "wrong-reference", @@ -1638,7 +1638,7 @@ "timestamp": "2026-05-29T03:53:48.559Z", "error_message": "Missing error handling in unknown", "file": "src/schema/controller.capnp", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -1654,7 +1654,7 @@ "timestamp": "2026-05-29T03:54:23.205Z", "error_message": "Missing error handling in struct", "file": "src/include/typemap.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block | Also: wal_catchup_entry_t* walcatchupentrymsg;; snapshot_transfer_t* snapshottransfermsg; | Also: /* Forward declarations for types defined later in this file; typedef struct snapshot_transfer_t snapshot_transfer_fw", "tags": [ "auto-detected", @@ -1671,7 +1671,7 @@ "error_message": "Significant refactor of ", "file": "src/include/typemap.h", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 5→5 lines (2 removed)", + "fix": "Rewrote 5\u21925 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -1687,7 +1687,7 @@ "error_message": "Significant refactor of ", "file": "src/schema/controller.capnp", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 5→3 lines (2 removed)", + "fix": "Rewrote 5\u21923 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -1702,7 +1702,7 @@ "timestamp": "2026-05-29T04:04:12.693Z", "error_message": "Missing error handling in unknown", "file": "src/controller/config_repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -1719,7 +1719,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 10→12 lines (2 removed)", + "fix": "Rewrote 10\u219212 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -1751,7 +1751,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 10→20 lines (5 removed)", + "fix": "Rewrote 10\u219220 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -1783,7 +1783,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/manual-tests.md", "root_cause": "9 lines replaced/restructured", - "fix": "Rewrote 18→20 lines (9 removed)", + "fix": "Rewrote 18\u219220 lines (9 removed)", "tags": [ "auto-detected", "refactor", @@ -1798,7 +1798,7 @@ "timestamp": "2026-05-29T10:59:37.144Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-config-bootstrap/manual-tests.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -1815,7 +1815,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/manual-tests.md", "root_cause": "10 lines replaced/restructured", - "fix": "Rewrote 20→36 lines (10 removed) | Also: ### 11.1 Concurrent Startup (3 nodes); - Result: PASS / FAIL", + "fix": "Rewrote 20\u219236 lines (10 removed) | Also: ### 11.1 Concurrent Startup (3 nodes); - Result: PASS / FAIL", "tags": [ "auto-detected", "refactor", @@ -1831,7 +1831,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 29→45 lines (5 removed)", + "fix": "Rewrote 29\u219245 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -1847,7 +1847,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_bootstrap.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→8 lines (2 removed)", + "fix": "Rewrote 4\u21928 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -1879,7 +1879,7 @@ "error_message": "Wrong reference: nres should be vcpus", "file": "src/include/clusterconfig.h", "root_cause": "Used \"nres\" instead of \"vcpus\"", - "fix": "Changed nres → vcpus", + "fix": "Changed nres \u2192 vcpus", "tags": [ "auto-detected", "wrong-reference", @@ -1895,7 +1895,7 @@ "error_message": "Wrong reference: data should be request_vote_reply_t", "file": "src/include/typemap.h", "root_cause": "Used \"data\" instead of \"request_vote_reply_t\"", - "fix": "Changed data → request_vote_reply_t", + "fix": "Changed data \u2192 request_vote_reply_t", "tags": [ "auto-detected", "wrong-reference", @@ -1911,7 +1911,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "10 lines replaced/restructured", - "fix": "Rewrote 19→25 lines (10 removed)", + "fix": "Rewrote 19\u219225 lines (10 removed)", "tags": [ "auto-detected", "refactor", @@ -1926,7 +1926,7 @@ "timestamp": "2026-05-29T16:36:41.731Z", "error_message": "Missing error handling in unknown", "file": "src/controller/cluster.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -1943,7 +1943,7 @@ "error_message": "Wrong reference: cluster_init_phase2 should be cluster_register_listener", "file": "src/controller/include/cluster.h", "root_cause": "Used \"cluster_init_phase2\" instead of \"cluster_register_listener\"", - "fix": "Changed cluster_init_phase2 → cluster_register_listener", + "fix": "Changed cluster_init_phase2 \u2192 cluster_register_listener", "tags": [ "auto-detected", "wrong-reference", @@ -1975,7 +1975,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/myapp.c", "root_cause": "30 lines replaced/restructured", - "fix": "Rewrote 79→61 lines (30 removed)", + "fix": "Rewrote 79\u219261 lines (30 removed)", "tags": [ "auto-detected", "refactor", @@ -1991,7 +1991,7 @@ "error_message": "Significant refactor of ", "file": "src/include/xce/cluster_def.h", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 8→15 lines (5 removed)", + "fix": "Rewrote 8\u219215 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -2007,7 +2007,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 7→16 lines (4 removed)", + "fix": "Rewrote 7\u219216 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -2023,7 +2023,7 @@ "error_message": "Wrong reference: CTRL_PERF_NHASH should be c", "file": "src/controller/cluster.c", "root_cause": "Used \"CTRL_PERF_NHASH\" instead of \"c\"", - "fix": "Changed CTRL_PERF_NHASH → c", + "fix": "Changed CTRL_PERF_NHASH \u2192 c", "tags": [ "auto-detected", "wrong-reference", @@ -2039,7 +2039,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "36 lines replaced/restructured", - "fix": "Rewrote 77→41 lines (36 removed)", + "fix": "Rewrote 77\u219241 lines (36 removed)", "tags": [ "auto-detected", "refactor", @@ -2055,7 +2055,7 @@ "error_message": "Wrong reference: true should be false", "file": ".claude/skills/xce-build/SKILL.md", "root_cause": "Used \"true\" instead of \"false\"", - "fix": "Changed true → false", + "fix": "Changed true \u2192 false", "tags": [ "auto-detected", "wrong-reference", @@ -2071,7 +2071,7 @@ "error_message": "Wrong reference: 120 should be 300", "file": "src/controller/meson.build", "root_cause": "Used \"120\" instead of \"300\"", - "fix": "Changed 120 → 300", + "fix": "Changed 120 \u2192 300", "tags": [ "auto-detected", "wrong-reference", @@ -2086,7 +2086,7 @@ "timestamp": "2026-05-30T02:37:40.267Z", "error_message": "Missing error handling in unknown", "file": "src/controller/myapp.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -2103,7 +2103,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 15→21 lines (2 removed)", + "fix": "Rewrote 15\u219221 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -2119,7 +2119,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 9→13 lines (2 removed)", + "fix": "Rewrote 9\u219213 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -2135,7 +2135,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/election-iomgr-refactor/design.md", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 10→27 lines (3 removed)", + "fix": "Rewrote 10\u219227 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -2166,8 +2166,8 @@ "timestamp": "2026-05-30T06:38:09.325Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/election-iomgr-refactor/design.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", - "fix": "Added try/catch block | Also: /* After election determines role: */; int is_first_boot = !c->running; /* running=1 only after cl | Also: #### `ha_dispatch_gate` — CTRL_PRIMARY_COMMITTING case; ```c | Also: ### 3-node startup — ctrl-a wins (with COMMITTING phase); participant PeerC as ctrl-c endpoint | Also: - **`ha_start_election_async()` is fully non-blocking**: Arm; - *Initial startup* (`ha->phase2_done == 0`): calls `cluster", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", + "fix": "Added try/catch block | Also: /* After election determines role: */; int is_first_boot = !c->running; /* running=1 only after cl | Also: #### `ha_dispatch_gate` \u2014 CTRL_PRIMARY_COMMITTING case; ```c | Also: ### 3-node startup \u2014 ctrl-a wins (with COMMITTING phase); participant PeerC as ctrl-c endpoint | Also: - **`ha_start_election_async()` is fully non-blocking**: Arm; - *Initial startup* (`ha->phase2_done == 0`): calls `cluster", "tags": [ "auto-detected", "error-handling", @@ -2183,7 +2183,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/election-iomgr-refactor/design.md", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 19→26 lines (4 removed) | Also: ├── ha.h # Add to ha_state_t: clie; │ # ha_repl_ack_re | Also: └── myapp.c # Restructured: phase1 + ; # for(;;) retry loop, cluster_init_phase2,", + "fix": "Rewrote 19\u219226 lines (4 removed) | Also: \u251c\u2500\u2500 ha.h # Add to ha_state_t: clie; \u2502 # ha_repl_ack_re | Also: \u2514\u2500\u2500 myapp.c # Restructured: phase1 + ; # for(;;) retry loop, cluster_init_phase2,", "tags": [ "auto-detected", "refactor", @@ -2199,7 +2199,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/election-iomgr-refactor/design.md", "root_cause": "12 lines replaced/restructured", - "fix": "Rewrote 15→20 lines (12 removed) | Also: - `src/controller/ha.h` — Add `client_ssl_ctx`, `r; - `src/controller/ha.c` — Main changes above; `ha_ | Also: ├── delay.c # Add delay_task_ms() (ms; │ # Add delay_task_cancel()", + "fix": "Rewrote 15\u219220 lines (12 removed) | Also: - `src/controller/ha.h` \u2014 Add `client_ssl_ctx`, `r; - `src/controller/ha.c` \u2014 Main changes above; `ha_ | Also: \u251c\u2500\u2500 delay.c # Add delay_task_ms() (ms; \u2502 # Add delay_task_cancel()", "tags": [ "auto-detected", "refactor", @@ -2231,7 +2231,7 @@ "error_message": "Significant refactor of ", "file": "src/lib/delay.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 53→85 lines (3 removed)", + "fix": "Rewrote 53\u219285 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -2247,7 +2247,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.h", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 7→8 lines (4 removed)", + "fix": "Rewrote 7\u21928 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -2327,7 +2327,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 14→17 lines (3 removed)", + "fix": "Rewrote 14\u219217 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -2359,7 +2359,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_start_election_async.c", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 24→42 lines (8 removed)", + "fix": "Rewrote 24\u219242 lines (8 removed)", "tags": [ "auto-detected", "refactor", @@ -2390,7 +2390,7 @@ "timestamp": "2026-05-30T11:08:59.808Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/ha.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -2406,7 +2406,7 @@ "timestamp": "2026-05-30T11:09:47.905Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -2423,7 +2423,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 62→164 lines (8 removed) | Also: /* Store candidate own tag/lsn in votes[0] for eva; * n_peers==1 → n_other==0, so votes[] has 0 entrie | Also: * election_timeout_ctx_t: argument for the delay_t; * ha_elect_evaluate_and_signal when the election d", + "fix": "Rewrote 62\u2192164 lines (8 removed) | Also: /* Store candidate own tag/lsn in votes[0] for eva; * n_peers==1 \u2192 n_other==0, so votes[] has 0 entrie | Also: * election_timeout_ctx_t: argument for the delay_t; * ha_elect_evaluate_and_signal when the election d", "tags": [ "auto-detected", "refactor", @@ -2454,7 +2454,7 @@ "timestamp": "2026-05-30T11:43:44.829Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/ha.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block | Also: /* Push config to standbys with lower config_tag (Req 7.1) *; #ifdef XCE_TESTING", "tags": [ "auto-detected", @@ -2470,7 +2470,7 @@ "timestamp": "2026-05-30T11:44:15.059Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/ha.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -2486,7 +2486,7 @@ "timestamp": "2026-05-30T11:45:24.946Z", "error_message": "Missing error handling in unknown", "file": "src/controller/cluster.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -2519,7 +2519,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 22→32 lines (2 removed)", + "fix": "Rewrote 22\u219232 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -2631,7 +2631,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "10 lines replaced/restructured", - "fix": "Rewrote 15→5 lines (10 removed)", + "fix": "Rewrote 15\u21925 lines (10 removed)", "tags": [ "auto-detected", "refactor", @@ -2695,7 +2695,7 @@ "error_message": "Wrong reference: third should be second", "file": "src/controller/testsuite/test_ha_repl_ack.c", "root_cause": "Used \"third\" instead of \"second\"", - "fix": "Changed third → second", + "fix": "Changed third \u2192 second", "tags": [ "auto-detected", "wrong-reference", @@ -2727,7 +2727,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/myapp.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 10→15 lines (5 removed)", + "fix": "Rewrote 10\u219215 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -2759,7 +2759,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "15 lines replaced/restructured", - "fix": "Rewrote 23→10 lines (15 removed)", + "fix": "Rewrote 23\u219210 lines (15 removed)", "tags": [ "auto-detected", "refactor", @@ -2775,7 +2775,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 5→9 lines (2 removed)", + "fix": "Rewrote 5\u21929 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -2791,7 +2791,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 14→16 lines (2 removed)", + "fix": "Rewrote 14\u219216 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -2823,7 +2823,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "12 lines replaced/restructured", - "fix": "Rewrote 15→20 lines (12 removed)", + "fix": "Rewrote 15\u219220 lines (12 removed)", "tags": [ "auto-detected", "refactor", @@ -2839,7 +2839,7 @@ "error_message": "Significant refactor of ", "file": "src/include/typemap.h", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→8 lines (2 removed)", + "fix": "Rewrote 4\u21928 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -2855,7 +2855,7 @@ "error_message": "Significant refactor of ", "file": "src/xce.build/lib/controller.capnp.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 11→19 lines (4 removed) | Also: encode_Data_ptr(cs, &(d->sha256), s->sha256);; encode_Data_ptr(cs, &(d->bytes), s->bytes);", + "fix": "Rewrote 11\u219219 lines (4 removed) | Also: encode_Data_ptr(cs, &(d->sha256), s->sha256);; encode_Data_ptr(cs, &(d->bytes), s->bytes);", "tags": [ "auto-detected", "refactor", @@ -2871,7 +2871,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "28 lines replaced/restructured", - "fix": "Rewrote 31→4 lines (28 removed)", + "fix": "Rewrote 31\u21924 lines (28 removed)", "tags": [ "auto-detected", "refactor", @@ -2887,7 +2887,7 @@ "error_message": "Significant refactor of ", "file": "src/include/typemap.h", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 8→18 lines (4 removed)", + "fix": "Rewrote 8\u219218 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -2903,7 +2903,7 @@ "error_message": "Significant refactor of ", "file": "src/include/request.h", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 10→19 lines (4 removed)", + "fix": "Rewrote 10\u219219 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -2935,7 +2935,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 5→10 lines (2 removed)", + "fix": "Rewrote 5\u219210 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -2951,7 +2951,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 9→11 lines (2 removed)", + "fix": "Rewrote 9\u219211 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -2966,7 +2966,7 @@ "timestamp": "2026-05-31T04:11:45.534Z", "error_message": "Missing error handling in struct", "file": ".kiro/specs/raft-library/design.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block | Also: Caller->>RaftSM: raft_on_vote_request(state, from, term); alt term < current_term", "tags": [ "auto-detected", @@ -2983,7 +2983,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/raft-library/design.md", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 8→26 lines (5 removed) | Also: * raft_init: initialize state for a node.; * All required callbacks (except on_trace and on_v | Also: - C standard library only (`stdint.h`, `pthread.h`; - `raft.c` may include `` for lock-fr | Also: | Threading | `pthread_mutex_t` (caller-owned) | P; | Atomics | None in library | Caller uses atomics ", + "fix": "Rewrote 8\u219226 lines (5 removed) | Also: * raft_init: initialize state for a node.; * All required callbacks (except on_trace and on_v | Also: - C standard library only (`stdint.h`, `pthread.h`; - `raft.c` may include `` for lock-fr | Also: | Threading | `pthread_mutex_t` (caller-owned) | P; | Atomics | None in library | Caller uses atomics ", "tags": [ "auto-detected", "refactor", @@ -3014,7 +3014,7 @@ "timestamp": "2026-05-31T04:58:21.609Z", "error_message": "Missing error handling in RAFT_H", "file": "src/lib/raft/raft.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -3063,7 +3063,7 @@ "error_message": "Significant refactor of ", "file": "src/lib/testsuite/test_raft.c", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 77→107 lines (8 removed)", + "fix": "Rewrote 77\u2192107 lines (8 removed)", "tags": [ "auto-detected", "refactor", @@ -3079,7 +3079,7 @@ "error_message": "Significant refactor of ", "file": "src/lib/raft/raft.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 9→62 lines (5 removed)", + "fix": "Rewrote 9\u219262 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -3095,7 +3095,7 @@ "error_message": "Significant refactor of ", "file": "src/lib/raft/raft.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 8→57 lines (4 removed)", + "fix": "Rewrote 8\u219257 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -3111,7 +3111,7 @@ "error_message": "Significant refactor of ", "file": "src/lib/raft/raft.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 15→38 lines (4 removed)", + "fix": "Rewrote 15\u219238 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -3127,7 +3127,7 @@ "error_message": "Significant refactor of ", "file": "src/lib/raft/raft_sim.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 6→3 lines (2 removed)", + "fix": "Rewrote 6\u21923 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -3159,7 +3159,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "32 lines replaced/restructured", - "fix": "Rewrote 49→16 lines (32 removed)", + "fix": "Rewrote 49\u219216 lines (32 removed)", "tags": [ "auto-detected", "refactor", @@ -3174,7 +3174,7 @@ "timestamp": "2026-05-31T07:26:39.758Z", "error_message": "Missing error handling in before", "file": "src/controller/ha.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -3191,7 +3191,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 6→19 lines (3 removed) | Also: typedef struct {; ha_state_t *ha; | Also: /* ── Type definitions needed by ha_elect_evaluate; *", + "fix": "Rewrote 6\u219219 lines (3 removed) | Also: typedef struct {; ha_state_t *ha; | Also: /* \u2500\u2500 Type definitions needed by ha_elect_evaluate; *", "tags": [ "auto-detected", "refactor", @@ -3207,7 +3207,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "167 lines replaced/restructured", - "fix": "Rewrote 291→137 lines (167 removed) | Also: /* Clear voted_for: the old primary is dead; any v; * is stale and must not block the new election. */", + "fix": "Rewrote 291\u2192137 lines (167 removed) | Also: /* Clear voted_for: the old primary is dead; any v; * is stale and must not block the new election. */", "tags": [ "auto-detected", "refactor", @@ -3223,7 +3223,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "12 lines replaced/restructured", - "fix": "Rewrote 28→68 lines (12 removed)", + "fix": "Rewrote 28\u219268 lines (12 removed)", "tags": [ "auto-detected", "refactor", @@ -3239,7 +3239,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 16→21 lines (2 removed) | Also: /* Task 6.3: delegate vote reply accumulation to r; * raft_on_vote_reply owns quorum tracking and fire", + "fix": "Rewrote 16\u219221 lines (2 removed) | Also: /* Task 6.3: delegate vote reply accumulation to r; * raft_on_vote_reply owns quorum tracking and fire", "tags": [ "auto-detected", "refactor", @@ -3255,7 +3255,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "7 lines replaced/restructured", - "fix": "Rewrote 10→4 lines (7 removed)", + "fix": "Rewrote 10\u21924 lines (7 removed)", "tags": [ "auto-detected", "refactor", @@ -3271,7 +3271,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 5→14 lines (2 removed)", + "fix": "Rewrote 5\u219214 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -3284,7 +3284,7 @@ { "id": "bug-206", "timestamp": "2026-05-31T08:40:00.000Z", - "error_message": "test_vote_reply_handler_term_fencing FAIL: Expected 10 Was 3 — ha->term must be atomically updated to peer term when peer term > ours", + "error_message": "test_vote_reply_handler_term_fencing FAIL: Expected 10 Was 3 \u2014 ha->term must be atomically updated to peer term when peer term > ours", "file": "src/controller/ha.c", "root_cause": "vote_reply_msg_handler delegated term fencing entirely to raft_cb_become_follower (via raft_on_vote_reply). In XCE_TESTING builds, vote_reply_dispatch calls xce_vote_reply_hook and returns early, bypassing raft_on_vote_reply and thus never updating ha->term.", "fix": "Added explicit CAS loop in vote_reply_msg_handler before vote_reply_dispatch to advance ha->term when vr_term > ha->term. This applies on both the production path and the XCE_TESTING hook path.", @@ -3306,7 +3306,7 @@ "error_message": "Wrong reference: test_raft_init_zero_peers_returns_einval should be test_raft_init_even_peers_returns_einval", "file": "src/lib/testsuite/test_raft.c", "root_cause": "Used \"test_raft_init_zero_peers_returns_einval\" instead of \"test_raft_init_even_peers_returns_einval\"", - "fix": "Changed test_raft_init_zero_peers_returns_einval → test_raft_init_even_peers_returns_einval", + "fix": "Changed test_raft_init_zero_peers_returns_einval \u2192 test_raft_init_even_peers_returns_einval", "tags": [ "auto-detected", "wrong-reference", @@ -3319,7 +3319,7 @@ { "id": "bug-208", "timestamp": "2026-05-31", - "error_message": "ASAN LeakSanitizer: detected memory leaks in scheduler testsuite — build exits with error code", + "error_message": "ASAN LeakSanitizer: detected memory leaks in scheduler testsuite \u2014 build exits with error code", "file": "src/scheduler/testsuite/test.c", "root_cause": "sched_meet_host_selection() lazily allocates w->host_eval_ctx via build_host_eval_ctx(). Four test functions (test_meet_host_selection_always_true_passes, test_meet_host_selection_always_false_fails, test_meet_host_selection_numeric_match, test_meet_host_selection_string_match) called zarray_fini() without first calling sched_worker_release_host_ctx() to free the lazily-allocated host_eval_ctx.", "fix": "Added sched_worker_release_host_ctx(&w) calls before zarray_fini() in all four affected test functions.", @@ -3356,7 +3356,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "24 lines replaced/restructured", - "fix": "Rewrote 28→3 lines (24 removed) | Also: if (my_config_tag == 0) {; INFO(\"ha_start_election_async: no local config (ta", + "fix": "Rewrote 28\u21923 lines (24 removed) | Also: if (my_config_tag == 0) {; INFO(\"ha_start_election_async: no local config (ta", "tags": [ "auto-detected", "refactor", @@ -3372,7 +3372,7 @@ "error_message": "Wrong reference: 2000 should be 5000", "file": "src/controller/ha.h", "root_cause": "Used \"2000\" instead of \"5000\"", - "fix": "Changed 2000 → 5000", + "fix": "Changed 2000 \u2192 5000", "tags": [ "auto-detected", "wrong-reference", @@ -3388,7 +3388,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/myapp.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 15→25 lines (3 removed)", + "fix": "Rewrote 15\u219225 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -3404,7 +3404,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.h", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 10→14 lines (8 removed)", + "fix": "Rewrote 10\u219214 lines (8 removed)", "tags": [ "auto-detected", "refactor", @@ -3420,7 +3420,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 7→17 lines (4 removed) | Also: /* Trigger async config fetch from primary so stan; #ifndef XCE_TESTING | Also: handle_request_vote_reply(vctx->ha, vctx->ctx, vct; /* Fix 5 (HIGH): do NOT free vctx here.", + "fix": "Rewrote 7\u219217 lines (4 removed) | Also: /* Trigger async config fetch from primary so stan; #ifndef XCE_TESTING | Also: handle_request_vote_reply(vctx->ha, vctx->ctx, vct; /* Fix 5 (HIGH): do NOT free vctx here.", "tags": [ "auto-detected", "refactor", @@ -3467,7 +3467,7 @@ "timestamp": "2026-05-31T12:54:26.372Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -3484,7 +3484,7 @@ "error_message": "Wrong reference: Request_body_nodata should be Request_body_nomsg", "file": "src/controller/ha.c", "root_cause": "Used \"Request_body_nodata\" instead of \"Request_body_nomsg\"", - "fix": "Changed Request_body_nodata → Request_body_nomsg", + "fix": "Changed Request_body_nodata \u2192 Request_body_nomsg", "tags": [ "auto-detected", "wrong-reference", @@ -3500,7 +3500,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 10→18 lines (4 removed)", + "fix": "Rewrote 10\u219218 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -3516,7 +3516,7 @@ "error_message": "Wrong reference: vote_reply_msg_handler should be vote_reply_msg_handler_for_test", "file": "src/controller/ha.c", "root_cause": "Used \"vote_reply_msg_handler\" instead of \"vote_reply_msg_handler_for_test\"", - "fix": "Changed vote_reply_msg_handler → vote_reply_msg_handler_for_test", + "fix": "Changed vote_reply_msg_handler \u2192 vote_reply_msg_handler_for_test", "tags": [ "auto-detected", "wrong-reference", @@ -3532,7 +3532,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 13→36 lines (3 removed)", + "fix": "Rewrote 13\u219236 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -3548,7 +3548,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "20 lines replaced/restructured", - "fix": "Rewrote 36→13 lines (20 removed)", + "fix": "Rewrote 36\u219213 lines (20 removed)", "tags": [ "auto-detected", "refactor", @@ -3563,7 +3563,7 @@ "timestamp": "2026-06-01T01:49:30.537Z", "error_message": "Missing error handling in unknown", "file": "src/controller/cluster.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -3596,7 +3596,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "42 lines replaced/restructured", - "fix": "Rewrote 64→19 lines (42 removed)", + "fix": "Rewrote 64\u219219 lines (42 removed)", "tags": [ "auto-detected", "refactor", @@ -3611,7 +3611,7 @@ "timestamp": "2026-06-01T02:27:55.942Z", "error_message": "Missing error handling in struct", "file": "src/controller/ha.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -3628,7 +3628,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 10→14 lines (5 removed)", + "fix": "Rewrote 10\u219214 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -3644,7 +3644,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/CLAUDE.md", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 5→15 lines (5 removed)", + "fix": "Rewrote 5\u219215 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -3660,7 +3660,7 @@ "error_message": "Wrong operator: && should be !=", "file": "src/controller/ha.c", "root_cause": "Used \"&&\" instead of \"!=\"", - "fix": "Changed operator && → !=", + "fix": "Changed operator && \u2192 !=", "tags": [ "auto-detected", "operator-fix", @@ -3676,7 +3676,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "10 lines replaced/restructured", - "fix": "Rewrote 16→7 lines (10 removed)", + "fix": "Rewrote 16\u21927 lines (10 removed)", "tags": [ "auto-detected", "refactor", @@ -3692,7 +3692,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "140 lines replaced/restructured", - "fix": "Rewrote 173→11 lines (140 removed)", + "fix": "Rewrote 173\u219211 lines (140 removed)", "tags": [ "auto-detected", "refactor", @@ -3708,7 +3708,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/myapp.c", "root_cause": "16 lines replaced/restructured", - "fix": "Rewrote 25→12 lines (16 removed)", + "fix": "Rewrote 25\u219212 lines (16 removed)", "tags": [ "auto-detected", "refactor", @@ -3740,7 +3740,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 31→37 lines (2 removed)", + "fix": "Rewrote 31\u219237 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -3788,7 +3788,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.h", "root_cause": "21 lines replaced/restructured", - "fix": "Rewrote 28→5 lines (21 removed)", + "fix": "Rewrote 28\u21925 lines (21 removed)", "tags": [ "auto-detected", "refactor", @@ -3852,7 +3852,7 @@ "error_message": "Wrong reference: test_ha_connect should be test_ha_ctrlhello", "file": "src/controller/testsuite/controller_test.c", "root_cause": "Used \"test_ha_connect\" instead of \"test_ha_ctrlhello\"", - "fix": "Changed test_ha_connect → test_ha_ctrlhello", + "fix": "Changed test_ha_connect \u2192 test_ha_ctrlhello", "tags": [ "auto-detected", "wrong-reference", @@ -3868,7 +3868,7 @@ "error_message": "Wrong reference: vcpu should be vcpus", "file": "src/tools/deploy-ha.sh", "root_cause": "Used \"vcpu\" instead of \"vcpus\"", - "fix": "Changed vcpu → vcpus", + "fix": "Changed vcpu \u2192 vcpus", "tags": [ "auto-detected", "wrong-reference", @@ -3884,7 +3884,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "10 lines replaced/restructured", - "fix": "Rewrote 10→6 lines (10 removed)", + "fix": "Rewrote 10\u21926 lines (10 removed)", "tags": [ "auto-detected", "refactor", @@ -3900,7 +3900,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 7→22 lines (2 removed)", + "fix": "Rewrote 7\u219222 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -3916,7 +3916,7 @@ "error_message": "Significant refactor of ", "file": "src/include/typemap.h", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 5→10 lines (3 removed)", + "fix": "Rewrote 5\u219210 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -3932,7 +3932,7 @@ "error_message": "Significant refactor of ", "file": "src/lib/request.c", "root_cause": "32 lines replaced/restructured", - "fix": "Rewrote 49→60 lines (32 removed)", + "fix": "Rewrote 49\u219260 lines (32 removed)", "tags": [ "auto-detected", "refactor", @@ -3948,7 +3948,7 @@ "error_message": "Significant refactor of ", "file": ".claude/skills/xce-deploy-ha/SKILL.md", "root_cause": "7 lines replaced/restructured", - "fix": "Rewrote 17→32 lines (7 removed)", + "fix": "Rewrote 17\u219232 lines (7 removed)", "tags": [ "auto-detected", "refactor", @@ -3964,7 +3964,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/CLAUDE.md", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 6→9 lines (3 removed)", + "fix": "Rewrote 6\u21929 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -3979,7 +3979,7 @@ "timestamp": "2026-06-01T07:28:15.703Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_ha_connection_reuse.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -4012,7 +4012,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_connection_reuse.c", "root_cause": "19 lines replaced/restructured", - "fix": "Rewrote 67→86 lines (19 removed)", + "fix": "Rewrote 67\u219286 lines (19 removed)", "tags": [ "auto-detected", "refactor", @@ -4044,7 +4044,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-heartbeat-liveness/requirements.md", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 10→17 lines (5 removed)", + "fix": "Rewrote 10\u219217 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -4060,7 +4060,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 6→10 lines (2 removed)", + "fix": "Rewrote 6\u219210 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -4092,7 +4092,7 @@ "error_message": "Wrong reference: startup_validation should be testsuite_test_ha_liveness", "file": "src/xce.build/build.ninja", "root_cause": "Used \"startup_validation\" instead of \"testsuite_test_ha_liveness\"", - "fix": "Changed startup_validation → testsuite_test_ha_liveness", + "fix": "Changed startup_validation \u2192 testsuite_test_ha_liveness", "tags": [ "auto-detected", "wrong-reference", @@ -4108,7 +4108,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "76 lines replaced/restructured", - "fix": "Rewrote 112→155 lines (76 removed)", + "fix": "Rewrote 112\u2192155 lines (76 removed)", "tags": [ "auto-detected", "refactor", @@ -4124,7 +4124,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_liveness.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 21→24 lines (5 removed)", + "fix": "Rewrote 21\u219224 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -4140,7 +4140,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_failover.c", "root_cause": "7 lines replaced/restructured", - "fix": "Rewrote 29→47 lines (7 removed)", + "fix": "Rewrote 29\u219247 lines (7 removed)", "tags": [ "auto-detected", "refactor", @@ -4172,7 +4172,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "22 lines replaced/restructured", - "fix": "Rewrote 53→21 lines (22 removed)", + "fix": "Rewrote 53\u219221 lines (22 removed)", "tags": [ "auto-detected", "refactor", @@ -4188,7 +4188,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 8→10 lines (2 removed)", + "fix": "Rewrote 8\u219210 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -4219,7 +4219,7 @@ "timestamp": "2026-06-03T05:20:44.299Z", "error_message": "Missing error handling in lives", "file": ".kiro/specs/ha-config-bootstrap/research.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -4268,7 +4268,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.h", "root_cause": "11 lines replaced/restructured", - "fix": "Rewrote 14→3 lines (11 removed)", + "fix": "Rewrote 14\u21923 lines (11 removed)", "tags": [ "auto-detected", "refactor", @@ -4284,7 +4284,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_role.c", "root_cause": "79 lines replaced/restructured", - "fix": "Rewrote 87→3 lines (79 removed)", + "fix": "Rewrote 87\u21923 lines (79 removed)", "tags": [ "auto-detected", "refactor", @@ -4300,7 +4300,7 @@ "error_message": "Wrong reference: test_am_i_primary should be test_ha_cluster", "file": "src/controller/testsuite/controller_test.c", "root_cause": "Used \"test_am_i_primary\" instead of \"test_ha_cluster\"", - "fix": "Changed test_am_i_primary → test_ha_cluster", + "fix": "Changed test_am_i_primary \u2192 test_ha_cluster", "tags": [ "auto-detected", "wrong-reference", @@ -4316,7 +4316,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.h", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 10→3 lines (8 removed)", + "fix": "Rewrote 10\u21923 lines (8 removed)", "tags": [ "auto-detected", "refactor", @@ -4332,7 +4332,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "21 lines replaced/restructured", - "fix": "Rewrote 26→4 lines (21 removed) | Also: /* ha_check_heartbeat_nocluster() removed from the; * ha_watchdog_thread(). XCE_TESTING shim preserve", + "fix": "Rewrote 26\u21924 lines (21 removed) | Also: /* ha_check_heartbeat_nocluster() removed from the; * ha_watchdog_thread(). XCE_TESTING shim preserve", "tags": [ "auto-detected", "refactor", @@ -4348,7 +4348,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_role.c", "root_cause": "63 lines replaced/restructured", - "fix": "Rewrote 68→4 lines (63 removed) | Also: /* SIGUSR1 must set failover_requested via async-s; static void test_sigusr1_sets_failover_requested(v | Also: RUN_TEST(test_watchdog_starts_and_stops);; RUN_TEST(test_heartbeat_no_action_when_no_primary)", + "fix": "Rewrote 68\u21924 lines (63 removed) | Also: /* SIGUSR1 must set failover_requested via async-s; static void test_sigusr1_sets_failover_requested(v | Also: RUN_TEST(test_watchdog_starts_and_stops);; RUN_TEST(test_heartbeat_no_action_when_no_primary)", "tags": [ "auto-detected", "refactor", @@ -4364,7 +4364,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/manual-tests.md", "root_cause": "6 lines replaced/restructured", - "fix": "Rewrote 8→8 lines (6 removed) | Also: **Expected within 1 second on both standbys:**; **Expected on the winner (needs 1 vote from the ot | Also: defer_config_fetch=1; Config fetch successful from primary (tag=...) | Also: Date:; Commit: (run: cd /home/rshen/projects/xce/worktree", + "fix": "Rewrote 8\u21928 lines (6 removed) | Also: **Expected within 1 second on both standbys:**; **Expected on the winner (needs 1 vote from the ot | Also: defer_config_fetch=1; Config fetch successful from primary (tag=...) | Also: Date:; Commit: (run: cd /home/rshen/projects/xce/worktree", "tags": [ "auto-detected", "refactor", @@ -4380,7 +4380,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-config-bootstrap/manual-tests.md", "root_cause": "95 lines replaced/restructured", - "fix": "Rewrote 158→65 lines (95 removed) | Also: - [ ] `ha-term.bin` file exists after election; - [ ] Magic bytes are `0xDEADBEEFCAFEBABE` (little", + "fix": "Rewrote 158\u219265 lines (95 removed) | Also: - [ ] `ha-term.bin` file exists after election; - [ ] Magic bytes are `0xDEADBEEFCAFEBABE` (little", "tags": [ "auto-detected", "refactor", @@ -4396,7 +4396,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "6 lines replaced/restructured", - "fix": "Rewrote 45→62 lines (6 removed)", + "fix": "Rewrote 45\u219262 lines (6 removed)", "tags": [ "auto-detected", "refactor", @@ -4411,7 +4411,7 @@ "timestamp": "2026-06-04T00:24:46.380Z", "error_message": "Missing error handling in unknown", "file": "src/controller/myapp.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -4428,7 +4428,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/CLAUDE.md", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 5→7 lines (4 removed)", + "fix": "Rewrote 5\u21927 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -4443,7 +4443,7 @@ "timestamp": "2026-06-04T09:46:14.610Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-repl-hardening/design.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -4476,7 +4476,7 @@ "error_message": "Significant refactor of ", "file": "src/schema/controller.capnp", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 4→4 lines (3 removed)", + "fix": "Rewrote 4\u21924 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -4492,7 +4492,7 @@ "error_message": "Significant refactor of ", "file": "src/include/typemap.h", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 5→7 lines (4 removed)", + "fix": "Rewrote 5\u21927 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -4508,7 +4508,7 @@ "error_message": "Significant refactor of ", "file": "src/schema/controller.capnp", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→13 lines (2 removed)", + "fix": "Rewrote 4\u219213 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -4524,7 +4524,7 @@ "error_message": "Significant refactor of ", "file": "src/include/typemap.h", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→8 lines (2 removed)", + "fix": "Rewrote 4\u21928 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -4539,8 +4539,8 @@ "timestamp": "2026-06-04T14:33:03.464Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/testsuite/test_config_repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", - "fix": "Added try/catch block | Also: /* ── Task 2.1: OPCode_walCatchupEntry handler ─────────────; #ifdef XCE_TESTING | Also: /* Task 2.1: OPCode_walCatchupEntry handler */; RUN_TEST(test_wal_catchup_entry_advances_applied_lsn);", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", + "fix": "Added try/catch block | Also: /* \u2500\u2500 Task 2.1: OPCode_walCatchupEntry handler \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500; #ifdef XCE_TESTING | Also: /* Task 2.1: OPCode_walCatchupEntry handler */; RUN_TEST(test_wal_catchup_entry_advances_applied_lsn);", "tags": [ "auto-detected", "error-handling", @@ -4555,7 +4555,7 @@ "timestamp": "2026-06-04T14:41:35.073Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/cluster.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block | Also: case OPCode_walCatchupEntry:; /* Task 2.1: standby applies a single WAL catch-up entry fro", "tags": [ "auto-detected", @@ -4572,7 +4572,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "57 lines replaced/restructured", - "fix": "Rewrote 82→16 lines (57 removed)", + "fix": "Rewrote 82\u219216 lines (57 removed)", "tags": [ "auto-detected", "refactor", @@ -4587,7 +4587,7 @@ "timestamp": "2026-06-04T14:45:42.730Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -4603,7 +4603,7 @@ "timestamp": "2026-06-04T14:46:44.652Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block | Also: #include \"persist.h\" /* persist_t, apply_wal_entry */; #include \"typemap.h\" /* wal_catchup_entry_t */", "tags": [ "auto-detected", @@ -4619,7 +4619,7 @@ "timestamp": "2026-06-04T15:09:54.280Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_config_repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -4636,7 +4636,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "22 lines replaced/restructured", - "fix": "Rewrote 58→114 lines (22 removed)", + "fix": "Rewrote 58\u2192114 lines (22 removed)", "tags": [ "auto-detected", "refactor", @@ -4652,7 +4652,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 10→15 lines (3 removed)", + "fix": "Rewrote 10\u219215 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -4684,7 +4684,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 44→89 lines (4 removed) | Also: /* Decode stateReport and call convergence tracker; memset(&sr, 0, sizeof(sr));", + "fix": "Rewrote 44\u219289 lines (4 removed) | Also: /* Decode stateReport and call convergence tracker; memset(&sr, 0, sizeof(sr));", "tags": [ "auto-detected", "refactor", @@ -4732,7 +4732,7 @@ "error_message": "Wrong reference: test_evaluate_repl_action_stream_wal_from_zero should be test_evaluate_repl_action_send_snapshot_lsn_zero", "file": "src/controller/testsuite/test_ha_role.c", "root_cause": "Used \"test_evaluate_repl_action_stream_wal_from_zero\" instead of \"test_evaluate_repl_action_send_snapshot_lsn_zero\"", - "fix": "Changed test_evaluate_repl_action_stream_wal_from_zero → test_evaluate_repl_action_send_snapshot_lsn_zero", + "fix": "Changed test_evaluate_repl_action_stream_wal_from_zero \u2192 test_evaluate_repl_action_send_snapshot_lsn_zero", "tags": [ "auto-detected", "wrong-reference", @@ -4763,7 +4763,7 @@ "timestamp": "2026-06-04T17:34:23.150Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/testsuite/test_config_repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -4780,7 +4780,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 71→93 lines (4 removed)", + "fix": "Rewrote 71\u219293 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -4795,7 +4795,7 @@ "timestamp": "2026-06-04T17:40:05.798Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/config_repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -4844,7 +4844,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 6→15 lines (2 removed)", + "fix": "Rewrote 6\u219215 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -4859,7 +4859,7 @@ "timestamp": "2026-06-04T23:21:45.737Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/config_repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -4876,7 +4876,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_config_repl.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 9→12 lines (2 removed)", + "fix": "Rewrote 9\u219212 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -4892,7 +4892,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-repl-hardening/tasks.md", "root_cause": "9 lines replaced/restructured", - "fix": "Rewrote 9→35 lines (9 removed)", + "fix": "Rewrote 9\u219235 lines (9 removed)", "tags": [ "auto-detected", "refactor", @@ -4908,7 +4908,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 7→10 lines (4 removed) | Also: /* Task 3.5: snapshot transfer.; * Creates a checkpoint in the delaymgr thread (not", + "fix": "Rewrote 7\u219210 lines (4 removed) | Also: /* Task 3.5: snapshot transfer.; * Creates a checkpoint in the delaymgr thread (not", "tags": [ "auto-detected", "refactor", @@ -4988,7 +4988,7 @@ "error_message": "Wrong reference: uintptr_t should be void", "file": "src/controller/testsuite/test_ha_evaluate_committing.c", "root_cause": "Used \"uintptr_t\" instead of \"void\"", - "fix": "Changed uintptr_t → void", + "fix": "Changed uintptr_t \u2192 void", "tags": [ "auto-detected", "wrong-reference", @@ -5004,7 +5004,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "149 lines replaced/restructured", - "fix": "Rewrote 207→38 lines (149 removed)", + "fix": "Rewrote 207\u219238 lines (149 removed)", "tags": [ "auto-detected", "refactor", @@ -5036,7 +5036,7 @@ "error_message": "Wrong reference: 10000 should be 60000", "file": "src/controller/ha.h", "root_cause": "Used \"10000\" instead of \"60000\"", - "fix": "Changed 10000 → 60000", + "fix": "Changed 10000 \u2192 60000", "tags": [ "auto-detected", "wrong-reference", @@ -5052,7 +5052,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 24→42 lines (5 removed)", + "fix": "Rewrote 24\u219242 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -5068,7 +5068,7 @@ "error_message": "Wrong reference: 10000 should be HA_DEFAULT_COMMITTING_TIMEOUT_MS", "file": "src/controller/testsuite/test_ha_evaluate_committing.c", "root_cause": "Used \"10000\" instead of \"HA_DEFAULT_COMMITTING_TIMEOUT_MS\"", - "fix": "Changed 10000 → HA_DEFAULT_COMMITTING_TIMEOUT_MS", + "fix": "Changed 10000 \u2192 HA_DEFAULT_COMMITTING_TIMEOUT_MS", "tags": [ "auto-detected", "wrong-reference", @@ -5083,7 +5083,7 @@ "timestamp": "2026-06-05T05:10:13.646Z", "error_message": "Missing error handling in unknown", "file": "src/controller/config_repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -5099,7 +5099,7 @@ "timestamp": "2026-06-05T05:39:48.707Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_config_repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -5115,7 +5115,7 @@ "timestamp": "2026-06-05T06:50:00Z", "error_message": "3-node startup: majority convergence never fires; cluster falls through to committing_timeout degraded-mode WARN", "file": "src/controller/ha.c", - "root_cause": "ha->n_peers was set to candidates_count (3, total including self) in ha_start_election_async. ha_check_majority_convergence loops i=0..n_peers-1 checking standby_converged[], but standby_converged[] is indexed by votes_idx (relative, self excluded: 0..n_other-1). With n_peers=3, it checked standby_converged[2] which is never set, so n_converged (2) < n_peers (3) always — majority convergence path could never succeed.", + "root_cause": "ha->n_peers was set to candidates_count (3, total including self) in ha_start_election_async. ha_check_majority_convergence loops i=0..n_peers-1 checking standby_converged[], but standby_converged[] is indexed by votes_idx (relative, self excluded: 0..n_other-1). With n_peers=3, it checked standby_converged[2] which is never set, so n_converged (2) < n_peers (3) always \u2014 majority convergence path could never succeed.", "fix": "Changed ha->n_peers = n_peers to ha->n_peers = n_other (= n_peers-1 = other-node count). Moved the assignment after n_other is computed. ha_repl_ack_received quorum formula (ha->n_peers+2)/2 still yields correct majority for both old and new value.", "tags": [ "ha", @@ -5134,7 +5134,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 7→12 lines (2 removed) | Also: /* Disarm any existing poll ctx */; free(old);", + "fix": "Rewrote 7\u219212 lines (2 removed) | Also: /* Disarm any existing poll ctx */; free(old);", "tags": [ "auto-detected", "refactor", @@ -5149,7 +5149,7 @@ "timestamp": "2026-06-05T07:23:00.000Z", "error_message": "AddressSanitizer: attempting double-free on sctx in ha_connect_to_peer", "file": "src/controller/ha.c", - "root_cause": "endpoint_fini calls FREEUP(ep->data) which frees sctx, then ha_connect_to_peer also calls free(sctx) — double-free at lines 3594-3595 and 3600-3601", + "root_cause": "endpoint_fini calls FREEUP(ep->data) which frees sctx, then ha_connect_to_peer also calls free(sctx) \u2014 double-free at lines 3594-3595 and 3600-3601", "fix": "Set ep->data = NULL before endpoint_fini so FREEUP becomes a no-op; then free(sctx) explicitly in the error paths", "tags": [ "double-free", @@ -5165,7 +5165,7 @@ { "id": "bug-007", "timestamp": "2026-06-05T07:23:00.000Z", - "error_message": "AddressSanitizer: heap-use-after-free in liveness_poll_fn at ha.c:3293 — reading ctx->cancelled after ha_arm_heartbeat_timeout_vtask freed the old ctx", + "error_message": "AddressSanitizer: heap-use-after-free in liveness_poll_fn at ha.c:3293 \u2014 reading ctx->cancelled after ha_arm_heartbeat_timeout_vtask freed the old ctx", "file": "src/controller/ha.c", "root_cause": "ha_arm_heartbeat_timeout_vtask freed the old liveness_poll_ctx_t immediately after setting cancelled=1, but the delaymgr task was already in flight reading ctx->cancelled=0 and then continued to read ctx->ha after free", "fix": "ha_arm_heartbeat_timeout_vtask no longer frees old ctx; liveness_poll_fn now frees ctx when it fires with cancelled=1 (guarded by #ifndef XCE_TESTING to avoid bad-free on stack-allocated test ctxs)", @@ -5187,7 +5187,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 41→87 lines (2 removed)", + "fix": "Rewrote 41\u219287 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -5203,7 +5203,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "6 lines replaced/restructured", - "fix": "Rewrote 8→5 lines (6 removed)", + "fix": "Rewrote 8\u21925 lines (6 removed)", "tags": [ "auto-detected", "refactor", @@ -5219,7 +5219,7 @@ "error_message": "Wrong reference: DEBUG2 should be INFO", "file": "src/controller/ha.c", "root_cause": "Used \"DEBUG2\" instead of \"INFO\"", - "fix": "Changed DEBUG2 → INFO", + "fix": "Changed DEBUG2 \u2192 INFO", "tags": [ "auto-detected", "wrong-reference", @@ -5283,7 +5283,7 @@ "error_message": "Significant refactor of ", "file": "src/docs/cluster-config-split-analysis.md", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 11→21 lines (8 removed) | Also: ### Phase 1: Schema split (wire-compatible); 4. **Keep the old `ClusterConfig` fields intact** ", + "fix": "Rewrote 11\u219221 lines (8 removed) | Also: ### Phase 1: Schema split (wire-compatible); 4. **Keep the old `ClusterConfig` fields intact** ", "tags": [ "auto-detected", "refactor", @@ -5299,7 +5299,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/myapp.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 27→36 lines (5 removed)", + "fix": "Rewrote 27\u219236 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -5315,7 +5315,7 @@ "error_message": "Significant refactor of ", "file": "src/lib/raft/raft.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 9→15 lines (4 removed)", + "fix": "Rewrote 9\u219215 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -5331,7 +5331,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "37 lines replaced/restructured", - "fix": "Rewrote 41→4 lines (37 removed)", + "fix": "Rewrote 41\u21924 lines (37 removed)", "tags": [ "auto-detected", "refactor", @@ -5471,7 +5471,7 @@ "error_message": "Wrong reference: last_heartbeat should be voted_for_term", "file": "src/controller/ha.h", "root_cause": "Used \"last_heartbeat\" instead of \"voted_for_term\"", - "fix": "Changed last_heartbeat → voted_for_term", + "fix": "Changed last_heartbeat \u2192 voted_for_term", "tags": [ "auto-detected", "wrong-reference", @@ -5487,7 +5487,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/myapp.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 13→17 lines (4 removed)", + "fix": "Rewrote 13\u219217 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -5538,7 +5538,7 @@ "timestamp": "2026-06-10T01:36:59.112Z", "error_message": "Missing error handling in unknown", "file": "src/schema/controller.capnp", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -5554,7 +5554,7 @@ "timestamp": "2026-06-10T01:37:29.771Z", "error_message": "Missing error handling in struct", "file": "src/include/typemap.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -5571,7 +5571,7 @@ "error_message": "Significant refactor of ", "file": "src/include/typemap.h", "root_cause": "6 lines replaced/restructured", - "fix": "Rewrote 16→31 lines (6 removed)", + "fix": "Rewrote 16\u219231 lines (6 removed)", "tags": [ "auto-detected", "refactor", @@ -5586,7 +5586,7 @@ "timestamp": "2026-06-10T01:38:31.262Z", "error_message": "Missing error handling in unknown", "file": "src/include/request.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -5618,7 +5618,7 @@ "timestamp": "2026-06-10T01:39:31.683Z", "error_message": "Missing error handling in unknown", "file": "src/lib/request.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block | Also: if (req->body_which == Request_body_walcatchupentrymsg; && req->body.walcatchupentrymsg != NULL) { | Also: /* wal_entry_to_wire: fill a wire WalCatchupEntry from a C e; * fields and raw payload bytes. Sub-entry nesting is one le", "tags": [ "auto-detected", @@ -5653,7 +5653,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 29→32 lines (4 removed)", + "fix": "Rewrote 29\u219232 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -5669,7 +5669,7 @@ "error_message": "Wrong reference: payload should be raw_payload", "file": "src/controller/config_repl.c", "root_cause": "Used \"payload\" instead of \"raw_payload\"", - "fix": "Changed payload → raw_payload", + "fix": "Changed payload \u2192 raw_payload", "tags": [ "auto-detected", "wrong-reference", @@ -5685,7 +5685,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 13→16 lines (2 removed)", + "fix": "Rewrote 13\u219216 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -5701,7 +5701,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_role.c", "root_cause": "7 lines replaced/restructured", - "fix": "Rewrote 49→137 lines (7 removed)", + "fix": "Rewrote 49\u2192137 lines (7 removed)", "tags": [ "auto-detected", "refactor", @@ -5716,7 +5716,7 @@ "timestamp": "2026-06-10T01:49:36.997Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -5785,7 +5785,7 @@ "error_message": "Significant refactor of ", "file": "src/scheduler/src/scheduler.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 4→6 lines (4 removed)", + "fix": "Rewrote 4\u21926 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -5838,7 +5838,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 9→15 lines (4 removed)", + "fix": "Rewrote 9\u219215 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -5870,7 +5870,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 8→13 lines (3 removed) | Also: /* Req 4.1: ctrlhello counts as primary activity —; if ((ctrl_role_t)atomic_load_explicit(&c->ha.role,", + "fix": "Rewrote 8\u219213 lines (3 removed) | Also: /* Req 4.1: ctrlhello counts as primary activity \u2014; if ((ctrl_role_t)atomic_load_explicit(&c->ha.role,", "tags": [ "auto-detected", "refactor", @@ -5886,7 +5886,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 6→12 lines (3 removed)", + "fix": "Rewrote 6\u219212 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -5901,7 +5901,7 @@ "timestamp": "2026-06-10T07:56:21.347Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/testsuite/test_repl_unit.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block | Also: /* =========================================================; * Task 1.1: repl_broadcast send path tests", "tags": [ "auto-detected", @@ -5918,7 +5918,7 @@ "error_message": "Wrong reference: WAL_JOB should be WAL_JOB_SUBMIT", "file": "src/controller/testsuite/test_repl_unit.c", "root_cause": "Used \"WAL_JOB\" instead of \"WAL_JOB_SUBMIT\"", - "fix": "Changed WAL_JOB → WAL_JOB_SUBMIT", + "fix": "Changed WAL_JOB \u2192 WAL_JOB_SUBMIT", "tags": [ "auto-detected", "wrong-reference", @@ -5933,7 +5933,7 @@ "timestamp": "2026-06-10T07:58:15.167Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -5950,7 +5950,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/repl.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 42→65 lines (3 removed)", + "fix": "Rewrote 42\u219265 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -5966,7 +5966,7 @@ "error_message": "Wrong reference: DEBUG3 should be TRACE", "file": "src/controller/repl.c", "root_cause": "Used \"DEBUG3\" instead of \"TRACE\"", - "fix": "Changed DEBUG3 → TRACE", + "fix": "Changed DEBUG3 \u2192 TRACE", "tags": [ "auto-detected", "wrong-reference", @@ -5982,7 +5982,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.h", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 12→16 lines (3 removed)", + "fix": "Rewrote 12\u219216 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -5998,7 +5998,7 @@ "error_message": "Wrong reference: request should be ep", "file": "src/controller/cluster.c", "root_cause": "Used \"request\" instead of \"ep\"", - "fix": "Changed request → ep", + "fix": "Changed request \u2192 ep", "tags": [ "auto-detected", "wrong-reference", @@ -6013,7 +6013,7 @@ "timestamp": "2026-06-10T08:47:48.296Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_ha_role.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block | Also: /* Task 3.3 (ha-wal-replication): dispatch gate standby-role; RUN_TEST(test_dispatch_gate_allows_wal_catchup_in_standby_ro", "tags": [ "auto-detected", @@ -6029,7 +6029,7 @@ "timestamp": "2026-06-10T08:50:27.397Z", "error_message": "Missing error handling in struct", "file": "src/include/typemap.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6061,7 +6061,7 @@ "timestamp": "2026-06-10T09:59:08.979Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/testsuite/test_p2_integration.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6096,7 +6096,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_p2_integration.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 50→72 lines (4 removed)", + "fix": "Rewrote 50\u219272 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -6112,7 +6112,7 @@ "error_message": "Wrong reference: test_catchup_full_lifecycle_integration should be test_single_node_committed_lsn_unchanged", "file": "src/controller/testsuite/test_p2_integration.c", "root_cause": "Used \"test_catchup_full_lifecycle_integration\" instead of \"test_single_node_committed_lsn_unchanged\"", - "fix": "Changed test_catchup_full_lifecycle_integration → test_single_node_committed_lsn_unchanged", + "fix": "Changed test_catchup_full_lifecycle_integration \u2192 test_single_node_committed_lsn_unchanged", "tags": [ "auto-detected", "wrong-reference", @@ -6127,7 +6127,7 @@ "timestamp": "2026-06-10T10:37:49.028Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_repl_unit.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6160,7 +6160,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/steering/product.md", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 13→22 lines (5 removed)", + "fix": "Rewrote 13\u219222 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -6192,7 +6192,7 @@ "error_message": "Significant refactor of ", "file": "CLAUDE.md", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 5→5 lines (4 removed)", + "fix": "Rewrote 5\u21925 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -6224,7 +6224,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/CLAUDE.md", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 6→5 lines (3 removed) | Also: ### Controllers; - Struct: `type {Resource}Controller struct{}`", + "fix": "Rewrote 6\u21925 lines (3 removed) | Also: ### Controllers; - Struct: `type {Resource}Controller struct{}`", "tags": [ "auto-detected", "refactor", @@ -6256,7 +6256,7 @@ "error_message": "Wrong reference: signal should be stdio", "file": "src/lib/delay.c", "root_cause": "Used \"signal\" instead of \"stdio\"", - "fix": "Changed signal → stdio", + "fix": "Changed signal \u2192 stdio", "tags": [ "auto-detected", "wrong-reference", @@ -6271,7 +6271,7 @@ "timestamp": "2026-06-11T03:30:54.341Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/ha.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6320,7 +6320,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/job.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 15→28 lines (2 removed)", + "fix": "Rewrote 15\u219228 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -6352,7 +6352,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-consistency-invariants/research.md", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 7→7 lines (3 removed)", + "fix": "Rewrote 7\u21927 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -6387,7 +6387,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-consistency-invariants/requirements.md", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 3→4 lines (2 removed)", + "fix": "Rewrote 3\u21924 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -6466,7 +6466,7 @@ "timestamp": "2026-06-11T07:53:43.868Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-consistency-invariants/research.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6498,7 +6498,7 @@ "timestamp": "2026-06-11T08:46:20.815Z", "error_message": "Missing error handling in unknown", "file": ".kiro/steering/roadmap.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6579,7 +6579,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/steering/roadmap.md", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 6→8 lines (4 removed)", + "fix": "Rewrote 6\u21928 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -6594,7 +6594,7 @@ "timestamp": "2026-06-11T13:30:00Z", "error_message": "test_commit_engine fixture: Expected 0 Was 1 from repl_add_standby", "file": "src/controller/testsuite/test_commit_engine.c", - "root_cause": "repl_add_standby returns the slot index (>=0) on success, not 0 — second add legitimately returns 1", + "root_cause": "repl_add_standby returns the slot index (>=0) on success, not 0 \u2014 second add legitimately returns 1", "fix": "fixture asserts TEST_ASSERT_EQUAL_INT(i, repl_add_standby(...)) per standby slot", "tags": [ "controller", @@ -6611,8 +6611,8 @@ "timestamp": "2026-06-11T13:35:00Z", "error_message": "3 pre-existing controller testsuite failures masked by exit code 0: test_committed_lsn_does_not_advance_on_timeout (-110), test_repl_ack_after_promote_gate_allows_jobsub (-10013), test_rdhup_primary_dispatch_gate_opens (-10013)", "file": "src/controller/testsuite/controller_test.c", - "root_cause": "each test group calls UNITY_BEGIN/UNITY_END internally, resetting Unity counters — main()'s final UNITY_END returns 0 unless the LAST group fails, so meson reported the suite green despite 3 real failures; Unity also misattributes failure FILE names to whichever file's UNITY_BEGIN ran (e.g. reports test_repl_unit.c for a test living in test_p2_integration.c)", - "fix": "not fixed (out of task 1.1 boundary) — documented; failures exist identically on baseline without ha-commit-engine changes (verified by stash/rebuild). persist_wal_sync_append returns -ETIMEDOUT while the test expects rc==0 with sync_rc==-ETIMEDOUT; the two gate tests fail ha_has_write_quorum (standby_endpoints empty with n_peers=2)", + "root_cause": "each test group calls UNITY_BEGIN/UNITY_END internally, resetting Unity counters \u2014 main()'s final UNITY_END returns 0 unless the LAST group fails, so meson reported the suite green despite 3 real failures; Unity also misattributes failure FILE names to whichever file's UNITY_BEGIN ran (e.g. reports test_repl_unit.c for a test living in test_p2_integration.c)", + "fix": "not fixed (out of task 1.1 boundary) \u2014 documented; failures exist identically on baseline without ha-commit-engine changes (verified by stash/rebuild). persist_wal_sync_append returns -ETIMEDOUT while the test expects rc==0 with sync_rc==-ETIMEDOUT; the two gate tests fail ha_has_write_quorum (standby_endpoints empty with n_peers=2)", "tags": [ "controller", "testsuite", @@ -6631,7 +6631,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/commit.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 11→21 lines (2 removed) | Also: (void)timeout_ms; /* RETAIN never honors the timeo; * via commit_on_ack (Req 2.1). */", + "fix": "Rewrote 11\u219221 lines (2 removed) | Also: (void)timeout_ms; /* RETAIN never honors the timeo; * via commit_on_ack (Req 2.1). */", "tags": [ "auto-detected", "refactor", @@ -6646,8 +6646,8 @@ "timestamp": "2026-06-11T15:28:35.990Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_commit_engine.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", - "fix": "Added try/catch block | Also: /* ═════════════════════════════════════════════════════════; * Task 3.1 — membership re-evaluation (commit_on_membership_ | Also: /* Task 3.1 — membership re-evaluation */; RUN_TEST(test_catchup_standby_ack_does_not_count_toward_pend", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", + "fix": "Added try/catch block | Also: /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550; * Task 3.1 \u2014 membership re-evaluation (commit_on_membership_ | Also: /* Task 3.1 \u2014 membership re-evaluation */; RUN_TEST(test_catchup_standby_ack_does_not_count_toward_pend", "tags": [ "auto-detected", "error-handling", @@ -6662,7 +6662,7 @@ "timestamp": "2026-06-11T15:55:52.451Z", "error_message": "Missing error handling in unknown", "file": "src/include/repl.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6678,7 +6678,7 @@ "timestamp": "2026-06-11T15:56:20.945Z", "error_message": "Missing error handling in unknown", "file": "src/controller/repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6695,7 +6695,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_commit_engine.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 10→15 lines (2 removed)", + "fix": "Rewrote 10\u219215 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -6710,7 +6710,7 @@ "timestamp": "2026-06-11T15:57:43.900Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_commit_engine.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6726,7 +6726,7 @@ "timestamp": "2026-06-11T16:15:06.660Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-commit-engine/tasks.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6742,7 +6742,7 @@ "timestamp": "2026-06-11T16:19:30.370Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6758,8 +6758,8 @@ "timestamp": "2026-06-11T16:19:51.195Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_commit_engine.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", - "fix": "Added try/catch block | Also: /* Task 4.2 — wired gate: registry truth at ha_dispatch_gate; RUN_TEST(test_gate_wired_registry_catchup_standby_rejects_th", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", + "fix": "Added try/catch block | Also: /* Task 4.2 \u2014 wired gate: registry truth at ha_dispatch_gate; RUN_TEST(test_gate_wired_registry_catchup_standby_rejects_th", "tags": [ "auto-detected", "error-handling", @@ -6790,7 +6790,7 @@ "timestamp": "2026-06-11T16:23:59.453Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6806,8 +6806,8 @@ "timestamp": "2026-06-11T22:39:24.704Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_commit_engine.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", - "fix": "Added try/catch block | Also: /* ═════════════════════════════════════════════════════════; * Task 5.1 — integration: ACK feed and the job-submit sync-a | Also: #include \"typemap.h\" /* wal_catchup_entry_t (task 5; #include \"wal_types.h\" /* WAL_JOB_SUBMIT (task 5.1 sy", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", + "fix": "Added try/catch block | Also: /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550; * Task 5.1 \u2014 integration: ACK feed and the job-submit sync-a | Also: #include \"typemap.h\" /* wal_catchup_entry_t (task 5; #include \"wal_types.h\" /* WAL_JOB_SUBMIT (task 5.1 sy", "tags": [ "auto-detected", "error-handling", @@ -6855,7 +6855,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/repl.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 13→27 lines (5 removed)", + "fix": "Rewrote 13\u219227 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -6870,7 +6870,7 @@ "timestamp": "2026-06-11T23:32:42.365Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-commit-engine/tasks.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -6919,7 +6919,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/persist.c", "root_cause": "16 lines replaced/restructured", - "fix": "Rewrote 40→67 lines (16 removed)", + "fix": "Rewrote 40\u219267 lines (16 removed)", "tags": [ "auto-detected", "refactor", @@ -6967,7 +6967,7 @@ "error_message": "Wrong reference: test_single_node_committed_lsn_unchanged should be test_single_node_committed_lsn_advances", "file": "src/controller/testsuite/test_p2_integration.c", "root_cause": "Used \"test_single_node_committed_lsn_unchanged\" instead of \"test_single_node_committed_lsn_advances\"", - "fix": "Changed test_single_node_committed_lsn_unchanged → test_single_node_committed_lsn_advances", + "fix": "Changed test_single_node_committed_lsn_unchanged \u2192 test_single_node_committed_lsn_advances", "tags": [ "auto-detected", "wrong-reference", @@ -7068,7 +7068,7 @@ "timestamp": "2026-06-12T04:13:06.326Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-commit-barrier-rollout/tasks.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -7101,7 +7101,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/persist.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 7→12 lines (4 removed) | Also: return persist_wal_async(p, wal_type, &js, sizeof(; persist_t* p = cls; | Also: int rc = persist_wal_async(p, wal_type, pkt, (uint; persist_t* p = cls;", + "fix": "Rewrote 7\u219212 lines (4 removed) | Also: return persist_wal_async(p, wal_type, &js, sizeof(; persist_t* p = cls; | Also: int rc = persist_wal_async(p, wal_type, pkt, (uint; persist_t* p = cls;", "tags": [ "auto-detected", "refactor", @@ -7149,7 +7149,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_commit_barrier_reply.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 3→5 lines (2 removed) | Also: static xce_signal_t g_sigkill = { .signo = SIGKIL; static xce_jobctrl_t g_jobctrl;", + "fix": "Rewrote 3\u21925 lines (2 removed) | Also: static xce_signal_t g_sigkill = { .signo = SIGKIL; static xce_jobctrl_t g_jobctrl;", "tags": [ "auto-detected", "refactor", @@ -7257,7 +7257,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_commit_barrier_reply.c", "root_cause": "7 lines replaced/restructured", - "fix": "Rewrote 12→56 lines (7 removed) | Also: xce_job_t jdef;; static int jobobj_ready; /* jobj module tables — o", + "fix": "Rewrote 12\u219256 lines (7 removed) | Also: xce_job_t jdef;; static int jobobj_ready; /* jobj module tables \u2014 o", "tags": [ "auto-detected", "refactor", @@ -7272,7 +7272,7 @@ "timestamp": "2026-06-12T11:05:00-07:00", "error_message": "va_list type confusion: WAL_JOB_RUSAGE hook payload reads job_t fields from an xce_job_rusages_t*", "file": "src/controller/job.c (caller) / src/controller/persist.c (consumer)", - "root_cause": "update_job_rusages fires AFTER_EVENT HOOK_DETAIL_JOB_RUSAGE_UPDATE with (cluster_t*, xce_job_rusages_t*) at job.c:1015-1016, but persist_job_hook_fun's default arm (persist.c:1354-1359) reads the second vararg as job_t* and dereferences j->job.state at offset 56 == sizeof(xce_job_rusages_t) — an out-of-bounds read on an exactly-sized allocation; the WAL_JOB_RUSAGE payload state field is garbage (jobid at offset 0 lines up by accident)", + "root_cause": "update_job_rusages fires AFTER_EVENT HOOK_DETAIL_JOB_RUSAGE_UPDATE with (cluster_t*, xce_job_rusages_t*) at job.c:1015-1016, but persist_job_hook_fun's default arm (persist.c:1354-1359) reads the second vararg as job_t* and dereferences j->job.state at offset 56 == sizeof(xce_job_rusages_t) \u2014 an out-of-bounds read on an exactly-sized allocation; the WAL_JOB_RUSAGE payload state field is garbage (jobid at offset 0 lines up by accident)", "fix": "NOT FIXED (discovered while writing task 3.3 receipt-ACK verdict pins; production out of boundary). Test test_update_op_rusage_receipt_reply_facts_retained uses a padded union so the pin stays in-bounds under ASAN without masking the bug; fix candidates: dedicated RUSAGE arm in persist_job_hook_fun reading xce_job_rusages_t*, or fire the hook with (c, j) like the other job hooks", "tags": [ "pre-existing", @@ -7313,7 +7313,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_repl_majority.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 3→10 lines (3 removed) | Also: * walAck half is engine-wired per-LSN; the configA; * byte-identical legacy behavior (config barrier o | Also: /* upgradeConfigAck with no pending ACKs → timeout; int rc_cfg = repl_wait_majority_ack(&g_mp.repl, 0,", + "fix": "Rewrote 3\u219210 lines (3 removed) | Also: * walAck half is engine-wired per-LSN; the configA; * byte-identical legacy behavior (config barrier o | Also: /* upgradeConfigAck with no pending ACKs \u2192 timeout; int rc_cfg = repl_wait_majority_ack(&g_mp.repl, 0,", "tags": [ "auto-detected", "refactor", @@ -7329,7 +7329,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/repl.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 6→11 lines (5 removed)", + "fix": "Rewrote 6\u219211 lines (5 removed)", "tags": [ "auto-detected", "refactor", @@ -7345,7 +7345,7 @@ "error_message": "Significant refactor of ", "file": "src/include/repl.h", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 4→7 lines (4 removed)", + "fix": "Rewrote 4\u21927 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -7361,7 +7361,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "28 lines replaced/restructured", - "fix": "Rewrote 73→85 lines (28 removed) | Also: /* 7. Push to standbys (best-effort; see push_conf; int acked = push_config_to_standbys(c, out_bytes, | Also: * 7. Push to standbys (best-effort); * 8. ACK admin tool", + "fix": "Rewrote 73\u219285 lines (28 removed) | Also: /* 7. Push to standbys (best-effort; see push_conf; int acked = push_config_to_standbys(c, out_bytes, | Also: * 7. Push to standbys (best-effort); * 8. ACK admin tool", "tags": [ "auto-detected", "refactor", @@ -7392,7 +7392,7 @@ "timestamp": "2026-06-13T00:19:39.908Z", "error_message": "Missing error handling in unknown", "file": "src/controller/config_repl.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -7430,7 +7430,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.c", "root_cause": "7 lines replaced/restructured", - "fix": "Rewrote 14→19 lines (7 removed) | Also: cluster_t *c, const char *msg); reply.status = -EINVAL;", + "fix": "Rewrote 14\u219219 lines (7 removed) | Also: cluster_t *c, const char *msg); reply.status = -EINVAL;", "tags": [ "auto-detected", "refactor", @@ -7462,7 +7462,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/config_repl.h", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 22→39 lines (8 removed)", + "fix": "Rewrote 22\u219239 lines (8 removed)", "tags": [ "auto-detected", "refactor", @@ -7478,7 +7478,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "6 lines replaced/restructured", - "fix": "Rewrote 10→18 lines (6 removed)", + "fix": "Rewrote 10\u219218 lines (6 removed)", "tags": [ "auto-detected", "refactor", @@ -7493,7 +7493,7 @@ "timestamp": "2026-06-13T01:14:15.668Z", "error_message": "Missing error handling in unknown", "file": "src/controller/join.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -7598,7 +7598,7 @@ "error_message": "Wrong reference: test_ha_cluster should be test_ha_role_lifecycle", "file": "src/controller/testsuite/controller_test.c", "root_cause": "Used \"test_ha_cluster\" instead of \"test_ha_role_lifecycle\"", - "fix": "Changed test_ha_cluster → test_ha_role_lifecycle", + "fix": "Changed test_ha_cluster \u2192 test_ha_role_lifecycle", "tags": [ "auto-detected", "wrong-reference", @@ -7630,7 +7630,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_role_lifecycle.c", "root_cause": "15 lines replaced/restructured", - "fix": "Rewrote 64→108 lines (15 removed)", + "fix": "Rewrote 64\u2192108 lines (15 removed)", "tags": [ "auto-detected", "refactor", @@ -7662,7 +7662,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_role_lifecycle.c", "root_cause": "21 lines replaced/restructured", - "fix": "Rewrote 35→57 lines (21 removed) | Also: /* ── Case 3: HOOKS REGISTERED BY THE SHARED PROMO; * canonical promotion entry point ha_promote_to_pr", + "fix": "Rewrote 35\u219257 lines (21 removed) | Also: /* \u2500\u2500 Case 3: HOOKS REGISTERED BY THE SHARED PROMO; * canonical promotion entry point ha_promote_to_pr", "tags": [ "auto-detected", "refactor", @@ -7678,7 +7678,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 10→14 lines (5 removed) | Also: /* Start primary heartbeat immediately in COMMITTI; * NOP during the committing window and their liven", + "fix": "Rewrote 10\u219214 lines (5 removed) | Also: /* Start primary heartbeat immediately in COMMITTI; * NOP during the committing window and their liven", "tags": [ "auto-detected", "refactor", @@ -7706,7 +7706,7 @@ }, { "error_message": "AddressSanitizer: global-buffer-overflow in xce_wal_batch_req_raw <- repl_broadcast <- persist_wal_async <- ha_arm_own_term_gate <- ha_promote_to_primary, during test_promotion_registers_persist_hooks (test_ha_role_lifecycle.c case 3)", - "file": "src/controller/testsuite/test_ha_role_lifecycle.c (fixture defect — OUT OF task 2.2 boundary)", + "file": "src/controller/testsuite/test_ha_role_lifecycle.c (fixture defect \u2014 OUT OF task 2.2 boundary)", "root_cause": "task-2.2's ha_promote_to_primary now appends a WAL_NOOP via persist_wal_async, which broadcasts to registered standbys. The lifecycle fixture (lifecycle_cluster_setup) registers fake `int g_lc_eps[]` endpoints via repl_add_standby and NEVER installs repl_broadcast_send_hook, so repl_broadcast calls xce_wal_batch_req_raw(s->ep) and reads ep->peer (offset 36) past the 4-byte int. IDENTICAL to the prior test_p2_integration tests 8/9 bug already in buglog.", "fix": "Test-side fix (parent must apply, mirrors the documented p2_integration fix): in test_ha_role_lifecycle.c add `extern int (*repl_broadcast_send_hook)(void*, wal_catchup_entry_t**, int);` and a no-op drop hook, install it in lifecycle_cluster_setup before promotion (reset to NULL in teardown), and cast endpoints to (void*). Production ha.c is correct per design (persist_wal_async appends+broadcasts by design).", "tags": [ @@ -7726,9 +7726,9 @@ }, { "error_message": "task-2.1 lifecycle fixture off-by-one: case 5/6/7 assert writable_lsn==noop_lsn and current_lsn==noop_lsn+1, but lifecycle_cluster_setup primes current_lsn = appended_lsn + 1, so a real persist_wal_async appends the noop at appended_lsn+1 (current_lsn->appended_lsn+2), giving noop_lsn=appended_lsn+1 != asserted appended_lsn.", - "file": "src/controller/testsuite/test_ha_role_lifecycle.c (fixture defect — OUT OF task 2.2 boundary)", + "file": "src/controller/testsuite/test_ha_role_lifecycle.c (fixture defect \u2014 OUT OF task 2.2 boundary)", "root_cause": "persist_wal_async assigns hdr.lsn = current_lsn++ (entry takes the CURRENT value). The fixture comment assumes the next append takes current_lsn-1, which is off by one. To make the noop land at `appended_lsn`, the prime must be `current_lsn = appended_lsn`, not `appended_lsn + 1`.", - "fix": "Test-side fix (parent): set g_lc.persist.current_lsn = appended_lsn in lifecycle_cluster_setup. Production noop_lsn = current_lsn-1 (post-append) is correct per design §Promotion Rewrite / brief.", + "fix": "Test-side fix (parent): set g_lc.persist.current_lsn = appended_lsn in lifecycle_cluster_setup. Production noop_lsn = current_lsn-1 (post-append) is correct per design \u00a7Promotion Rewrite / brief.", "tags": [ "ha-single-leader-role", "task-2.2", @@ -7748,7 +7748,7 @@ "timestamp": "2026-06-13T08:56:36.044Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/testsuite/test_ha_role_lifecycle.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -7781,7 +7781,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_role_lifecycle.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 5→7 lines (2 removed)", + "fix": "Rewrote 5\u21927 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -7845,7 +7845,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "11 lines replaced/restructured", - "fix": "Rewrote 16→4 lines (11 removed) | Also: /* Task 5.2: After updating convergence tracking, ; * majority of standbys have converged and promote ", + "fix": "Rewrote 16\u21924 lines (11 removed) | Also: /* Task 5.2: After updating convergence tracking, ; * majority of standbys have converged and promote ", "tags": [ "auto-detected", "refactor", @@ -7861,7 +7861,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/meson.build", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 5→3 lines (2 removed)", + "fix": "Rewrote 5\u21923 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -7877,7 +7877,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/controller_test.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 5→3 lines (2 removed) | Also: TEST(test_ha_evaluate_committing);; TEST(test_ha_repl_ack);", + "fix": "Rewrote 5\u21923 lines (2 removed) | Also: TEST(test_ha_evaluate_committing);; TEST(test_ha_repl_ack);", "tags": [ "auto-detected", "refactor", @@ -7893,7 +7893,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_role.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→10 lines (2 removed)", + "fix": "Rewrote 4\u219210 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -7909,7 +7909,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_role.c", "root_cause": "196 lines replaced/restructured", - "fix": "Rewrote 230→12 lines (196 removed) | Also: /* ── Task 5.3: committing timeout default value a; * Requirements: 6.4, 7.5 (ha-repl-hardening)", + "fix": "Rewrote 230\u219212 lines (196 removed) | Also: /* \u2500\u2500 Task 5.3: committing timeout default value a; * Requirements: 6.4, 7.5 (ha-repl-hardening)", "tags": [ "auto-detected", "refactor", @@ -7925,7 +7925,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_rdhup_integration.c", "root_cause": "34 lines replaced/restructured", - "fix": "Rewrote 48→9 lines (34 removed) | Also: * Test 4: 3-node cluster RDHUP — two acks needed, ; * | Also: /* Drive to CTRL_PRIMARY via ack */; ha_repl_ack_received(&c.ha, &c); | Also: RUN_TEST(test_rdhup_committing_to_primary_on_ack);; RUN_TEST(test_rdhup_3node_one_ack_promotes);", + "fix": "Rewrote 48\u21929 lines (34 removed) | Also: * Test 4: 3-node cluster RDHUP \u2014 two acks needed, ; * | Also: /* Drive to CTRL_PRIMARY via ack */; ha_repl_ack_received(&c.ha, &c); | Also: RUN_TEST(test_rdhup_committing_to_primary_on_ack);; RUN_TEST(test_rdhup_3node_one_ack_promotes);", "tags": [ "auto-detected", "refactor", @@ -7941,7 +7941,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_connection_reuse.c", "root_cause": "26 lines replaced/restructured", - "fix": "Rewrote 35→8 lines (26 removed) | Also: /* ── Test 10 (Task 7.3): promoted connection carr; *", + "fix": "Rewrote 35\u21928 lines (26 removed) | Also: /* \u2500\u2500 Test 10 (Task 7.3): promoted connection carr; *", "tags": [ "auto-detected", "refactor", @@ -7956,7 +7956,7 @@ "timestamp": "2026-06-13T12:04:59.483Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-single-leader-role/tasks.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -7989,7 +7989,7 @@ "error_message": "Wrong reference: CTRL_PRIMARY_COMMITTING should be CTRL_PRIMARY", "file": "src/controller/ha.c", "root_cause": "Used \"CTRL_PRIMARY_COMMITTING\" instead of \"CTRL_PRIMARY\"", - "fix": "Changed CTRL_PRIMARY_COMMITTING → CTRL_PRIMARY", + "fix": "Changed CTRL_PRIMARY_COMMITTING \u2192 CTRL_PRIMARY", "tags": [ "auto-detected", "wrong-reference", @@ -8005,7 +8005,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_role.c", "root_cause": "21 lines replaced/restructured", - "fix": "Rewrote 24→5 lines (21 removed) | Also: /* Task 5.3: committing timeout config-default kno; * survives until task 5.2; the degraded-mode commi", + "fix": "Rewrote 24\u21925 lines (21 removed) | Also: /* Task 5.3: committing timeout config-default kno; * survives until task 5.2; the degraded-mode commi", "tags": [ "auto-detected", "refactor", @@ -8037,7 +8037,7 @@ "error_message": "Wrong reference: CTRL_PRIMARY_COMMITTING should be CTRL_PRIMARY", "file": "src/controller/testsuite/test_ha_connection_reuse.c", "root_cause": "Used \"CTRL_PRIMARY_COMMITTING\" instead of \"CTRL_PRIMARY\"", - "fix": "Changed CTRL_PRIMARY_COMMITTING → CTRL_PRIMARY", + "fix": "Changed CTRL_PRIMARY_COMMITTING \u2192 CTRL_PRIMARY", "tags": [ "auto-detected", "wrong-reference", @@ -8068,7 +8068,7 @@ "timestamp": "2026-06-13T13:14:03.917Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_ha_startup.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -8101,7 +8101,7 @@ "error_message": "Wrong reference: test_nonblocking_single_node_election_enters_committing should be test_nonblocking_single_node_election_enters_primary_directly", "file": "src/controller/testsuite/test_ha_startup.c", "root_cause": "Used \"test_nonblocking_single_node_election_enters_committing\" instead of \"test_nonblocking_single_node_election_enters_primary_directly\"", - "fix": "Changed test_nonblocking_single_node_election_enters_committing → test_nonblocking_single_node_election_enters_primary_directly", + "fix": "Changed test_nonblocking_single_node_election_enters_committing \u2192 test_nonblocking_single_node_election_enters_primary_directly", "tags": [ "auto-detected", "wrong-reference", @@ -8117,7 +8117,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_rdhup_integration.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 3→4 lines (3 removed)", + "fix": "Rewrote 3\u21924 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -8152,7 +8152,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.h", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→3 lines (2 removed)", + "fix": "Rewrote 4\u21923 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -8168,7 +8168,7 @@ "error_message": "Wrong reference: uint32_t should be ha_config_t", "file": "src/controller/ha.h", "root_cause": "Used \"uint32_t\" instead of \"ha_config_t\"", - "fix": "Changed uint32_t → ha_config_t", + "fix": "Changed uint32_t \u2192 ha_config_t", "tags": [ "auto-detected", "wrong-reference", @@ -8184,7 +8184,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_role.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 7→4 lines (2 removed)", + "fix": "Rewrote 7\u21924 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -8199,8 +8199,8 @@ "timestamp": "2026-06-13T14:43:54.194Z", "error_message": "Incorrect value in code", "file": ".kiro/steering/ha-async-io.md", - "root_cause": "Had `CTRL_PRIMARY_COMMITTING → CTRL_PRIMARY`", - "fix": "Changed to 's own-term commit rule (§5.4.2): an election winn", + "root_cause": "Had `CTRL_PRIMARY_COMMITTING \u2192 CTRL_PRIMARY`", + "fix": "Changed to 's own-term commit rule (\u00a75.4.2): an election winn", "tags": [ "auto-detected", "wrong-value", @@ -8215,8 +8215,8 @@ "timestamp": "2026-06-13T14:54:21.781Z", "error_message": "Incorrect value in code", "file": ".claude/skills/xce-deploy-ha/SKILL.md", - "root_cause": "Had `→ CTRL_PRIMARY_COMMITTING`", - "fix": "Changed to `HA FSM (raft): → CTRL_PRIMARY (term=...)`", + "root_cause": "Had `\u2192 CTRL_PRIMARY_COMMITTING`", + "fix": "Changed to `HA FSM (raft): \u2192 CTRL_PRIMARY (term=...)`", "tags": [ "auto-detected", "wrong-value", @@ -8231,8 +8231,8 @@ "timestamp": "2026-06-13T15:31:21.740Z", "error_message": "Incorrect value in code", "file": "../../../../../claude/.claude/projects/-home-rshen-projects-xce-xce/memory/project_ha_consistency_invariants.md", - "root_cause": "Had \"XCE HA Raft+CP umbrella — sub-specs 1&2 of 4 IMPL", - "fix": "Changed to \"XCE HA Raft+CP umbrella — sub-specs 1,2,3 of 4 IM", + "root_cause": "Had \"XCE HA Raft+CP umbrella \u2014 sub-specs 1&2 of 4 IMPL", + "fix": "Changed to \"XCE HA Raft+CP umbrella \u2014 sub-specs 1,2,3 of 4 IM", "tags": [ "auto-detected", "wrong-value", @@ -8248,7 +8248,7 @@ "error_message": "Wrong reference: stdint should be stdbool", "file": "src/controller/include/cluster.h", "root_cause": "Used \"stdint\" instead of \"stdbool\"", - "fix": "Changed stdint → stdbool", + "fix": "Changed stdint \u2192 stdbool", "tags": [ "auto-detected", "wrong-reference", @@ -8264,7 +8264,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_egress_filter.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 7→17 lines (4 removed) | Also: /* ── Cross-module link stubs (dataex.c/misc.c/sch; /* clang-format off */", + "fix": "Rewrote 7\u219217 lines (4 removed) | Also: /* \u2500\u2500 Cross-module link stubs (dataex.c/misc.c/sch; /* clang-format off */", "tags": [ "auto-detected", "refactor", @@ -8280,7 +8280,7 @@ "error_message": "Wrong reference: xlist_destroy should be xlist_fini", "file": "src/controller/testsuite/test_egress_filter.c", "root_cause": "Used \"xlist_destroy\" instead of \"xlist_fini\"", - "fix": "Changed xlist_destroy → xlist_fini", + "fix": "Changed xlist_destroy \u2192 xlist_fini", "tags": [ "auto-detected", "wrong-reference", @@ -8328,7 +8328,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_egress_filter.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 12→17 lines (2 removed) | Also: jdef.jobid = 202;; jdef.state = JOB_STAT_PEND;", + "fix": "Rewrote 12\u219217 lines (2 removed) | Also: jdef.jobid = 202;; jdef.state = JOB_STAT_PEND;", "tags": [ "auto-detected", "refactor", @@ -8360,7 +8360,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/persist.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→6 lines (2 removed) | Also: extern int restore_job(cluster_t* c, uint64_t jobi; extern int restore_job_old_unused(cluster_t* c, ui", + "fix": "Rewrote 4\u21926 lines (2 removed) | Also: extern int restore_job(cluster_t* c, uint64_t jobi; extern int restore_job_old_unused(cluster_t* c, ui", "tags": [ "auto-detected", "refactor", @@ -8408,7 +8408,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 9→4 lines (8 removed)", + "fix": "Rewrote 9\u21924 lines (8 removed)", "tags": [ "auto-detected", "refactor", @@ -8440,7 +8440,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/include/cluster.h", "root_cause": "8 lines replaced/restructured", - "fix": "Rewrote 12→3 lines (8 removed)", + "fix": "Rewrote 12\u21923 lines (8 removed)", "tags": [ "auto-detected", "refactor", @@ -8472,7 +8472,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_demotion_convergence.c", "root_cause": "11 lines replaced/restructured", - "fix": "Rewrote 16→34 lines (11 removed)", + "fix": "Rewrote 16\u219234 lines (11 removed)", "tags": [ "auto-detected", "refactor", @@ -8488,7 +8488,7 @@ "error_message": "AddressSanitizer: heap-use-after-free in ha_rejoin_reconcile_fn (ha_convergence.c:236) during test_rejoin_second_call_no_second_restart", "file": "src/controller/testsuite/test_demotion_convergence.c", "root_cause": "dc_run_pending_task peeked tasks.head and ran entry(args) WITHOUT dequeuing. The once-guard correctly makes the 2nd ha_rejoin_reconcile schedule no new task, so head still pointed at the first (already-run) task whose body had freed its heap ctx (args). The 2nd dc_run_pending_task re-ran that task on the freed ctx. The convergence task bodies free their own args (production delaymgr killer frees only the delay_task_t node, never args; production execv never re-runs a one-shot).", - "fix": "Made dc_run_pending_task DEQUEUE via ordq_get(&mgr->tasks, NULL), run the body, then free(t)/free(it) — mirroring the real delaymgr worker (ordq_get -> runner_fn -> FREEUP for runcount==1). A 2nd call now returns DC_NO_TASK as production would. Production ha_rejoin_reconcile/ha_rejoin_reconcile_fn unchanged (the body-frees-ctx pattern is correct).", + "fix": "Made dc_run_pending_task DEQUEUE via ordq_get(&mgr->tasks, NULL), run the body, then free(t)/free(it) \u2014 mirroring the real delaymgr worker (ordq_get -> runner_fn -> FREEUP for runcount==1). A 2nd call now returns DC_NO_TASK as production would. Production ha_rejoin_reconcile/ha_rejoin_reconcile_fn unchanged (the body-frees-ctx pattern is correct).", "tags": [ "asan", "use-after-free", @@ -8524,7 +8524,7 @@ "timestamp": "2026-06-14T04:57:22.178Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block | Also: /*; * ha_walack_continuation_for_test: test-only entry point for", "tags": [ "auto-detected", @@ -8540,7 +8540,7 @@ "timestamp": "2026-06-14T04:57:59.221Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/ha_convergence.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -8556,7 +8556,7 @@ "timestamp": "2026-06-14T05:23:00.737Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.h", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -8572,7 +8572,7 @@ "timestamp": "2026-06-14T05:24:33.033Z", "error_message": "Missing error handling in XCE_TESTING", "file": "src/controller/config_repl.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -8588,7 +8588,7 @@ "timestamp": "2026-06-14T05:25:04.524Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -8620,8 +8620,8 @@ "timestamp": "2026-06-14T06:37:35.904Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_convergence_verification.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", - "fix": "Added try/catch block | Also: printf(\"\\n>> Regression pins: fan-out / snapshot fallback / ; \"re-inclusion (task 6.1 — PASS against current code)\\n\\n\"); | Also: /* ── Fan-out counting send-hook (task 6.1 (a)/(d), umbrella; * repl_broadcast routes each enqueue through repl_broadcast_", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", + "fix": "Added try/catch block | Also: printf(\"\\n>> Regression pins: fan-out / snapshot fallback / ; \"re-inclusion (task 6.1 \u2014 PASS against current code)\\n\\n\"); | Also: /* \u2500\u2500 Fan-out counting send-hook (task 6.1 (a)/(d), umbrella; * repl_broadcast routes each enqueue through repl_broadcast_", "tags": [ "auto-detected", "error-handling", @@ -8653,7 +8653,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_convergence_verification.c", "root_cause": "22 lines replaced/restructured", - "fix": "Rewrote 33→3 lines (22 removed)", + "fix": "Rewrote 33\u21923 lines (22 removed)", "tags": [ "auto-detected", "refactor", @@ -8720,7 +8720,7 @@ "timestamp": "2026-06-14T08:35:02.456Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_ha_vote_gate.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -8737,7 +8737,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "6 lines replaced/restructured", - "fix": "Rewrote 12→17 lines (6 removed)", + "fix": "Rewrote 12\u219217 lines (6 removed)", "tags": [ "auto-detected", "refactor", @@ -8753,7 +8753,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 8→16 lines (3 removed)", + "fix": "Rewrote 8\u219216 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -8785,7 +8785,7 @@ "error_message": "WAL HOLE on cold-start catch-up: a fresh EMPTY standby (standby_lsn=0) catching up to a primary holding [0,1] receives ONLY lsn 1, missing lsn 0", "file": "src/controller/config_repl.c", "root_cause": "ha_stream_wal_to_standby filter `if (hdr.lsn > standby_lsn)` excludes lsn 0 when standby_lsn==0 (0>0 is false). standby_lsn=0 is ambiguous: it means BOTH 'empty standby (applied nothing)' AND 'standby has applied lsn 0'. The streamer cannot distinguish, computes start_lsn=standby_lsn+1=1, and drops the genuine lsn-0 entry. Only non-cosmetic because lsn-0 entries can be REAL data (first-ever WAL entry of a fresh cluster is lsn 0 from a real write OR the promotion NOOP).", - "fix": "FIXED via reserve-lsn-0: persist_init() now sets current_lsn=1 on a fresh store (persist.c), so lsn 0 is reserved as the none/empty sentinel and the first-ever WAL entry (promotion NOOP) is lsn 1. The streamer filter hdr.lsn>standby_lsn now yields 1>0=true for an empty standby (standby_lsn=0), streaming the first entry — no hole. No streamer change needed; the reserved base makes the existing filter correct. Also fixes the uncommittable cold-start NOOP (now lsn 1, committable 0->1) and the own-term writable_lsn gate (now 1, effective). Test: test_coldstart_lsn0.c H1-H4 all green incl H4 no-hole. Base-shift fallout fixed in test_commit_engine, test_commit_barrier_rollout, test_commit_barrier_reply, test_p2_integration, test_egress_filter (removed now-redundant priming appends / wired engine).", + "fix": "FIXED via reserve-lsn-0: persist_init() now sets current_lsn=1 on a fresh store (persist.c), so lsn 0 is reserved as the none/empty sentinel and the first-ever WAL entry (promotion NOOP) is lsn 1. The streamer filter hdr.lsn>standby_lsn now yields 1>0=true for an empty standby (standby_lsn=0), streaming the first entry \u2014 no hole. No streamer change needed; the reserved base makes the existing filter correct. Also fixes the uncommittable cold-start NOOP (now lsn 1, committable 0->1) and the own-term writable_lsn gate (now 1, effective). Test: test_coldstart_lsn0.c H1-H4 all green incl H4 no-hole. Base-shift fallout fixed in test_commit_engine, test_commit_barrier_rollout, test_commit_barrier_reply, test_p2_integration, test_egress_filter (removed now-redundant priming appends / wired engine).", "tags": [ "ha", "replication", @@ -8806,7 +8806,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_egress_filter.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 7→9 lines (3 removed)", + "fix": "Rewrote 7\u21929 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -8822,7 +8822,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_p3_hardening.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 4→6 lines (4 removed)", + "fix": "Rewrote 4\u21926 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -8838,7 +8838,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_commit_barrier_reply.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 8→9 lines (4 removed)", + "fix": "Rewrote 8\u21929 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -8854,7 +8854,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_convergence_verification.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 32→111 lines (3 removed)", + "fix": "Rewrote 32\u2192111 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -8870,7 +8870,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.h", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 8→15 lines (2 removed)", + "fix": "Rewrote 8\u219215 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -8886,7 +8886,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "4 lines replaced/restructured", - "fix": "Rewrote 30→38 lines (4 removed)", + "fix": "Rewrote 30\u219238 lines (4 removed)", "tags": [ "auto-detected", "refactor", @@ -8902,7 +8902,7 @@ "error_message": "Wrong reference: test_pin_dispatch_gate_degraded_allowlist should be test_empty_standby_fresh_cluster_streams_not_snapshot", "file": "src/controller/testsuite/test_convergence_verification.c", "root_cause": "Used \"test_pin_dispatch_gate_degraded_allowlist\" instead of \"test_empty_standby_fresh_cluster_streams_not_snapshot\"", - "fix": "Changed test_pin_dispatch_gate_degraded_allowlist → test_empty_standby_fresh_cluster_streams_not_snapshot", + "fix": "Changed test_pin_dispatch_gate_degraded_allowlist \u2192 test_empty_standby_fresh_cluster_streams_not_snapshot", "tags": [ "auto-detected", "wrong-reference", @@ -8934,7 +8934,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_convergence_verification.c", "root_cause": "18 lines replaced/restructured", - "fix": "Rewrote 35→54 lines (18 removed) | Also: /* HA_REPL_SEND_SNAPSHOT: standby_lsn predates the; \"heartbeat decision: standby_lsn below oldest_wal_", + "fix": "Rewrote 35\u219254 lines (18 removed) | Also: /* HA_REPL_SEND_SNAPSHOT: standby_lsn predates the; \"heartbeat decision: standby_lsn below oldest_wal_", "tags": [ "auto-detected", "refactor", @@ -8950,7 +8950,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/repl.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 5→10 lines (2 removed)", + "fix": "Rewrote 5\u219210 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -8966,7 +8966,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_p2_integration.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 5→20 lines (3 removed)", + "fix": "Rewrote 5\u219220 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -9030,7 +9030,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test.c", "root_cause": "5 lines replaced/restructured", - "fix": "Rewrote 7→9 lines (5 removed) | Also: config.nmasters = 1;; config.masters[0] = get_setting(\"host\");", + "fix": "Rewrote 7\u21929 lines (5 removed) | Also: config.nmasters = 1;; config.masters[0] = get_setting(\"host\");", "tags": [ "auto-detected", "refactor", @@ -9046,7 +9046,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→14 lines (2 removed)", + "fix": "Rewrote 4\u219214 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -9062,7 +9062,7 @@ "error_message": "Wrong reference: myconf_t should be uint32_t", "file": "src/include/myconf.h", "root_cause": "Used \"myconf_t\" instead of \"uint32_t\"", - "fix": "Changed myconf_t → uint32_t", + "fix": "Changed myconf_t \u2192 uint32_t", "tags": [ "auto-detected", "wrong-reference", @@ -9118,8 +9118,8 @@ "timestamp": "2026-06-15T09:16:53.679025Z", "error_message": "jobsub returns ok (status 0, jobid) but joblist AND jobinfo show the job absent on a stable single primary (ctrl-1); reslist works.", "file": "src/lib/request.c", - "root_cause": "SOLVED (reproduced locally via /xce-build + 3-node deploy-ha, ASAN). cluster_start() — the ONLY place that sets c->running=1 — is ORPHANED (zero callers; grep confirms). The HA startup path (myapp_run) starts iomgr/vtaskmgr/delaymgr/persist_start itself but never calls cluster_start, so c->running stays 0 (calloc default) on the primary. check_controller() (the streaming gate passed to xce_reply_get for joblist/workerlist) returns -EINVAL when !c->running; xce_reply_get then sets nc=0 (chunk count), shipping an EMPTY list to the client even though collect_jobs/key_find found the job. reslist passes checkf=NULL so it was immune. DIAG proof: 'reply_get send: table=2 pos=0 nc=0 nrows=1 checkstatus=-22' (pre-fix) -> 'nc=1 ... checkstatus=1' (post-fix). Single-node/legacy cluster_init path called cluster_start, which is why non-replicated worked.", - "fix": "Set c->running=1 at the TOP of cluster_run() (src/controller/cluster.c), symmetric with the existing c->running=0 on shutdown — the orphaned cluster_start() used to set it. c->running is a liveness/shutdown flag: check_controller() is polled PER CHUNK inside xce_reply_get()'s streaming loop so a long multi-chunk fetch (e.g. thousands of jobs) ABORTS mid-stream (nc=0) if a shutdown request arrives during it. The bug: running started 0 and was never set under HA, so the gate fired on every reply, not just during shutdown. Fix restores running=1 for the run-loop lifetime; the shutdown abort path (running=0 when cluster_run's cbuf_get loop breaks on the stop signal) is unchanged. Verified E2E on a local 3-node deploy-ha (ASAN): jobs now appear in joblist; DIAG showed checkstatus/nc flip -22/0 -> 1/1. Final fix is in cluster_run (not myapp_run — moved there so the 1<->0 lifecycle is co-located in the function that receives the shutdown signal).", + "root_cause": "SOLVED (reproduced locally via /xce-build + 3-node deploy-ha, ASAN). cluster_start() \u2014 the ONLY place that sets c->running=1 \u2014 is ORPHANED (zero callers; grep confirms). The HA startup path (myapp_run) starts iomgr/vtaskmgr/delaymgr/persist_start itself but never calls cluster_start, so c->running stays 0 (calloc default) on the primary. check_controller() (the streaming gate passed to xce_reply_get for joblist/workerlist) returns -EINVAL when !c->running; xce_reply_get then sets nc=0 (chunk count), shipping an EMPTY list to the client even though collect_jobs/key_find found the job. reslist passes checkf=NULL so it was immune. DIAG proof: 'reply_get send: table=2 pos=0 nc=0 nrows=1 checkstatus=-22' (pre-fix) -> 'nc=1 ... checkstatus=1' (post-fix). Single-node/legacy cluster_init path called cluster_start, which is why non-replicated worked.", + "fix": "Set c->running=1 at the TOP of cluster_run() (src/controller/cluster.c), symmetric with the existing c->running=0 on shutdown \u2014 the orphaned cluster_start() used to set it. c->running is a liveness/shutdown flag: check_controller() is polled PER CHUNK inside xce_reply_get()'s streaming loop so a long multi-chunk fetch (e.g. thousands of jobs) ABORTS mid-stream (nc=0) if a shutdown request arrives during it. The bug: running started 0 and was never set under HA, so the gate fired on every reply, not just during shutdown. Fix restores running=1 for the run-loop lifetime; the shutdown abort path (running=0 when cluster_run's cbuf_get loop breaks on the stop signal) is unchanged. Verified E2E on a local 3-node deploy-ha (ASAN): jobs now appear in joblist; DIAG showed checkstatus/nc flip -22/0 -> 1/1. Final fix is in cluster_run (not myapp_run \u2014 moved there so the 1<->0 lifecycle is co-located in the function that receives the shutdown signal).", "tags": [ "joblist", "workerlist", @@ -9144,7 +9144,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/opget.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 6→3 lines (2 removed) | Also: {; extern uint64_t g_diag_last_jobid;", + "fix": "Rewrote 6\u21923 lines (2 removed) | Also: {; extern uint64_t g_diag_last_jobid;", "tags": [ "auto-detected", "refactor", @@ -9159,7 +9159,7 @@ "timestamp": "2026-06-15T10:46:08.441Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_ha_rdhup_integration.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -9175,7 +9175,7 @@ "timestamp": "2026-06-15T10:46:31.815Z", "error_message": "Missing error handling in unknown", "file": "src/controller/ha.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -9192,7 +9192,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 5→4 lines (3 removed)", + "fix": "Rewrote 5\u21924 lines (3 removed)", "tags": [ "auto-detected", "refactor", @@ -9231,7 +9231,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/myapp.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 3→11 lines (2 removed)", + "fix": "Rewrote 3\u219211 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -9263,7 +9263,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/steering/product.md", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→7 lines (2 removed)", + "fix": "Rewrote 4\u21927 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -9295,7 +9295,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "9 lines replaced/restructured", - "fix": "Rewrote 13→5 lines (9 removed)", + "fix": "Rewrote 13\u21925 lines (9 removed)", "tags": [ "auto-detected", "refactor", @@ -9308,10 +9308,10 @@ { "id": "bug-340", "timestamp": "2026-06-15T15:00:00.000Z", - "error_message": "After kill+RESTART of a controller (ctrl-1), the restarted node loops forever: ha_on_primary_ctrl_fd_rdhup → CTRL_ELECTING → raft_cb_become_follower → CTRL_STANDBY every ~heartbeat_timeout, term climbing unbounded (473+), while ctrl-2 stays PRIMARY at term 3. On ctrl-2: every heartbeat tick logs `xce_encode op 0 (NOP)` then `WARN endpoint_update_epoll rc1=-1 < 0` (netio.c:575) — a wedged outbound standby endpoint.", + "error_message": "After kill+RESTART of a controller (ctrl-1), the restarted node loops forever: ha_on_primary_ctrl_fd_rdhup \u2192 CTRL_ELECTING \u2192 raft_cb_become_follower \u2192 CTRL_STANDBY every ~heartbeat_timeout, term climbing unbounded (473+), while ctrl-2 stays PRIMARY at term 3. On ctrl-2: every heartbeat tick logs `xce_encode op 0 (NOP)` then `WARN endpoint_update_epoll rc1=-1 < 0` (netio.c:575) \u2014 a wedged outbound standby endpoint.", "file": "src/controller/ha.c, src/controller/testsuite/test_ha_liveness.c", - "root_cause": "primary_heartbeat_fn never evicted a dead/wedged outbound standby endpoint from ha->standby_endpoints. When a peer is killed/restarted, its outbound ep on the primary wedges: handle_error (netio.c:420) runs iomgr_unmonitor (EPOLL_CTL_DEL, does NOT close the fd) and the err handler may leave the ep in standby_endpoints; epoll_ctl(EPOLL_CTL_MOD) on the DEL'd fd then returns ENOENT (rc1=-1) on every heartbeat enqueue. xce_nop_req still returns >=0 (enqueue ok) so the heartbeat layer never detected the wedge. Critically, primary_heartbeat_fn step 2 (reconnect) treats a peer as 'found' (connected) if ANY ep for it is in standby_endpoints — so the wedged ep SUPPRESSED reconnection. ctrl-2 therefore never opened a fresh connection to the restarted ctrl-1, never sent a ctrlhello, so ctrl-1 never set primary_ctrl_fd / refreshed last_activity and its liveness watchdog re-elected every heartbeat_timeout forever. (The earlier suspected 'become_follower doesn't reset last_activity' was NOT a bug: ha_arm_heartbeat_timeout_vtask already stamps last_activity=now, so the ~11s period is exactly one full timeout — confirming the watchdog is correct and the sole cause is the broken channel.)", - "fix": "In primary_heartbeat_fn (ha.c) step 1, added liveness eviction symmetric with the standby's own liveness poll: for each standby ep, if ep->ts_last_in > 0 (was responsive at least once) AND (now_wall - ep->ts_last_in) > heartbeat_timeout_s, remove it from ha->standby_endpoints (zarray_del, under ha->lock) and collect it; after releasing ha->lock, repl_remove_standby() each evicted ep. Removal is the load-bearing action — the reconnect scan (step 2) then re-establishes a fresh ctrlhello channel to the restarted peer on this/next tick, and ctrl-1 settles via ha_discover_primary (no term gate, ha.c:3807) → become_follower → STANDBY. ts_last_in/ts_last_out are existing endpoint_t fields (wall clock, set in handle_input/handle_output), so no libnetio change. The evicted ep object itself is reclaimed by its err handler when the dead connection finally surfaces an epoll event (bounded leak, consistent with codebase). Eviction keys on ts_last_in>0 so a just-connected joiner (ts_last_in==0) gets grace. Regression tests: test_primary_hb_evicts_silent_standby (RED→GREEN), test_primary_hb_keeps_live_standby, test_primary_hb_keeps_unconfirmed_standby in test_ha_liveness.c.", + "root_cause": "primary_heartbeat_fn never evicted a dead/wedged outbound standby endpoint from ha->standby_endpoints. When a peer is killed/restarted, its outbound ep on the primary wedges: handle_error (netio.c:420) runs iomgr_unmonitor (EPOLL_CTL_DEL, does NOT close the fd) and the err handler may leave the ep in standby_endpoints; epoll_ctl(EPOLL_CTL_MOD) on the DEL'd fd then returns ENOENT (rc1=-1) on every heartbeat enqueue. xce_nop_req still returns >=0 (enqueue ok) so the heartbeat layer never detected the wedge. Critically, primary_heartbeat_fn step 2 (reconnect) treats a peer as 'found' (connected) if ANY ep for it is in standby_endpoints \u2014 so the wedged ep SUPPRESSED reconnection. ctrl-2 therefore never opened a fresh connection to the restarted ctrl-1, never sent a ctrlhello, so ctrl-1 never set primary_ctrl_fd / refreshed last_activity and its liveness watchdog re-elected every heartbeat_timeout forever. (The earlier suspected 'become_follower doesn't reset last_activity' was NOT a bug: ha_arm_heartbeat_timeout_vtask already stamps last_activity=now, so the ~11s period is exactly one full timeout \u2014 confirming the watchdog is correct and the sole cause is the broken channel.)", + "fix": "In primary_heartbeat_fn (ha.c) step 1, added liveness eviction symmetric with the standby's own liveness poll: for each standby ep, if ep->ts_last_in > 0 (was responsive at least once) AND (now_wall - ep->ts_last_in) > heartbeat_timeout_s, remove it from ha->standby_endpoints (zarray_del, under ha->lock) and collect it; after releasing ha->lock, repl_remove_standby() each evicted ep. Removal is the load-bearing action \u2014 the reconnect scan (step 2) then re-establishes a fresh ctrlhello channel to the restarted peer on this/next tick, and ctrl-1 settles via ha_discover_primary (no term gate, ha.c:3807) \u2192 become_follower \u2192 STANDBY. ts_last_in/ts_last_out are existing endpoint_t fields (wall clock, set in handle_input/handle_output), so no libnetio change. The evicted ep object itself is reclaimed by its err handler when the dead connection finally surfaces an epoll event (bounded leak, consistent with codebase). Eviction keys on ts_last_in>0 so a just-connected joiner (ts_last_in==0) gets grace. Regression tests: test_primary_hb_evicts_silent_standby (RED\u2192GREEN), test_primary_hb_keeps_live_standby, test_primary_hb_keeps_unconfirmed_standby in test_ha_liveness.c.", "tags": [ "ha", "heartbeat", @@ -9332,7 +9332,7 @@ "timestamp": "2026-06-16T00:10:49.295Z", "error_message": "Incorrect value in code", "file": ".kiro/specs/ha-prevote/research.md", - "root_cause": "Had 't understand PreVote (older binary) — does the ca", + "root_cause": "Had 't understand PreVote (older binary) \u2014 does the ca", "fix": "Changed to 's \"", "tags": [ "auto-detected", @@ -9364,7 +9364,7 @@ "timestamp": "2026-06-16T00:26:16.193Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-prevote/research.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -9413,7 +9413,7 @@ "error_message": "Significant refactor of ", "file": ".kiro/specs/ha-prevote/tasks.md", "root_cause": "3 lines replaced/restructured", - "fix": "Rewrote 7→7 lines (3 removed) | Also: - [ ] 5.1 Wire the PreVote reply opcode to the can; - Dispatch the incoming PreVote-reply opcode to th", + "fix": "Rewrote 7\u21927 lines (3 removed) | Also: - [ ] 5.1 Wire the PreVote reply opcode to the can; - Dispatch the incoming PreVote-reply opcode to th", "tags": [ "auto-detected", "refactor", @@ -9429,7 +9429,7 @@ "error_message": "Significant refactor of ", "file": "src/lib/raft/raft.h", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→5 lines (2 removed)", + "fix": "Rewrote 4\u21925 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -9444,7 +9444,7 @@ "timestamp": "2026-06-16T04:18:41.611Z", "error_message": "Missing error handling in unknown", "file": "src/lib/testsuite/test_raft.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -9460,7 +9460,7 @@ "timestamp": "2026-06-16T04:19:25.513Z", "error_message": "Missing error handling in never", "file": "src/lib/raft/raft.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -9508,8 +9508,8 @@ "timestamp": "2026-06-16T04:50:38.855Z", "error_message": "Missing error handling in struct", "file": "src/controller/testsuite/test_ha_vote_gate.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", - "fix": "Added try/catch block | Also: /* Task 3.1 — voter-side PreVote dispatch gate (stickiness +; * no mutation, reply term unchanged) */", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", + "fix": "Added try/catch block | Also: /* Task 3.1 \u2014 voter-side PreVote dispatch gate (stickiness +; * no mutation, reply term unchanged) */", "tags": [ "auto-detected", "error-handling", @@ -9525,7 +9525,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/testsuite/test_ha_vote_gate.c", "root_cause": "2 lines replaced/restructured", - "fix": "Rewrote 4→4 lines (2 removed)", + "fix": "Rewrote 4\u21924 lines (2 removed)", "tags": [ "auto-detected", "refactor", @@ -9540,7 +9540,7 @@ "timestamp": "2026-06-16T04:57:16.230Z", "error_message": "Missing error handling in unknown", "file": "src/controller/cluster.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -9557,7 +9557,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/cluster.c", "root_cause": "6 lines replaced/restructured", - "fix": "Rewrote 20→25 lines (6 removed)", + "fix": "Rewrote 20\u219225 lines (6 removed)", "tags": [ "auto-detected", "refactor", @@ -9572,7 +9572,7 @@ "timestamp": "2026-06-16T05:21:02.997Z", "error_message": "Missing error handling in unknown", "file": ".kiro/specs/ha-prevote/tasks.md", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -9589,7 +9589,7 @@ "error_message": "Wrong reference: test_commit_engine should be test_ha_prevote", "file": "src/controller/testsuite/controller_test.c", "root_cause": "Used \"test_commit_engine\" instead of \"test_ha_prevote\"", - "fix": "Changed test_commit_engine → test_ha_prevote", + "fix": "Changed test_commit_engine \u2192 test_ha_prevote", "tags": [ "auto-detected", "wrong-reference", @@ -9653,7 +9653,7 @@ "error_message": "Wrong reference: test_commit_engine should be test_ha_failover_prevote", "file": "src/controller/testsuite/controller_test.c", "root_cause": "Used \"test_commit_engine\" instead of \"test_ha_failover_prevote\"", - "fix": "Changed test_commit_engine → test_ha_failover_prevote", + "fix": "Changed test_commit_engine \u2192 test_ha_failover_prevote", "tags": [ "auto-detected", "wrong-reference", @@ -9669,7 +9669,7 @@ "error_message": "Significant refactor of ", "file": "src/controller/ha.c", "root_cause": "104 lines replaced/restructured", - "fix": "Rewrote 157→90 lines (104 removed)", + "fix": "Rewrote 157\u219290 lines (104 removed)", "tags": [ "auto-detected", "refactor", @@ -9716,7 +9716,7 @@ "timestamp": "2026-06-16T06:58:28.916Z", "error_message": "Missing error handling in unknown", "file": "src/controller/testsuite/test_ha_prevote.c", - "root_cause": "Code path had no error handling — exceptions would propagate uncaught", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", "fix": "Added try/catch block", "tags": [ "auto-detected", @@ -9726,6 +9726,92 @@ "related_bugs": [], "occurrences": 1, "last_seen": "2026-06-16T06:58:28.916Z" + }, + { + "id": "bug-600", + "timestamp": "2026-06-16T07:54:55.333Z", + "error_message": "Significant refactor of ", + "file": ".claude/settings.json", + "root_cause": "9 lines replaced/restructured", + "fix": "Rewrote 13\u21923 lines (9 removed) | Also: },; {", + "tags": [ + "auto-detected", + "refactor", + "json" + ], + "related_bugs": [], + "occurrences": 4, + "last_seen": "2026-06-16T07:57:04.100Z" + }, + { + "id": "bug-601", + "timestamp": "2026-06-16T07:55:35.829Z", + "error_message": "Missing error handling in unknown", + "file": ".kiro/specs/ha-prevote/tasks.md", + "root_cause": "Code path had no error handling \u2014 exceptions would propagate uncaught", + "fix": "Added try/catch block", + "tags": [ + "auto-detected", + "error-handling", + "md" + ], + "related_bugs": [], + "occurrences": 1, + "last_seen": "2026-06-16T07:55:35.829Z" + }, + { + "id": "bug-602", + "timestamp": "2026-06-16T08:07:10.459Z", + "error_message": "Significant refactor of ", + "file": ".claude/settings.json", + "root_cause": "9 lines replaced/restructured", + "fix": "Rewrote 13\u21923 lines (9 removed) | Also: },; {", + "tags": [ + "auto-detected", + "refactor", + "json" + ], + "related_bugs": [], + "occurrences": 2, + "last_seen": "2026-06-16T08:07:18.239Z" + }, + { + "id": "bug-603", + "timestamp": "2026-06-16T08:18:48.567Z", + "error_message": "Function not marked async", + "file": "src/controller/persist.c", + "root_cause": "Function uses await but wasn't declared async", + "fix": "Added async modifier", + "tags": [ + "auto-detected", + "async-fix", + "c" + ], + "related_bugs": [], + "occurrences": 1, + "last_seen": "2026-06-16T08:18:48.567Z" + }, + { + "id": "bug-604", + "timestamp": "2026-06-16T15:55:00Z", + "error_message": "controller unit test TIMEOUT 300.01s killed by SIGTERM; suite exceeds 300s meson cap", + "file": "src/controller/persist.c", + "root_cause": "fsync_worker slept the full wal_sync_ms in one uninterruptible nanosleep() then checked fsync_stop. persist_stop sets the flag and immediately pthread_join()s, so the join blocked until the in-progress sleep returned \u2014 up to a full wal_sync_ms per teardown. Tests set wal_sync_ms=5000 ('slow fsync, no races'), so each persist_stop cost ~5s; across ~7 suites with many fixtures the cumulative teardown time blew past the 300s controller-test cap. The 'commit: WAIT deadline expired' warnings in the log were unrelated intentional negative tests (50-300ms).", + "fix": "Replaced the nanosleep with pthread_cond_timedwait on a new fsync_mutex/fsync_cond (added to persist_t, init in persist_init, destroyed in persist_fini). persist_stop now sets fsync_stop and pthread_cond_signal(fsync_cond) under fsync_mutex before join, so the worker wakes immediately. fdatasync still runs under p->lock, released before re-acquiring fsync_mutex (no lock nesting). Full controller suite now completes in ~10s (was >300s); 0 failures.", + "tags": [ + "controller", + "persist", + "fsync", + "thread-shutdown", + "test-timeout", + "pthread_join", + "nanosleep", + "condvar", + "ha" + ], + "related_bugs": [], + "occurrences": 1, + "last_seen": "2026-06-16T15:55:00Z" } ] } \ No newline at end of file diff --git a/.wolf/memory.md b/.wolf/memory.md index 9dbe5ea..76c70b7 100644 --- a/.wolf/memory.md +++ b/.wolf/memory.md @@ -1775,3 +1775,26 @@ Implemented sub-spec 3/4 of ha-consistency-invariants autonomously (per-task imp | 00:55 | Edited .kiro/specs/ha-prevote/tasks.md | inline fix | ~60 | | 00:55 | Edited .kiro/specs/ha-prevote/tasks.md | inline fix | ~68 | | 03:12 | ha-prevote cleanup: issue-1 log-reason fixed (47f7338); issue-2 leak deferred | .kiro/specs/ha-elect-ctx-lifecycle/, tasks.md, cerebrum.md | follow-up spec scaffolded + tracked | ~3k | +| 00:56 | Edited CLAUDE.md | removed 40 lines | ~23 | +| 00:56 | Session end: 21 writes across 12 files (tasks.md, test_ha_prevote.c, test_raft.c, research.md, ha.c) | 20 reads | ~57330 tok | +| 00:56 | Edited .claude/settings.json | removed 13 lines | ~11 | +| 00:57 | Edited .claude/settings.json | removed 13 lines | ~10 | + +## Session: 2026-06-16 00:57 + +| Time | Action | File(s) | Outcome | ~Tokens | +|------|--------|---------|---------|--------| +| 00:59 | Created .mcp.json | — | ~7 | +| 01:07 | Edited .claude/settings.json | removed 13 lines | ~11 | +| 01:07 | Edited .claude/settings.json | removed 13 lines | ~10 | +| 01:09 | Created .mcp.json | — | ~7 | +| 01:09 | Created .claude/settings.json | — | ~497 | +| 01:09 | Created uninstall-code-review-graph.sh | — | ~627 | +| 01:10 | Session end: 6 writes across 3 files (.mcp.json, settings.json, uninstall-code-review-graph.sh) | 8 reads | ~1708 tok | +| 01:18 | Edited src/include/persist.h | 3→5 lines | ~69 | +| 01:18 | Edited src/controller/persist.c | 2→4 lines | ~52 | +| 01:18 | Edited src/controller/persist.c | added 2 condition(s) | ~383 | +| 01:18 | Edited src/controller/persist.c | 5→10 lines | ~155 | +| 01:19 | Edited src/controller/persist.c | 4→6 lines | ~59 | +| 15:55 | Fixed controller test timeout: interruptible fsync_worker sleep (condvar) so persist_stop joins promptly | persist.c, persist.h | suite 300s+ TIMEOUT → 10s, 0 failures | ~25k | +| 01:23 | Session end: 11 writes across 5 files (.mcp.json, settings.json, uninstall-code-review-graph.sh, persist.h, persist.c) | 9 reads | ~2478 tok | diff --git a/src/controller/persist.c b/src/controller/persist.c index 6f660fc..c63e125 100644 --- a/src/controller/persist.c +++ b/src/controller/persist.c @@ -174,19 +174,37 @@ static void* fsync_worker(void* arg) { persist_t* p = arg; + /* Sleep the configured interval via a timed condvar wait rather than an + * uninterruptible nanosleep, so persist_stop wakes us immediately instead + * of blocking its pthread_join for up to a full wal_sync_ms (5s in tests + * that set a slow interval — was the controller-suite timeout cause). */ + pthread_mutex_lock(&p->fsync_mutex); while (!atomic_load_explicit(&p->fsync_stop, memory_order_acquire)) { - long ms = (long)p->config.wal_sync_ms; - struct timespec ts = { - .tv_sec = ms / 1000, - .tv_nsec = (ms % 1000) * 1000000L, - }; - nanosleep(&ts, NULL); + long ms = (long)p->config.wal_sync_ms; + struct timespec dl; + clock_gettime(CLOCK_REALTIME, &dl); + dl.tv_sec += ms / 1000; + dl.tv_nsec += (ms % 1000) * 1000000L; + if (dl.tv_nsec >= 1000000000L) { + dl.tv_sec += 1; + dl.tv_nsec -= 1000000000L; + } + pthread_cond_timedwait(&p->fsync_cond, &p->fsync_mutex, &dl); + + /* Stop requested during the wait: exit before the next fdatasync. */ + if (atomic_load_explicit(&p->fsync_stop, memory_order_acquire)) + break; + + /* fdatasync under p->lock — never held together with fsync_mutex. */ + pthread_mutex_unlock(&p->fsync_mutex); pthread_mutex_lock(&p->lock); if (p->wal_fd >= 0) fdatasync(p->wal_fd); pthread_mutex_unlock(&p->lock); + pthread_mutex_lock(&p->fsync_mutex); } + pthread_mutex_unlock(&p->fsync_mutex); return NULL; } @@ -253,6 +271,8 @@ int persist_init(persist_t* p, persist_config_t* cfg, cluster_t* c) pthread_mutex_init(&p->lock, NULL); pthread_mutex_init(&p->checkpoint_mutex, NULL); pthread_cond_init(&p->checkpoint_done, NULL); + pthread_mutex_init(&p->fsync_mutex, NULL); + pthread_cond_init(&p->fsync_cond, NULL); repl_init(&p->repl); /* P2-4: fan-out replicator lifecycle */ WARN("WAL/snapshot stored unencrypted in %s — " @@ -285,7 +305,12 @@ int persist_start(persist_t* p) void persist_stop(persist_t* p) { if (atomic_load_explicit(&p->fsync_thread_running, memory_order_acquire)) { + /* Set the stop flag and wake the timer wait under fsync_mutex so the + * worker cannot miss the signal between its flag check and the wait. */ + pthread_mutex_lock(&p->fsync_mutex); atomic_store_explicit(&p->fsync_stop, 1, memory_order_release); + pthread_cond_signal(&p->fsync_cond); + pthread_mutex_unlock(&p->fsync_mutex); pthread_join(p->fsync_thread, NULL); atomic_store_explicit(&p->fsync_thread_running, 0, memory_order_release); } @@ -305,6 +330,8 @@ void persist_fini(persist_t* p) pthread_mutex_destroy(&p->lock); pthread_mutex_destroy(&p->checkpoint_mutex); pthread_cond_destroy(&p->checkpoint_done); + pthread_mutex_destroy(&p->fsync_mutex); + pthread_cond_destroy(&p->fsync_cond); } /* Forward declaration — defined after checkpoint internals */ diff --git a/src/include/persist.h b/src/include/persist.h index f6d7d50..e42c409 100644 --- a/src/include/persist.h +++ b/src/include/persist.h @@ -86,6 +86,8 @@ struct persist_s { atomic_int fsync_stop; atomic_int fsync_thread_running; pthread_t fsync_thread; + pthread_mutex_t fsync_mutex; /* guards the fsync timer wait */ + pthread_cond_t fsync_cond; /* signaled by persist_stop for prompt join */ /* Checkpoint (stubs for now — wired in Task 10) */ atomic_int checkpoint_requested;