Knacky
873e52a2a1
feat(backend): c2 poll-on-read + output mapping (sprint 8 M3)
- adapter.py: add completed_at field to C2TaskStatus dataclass
- mythic.py: implement get_task() (GraphQL task query) and
get_task_output() (response query + decode_response_text concat)
- fake.py: deterministic state progression via per-instance call counter;
get_task_output raises C2Error until completed
- mapping.py: apply_task_to_simulation() idempotent output mapper
(mapping_applied anchor prevents double-writes)
- migration 0007: add mapping_applied BOOLEAN NOT NULL DEFAULT false to c2_task
- c2_task model: mapping_applied column added
- api/c2.py: GET /api/simulations/<id>/c2/tasks poll-on-read endpoint;
refreshes incomplete tasks from C2, fetches output on completion,
applies mapping, skips re-polling for completed tasks; best-effort
(C2Error on individual task skipped, returns 200 with stale status)
- 51 new tests (396 total); pytest/ruff/mypy all green
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 19:56:06 +02:00
..
2026-06-10 19:56:06 +02:00
2026-05-26 09:37:53 +02:00
2026-06-10 19:56:06 +02:00
2026-06-10 19:56:06 +02:00
2026-06-10 19:38:07 +02:00
2026-05-26 09:37:53 +02:00
2026-05-26 09:37:53 +02:00
2026-05-26 09:37:53 +02:00
2026-05-26 09:37:53 +02:00
2026-05-28 06:25:19 +02:00