- .wolf/anatomy*, memory.md: hook-maintained index and session log through the bug-1851..1854 work. - .kiro/specs/libxce-alloc-preason-equality/: requirements, design, research and tasks generated; none approved yet (spec.json phase tasks-generated). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
5.7 KiB
5.7 KiB
Implementation Plan
Task Format
Work is sequenced test-first where the deliverable is new library API (TDD: red → green → refactor), then the scheduler-side migration is a behavior-preserving refactor verified by the existing --sim-verify tests.
-
1. Add a shared NULL-safe string helper to libxce (
utils.c/utils.h)- Add
int str_eq(const char* a, const char* b)beside the existingfloat_equalhelper: returns non-zero iff both arguments are NULL, or both non-NULL andstrcmp(a, b) == 0. - Document that it is the shared NULL-safe string-equality helper for the equality functions (and any future controller consumer).
- Requirements: 1.1–1.6, 2.1–2.3 (supporting)
- Boundary: utils.c, utils.h
- Add
-
2. Add allocation equality API to libxce (
xcealloc.c/xcealloc.h)- Implement
alloc_eq(const xce_alloc_t*, const xce_alloc_t*)comparingvalue,duration,resname,reserve(excludingfrom/instid), with the shared NULL convention. - Implement
host_alloc_eq(const xce_host_alloc_t*, const xce_host_alloc_t*)comparinghostthenallocs[i]in order. - Implement
job_alloc_eq(const xce_job_alloc_t*, const xce_job_alloc_t*)comparingjobid,allocs[i]in order, thenallocs_shared[i]in order. - Use
str_eqfromutils.hfor the string fields. - Declare all three in
src/include/xcealloc.hwith a per-function doc comment capturing the equality contract (including thefrom/instidexclusion and NULL/order semantics). - Requirements: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6
- Boundary: xcealloc.c, xcealloc.h
- Depends: 1
- Implement
-
3. Add pending-reason equality API to libxce (
preason.c/preason.h)- Implement
job_preason_eq(const xce_job_preason_t*, const xce_job_preason_t*)as a full structural match:main_reason, thenhost_based_reasons[i]in order (each byhostviastr_eq+reason), thenres_based_reasons[i]in order (each byresource+hostviastr_eq+reason), with the shared NULL convention. - Declare it in
src/include/preason.hwith a doc comment capturing the full-match contract (nothing excluded) and the NULL/order semantics. - Requirements: 2.1, 2.2, 2.3
- Boundary: preason.c, preason.h
- Depends: 1
- Implement
-
4. Add libxce unit tests for the new equality functions (TDD, before relying on them)
test_xcealloc.c:alloc_eqmatch/mismatch per field (value, duration, resname, reserve),from/instidexclusion,host_alloc_eqhost-name and order sensitivity,job_alloc_eqjobid + ordered hosts + ordered shared, NULL at top and nested levels.test_preason.c:job_preason_eqfull match — main-reason match/mismatch, host-based list match/mismatch per field and order, resource-based list match/mismatch per field and order, NULL handling; plusstr_eqNULL/NULL and NULL/non-NULL cases.- Confirm
src/lib/testsuitebuilds and passes (/xce-build lib). - Requirements: 4.3, 4.4
- Boundary: test_xcealloc.c, test_preason.c
- Depends: 2, 3
-
5. Migrate the simulator to the public API (
sim_verify.c)- Delete the five
staticcomparators (sim_verify_str_eq,sim_verify_alloc_eq,sim_verify_host_alloc_eq,sim_verify_job_alloc_eq,sim_verify_job_preason_eq). - Add a new
staticsimulator-localsim_verify_pend_outcome_eq(const xce_job_preason_t*, const xce_job_preason_t*)(or an inline check) that comparesmain_reasononly, documented with the bug-1845 rationale. - In
sim_decision_eq, replace the DISPATCH payload comparison withjob_alloc_eq(...)and the PEND payload comparison withjobidequality plus the local main-reason-only check. - Add
#include "xcealloc.h"and#include "preason.h"; keepsim_log_mismatchand thedescribe_*helpers unchanged. - Requirements: 3.1, 3.2, 3.3, 3.4
- Boundary: sim_verify.c
- Depends: 2, 3
- Delete the five
-
6. Migrate the three white-box test consumers to the public API
test_sim_equivalence.c,test_repl_equivalence.c,test_repl_limit_table.c: replace direct calls tosim_verify_job_alloc_eq→job_alloc_eqandsim_verify_job_preason_eq→job_preason_eq; add the two headers.- Where a file no longer needs
sim_decision_eq/sim_log_mismatch, drop its#include "../src/sim_verify.c"; otherwise keep it for the decision-level functions only. - Note: these fixtures produce zero-detail PEND reasons on both sides, so the switch from main-reason-only to full-match
job_preason_eqis behavior-preserving for them; verify with the full scheduler suite. - Requirements: 4.1, 4.2
- Boundary: test_sim_equivalence.c, test_repl_equivalence.c, test_repl_limit_table.c
- Depends: 5
-
7. Reconcile
test_sim_verify.cwith the relocated comparators- Remove the DISPATCH alloc-level unit tests that only re-prove the allocation comparators (identical-content match, per-field mismatch,
from/instidexclusion) — these are now owned by libxce tests from task 4. - Keep the PEND unit tests (identical-content match, jobid/main-reason mismatch, detail-ignored) — these now pin
sim_decision_eq's simulator-local main-reason-only behavior, not a libxce function. - Keep the
sim_decision_eq-level tests (kind mismatch, PREEMPT always-false, NULL defense) and all integration-level--sim-verifyround-trip tests, which now prove the relocation is behavior-preserving. - Requirements: 3.1, 3.4, 4.3
- Boundary: test_sim_verify.c
- Depends: 5
- Remove the DISPATCH alloc-level unit tests that only re-prove the allocation comparators (identical-content match, per-field mismatch,
-
8. Full build + test verification
/xce-build lib(debug + ASAN + tests) green./xce-build scheduler(debug + ASAN + tests) green, includingtest_sim_verify.c,test_sim_equivalence.c,test_repl_equivalence.c,test_repl_limit_table.c.- Requirements: 3.4, 4.4
- Depends: 4, 5, 6, 7