Skip to content

feat(cyberbattlesim): implement the conformant simulator backend target #27

Description

@Brad-Edwards

Objective

Implement raes_adapters.cyberbattlesim as a conformant simulator backend over the selected source profile.

Scope

  • Add the cyberbattlesim optional extra and module without changing base-only installation.
  • Implement Provisioner target construction and an evidence-backed backend-manifest-v2.
  • Implement Orchestrator logical steps, reset/termination, admitted-action translation, receipts, and mapped state transitions.
  • Implement ParticipantRuntime lifecycle, participant-relative observations, action admission, histories, sequence/linkage, and exposure controls.
  • Implement Evaluator projection of simulator reward/result facts into distinct RAES objectives, evidence, derived measures, and limitations.
  • Reuse raes_adapters.base and published RAES contracts directly.
  • Keep native simulator objects, IDs, tuples, arrays, logs, paths, hidden state, exceptions, argv/environment data, credentials, and tracebacks inside the driver.
  • Provide deterministic cleanup and failure-path tests.

Acceptance criteria

  • The selected RAES scenario constructs and runs through all applicable backend surfaces.
  • Manifest capabilities have executable evidence and unsupported facts are rejected or disclosed.
  • Every admitted action joins to one driver operation, typed terminal result, and participant/episode identity.
  • Observation and evaluator-only boundaries pass positive and negative disclosure tests.
  • Reset, seed/control reporting, termination, and cleanup match the selected source protocol.
  • Portable artifacts contain only RAES contract data and stable source references.
  • The canonical verification graph passes with this extra and with unrelated extras isolated.

Dependencies

