diff --git a/.kiro/specs/eliminate-frontend-makefile/spec.json b/.kiro/specs/eliminate-frontend-makefile/spec.json index 1afa10cd..9e0cf737 100644 --- a/.kiro/specs/eliminate-frontend-makefile/spec.json +++ b/.kiro/specs/eliminate-frontend-makefile/spec.json @@ -1,9 +1,9 @@ { "feature_name": "eliminate-frontend-makefile", "created_at": "2026-08-27T00:00:00Z", - "updated_at": "2026-09-03T13:01:25Z", + "updated_at": "2026-09-29T12:59:52Z", "language": "en", - "phase": "tasks-generated", + "phase": "implemented", "description": "Remove src/frontend/Makefile entirely, consolidating Go builds (apiserver, xcecli) and their tests onto Meson's tools/go_build wrapper. Closes a real, already-realized duplicate version-fingerprint-computation risk (roadmap.md backlog item, recorded 2026-08-21). Path C single-scope investigation via /kiro-discovery, 2026-08-27.", "approvals": { "requirements": { diff --git a/.kiro/specs/scheduler-sim-diagnostics/spec.json b/.kiro/specs/scheduler-sim-diagnostics/spec.json index 5e397a65..5c0575ee 100644 --- a/.kiro/specs/scheduler-sim-diagnostics/spec.json +++ b/.kiro/specs/scheduler-sim-diagnostics/spec.json @@ -1,9 +1,9 @@ { "feature_name": "scheduler-sim-diagnostics", "created_at": "2026-08-16T11:02:06Z", - "updated_at": "2026-09-20T03:30:00Z", + "updated_at": "2026-09-29T12:59:52Z", "language": "en", - "phase": "tasks-generated", + "phase": "implemented", "description": "Open-ended simulation-mode REPL diagnostics spec. First capability: limit inspection (info limit ) showing configured setting (scope, value/percent) and live accounted usage per instance. Requirement 6 (added 2026-09-19): human-readable unit scaling for byte-valued limit amounts, designed via a fmt_limit_units() sibling entry point plus a promoted shared-lib byte-formatter (utils.c), tasks 7-10. Future capability (seed capability 2, not yet in requirements.md): decision-reasoning trace for pend/dispatch outcomes.", "approvals": { "requirements": { diff --git a/.kiro/specs/scheduler-sim-diagnostics/tasks.md b/.kiro/specs/scheduler-sim-diagnostics/tasks.md index ac00791e..f269061f 100644 --- a/.kiro/specs/scheduler-sim-diagnostics/tasks.md +++ b/.kiro/specs/scheduler-sim-diagnostics/tasks.md @@ -75,7 +75,7 @@ - _Requirements: 6.1, 6.3, 6.5, 5.3_ - _Boundary: Shared Units Formatter, REPL Limit Info Command (the retyped composer and its thin-wrapper callers live in `repl_info.c`/`repl_fmt.c`)_ -- [ ] 8. Core: Human-readable configured-setting display +- [x] 8. Core: Human-readable configured-setting display - [x] 8.1 Add a display-mode-aware way to render a limit's configured setting - New entry point produces the same configured-setting output the existing formatter already produces, except a byte-valued, non-percentage resource's amount renders in human-readable form according to a supplied display mode - The existing formatter's own output is provably unchanged for every input it can be given — proven by its complete pre-existing test coverage continuing to pass with zero modification @@ -99,7 +99,7 @@ - _Depends: 7_ — task 7 retypes the exact shared formatting call chain this task's fix flows through (the limit usage display's classification feeds into that same composer); sequencing after 7 avoids two tasks editing overlapping logic in an uncoordinated order, not a data dependency on any new symbol this task itself needs - _Boundary: REPL Limit Info Command_ -- [ ] 10. Validation: Confirm correctness, consistency, and no regression +- [x] 10. Validation: Confirm correctness, consistency, and no regression - [x] 10.1 Re-verify existing test coverage against the corrected usage display - Task 9 found that fixing the resource-classification defect did NOT break any pre-existing assertion outright — instead, several existing assertions on the live usage display's amounts turned out to be loose substring checks against whole-number fixture values, which happen to still match the corrected, human-augmented output by coincidence of formatting (the old expected text is a literal prefix of the new one) rather than by genuinely exercising the fix - Identify every such loose, coincidentally-still-passing assertion, and strengthen each one to assert the actual corrected output precisely enough that it would fail if the resource-classification fix were reverted diff --git a/.kiro/specs/scheduler-sim-live-allocation/spec.json b/.kiro/specs/scheduler-sim-live-allocation/spec.json index eb1ef0b7..34c7c553 100644 --- a/.kiro/specs/scheduler-sim-live-allocation/spec.json +++ b/.kiro/specs/scheduler-sim-live-allocation/spec.json @@ -1,9 +1,9 @@ { "feature_name": "scheduler-sim-live-allocation", "created_at": "2026-09-18T06:48:27Z", - "updated_at": "2026-09-18T09:45:00Z", + "updated_at": "2026-09-29T12:59:52Z", "language": "en", - "phase": "tasks-generated", + "phase": "implemented", "approvals": { "requirements": { "generated": true, diff --git a/.kiro/specs/scheduler-sim-live-allocation/tasks.md b/.kiro/specs/scheduler-sim-live-allocation/tasks.md index ff7bbdc8..ded96dbb 100644 --- a/.kiro/specs/scheduler-sim-live-allocation/tasks.md +++ b/.kiro/specs/scheduler-sim-live-allocation/tasks.md @@ -1,6 +1,6 @@ # Implementation Plan: scheduler-sim-live-allocation -- [ ] 1. Foundation: independent core-safe seams and leaf migrations +- [x] 1. Foundation: independent core-safe seams and leaf migrations - [x] 1.1 (P) Give the allocation dispatch chokepoint an optional, normal-mode-only performance cache seam - Add two NULL-by-default callback fields to the shared core state for consulting and populating the unsatisfiable-resreq cache, mirroring the existing session-reset callback's proven shape (a bare function pointer taking the core state directly, no wrapper struct, no opaque handle) - Implement the two adapter functions against the real cache, in the same file the existing session-reset adapter already lives in, registered only during normal-mode startup @@ -24,7 +24,7 @@ - _Requirements: 1.3, 3.1, 3.2_ - _Boundary: Core-Safe Allocation Chain_ -- [ ] 2. Core: driver-agnostic allocation search and dispatch +- [x] 2. Core: driver-agnostic allocation search and dispatch - [x] 2.1 Thread shared core state through the per-job allocation context and the per-host allocation attempt - Change the per-job allocation context's driver-reference field to carry shared core state instead of a normal-mode-only pointer, updating its handful of existing cast sites - Re-type the per-host allocation-attempt function (which calls the three capacity checks from 1.3 and the prepare-allocation hook from 1.2) to take shared core state directly @@ -55,7 +55,7 @@ - _Requirements: 2.1, 2.2, 2.3, 2.4_ - _Boundary: Limit Plugin Core-Safe Matching_ -- [ ] 3. Core: unify job election and allocation into one implementation +- [x] 3. Core: unify job election and allocation into one implementation - [x] 3.1 Extract the job-picking and allocation loop into a single implementation shared by both drivers - Move the job-picking thread body and the allocation thread body out of the normal-mode-only file they live in today, into their own file, re-typed to operate on shared core state directly - Confirm every call this pair makes is already driver-agnostic after tasks 1.2/2.1/2.2 — no remaining reference to anything normal-mode-only @@ -66,7 +66,7 @@ - _Requirements: 1.1, 1.2, 5.1_ - _Boundary: Unified Picker/Allocator Threads_ -- [ ] 4. Integration: wire simulation mode onto the shared implementation +- [x] 4. Integration: wire simulation mode onto the shared implementation - [x] 4.1 Replace simulation mode's placeholder picker with the shared picker/allocator pair - Replace simulation mode's own always-pend placeholder thread with the shared job-picking and allocation thread pair from 3.1, spawned against simulation mode's own core state - Confirm the existing one-job-at-a-time hand-off guarantee between picking and allocating still holds now that simulation mode genuinely uses it for the first time @@ -94,7 +94,7 @@ - _Requirements: 2.2_ - _Boundary: Unified Picker/Allocator Threads, Limit Plugin Core-Safe Matching_ -- [ ] 5. Validation: prove equivalence and the concrete acceptance test +- [x] 5. Validation: prove equivalence and the concrete acceptance test - [x] 5.1 Prove identical decisions and accounting state under resource contention across both drivers - Build a resource-contention fixture (multiple jobs, capacity insufficient for all of them, including capacity constrained by a matching limit) and drive it through both drivers - Observable: both drivers produce the same admission/pend outcome and the same final resource-accounting state for the identical input diff --git a/.kiro/specs/xce-test-cli-ux/spec.json b/.kiro/specs/xce-test-cli-ux/spec.json index d88cf874..ff12b74c 100644 --- a/.kiro/specs/xce-test-cli-ux/spec.json +++ b/.kiro/specs/xce-test-cli-ux/spec.json @@ -1,9 +1,9 @@ { "feature_name": "xce-test-cli-ux", "created_at": "2026-08-26T08:38:15Z", - "updated_at": "2026-09-08T22:15:00Z", + "updated_at": "2026-09-29T12:59:52Z", "language": "en", - "phase": "tasks-generated", + "phase": "implemented", "approvals": { "requirements": { "generated": true, diff --git a/.kiro/specs/xce-test-cli-ux/tasks.md b/.kiro/specs/xce-test-cli-ux/tasks.md index 3d087117..534f3dcc 100644 --- a/.kiro/specs/xce-test-cli-ux/tasks.md +++ b/.kiro/specs/xce-test-cli-ux/tasks.md @@ -1,6 +1,6 @@ # Implementation Plan -- [ ] 1. Foundation: shared libraries, process-level fixes, and test harness +- [x] 1. Foundation: shared libraries, process-level fixes, and test harness - [x] 1.1 Build the flag-descriptor table format and getopt_long-based parsing/rejection core - Define the flag-descriptor structure (short form, long form, concept name, required flag, default description) and a builder that produces a getopt_long-compatible option table from it - Implement the shared rejection path: an unrecognized or malformed flag prints the offending flag plus the command's usage summary to stderr and returns a nonzero result @@ -51,7 +51,7 @@ - Observable completion: a smoke test using the new harness launches the client, sends a trivial command, and confirms the expected output arrives on the correct stream with the expected exit code - _Boundary: Testing Infrastructure_ -- [ ] 2. Core: independent new capabilities and standalone fixes +- [x] 2. Core: independent new capabilities and standalone fixes - [x] 2.1 (P) Build the destructive-command confirmation gate and its session-scoped toggle - Implement a confirmation check that prompts the operator on stderr before proceeding, returns a distinct "not run" outcome on decline, and treats an interrupt during the prompt the same as a decline - Add a bypass flag usable per invocation and a session-scoped toggle (mirroring the existing continue-on-error toggle's style) that both default to requiring confirmation and both reset at process start @@ -97,7 +97,7 @@ - _Requirements: 12.1_ - _Boundary: Bug-1557 Fix_ -- [ ] 3. Integration: migrate existing commands onto the new foundations +- [x] 3. Integration: migrate existing commands onto the new foundations - [x] 3.1 Migrate every flag-accepting command's parsing to the shared validation library - Convert every command currently parsing flags via the older mechanisms (including the one command using a fully hand-rolled long-flag parser) to the shared descriptor-table-driven parsing built in 1.1/1.2, so every one uniformly rejects an unrecognized or malformed flag and gains a long-form equivalent for each concept - While migrating the queue-control command, initialize its action selection to an explicit unset sentinel and reject the invocation if none of its mutually-exclusive action flags was given, matching its sibling host-control command's existing pattern @@ -148,7 +148,7 @@ - _Boundary: Command Dispatcher_ - _Depends: 3.1, 3.2, 3.3, 3.4, 3.5_ -- [ ] 4. Validation: end-to-end verification +- [x] 4. Validation: end-to-end verification - [x] 4.1 Verify Ctrl-C cancellation end-to-end - Confirm interrupting a command blocked on a real request abandons the wait well before its own timeout, reports the command as failed, and leaves the session's context and connection usable - Confirm that issuing a second command on the same connection immediately after an interrupt does not race the abandoned request, and that a command on a different connection is unaffected