homelab-codex-ws/services/control-plane/tests
oskar 1dca438015 fix(supervisor): apply started_at suffix to redeploy action_id too
Domknięcie COMMIT 2 z task/incident-resolve-fix (2026-08-26):
redeploy-<node>-<service> carried the same latent collision risk as
container-restart-<node>-<service> before that fix — two different
incidents for the same node+service can still overwrite each other's
cancelled/completed/failed history.

Verified before applying the same fix: no code anywhere reconstructs
`redeploy-{node}-{service}` for an exact-match lookup.
_cancel_resolved_pending_actions matches on the node/service *fields*
inside each pending file, not the id string; executor.py, node_agent.py
and deploy-runner.sh all treat action_id as an opaque string read back
from the action's own JSON/marker file. Safe to extend the suffix.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VMn76yx2CNuHKFVMrYcKWA
2026-08-27 14:48:16 +02:00
..
__init__.py feat(control-plane): route ha-diag-agent events through supervisor 2026-05-29 15:59:23 +02:00
test_dormant_nodes.py feat(supervisor): duty-cycle nodes — liveness transitions logged, not actioned 2026-08-05 13:48:29 +02:00
test_executor_dispatch.py fix(dispatch): inbox 0o775 + rsync rc=23 przestaje byc cichy 2026-08-06 13:42:47 +02:00
test_executor_redeploy.py fix(control-plane): redeploy wykonywalny — dispatch do host-side deploy-runnera 2026-08-03 18:26:30 +02:00
test_incident_lifecycle.py fix(observer): make world/resolve-requests/ group-writable 2026-08-27 14:43:49 +02:00
test_liveness.py feat(observer): 3-state node liveness (fresh/stale/dead) + transitions + read-time net 2026-06-17 20:07:25 +02:00
test_observer_container_events.py fix(control-plane): unique container_restart action_id, no more history overwrite 2026-08-26 22:23:07 +02:00
test_observer_shadow_liveness.py feat(observer): persist SHADOW_LIVENESS_MISMATCH to mounted file — survives container recreate (cutover evidence) 2026-07-15 15:30:44 +02:00
test_operator_ui_liveness.py feat(observer): 3-state node liveness (fresh/stale/dead) + transitions + read-time net 2026-06-17 20:07:25 +02:00
test_state_reliability.py test(control-plane): atomic write and resilient loader coverage 2026-06-03 12:27:05 +02:00
test_supervisor_action_id_uniqueness.py fix(supervisor): apply started_at suffix to redeploy action_id too 2026-08-27 14:48:16 +02:00
test_supervisor_duty_cycle.py feat(supervisor): duty-cycle nodes — liveness transitions logged, not actioned 2026-08-05 13:48:29 +02:00
test_supervisor_ha.py feat(observer): 3-state node liveness (fresh/stale/dead) + transitions + read-time net 2026-06-17 20:07:25 +02:00
test_supervisor_loop_resilience.py fix(supervisor): odpornosc petli na zawieszenie + timeout blokujacych wywolan — petla stanela cicho po ha_websocket_dead (mozg martwy 24h, healthy ale nie tika) 2026-07-16 16:17:20 +02:00
test_supervisor_node_events.py feat(observer): 3-state node liveness (fresh/stale/dead) + transitions + read-time net 2026-06-17 20:07:25 +02:00