Activity

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

    @Brad-Edwards
    CollaboratorAuthor

    🛠️ Picked up by /implement - driver codex, branch 27-cyberbattlesim-backend, 2026-07-30T18:18:43.041Z.

  3. Brad-Edwards commented on Jul 30, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc workflow phase recorded: preflight (issue #27). 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 30, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Execution obligation OB-27-CYBERBATTLESIM-ADMISSION — Opened

    Category: quality
    Observed state: The selected CyberBattleSim profile is canonically not admissible, and the repository deliberately has no cyberbattlesim optional extra.
    Impact: Implementing issue #27 now would require adding the optional extra, constructing a live target, and claiming evidence-backed capabilities in direct contradiction to the canonical qualification record and an enforced repository invariant. It would make the package claim installability and conformance that the selected source evidence does not support.
    Current obligation: Complete a governed CyberBattleSim requalification that selects an admissible publishable artifact, binds every declared random stream through reset and evaluation, and resolves or explicitly patches and qualifies the material benchmark/evaluation defects before backend implementation resumes.

    Evidence

  5. Brad-Edwards commented on Jul 30, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Execution obligation OB-27-CYBERBATTLESIM-ADMISSION — Escalated

    Category: quality
    Observed state: The selected CyberBattleSim profile is canonically not admissible, and the repository deliberately has no cyberbattlesim optional extra.
    Impact: Implementing issue #27 now would require adding the optional extra, constructing a live target, and claiming evidence-backed capabilities in direct contradiction to the canonical qualification record and an enforced repository invariant. It would make the package claim installability and conformance that the selected source evidence does not support.
    Current obligation: Complete a governed CyberBattleSim requalification that selects an admissible publishable artifact, binds every declared random stream through reset and evaluation, and resolves or explicitly patches and qualifies the material benchmark/evaluation defects before backend implementation resumes.

    Evidence

    Pause class: hard_external_dependency
    Decision request: Provide the issue or artifact revision where the three qualification blockers were resolved, or explicitly authorize expanding issue #27 to perform a governed requalification (including the approved publishable/repackaged artifact and patch disposition) before implementing the backend. Once one of those is available, ask me to resume issue #27.

    This obligation remains open while the decision is pending.

  6. Brad-Edwards commented on Jul 30, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc workflow phase recorded: plan (issue #27). 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

    1. Correct qualification semantics before runtime work: treat maintainer-selected CyberBattleSim and CybORG profiles as admitted, convert packaging/randomness/upstream defects from vetoes into explicit limitations and claim-strength bounds, publish dependency-light extras, and reconcile qualification/protocol/ledger/guardrail tests and GitHub qualification issues.
    2. Add failing contract-level tests for raes_adapters.cyberbattlesim covering target construction, manifest/component agreement, unsupported capability rejection/disclosure, participant lifecycle, action translation, observation sealing, evaluator separation, stochastic-control reporting, termination, and idempotent cleanup. Use an injected deterministic fake native driver so the adapter contract is testable without publishing or pretending to install the upstream simulator.
    3. Implement a module-private CyberBattleSim driver boundary. Lazy-load the separately installed pinned simulator only when a real target is constructed; keep native observations, masks, tuples, reward vectors, identifiers, info, object representations, exceptions, and tracebacks inside the driver. Bind/reset each available random stream and report partial/unbound controls without claiming deterministic replay.
    4. Implement the published RAES protocol surfaces: a Provisioner that realizes validated plans, an Orchestrator that owns workflow state without replaying simulator actions, a BaseParticipantRuntime subclass whose _model_action performs exactly one admitted driver operation and returns one typed terminal result joined to participant/episode/action identities, and an Evaluator that projects only evaluator-owned facts without advancing the simulator.
    5. Build an evidence-backed backend-manifest-v2 and RuntimeTarget using RAES-owned models and raes_adapters.base plumbing. Claim only executable capabilities, reject unsupported requests, disclose the authored-to-native topology and stochastic/packaging/outcome limitations, and keep CyberBattleSim semantics entirely inside raes_adapters.cyberbattlesim.
    6. Add positive and negative tests proving participant observations cannot expose evaluator-only or hidden native state; action results cannot contain native ids/reward/info; every admitted action joins one driver receipt and one terminal RAES result; reset/seed/termination/cleanup ordering is explicit; cleanup is deterministic, idempotent, partial-construction-safe, and failure-preserving.
    7. Update package exports, docs, optional-extra verification, and requirement-to-test mapping. Run focused tests during TDD, then the canonical uv tool run --from 'nox[uv]==2026.4.10' nox -s verify graph using the issue branch's requirement UID (or the repository's genuine requirement-free skip mechanism for this issue).
    8. Run the mandatory pre-push code and test-quality review cycles, fix all actionable findings within the configured caps, publish the branch and draft PR through Ground Control, monitor CI/Sonar to terminal success, and post the final readiness evidence. No merge into the protected default branch is included.
  7. Brad-Edwards commented on Jul 30, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Execution obligation OB-27-CYBERBATTLESIM-ADMISSION — Resolved

    Category: workflow
    Observed state: Qualification records and surrounding repository/GitHub text previously used not-admissible/blocker language as a hard implementation gate.
    Impact: The earlier interpretation incorrectly treated simulator limitations as authority to stop issue #27 and would have prevented the adapter demonstration the issue requires.
    Current obligation: Correct the CyberBattleSim admission misunderstanding and prevent the same qualification-veto semantics elsewhere in adapter evidence.

    Evidence

    Disposition: fix
    Corrective action: Replaced the veto-style qualification model in both CyberBattleSim and CybORG with maintainer-authorized admission plus explicit claim-strength limitations; added the CyberBattleSim dependency-light extra; reconciled qualification tests, source pointers, protocol/ledger prose, and architecture guardrails; audited and corrected the related GitHub qualification issues.

    Verification

    • uv run pytest -q tests/test_cyberbattlesim_qualification.py tests/test_cyborg_qualification.py tests/test_cyborg_source_ledger.py tests/test_cyberbattlesim_scenario_ledger.py: 65 passed
    • Repository search finds no remaining not-admissible, qualification-blocker, or feasibility-gate wording in README.md, docs, src, tests, or pyproject.toml
  8. 1 remaining item

  9. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc_codex_review pre-push cycle 1 of 1 complete for issue #27 on branch '27-cyberbattlesim-backend'. 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.

  10. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

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

    Reviewer: codex
    Cycle: 1

    Architectural read:

    Core reviewer: The change is directionally organized around the right backend-local seam: one serialized native driver, the canonical runtime-target builder, BaseParticipantRuntime, and typed evidence and cleanup contracts. Three load-bearing boundaries remain misshaped, however: participant admission loses its targets and arguments before native execution, the backend recreates RAES-owned protocol catalogs and result envelopes, and incremental UNCHANGED operations mutate state without reporting a change. These are structural contract issues rather than polish; the action seam forecloses correct multi-target behavior, while the duplicated protocol structures establish a second semantic boundary. I would not ship this shape yet.

    Security reviewer: The change correctly isolates native simulator state behind a serialized driver and projects typed RAES outputs, but it also replaces fail-closed qualification with execution of a separately installed package. Runtime source attestation is therefore the critical security seam. That seam is incomplete because the files verified through distribution metadata are not bound to the modules subsequently resolved and executed by Python's global import machinery. The driver/factory shape supports future profiles, but this trust boundary must be fixed first.

    Blocking findings: 4

    Finding 1 — class (4 instances)

    • ID: F1
    • Title: [core] Action execution discards the admitted target and then reports it as affected
    • Location: src/raes_adapters/cyberbattlesim/backend/participant_runtime.py:211
    • Decision: fix
    • Rationale: After admission, _model_action passes only action_kind to the driver. _resolve_native_action consequently selects the first available mask coordinate, so neither request.validated_selection.normalized_arguments nor `request.target_…
    • Instances:
      • src/raes_adapters/cyberbattlesim/backend/driver.py:86
      • src/raes_adapters/cyberbattlesim/backend/driver.py:293
      • src/raes_adapters/cyberbattlesim/backend/participant_runtime.py:211
      • src/raes_adapters/cyberbattlesim/backend/participant_runtime.py:264

    Finding 2 — class (5 instances)

    • ID: F2
    • Title: [core] Backend recreates RAES-owned protocol catalogs and result envelopes
    • Location: src/raes_adapters/cyberbattlesim/backend/manifest.py:39
    • Decision: fix
    • Rationale: The architecture record identifies the published supported-contract catalog and the workflow/evaluation lifecycle and history models as the canonical semantic owners, but the implementation copies the contract catalog into `_SUPPORTED_CONT…
    • Instances:
      • src/raes_adapters/cyberbattlesim/backend/manifest.py:39
      • src/raes_adapters/cyberbattlesim/backend/orchestrator.py:112
      • src/raes_adapters/cyberbattlesim/backend/orchestrator.py:153
      • src/raes_adapters/cyberbattlesim/backend/evaluator.py:228
      • src/raes_adapters/cyberbattlesim/backend/evaluator.py:261

    Finding 3 — class (4 instances)

    • ID: F3
    • Title: [core] UNCHANGED operations still mutate component state
    • Location: src/raes_adapters/cyberbattlesim/backend/evaluator.py:86
    • Decision: fix
    • Rationale: The evaluator treats every non-delete operation, including UNCHANGED, as requiring a fresh driver projection, timestamps, evidence, result, and history. The orchestrator likewise replaces entries and workflow results, while the provision…
    • Instances:
      • src/raes_adapters/cyberbattlesim/backend/evaluator.py:86
      • src/raes_adapters/cyberbattlesim/backend/evaluator.py:149
      • src/raes_adapters/cyberbattlesim/backend/orchestrator.py:79
      • src/raes_adapters/cyberbattlesim/backend/provisioner.py:98

    Finding 4 — class (5 instances)

    • ID: F4
    • Title: [security] Partial source hashing does not authenticate the modules that are executed
    • Location: src/raes_adapters/cyberbattlesim/backend/driver.py:138
    • Decision: fix
    • Rationale: Attacker model: a supply-chain adversary supplies the separately installed simulator package, or a local attacker places a shadow module earlier on sys.path before provisioning triggers the lazy import. The integrity gate hashes four files…
    • Instances:
      • src/raes_adapters/cyberbattlesim/backend/driver.py:138
      • src/raes_adapters/cyberbattlesim/backend/driver.py:139
      • src/raes_adapters/cyberbattlesim/backend/driver.py:140
      • src/raes_adapters/cyberbattlesim/backend/driver.py:141
      • src/raes_adapters/cyberbattlesim/backend/driver.py:142
  11. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc_codex_review — cycle 2 of 1 (pre-push) on issue #27 (branch 27-cyberbattlesim-backend)
    Diff mode: inline — the complete diff was supplied in one prompt

    Core review

    Verdict: ship-with-fixes

    The change is shaped correctly in its main dependency direction: CyberBattleSim semantics remain backend-local, the private driver owns native state, and the implementation composes RAES-owned manifest, runtime-target, participant, evaluation, and cleanup contracts rather than extending raes_adapters.base. The unresolved seam is trial lifecycle: component latches and evaluator artifact identities have process lifetime even though the target advertises reusable state. That breaks the obvious next variation—multiple trials on one target—and must be corrected before production use.

    Blocking findings (2):

    1. [one-off] Provisioner lifetime latch survives driver cleanup — src/raes_adapters/cyberbattlesim/backend/provisioner.py:79
      _constructed records that construction happened once, not that the shared driver is currently live. Cleanup can destroy and close that driver, but the flag is never cleared; the next CREATE or UPDATE skips driver.construct() and returns an applied portable snapshot with no native environment. This breaks multi-trial reuse and conflicts with the manifest's reusable-state claim. The driver's construct() is already idempotent, so invoke it whenever a mutating plan requires a live source, or query an authoritative driver lifecycle state. Add a create → destroy cleanup → create test.
    2. [class] Evaluator reuses immutable artifact identities across runs — src/raes_adapters/cyberbattlesim/backend/evaluator.py:406
      The evaluator emits current timestamps, scores, and checksums under process-global run, evidence-record, content, capture-spec, capture-window, and derived-measure identifiers with constant versions. A second evaluation changes the data while preserving every identity, so evidence references can alias artifacts from another trial. Scope instance identifiers to the authoritative run or execution identity, keeping only genuine definition identifiers static, and test that two evaluations with different rewards produce distinct, internally consistent references.

    Security review

    Verdict: don't-ship

    The change correctly concentrates native simulator state and transitions behind a backend-local driver, with sanitized participant, evaluator, and cleanup projections. That driver is also the new supply-chain trust boundary: it imports separately installed executable code while claiming source-identity verification. The verification does not cover every executable artifact or establish dependency authenticity, so compiled-module and same-version package substitutions bypass the intended fail-closed seam. This shape cannot safely support the obvious next variation—packages containing native modules—without artifact-level attestation.

    Blocking findings (1):

    1. [class] Partial package attestation permits arbitrary code execution — src/raes_adapters/cyberbattlesim/backend/driver.py:153
      Attacker model: an adversary who can supply a tampered separately installed simulator or dependency, such as through a compromised package index or prebuilt runtime image. The simulator check hashes only .py entries under cyberbattle/. A package can therefore contain the exact expected 48 source files plus a malicious compiled extension with the same module name as a verified source file; CPython prefers extension modules over source modules. Importing cyberbattle can execute that extension transitively before the later submodule-origin checks reject anything. Gymnasium and NumPy are even weaker: matching the selected version and resolving their module to a file owned by that same distribution provides no authenticity, so forged same-version packages pass and execute during construction. This defeats the advertised fail-closed identity control and gives code execution with the hosting process's privileges. Bind the simulator and dependencies to governed immutable artifact hashes or verified signatures, attest all executable artifacts rather than only .py files, reject editable or otherwise unqualified installations, and ensure no package code executes before its complete artifact identity is established.
  12. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc_codex_review pre-push cycle 2 (USER-AUTHORIZED OVERRIDE past cap 1) complete for issue #27 on branch '27-cyberbattlesim-backend'. 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.
    Override reason: user said: overcap authorized.

  13. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Review decision record — codex cycle 2 (issue #27)

    Reviewer: codex
    Cycle: 2

    Architectural read:

    Core reviewer: The change is shaped correctly in its main dependency direction: CyberBattleSim semantics remain backend-local, the private driver owns native state, and the implementation composes RAES-owned manifest, runtime-target, participant, evaluation, and cleanup contracts rather than extending raes_adapters.base. The unresolved seam is trial lifecycle: component latches and evaluator artifact identities have process lifetime even though the target advertises reusable state. That breaks the obvious next variation—multiple trials on one target—and must be corrected before production use.

    Security reviewer: The change correctly concentrates native simulator state and transitions behind a backend-local driver, with sanitized participant, evaluator, and cleanup projections. That driver is also the new supply-chain trust boundary: it imports separately installed executable code while claiming source-identity verification. The verification does not cover every executable artifact or establish dependency authenticity, so compiled-module and same-version package substitutions bypass the intended fail-closed seam. This shape cannot safely support the obvious next variation—packages containing native modules—without artifact-level attestation.

    Blocking findings: 3

    Finding 1 — one-off

    • ID: F1
    • Title: [core] Provisioner lifetime latch survives driver cleanup
    • Location: src/raes_adapters/cyberbattlesim/backend/provisioner.py:79
    • Decision: fix
    • Rationale: _constructed records that construction happened once, not that the shared driver is currently live. Cleanup can destroy and close that driver, but the flag is never cleared; the next CREATE or UPDATE skips driver.construct() and return…

    Finding 2 — class (8 instances)

    • ID: F2
    • Title: [core] Evaluator reuses immutable artifact identities across runs
    • Location: src/raes_adapters/cyberbattlesim/backend/evaluator.py:406
    • Decision: fix
    • Rationale: The evaluator emits current timestamps, scores, and checksums under process-global run, evidence-record, content, capture-spec, capture-window, and derived-measure identifiers with constant versions. A second evaluation changes the data wh…
    • Instances:
      • src/raes_adapters/cyberbattlesim/backend/evaluator.py:274
      • src/raes_adapters/cyberbattlesim/backend/evaluator.py:406
      • src/raes_adapters/cyberbattlesim/backend/evaluator.py:416
      • src/raes_adapters/cyberbattlesim/backend/evaluator.py:435
      • src/raes_adapters/cyberbattlesim/backend/evaluator.py:460
      • src/raes_adapters/cyberbattlesim/backend/evaluator.py:512
      • src/raes_adapters/cyberbattlesim/backend/evaluator.py:522
      • src/raes_adapters/cyberbattlesim/backend/evaluator.py:533

    Finding 3 — class (5 instances)

    • ID: F3
    • Title: [security] Partial package attestation permits arbitrary code execution
    • Location: src/raes_adapters/cyberbattlesim/backend/driver.py:153
    • Decision: fix
    • Rationale: Attacker model: an adversary who can supply a tampered separately installed simulator or dependency, such as through a compromised package index or prebuilt runtime image. The simulator check hashes only .py entries under cyberbattle/.…
    • Instances:
      • src/raes_adapters/cyberbattlesim/backend/driver.py:153
      • src/raes_adapters/cyberbattlesim/backend/driver.py:154
      • src/raes_adapters/cyberbattlesim/backend/driver.py:155
      • src/raes_adapters/cyberbattlesim/backend/driver.py:432
      • src/raes_adapters/cyberbattlesim/backend/driver.py:487
  14. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc_test_quality_review cycle 1 of 1 — issue #27

    Reviewer: test-quality (claude-sonnet-5 via gc_test_quality_review)
    Branch: 27-cyberbattlesim-backend
    Cycle: 1 / 1
    Findings: 0 (clean run)

  15. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc_test_quality_review cycle 1 of 1 complete for issue #27 on branch '27-cyberbattlesim-backend'. 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.

  16. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

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

    Reviewer: test-quality
    Cycle: 1

    Architectural read:

    This diff adds a complete new CyberBattleSim backend (driver, provisioner, orchestrator, evaluator, participant_runtime, cleanup, manifest, target) plus corresponding qualification/source-ledger evidence, with a single private driver instance shared across the RAES-facing components and a hard boundary that redacts native state (masks, credentials, reward vectors, exception text) before anything crosses into a RAES contract. The test suite matches that shape well: a FakeDriver is used for the portable-contract tests (provisioner/orchestrator/evaluator/participant_runtime/cleanup), while a separate, heavily monkeypatched test exercises the concrete CyberBattleSimDriver's actual supply-chain artifact verification (tampered source tree, injected native extension, editable install, mismatched module origin) and proves fail-closed behavior with zero native imports on each failure path. Leakage boundaries are tested by asserting forbidden substrings (credential_cache, action_mask, reward_vector, exception secret text) are absent from the full serialized portable payload rather than by mocking the redaction step itself, which is the right way to prove a boundary rather than assume it. This lines up almost 1:1 with the acceptance-evidence table in the accompanying guardrails ADR. I would ship this.

    Blocking findings: 0 (clean run)

  17. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Pre-PR base synchronization

    • Source: refs/remotes/origin/dev at 7ebf4b9a3fe37d720143cc1baa77203212309a80
    • Outcome: merged_conflicts_resolved
    • Published feature head: 7fffcb51a6ff74f6f6835f0f9f73a0dca71e20ee
    • Verified tree: 7e69cafc38b0f74a4d6fe7eae8bcc5f78fc55f85
  18. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Pre-PR base synchronization

    • Source: refs/remotes/origin/dev at 7ebf4b9a3fe37d720143cc1baa77203212309a80
    • Outcome: already_current
    • Published feature head: 414b3a2d3b7620cd884628eaa9b5fc2634166cc9
    • Verified tree: b04aaa9df5211abfd2528f86caaa5565bb347c4f
  19. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Pre-PR base synchronization

    • Source: refs/remotes/origin/dev at 7ebf4b9a3fe37d720143cc1baa77203212309a80
    • Outcome: already_current
    • Published feature head: 96f59f08674f8a03f05e82ac8b4fbbd68753389f
    • Verified tree: ec80fd95c9793a6f14a0c073818d62f2f2eac68d
  20. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Ready for review — issue #27

    PR: #60

    Outcome

    CyberBattleSim now runs through a RAES backend with selected-source and runtime-artifact attestation, bounded stochastic controls, portable participant/evaluator evidence, reusable cleanup, and qualification limitations that bound claims without blocking maintainer-directed simulator admission.

    All CI checks passed. Sonar quality gate passed with 81.5% new-code coverage, zero new violations, and zero security hotspots.

    Files changed

    Added:

    • docs/decisions/cyberbattlesim-backend-guardrails.md
    • src/raes_adapters/cyberbattlesim/backend/__init__.py
    • src/raes_adapters/cyberbattlesim/backend/cleanup.py
    • src/raes_adapters/cyberbattlesim/backend/driver.py
    • src/raes_adapters/cyberbattlesim/backend/evaluator.py
    • src/raes_adapters/cyberbattlesim/backend/manifest.py
    • src/raes_adapters/cyberbattlesim/backend/orchestrator.py
    • src/raes_adapters/cyberbattlesim/backend/participant_runtime.py
    • src/raes_adapters/cyberbattlesim/backend/provisioner.py
    • src/raes_adapters/cyberbattlesim/backend/target.py
    • tests/test_cyberbattlesim_backend.py

    Modified:

    • README.md
    • docs/decisions/cyberbattlesim-qualification-guardrails.md
    • docs/decisions/cyberbattlesim-scenario-ledger-guardrails.md
    • docs/decisions/cyborg-cage2-runtime-qualification-guardrails.md
    • docs/decisions/cyborg-cage2-source-ledger-guardrails.md
    • docs/index.md
    • mkdocs.yml
    • pyproject.toml
    • src/raes_adapters/__init__.py
    • src/raes_adapters/cyberbattlesim/experiment/cyberbattle-chain.task.exp.yaml
    • src/raes_adapters/cyberbattlesim/mapping/README.md
    • src/raes_adapters/cyberbattlesim/mapping/loss-disclosures.md
    • src/raes_adapters/cyberbattlesim/mapping/source-ledger.jsonl
    • src/raes_adapters/cyberbattlesim/public-protocol.md
    • src/raes_adapters/cyberbattlesim/qualification.json
    • src/raes_adapters/cyborg/__init__.py
    • src/raes_adapters/cyborg/mapping/README.md
    • src/raes_adapters/cyborg/mapping/cage2-loss-disclosures.md
    • src/raes_adapters/cyborg/qualification.json
    • tests/test_cyberbattlesim_qualification.py
    • tests/test_cyborg_provisioner.py
    • tests/test_cyborg_qualification.py
    • tests/test_cyborg_source_ledger.py
    • uv.lock

    Reviews

    • codex: Two full implementation review cycles completed and all reported findings were fixed; an additional confirmation cycle was skipped at explicit maintainer direction.
    • test-quality: Full changed-test review completed cleanly with 34/34 file coverage.

    Traceability reconciliation

    • Pending — requirement status transition and IMPLEMENTS/TESTS reconciliation run in Phase E once the PR merges.

    Status

    • CI: ✅ green
    • SonarCloud: ✅ passed
    • PR ready for user review and merge. Ground Control reconciliation (requirement status + traceability) runs on merge (Phase E).
  21. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

    gc workflow phase recorded: traceability_reconciled (issue #27). 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.

    no in-scope requirements; touched-files audit clean.

  22. Brad-Edwards commented on Jul 31, 2026

    @Brad-Edwards
    CollaboratorAuthor

    Final report — issue #27 complete

    PR: #60

    Outcome

    CyberBattleSim now runs through a RAES backend with selected-source and runtime-artifact attestation, bounded stochastic controls, portable participant/evaluator evidence, reusable cleanup, and qualification limitations that bound claims without blocking maintainer-directed simulator admission.

    Merged as c641cab. All CI checks passed. Sonar quality gate passed with 81.5% new-code coverage, zero new violations, and zero security hotspots.

    Files changed

    Added:

    • docs/decisions/cyberbattlesim-backend-guardrails.md
    • src/raes_adapters/cyberbattlesim/backend/__init__.py
    • src/raes_adapters/cyberbattlesim/backend/cleanup.py
    • src/raes_adapters/cyberbattlesim/backend/driver.py
    • src/raes_adapters/cyberbattlesim/backend/evaluator.py
    • src/raes_adapters/cyberbattlesim/backend/manifest.py
    • src/raes_adapters/cyberbattlesim/backend/orchestrator.py
    • src/raes_adapters/cyberbattlesim/backend/participant_runtime.py
    • src/raes_adapters/cyberbattlesim/backend/provisioner.py
    • src/raes_adapters/cyberbattlesim/backend/target.py
    • tests/test_cyberbattlesim_backend.py

    Modified:

    • README.md
    • docs/decisions/cyberbattlesim-qualification-guardrails.md
    • docs/decisions/cyberbattlesim-scenario-ledger-guardrails.md
    • docs/decisions/cyborg-cage2-runtime-qualification-guardrails.md
    • docs/decisions/cyborg-cage2-source-ledger-guardrails.md
    • docs/index.md
    • mkdocs.yml
    • pyproject.toml
    • src/raes_adapters/__init__.py
    • src/raes_adapters/cyberbattlesim/experiment/cyberbattle-chain.task.exp.yaml
    • src/raes_adapters/cyberbattlesim/mapping/README.md
    • src/raes_adapters/cyberbattlesim/mapping/loss-disclosures.md
    • src/raes_adapters/cyberbattlesim/mapping/source-ledger.jsonl
    • src/raes_adapters/cyberbattlesim/public-protocol.md
    • src/raes_adapters/cyberbattlesim/qualification.json
    • src/raes_adapters/cyborg/__init__.py
    • src/raes_adapters/cyborg/mapping/README.md
    • src/raes_adapters/cyborg/mapping/cage2-loss-disclosures.md
    • src/raes_adapters/cyborg/qualification.json
    • tests/test_cyberbattlesim_qualification.py
    • tests/test_cyborg_provisioner.py
    • tests/test_cyborg_qualification.py
    • tests/test_cyborg_source_ledger.py
    • uv.lock

    Reviews

    • codex: Two full implementation review cycles completed and all reported findings were fixed; an additional confirmation cycle was skipped at explicit maintainer direction.
    • test-quality: Full changed-test review completed cleanly with 34/34 file coverage.

    Traceability reconciliation

    • IMPLEMENTS / TESTS / DOCUMENTS added: 11
    • Links updated: 24
    • Stale links removed: 0

    Issue #27 has no requirement UIDs. Qualification records for CyberBattleSim and CybORG were aligned so limitations bound reproducibility claims and do not act as simulator-admission gates.

    Status

    • CI: ✅ green
    • SonarCloud: ✅ passed
    • PR ready for user review and merge.
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

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions