Files
mimic-big/tasks/open-questions.md
knacky 2ead16114d docs(spec): land D-011 (regex_extract) + D-012 (output_blob_ref storage)
D-011 freezes the regex_extract Jinja filter signature
`regex_extract(text, pattern, *, group=1, name=None)`, google-re2 engine,
raise on no-match — unblocks backend B0.5 templating sandbox.

D-012 splits storage in two pools: `blobs/` (CAS sha256 + gzip) for C2
binary outputs and `evidence/` (flat per engagement) for user uploads,
10 MB per-blob cap, no global quota v1.

Q-001 and Q-002 removed from open-questions.md (resolved).
Q-003/Q-004/Q-005 marked `deferred` with explicit re-open conditions.
2026-05-21 20:20:27 +02:00

74 lines
3.5 KiB
Markdown

# Open spec questions
Structured questions raised in flight by the team. Each entry is a candidate for
team-lead escalation **before** code touches the area. Resolved questions move
to `spec-decisions.md` (with a `D-NNN` id) and are deleted from here.
Format:
- **Q-NNN** — one-line title
- **Where it bites**: the F* or §-anchor in the spec
- **What is silent**: the precise gap
- **Options**: numbered alternatives with tradeoffs
- **Recommended default if no decision**: the safest path forward
- **Status**: `open` / `deferred — re-open when …` / resolved entries are
moved to `spec-decisions.md`
---
## Q-003 — `/engagements/:id/hosts/sync` merge semantics
- **Status**: **deferred** — re-open when F4 sync endpoint lands (post-sprint-0,
needs PR1 closed).
- **Where it bites**: F4 + §9 endpoint `/engagements/:id/hosts/sync`.
- **What is silent**:
- Merge vs replace: do hosts that disappear from C2 get deleted, marked
`status = "stale"`, or kept untouched?
- What if a manually-added host conflicts (same hostname, different
`c2_session_id`)?
- Source of truth: the C2 session ID, the hostname, the IP, a tuple?
- Cascading effect: a `host` referenced by `scenario_step.host_id` deleted
mid-engagement breaks the scenario silently.
- **Options**:
1. **Merge + mark stale**: insert new, update changed, mark missing as
`status = "stale"` (never delete). Conflicts: manual entry wins,
C2-synced entry is appended with a suffix and an audit_log entry.
2. **Replace**: delete all sync-sourced rows, reinsert from C2. Manual
entries kept untouched. Simple but loses history.
3. **Merge by tuple `(hostname, c2_session_id)`** with status tracking,
conflicts always raise and require manual resolution UI.
- **Recommended default if no decision**: option 1. Stale > deleted: a deleted
host breaks `scenario_step.host_id` and the audit trail. Conflict policy:
manual wins, C2 entry suffixed and audit-logged.
## Q-004 — `payload_type` → C2 home command mapping (depends on PR2)
- **Status**: **deferred** — re-open with PR2 (internal C2 interface spec).
- **Where it bites**: §7 enum `payload_type`, right column "C2 maison" is fully
TBD; F2 import journal C2 home parser; B0.4 `C2Connector` factory.
- **What is silent**: entirety of the C2 home mapping table, plus the exact
return semantics of `HomeConnector.execute_task / get_task_result / cancel_task
/ execute_cleanup` (PR2).
- **Options**: no in-flight options — this is owned by PR2.
- **Recommended default if no decision**: keep `HomeConnector` as a stub that
raises `NotImplementedError` (per B0.4: "no real implementation"). Block any
attempt to ship `HomeConnector` v1 logic until PR2 is closed.
## Q-005 — Stale-host policy after engagement archival
- **Status**: **deferred** — re-open with the F12 archival CLI.
- **Where it bites**: §8 `host.status`, engagement lifecycle, F12.
- **What is silent**: when an engagement is archived, what happens to its
hosts? Detach session, freeze status, leave as-is?
- **Options**:
1. Set `host.status = "archived"` cascading from `engagement.status`.
2. Keep status untouched, rely on `engagement.status` upstream.
- **Recommended default if no decision**: option 2 — engagement state is the
single source of truth, hosts inherit by JOIN.
---
## Resolved (moved to `spec-decisions.md`)
- Q-001 → **D-011**`regex_extract` Jinja2 filter semantics.
- Q-002 → **D-012**`output_blob_ref` storage layout.