feat(ha-commit-barrier-rollout): dispatch-gate fact allowlist (task 4.2)

notify/update/setpreason/clrpreason admitted in CTRL_PRIMARY without
write quorum (Req 3.2 / umbrella 2.8 / bug-396): all four terminate in
receipt-style RETAIN fact paths — reviewer-traced no-block proof (no
admitted opcode reaches a barrier/WAIT path; request opcodes stay
rejected). 21/21 group; census 494/494 zero FAIL; RED→GREEN
independently reproduced via stash-rebuild.
This commit is contained in:
Rongsong Shen 2026-06-12 14:50:28 +00:00
parent 4fa38c6f88
commit 4fafeadbbc
3 changed files with 14 additions and 1 deletions

View file

@ -55,7 +55,7 @@
- Observable completion: the four fact-opcode cases FAIL (red) against the current allowlist
- _Requirements: 3.2_
- [ ] 4.2 Implement the allowlist to green
- [x] 4.2 Implement the allowlist to green
- Add the four fact-bearing opcodes to the CTRL_PRIMARY no-write-quorum switch (ha.c:1537-1556 anchor); CTRL_PRIMARY_COMMITTING branch untouched (deleted wholesale by ha-single-leader-role)
- Observable completion: all task 4.1 tests PASS; existing gate tests for request opcodes unchanged
- _Requirements: 3.2_

View file

@ -954,3 +954,6 @@
| 06:38 | Edited src/controller/testsuite/test_commit_barrier_rollout.c | expanded (+7 lines) | ~146 |
| 13:47 | ha-commit-barrier-rollout 4.1: added 6 dispatch-gate fact-allowlist tests (4 RED + 2 pins) | src/controller/testsuite/test_commit_barrier_rollout.c | RED verified: 4 FAIL (-XCE_ERR_NOT_READY), census 494=488+6, zero other failures | ~60k |
| 07:05 | Edited .kiro/specs/ha-commit-barrier-rollout/tasks.md | inline fix | ~17 |
| 07:14 | Edited src/controller/ha.c | expanded (+10 lines) | ~205 |
| 14:35 | task 4.2 validated: gate switch admits notify/update/setpreason/clrpreason; build OK; 21/21 rollout, 494 census ZERO FAIL | src/controller/ha.c | success | ~3k |
| 07:50 | Edited .kiro/specs/ha-commit-barrier-rollout/tasks.md | inline fix | ~12 |

View file

@ -1561,6 +1561,16 @@ int ha_dispatch_gate(ha_state_t *ha, int opcode)
/* Read-only queries */
case OPCode_get:
case OPCode_probeConfigTag:
/* Fact-bearing ops — reports of events that already happened
* (worker job transitions/rusage, scheduler pend reasons).
* Rejecting them loses the fact forever: the reporter never
* retries (bug-396). Admit so the RETAIN path can append and
* hold them until quorum returns (Req 3.2; umbrella 2.8 —
* facts are retained, never dropped). */
case OPCode_notify:
case OPCode_update:
case OPCode_setpreason:
case OPCode_clrpreason:
return 0;
default:
return -XCE_ERR_NOT_READY;