Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions contracts/fixtures/sdl/participant-episode-policy-v1/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Participant episode policy fixtures

These fixtures exercise the DSL-120 authored participant episode surface,
`behavior_specifications.*.episode_policy`.

- `valid/analyst-shift-episode.yaml` declares initialization, decision-epoch
turn structure, a completion and a timeout terminal condition, a truncation
condition, and a reset policy for a non-autonomous participant. It must pass
strict source decoding and semantic validation, and it compiles to the
`participant.episode-policy.analyst-triage` record keyed to the participant's
`participant.behavior.analyst` episode address.
- `invalid/realized-episode-state.yaml` is the same document with a policy that
asserts realized episode state (lifecycle status, initialization time,
decision epoch, and terminal reason). Decoding must reject it, because the
authored policy declares intent only and realized episode state belongs to
the ADR-013 participant episode contracts.

- `valid/standalone-episode-structure.yaml` (ACT-623) gives a participant a
behavior specification whose only behavior surface is its episode policy.
It must pass strict decoding and semantic validation, and the compiled
aggregate names `participant.episode-policy.replay-episodes`.
- `invalid/autonomous-profile-episode-structure.yaml` (ACT-623) nests the same
policy inside the autonomous execution profile. Decoding must reject it,
because episode structure belongs to the behavior specification for every
participant kind and is not an autonomous-profile option.

None of these fixtures represents an executed episode, a reset, or an observed
terminal condition.
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
name: act-623
nodes:
siem:
type: compute
resources: {ram: 1 gib, cpu: 1}
services: [{port: 443, name: console}]
entities:
blue-team:
role: blue
propositions:
console-ready:
description: The SIEM console is reachable before a replay episode starts.
subjects: [nodes.siem.services.console]
basis: declared_state
predicate:
kind: boolean
property: console-reachable
semantic_ref: urn:raes:observable:console-reachable
expected: true
assertions:
console-ready:
proposition: console-ready
role: precondition
time_domains:
replay-time:
kind: logical
tick_period_seconds: {numerator: 1, denominator: 1}
epoch: scenario_start
visibility: participant_visible
description: replay logical time
clocks:
replay-clock:
time_domain_ref: replay-time
authority_kind: runtime
authority_ref: runtime.scheduler
monotonicity: non_decreasing
description: replay scheduler clock
temporal_constraints:
replay-deadline:
constraint_kind: deadline
clock_ref: replay-clock
subject_refs: [agents.replayer]
end: {tick: 900}
description: each replay episode closes within fifteen minutes
evidence_requirements:
replay-clock-evidence:
description: capture the replay clock reading at episode close
source_refs: [agents.replayer]
scope_refs: [siem]
window: replay episode close
channel: log
artifact_role: episode_timeout_evidence
sensitivity: plain
redaction: none
integrity: checksum
retention: study_lifetime
loss_disclosure: required
replay-reset-evidence:
description: capture the replay reset record
source_refs: [agents.replayer]
scope_refs: [siem]
window: replay episode reset
channel: log
artifact_role: episode_reset_evidence
sensitivity: plain
redaction: none
integrity: checksum
retention: study_lifetime
loss_disclosure: required
agents:
replayer:
affiliations: [blue-team]
behavior_specifications:
replay-episodes:
semantic_version: 1.0.0
participant_refs: [replayer]
behavior_mode: autonomous
autonomous_execution:
participant_implementation_ref: participant-implementation-manifests.replayer.v1
clock_ref: replay-clock
progression_policy_ref: replay-progression
temporal_constraint_refs: [replay-deadline]
action_order: [replay-step]
observation_boundary_ref: replay-view
selection_strategy: ordered_cycle
max_action_attempts: 3
max_in_flight: 1
failure_policy: stop
evaluation_authority:
mode: none
episode_policy:
profile: participant-episode-policy/v1
initialization:
assertion_refs: [console-ready]
terminal_conditions:
replay-window-closed:
terminal_reason: timed_out
temporal_constraint_ref: replay-deadline
evidence_requirement_refs: [replay-clock-evidence]
reset_policy:
control_actions: [reset]
participant_memory_scope: episode_local_reset
memory_reset_authority_ref: agents.replayer
evidence_requirement_refs: [replay-reset-evidence]
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
name: dsl-120
nodes:
siem:
type: compute
resources: {ram: 1 gib, cpu: 1}
services: [{port: 443, name: console}]
entities:
blue-team:
role: blue
propositions:
console-ready:
description: The SIEM console is reachable before the analyst episode starts.
subjects: [nodes.siem.services.console]
basis: declared_state
predicate:
kind: boolean
property: console-reachable
semantic_ref: urn:raes:observable:console-reachable
expected: true
ticket-closed:
description: The analyst closed the escalated incident ticket.
subjects: [nodes.siem.services.console]
basis: observed_state
predicate:
kind: boolean
property: incident-ticket-closed
semantic_ref: urn:raes:observable:incident-ticket-closed
expected: true
evidence_requirements: [ticket-evidence]
queue-stalled:
description: The alert queue stopped producing new work for the analyst.
subjects: [nodes.siem.services.console]
basis: observed_state
predicate:
kind: boolean
property: alert-queue-stalled
semantic_ref: urn:raes:observable:alert-queue-stalled
expected: true
evidence_requirements: [queue-evidence]
assertions:
console-ready:
proposition: console-ready
role: precondition
ticket-closed:
proposition: ticket-closed
role: postcondition
queue-stalled:
proposition: queue-stalled
role: postcondition
time_domains:
shift-time:
kind: logical
tick_period_seconds: {numerator: 60, denominator: 1}
epoch: scenario_start
visibility: participant_visible
description: analyst shift logical time
clocks:
shift-clock:
time_domain_ref: shift-time
authority_kind: runtime
authority_ref: runtime.scheduler
monotonicity: non_decreasing
description: analyst shift clock
temporal_constraints:
shift-deadline:
constraint_kind: deadline
clock_ref: shift-clock
subject_refs: [behavior_specifications.analyst-triage]
end: {tick: 480}
description: the analyst episode must close within one shift
evidence_requirements:
ticket-evidence:
description: capture the ticket closure record
source_refs: [nodes.siem.services.console]
scope_refs: [siem]
window: analyst episode close
channel: log
artifact_role: episode_terminal_evidence
sensitivity: plain
redaction: none
integrity: checksum
retention: study_lifetime
loss_disclosure: required
queue-evidence:
description: capture the alert queue telemetry
source_refs: [nodes.siem.services.console]
scope_refs: [siem]
window: analyst episode close
channel: log
artifact_role: episode_truncation_evidence
sensitivity: plain
redaction: none
integrity: checksum
retention: study_lifetime
loss_disclosure: required
shift-clock-evidence:
description: capture the shift clock reading at episode close
source_refs: [behavior_specifications.analyst-triage]
scope_refs: [siem]
window: analyst episode close
channel: log
artifact_role: episode_timeout_evidence
sensitivity: plain
redaction: none
integrity: checksum
retention: study_lifetime
loss_disclosure: required
reset-evidence:
description: capture the episode reset or restart record
source_refs: [behavior_specifications.analyst-triage]
scope_refs: [siem]
window: analyst episode reset
channel: log
artifact_role: episode_reset_evidence
sensitivity: plain
redaction: none
integrity: checksum
retention: study_lifetime
loss_disclosure: required
action_contracts:
triage-alert:
semantic_version: 1.0.0
behavioral_granularity: atomic
procedure_basis: analyst reviews one SIEM alert and records a disposition
realization_profile: backend-declared
fidelity_claim: records the analyst disposition and the terminal console observation
preconditions:
- precondition_id: console-in-scope
precondition_class: target
description: the SIEM console is in the analyst's action scope
support_refs: [nodes.siem.services.console]
effects:
- effect_id: alert-disposition-recorded
effect_class: intended_effect
description: the analyst records a disposition for the alert
target_refs: [nodes.siem.services.console]
failure_classes: [target_unavailable, unknown]
agents:
analyst:
affiliations: [blue-team]
actions: [triage-alert]
behavior_specifications:
analyst-triage:
semantic_version: 1.0.0
participant_refs: [analyst]
action_contract_refs: [triage-alert]
behavior_mode: human-supervised
episode_policy:
profile: participant-episode-policy/v1
status: terminated
initialized_at: '2026-10-09T00:00:00Z'
decision_epoch: 3
terminal_reason: completed
initialization:
assertion_refs: [console-ready]
interaction_structure:
order_basis: decision-epoch
action_contract_refs: [triage-alert]
terminal_conditions:
ticket-closed:
terminal_reason: completed
assertion_refs: [ticket-closed]
evidence_requirement_refs: [ticket-evidence]
shift-ended:
terminal_reason: timed_out
temporal_constraint_ref: shift-deadline
evidence_requirement_refs: [shift-clock-evidence]
truncation_conditions:
queue-stalled:
assertion_refs: [queue-stalled]
evidence_requirement_refs: [queue-evidence]
reset_policy:
control_actions: [reset, restart]
participant_memory_scope: persistent_across_episodes
evidence_requirement_refs: [reset-evidence]
Loading
Loading