Skip to content

APTL should own the observability stack as backend evidence-capture infrastructure #992

Description

@Brad-Edwards

Finding

APTL has no observability infrastructure of its own. The OpenTelemetry stack that serves evidence capture — collector, trace store, and the operator view over it — is currently declared by the TechVault scenario pack, as three nodes named aptl-otel-collector, aptl-tempo and aptl-grafana-otel.

That is the wrong owner. A scenario declares what the exercise happens in and what it needs captured; how capture is performed, where it is stored, and whether any of it is exposed to an operator are the backend's. The pack is being asked to remove them in OpenRAE/env-packs#337, and APTL needs to own them before that lands.

Why this is not just "move three containers"

The scenario's side of the contract is evidence_requirements, which states what must be captured without naming what captures it — scope, channel, media types, sensitivity, redaction, integrity, retention, loss disclosure. TechVault already declares one:

evidence_requirements:
  cortex-job-index-schema-readback:
    scope: fresh native schema readback projected to portable field semantics
    channel: api_response
    sensitivity: plain
    redaction: redact_secrets
    retention: run_lifetime
    loss_disclosure: required

So the deliverable is capture infrastructure that satisfies declared requirements of that shape, not a fixed Grafana deployment that happens to exist. Whatever APTL stands up should be answerable to those fields — particularly redaction, retention and loss_disclosure, which are promises about evidence rather than deployment details.

ADR-012 already frames the OTel stack as "always-on lab infrastructure (not optional)", and CORE_PROFILES = ("otel",) already marks the profile backend-owned and always selected. The ownership is stated; what is missing is realization that does not depend on a pack declaring the nodes.

The gap that makes sequencing matter

With an env-pack, the realized service set is derived from the pack. As raes_profiles.py records it: "An env-pack never reaches here: it ships no docker-compose.yml, so load_compose_profile_index returns an empty index (ADR-048) and node service identity is derived from the realization DTOs."

So today the pack is what causes those three containers to exist. Selecting the otel profile does not conjure services that no realization declares. Remove the nodes from the pack before APTL realizes them itself and evidence capture disappears rather than moves.

Symptom this also resolves

Grafana, Tempo and the collector currently run with container ports only and no host bindings, so nothing observability-related is reachable from the host:

aptl-grafana-otel     3000/tcp
aptl-tempo
aptl-otel-collector   4317-4318/tcp, 55678-55679/tcp

That contradicts ADR-012's http://localhost:3100, which the checked-in docker-compose.yml still publishes and which captured range snapshots under docs/raes/techvault-curated-live-validation-gate/ record as realized. Whether an operator-facing view is exposed, and on what port, becomes APTL's decision to make deliberately once it owns the stack. aptl lab start currently omits the Grafana line rather than printing a URL that answers nothing (#879), so nothing advertises a dead endpoint in the meantime.

Scope

  • Realize the capture stack as backend infrastructure, independent of any pack declaring it.
  • Tie it to the contract it serves: satisfy declared evidence_requirements, and be explicit about redaction, retention and loss disclosure rather than inheriting whatever the collector defaults to.
  • Decide and document the operator-facing surface, including whether it is published and where, so ADR-012 and the realized range agree.
  • Sequence with Remove the OTel nodes from TechVault: they are backend infrastructure, not scenario content OpenRAE/env-packs#337 so the pack's removal and APTL's ownership land together.

Found while making aptl lab start boot TechVault end to end (#879).

Requirements

  • EXP-010 — Capture Plan Admission and Evidence Acquisition

Expanded scope — raes-env-packs 5.2.0

The user authorized expanding #992 on 2026-09-12 to implement all four evidence contracts in the published raes-env-packs 5.2.0 / raes 3.5.0 TechVault scenario. PR OpenRAE/env-packs#338 has merged; 5.2.0 removes the three observability nodes and the earlier cortex-job-index-schema-readback requirement.

The delivery must now support:

  • cortex-enrichment-readback: exact enabled analyzer identity, bounded successful TechVaultScenarioContext_1_0 report for 172.20.1.30, and TheHive Cortex connector status, application/json, redact_secrets, checksum, run_lifetime, required loss disclosure.
  • suricata-local-rule-readiness: admitted image/content identities and realized-byte digests, native configuration success, selected sources, all 16 loaded local SIDs, text/plain, redact_sensitive, checksum, run_lifetime, required loss disclosure; no rule bodies or host paths in evidence.
  • suricata-login-sqli-alert: fresh participant-equivalent Kali POST /login containing UNION SELECT, exact Suricata SID 1000010 and Wazuh rule 303020 correlation, application/x-ndjson, redact_sensitive, checksum, run_lifetime, required loss disclosure.
  • redteam-session-transcript: every interactive shell session on the red-team workstation, commands and responses attributable and ordered in time, full run from readiness through teardown, participant_output/text/plain, redact_secrets, chain_of_custody, run_lifetime, required loss disclosure. MCP calls alone are not coverage of every shell session.

Closed scopes prohibit intrusion. Open scopes require the least intrusive option that genuinely meets all evidence terms. Prefer existing native evidence over new agents; do not add the optional OTel stack when it would intrude unnecessarily. Any observability additions, including unasked or ephemeral ones, must be permitted by RAE scopes and reported as actual realized resources to the runtime. Required unsupported evidence rejects admission; this is not permission to claim the four contracts implemented by rejecting them forever. Retain all lifecycle, redaction, custody, loss, packaging, dependency compatibility, clean-machine lab, and workflow gates. Do not merge PRs without the user's explicit approval.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    in-progressAn agent is actively working this issue via /implement

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions