test-driver/src/testdriver/scenario.py
tegwick 04e9573b5a T04: deterministic semantic kernel
Alice/Bob/Carol runs end to end, deterministically, replayable from seed.
16 tests pass, no third-party dependencies.

- src/testdriver: intent, provenance, world, actions, drivers, observers,
  oracles, evidence, energy, scenario, runner
- lab/minimal.py: the SUT, exposing the independent observation channel
  required by D-07
- evidence is stratified S1/S2/S3; Runner refuses to attribute S2/S3 to an
  actor; claims are frozen and provenance-checked at construction
- missing evidence yields INCONCLUSIVE, which outranks PASS in the run verdict
- EnergyEvents captured, no scoring (H-005 dormant)

The observation channel records both stored state and an out-of-band
enforcement probe; their disagreement is an invariant and is what detects an
authorization defect that leaves the audit trail intact. A seeded
RevokeIsCosmetic lab fails the run via both the claim and that invariant.

Also closes TD-WP-0001-T02 (stack and commands now exist).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 1629012@bnt-lap001
Assistant-Session: 78d4fb13-8a1e-474b-87a3-9b9261c49a39
2026-08-22 23:21:07 +02:00

47 lines
1.2 KiB
Python

"""A scenario binds a use case to concrete actors, a world and a schedule."""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Sequence
from .actions import SemanticAction
from .intent import UseCase
from .observers import Watch
@dataclass(frozen=True, slots=True)
class Step:
"""One scheduled semantic action, attributed to one actor."""
id: str
actor_id: str
action: SemanticAction
expect_refusal: bool = False
@dataclass(frozen=True, slots=True)
class Scenario:
"""UseCase + Actors + World + Schedule + Surfaces + Variant."""
id: str
use_case: UseCase
steps: tuple[Step, ...]
watches: tuple[Watch, ...] = field(default_factory=tuple)
variant: str = "baseline"
@dataclass(slots=True)
class VerificationAsset:
"""A test as a durable thing with identity, maturity and lineage.
Maturity is the T0..T5 continuum. The kernel produces T5 assets: fully
deterministic, no model involvement. Agentic assets (T1) arrive in T07, and
crystallization walks an asset from T1 toward T5 in T09.
"""
id: str
scenario: Scenario
maturity: str = "T5"
parent_id: str | None = None
adaptation_history: list[dict] = field(default_factory=list)