Skip to content

REP-003 — Author CAGE-2 (Scenario2) as an ACES SDL document #637

Closed as not planned
1 of 1 issue completed
Closed as not planned

Description

@Brad-Edwards

REP-003 | FUNCTIONAL | MUST | Wave 4 | DRAFT

Requirements

  • REP-003 — Author CAGE-2 (Scenario2) as an ACES SDL document

Statement

ACES shall provide a validated SDL document expressing the TTCP CAGE Challenge 2 (Scenario2) scenario, including its network topology (the three subnets: user hosts, enterprise servers, and the critical operational server subnet), hosts, services, identities, participants/agents (red and blue), and objectives. The document shall resolve, verify imports, and publish cleanly through the ACES reference implementation, and shall live under examples/scenarios in the aces repository.

Rationale

The single authored source of truth that both backends realize; expressing CAGE-2 in ACES SDL is the core of the replication claim.


Created from Ground Control requirement REP-003

Milestone: Paper Slice: CAGE-2 Replication (ACES-Driven Sim) (#58)
Design: REP-001 / #635.

Author the TTCP CAGE Challenge 2 (Scenario2) scenario as an ACES SDL document under examples/scenarios/ in this repo (aces). Cover the three subnets (user hosts / enterprise servers / critical operational server), hosts, services, identities, red+blue participants, and objectives. Must resolve, verify-imports, and publish cleanly.

This SDL document is the single authored source of truth that both backends (CybORG sim adapter, ACES reference backend) realize in REP-005.

Out of scope (deferred): CAGE-2 emulation-backend realization.

Activity

  1. added
    in-progressAn agent is actively working this issue via /implement
    on Jul 4, 2026
  2. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    🛠️ Picked up by /implement — driver Claude Code, branch 637-REP-003-cage2-sdl, 2026-07-04T02:37:45Z.

  3. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc workflow phase recorded: preflight (issue #637). Posted by the MCP server to enforce ordering between workflow steps (issue #794 MVP-2). Do not edit or delete — used by downstream tools to gate phase prerequisites.

  4. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc workflow phase recorded: plan (issue #637). Posted by the MCP server to enforce ordering between workflow steps (issue #794 MVP-2). Do not edit or delete — used by downstream tools to gate phase prerequisites.

    Implementation Plan — REP-003: Author CAGE-2 (Scenario2) as an ACES SDL document

    Scope

    Deliver the TTCP CAGE Challenge 2 (Scenario2) scenario as a positive, reusable ACES SDL example under examples/scenarios/, authored entirely with existing SDL surfaces (ADR-069 / docs/decisions/cage-2-replication-design.md). This is the single authored source of truth both backends realize in REP-005. Emulation-backend realization is out of scope. The CAGE→ACES source-mapping ledger with upstream digests is downstream aces-adapters work (per the design layout); REP-003 records source provenance and mapping summary in a companion README, not a new SDL/schema surface.

    Source of truth (pinned)

    Topology authored from the pinned upstream Scenario2.yaml (cage-challenge/cage-challenge-2 @ 26ce1c1253fa9e2e73f25e6a7f2da32860c11257, CybORG/CybORG/Shared/Scenarios/Scenario2.yaml) and ADR-069 source pins.

    Files

    • Add examples/scenarios/cage-2-scenario2.sdl.yaml — the scenario.
    • Add examples/scenarios/cage-2-scenario2.README.md — companion doc (topology, participant identities, CAGE→ACES mapping summary + name mapping, source pins, resolve/verify/publish commands, loss disclosures, limitations, downstream links). Mirrors the paper-agent-loop.README.md precedent.
    • Update changelog.d/637.added.md — describe the new example (currently only mentions preflight guardrails).
    • Keep the preflight note docs/decisions/issue-637-rep-003-cage-2-sdl-preflight.md (from Step 2.5).

    Scenario content (existing SDL sections only; no CAGE-specific keys)

    • nodes: 3 switches (user-net, enterprise-net, operational-net) + 13 VMs preserving CAGE host names (User0–4, Enterprise0–2, Defender, Op_Server0, Op_Host0–2). Every VM carries resources (required to keep advisories == []), os, and role-appropriate services. Op_Server0 carries the critical ot-service and asset_value (High availability / Medium confidentiality per CAGE).
    • infrastructure: per-subnet CIDR/gateway/internal, host↔switch links (Enterprise0 bridges user↔enterprise; Op_Host0 bridges enterprise↔operational), and acls restricting inbound User→Operational (CAGE reachability rule).
    • entities: red / blue / green / white (evaluator) teams.
    • accounts: red foothold (SYSTEM privilege on User0) + representative green user accounts.
    • agents: red variants (B-line, Meander, Sleep), blue defender (Monitor/Analyse/Remove/Restore/decoys/Sleep), green user — with initial_knowledge, allowed_subnets, operating_scope, authority_anchors; red foothold = User0. Identities kept distinct.
    • vulnerabilities: CWE-classified exploitable services along the red discover→exploit→escalate→impact path.
    • relationships: pivot/monitoring edges (gateway reachability, blue monitors hosts).
    • conditions → metrics → evaluations → tlos → goals: OT-service availability + Op_Server0 integrity scoring pipeline.
    • objectives: red (reach/impact Op_Server0) and blue (protect OT service), bound to agents/targets/success.

    Verify (Step 4.4 loop, from implementations/python/)

    1. uv run aces sdl resolve ../../examples/scenarios/cage-2-scenario2.sdl.yaml (self-contained; writes lockfile with empty imports).
    2. uv run aces sdl verify-imports ../../examples/scenarios/cage-2-scenario2.sdl.yaml.
    3. uv run aces sdl publish ../../examples/scenarios/cage-2-scenario2.sdl.yaml --output-dir <tmp> (do NOT commit dist/).
    4. uv run python -m pytest tests/test_scenarios.py tests/test_example_schema_conformance.py -q — auto-discovers the new file; must load with zero advisories and validate against contracts/schemas/sdl/sdl-authoring-input-v1.json.
    5. Full gate: nox -s verify (repo policy, requirement governance, tests, docs). Ensure the generated aces.lock.json next to the scenario is either committed intentionally or removed; confirm no dist/ artifacts are staged.

    Governance

    • Requirement REP-003 (DRAFT); issue link is DOCUMENTS (correct for DRAFT). Phase E transitions DRAFT→ACTIVE post-merge and reconciles traceability (add DOCUMENTS link for the SDL example as a SPEC/DOCUMENTATION artifact).
    • GRC screening (Step 3.5) posted after commit against the real diff (base = merge-base with dev); examples/docs change, expected not-security-relevant.
    • No new authority-bearing artifacts outside specs/contracts/docs/implementations; no SDL syntax/schema/vocabulary changes.

    Out of scope

    CybORG adapter, aces-adapters, sim_adapter_base, backend conformance, replication/equivalence evidence, emulation realization, and the digest-bearing source-mapping ledger (downstream REP-004/REP-005).

  5. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc_codex_review — cycle 1 of 1 (pre-push) on issue #637 (branch 637-REP-003-cage2-sdl)

    Core review

    Verdict: ship-with-fixes

    The change is shaped mostly correctly: it adds CAGE-2 as a positive SDL corpus example, keeps the adapter/replication evidence out of the authored scenario, and uses existing SDL surfaces rather than creating CAGE-specific parser or schema vocabulary. The main design seam is the authored SDL representation of CAGE facts versus downstream realization; that seam is respected. The production-readiness issue is narrower: two red semantics in the SDL do not match the stated source-of-truth contract, so the document would publish as a valid-looking example while misrepresenting red variant execution and red success.

    Blocking findings (2):

    1. [one-off] Red objective is scored by a defensive integrity metric — examples/scenarios/cage-2-scenario2.sdl.yaml:330
      red-impact-op-server declares red success using op-server-integrity, but that metric is backed by op-server-integrity-intact, whose condition succeeds when there is no red privileged session on Op_Server0. That inverts the red objective: the authored red-impact objective is satisfied by the blue/defensive state rather than by impact or compromise. Add a red-positive condition/metric or otherwise model the red success criterion without reusing the defensive integrity metric.
    2. [class] Red policy variants do not all carry the authored foothold — examples/scenarios/cage-2-scenario2.sdl.yaml:271
      The README and scenario description state that the red policy variants share the User0 privileged foothold and that exactly one variant runs per episode, but only red-bline declares starting_accounts: [red-foothold]. red-meander and red-sleep are therefore authored with initial knowledge but no foothold account, which changes the CAGE-2 starting state for those variants.

    Security review

    Verdict: ship

    This change is shaped as a data/documentation-only REP-003 addition: a positive SDL scenario, sidecar README, changelog entry, and preflight note. It stays on the existing SDL authoring surfaces and does not add parser behavior, backend execution paths, trust-policy exceptions, repository queries, auth boundaries, or publication code. The main security-relevant seam is the scenario-authoring boundary versus downstream adapter/runtime realization; this diff keeps credentials, hidden truth, evaluator details, and replication evidence described as authored scenario facts rather than operational secrets. I do not see a concrete exploitable issue introduced by the diff.

    No blocking findings.

  6. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc_codex_review pre-push cycle 1 of 1 complete for issue #637 on branch '637-REP-003-cage2-sdl'. Posted by the MCP server to enforce the pre-push hard-cap-1 contract (issues #796, #804, #906). Do not edit or delete — used by the next gc_codex_review (uncommitted) invocation to count cycles.

  7. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Review decision record — codex cycle 1 (issue #637)

    Reviewer: codex
    Cycle: 1

    Architectural read:

    Core reviewer: The change is shaped mostly correctly: it adds CAGE-2 as a positive SDL corpus example, keeps the adapter/replication evidence out of the authored scenario, and uses existing SDL surfaces rather than creating CAGE-specific parser or schema vocabulary. The main design seam is the authored SDL representation of CAGE facts versus downstream realization; that seam is respected. The production-readiness issue is narrower: two red semantics in the SDL do not match the stated source-of-truth contract, so the document would publish as a valid-looking example while misrepresenting red variant execution and red success.

    Security reviewer: This change is shaped as a data/documentation-only REP-003 addition: a positive SDL scenario, sidecar README, changelog entry, and preflight note. It stays on the existing SDL authoring surfaces and does not add parser behavior, backend execution paths, trust-policy exceptions, repository queries, auth boundaries, or publication code. The main security-relevant seam is the scenario-authoring boundary versus downstream adapter/runtime realization; this diff keeps credentials, hidden truth, evaluator details, and replication evidence described as authored scenario facts rather than operational secrets. I do not see a concrete exploitable issue introduced by the diff.

    Blocking findings: 2

    Finding 1 — one-off

    • ID: F1
    • Title: [core] Red objective is scored by a defensive integrity metric
    • Location: examples/scenarios/cage-2-scenario2.sdl.yaml:330
    • Decision: fix
    • Rationale: red-impact-op-server declares red success using op-server-integrity, but that metric is backed by op-server-integrity-intact, whose condition succeeds when there is no red privileged session on Op_Server0. That inverts the red obje…

    Finding 2 — class (2 instances)

    • ID: F2
    • Title: [core] Red policy variants do not all carry the authored foothold
    • Location: examples/scenarios/cage-2-scenario2.sdl.yaml:271
    • Decision: fix
    • Rationale: The README and scenario description state that the red policy variants share the User0 privileged foothold and that exactly one variant runs per episode, but only red-bline declares starting_accounts: [red-foothold]. red-meander an…
    • Instances:
      • examples/scenarios/cage-2-scenario2.sdl.yaml:271
      • examples/scenarios/cage-2-scenario2.sdl.yaml:282
  8. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc_review_cap_disposition — issue #637 (codex, cycle 1 of 1)

    Disposition: proceed
    Auto-override grant #: n/a
    Rationale: Doc/unclassified surface only, purely additive diff, no security finding, and a small known finding shape (1 one-off + 1 class) — low risk enough to proceed without spending an over-cap cycle.

    Posted by the MCP server to record the review-cap auto-disposition. Do not edit or delete — the cycle wrappers read this marker to verify an over-cap auto-grant before running a cycle.

  9. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc_test_quality_review cycle 1 of 1 — issue #637

    Reviewer: test-quality (claude-sonnet-5 via gc_test_quality_review)
    Branch: 637-REP-003-cage2-sdl
    Cycle: 1 / 1
    Findings: 0 (clean run)

  10. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc_test_quality_review cycle 1 of 1 complete for issue #637 on branch '637-REP-003-cage2-sdl'. Posted by the MCP server to enforce the gc_test_quality_review hard-cap-1 contract (issue #884 follow-up, default lowered in #906). Do not edit or delete — used by the next gc_test_quality_review invocation to count cycles.

  11. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Review decision record — test-quality cycle 1 (issue #637)

    Reviewer: test-quality
    Cycle: 1
    Blocking findings: 0 (clean run)

  12. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    GRC screening record — issue #637

    Schema: gc.implement.grc-screening/v2
    Derived verdict: security_relevant (computed from derived facts + the GRC coverage graph — not agent-asserted)

    Rationale: Docs/examples-only change: adds a positive ACES SDL example scenario (examples/scenarios/cage-2-scenario2.sdl.yaml, data consumed by the SDL parser via existing tests), a companion README, a changelog fragment, and a preflight note. No executable source, backend/runtime code, auth surface, trust policy, parser behavior, or secret handling is added or changed; the SDL is authored data validated by existing test suites and the published schema.

    Provenance:

    • base b61eb024a37be7114d3c5cce645ae9ce3c7ef1fb → head 52f9abfc7c3e2d1fa158cd1248d718ac27b3eb63
    • derivation run: none · architecture snapshot: none

    Capture limits:

    • no_derivation_run: no derivation run for project; touched surface unclassified by adapters

    Impact set (existing coverage the change touches) — 0:

    • (none)

    Gap set (touched security-relevant surface with no coverage — must be modeled, controlled, or dispositioned before completion) — 1:

    • examples/scenarios/cage-2-scenario2.sdl.yaml — no_derivation_coverage

    Stale set (linked entities whose underlying code changed) — 0:

    • (none)

    Candidate threats (GC-GRC-007, deterministic) — 0:

    • (none — no architecture-model snapshot to enumerate against)

    Candidate controls (GC-GRC-008, deterministic) — 0:

    • (none)
  13. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc workflow phase recorded: grc_screening (issue #637). Posted by the MCP server to enforce ordering between workflow steps (issue #794 MVP-2). Do not edit or delete — used by downstream tools to gate phase prerequisites.

  14. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Ready for review — REP-003 (Phase D complete)

    PR #666 is ready to merge. All automated gates are green:

    • CI: success (run 28693973741)
    • SonarCloud: quality gate OK, 0 open issues, 0 hotspots
    • Codex review: ship-with-fixes → 2 blocking findings fixed (red objective was scored by the defensive integrity metric; red-meander/red-sleep lacked the shared red-foothold); security review ship; cap disposition proceed
    • Test-quality review: clean (no test files in diff)
    • Local: nox -s verify passes; aces sdl resolve / verify-imports / publish all succeed on the scenario

    One blocker to the automated readiness/completion record: the Step 3.5 GRC screening derived security_relevant with a single gap —
    examples/scenarios/cage-2-scenario2.sdl.yaml → no_derivation_coverage — whose capture limit is no_derivation_run ("no derivation run for project; touched surface unclassified by adapters"). Impact set 0, stale set 0, candidate threats/controls 0. This is the known no-derivation-baseline false positive for a docs/examples-only change; Ground Control derivation is not wired for this repo.

    gc_assert_completion (pre_merge) therefore refused with grc_not_reconciled. Clearing it cleanly needs a maintainer decision (audited GRC override vs. standing up a derivation baseline). Awaiting authorization — the workflow is paused at the merge touchpoint and no override has been self-applied.

    Next (Phase E, after merge + authorization): transition REP-003 DRAFT→ACTIVE, reconcile traceability (IMPLEMENTS: examples/scenarios/cage-2-scenario2.sdl.yaml), and post the reconciled final report (with the authorized GRC disposition), then close the issue.

  15. 1 remaining item

  16. Brad-Edwards commented on Jul 4, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Progress note — REP-003 re-scoped and paused (blocked)

    Scope correction. REP-003 was written narrowly ("author CAGE-2 as an ACES SDL document"). It is re-scoped to a full specification of the CAGE-2 environment AND experiment. (Issue wording should be updated to match.)

    PR #666 closed as a premature partial. The initial examples/scenarios/cage-2-scenario2.sdl.yaml passed every gate (nox verify, CI, SonarCloud, codex + test-quality reviews) but was an under-specified first cut: three-subnet topology / hosts / identities / objectives skeleton only, with corners a full spec must not cut — placeholder service ports and invented CWEs instead of the real data in the pinned CybORG image files; participant actions named but not modeled (no action-contracts / observation-boundaries / behavior-specs); execution controls omitted. Branch 637-REP-003-cage2-sdl retained for reference; do not merge.

    Semantics audit — what a full spec needs vs. what ACES implements today.

    Authorable now: subnets / hosts / services / processes / listeners; OS family; local accounts (uid/gid/groups); action-contracts; observation-boundaries (partial observability + discovery transitions); behavior-specifications; outcome-interpretation-rules; run count / allocation; seeds / stochastic controls; factors / conditions; red-variant selection; scenario-snapshot binding.

    Correction: plaintext credentials ARE representable via the secret_fixture classification (#471 / ADR-057; used in TechVault). CAGE's pi/raspberry is expressible today — in a runtime field, not on the accounts entry (see #673).

    Genuine blockers (facts a full CAGE-2 spec cannot express today) — #637 is blocked_by:

    Related open design questions (NOT blockers — the scenario doesn't depend on their outcome):

    Design through-line. ACES models ground truth (configuration, participants, actions, observations, execution); relational/perspectival claims (vulnerability, reward, score, "success") are prior/posterior to the system and belong in interpretation layers or as participant-informing content — not first-class environment/experiment semantics. Domain-neutrality corollary: ACES is an autonomous-organization-engineering foundation; cyber is one use case, so cyber-specific taxonomies (CWE) shouldn't be baked into the core.

    Next. When #122 / #674 / #675 land, re-author the full spec from the pinned CybORG sources (all ten image files): real services / ports / OS / accounts / credentials; action-contracts + observation-boundaries + behavior-specs for the full action set; and the experiment (turn order, step count, termination, runs, seeds, red-variant) via the new authoring surface. Treat #671 / #676 / #673 as inputs to how objectives and weaknesses are expressed.

  17. removed
    in-progressAn agent is actively working this issue via /implement
    on Jul 4, 2026
  18. Brad-Edwards commented on Aug 8, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Closing won't-do: scope moved to the adapters repo. Per OpenRAE/hub#3, RAES owns semantics/contracts/conformance; scenario content belongs beside its adapter (as nasim/cyberbattlesim/primaite scenarios already do). REP-003's location clause (SDL under examples/scenarios in aces) violates that boundary. Authoring the full CAGE-2 (Scenario2) SDL now tracked in adapters milestone 'CybORG CAGE-2 Research Demonstrator': OpenRAE/adapters#77.

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions