From 1b9860a8eead8fa93d8f69f42d03bceaa19e5005 Mon Sep 17 00:00:00 2001 From: tegwick Date: Sun, 23 Aug 2026 00:39:36 +0200 Subject: [PATCH 1/3] T10: gate review and first compression pass All four gate criteria met. False Adaptation Rate 0/7 with 12 of 13 mechanical mutations absorbed. 178 tests pass. TD-WP-0002 finished. Fitness loop closed via F-0003: actor isolation was a property of scenarios written to expose it, not of runs. Actors now carry an automatic private marker and the runner examines all of them on every scenario, with two permanent regressions behind it. Compression - six abstractions removed, each declared and never used: Verdict.SUSPICIOUS (a verdict no oracle could emit), Step.expect_refusal, ActorIsolationError, World.seed, EvidencePack.latest, Trajectory.method. F-0008: Temperature may be redundant. Crystallization was built without it ever being consulted; measured stability of realization did the work, and is observed rather than declared. Gated for removal alongside energy.py. INTENT_CHANGED and REALIZATION_FAILED had never run. Both now have purpose-built cases and a test that fails if a seventh outcome is added without one. Co-Authored-By: Claude Opus 5 Assistant: claude-code Assistant-Model: opus Assistant-Process: 1629012@bnt-lap001 Assistant-Session: 78d4fb13-8a1e-474b-87a3-9b9261c49a39 --- INTENT.md | 13 +- README.md | 1 + WORK-RECORDS.md | 2 +- history/2026-08-23-td-wp-0002-gate-review.md | 212 +++++++++++ research/concepts/fitness-map.md | 23 +- .../F-0003-isolation-needs-canaries.md | 31 +- .../F-0008-temperature-may-be-redundant.md | 70 ++++ .../alice_bob_carol.cpython-312.pyc | Bin 7840 -> 7782 bytes scenarios/alice_bob_carol.py | 4 +- src/testdriver/__init__.py | 4 +- .../__pycache__/__init__.cpython-312.pyc | Bin 1358 -> 1323 bytes .../crystallization.cpython-312.pyc | Bin 12997 -> 12833 bytes .../__pycache__/evidence.cpython-312.pyc | Bin 4542 -> 4214 bytes .../__pycache__/oracles.cpython-312.pyc | Bin 4550 -> 4622 bytes .../__pycache__/runner.cpython-312.pyc | Bin 9974 -> 11363 bytes .../__pycache__/scenario.cpython-312.pyc | Bin 2269 -> 2217 bytes .../__pycache__/world.cpython-312.pyc | Bin 4538 -> 5077 bytes src/testdriver/crystallization.py | 4 +- src/testdriver/evidence.py | 6 - src/testdriver/oracles.py | 7 +- src/testdriver/runner.py | 27 +- src/testdriver/scenario.py | 1 - src/testdriver/world.py | 28 +- ...e_e2_use_case.cpython-312-pytest-7.4.4.pyc | Bin 0 -> 12422 bytes ...lassification.cpython-312-pytest-7.4.4.pyc | Bin 22324 -> 30781 bytes ...ence_scenario.cpython-312-pytest-7.4.4.pyc | Bin 13438 -> 15885 bytes .../__pycache__/checks.cpython-312.pyc | Bin 9566 -> 10530 bytes ...ecks_can_fail.cpython-312-pytest-7.4.4.pyc | Bin 17844 -> 20586 bytes ..._verification.cpython-312-pytest-7.4.4.pyc | Bin 14275 -> 15515 bytes tests/selfverification/checks.py | 17 + .../selfverification/test_checks_can_fail.py | 33 ++ .../test_self_verification.py | 9 + tests/test_audit_core_e2_use_case.py | 136 +++++++ tests/test_classification.py | 95 +++++ tests/test_reference_scenario.py | 16 +- usecases/__init__.py | 5 + usecases/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 329 bytes ...it_core_e2_tenant_boundary.cpython-312.pyc | Bin 0 -> 10754 bytes usecases/audit_core_e2_tenant_boundary.py | 331 ++++++++++++++++++ ...-WP-0002-vertical-spike-crystallization.md | 45 ++- 40 files changed, 1074 insertions(+), 46 deletions(-) create mode 100644 history/2026-08-23-td-wp-0002-gate-review.md create mode 100644 research/findings/F-0008-temperature-may-be-redundant.md create mode 100644 tests/__pycache__/test_audit_core_e2_use_case.cpython-312-pytest-7.4.4.pyc create mode 100644 tests/test_audit_core_e2_use_case.py create mode 100644 usecases/__init__.py create mode 100644 usecases/__pycache__/__init__.cpython-312.pyc create mode 100644 usecases/__pycache__/audit_core_e2_tenant_boundary.cpython-312.pyc create mode 100644 usecases/audit_core_e2_tenant_boundary.py diff --git a/INTENT.md b/INTENT.md index 904b763..e357550 100755 --- a/INTENT.md +++ b/INTENT.md @@ -116,6 +116,14 @@ COLD -> deterministic The framework should make it natural for tests to crystallize as software cools. +> **Under review since T10 — see `research/findings/F-0008-temperature-may-be-redundant.md`.** +> Crystallization was built and demonstrated without Temperature ever being +> consulted. What actually triggered freezing was *measured stability of +> realization* — the same path found across several runs — which is observed, +> not declared. Temperature is a label a human would have to maintain and keep +> honest. If measured stability is sufficient, Temperature is a concept the +> framework does not need. + --- ## Energy @@ -248,10 +256,13 @@ Initial verdicts are: ```text PASS FAIL -SUSPICIOUS INCONCLUSIVE ``` +`SUSPICIOUS` was listed here originally and **removed at T10**: no oracle could +produce it, and a verdict nothing can emit is a promise the framework does not +keep. It returns, with an identifier, if a mechanism ever needs it. + --- ## Lineage diff --git a/README.md b/README.md index 8a3d0d8..d5ce8d3 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ No third-party dependencies. Python ≥ 3.11, pytest for the suite. ``` src/testdriver/ the kernel — intent, world, actions, drivers, observers, oracles, evidence, runner +usecases/ durable test intent, including not-yet-runnable use cases lab/ the system under test scenarios/ reference scenarios research/ hypotheses, experiments, findings, fitness map diff --git a/WORK-RECORDS.md b/WORK-RECORDS.md index a61b979..c2d070d 100644 --- a/WORK-RECORDS.md +++ b/WORK-RECORDS.md @@ -21,5 +21,5 @@ | task | TD-WP-0002-T06 | done | — | workplans/TD-WP-0002-vertical-spike-crystallization.md | | task | TD-WP-0002-T07 | done | — | workplans/TD-WP-0002-vertical-spike-crystallization.md | | task | TD-WP-0002-T08 | done | — | workplans/TD-WP-0002-vertical-spike-crystallization.md | -| task | TD-WP-0002-T09 | todo | — | workplans/TD-WP-0002-vertical-spike-crystallization.md | +| task | TD-WP-0002-T09 | done | — | workplans/TD-WP-0002-vertical-spike-crystallization.md | | task | TD-WP-0002-T10 | todo | — | workplans/TD-WP-0002-vertical-spike-crystallization.md | diff --git a/history/2026-08-23-td-wp-0002-gate-review.md b/history/2026-08-23-td-wp-0002-gate-review.md new file mode 100644 index 0000000..e599184 --- /dev/null +++ b/history/2026-08-23-td-wp-0002-gate-review.md @@ -0,0 +1,212 @@ +# TD-WP-0002 — Gate Review and First Compression Pass + +**Date:** 2026-08-23 +**Workplan:** `TD-WP-0002` — Vertical spike: falsify the crystallization thesis +**Tests:** 172 passing · **Lab catalogue:** 24 labelled mutations +**Assessment that set the direction:** `history/2026-08-22-concept-assessment-swot.md` + +--- + +## 1. The gate + +The workplan fixed four criteria in advance, before any code existed. + +### Criterion 1 — recover from M01 and M02 with zero claim or invariant changes + +**Met.** + +| Mutation | Classification | Claim set unchanged | Accepted without a human | +|---|---|---|---| +| M01 sharing control moved into a modal | `MECHANICAL_ADAPTATION` | yes | yes | +| M02 DOM rewritten, test ids dropped | `MECHANICAL_ADAPTATION` | yes | yes | + +The claim set is unchanged *by construction*, not by good behaviour: claims are +run inputs and the adaptation machinery has no write path to them (D-02). + +### Criterion 2 — the authorization defect is reported as a Product Finding + +**Met**, with a naming correction. The workplan inherited "M05" from the original +milestones document; in the catalogue as built, the authorization defect is +**M15** (revocation updates the record but not enforcement). All three +authorization defects behave correctly: + +| Mutation | Classification | Regressions reported | +|---|---|---| +| M15 revoke is cosmetic | `BEHAVIOUR_CHANGED` | `c-bob-revoked`, `i-enforcement-matches-record` | +| M17 anyone can read anything | `BEHAVIOUR_CHANGED` | 5 assertions across 3 steps | +| M20 tenant isolation leaks | `BEHAVIOUR_CHANGED` | 5 assertions across 3 steps | + +None is safe to accept. The classifier collapses `PRODUCT_DEFECT` and +`SEMANTIC_CHANGE` into one escalating outcome — see F-0006 — so "Product Finding" +in the original wording is now "escalated to a human with the regressions named". + +### Criterion 3 — one asset crystallizes into a deterministic test + +**Met.** `crystallized/test_grant_access.py` is generated, runs with **no model +involvement**, preserves its ancestor's oracle set as a superset, agrees with the +ancestor across five lab versions, still catches a seeded defect, and carries its +lineage in its own docstring. + +### Criterion 4 — False Adaptation Rate = 0 + +**Met. 0 / 7.** No `DEFECT`-labelled mutation was classified as safe to accept, +including the three E-003 attacks (surface substitution, concurrent +mechanical+defect, evidence starvation) and provenance laundering. + +The other side of the trade is asserted too: **12 of 13** mechanical mutations are +absorbed without a human. A classifier that escalated everything would score a +perfect FAR and be worthless. + +### Gate verdict + +**Passed, on all four criteria.** With one qualification that belongs in the same +sentence: FAR = 0 follows largely from *architecture* — claims are run inputs, +and `SAFE_TO_ACCEPT` is a closed two-element set — not from classifier accuracy. +The experiment shows the architecture behaves as designed over 24 hand-written +mutations. It says nothing about mutations nobody thought of. + +--- + +## 2. What the evidence changed + +Three of the project's own claims were narrowed or corrected by building them. +This is the part worth more than the green gate. + +**H-001 was narrowed (F-0005).** Semantic actions do not generally outlast +recorded interaction sequences. Where an application keeps stable identifiers, +the two arms tie exactly — 9/9 against 9/9 — and the conventional approach is +cheaper and deterministic. Semantic actions earn their keep only where +identifiers are absent or not carried forward (2/3 against 0/3). The concept +model presents this as a general superiority; it is conditional. + +**The classifier cannot infer intent (F-0006).** The T02 design listed +`SEMANTIC_CHANGE` as an outcome the decision table could produce. It cannot: a +deliberate product decision and a defect are behaviourally identical, as M12 and +M19 have asserted since T05. The two collapse into `BEHAVIOUR_CHANGED` and the +distinction becomes a recorded human adjudication. Erring toward false alarm +costs one review; erring toward false adaptation ends the project. + +**Crystallization's economic case is unmeasured (F-0007).** The descendant is 54% +cheaper than its ancestor, and that number must not be quoted in support of the +thesis. The runtime is token-free by design, so the entire saving is one page +fetch, one parse and a two-candidate scoring pass. The saving the concept +actually claims — model tokens, latency, retry variance — is absent from the +measurement. + +--- + +## 3. The compression pass + +### Which concepts have no supporting evidence? + +`Temperature`, `Confidence`, `Campaign`, `Metabolism`, `Retirement` — declared, +unimplemented, never consulted by any decision. + +`Temperature` is the decidable one and is now **F-0008**. Crystallization was +built and demonstrated without it: what triggered freezing was *measured +stability of realization*, which is observed rather than declared. A declared +temperature is a claim nobody verifies, and the project's own first heuristic +argues against it. Not deleted yet — two unevidenced cases for keeping it are +recorded — but gated: if the next workplan completes without a decision +consulting it, it goes. + +### Which implementation abstractions have no conceptual justification? + +Removed at T10: + +| Removed | Why | +|---|---| +| `Verdict.SUSPICIOUS` | No oracle could produce it. A verdict nothing can emit is a promise not kept. | +| `Step.expect_refusal` | Never set by any scenario. Speculative generality. | +| `ActorIsolationError` | Declared, never raised, never caught. | +| `World.seed` | Written at T04, never read. Replay comes from rebuilding the lab. | +| `EvidencePack.latest()` | Never called. | +| `Trajectory.method` | Computed on every capture, never read. | + +### Which metadata has not informed a decision? + +**`EnergyEvent` history.** Events have been recorded since T04 and have informed +nothing — as designed, since H-005 is dormant. Capture is retained because +history cannot be reconstructed later while scores always can, but this is now on +the same gate as Temperature: if the next workplan ends with no decision having +used it, the module goes. + +### Which agentic behaviour can now be deterministic? + +The `grant_access` realization, and it has been — that is T09. Nothing else in +the spike is agentic. + +### What have the experiments falsified? + +Nothing outright. Two claims were **narrowed** (H-001, and the classifier's +output space), and one criterion was met in a sense **too weak to support the +thesis** (H-003's cost clause). No hypothesis was rejected, and none was promoted +past `EXPERIMENTING`: 24 hand-written mutations is a small, self-chosen sample. + +### Two outcomes that had never run + +`INTENT_CHANGED` and `REALIZATION_FAILED` were declared at T08 and produced by no +test. Code that has never run is code nobody has checked. Rather than delete +meaningful outcomes or trust them untested, both now have purpose-built cases, +and `test_no_classification_is_unreachable` fails if a seventh is ever added +without one. + +Building the `REALIZATION_FAILED` case clarified a boundary worth keeping: a run +that asserts *nothing at all* is `AMBIGUOUS`, not `REALIZATION_FAILED` — a use +case with no claims cannot conclude anything, however well its steps ran. + +--- + +## 4. The fitness loop, closed + +The milestone asks that a framework finding become a permanent guarantee rather +than a note. **F-0003 is resolved.** + +The finding: actor isolation left no trace in ordinary evidence. The self-test +caught a shared memory store only because the harness planted per-actor secrets +first. Isolation was a property of *scenarios written to expose it*, not of runs. + +The fix: every `Actor` is seeded at construction with an automatic private +marker, and the runner examines all actors on **every** scenario, recording the +verdict as S3 evidence. Two regressions now stand behind it — +`test_every_run_records_a_verdict_on_isolation`, and a self-check that catches a +leak with the harness planting nothing at all. + +``` +Framework Finding (F-0003) + → classified FRAMEWORK_LIMITATION + → improvement hypothesis: automatic canaries make isolation observable + → implemented at T10 + → permanent self-verification + deterministic regression + → fitness map updated +``` + +That is the first complete Concept–Implementation Fitness Loop, which the +milestones document calls the point at which the self-improvement system +genuinely exists. + +--- + +## 5. Where this leaves the project + +**The thesis survived contact with its own evidence, in narrowed form.** The +distinctive claim — that verification can adapt to a changing surface without +adapting to a defect — is demonstrated, and the demonstration is architectural +rather than statistical, which is the stronger kind. + +**The single highest-value next step is a bounded live-model experiment.** Two +independent findings converge on it: M22 defeats the heuristic runtime while +remaining solvable by reading a visible label (F-0005), and crystallization's +economic case cannot be measured without token costs (F-0007). One experiment +settles whether a model adds capability *and* whether crystallization has a +product rationale. The `RealizationMetrics` fields were populated from the first +run so that comparison is a subtraction rather than a re-run. + +That should come before any further framework feature. + +**Open findings carried forward:** F-0003 resolved · F-0004 (structural +durability only; visual relayout untested) · F-0005 (H-001 narrowed) · F-0007 +(cost unmeasurable; generated tests not fully standalone) · F-0008 (Temperature +gated). The F-0001 residual — the taxonomy has no class for document-to-document +drift — was considered and deliberately not resolved: adding a finding class to a +taxonomy already larger than its evidence would be the opposite of compression. diff --git a/research/concepts/fitness-map.md b/research/concepts/fitness-map.md index c8c4c75..32a0046 100644 --- a/research/concepts/fitness-map.md +++ b/research/concepts/fitness-map.md @@ -1,6 +1,6 @@ # Concept ↔ Implementation Fitness Map -**Updated:** 2026-08-23 (TD-WP-0002-T09) +**Updated:** 2026-08-23 (TD-WP-0002-T10) Traces each important concept to the implementation, experiment and evidence that support it. **Unsupported entries are the point of this map** — a concept with no @@ -29,7 +29,7 @@ were aspirational, not evidenced. | Concept | Level | Implementation | Experiment | Evidence | Open question | |---|---|---|---|---|---| | `C-use-case` | C1 | `intent.py` | — | — | Is a use case expressible without leaking mechanics? | -| `C-actor-isolation` | C1 | `world.py` | E-001 | `td://self/actor-isolation` | **F-0003** — only observable when the scenario plants canaries. | +| `C-actor-isolation` | **C2** | `world.py`, `runner.py` | E-001 | `td://self/actor-isolation`, examined every run | **F-0003 resolved** — automatic canaries; observable on every scenario. | | `C-semantic-action` | **C2** | `actions.py`, `agentic.py` | E-001 (partial) | T07 arm comparison | **F-0005** — supported only where stable identifiers are absent. Narrower than the concept model claims. | | `C-oracle-independence` | **C2** | `runner.py`, `oracles.py` | E-001, E-003 | — | Independence of components ≠ independence of belief. (H-004) | | `C-evidence-pack` | C1 | `evidence.py` | — | `td://self/evidence-reproducibility` | Verdicts are reproducible from S3 alone, on passing and failing runs. | @@ -39,9 +39,9 @@ were aspirational, not evidenced. | `C-crystallization` | **C2** | `crystallization.py` | E-002 | T09 agreement matrix | Fidelity supported; **F-0007** — the economic case is unmeasurable with a token-free runtime. | | `C-intent-provenance` | C1 | `provenance.py` | E-003 | `td://self/intent-independence` | Constrains provenance, not quality. Accepted residual. | | `C-lineage` | C1 | `scenario.py`, generated headers | E-002 | generated module docstring | Parent pointer plus provenance in the artefact; no graph. | -| `C-energy` | C0 | `energy.py`, capture only | — | — | Dormant by decision. (H-005) | -| `C-temperature` | C0 | — | — | — | Deferred. No implementation planned in TD-WP-0002. | -| `C-confidence` | C0 | — | — | — | Deferred. | +| `C-energy` | C0 | `energy.py`, capture only | — | none | Dormant. **Gated**: if the next workplan ends with no decision having used the history, remove. | +| `C-temperature` | **C0 — under review** | — | — | none | **F-0008** — crystallization was built without it; measured stability did the work. Gated for removal. | +| `C-confidence` | C0 | — | — | none | Declared, unimplemented, never consulted. Same position as `C-temperature` without a built alternative. | | `C-campaign` | C0 | — | — | — | Deferred. | | `C-metabolism` | C0 | — | — | — | Deferred. Depends on C-energy. | | `C-retirement` | C0 | — | — | — | Deferred. Depends on C-energy. | @@ -58,6 +58,13 @@ validated. They are revisited at T10, where the question is not "when do we buil these" but "does the evidence justify keeping them in the model at all". **Implementation orphans** — none. Every module in `src/testdriver/` traces to a -concept above. `energy.py` is the one to watch: it exists solely to capture -events for a dormant hypothesis, and if T10 finds no use for the history it -should be removed rather than kept out of sentiment. +concept above. + +**Removed at T10** (compression pass — see the gate review § 3): +`Verdict.SUSPICIOUS`, `Step.expect_refusal`, `ActorIsolationError`, +`World.seed`, `EvidencePack.latest()`, `Trajectory.method`. Each was declared and +never used; `SUSPICIOUS` was additionally a verdict no oracle could emit. + +**Gated for removal**: `C-temperature` (F-0008) and `energy.py`. Both survive the +current review on the strength of being cheap, not of being used. If the next +workplan closes without a decision consulting either, they go. diff --git a/research/findings/F-0003-isolation-needs-canaries.md b/research/findings/F-0003-isolation-needs-canaries.md index 008f659..d0c93b8 100644 --- a/research/findings/F-0003-isolation-needs-canaries.md +++ b/research/findings/F-0003-isolation-needs-canaries.md @@ -2,12 +2,13 @@ id: F-0003 type: framework-finding class: FRAMEWORK_LIMITATION -status: open +status: resolved discovered: "2026-08-22" discovered_by: TD-WP-0002-T06 workplan: TD-WP-0002 task: TD-WP-0002-T06 -carried_to: TD-WP-0002-T10 +resolved: "2026-08-23" +resolved_in: TD-WP-0002-T10 --- # F-0003 — Actor isolation is only observable if the scenario plants canaries @@ -55,9 +56,31 @@ system. Worth stating plainly rather than counting four green self-tests as four equivalent proofs. They are not equivalent. -## Candidate resolutions +## Resolution (T10) -Not resolved now; deciding cheaply here would be guessing. +Candidate 3 — **both**. + +Every `Actor` is seeded at construction with an automatic private marker +(`Actor.canary`), and `Runner._isolation_violations` examines every actor on +**every** scenario, recording the verdict as S3 evidence. An isolation violation +now leaves a trace whether or not anyone thought to look for one. + +Two permanent regressions stand behind it: + +- `tests/test_reference_scenario.py::test_every_run_records_a_verdict_on_isolation` +- `tests/selfverification/test_checks_can_fail.py::test_a_leak_is_caught_without_the_test_planting_anything` + — an actor holding another's marker is caught by the ordinary run, with the + harness planting nothing. + +The second limitation stands as recorded: oracle independence is enforced by +construction, so it is verified once rather than per run. That asymmetry is real +and is now stated in the fitness map rather than hidden behind two equally green +self-tests. + +This finding closed the first Concept–Implementation Fitness Loop — see +`history/2026-08-23-td-wp-0002-gate-review.md` § 4. + +## Candidate resolutions considered 1. **Automatic canaries** — the runtime seeds each actor with a unique private marker at construction and the isolation check runs on every Evidence Pack, diff --git a/research/findings/F-0008-temperature-may-be-redundant.md b/research/findings/F-0008-temperature-may-be-redundant.md new file mode 100644 index 0000000..a867ce3 --- /dev/null +++ b/research/findings/F-0008-temperature-may-be-redundant.md @@ -0,0 +1,70 @@ +--- +id: F-0008 +type: framework-finding +class: UNNECESSARY_COMPLEXITY +status: open +discovered: "2026-08-23" +discovered_by: TD-WP-0002-T10 +workplan: TD-WP-0002 +task: TD-WP-0002-T10 +carried_to: next workplan +--- + +# F-0008 — Temperature may be redundant; measured stability did the work + +## Observation + +`Temperature` (`HOT` / `WARM` / `COOL` / `COLD`) is one of the more prominent +ideas in `INTENT.md` and the Concept Model. It is supposed to govern which +verification mode an asset uses, and it is the mechanism by which "tests +crystallize as software cools". + +The spike built crystallization end to end. **Temperature was never consulted, +never implemented, and never missed.** + +What actually triggered freezing was `assess_stability`: the same realization +path observed across several consecutive runs. Nothing declared the surface cold; +the surface was observed to have stopped moving. + +## The argument for removal + +The two mechanisms answer the same question, and only one of them can be wrong: + +| | Temperature | Measured stability | +|---|---|---| +| source | declared by a human | observed from runs | +| upkeep | must be maintained and kept honest | none | +| failure mode | says `COLD` while the surface churns | none — it is the churn | +| already built | no | yes | + +A declared temperature is a claim about the system that nobody verifies. The +project's own first heuristic — *do not let a declaration substitute for +evidence* — argues against keeping it. + +## The argument for keeping it + +Two cases measured stability cannot cover: + +1. **Forward-looking scope.** A team knows a rewrite lands next month. + Temperature can say `HOT` before any run has observed instability, where + measured stability would happily freeze an asset the day before it breaks. +2. **Cheap prioritisation.** Deciding *where to spend effort* across many + capabilities may want a coarse label without running anything. + +Neither case arose in the spike, and neither is evidenced. + +## Recommendation + +Do not delete yet; do not build either. Carry `Temperature` as **explicitly +unvalidated** in the fitness map, and set a gate: if the next workplan completes +without any decision consulting it, remove it from the concept model. + +Recorded now because the compression review's purpose is to catch concepts that +survive on the strength of being attractive rather than useful, and Temperature +is currently the clearest instance in the corpus. + +## Related + +`Confidence`, `Campaign`, `Metabolism` and `Retirement` are in the same position — +declared, unimplemented, never consulted — but Temperature is the one with a +built alternative already doing its job, which makes it the decidable case. diff --git a/scenarios/__pycache__/alice_bob_carol.cpython-312.pyc b/scenarios/__pycache__/alice_bob_carol.cpython-312.pyc index 9053e9f2bf8653b87f2d25000d3a4ec49519cd5e..619b306826fb6bed53067d6da7da44a86475bce7 100644 GIT binary patch delta 568 zcmZ2r`^<*#G%qg~0}yOg>dM+Hv60VRi1F0qFrn8$H7sk`SF?bm7#M2VN(3P+28I-l z5+NA7hPgx(#!lfZ5reT;GeKBLvRox%la~w2>T{>?lt{zWrSKy3r0}Ki&tWQ&fy)WB zFsu=rY%d~hD1@R%7)cLjib#s+9A+e4VlZ9K;wZW#P;^P6*dztg1M}-@W{3;YnAb>8 zo-2~gE>pvvBD+RzGQX%Mqx@z|(L6>*mdU%tBq!ezJH^;Pd8v3LW9a1n;>pr6K#fI` zAVLaA6f*(|g(8rDiXtW}O3E-!ojgmzlrt105DO$GJBW)-ekUOzod6QSqi^LB>@)+{ouH#CUIVn9%F`bcPh>MT{i^AW0BNVV}cP!?K2B zH7kT)%T^)`VFBehOGIGo8s-vl7(0avp?@_KL=;Ju8&fuosYDX2&KO9h@TBmTNW%@| zLnu$-PZ5~IR3ZbH6Kr8vBQ*KGu(Y8tiXIUpJzOcGDPnV&k#vc}bU90)=#oUyC52*> zG)T{C7KqKOnIUu<^BS4Sog&%nvNh}}a%j$e4_*VlGg{O1WDcL9W66p+U~B zMcg3EI6{M6NCz1c22#S3mzbM+i?uwzC?};Td$NU; zC08|2ycCFw^CwqJm5Sd|v^v9aQ9SU5xbzoRCSKVF*Do9l0uqydN&ROmp8QLCs$c=g zAkMU+{HoNv;?$C&qR9(n^i&FgqD3IHia@bjBnKiuk@t(kCO1E&G$+-rsCDxvnH)wA J14a|DGyokBlzadH diff --git a/scenarios/alice_bob_carol.py b/scenarios/alice_bob_carol.py index 70bcfa7..e9c10a8 100644 --- a/scenarios/alice_bob_carol.py +++ b/scenarios/alice_bob_carol.py @@ -128,9 +128,7 @@ def build(*mutations: str): cast.add(Actor(id=name, display_name=name.title(), credentials={"token": tokens[name]})) - world = World(id="w-baseline", sut=lab, sut_version=lab.version, - seed={"users": ["alice", "bob", "carol"], "resource": RESOURCE}, - cast=cast) + world = World(id="w-baseline", sut=lab, sut_version=lab.version, cast=cast) scenario = Scenario( id="sc-share-resource", diff --git a/src/testdriver/__init__.py b/src/testdriver/__init__.py index d56c3ca..31418a5 100644 --- a/src/testdriver/__init__.py +++ b/src/testdriver/__init__.py @@ -10,10 +10,10 @@ from .oracles import Judgment, Oracle, Verdict, overall from .provenance import InadmissibleProvenance, Provenance from .runner import CollectorIndependenceError, Runner, RunResult from .scenario import Scenario, Step, VerificationAsset -from .world import Actor, ActorIsolationError, Cast, World +from .world import Actor, Cast, World __all__ = [ - "Actor", "ActorIsolationError", "Cast", "Claim", "CollectorIndependenceError", + "Actor", "Cast", "Claim", "CollectorIndependenceError", "DirectDriver", "EnergyEvent", "EnergyEventType", "EvidencePack", "InadmissibleProvenance", "Invariant", "Judgment", "Observation", "Oracle", "Provenance", "Realization", "RunResult", "Runner", "Scenario", diff --git a/src/testdriver/__pycache__/__init__.cpython-312.pyc b/src/testdriver/__pycache__/__init__.cpython-312.pyc index 216faa64380a0459d764e2d73536f5c4786725f3..833fb3f45533c57342643bb6abf13ddb01edb6e7 100644 GIT binary patch delta 111 zcmX@dwVI3fG%qg~0}z-fb!FvDPHtogW;B|7mBmfK>N11XCl(HFrbhN61E5j>I9)0X diff --git a/src/testdriver/__pycache__/crystallization.cpython-312.pyc b/src/testdriver/__pycache__/crystallization.cpython-312.pyc index 6e999c0c09aec992183c9a5cb12d465ef6ed522d..9eee1fbdc993d28ba969e85eea62a900f869ddc0 100644 GIT binary patch delta 1571 zcmZ8hTWl0n7@o5`JA0YEwCwh>Z7H)$TX%Y+TMdv>No$oR7ApZH0gIdM&S_cbUN|$G z&{AxP28jkJoCl4N2)>#6ATCi~jW-gFk>G=wn8>RSn3^^`V7&bQnF6LK*>At||Nr^t zznuSkLvI+N??a)01ZyJs_VMwXp$|P|FaN|dSm&j(;Tr^np&I@- z-2p!++>%6AKjpWT(?KhQE^y6D{6tf~9>kKRPUR!~9>*2w?yPAWPaGhg6Sz9hfso7c9&_9Kb4!5>Q^YVD)B)u?$^DxdzxBI-wzrTk z<_nbq+r@9ix=51Wi`9D$g2}$>U$GzDV9sJhjZ41~< z7DYG$VEYVe=2(7`I_4V6TzSLxmrJIVnJTe@t~ya2!!yGBeq<$t83b`ZyzAjI(egaV zZF#a}%$h1tjCg&yAabKMMb1_)v@Q}d%EMYyzFnA)mx@$ZnD`D}Z0BP^WN5%}AayU> z&`TUECyohZ6@(34J%loZGQX@PoUR_KexZ#8ljzKrEqcn*U2F_DB=@+vc2*s*C^#8IUgi$cQ+C8IJ! z*=11OueNP#BxDzVwyz;33b+TPI{6(Q47i@`WqzzLv9J#|Yy?4=452P20(Tyyi>SJS zAVL=xN5n6fNJ6khG!cF<9p{2w0yY;qKu=a^F-Kn=F3uix@)IY-_k2k8CZ_Y6bRB8s z9qIf|d;5yF1Ih z)97Mr3x#M9BY2~R_y@kIsWFgEq>m9qNN;#{H@b9DlXo+NR>34Mmjasayg1}3 z`c;J@Y1)(1tyfJtC3X2Agj*2M${qTh^hWEXa4G;nA6-_kyl3_h-7Cidx?pyR8}t%)l09-i6D+Li!Fg#*Ki%ZE00L+OhtO>6BW(U z4eeI;W|j_COis5l?bia{#Qty#Ky?`!nLyys1>p~||GpBMJ+fF8Sr8+Oq44a{#XxYj zcO5n^h#ObM3XjhT0}(QaL3u$*yzmiL#7DxIFoh-s4MFx&k8l|c*O&UeKOlO=8`}_? zTR*8)W!qRfF0DF`v@nhM)$YigAK*zxyk2n!1qlquhxh-eX1#1H9ct0~d$$lit zSeOy+#~Nl1EC$1u`|br>Rs@C42X6N?B(80~n*H3oYJO!bH0+u`^lQVjSDw4Gb1_`^ zdpP<@?KSD+hJ|q3sv<{x{|d6#zpN-8|7uJKR9z0g^Ykxb4c|?%4K&gOp@xdU7g!(WD%gTsR_5x zrRp8%B#npfHS@DjA>IS7lI3k6tU7H#<*b> z@k>nIUwSce*NysUYjjsP^hgzPGyCJI+CezMI-D9!XDkyJ@iAs1A_JhBrSfjH9Zi+y zqc6Krj8?~JEdXRKSM+Du4$N490quWfnA~LB!i6+-Errg zb{U%OEttegjhZ;8`kk!C;S7&H2oeD(06;`rUQZYE;mCnX95J;b@iP%JUSBSj`ShRWLYUxE896A8Rh$X(x}9AQb@~Yx5B3 zIMBZu6Hc3lN|C1CKr;lhMN5C(QeF5cY*6Mwx8c|e^lUPT{-fU}Z%ONfW;>cg4_SN@ zytdF!JN8clc@B+mq0~wYMA?4UKjtNh;$Q<3hh_k6%Cf0t%DqbRwTiECBQv#V?5$4(Fn zC!6-=i^C3~hnZ1DOYAXY^NR=Q?XJZ1akjw+0XXL{VwH`xPZC@%iIsq?9Dup3Q+(^%D zGj{Py2Z`}pKc!~&+7D$mu5e3qM zm7JQAn?pHvGjCSpoyf@OJ$WKM2ZNI7D$my5e3qM zDN-q7Kw7AhQ&W1gFUM}?dM1!|C}0NCK+O0#4#=3!P{Ih4sA0%LRtFVc4V8Cch!tgE zsAZ~Q%3^`(K+rXe*%}NC#f&||HB8A&j10jHEDV(lMN&W&n#{NAIf_!tQj3aHQ;IBs zB1M{D;Uaq&yT}2^Dh4@BK|!HN0!ZIt%SkLrEiS1Nb}h?HNzF@64M001v)y8r+H diff --git a/src/testdriver/__pycache__/oracles.cpython-312.pyc b/src/testdriver/__pycache__/oracles.cpython-312.pyc index 798077640decdde7464362b4be5c20115f470c71..d8a11d5fe1a7445b3028f6c568823873b6ad209c 100644 GIT binary patch delta 1016 zcmZ9LO=uHA6vuaxO;Qs#Nt?FDuXb#Tbu|==RZvQ`jTKUAD#Qw=*0^M+&Di}2GnXd(x9?--?W5F{?&woR z2}|%h)^+*huyQ^60zJ9@{>@^3B7Z2G$&OFtPvCitV@6DSj_6o(@ZrAgd$46=n`tG3 z;F4W6bX;M!UM&$!oix@gh{JP)>9pj8E!!zmYX+Az3loz%m~v1d-lUvhr%doP(@ZjN zvstX$ghOfv56==(>BU(G3OiM1@id;NP8m{%sZK11PE*3tm`+0~la$JuMY)Ly)WjAc zI)^@L572G2KMAAVkcd=3x>WG#sNmOq1zGnO0t>Pl@Ipr#U3&7Np?uzx4-93;yw%xU zW;~Y}o5*L6jO5gyd)L3i{oo(juojZ>X23b=b)@;s{st18&W^FRT2{V`MmK=SHVSkI zV1X1s4YGeFFEFPWRcQB51oC7~jA@R*gIT*f80yAUzaVm}0*YR(uMHSuYj zwdOQNHOpZ;>;8jUr2-o<$sM@DA!}i(aSELvvMmClD>d-%zYKxmK5jYgtvIiD603sWKY?<5bk3+?gD$>N6%R=Tu_~QA16z zJ?^vkv5T#~xK1pTP%V(D7{7YY8Xtd@L{Yuz{Xmnikk7e(P^3Gmsy)7;*qpk#e3egfG$ B`vU*~ delta 888 zcmZ9K?@JUx7{_i&eFH@)#7&=#X!6ylrEG^AcNvxi^~>}Thh=R5QKn0XQX5D`E6 zd~Sw}efjy!cki-T2Cn6ApG)`I*8nu*7TD0M!CTydOXX~SLPuIQW7%+QAd#@)&_Ha& zb|=OYW3j>5=y<~R#^Qsc@xhVtL~P<(T;=g?c!otXUV_(^IugSS5 z;q`#>a0CTQd+;q7ZXpWPO3_B4P(%q-4*l=4UGr(9pdV5I8=AUt*91f!Mj^b#wSp)X z`2KbpHmvtWwTkWlCzHrWxV1!(dis6Qd=TWd32mAtJ9{bBP*NF*@Br%&zbk~7E_(EC_Q5EGI>AAUVZaQgNs53l}TbQb}AxxY| zrJ!l4uEQ0Q1)EQ$w0tI&LcLUTq{vfrjiL)TiWkC8k<`r4ejW@+CRGdrcH<>e1OT6w zWc))2V87%8ZhS|2AL1$(SLp;%JLMxkKJPzS@07^r=XI1e4Af7&N%EPGaM3?C$%|`z zLz!<_xmo6qZAig2NhwRps-SFmYF_p|>sy7PKfeNuzsq!yO-}+>+F@LU=n^rCqLDSN zGDd#e2VNL=^y6{)%o6TzlL%)oMh=i7IP7-Wa z0RVQ`Y5;!+84%fII=(PDbasy+lO2&^JxkFQ?GuRXvm$VBGX%SM MTMh~msCORKKR%_&4*&oF diff --git a/src/testdriver/__pycache__/runner.cpython-312.pyc b/src/testdriver/__pycache__/runner.cpython-312.pyc index 48c6c669a006421d8e63c6ba187ca82fa5bb0802..d9431ba1cac3e0c87fb41738216940518bc2aa92 100644 GIT binary patch delta 3250 zcmbVOT}&L;6~1?7XZHVpb{Cc(Phi)uF~3$^3{GO>fNijiUHlIrWV18ayT-fZ&VU1+ z4NhvQc12~J8-+x68puN($(0(5N=frlrE(=#l^Snx%XU;L50$DuRp7Wy^VHru?0{?W z)Ir>P=G=R}bLQN0?zjIs{MXZ--?`lmK%SRtew2A7cGuHneSU=ny^MRG_MGIMy$S`~Ck9Fcj+CGljoPQrwHao*YjBanJ3J=7}; z0Q}|)h;MRH{H;w8y1;dqV$vYR43z_rhZ@XS@RyvxWOzL64LK_;AkXCCS&(P(M_icN zxVpg5+oipBTyRIJ;sQ}vh_Mst zr++*v=CYzZA)`rANy%h6oof(@0a1@m(zRTcAYMdiRh6@%niEx7QN`)Bk{eB`>0GvH z9jkAOUvoNDW%yM@;#C|&>4~H&ix-mUyo|)$h&bgG$FmZV&&!iy!hv>>MCg`OQc-n& zEkK<~OSQOg1SxkK|NxbX0ewm2_57liBH%jAGP|Ju4Hl0h>L1wYwOpT#nQgB6UlV#3NvJhiBPhS=C3b4_x!d zmdd6Rv)o^r+dq%r3qEY_e&1&3PdqH!cK^9qt{5yU1Y@6sK8=4?f46=q(NPqtmxXvi zh!>;ceCT%BLfO3QK|{~|`2F$~0FS|VFLEPld`e`2;&A**Ub3lW5ffE+LbpMU9Xdsio ztAPs6N~CS1fkUtXU+`D4Ak%_dJ;Czr#P+F&^pI8Efsc5$;Ex3X?!*g`Xtl)MVkB^< z)UXhcTf-*td3ze<9U6m^b^*J+Vf?j^&!fl|Kn?Ic0SRL&7>2V%!^O? zB(GgymKpj3xocc_*dHOTgBHz|*@J)Vk67JyK;qv^BgUr#L0)r{rG4ar3c5?zP2OXE zptHfm&K#vtKsUY{7I?{Sm=FYbnBHs_&6DXjqV!~r)49TvIcZvM%#!0434kB_e&rjFhj3+*+kix->M|Zq1m9H zHblR~yY7KlmX7_2tn}hmQU=DCL^g}nWyBR?P0a13EE(Cd`?Y}NzQt|C&iN4|dGK9d zIX)hWvO&#;Uk^p#t42I2YRd&RUuplPaM0R8D!`GE=?Z=}5RQ0F${<|xLvsF3&5qhO zL2*8T5`s2-BOHQf@oKobMssG)Z6w5$)Ql-*Monise3Cy6@6gsHk9iP;C9YXW`OW;1 zgk~eWDWsUQls5w;96=NCTfWLYH<%g0LfJ#mEW?DP)*khBQ_3Jy+L%?LDoTC>d}vx(klr52G*HI3!c; z2>yGt23J;GgM0B$D{8jV8&tQAEAlX5N!cJw^cvMU#!zm8kam{P;X(Y5ik%$VM-iJU ztGY<2c%5Xfsw^4T_*yUrE4ScWWqB|Cjfd=X zr?bDi^H9$~=kcB+eY#DOl@v<9wno2*CQ^4O<7gzAl84h0qV{(OCdZU>ITf!~ zM*V0f)p40|>8y;piHsYnCK|&gVJnKPB3f)HP6v7==rEnpVN zEwvmexQ;&PKlzwr?T!@(p4)O7_Ajn%c@;(z9ji{>A6W4Ke`wBn!}>VraC=ro;EUi( z&n($aF#XUTSviMK*1YQ;W`Xx0{7(1u{rhnX{H_|G>>2nT xF2p)H9~b>5h6C|FIE9n(I;h}l@mmn#ty>SmpJB9B@$X^bUib(Y6WT&R{tIT-0}=oL delta 2014 zcma)7TWl0n7(QoqW@l!%d+Y9WyWP_5z1_B4W4RTDmKG?NV!5)ojK>b#FKsAFFhU?qE9G#S^uQ^hIf_t!Yg!n6=`S)t7wRmk?NGu^FLKoxr@S( zLzPs=MSh5f3t|XnMV|hJpsey#Ca5k|pl|0{9Ct5V7uVp0kjKSUSbQp(Gc0E^Wn@T> zL})Zim`t9W(4gIy!5s_l`&MJO#f__EJJpeHc<7Jf9{9t*Rw)RWbT=b=80m$sz)IW; z*+4qrr2+>+_!qN;)nH<{CWICorQdTUV<<1Gd|nzyc^NXLVR)oe2rg6B<8WIDI$U}S zG?c9ky5=#(pbthft9fK{dK>fyLnX7^@DB*(-6qn#5C{fgpge@#(5ZwGc1P|4AKz~GWZ?WMi(RVRB_^F~y5N+GLWsUHWEODj>0#%B` zqwlp-^XPrh?+Oai9B;be+i(rsEDLgaKf``Ykpy26T3&{RrHFzN+$alidKYu{$;RPg zT+=sC`x32$Tjg#V#0H0l<-F`yQ9e+}npQCYI1+Z)HPF={OT|Y$3n`nJ&9Lm#)I?XwW@clRx5xdcw!4x-! zQrvJUjU66#;GEwr&$!7h0~RlFkdO-iK6Qo>d;X% zGtL${Q(PWb$P5|J(mMx#Ri45oB%>8@X+@Lo{IZ9`4AEYEx}q*fn_PJ65y|Jh|7YC7 zKgRuZFIN~li#VpYn2qY3bJ%05>N|qyp7Xxu#b_4K94+uucnY0y96?jK4jGA}J59rh znRVa@n&oDm6m3!*wtF^(;(mz5Hp67B11I2SY`f$ngVdWO;LliXz)!T%iCpsJh;}Bc zr3_7ls_M&l8+=$@+qjFGS<*yK8=*&&Mp*9&`&=wnmSiTibTXaNNEa+sZwRz{q|k z#VHGq!`<4I4Xk^XV4u^3eUg?#JCh>Qj1z5qO(iL)sjKG|Dudm1t!Zco0mLdp!AU+1(d7e74fm+_IQ_Skw5&d@gTPD>)1ND z(|AuB>}sCgF@#ZMQ|?6?>$9!R10m<@qs%Ws^CYGe}!?XZq|gy_{~xl`S?B zPu^f4WsKPPb(D*Xq=E^ej8rnhsv@% Z2GF_(UxRO2bAfRVcj2Fr{UR~y{x@z`-V^`; diff --git a/src/testdriver/__pycache__/scenario.cpython-312.pyc b/src/testdriver/__pycache__/scenario.cpython-312.pyc index 8bf7e17b6abee1dcfc90fd3abc90da1d7658406c..3ef1d6055aa3a5728eb0d32862d6b11d40afbed4 100644 GIT binary patch delta 367 zcmcaBxKfb!G%qg~0}#Y0b!A=L$a|WR(O|MRtK8)8jKVCH?3x^tWtifb{WMu8Pi3;3 ze1pkbK@_OCmEj?a;{y)vX7?L>g3Z1+c%-hdNEJx}Ws3MF3$jXXPGgp3^biK|ML+~d zPmvgi5C;*gK;jl_Nohe&YLOyHKp8|xfC#V|QXrNLj1ZfAn#Gb0EFrU*i}f%gqs-)U zY$lBIlbPAod~jN#3DU0xBEZ(MAwlbfGXnv-f*WIQ>L!$gFYQThV|koe5Zz@+kl3CQ{=FnK120}IGd E0ONc{zW@LL delta 416 zcmZ1}cvq13G%qg~0}y-{?8^GIk@qwsquu12jD|uf>`|;K9H}fRoHjt&N-jEK)b56&m~|xLjdTD3S)MDdL-amql{35wk3#hbV|I1|q~kgan9? z1QD!2;udR3X+chEkupd?6+}pZ2(TG4AeJ1A5T87q#gYvyA-DM&%V9=FxyiHGOc)g> zpJ!9^!D)#$NWTt<09(hBlUZC+qzmGsS)>6H0})D-9oZfEz!rhHewuPO4pz>10_B6A?B>#SaWX;xjV?lgbAsAnT*hAhkxr@?c6;t!Xe%deE~IQ=gCUDuda(->j8M_PJKC%85| zqh`R@^vqVKmT6fvOVKl4wq@7sR!^-5{(G7AtXa$H8qcgOPLa&YD+vEA6XVUV1R=BX zl74X102}aU?J{;dB>E9>zbupgs~ju&&fAlyYK z;xr0q;B)FUqCiw=>|cy|7&>zvkbDOJ?yr%V3)%?$FcNVias$7b%Tah{uDW3q(lDS= z(}}1X1|84AeOS`H!Cc72BC6V3rRUtJ8N|R7QHP2cIDC4g={A~_FLKdV>XZ*OY&wF6 z%BdD_1)@zua19*}SloaezUVUUH#n$ZVBZCoT@XT-=Q|>3QAcTO1VZpeq!j&k`9*M% z(~Geq96#cmHUp2L5wDG&gbnUH!VN-tMYvJKeGCh~x)6k5C8{WWskd-2Ke$Z~9NY0c zy65D+>FMcv%9B;ayOeD>ps>BKY$RqJyDZ5d9!iWRzbcOzhku-8>nV%qg;e#y8}0yD z*4Fy8($I@%uh&*;^8ANGyFM7&bz|`E8~NQg%-y0W|7c8-m!wnLAwM#vYRrD4=XE{J zbjz4y z-CG`c>j`s)oH<$6#R$kGrr--=sl?ny^b}M^Qks-pY=3(Alz{Sb|5f@Dp3fMxC9y#p^Cx_)Hk$j#od8}^tw)%(*~# zEdBzv&dSeA6P*fO@ZwOl>IS3@rxLVxXw%SzyEEr;zTi1+m_{ua1@qYM1)qyuk0B%W zc+Z)GuL$CcP5O-5sRQYm3iRzL6>w>x%RJNPt#< zcKQ(L!HES{9ad2@Qoxj21aT))D$gF6PKQ967*&*bu@WPUqa+Vd2l)`Dq!N6k$kF`A?Yjnf1$)5FLP0znDxJrh<)JMtGng+08X!^(+{;uEO X-Ic%VA0Nq+eQO$k+F#dUrH=9~6Wm@C delta 1958 zcmZ8iO>7fa5Z<>x&ida@0wK^Oi&F^O7(+t~O`%XADFlhAiYiq#1+!$IvCDebdb?jX1WW!rGjHDa z=FPkr|2Fi)VCI)}Iw8U5%lzk`+>S3~w!Qx=Xp539l_i_lvO^kjStckej?z%eYC|h) zLRXzwqodr>(91fJWa*S-Yx9yFqw#wRGD=c8Axl(UXbux~;SR#jCdq#Lm=R9pkvS4M zk+mEMixQQ}1P+yLQdZissf1m}rvr~o_?}}0bY%40&Z|mjmGT6{p39vRQQzRVl{=U zcHU0UtL22@UT8$u536UV!~q;vbu0zY=Oe ztLe}%=6fulwxGL91e1^H!IS@q?<9M8E-^5Ni8N#42-b~<6%b+oVT{qB#oSPxgkmy5 z{-WdV4M($@L^~T4@x;6j>e~OPJhhJarAH9C+#)Tzy^iludgR$>h%l+e#VSG&`TH#5IXeET< zh^UM6e~|h+wgveP@Uir+ZsZRY%eH6rla?QpKpNrK(i4#0pVCKlkpTj}>C7u6 z$6w17$XonuW;-m`GS!po*;nfUW$XY_#iD|>>#kc znLX1d*yK=gs4K`ek?=d&?Q=(wH4kuI`aRou^Nq#B3x}7o0}u59aY^VVb`VyhgozSi z#=ts?R#EHc){VkVKwK7d?K#ol=hq7wDs?w7Q=5u70VG&OhE2)#BjBakK7>OEZzEuo z>^Qrr(`orez)ShUTq%)&_A@T}l-d_@I?)-*+Ci=EUN&5?!JG;_ zgV9T^x&va38ub^ciiYoj)d~#DU@g~}wp_t?iNcS;cP! zVG^JMggByD59Eez2f$GTti=cOX|T#`K@0C%lRUxuP&>_s0DGyq?w5ZL84NrwqVxK zN`)!>ac6NZjE{dhO`G`V68#6@+l_({2W}4HseYv4*)4}2WoN+;Tg|@)u%Zw`R^=E` z|IJBc@Goi4pOOJ{fSe(>%_kE6uIiGUyxF}>w*Dt?A;T*Yz?zbf` RWbcXuu%^Jmstl62#s9rp%)I~r diff --git a/src/testdriver/crystallization.py b/src/testdriver/crystallization.py index 7897e2c..6e90483 100644 --- a/src/testdriver/crystallization.py +++ b/src/testdriver/crystallization.py @@ -35,7 +35,6 @@ class Trajectory: step_id: str action_name: str surface_id: str - method: str target: str fields: tuple[str, ...] @@ -43,7 +42,7 @@ class Trajectory: return json.dumps( { "step": self.step_id, "action": self.action_name, - "surface": self.surface_id, "method": self.method, + "surface": self.surface_id, "target": self.target, "fields": sorted(self.fields), }, sort_keys=True, @@ -63,7 +62,6 @@ def capture(pack: Mapping[str, Any]) -> tuple[Trajectory, ...]: step_id=obs["step_id"], action_name=str(mechanics.get("action", "")).split("(")[0], surface_id=obs["data"].get("surface", ""), - method=("POST" if obs["data"].get("surface") == "browser" else "CALL"), target=target, fields=tuple(sorted(fields)), )) diff --git a/src/testdriver/evidence.py b/src/testdriver/evidence.py index 01a65a8..bdbc78d 100644 --- a/src/testdriver/evidence.py +++ b/src/testdriver/evidence.py @@ -72,12 +72,6 @@ class EvidencePack: def of_stratum(self, stratum: Stratum) -> list[Observation]: return [o for o in self.observations if o.stratum is stratum] - def latest(self, kind: str) -> Observation | None: - for observation in reversed(self.observations): - if observation.kind == kind: - return observation - return None - def to_json(self) -> str: payload = asdict(self) payload["observations"] = [ diff --git a/src/testdriver/oracles.py b/src/testdriver/oracles.py index 705b1ae..17f1c20 100644 --- a/src/testdriver/oracles.py +++ b/src/testdriver/oracles.py @@ -3,6 +3,10 @@ An oracle reads only the independent observation snapshot. It has no access to the actor, to the driver, or to what either of them believes happened. +`SUSPICIOUS` was removed at T10: no oracle could produce it, and a verdict +nothing can emit is a promise the framework does not keep. It returns, with an +identifier, if a mechanism ever needs it. + `INCONCLUSIVE` is a first-class outcome, not a failure mode of the framework. An oracle that cannot support a judgment from the retained evidence must say so rather than defaulting either way — silently defaulting to PASS hides defects, @@ -21,7 +25,6 @@ from .intent import Claim, Invariant class Verdict(str, Enum): PASS = "PASS" FAIL = "FAIL" - SUSPICIOUS = "SUSPICIOUS" INCONCLUSIVE = "INCONCLUSIVE" @@ -101,6 +104,4 @@ def overall(judgments: list[Judgment]) -> Verdict: return Verdict.FAIL if Verdict.INCONCLUSIVE in verdicts: return Verdict.INCONCLUSIVE - if Verdict.SUSPICIOUS in verdicts: - return Verdict.SUSPICIOUS return Verdict.PASS diff --git a/src/testdriver/runner.py b/src/testdriver/runner.py index 833eab0..9aeb9e1 100644 --- a/src/testdriver/runner.py +++ b/src/testdriver/runner.py @@ -56,6 +56,24 @@ class Runner: # -- independence guards --------------------------------------------- + def _isolation_violations(self) -> list[str]: + """Does any actor hold another's canary? + + Run on every scenario, not only on ones written to test isolation. + """ + canaries = {actor.canary: actor.id for actor in self._world.cast} + violations: list[str] = [] + for actor in self._world.cast: + for key in actor.known_keys(): + value = actor.recall(key) + owner = canaries.get(value) if isinstance(value, str) else None + if owner is not None and owner != actor.id: + violations.append( + f"actor {actor.id!r} holds the private marker of {owner!r} " + f"under key {key!r}" + ) + return violations + def _assert_collector_independence(self, stratum: Stratum, collector: str) -> None: """S2 and S3 evidence may never be attributed to an actor. @@ -111,6 +129,12 @@ class Runner: EnergyEvent(asset.id, run_id, EnergyEventType.EXECUTED).as_dict() ) + isolation = self._isolation_violations() + self._record( + pack, Stratum.JUDGMENT, self._observer.name, "actor_isolation", + {"violations": isolation, "actors": sorted(self._world.cast.actors)}, None, + ) + judgments: list[Judgment] = [] scenario_sound = True claims_by_step: dict[str, list] = {} @@ -166,7 +190,6 @@ class Runner: "action": step.action.name, "surface_used": realization.surface_id, "refused_by_sut": refused, - "refusal_expected": step.expect_refusal, "postcondition_met": postcondition_met, }, step.id, @@ -176,7 +199,7 @@ class Runner: # An action that was accepted but did not take effect did happen — # and that is a statement about the system, judged below, not a # reason to stop judging. - if refused and not step.expect_refusal: + if refused: scenario_sound = False # --- invariants after every step ----------------------------- diff --git a/src/testdriver/scenario.py b/src/testdriver/scenario.py index a41de6e..c4ac795 100644 --- a/src/testdriver/scenario.py +++ b/src/testdriver/scenario.py @@ -17,7 +17,6 @@ class Step: id: str actor_id: str action: SemanticAction - expect_refusal: bool = False @dataclass(frozen=True, slots=True) diff --git a/src/testdriver/world.py b/src/testdriver/world.py index 04f2341..55289c8 100644 --- a/src/testdriver/world.py +++ b/src/testdriver/world.py @@ -8,12 +8,20 @@ to be executed by the same process. from __future__ import annotations +import uuid from dataclasses import dataclass, field from typing import Any, Iterator -class ActorIsolationError(Exception): - """Raised when one actor is offered another actor's private state.""" +def _canary() -> str: + """A value private to one actor, unguessable and unique per construction. + + Exists so that isolation is *observable*. Without it a run in which every + actor shares one memory store produces evidence indistinguishable from a + correct one — the guarantee holds only in scenarios written to expose it, + which is no guarantee at all (F-0003). + """ + return f"canary-{uuid.uuid4().hex}" @dataclass(slots=True) @@ -28,8 +36,13 @@ class Actor: id: str display_name: str credentials: dict[str, str] = field(default_factory=dict) - session: dict[str, Any] = field(default_factory=dict) _memory: dict[str, Any] = field(default_factory=dict, repr=False) + canary: str = field(default_factory=_canary) + + def __post_init__(self) -> None: + # Seeded automatically, on every actor, in every scenario. An isolation + # violation now leaves a trace whether or not anyone thought to look. + self._memory.setdefault("__canary__", self.canary) def remember(self, key: str, value: Any) -> None: self._memory[key] = value @@ -65,15 +78,14 @@ class Cast: @dataclass(slots=True) class World: - """Initial state plus the handle to the system under test. + """The handle to the system under test, plus the cast acting on it. - `seed` is everything needed to rebuild the initial state, so that a run can - be replayed from a known starting point rather than from wherever the - previous run happened to leave things. + Replay comes from rebuilding the lab through `build_lab`, not from a seed + dict carried here — the dict was written at T04, never read, and removed at + T10. """ id: str sut: Any sut_version: str - seed: dict[str, Any] = field(default_factory=dict) cast: Cast = field(default_factory=Cast) diff --git a/tests/__pycache__/test_audit_core_e2_use_case.cpython-312-pytest-7.4.4.pyc b/tests/__pycache__/test_audit_core_e2_use_case.cpython-312-pytest-7.4.4.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78d416ea218bd30d7830d673a1d442cc71038b57 GIT binary patch literal 12422 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_classification.cpython-312-pytest-7.4.4.pyc b/tests/__pycache__/test_classification.cpython-312-pytest-7.4.4.pyc index ba46d325053a6a63237e6b30467872aa6d37473a..e875d95186040a9f31036466157b8237bde4510c 100644 GIT binary patch delta 6672 zcmcgRe{dAndAobN_xqQ0cha2zX#*1CkdUPqgu&v+frKO*O9lzMV>dZgw=3?%{ZQWS zA#`)sQ#(v_Xfg$Logl}Vi8}SPxFQZN9h?40izlte8BbGWVM|=`kT{t(e>E7Wv8l)D z_wC*Z!8op+>GaLrcW>YO-uHd)?f3KDU%yQM=mzb4%i*w6(0;LQYUH)%X{Vq5<#glA zbldd1P4rhUF!V=EmDqBEdSBE5P<~L-64XpBjGk2z~d$e{@vQ^otih-O+At zoC8ASF98(Ia#9$TqbVgwlOMoWH7|VuRX2#M<>)5ZVo!#H0Usd1gewKdiLSv7`NdKeS*0+=X@rBX8 zUl`~&)WL&i)cRdjl`k78>I@~)A`_=_be0}5sMB_jdfI03<`~hCWkfarJVdSopu(wb z)_{6ogNMzridp?b>uP6?%d%N6P34SPqx_-z>;7852;E^?G~vWBGsnV8Xrft7J=Ub2 z^4F@f9*g>_|10>*CTW;RuBlT$*=nUNfD$wW6o*=|Znal2>nka04$lZ02>@y>1FYL@ z9>B(Rb+s11X#F0WF;Y~{B-%uK))b?)C$m}~2&zBY<85P((>WHtMiAF9vRbFM66V+} zYu7h1E;_z|tQP0@7>$WVWAe#1iyExAhqAt@ptw!lZz2|$#@m;wayV^Kjt9z#+rd4v~aSt2<8{={?qSTq)i;@nttoR1-v zMpBd%DWV8NaUcdf}yjbF2oX~6J~;R<{9-|^D6bjhaWQPXQMvbvF>5= z9hf8&h~X--k<{pT(JV^RDE0{I0eKPuykn~9EUjC;V~a0nB|)6{2~L=VxB`-k>QB4t z^Ju$xWO~yLXsaU0N;sBOq@)s#M1|xLDIAl-`VmNC7&e{^!y5@}0*7Tu2`5s=B$@mR z5c?^7O6f`QYwz6(Y;X`8f9IwqZyu1WV~#bo8A zXVN?Ao2;6wp7c)!%1$6bPuUX8lp|rtQ3-a+o#3V_62_^@glWo?Fi&|CmMLGtnxhl8 zsj7s1%1@*7FvJ}R=af_HvvF6#J!Qv!UgY8xiOQ*JZNeD$B*3X?eN)_*sG4%o6hmdf z0f-jSnq@{>K->o!%u||8f99;{I6;;D%P@V;ImhYCrve3A!CuHa3eJM7;4V}YDhr;1 zx8N&O6{-vVLSWb>x=xsL2Bodc4;UHHNn^vl=q@{*In-}x=pshGs`ppI9H(q9KaaGR zd-yx3KY(lGvPN)`rmRW+P}x>S8QEU$-TM_QvL^7ImAGPs@AN1;$~e^mZj0y?hja7L|@4zo5d=zI%_VuWQ)>O-pIX0Bm49%=swip2S?4p*8~U0s&0d~ z2D~;0-WkttTnxZ|{*OLpqUB8E{@|*#AN1nz!LHE$-e*FCz5RXR zeWBj{=;CEzT;|t~fh$j?OVBF0!d717)O(-v9%>H-*rqP z<9u8g;uC2_P-3Yhgb8rYLwO9@o`=P+WaUSNaRZtlMtS^129_OPeWC0RuG6BgVHCo6-WQ#^p2L6oy4%IqLFbF(nEw zLq9|r_K*97x0sB?(;|e&WPV&@)~r#CrpC0x9Ft&6F-6u+1741hToD(8_97RGC@E58 z_X@I7wDcyA2_z;Ym7=kq2$8r%Fh44q2O?4uCQ?P`fCK?uiA7);oL1 z*h5ldK&z9)U;+lXrv)Vvg=7>1COlW_tTcLiAw(vnc*c>AY!cF9EU#=rCCW4mL_t)>8)lBUmD3FlOFVn{NER3SAXc9$A38Lm(FiG%W)Dxj|1_KCaT6=eG|CT&044?==3 zeIt!I+kHYAfYZY$)OzSVPSKiRU$c}1p-_5I6r@<^33W!1+=W)Oo}C-dCLO z`gfgeo2i)D{=%BK{kyKYd?4i6f%AcvzJA5mvEb_Xz(5CfOi&-gq$Ya7zKI3Vt+BFw z$`PQp+$x|~O$FioJqE}BZPyv4DsdhN%kC4wDWMiWUWwUvHu-N|yG=a;<5&>Mdwu)0yN2MfahYgmCFcAY=$v9-)De6A4 zXc$Tjk-rDwiuNNA1C+23fe0%X**xS3oxs8>r-w$M)Itu{QHdmCvWyPiG^BfE^u5}! z0=5&D(*&wSNd_Z2heSDywQ|NZrh7&}W+6T+8OJf9>?^@D2W`ZO*d~HL2;z-F5c6Wu z0_L8Pk`NqpVkU6?$eW-w6CZ*q1l0)q0D^vk9*NW-ScL#5L`x3MDQLu4e~a2QCG+Uf-4B#LGUhuB?Q+HTm?`xLtPt&y-6}kqL*&~C+=@r zL8nQb>Hd6AlK*0!5AupnfuGz8rUmZpnxk$uaM{sxgYsIO^AGIN-!R<@+jpsc#43xuvo1z`g*UkE`25M*0vyp|s#>@WZtJSM!I%gYS+PUOidw$EC#`*gG zYmKevgXdQ*H14>~8Ja6^Q3k)~24$%B-8Py0&O*-zZmMeC>?3ENn%~m3u%-J=&w}rX z!oI83_45r|FB%paIxa>RclOQaclIq*_ZNDudIK}T*@3g`e%SO<)5Xp!-cX_Iny32A z_UY|c-BqX4GsCmdSBw|T3+`>#E4vE0G4xryMeY=^U(>f|~DhJOlhooh{GHwH_)5PM+iIT->%3Aa)`DNBEDJ{(CUk=vzSzlICNOqd{QTQl+8;67-gGf-a+`gO&Cif;*E3FDxn_+;mqbIf!BpAQ+_7 z|2(kDPsZROSVOceYn#G^j8wrT-unD+v#tN_aPBuPqA57q^s-g){OuG5|&9jQ?e(xXtget?#iLHQ4%dSJjfa`f_0R zk~y?wu3R+x=gt1B-Ze}1HJ9^syDrr%h7Qb!4t&7Sjvco+)@Qvzv0nRai^Xl6=($tn z<3Jq&+(dA@g>qF-%WC@h$ZW$4Bc&^teT(ex_-Xx8E8k)Fsh4_s)cyUIN;^c;mAQh# zsCT>S&E>GGhT3b@+K^Q}Y4uv8Oa>EE$ShRh$(l;YP~ma}Q_UQcWlqy_lYYBOXBoI5 zU~qE94S`|#cJ;K)uKo?&vces%5sH7vJyzbTs;fMejDC*_U7vv!x%;MTL(9{(As@|Y zcdSo(;EvT;D(DTONi=5-rGlQ-uRph1)N2pf@)juDA(0-p1g)71dKoK9P?KV10Joiy zR6>H9R)$hmDi@(56srkIzjD+nMab-BNJ`6Bo*}3$N-N8?9u#K0l+dm)wMs%3fb7v& zQXIrOQj`P{i9>wFOUy$9PxkKZ#hP2I+VBo@NE%MT1?ON}E0ofB!6$09CK?4vp%v1Z z)`ktELfTBPF=i2zx#Xuw#Cg+`Di`{0N4Am~N#7=rI3cpN}q z&`GRd2jl=e6phD(IK*XbC3y>RjI?_FKvNS(EQs_B4rLHz5&Rhd8IwcJUUk!KP*a;~ z^64ZbGH`g{u-Ib;!|s1Zj3WrXi(pp$#^5TB{1TTuH(1ZVh=Z>o z_%VVv5a122=9%EQ)SnElwyptU@S)@_&D!ns`db;=LN{xF Gr~D5_<~o!B delta 359 zcmdn{fpN<^M!wU$yj%=G;HA)&bxLL;p9JHjiR$YZ^(J1^X4K!z#Q1}WrIK0GV6ymJRxZL_5ZCmZ9w$|`TqUW+B`HOjWvNAz`%6s3Z;2uV^a_gd%Tn_a z^O931pD0n{zr~xAn536mT9R0jnV(lY`F%;ez!8w4=^$bjh?qY)u2h=i7F%(CQAujb zhyZ!*7l%!5eoARhs$J17AQ$B4V%yCxO0Ai=J}a;? IvVm0s0JdRpSpWb4 diff --git a/tests/__pycache__/test_reference_scenario.cpython-312-pytest-7.4.4.pyc b/tests/__pycache__/test_reference_scenario.cpython-312-pytest-7.4.4.pyc index 9f5843bd06ba1c99d657062ef3969ed054c1a200..d39b6dda8a6b89dac65c973b457d601ea8f016d4 100644 GIT binary patch delta 1754 zcmb_dO>7fK6yCAd#$G$N6FYY7ILU_mF0m7*X;l>k#E%Fhl+cs}l~Q4hcLUCk7tJmZ zN4AnkNR5zsaGwN+LIsyf2pTntsvg=(+=|*mL1{(gLxJ8}sS>4Ce>k*#&j~bCRog>H zyWhNd@0+)8-prf*?Zg{-&u0}Cl7Owb>D-vZRrJ)b^ToEK%v+pKNUG|apxjg+9k~#h$Tocg~HkHAgzXP_#>f!Bx6OP9kv3D~DpKodaIUqqGb{Rem zNTJY0aoR2j1&3OrhVzaLD~~E+UtD38a3vCIbWX8?tsvzDB{EpDr6w|ItzA1m2R zeO$}(mtd|dVqZ(km97Pk!b(yynNDR>JeN$uP(rOcgdt6PQih>%Q*LQLnR`Jo_(@bM zYV;d0BekV9s#3L@ZWq}n2qvLh@nil*y88oZ zQm6z81fvQ;hU?w^QURrHqoAF5o9;vUCVPY-WGt%Za=fb{kR`KaR-?bzH+xQ7t95su(2Y{yl}fJ3O=y{b;a7K zY&y_Gxm{zcJrA3d*K!*RKx5R;9FVH_+ia@cd_3J{tv1O)tB0eoj?UVnzAQuLdgWYw zoooHLSXBp?JT)%bKHL{iBoaNF<&2?Eq|A(-MM>7CQj?jirph?fPHQ|T z8)*%TBcsRUtZt%uB1bkos~M7v?F`SDrk0gW9p|3Z4NcCNoh5H7ZR$LknR)E{8`>7G>2Ah(cNI-OaI%;0}>7vV*=dKD4ZtsldBJzZXhQ4+^9S(Uy4 z3tnY=NmNs2N^$>r@0F}b=X3PYEd()w0fJ5fDns5&5GNRckAsn!xTzUtvYeA7Kb1{# zEv<9aNT!mQCN+~blX^D!B$xbkocSWY#@7h5!jE>LG7QpO|7_p<_Isha3p2%;JE5N2 zp`M?t7N32^=YP-mU}|yd*3RMO=ZDW(ACPu-&jSHFs{49a^zDKhzIt{S?zcSC`lZq93R4f?UX6WHA#ekdX+7EX$i)iAjdf!>}Y>?pj|b8zck)bfJ_qXc6Fbib4Xy(*Lo nllxHd$k98gtEVQktsHPj`(_M6{Mp^!hi)fp{h`Le5@q%uuO`P| delta 614 zcmeCJ`Io_WnwOW00SH<|y0X4;OyrYboG?*6fst=whXG3^vnKz>L-~A+nv;$Aoq%L1 zzYU}7WM*sa$#?mM7~Lj+;Ll+6+#D%zgO$;JvXNLIcL30&A}tURIJr-(fiYw=zjzD} zW6)?+xxGQMJ|Mz(@;~Jk#UKz<0Z3@_6^Vh^VC`WbmNtm+n7mlUiZOWd zJr#e(l+AjoTbX5%i~y;S1`>Xn97Td4PUIv_FQ95~O(({T$$gr+Oa-iy?{Ua)meC4i zm8xXW6!W{qnwXQBoO+8nDL?5JYe{}~YF?4wuD{Qsc%9nlDvM%~5YP%urXo;0-(oH2KczG$)vl-&$YliLV$aFjZQZ#(^RO{0ffWJ(oerOh diff --git a/tests/selfverification/__pycache__/checks.cpython-312.pyc b/tests/selfverification/__pycache__/checks.cpython-312.pyc index 3c615c3a8e84ea49b9a4ffa70e4658a2dd07b4aa..b46525bbbaa393365f54924bab446e850737bfe8 100644 GIT binary patch delta 1594 zcmZWp-D@0G6u)=&BfFdZ%EzWjn#5~Tt4lY@qM#ugQ&O`5V?T_osBM?+WbWN$%TFvKr?N?|Lsb@+Ka@F&rd^f4rFo z5s&Z|9>OvD=q_*Njflk#VF?~aEROyW9GiF>kK)*j>lltLOP=JB@>^a)&Xw(cv(W$5 zuQwuXROYq+_;K_QLLc04PBt86x#tL3r7M)v4&30%9Ik<03nSu@h%@zATlMxn!6LO3 zN@mEavZ9QW4?UVPLo_AVfD|6?Tk(8KK2z3}Ye6rftGG+adEzD9KSR$WLS1x$Bpb@# zAYry5V2MH5V5PEUGff3tsti%CYc?|trfRkcOt-3LQMGjh?p^(eP4uVJ>1R?5gk=^h zf)9j344+e?V1i)wtZp%}s9Uz+DLh&~xu9CeSX^S}v?ZXTP8S8!4Q6S=P(e2>wg9?q z3xnCFOD7iRO$%M@VN9tilSJ=@SzViD!p(axH)~b}!I4?8k|>#Y0Si+WY#vNr)&$?< zs_0x8nheM>G2NIc>v&M6Pyn-p0W=dpxOWxiY2Z>UswLeJmc&X@$Gwc}cTF+Nblp{y0@HFC&BC5^`|`MIqmsI9 ziDIFODHc?{SOziRdP4#`qZV^D$RCId?TEs0G|Qd!($)2^=yE3bFk2pUYa}J*I>&3; z^@I=VT|cDSOf43ZN)?(Va}-U|3voG@t?7oU(TauLPGk>26HaPf+N{v#{!J^7wa@Qs z!Xb?=D!$ennyci`W)knde&J56_dfCZCg_@Hr!l%#c`viod1AZq#7?+%C((ZPdfWP? zkMryK&oAFeJiVP5+L&Go?F^6q9LsJ@Z8fKEPThQAJD%Q-Ww!&_-Js;z4Ux#`R^#ZF zcl59O9ul9RmJb7d9Ucq%H{XeVKz&2FEN`~NsqZ)p;=C5X7BGPeUJI%gHmR%uWN-(L zNHgLLB`*6War*Y=CyA0LJ}lAarE#4`owkl&Xx90=qnnO6M?1%SFXP^=O|?@fU60Tp zcoxEFlS)k)NW-9Wuj@4Z!5Qq%&|zn;dyIbXeA%6+XPijS1bxl9(9`F;i0F$X z>J7>KpP;Qy_}IBub8^S+yG}VvNh6yFWZ^*80i?hnwSgr10yB;6DW#N b&~ZuewKkmF$F#tM(=c^nOgM!bD8`>6lEMR|1yV#)c!9Jakk1FCg({gf#Y!7l7#RFZOLX(o zbdwVEQWVNki#Gn4!n@fmdyevT4X+XhN?AdERcC*@(tB@Y;hpL_{nF~WEkTnzf^Ooj|U3; z;>^h`E{QHKDT>u(D-r-H0jo0tvZ{DJOHzvxlX6nQ@|c=9oI|9~ivj1Y*B0ueeO0u&QPps+3i1!57%|3x4_ sf&;Ed7{n3;62CZXa`RJ4b5iY!(tun>ATC}#IZGp%`9l!nS*WNd(S=h-gEAG+%xZ-Imog6%0DLyfhTXe>g$Csa}_(dX8GFZZMDz7@j zrIE71vPk)0IrLr6bAuIX8epaB2K1>Oz$(=XSgoc5)~FePwdyLsIyDopUd;k*P_qFW z)f~VkH5ag1%>!INY4PQc=U6yyyKHFTp;}WjOnGL2zi#1e)FlnBDGUU)z^FfD=wZbS z=~4fLV)(T~N+cB3)EQN3ckn&*`HK$Xew|#m#*@~^e^dqcpt6KsFeJ`T{H9bj60HbH8e>9-Ic2(a8)vh z3rVC1{*sol$wpE?-)hG0hCW{!$wP`5(8nf|c2(2HutnJ9bQmF>2weyr2;B%f5q2Sb z8Ng>F`>>6Bk*5$e09u(>1M=<7+aN`u+dFeAFJJH!K(h}fc#*A_{&e-)x)x}Hi2X?U z8o~g=Zh)j!CrTi!84`44e29+<1wE1p{by$S3j{GwK|Y&d62%;kB!z)yf?JRSbadU8 zL>4wtn50z+m^v{oi|i=K5Dwr`kOqK0pNpLW2_aP+iNoQS)TQG{=B*?{|@ zY1jam{7i!uxl=j}lmI;{|60_cMSoS0Gqb;_$YMo9kz#tRw9Cq5Y@mNCEp(xY=7pmV zN=r&}u>S<Do3n=}(O`fYc9Dn#g{7zN`o= z`OC6a=@d?)|0#Qq*Js`Z!gBN_Ree=>8ozDcm6tCR21%BFpVW!Nl7E&%|&3JFyJQ@iQu=B@NrQ)c2Ej;8_q zllyda#zhDZ!0NF>~c-vAJXnJ9Ja( zvPd}Dyu4r~fn2Ea1YY0j4F)A{S6Ul6$>9& zIjLz*Z2W)yX2r(O?%QB}@+RyafOqk+arBP`wl*x6Ud8H62y+oW&P9Yc&#E;`*b))r zU?zc!2^c!~JPXptEpag}#jSB$%tABPWLZ=(pL$p4imJ3gu;$aT+FbbxCP8@E8hp$W z6Jt`$c1284M>1&t+CnjIH#4b!;~L&hFIHv=Bl+~6eRa(hKE)Jwm<6d8$Hg3rRA=YxXR9r^M+Y+2$f~q?BH>X3~F^IEtgZ>Im^uV8^)2 ztXP<}jI|P3c^AFbnpx(Ir^TEqpAT$tcPuUDKFGyAF^>^m#$QE0v}G2#VxA#hO+%g` zVL{DhTugxMv;{358d2<78y5yt_j!Q{=T$wbH|CueHT?@jEpimnpS8LY>4*4u8oZvk zdotaZG4=kQpa#J*OfzqzZ8GSlb%mJdA2K;L( zgx-Nkh(}F^(l!dyYasAsBcMeU64K=f5;9E<0#=u`Lu0z3u~1B~lDdwqw>>JeK$L@e zSPeyoWd#B^sF4aoR>n;ouGmmOjwoalVm)NYsVG_4QztM*A(NOCQp*u^B%eSq@Q4lD ze5z7K-$*)iNEtzGR3R!^jU3YmXm?gjO_iV!22*E@gbpgEwy?E6Bv&ZmP(Z67N09w7 ziM-F3lXT*TgbGtNGA{yc>|B@d;uIO-O8`l0KtZVq*3D!KLMy^ngf@hg<`{MZWGpG0 zQneqKSYC%iA|nP8pGII66#==U}3`G;ekn$!?@S`5h z;We6WevubmejZ~*rZ9;~9_uD0y^tE_ze{X84r^hs7a-@&sr{|k6? BoAUqw delta 2225 zcma)-Yiv|i5Xbl2-Fw?^+igps+rnaZ!*1!e&@C-ZBlJNj;3IWgDM4ADOYbFZX?M%H z3tECM;VrLF#-L)1HNj}(D`wTiC?U8VWaUQ2K^v0zW89A|7oSQkkC!~>zp}r z=FFLybMB3C@!lEX`LeLk?cg7kogRGLH|8l9Wn)XP?hp=BnC_t^!@*c^I1~%G4*JArjT2e2O406YLZ$Oz}i&5+?+ zMgfz0%Of1j(efsJm=#@_tK}71Y$1zLwl0EA7b9zojHWC*l{I91z_x6ehnXDUeg+5H z1Nl*4Bhbyr8c7-N8?tPj2Y&oyHPtVAShsl`%cK`+uEo1xmt&`7Jhgu~tMxWY>@DMr zTTOJ+Q$_E13+Ss#SGp8>6Xr&|FO`(`giB>dT9`m~WP}k7=SwdJ{lEaAR?a;;Dlt!D zA$F64z&6JM=5`is99kVl9jD*FPCv++-Sn>iQ<2EnfmKe!&k7l!OmMxSf{V~UL0|ri zs3;U#5@e6}EE)}kD%Pu-O_qz7WZiMwwq$A`nXqL5K4Q@3uNfKLIXP3$;r?IKAh**O zp#T^9mr#p-o@e*b@~V$H-Wyee&h%68@-%P=3tc@Oy}j}Yj8%*(4W}_2Wkkb8vlDy* za~|L%a0-~q>DUe}iLy<#BP11w+78FKThg`KCjBDM9io=nANUYsoohAPR#z%^(Ma7R zCgPoN&S;K3P~6cLCGb9nwlF3y&2#}oQl6zi#K-Aui>z?J$bJy6{R(Yu4$$SuQDJB9 zt8dVZUD)AS+T8G%F9)2{zYaUTbJcz0s{32k zz_J#=<06+caQPum_qaNYnxDgoa%Y`Lz5r(d)l6Fhg02-+xuZ-r#{Xq%7~TU zYVDU;lxl0$BhO*@JYzziy~9~dsq^V9DUa-KL34}#Dvw{H&CN%+kk^_|YUv9wRoyqA zrL4YZK;q%Ct-fT!R4o|Jn>;?|=Tbpkz6MKG!Pg;8pKnGq*vy}@=*Lx+`UDTIkaP7# z4(ihCotn5nf3&X2Ph+tk2vA2`P5LmzBfwGM7;v0%XMN^j>fWW1&tSECcJ^*xb9n}S zRQQ}x-{kF(=U8dG8UIyEJxxY?gZ?Hf-=fy`%OXKzofY)?%C1c7nij3^4fs*zQ<2>+ z-(8;1xrTlPQOw9EeZRIwf18ybP=4oeBf(O*fqc=B=%lsL#>x(apgMRJq!C8ejgO2e z2M$=0&P6v-ZkLa)M>kMIcYV4HR;ums*_8NPNgFr_oCokINZdy`4xqIpN-2>CiCAP1 zKrHG8-pXwmPMZ6NtTy=(>jeMVcnyDb3L$Q49^v}k?+{C_I~>R8=kCSs9HIT`0E)@m N)8_tdo*^R2+rRqk)0_YR diff --git a/tests/selfverification/__pycache__/test_self_verification.cpython-312-pytest-7.4.4.pyc b/tests/selfverification/__pycache__/test_self_verification.cpython-312-pytest-7.4.4.pyc index fee743c0a0ab273411dc5d95a745be441e0f53c4..f9e0cff4be238c5c0ec86fc087f802b378741586 100644 GIT binary patch delta 2242 zcmcIlTWl0n7@jjbyWMNsZM*H#3rs0(Gqh}XS+1&f2-udjDfPK-(ng4r9T8t@YD|sjspHACX^g5?+Q=j) zRWqrdQpeI6UCUh&4@#tp)t7y44?`}^x$n!qv5{`}splH$Vwb!vmHR-AOJ)XOR#;-U zyt~-4cU>;#J7*(N_HpG?9UZVl0|+4i#X&ct{1`yqHlE!`dsd_v-NrWin>^@`IuQcw z_i%gQ2@n-0|Uczb+`fOfD04!53sZHa4@K>f3Cw!pnZ>S`AMZs}8rY#i)z<0*cQ* zFHJcFVcMZNv@&+SrEkW0icH(!wogl0r{bD=ZTE(7I2@I!4qcqkwI2C?J3*2&#-yyu z!-#IQ zdOu3L5&97N5%wVL1u$_em?vJe3;yJrF>q3!&}lXah20~MS>zNw1a=tToCcT`es&5~ zEpP8x^oLIGotfQruKC>lB`JFS|NkvYQHtb9!M$>^A7xMOi>fb0;Ocx}XQLPNg|4jy zX~ACPDowE80<8|-Ixn_PDdi>a8orYE^p0nfs%gToqx4yH*T<~dPGIRfwO#gMQ1r2D zwU=bhQi&c!i{}71O(PLSq|c*jF!y@hP1|NZ&m*WPN5FaJ-39NkTTS``YE^`z012hM zFxzJKUPBWp$21@3X}aj&CY;81un{XcqNE|{0HzCo&$uvW7H-^W9|he2n`r!q4CF>b zs@PHF8k#?hYxk(;!bIYj$U<4c?%!EfRt!(OSd-jiH$XGU4$EgC_>%0BlwxCiu#~qC zr>SY>9j2Z#GFoX{n7?(s0}mUTWIJ1Hd|N=gmzNLo(s_ft^aR@QyeLYK>P_i@!+fI@ zG{XiRQ>_@^D<;zDe*Zv#Dt>D1v`>Qi2wT&3gAA}Gc~!2a{TWFa#ApweQ^>zMHr)CrNARtOab#iTICA4G>Uf43jPf7{x+AOYuYfuO z9H?i5u@MOHZRDodTkIY`^&S-^LFX|3Lp=YnDQ-WD0a;J%)hfO#MZQ_`Hq)X?JG&Zd zCB5v|Sk$o{UDUHk_uLHMjr^O&4}^WVf?uG#G^WzydC#~?)iK?o=_#Ebe-t-9#VtgU z$`qNvyG5}oiU|~s0!)Cn^saO3n4z5<)wk0(Ku6#_5klDdcw>c&h`$H`cMz6? z>_A*rmfeErJlk-(;W`O^MS^cOTy5L_HQ8}Xl*pz#HbLwq%P8KiVUzKG34{FwwLcE! delta 1568 zcmbVMO>7%Q6yDkO+Kyv8waH(TrdiXt>A1nM6YMlj(jOt3v{4d3EmUs7u{thI+Qi|l zL2{t{v{nz?(h&!Kq)3&JuzK_bByONy;D!*@A`bMzfeYnQ2`;=h>kwD87cBYPH*em& z_r0H)PpjXQ!{3EM0S$kv-5;((cq`n?0$an^hL|RN!Y|rH;4>rND|$q*=E?6Bp_-QO z6Jf-D(Xn-Rd}_~ac1Nf4nkFJO?T#yI`9TpyBTGDm7!#d{Pm3xpr6qW~Dc}pPiEN=%AG(U1z0aR|>_8l`<4o?DExOWu?3hXK*VkMf58+-^lm; zru)ZGQD>WzGLasXi;>`A9=K-B%qSKU+=h1CcO%8f(%ek~7UXtcyj`(VR*G1Bhu8~r zkj^;m$2Y14H@R_miPR@$U;hY}ZMJ{ZETH13e7paX!FiOpr>=447z^o)`$=;hSE)1< z8<~CgjU&VtUM2_;Pz{`b>m2j5;T6*63C<%d@~~SzODOZskm`f$d(SvZ0bVy zGFs!1=*g7B-m>YcTNak+i_{`3$cL%red^jRkWb2$H!sw`X$`;l4ygnGC$%&Hp0xuA z&F0_-ga4jRoA09Xyo`-K`0sR({o|&i-kc7#PbD9Yu9E*poBvB@zxe^GOSiJu(f5t) zef{`u$<+8gDZnDUPoW><^z+FH^9Js%%3mjMM%7i+)eUhBy8=8etGPHkCbx6r-WhVS zSKiCjy3~WDUVzi2q}K%s@{OsU6LdF#Mii*MK*aze4HN{H2`C8ATlJTJdaW$pyjnU6 mTexKSw?CFYObvDTnf_2ictG$+xAab1`k#B`()65%PX7ao$5CYf diff --git a/tests/selfverification/checks.py b/tests/selfverification/checks.py index 47d321e..2329882 100644 --- a/tests/selfverification/checks.py +++ b/tests/selfverification/checks.py @@ -94,6 +94,23 @@ def check_actor_isolation( return violations +def check_isolation_was_examined(pack: Mapping[str, Any]) -> list[str]: + """Every run must carry a verdict on actor isolation — F-0003, resolved. + + Before this existed, isolation was only observable in scenarios written to + expose it: a run in which every actor shared one memory store produced + evidence indistinguishable from a correct one. Actors now carry an automatic + private marker and the runner examines them on every scenario, so the absence + of this observation is itself a failure. + """ + for obs in _observations(pack): + if obs["kind"] != "actor_isolation": + continue + violations = obs["data"].get("violations") or [] + return [f"actor isolation violated: {v}" for v in violations] + return ["this run did not examine actor isolation at all"] + + # --- td://self/oracle-independence --------------------------------------- diff --git a/tests/selfverification/test_checks_can_fail.py b/tests/selfverification/test_checks_can_fail.py index c727c0d..b131778 100644 --- a/tests/selfverification/test_checks_can_fail.py +++ b/tests/selfverification/test_checks_can_fail.py @@ -30,6 +30,7 @@ from tests.selfverification.checks import ( check_actor_isolation, check_evidence_supports_every_verdict, check_intent_independence, + check_isolation_was_examined, check_no_actor_collected_judgment, check_runs_agree, check_verdicts_follow_from_judgment_evidence, @@ -186,3 +187,35 @@ def test_unrecorded_provenance_is_caught(): tampered = copy.deepcopy(pack) tampered["provenance_index"] = {} assert check_intent_independence(tampered) + + +# --- F-0003 resolution: isolation observed on every run ------------------- + + +def test_an_unexamined_run_is_caught(): + """A run that never looked at isolation must not read as isolated.""" + pack, _, _ = run_and_serialize() + tampered = copy.deepcopy(pack) + tampered["observations"] = [ + o for o in tampered["observations"] if o["kind"] != "actor_isolation" + ] + assert check_isolation_was_examined(tampered) + + +def test_a_leak_is_caught_without_the_test_planting_anything(): + """The regression F-0003 leaves behind. + + No secrets seeded by the harness, no scenario written to expose isolation. + An actor holding another's automatic marker is caught by the ordinary run. + """ + from testdriver import Oracle, Runner + from scenarios.alice_bob_carol import build + + world, driver, observer, asset, oracle = build() + world.cast["bob"].remember("overheard", world.cast["alice"].canary) + result = Runner(world, driver, observer, oracle).run(asset) + pack = json.loads(result.evidence.to_json()) + + violations = check_isolation_was_examined(pack) + assert violations + assert "holds the private marker of 'alice'" in violations[0] diff --git a/tests/selfverification/test_self_verification.py b/tests/selfverification/test_self_verification.py index 506eb79..3b06899 100644 --- a/tests/selfverification/test_self_verification.py +++ b/tests/selfverification/test_self_verification.py @@ -17,6 +17,7 @@ from tests.selfverification.checks import ( check_actor_isolation, check_evidence_supports_every_verdict, check_intent_independence, + check_isolation_was_examined, check_no_actor_collected_judgment, check_runs_agree, check_verdicts_follow_from_judgment_evidence, @@ -56,6 +57,14 @@ def test_actor_isolation(): assert check_actor_isolation(pack, SECRETS, memories) == [] +@pytest.mark.parametrize("mutations", [(), ("M15",), ("M01",)]) +def test_every_run_examines_isolation(mutations): + """F-0003 resolved: isolation is now a property of runs, not of scenarios + written to expose it. No canaries need be planted by the test.""" + pack, _, _ = run_and_serialize(*mutations) + assert check_isolation_was_examined(pack) == [] + + # --- td://self/oracle-independence --------------------------------------- diff --git a/tests/test_audit_core_e2_use_case.py b/tests/test_audit_core_e2_use_case.py new file mode 100644 index 0000000..7079f4c --- /dev/null +++ b/tests/test_audit_core_e2_use_case.py @@ -0,0 +1,136 @@ +"""The audit-core use case is durable intent, even before drivers can run it.""" + +from __future__ import annotations + +from copy import deepcopy + +from testdriver import Oracle, Provenance, Verdict +from usecases.audit_core_e2_tenant_boundary import ( + PHASE_CONTRACTS, + PRECEDENT_EVIDENCE_REF, + ROLE_CONTRACTS, + TEST_USE_CASE, +) + + +def passing_observations() -> dict[str, object]: + absent = { + "status": 404, + "schema": ("$", "$.error:str"), + "digest": "absent-surface", + "fixture_match_count": 0, + } + return { + "event_by_id": { + "owner": {"status": 200, "fixture_match_count": 2}, + "attacker": dict(absent), + "absent": dict(absent), + }, + "correlation_slice": { + "owner": {"status": 200, "fixture_match_count": 2}, + "attacker": {"status": 200, "fixture_match_count": 0}, + }, + "append_as_b": { + "attacker": {"status": 400}, + "state_after": dict(absent), + "absent": dict(absent), + }, + "run": { + "attempted_operations": 10, + "maximum_operations": 30, + "max_concurrency": 1, + "rate_per_minute": 10, + "target_revision_matches": True, + "attribution_complete": True, + }, + "cleanup": { + "completed_before_expiry": True, + "runner_absent": True, + "temporary_identities": [], + "kv_paths": [], + "projection_resources": [], + "mounted_secrets": [], + "target_ready": True, + "secret_values_observed": False, + }, + "report": { + "bound_to_projection_receipt": True, + "bound_to_cleanup_receipt": True, + "bounded_assurance_statement": True, + "delivered_to_risk_nexus": True, + }, + } + + +def judgments(observations): + oracle = Oracle() + assertions = (*TEST_USE_CASE.claims, *TEST_USE_CASE.invariants) + return { + assertion.id: oracle.judge( + assertion, + observations, + getattr(assertion, "after_step", None), + ) + for assertion in assertions + } + + +def test_precedent_calibration_satisfies_every_assertion(): + result = judgments(passing_observations()) + assert {judgment.verdict for judgment in result.values()} == {Verdict.PASS} + assert PRECEDENT_EVIDENCE_REF.endswith( + "AUDIT-WP-0008-T05-whitehat-e2-03-pass-2026-08-22.md" + ) + + +def test_cross_tenant_event_disclosure_fails_the_claim(): + observations = passing_observations() + observations["event_by_id"]["attacker"] = { + "status": 200, + "schema": ("$", "$.event_id:str"), + "digest": "tenant-b-event", + "fixture_match_count": 2, + } + result = judgments(observations) + assert result["c-event-id-tenant-scoped"].verdict is Verdict.FAIL + + +def test_missing_cleanup_evidence_is_inconclusive(): + observations = passing_observations() + del observations["cleanup"] + result = judgments(observations) + assert result["c-receipt-bound-cleanup"].verdict is Verdict.INCONCLUSIVE + assert result["i-no-secret-evidence"].verdict is Verdict.INCONCLUSIVE + + +def test_cleanup_residue_fails_closed(): + observations = deepcopy(passing_observations()) + observations["cleanup"]["temporary_identities"] = ["unexpected-residue"] + result = judgments(observations) + assert result["c-receipt-bound-cleanup"].verdict is Verdict.FAIL + + +def test_intent_has_independent_provenance_and_separate_roles(): + assert TEST_USE_CASE.provenance is Provenance.SPEC + assert all( + assertion.provenance is Provenance.SPEC + for assertion in (*TEST_USE_CASE.claims, *TEST_USE_CASE.invariants) + ) + roles = {role.id for role in ROLE_CONTRACTS} + assert { + "authorizer", + "target-owner", + "credential-custodian", + "security-coordinator", + "cluster-executor", + "tenant-a-attacker", + "tenant-b-control", + "independent-observer", + } == roles + + +def test_schedule_requires_cleanup_before_finalization(): + phases = {phase.id: phase for phase in PHASE_CONTRACTS} + assert phases["finalize-and-deliver"].requires == ("cleanup-custody",) + assert phases["cleanup-custody"].requires == ("delete-runner",) + assert phases["run-probes"].requires == ("ready-runner",) diff --git a/tests/test_classification.py b/tests/test_classification.py index 37d5d2f..ccf6c39 100644 --- a/tests/test_classification.py +++ b/tests/test_classification.py @@ -194,3 +194,98 @@ def test_safe_to_accept_is_a_closed_set(): assert SAFE_TO_ACCEPT == { Classification.UNCHANGED, Classification.MECHANICAL_ADAPTATION, } + + +# --- classifications that no lab mutation happens to produce --------------- +# +# Two outcomes were declared at T08 and exercised by nothing. Left that way they +# are decoration: code that has never run is code nobody has checked. Rather than +# delete meaningful outcomes or trust them untested, both are given a case. + + +def test_intent_change_is_detected_when_the_claim_set_moves(baseline): + """`INTENT_CHANGED` is a fact about the recorded use case, not an inference. + + It fires because a human edited what is being asserted — which is why it is + detectable at all, where `SEMANTIC_CHANGE` was not (F-0006). + """ + import copy + + altered = copy.deepcopy(baseline) + altered["provenance_index"]["c-newly-added-claim"] = "human" + outcome = classify(baseline, altered) + assert outcome.classification is Classification.INTENT_CHANGED + assert not outcome.safe_to_accept + + +def test_realization_failure_is_distinguishable_from_ambiguity(): + """`REALIZATION_FAILED` says "we could not act"; `AMBIGUOUS` says "we do not know". + + Every lab mutation that breaks realization also strands a claim, so the + catalogue only ever produces `AMBIGUOUS`. This builds the case the catalogue + cannot: a step that fails while every assertion in the run still holds and + none of them depended on it. + + Note that a run asserting *nothing at all* is `AMBIGUOUS`, not + `REALIZATION_FAILED` — a use case with no claims cannot conclude anything, + however well its steps ran. + """ + from testdriver import ( + Actor, Cast, Invariant, Oracle, Runner, Scenario, SemanticAction, + StateObserver, Step, UseCase, VerificationAsset, World, + ) + from testdriver.agentic import DiscoveryRuntime + from testdriver.browser import BrowserDriver + from testdriver.observers import Watch + from testdriver.provenance import Provenance + from lab.mutations import ObservationChannel + + use_case = UseCase( + "uc-audit-only", "Sharing leaves an ordered audit trail", + "Alice shares R with Bob; the audit trail stays ordered.", + Provenance.HUMAN, + invariants=(Invariant( + "i-audit-ordered", "The audit trail is append-only", Provenance.HUMAN, + lambda obs: [e["sequence"] for e in obs["audit:R"]] + == sorted(e["sequence"] for e in obs["audit:R"]), + ),), + ) + + def run(*mutations): + with journey_lab_server(*mutations) as (app, tokens, base_url): + app.request(tokens["alice"], "create_resource", + resource_id="R", content="x") + cast = Cast() + cast.add(Actor("alice", "Alice", credentials={"token": tokens["alice"]})) + scenario = Scenario( + "sc-audit-only", use_case, + watches=(Watch("bob", "R"),), + steps=(Step("s1", "alice", SemanticAction( + "grant_access", {"subject_id": "bob", "permission": "READ"}, + permitted_surfaces=frozenset({"browser"}), + )),), + ) + driver = BrowserDriver(base_url, tokens, DiscoveryRuntime(), "R") + observer = StateObserver(ObservationChannel(app), scenario.watches) + world = World("w-audit", app, app.version, cast=cast) + return json.loads( + Runner(world, driver, observer, Oracle()) + .run(VerificationAsset("va-audit-only", scenario)) + .evidence.to_json() + ) + + outcome = classify(run(), run("M23")) # the control is gone from the UI + assert outcome.classification is Classification.REALIZATION_FAILED + assert not outcome.safe_to_accept + + +def test_no_classification_is_unreachable(): + """Every declared outcome must be produced somewhere in this suite. + + An outcome nothing can emit is the same kind of dead promise `SUSPICIOUS` + was before T10 removed it. + """ + exercised = set(EXPECTED.values()) | { + Classification.INTENT_CHANGED, Classification.REALIZATION_FAILED, + } + assert exercised == set(Classification) diff --git a/tests/test_reference_scenario.py b/tests/test_reference_scenario.py index 5739969..70554d5 100644 --- a/tests/test_reference_scenario.py +++ b/tests/test_reference_scenario.py @@ -67,4 +67,18 @@ def test_actors_hold_isolated_credentials_and_memory(): assert alice.credentials["token"] != bob.credentials["token"] alice.remember("secret", "only alice knows this") assert bob.recall("secret") is None - assert bob.known_keys() == () + # Every actor carries its own automatic private marker (F-0003) and nothing + # else it was not given. + assert bob.known_keys() == ("__canary__",) + assert alice.canary != bob.canary + + +def test_every_run_records_a_verdict_on_isolation(): + """F-0003: isolation is examined on every scenario, not only on ones + written to expose it.""" + result, _ = run_once() + examined = [ + obs for obs in result.evidence.observations if obs.kind == "actor_isolation" + ] + assert len(examined) == 1 + assert examined[0].data["violations"] == [] diff --git a/usecases/__init__.py b/usecases/__init__.py new file mode 100644 index 0000000..1e646be --- /dev/null +++ b/usecases/__init__.py @@ -0,0 +1,5 @@ +"""Durable test intent, kept separate from concrete scenario realizations.""" + +from .audit_core_e2_tenant_boundary import TEST_USE_CASE + +__all__ = ["TEST_USE_CASE"] diff --git a/usecases/__pycache__/__init__.cpython-312.pyc b/usecases/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df4655cd3be8d46e5217330b4d3752e17aade148 GIT binary patch literal 329 zcmXv~u}T9$5Z%3tBt%l#MT9ME0wxDm79xlSD{T^+G{a_hG^=;JVRlbRI@|n!Utr<4 z*w~s%5DPmYT`KoPr?@W?b9G0k<7^CB4~ zoaywMkJ4GKvoSwAElG}Z6ajq@#s;)uPu$`(2#-@qGN8C3R|w^-B8h{$L1~gFc)b5BikG?nS4ztOIDL0G2zl)Fyy(gn;`H<)jTTcBR#l zX20{*u*`FSXSS;DSa-9DD=@ov(CLT@@-Hx3J@%N&oW edQj!dZ^iVTa?an_`6oMg-)z4&w;$@%i2Wa$a$qe0 literal 0 HcmV?d00001 diff --git a/usecases/__pycache__/audit_core_e2_tenant_boundary.cpython-312.pyc b/usecases/__pycache__/audit_core_e2_tenant_boundary.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c790cb41edff0aefd19b70b65b5d19387db472c GIT binary patch literal 10754 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 bool: + """Compare only the sanitized non-disclosure surface.""" + + return ( + left["status"] == right["status"] + and left["schema"] == right["schema"] + and left["digest"] == right["digest"] + and left["fixture_match_count"] == 0 + and right["fixture_match_count"] == 0 + ) + + +def _event_id_is_tenant_scoped(obs: Mapping[str, object]) -> bool: + probe = obs["event_by_id"] + owner = probe["owner"] + attacker = probe["attacker"] + absent = probe["absent"] + return ( + owner["status"] == 200 + and owner["fixture_match_count"] > 0 + and _same_absence_surface(attacker, absent) + ) + + +def _correlation_slice_is_tenant_scoped(obs: Mapping[str, object]) -> bool: + probe = obs["correlation_slice"] + return ( + probe["owner"]["status"] == 200 + and probe["owner"]["fixture_match_count"] > 0 + and probe["attacker"]["status"] == 200 + and probe["attacker"]["fixture_match_count"] == 0 + ) + + +def _cross_tenant_append_is_refused(obs: Mapping[str, object]) -> bool: + probe = obs["append_as_b"] + return ( + probe["attacker"]["status"] in {400, 403, 404} + and _same_absence_surface(probe["state_after"], probe["absent"]) + ) + + +def _cleanup_is_complete(obs: Mapping[str, object]) -> bool: + cleanup = obs["cleanup"] + return ( + cleanup["completed_before_expiry"] is True + and cleanup["runner_absent"] is True + and cleanup["temporary_identities"] == [] + and cleanup["kv_paths"] == [] + and cleanup["projection_resources"] == [] + and cleanup["mounted_secrets"] == [] + and cleanup["target_ready"] is True + ) + + +def _execution_remains_bounded(obs: Mapping[str, object]) -> bool: + run = obs["run"] + return ( + run["attempted_operations"] <= run["maximum_operations"] + and run["max_concurrency"] == 1 + and run["rate_per_minute"] <= 10 + and run["target_revision_matches"] is True + and run["attribution_complete"] is True + ) + + +def _secret_values_do_not_enter_evidence(obs: Mapping[str, object]) -> bool: + return obs["cleanup"]["secret_values_observed"] is False + + +def _report_preserves_assurance_limit(obs: Mapping[str, object]) -> bool: + report = obs["report"] + return ( + report["bound_to_projection_receipt"] is True + and report["bound_to_cleanup_receipt"] is True + and report["bounded_assurance_statement"] is True + and report["delivered_to_risk_nexus"] is True + ) + + +TEST_USE_CASE = UseCase( + id="uc-audit-core-e2-tenant-boundary", + title="Demonstrate audit-core's E2 tenant boundary with separate drivers", + narrative=( + "Within one explicitly authorized production window, independent target, " + "custody, security, cluster, attacker, control and observer roles establish " + "that an ordinary tenant-A identity cannot read or create tenant-B audit " + "fixtures. The run must remain bounded, preserve non-disclosure semantics, " + "clean every temporary resource before expiry, and deliver a cleanup-bound " + "sanitized report without retaining credential values." + ), + provenance=Provenance.SPEC, + source_ref=SPEC_REF, + claims=( + Claim( + "c-event-id-tenant-scoped", + "Tenant A cannot distinguish tenant B's event id from an absent event", + Provenance.SPEC, + _event_id_is_tenant_scoped, + after_step="run-probes", + source_ref=ENGAGEMENT_REF, + ), + Claim( + "c-correlation-slice-tenant-scoped", + "Tenant A's correlation slice contains no tenant-B fixture", + Provenance.SPEC, + _correlation_slice_is_tenant_scoped, + after_step="run-probes", + source_ref=ENGAGEMENT_REF, + ), + Claim( + "c-cross-tenant-append-refused", + "Tenant A cannot append an audit event attributed to tenant B", + Provenance.SPEC, + _cross_tenant_append_is_refused, + after_step="run-probes", + source_ref=ENGAGEMENT_REF, + ), + Claim( + "c-receipt-bound-cleanup", + "Every engagement-specific runtime and custody resource is absent " + "before expiry while the target remains ready", + Provenance.SPEC, + _cleanup_is_complete, + after_step="cleanup-custody", + source_ref=SPEC_REF, + ), + ), + invariants=( + Invariant( + "i-bounded-execution", + "The run stays within its operation, rate, concurrency, revision and " + "attribution boundaries", + Provenance.SPEC, + _execution_remains_bounded, + source_ref=ENGAGEMENT_REF, + ), + Invariant( + "i-no-secret-evidence", + "Credential values never enter retained observations or reports", + Provenance.SPEC, + _secret_values_do_not_enter_evidence, + source_ref=SPEC_REF, + ), + Invariant( + "i-bounded-assurance-report", + "Delivery is receipt-bound and says only that attempted attacks failed", + Provenance.SPEC, + _report_preserves_assurance_limit, + source_ref=SPEC_REF, + ), + ), +) + +# Alias retained for the existing scenario-module convention. +USE_CASE = TEST_USE_CASE + diff --git a/workplans/TD-WP-0002-vertical-spike-crystallization.md b/workplans/TD-WP-0002-vertical-spike-crystallization.md index dece354..36317cd 100644 --- a/workplans/TD-WP-0002-vertical-spike-crystallization.md +++ b/workplans/TD-WP-0002-vertical-spike-crystallization.md @@ -4,11 +4,11 @@ type: workplan title: "Vertical spike: falsify the crystallization thesis" domain: infotech repo: test-driver -status: active +status: finished owner: codex topic_slug: custodian created: "2026-08-22" -updated: "2026-08-22" +updated: "2026-08-23" state_hub_workstream_id: "68b252b8-03e7-55c7-8dec-ac13f6ca0aa1" --- @@ -461,7 +461,7 @@ to execute than the agentic ancestor. ```task id: TD-WP-0002-T10 -status: todo +status: done priority: medium state_hub_task_id: "884c2e91-b56d-5b5e-a2d3-52d2a2768cae" ``` @@ -478,3 +478,42 @@ retaining them, and update the Concept ↔ Implementation Fitness Map. Convert at least one framework finding discovered during T04–T09 into a permanent self-verification or deterministic regression — that closes the first genuine Concept–Implementation Fitness Loop. + +**Done 2026-08-23.** Full write-up: +`history/2026-08-23-td-wp-0002-gate-review.md`. 178 tests pass. + +**All four gate criteria met.** M01/M02 absorbed with the claim set unchanged; +the authorization defects escalated with regressions named; one asset +crystallized and running with no model; **False Adaptation Rate 0/7**, with 12 of +13 mechanical mutations absorbed so the safety result is not bought by escalating +everything. + +**Fitness loop closed via F-0003.** Actor isolation left no trace in ordinary +evidence — it was a property of scenarios written to expose it. Every actor is +now seeded with an automatic private marker and the runner examines all actors on +every scenario, with two permanent regressions behind it, one of which catches a +leak with the harness planting nothing. + +**Compression — six abstractions removed**, each declared and never used: +`Verdict.SUSPICIOUS` (a verdict no oracle could emit), `Step.expect_refusal`, +`ActorIsolationError`, `World.seed`, `EvidencePack.latest()`, +`Trajectory.method`. + +**F-0008 — Temperature may be redundant.** Crystallization was built end to end +without it ever being consulted; what triggered freezing was *measured stability +of realization*, which is observed rather than declared. A declared temperature +is a claim nobody verifies. Not deleted — two unevidenced cases for keeping it +are recorded — but gated, along with `energy.py`: if the next workplan closes +without a decision consulting either, they go. + +**Two classifications had never run.** `INTENT_CHANGED` and `REALIZATION_FAILED` +were declared at T08 and produced by no test. Both now have purpose-built cases, +and `test_no_classification_is_unreachable` fails if a seventh is added without +one. + +**What this leaves.** The thesis survived contact with its own evidence in +narrowed form, and the demonstration is architectural rather than statistical. +The highest-value next step is a **bounded live-model experiment** — F-0005 and +F-0007 converge on it independently, and one experiment settles both whether a +model adds capability and whether crystallization has a product rationale. That +should come before any further framework feature. From e254fd2000f378fbe24c256cda0c78022fa6d39e Mon Sep 17 00:00:00 2001 From: tegwick Date: Sun, 23 Aug 2026 00:42:09 +0200 Subject: [PATCH 2/3] refine audit-core multidriver use case roles Assistant: codex Assistant-Model: gpt-5.6-sol Assistant-Session: 01a02991-be07-7bb3-8b6d-e9701b5621de --- tests/test_audit_core_e2_use_case.py | 13 ++++++- usecases/audit_core_e2_tenant_boundary.py | 41 ++++++++++++++--------- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/tests/test_audit_core_e2_use_case.py b/tests/test_audit_core_e2_use_case.py index 7079f4c..95bc33e 100644 --- a/tests/test_audit_core_e2_use_case.py +++ b/tests/test_audit_core_e2_use_case.py @@ -131,6 +131,17 @@ def test_intent_has_independent_provenance_and_separate_roles(): def test_schedule_requires_cleanup_before_finalization(): phases = {phase.id: phase for phase in PHASE_CONTRACTS} - assert phases["finalize-and-deliver"].requires == ("cleanup-custody",) + assert phases["finalize-and-deliver"].requires == ("verify-cleanup",) + assert phases["verify-cleanup"].requires == ("cleanup-custody",) assert phases["cleanup-custody"].requires == ("delete-runner",) assert phases["run-probes"].requires == ("ready-runner",) + + +def test_every_role_participates_in_a_phase(): + declared = {role.id for role in ROLE_CONTRACTS} + scheduled = { + role + for phase in PHASE_CONTRACTS + for role in phase.driver_roles + } + assert scheduled == declared diff --git a/usecases/audit_core_e2_tenant_boundary.py b/usecases/audit_core_e2_tenant_boundary.py index 6cae13d..d588367 100644 --- a/usecases/audit_core_e2_tenant_boundary.py +++ b/usecases/audit_core_e2_tenant_boundary.py @@ -46,7 +46,7 @@ class PhaseContract: """Causal intent for the future orchestrator; never a shell transcript.""" id: str - driver_role: str + driver_roles: tuple[str, ...] requires: tuple[str, ...] completion: str timing: str @@ -101,71 +101,83 @@ ROLE_CONTRACTS = ( PHASE_CONTRACTS = ( PhaseContract( "authorize", - "authorizer", + ("authorizer",), (), "Exact engagement and custody contracts are approved.", "Before projection and before the engagement window opens.", ), PhaseContract( "acknowledge-target", - "target-owner", + ("target-owner",), ("authorize",), "Target owner accepts the exact revision, routes and bounded fixtures.", "Before any temporary credential exists.", ), PhaseContract( "preflight", - "credential-custodian", + ("credential-custodian",), ("acknowledge-target",), "Target is ready and all engagement-specific resources are absent.", "Immediately before the projection cutoff.", ), PhaseContract( "project-custody", - "credential-custodian", + ("credential-custodian",), ("preflight",), "Exactly two scoped handles exist and a value-safe receipt is emitted.", "Inside the narrow projection window; expiry equals engagement end.", ), PhaseContract( "admit-plane", - "security-coordinator", + ("security-coordinator",), ("project-custody",), "Receipt, broker contract, target revision and cleanup authority agree.", "After projection and before any target packet.", ), PhaseContract( "ready-runner", - "cluster-executor", + ("cluster-executor",), ("admit-plane",), "The exact attributed runner is Ready with its Secret mounted.", "Inside the authorized engagement window.", ), PhaseContract( "run-probes", - "security-coordinator", + ( + "security-coordinator", + "tenant-a-attacker", + "tenant-b-control", + ), ("ready-runner",), "Calibrated owner, attacker and absent controls produce a sanitized report.", "Before credential and engagement expiry.", ), PhaseContract( "delete-runner", - "cluster-executor", + ("cluster-executor",), ("run-probes",), "The exact runner pod is absent.", "Immediately after evidence collection.", ), PhaseContract( "cleanup-custody", - "credential-custodian", + ("credential-custodian",), ("delete-runner",), - "Both identities, exact KV paths, projection resources and Secret are absent.", + "Receipt-bound cleanup revokes both identities and removes exact resources.", "Before credential and engagement expiry.", ), PhaseContract( - "finalize-and-deliver", - "security-coordinator", + "verify-cleanup", + ("independent-observer",), ("cleanup-custody",), + "Both identities, exact KV paths, projection resources, Secret and runner " + "are independently absent while the target remains Ready.", + "After cleanup and before credential and engagement expiry.", + ), + PhaseContract( + "finalize-and-deliver", + ("security-coordinator",), + ("verify-cleanup",), "The report is bound to projection and cleanup receipts and reaches risk-nexus.", "Only after cleanup is independently observable.", ), @@ -296,7 +308,7 @@ TEST_USE_CASE = UseCase( "before expiry while the target remains ready", Provenance.SPEC, _cleanup_is_complete, - after_step="cleanup-custody", + after_step="verify-cleanup", source_ref=SPEC_REF, ), ), @@ -328,4 +340,3 @@ TEST_USE_CASE = UseCase( # Alias retained for the existing scenario-module convention. USE_CASE = TEST_USE_CASE - From 28804f95c93d960592bee5f8e505c4940990d0a0 Mon Sep 17 00:00:00 2001 From: tegwick Date: Sun, 23 Aug 2026 00:44:35 +0200 Subject: [PATCH 3/3] Untrack __pycache__ and ignore Python build artifacts Compiled artifacts were swept into the T10 commit by a broad 'git add -A'. Removed from tracking; .gitignore now covers them. Co-Authored-By: Claude Opus 5 Assistant: claude-code Assistant-Model: opus Assistant-Process: 1629012@bnt-lap001 Assistant-Session: 78d4fb13-8a1e-474b-87a3-9b9261c49a39 --- .gitignore | 5 +++++ .../__pycache__/__init__.cpython-312.pyc | Bin 424 -> 0 bytes .../conftest.cpython-312-pytest-7.4.4.pyc | Bin 2199 -> 0 bytes ...st_grant_access.cpython-312-pytest-7.4.4.pyc | Bin 6555 -> 0 bytes lab/__pycache__/__init__.cpython-312.pyc | Bin 201 -> 0 bytes lab/__pycache__/app.cpython-312.pyc | Bin 16687 -> 0 bytes lab/__pycache__/http_api.cpython-312.pyc | Bin 12015 -> 0 bytes lab/__pycache__/minimal.cpython-312.pyc | Bin 10313 -> 0 bytes lab/__pycache__/mutations.cpython-312.pyc | Bin 14743 -> 0 bytes .../__pycache__/alice_bob_carol.cpython-312.pyc | Bin 7782 -> 0 bytes .../__pycache__/browser_grant.cpython-312.pyc | Bin 6130 -> 0 bytes .../__pycache__/full_journey.cpython-312.pyc | Bin 5134 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1323 -> 0 bytes .../__pycache__/actions.cpython-312.pyc | Bin 3602 -> 0 bytes .../__pycache__/agentic.cpython-312.pyc | Bin 11662 -> 0 bytes .../__pycache__/browser.cpython-312.pyc | Bin 10497 -> 0 bytes .../__pycache__/classification.cpython-312.pyc | Bin 11620 -> 0 bytes .../__pycache__/crystallization.cpython-312.pyc | Bin 12833 -> 0 bytes .../__pycache__/drivers.cpython-312.pyc | Bin 5762 -> 0 bytes .../__pycache__/energy.cpython-312.pyc | Bin 2372 -> 0 bytes .../__pycache__/evidence.cpython-312.pyc | Bin 4214 -> 0 bytes src/testdriver/__pycache__/html.cpython-312.pyc | Bin 7178 -> 0 bytes .../__pycache__/intent.cpython-312.pyc | Bin 3078 -> 0 bytes .../__pycache__/observers.cpython-312.pyc | Bin 2910 -> 0 bytes .../__pycache__/oracles.cpython-312.pyc | Bin 4622 -> 0 bytes .../__pycache__/provenance.cpython-312.pyc | Bin 2366 -> 0 bytes .../__pycache__/runner.cpython-312.pyc | Bin 11363 -> 0 bytes .../__pycache__/scenario.cpython-312.pyc | Bin 2217 -> 0 bytes .../__pycache__/world.cpython-312.pyc | Bin 5077 -> 0 bytes ...tic_realization.cpython-312-pytest-7.4.4.pyc | Bin 21982 -> 0 bytes ...ore_e2_use_case.cpython-312-pytest-7.4.4.pyc | Bin 12422 -> 0 bytes ..._classification.cpython-312-pytest-7.4.4.pyc | Bin 30781 -> 0 bytes ...crystallization.cpython-312-pytest-7.4.4.pyc | Bin 28230 -> 0 bytes ...rnel_guarantees.cpython-312-pytest-7.4.4.pyc | Bin 16114 -> 0 bytes .../test_kernel_guarantees.cpython-312.pyc | Bin 9051 -> 0 bytes ...ab_ground_truth.cpython-312-pytest-7.4.4.pyc | Bin 25643 -> 0 bytes ...erence_scenario.cpython-312-pytest-7.4.4.pyc | Bin 15885 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 156 -> 0 bytes .../__pycache__/checks.cpython-312.pyc | Bin 10530 -> 0 bytes ...checks_can_fail.cpython-312-pytest-7.4.4.pyc | Bin 20586 -> 0 bytes ...lf_verification.cpython-312-pytest-7.4.4.pyc | Bin 15515 -> 0 bytes usecases/__pycache__/__init__.cpython-312.pyc | Bin 329 -> 0 bytes ...udit_core_e2_tenant_boundary.cpython-312.pyc | Bin 10754 -> 0 bytes 43 files changed, 5 insertions(+) delete mode 100644 crystallized/__pycache__/__init__.cpython-312.pyc delete mode 100644 crystallized/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc delete mode 100644 crystallized/__pycache__/test_grant_access.cpython-312-pytest-7.4.4.pyc delete mode 100644 lab/__pycache__/__init__.cpython-312.pyc delete mode 100644 lab/__pycache__/app.cpython-312.pyc delete mode 100644 lab/__pycache__/http_api.cpython-312.pyc delete mode 100644 lab/__pycache__/minimal.cpython-312.pyc delete mode 100644 lab/__pycache__/mutations.cpython-312.pyc delete mode 100644 scenarios/__pycache__/alice_bob_carol.cpython-312.pyc delete mode 100644 scenarios/__pycache__/browser_grant.cpython-312.pyc delete mode 100644 scenarios/__pycache__/full_journey.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/__init__.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/actions.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/agentic.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/browser.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/classification.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/crystallization.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/drivers.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/energy.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/evidence.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/html.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/intent.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/observers.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/oracles.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/provenance.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/runner.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/scenario.cpython-312.pyc delete mode 100644 src/testdriver/__pycache__/world.cpython-312.pyc delete mode 100644 tests/__pycache__/test_agentic_realization.cpython-312-pytest-7.4.4.pyc delete mode 100644 tests/__pycache__/test_audit_core_e2_use_case.cpython-312-pytest-7.4.4.pyc delete mode 100644 tests/__pycache__/test_classification.cpython-312-pytest-7.4.4.pyc delete mode 100644 tests/__pycache__/test_crystallization.cpython-312-pytest-7.4.4.pyc delete mode 100644 tests/__pycache__/test_kernel_guarantees.cpython-312-pytest-7.4.4.pyc delete mode 100644 tests/__pycache__/test_kernel_guarantees.cpython-312.pyc delete mode 100644 tests/__pycache__/test_lab_ground_truth.cpython-312-pytest-7.4.4.pyc delete mode 100644 tests/__pycache__/test_reference_scenario.cpython-312-pytest-7.4.4.pyc delete mode 100644 tests/selfverification/__pycache__/__init__.cpython-312.pyc delete mode 100644 tests/selfverification/__pycache__/checks.cpython-312.pyc delete mode 100644 tests/selfverification/__pycache__/test_checks_can_fail.cpython-312-pytest-7.4.4.pyc delete mode 100644 tests/selfverification/__pycache__/test_self_verification.cpython-312-pytest-7.4.4.pyc delete mode 100644 usecases/__pycache__/__init__.cpython-312.pyc delete mode 100644 usecases/__pycache__/audit_core_e2_tenant_boundary.cpython-312.pyc diff --git a/.gitignore b/.gitignore index e4e0199..144879c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,8 @@ .claude/* !.claude/rules/ !.claude/rules/*.md + +# Python +__pycache__/ +*.py[cod] +.pytest_cache/ diff --git a/crystallized/__pycache__/__init__.cpython-312.pyc b/crystallized/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index d98adb615c0cfda49372236a6128d573d46f696b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 424 zcmXw$K~BRk5Ji(xphW5!m~ACU#2&E%AvPRt#3-?=8Mjq>1TMe{Sa23@z?KUj zy6cK@q|V0v_UO&`_t$)0WKtiOZ?6}5mi;7gEYV}_XR^F!Hham2d@<1zxp+j6q$66e z7?FDC9Y<$?upwl2!9zrjT*7?-A0nW25takA+S{@y9<*tpb{#^Cgy0xri%?V8p%)|@ z^j7-_p$6?iH|P_6gXC&wbWD8BjIo5L$i<4n2EFzMucY0`;6SpmBh;_^B~l_eJ7RPv zHg)HABZonZZ8aZM$@!)%o)`J|xl(eX)MvI&NgZyg zHuP9+1F>nV6u`A5C$1|)14rG-P_&g&5?55JTn&fWZ6EBq!#g??LW-QzkNlqGdHy#! J&8IXK`43<(h5-No diff --git a/crystallized/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc b/crystallized/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc deleted file mode 100644 index f8c9bb18f0b8c5540dd80f7952a25aade8be5e25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2199 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 F_&4Z$zn%a9 diff --git a/lab/__pycache__/__init__.cpython-312.pyc b/lab/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 930c9db458ae53ec4340c4dcc5f6eb3424634df4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmX@j%ge<81V;qBvP^;WV-N=h7@>^M96-i&h7^VPO4oI8&D(2RmC6|ePCu} NWW2>-Qp5t}007aaHcbEk diff --git a/lab/__pycache__/app.cpython-312.pyc b/lab/__pycache__/app.cpython-312.pyc deleted file mode 100644 index 93802fc9fcf89dc819291d4a22fbef3043787be9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16687 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 Nes<9+SXvk&{U1vOGeiIY diff --git a/lab/__pycache__/http_api.cpython-312.pyc b/lab/__pycache__/http_api.cpython-312.pyc deleted file mode 100644 index c0e05511874331b6e61532e5fe11c6a4c46f35bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12015 zcmcIKTX0*)b@zq$n=ermAD19S5t2xX67>dQ)1n@>Y}yv-N~Yw%Anv6I8ZX~_DT*){ z(}~l788;+TCxYXurYD(NuG|Sb$xJzIr&a17&GZKl=@PneCdy-`^&exZQ%CvfIeP&R zq9IRaI$aJId(ZBk-93BuymtTHW;0Wen)vUGf4`Zcev2Q4q}K}c#t&$Ux<(1qFeT6e z6Q(1~FhgUR4YR{6`Q?T=_~pX7h<;cfF$^0>y)JBwn1)THtPh(bmSIc8I&6h+gJ2BX zBKBc>#4+rE@9l!=O>WpJ)Cp$zbupC4jkgviviU1mZo*tJ4Oc>2E3~a*sMC~Sdy^9E zqW&hEudNn#2=#*FP2F&fxJ_`r(oRv*7@2A9a4n4P3U80p4cE~Wj8rGqjvvzcmFCcj zt)sq6U1DIg`r!t#e!RD|UMq_YLdA9{3Y9{YQ2kNOO-_Ro%r#=Yuuh0tG$l5TpDb;om2c)jG&RLev7UwrE1*9!H1r%VPe`MIpvaHL zBwiU4`EX$57$4xD8hmzu?|be^J`fe)GZKo1B7rbJBE=?UQQ}{CveRrHRD^J7gpWnT zQ=R+}^o_?tQH76<0-}%%n5Lj56qFc$IdnxN=mVFLVEMFUqtmjjBpm&~ISQA7-m1)`xKw2MqA0VNcR$~+>N91|rND`p-EDI))y znYVHJ`4%vRfWk*&S40`0!B|w0Vqu(OC@M+{KLJyNVF>~NZnl7du@kHrmnp;|flw5? zMPmv~H57@5#R#lR6nO00$)AKZO+n486QZo}qZ84n7{)g2JQq$JobsViaWl0-Q+ z0aTN_V0QLEJmg2x`DJA)EW&KqKs>Hm3XS|BLB=`o{DbzcG2o@H$(SSu$GQ~Q#tx0H zU2s6U#uO#)2V|Y`Db?;Tc1P4w1t8c4|8fUpGt|8%_gYhTwyAsR{GBFmswMSG>ZOcv z$2!aE^!FTf>Er2+jIDiL2cH|zfeHcvib)40LJ%axHA=}#F$zeNq?1fRZcVd5s!~Gc z5#&i#qvWLvMU5MZxQhiKBwLU+fQcQXJZ$1|Wc0#m&&!AcUzZ#`VA|r@0=iGi{6t(k z1FAugV(~caH09w`0}v@H0N+?9LVlzsl3KO-hfWR-`Je3f_YDo5Q(1Xp#KTDrn3-yr z0Ir2bk`uqUF(nd~aTPoy$%U{g4PzUWlk`2%Ug;*J$d$4r0D zVE*>&Z@ixN+%dG=H&V`qH3y${@QW3TLo1HmDK2Mm%$$`fp=YAvlDu08D1i<|=yhNG zn){{Q?uT{;CrNf@FXZ25zM5H)suCkGQP6$U94T{9)=ldkv2S|9;*4N`R>o<4QZE?t z5EDSm(}og=g+PpeskqB9w|o+;`F=KNWuG<)j-&~+hVwc*Z5CY97U-4N*M%PVD^zGl zENMxa6Yw47lIElZOVd`NQZZp0Oi5~%DR2&8tpaSsF3@TVIn-1qt&rCw_3u(iBm5iS zYg>|oycS`?_Un#m8}zmo`fUCRb!0BAuw&X5bw8p_J!w<9WrPMYLL(WWDQSao`0Exj zj(rn_Y1!DYNq-%xy{CX78jO%Db-HrX7NL z99eHmN-?9f(Eg@TsV-Ci4QdMI&EIh}C$^-*TnpAgKeZJy?G!w-49sA6(h2z>~(9OZVBmSC>{bGt(rl~jEg~(K#5*2NORDK zpjdm|dAQs6oG8h$s23%@81{KX(fEYIhd>S#T7X#+fl(7xZoViZ3U$83^-`p9RLrsr z)(OFzFBfskVi=}Eke9T~<1d92$0-5&yse zQ4)dtvM40HURZZTTN#qRbT#`O4-u7uI&?LyQ(+#j^7gv2p#d~25pu>Ard*n_a>_91JaT?jT; z3B1$W75AySNK6QX6K!M`vA7uRAY+!yp#e;#KF>OgE=`Gk|G^oy1|Tx&;-sKaw8(lT8KqOGGT9`X>+Zx8Nk~e z`Mz%7i=w=je?a>ZzRk_i+LTNx-|4HiC*cLt2T{8V46N~No=t)Izl^WQ!rsL8FU_#H zgNFR(1&hWA5Y!0&2hehR8VcX1&r&q8-(K255l0A}p=o-W0Yym9azudG1uBVx2h14A z!32Svy>9pceT}B6w;DKViu*fulJ@8lZf`iWIi1T=AX?zB{Dgbm(ry?w!5rfgIyhP( z-@u2IN2fBK`&3p631C=2#^K2!=7fwafQG~ju_PXtyx^3GSL2c|QJ1$xbDHl6CHzjD^)?H!pfVK~c{Is<-h2+OfX_>2?t3~g;_cFkFmX~b z5(8f&FA+LW_z($_a28px1Fby}sCI7`wuR9MUXMdHfxSrNu&lbEs0n&MNKN#&R6Br1 zLtt{Ay`0DfoBkI*uDQr;Bt4b2x6hou+p>G1W63ac_HKJu zwz75U!pzh6TvcnXwydk|M*AJt{@Ipg3w9 z>A&aRx#sT4x_g#Qciepo$8RNPo?ho@)6U$^?!|%3{!{BLZ8}4*vy`r4-OQLC!&3FS zow7RCEDc#p!(!bX%N_ulwx@gV7~AjJ>M{)-SzE`tfznyl?X;!x)5_+>mc`drDi35T zdY1Z@f@_D)WDlLm9DMS2Mb6?%wdc&1)QQx=`Ko#SyfQzUsXvvo)TBD*rF2WWIz6^- z;!N#0tOJHMTGk9ZvW6Y$sXK=Dbv;#cj-EB=Ox871L)O%=xb2Rq{hr-1&!#5khvrYE zd(v$g{?x74ZbjB9dWd%ATvhWrDAt^yb0?m;wfA;tUB}p7#Pyjf*DJ`X_&XMUT}PX& zIjf^|R>zm0Uh@uQy#p)W=Q78i&pbbv89JXCypXx@;_rb-7wLO#?YL^|x^?TS*D2

t>CQ}Za3#F6)DgBVO(lGF4ej2r0mYQ^RwqSP{RF=Z(Ec+s61qbvNe`#PwBYP){s6i~*}y|iP=25a-R=2~|z9=UOFscy--d~x|1+`_YD z3r*`rLcwiW!?yGh@W1X^pU*ieQ=^%x-O$Rm7wKSw`J3E1_s$RYyuW9$A=Bwwo?H&y zl5V%&uDShnMCJ!%;3*RyEeOn6OyGrKqBqV#evJ~TVHzTj%nP7kL{?zD02M3(3z0ug zunHXf>I9o$7jzKo(+dtk4-kXk6b$fd6kLK4eogR;@kR5L*;ApKL9pecACd*okyHMV z5(FRx{x!XUj@UJ73gRgP(mp6dpn(JPYgFX|(q%axV$i%;3z#2%5M43^#u7D~Lv)tF zrvU}gS#SuAR&DL2$`^+tzUWmlF4*GmyETpHDO3uF$Y#-ho2HZWI4Z_1Nhrn^%f$`~ z{sh?d5PGroO@OH=g%Tuwq*>#JCqxiR5|2Ru)CM5^Rra!|pbSLYFAf4PbQPjDiWG`_ z80iHVU)ASZVoamp@9X^v$gya`RYD{U^bKew?}rTND~^L1<3Wv>NWeluONJ2h0+1NodI(e#d!=PF_);#^ z0>PO4mXsr6flN_HlKHB72o97D(In{tb{eB%MF+evX<+V>AkHJ(unICRNs6sdN^%9< z#a|>lB!UM69a~aiHKZQnGh0$QH+FLr2tgyWJa9tjEe!Env`f0i!Qo0+Pe4Ex)OyDd z*cT7%g|DZ@=w)ThV+LgmtyG;b5sAyHUW^7~0%}JHEMX8R4gp{h)GU5#>;rb6BB^Xx zjH;GRD5&qr(Gcib-J}G1+@s60oD4za30XD715@ExKv1oqL2)*Iw05NDVU0z*F&}}_ z`Ejs>vy>qb^5@w0JCMy#peLO5nWpYLj_&&`Wpm9vHT%^3EksZb$}fUjrbxBO}?DfNf<=V z)bCCAzjx-HGi&vGv-Nv#4E^NdhZk?YwERT2{`9R@$Ud>2`QlSY_2(45+3U)+>4oXV z$)B-Hr+#Y5w0YO8y;*DTA5m@k9>^Fz`iA#0>R(NLN7Z`Q$83HAg zh)|=GL8O2p!LR%laTt_W>A0$cYY0W&vO`vs9OQxk!$I3hH>so|4fy0IAp-?d&%gK7 zJ5Mdj?>_q<&hGhF|Mu1IxiZe~ln%1H7U%p6>F$LKndSr8>I47GE}#4-^R2)?I&zh@ zY1hJ$)U#mm{NZy0<=QVJ!@q5KjQcC@G43HF0xQT4*kNH0hy2T(!U6?BeN*K$3+x~g zXiF;gf*qTwE`Ms#I1t#8pBO(huGDm=Ea0AHER97unLfYxN~V7Qs`Wt53Lc$(?#S$sHA{WgQlCD*YT3EY zaJFr^y2kg~-)Uc~+nuf3eWT|m$3HxNvv;NL=)3`3lDtNiSL^pJRsBQl-`6f5zIAq` z{<+M#msYJ`L!_We?X&jz*O$(w?4KAP|Kh%ds;c{(VgRwT>Y91MoIdnk?>oIW4*%@L zvi_%MGrJ#Ob@qMgtob9lciSGwwXm|Ew|Y*PsgKR3evbXPa@UE+*pDC6LHVJBkL*ki z{tO7=|Nn!p6ps%uK61pCG+s0nH!Dj0g_5JlN*=&b=I*B4QQj2#Uv;|zw^eXc27-et zXG{vkgCkXM9;b4*BAaGsv`Z--?@j19GVGRAFjqji>E`r7HiYU8s6m35I=GF~!R;GS zXn)DPW#iz+c3MBJgF889=Hw#;Wb>9G;8QRbC@7dvEfO=!U8Y?Xm`nyVnesvkqe)wm zU>5X(rBsLzan`z}8GMeneHoU&Bdir{NdwHJDrp!;ZM!82w!(aq2EmU0^dr`~XG=%; z6!3Pk+-xwuv?bw{eqki3`jJ$rhMP<#M3+#eylN^p8|R;Zzvlmd-&MqqH=-?D76_k0 z1t^uuQl$dz{=|JHW)b1INi>|R3fRltzkzz%Mx3;AxOKoYhEkq+5tLxjFy1yGjR0z5 zauG-V0sUHNzMy;(c6bbgaYlIYg3&}`o_UyrdGozRg6Wc^Zy<_qVzv`AWIkyZW~f0E zhWr%;6z~c#4lx1kR}0Td--1T)YQqr(J*J37MFt=p3B*D{uSGXK+qNh*m4(MP(l8En z5i(UL5tolcjfloNaUIRz@_|W6v|f<3LdQ>*P%=tSAi#mop!!McljtC5x>7HZU^s-&d$abvtM<<2krcbm=uMTmHqQsq_oGXLt8GW$?zwhs;aEEO z_G6#6?!7Viqi5Dy4`*8sue2WhAC`HXw%@Ji(|zez=jr+G`R5mU77QB%oa)Dr?Kaff zj*7XfvsdR{pM5S7f(SZh9#Z9bCWk7gQ< zty+%ftaYjWxq;b%thIm1lCkzLD=XIioXt6RVfMnBtubqBOi!)aJSFW;F73!zPu}8I ztS8I0b0W61Z|Swvz$exd_X^%z-b(qzdf*Qm-AJl0?n79hYR%D-b+mvf0d(GM3VW2P zKfG!^a@Se`CWNW-fsAM8-?%>JOeOWP-g(BR|G0*O@@<EHBShBz8f(TN^UzWNe~g+#JCE=vX4p-NVTR4L4(~z9qn9R%(Bc3k z^_*r-7JDV&Xi0pMFCCd6vZzKsxvTN}RkPm@x2+Rl5z1D-|J8{=81Fma%i;HzJVW#Q zrSmwtAG0`SXnSh5>nxV8W3~@7d_SRGVGLpkGkmooqZarUl`}cMd3J-Nb+!#NqdRop zXx24t)N(rChLzJ*Z8+_^KKef2sO!=2VDE>VV0FVA4Dm{2Y7s@2Z2(!rF%IJ_f0SJ?fdw6DEJCKL>!ew zc*zIb*vX#=gy8`mADhJYj$;#w0HsdV@dSDTo8p4VrG%+_|KZMk@Yn5ORgMI*2w`wW z9#%8;IUEdPv)aQx8K(`>NE1XlZB8EoEDQfK+6C~a%3hJFZ2fU!F|s5s4=!C=u|F|$ z`cq5eqUFX=rfL7u=@pAN!+8l6ali4kq~8zH+B7l|g1fqKU_{jgAoeFpe*p+p`dorM zV}!d#U|HZ)CqnTC3*&F0AA$BtxREaS?Cw}sS8-9tj_f;nl!v#T5EqtvflJYK)PnPf zqJ)bH+Z#*jiK9aJwOmVD3pJD?`~VToV@A#qpUUsVsg0WTV~qiO{Q3ZBw-l9!U2{xM=pvK|t80{fF9*O|ooLgGZ? z5X6+wrq%B2$j0JMNsEv{>~l(1O@+sKvUC%Hc>iz(BBHPXdW~w5f^fYyJ&2LOD+@*H zM;HWFfgkbS5Z{YzIbRQqUhVAqqzM Yawl_~d5x>haJs)acU!MFB6+hXwjVMQ%+GwrIL7Q0$u%xx3w< z5B<)a;g2Xe?FJn|ckbN(d(L;xJ@*{`LsOHV!}IqoKfL_kdpYjk=%eyTc81^h1v0ld zm7CyHUKLV&T9^=c%DYmov^XKAr3s0Biz#>7GvP^lC%inTc~z+cJtuqucZO5l*ErRq z`R}^yQ6~Zdr-`cfQ{P?QE@7?wXcf3C*d=%E7dH{ywrvn?o3^xVV&gQUE>x+TXjUU? z_?kEo%C|&YbN?)I-1%fCnO0JAN|_vzvoo4(YMLtRQ+7UYX0^1O%czW zpVN$V(lnELrcYKfDr)ETS!%9iSHoiSzYO47{Q1JYhpd?ho9EM}pORJ1Uor!;v^PiC@1et$13>+RJtQ#w|i z)-qW(Qg5&P%)5s6UJiSHH%fgMXkkhQ(`B)ToT-^Hc{GbvX^C0WFJn>J8Qn-06gC;{ zD1p|P(an)jx0oTp7-Q%}N4fX538Z88epx!(=@}kf~qEf}TsM zGPs8A@7P(2d!{3{QSTOQz>ij4}3p9b_80lxE66AqY&*Fr|JSUGz)|0g043Y&n^ER9Iit%93Kpp&mrW+@&H3wl*f37$hDyLwrVUMtF{$ZS z4KUDK`GdiHT{+L41kkbc0tqFj?%JX%4to>KpduWDLDxoXB|mPPS0d( zSlTo~()81I=D_Bp36V}tXOwIXKy#>fe&G0KhJ%X)G!m&({TE;F9~c;Tu74b@rVV|8 z1P5S%#OOAUaw(=SY_SIEUl|{NT^@dY6kC!fsRQkehBhG3DFki*4YADmwpb(Kq zkr%W{!g*pg=KnS6%_wgLAS1dxw;2^IpNjbtDaAA`X)39uRFt`fGkME%4vNK4Qur3% z7#TigNf+N39UnX*G7CCzVy@p+5WxCtHyf}rvfuDlR+S?*I>CaI}~==gSkf;NEe zP#GN^{Sq6Cik3GX&j9)HxaE(>)4B?HBOi>%-^(c}r^XYHt9l|Hzr$_NO1?ULbVg5W zMuRTt{< z@EdO-t!?!JPCU(}3NN5kbs;BKa}vwBCq$fZF4gONN$kt#e7V_|pT6?$Xut{#lRke# zBf+s;K$+z=N%LkBn&mRHh9zn9P(GHIsor=}9sA0UV!0@f=^4!mRE`|fSbj4%c^N=v z`PvZ^^%y}+XEagLjKm7X<8_#b$Bn&IwU3hhln`@m`a~$Vqmmp(#ypDT2i)h)EgzgO z2bw>4wajw+4=kQt-n}j!DDUf9e0ABsE_OM&2V$2!77epKh1&tE%@m#hg+WJ`CfW4G z$?w)YpGtQf08V&SH|jh@$1Qa}R>$bSrOvPV(2vo7OI<(>pe|S)GgvoYliGy3W~x&| zuq49xYGGe{)d<-X>OQp<@36XGZNs}o?NoQ*9f3M*$GcVSQg`Cr=Hs^hsRz_usN11- zs~vc^t3B#&ym#jJL=Rei$4EJ+Ocr`ZYg(eh`F=7rNdD3 zaZz}aiwa`}5qs^A3PulVje|&_(L@k%%JL93NUkKC9JCBsmJN~*$fl~ssX?K&#;aJR z@Y`s@gl3T|N7|PcmXoEhyd;(PcQ1)I{MY@<@dpmySUE6); z{!2*y(ff)`$$IWrQS=5z1SJU_$TdFmyb;J&IiObe`~9c1FY>fG8%s^O%xs1(1q?6% z72%1UL&!5i^rOI}RaJKHiNiiu(#b-ke*1RWC^aUUV*i2giug(Jqu^Sg=a-RPE1m0+ zXek&ihgxqGuNPNF)L#y>wXGLP&;$}RRj6Fu zu1ZB|u{m1>k?KMV;ip0c6yN6st|%47DZT<15JoJFl4W2*U%^7g!G;?SyN=jb3sasZ zv&YbL(=#wx>#cG!lpK3gmB~ViK|APk@v%arLTMdmo^4`9UB+>2$?{BVFnqFxO?P*V z?v|j>S)yW0n?@gN2qRieLE*XaMR=_8#IaL0@x&>69c@k0LyO$!k@j1CH~Us{>yd*? zo?k{fR(e)@R*hA4HE?@;J@VX=ryPhZeH-j5?diWgdHbzW$KZP8cqw@NQ3yI=Ep&Lb z2T93$*ybCFMdcw11B4Yr1YmWk{KrpIceX;~E>~e&83qTJfWE?~t_lZnSr>~!k_TU; zF<5;P;Hnvx2X~e%*&OZ!+2`6F-nI|+VkBVq5MBmJVnv{dfOZR}>S*aT`n3{|>~Z3i zW1_IX9^YH*{}3aX&mjTU2Tt5Svv%kllwU-yxk=6f$M?gS5~I)om>h$@P4}- z-na68DRiXdJ+c+`v>ZmgkC9=h$Gh>_j#|YklCQdouEjtd(yKDU6hT#G)ak(_%R(o(pVvkdzP6?kh{S4Box|Vx>s*2WIF5YPHPaU!3^SwofjEn zEEf>Z&~EwSX(bPuE9xCb^Hv#Uc`M^L=-(FN7ImrdYHtItHq~Cj^d{+0aH@6Ztru^; z_^|chTI<2p+4a`vmb~RaYbmgYK;Lm>JKq%uWa2RhI7~Svl8%b2a=Ol_KZ8bF)SHhO&c-dYH89$q zjXIe~7P-f6u5H&-SiExOwr8z#;NF?fI!`jD9$SwLmV$%jXHP-w**}Q3L|S z{}TeX<^Sbvcy41t&XP7`PF-9$MM6dbzag*?WTzynnDsv;SgbnWXB@-B95UY! z52V}qJe{cm>0;;vSXl<2hc#2=r|6V*IEBjUGfzgISQsK(W|QwwCf6Lftw^wKha6cp zaAUyv=a?^WCS_x%nHCs_l(X~n6o$6N_%w2xwX!jSqRrx2(d-3k{4x?)AWzl5<QN}<7$caV`6-WX;O+4n`j4UV%6`-pmN z%bhNg%zS611|8D|$))io5=$hn1jZoS)^0$>l>us{&sR!~A<9(;U^z_1Fv_N4N|5E~ z$g7QMiFDNj=C^CgCcS|6QUA8}OsTR#$=_l5Yxh&O4TE*veigN@)k*F=eG!&8sq3le zt_BZ`5u&{uprn%$5_WxT|E3~Z`Zw^2YXK}jx4>nE}nR_zx&>) z2m7B#?RVG3=N}yzxZn2R$mzw=Qs|j=@${pC{RbPg?! zlmdI##i4SzW%1Nf_Xp=UyrQ&YBPd9t{D#*hb#FAgrDrz6E~#(B@0QN-kHZ1!aCztM z$1ZwD`|S77x9s=X3+(;5uW3U<{l;#$)b%9nk&ZLavi&5mmFh!^0S~`HWT|bfT0Wi1h(a;tt-M2$xcs1n{@HHc`HIN{5CqD@w0Yj`2|8+0A53lNZL zREfyIPJD8A@-ot;^4A|n_E%!Ik<;o ztZI`>hOV$o3r85SVf}D%hp2FJa(DPK_?yHy$boZ&Bo(}JzMD< zt5kl7z9yZ%ICI)|E{Q+(*+)YCHJ0*hF(f2UJrZci4bPjLaS26O;&<_4vKi&sa!nf3 zJ{VbXVfQv`bUbS}(9|S4Kq14_&0o(y49ROxIle@+V{82zWPYEuZs)maxUOt}q;2cv z*v`n^eg--aE7yB=0FGRw5CuEy?7$XcE))SWl{{jg^}#a-nDr5(ibTY0yT_7VyEr!T z1`ZF#fdBPaw8AVj8m~FJ3*Fl=rm@jah(n~`?IZK~o6kRNJ+#((=wWN`T5Ip^lk2S~ zDi;?zC^sLRyXpSInA*7(>UN_)AcN5VL}8@`}HZfni2N3qkwa|k+oyS$tua1~O#D&7D*y?-|3xZ1>%f>y81(;EV$UQ>iwOFJbDR=fx z_-Aue$1{`#88k{DTopsqrn+1VkHHjk7T5ZP84VL+XvF_>i0Ok6pqfoGSw3wwZMt?F z!(iDs?tx5FdhlVKqJ&ujbnSo;k)pM2A7()@XCo;b8q;=L`w>!{)Yx^uux}g5sa1cB ze&#z!a0?7`Ejw=cZu)M8ZiXI)yVt_qt7q23eQ;<8!b{(Rt@&7R`8vwM@Qu;yqYs1o z)`I(1wAJ|iBcx6_i>PO8vF3 zN)DyLO1}0+DMjBJ9=P(Po5F|ZMXc^B+&~HZriOA04ux-Ay?%8y@LA}{;}ExR|0l10^lG_d_a{3)+F9PakA3a${3P{Js%*bD z0`8{fFJ081^ZWe2`;tSJ`6)gc4iEQe#Md^S0%#QoCtNNC7t*+9WOpCD-uJ z;y>58F9b>QZZz}KE{K7<`AdP9x;9+MJ!Uz#M|xo+5|Y}U90*8$+q9(-68Nt^q}Q1c zOd)fN%aU=zp1aQbDtz?-Jf9Gf1o$=p9zimk62$k0r{?YdiSS{&2+=@W4k4Zz5OEen zg~I8xES5n=8q~9G)*?{o{6@jZWtb*S!G|?v=xN&`Kt!J!8u$^?wC&`NA)Y2FDFi7k z*Q7paNeRWk?MSeBOBNgM!^CV$q;Q($wu5b(5!*bOOQzI#HL_`-{omr>q?_a-_wW9; zAN4K1Tt0U0pPJ6!9$ZqFU%qwj=DF3j^|nK6&4)@&=W$nQqR{oSd+B6JZ2#StF0Ofu zXLs%!9WemThE}1=4rA8bAALB>>SLsrqG5&(`qjczj(%c-P&!fB3RHh%p_zt=5_ZGG ze)4l5hJD>7MjG_n0?RjYC4rxSATVpY^L9{87bOftw7~{+edT?@{+Yy!#sX>y1Lpfk zph|iE3t<;8{^uaacmD_X%)fA*pEtEF$Jd$;F8ZIid46!|?I#>wUwAnou-x{5Z~v{} v<_|pPkN}Iq&d2omMWj~y8qXhp%u(vpQ}(y2Fv$DA;E+7Y@FKsH!S#Ot1k}JMeFY9H?9*KI9B9|{olq^{>MN*GQqGgG)Y&z;{xOYg7w7avu zGb@T4Dq(7;k=qnenxwLu7Ez0$kYN`P`in(>R44*eMT%C6U4|V5t@=XSf3oPJiGTGw z=gus5Mbl}ZEU=fe_ujepyzjZ^9R8@Gp;p6Zweg!5|FTun{*8WwpXbzrKL4|*rrpra zYC;>TJz$4SrXN>P$SlYfVp2y(8KYP1L`oiH5M}{Q$b* z<>G6i@vYeK3XynA8(t}vqg^Fdpj|CiqJ2uNLc2z+M!Qx#g?61-gLb`Gi*|!phxTc) z9_=$?1KN$^X|&IZXV5+;Hlj7evuHPo=g@8z2HGa^>tYl3+=9QG@pmi!HsS9!u?3^s z#a6UC#5T0eVmsOvu>oZ6ax{e7`!x5&i9=gZn$JRif*I?)PiT z#&(I_7~3Oytko6o>=pa?o#(BmD*E?}1Kj_DwWgx~p!fo>^P;u3qQ6%h;`x2nx{CgO zF~I$Yt@RcCN5oNH=a{vjqW_EHIQO5hp04OWDF%6+m#k+O;dV;A%wwmm=N65f5ktJ* zS!-j(dasCc;#JV_HS3v*{$cUD_>wp;e$6r}`cvWp_nX$HivAIi=6+#quIRVKDEE(9 zO%?s)!p6Sm#YJm-MgJv{;r^_(qoO}29PZCs%@zG`2+94f)l$*#i30auwsuzZPlzkr zKWVjw{iExK+eFbyiZ364pjd7F+PAcH#K!l0Les8lQ`*H}3lyd7&y@C^$TwHSFzc!| z+##m${#ANkyeYl{Dee?+iLc^s*W`2>+D)@2wC1lD3UN&v8n=v$IbvlpmN2pf&-833 zXQWNf%s68O%lOyn?;0NFmm#nQFxNONuBb_nr ztl?R%*CwQmE+cDRvRuOs-@`8Em`QJ9S@f26YBgNPuszp!qhMxiZ?ZOR=3U-8EiGY> z*wkq_qlU#B31@3Mb9b8jiHb?3|g& zOd9Sb%S(@2q7{(ja*k)Xg?!$To?+%N2y$42pJ9$T1rJ29(zZ(ka%3%@vBG`=QCfzH zuQ!3IlLq}Jf|%*?5pfxctKikBnYN7d zxS1QX#D3zW2To!q*TN>Aod#4`2Ak6lGn3?XXsz&5&QEvTDP$B7#9jqZKrzDzQ=oBC&mJ5);hQ&ZRB{~rh zS(=<9;Q)aqr0sz)fjEMq5G*S*s(|VrI6Tldq;MnRx|1%rYyc$M$2AJM02&1{B&!^M z-bY#r<3&K7l8z{(J>#&Q6Qm-KLB{kkJQ8$B$PhLcw(HrsG;7_61qrfpMu}?lb^t9@ zMOYbo#FBs!1Z#n;wgA9Ubc|#y7L{7UChZ8NwIdFsOJQP+SOLkC#xakS(Oe|k%pR}R zm>9Pqx0o_94jm+QhUyY+u>yny9Ly6Np%W0K%T~_JLAZAGw{`4kW^D1AVP;3{u>$F9 z$UV0fa6>U5l8|d?tdqISCM4iX?a9FOz#=%=yyIHW8y7|jc1EONopx+K+0nVV)!2Np zbNA-v3x=7`XGobCMJ0ix5n0utuRGpaQfUXo96Sh@3Qr#!Zg^9D(&3WXoIO@DAFxQo?F#}1y3G?H zg$MLT3V4Yvo@q?Ll(#KdX0o?LE!bJut=b7v-lTET0Yl4Z5gLA%Oq^>;a2n8Ou_PqW zT(CI60CaIAOvf7q3!JaLWKCiVSVV6eOe+HihE!e#)-E0(P#}GHxD;}pgD$*Ahl`Ro zhKtXN+M{h99i7IG&^Q?;D~D^q0B1~qT{3?m3~sXl8eF#7p0|ve8JxeYUEme?Lq^>+ zMl!1%)u8s>yK8L9)ZYMjmp*#B`eZ_znJeLxcG>A<$Ov_NG7dl`UaSfG@6xRMb$sNqWV-mdjHDVS$90<{e!LI6k+AzUCt%E_nfY&>-irD4 zhkDNpq+S^~edgFpgMRf1bEG$)_gB6I(#p%cSRZs8$BN&mEXW9y5IScySNqHQdWU*X zymaL3fM0d!wbZeGKORzC(uK)iRx&#NTI))l56Tq7WRC_))ExC|7fx9}9-3>vTG?uh zM+&wdHS@M#Eu1X8ogpApjnlkn<@_o)<9KeGNDzLa>Or4>6%RKwOB>dOHXOmlOt+#U z!mb=WMfoX)rz(D`##2pcG|o@U&{xY(b;B`Hk6#V+YqGI9Asg}FM_~~Ch%Njo&-Osx zDi9E~ssgd;&k1wVlJtxIEQ3ry{LPG2To>}=_16`}&$k+bP?__76&aYxAwM<(ljg5n zETMzVRen5`%9&X!mGWy-sVppNhMwzFDRTFMkwhw0CJ?EV+yZ#t)8^4?pEkFTJ6WrJ z!jW!zyuIv1ZU^A)B^gcTCmBs{_Txntw_ok++JkuAn@8sA8sGflT;1|FPpBrb^3B1y zx~30fO>@sR-HWYxC-zaSNw(kxemzYB7k=ncSEp(E{2(4~XjA&d^3h;cc!}-T&ac$8 zFX6I#HF7oT1^m_EzE4G_qVI?N*1owqrcG+^>4T7uDoAOC97Q+dS%D(03()lWXYp`D^GXO#K@dNPgg12^AU8(`{VK50 z%)F=j%L{f2W>Z?Jw3G9sgFc1`e>w;#S|a(kVNEzGFk$t7|a0~aZC6$LOS`pB|zAEfCn{9x!xqiy$-)Z(<%31Rrx%c z$6@S}z36?3MjFs47;he(X`W5=FNX4$BbA088Cn{cJ(37>2H!F^ z-5mQ>u&El3Hozgd0cqgz;ZB>v`AgT+r2*=ZuK<{#O6uHNH=F2sQtAu^kU-@}ZJAAh zcW?}rhGegN4N#oLR}N4^R`v<3&)Dz1OP}|?05B4CZ_A}8Q!Z}CIq^BdyH9=z+Y(92 zh1Z)+v_2_3_P1f>080a|Mz$p&D5h6f8j{WqnF18&9)sk}Y@+!|A@OUZmBr0W$R4b| zBtyEolS3+=W*{?t};Ns9}0BW$}j7dZpSbdfTW|tfVAQak?q{@qF@XH1??fwGbx?~1`5xdHP zvu9qLO&nPa+%I<;kshy;xX#%)ztt&jrqdR}IJn*|Nw3aM=>QyyKw3DEZpUU5yPp)G zF{}xH;e!|7)BV-Ts-zJ5Fn_UncXmk^uaYE{0d?!}Y@+*ffHE-sanIr{ZIQcEVXG*M zv5Gt;@~GhqYFBiZ^CoAs_ag9&&YeCsG$5NX2qg4;nRoGN{6Gfb5n&!Iu1RG(yORep z4x$n6K|H8_!r!I4$h3Cb{IkqV&$LnpB1fP~mdx5N1vgT-IWEnkZg~~U@Ot&U9ywa~ zTMx}9`WDmU^A(KTzmnI=?jK!g)>%0Kkhb7ZAr6GwD8f2?Ver=lJtR=L^08l!xEd5- zDGlu0CBFtBNejz_{C4avtn-ipHvj-LG_54$zk?s&(7zEOE?nfH%I0GETfxxVk@sP( z>2ozY6`j^6^(kDl*5miv`lTH(6Z&M-BZBbfTI8BO8WFL#;@E+%0grw9wfBRbaMd$f zb5-%h(;TN&A(Vo^E!;H`sO4i4Vc39l99>3?0XJmacby3pv_@Q8BoF&l2y$C;s6zAz zoo*7nX*_%{a$M6{0MG9RGCFQ00Vw5vghohR(WRl&y@iDLvCrGlU`B#x5OE*-yd9w# zzpLNSb?uuyxV7ki8lBMT+QKq9h)Zu3ytka^*SdufN)^DX_3J3oS0D+o1uis^WQVUy zc@1m(HHc|TieJ!XhA}-YcjDpGWd{%x#>HD6EN%;Y3Wyah7H-x;bh=Dk!g&R}=Julb z*?(z2o7Ns_(M0uw`i6&5ZCUNNYTmB7-g7^`;m7fF@4WGYsduMtP27KO4}Q&b{^bjQ z{=(hk_xGRsFn;diC|>$GgYxG7gE~N67DA4z7ov2yi{)_tGKr7PF}~Kw-@={>7dWm8 zO@+*b3kDW@Sbbytx7UAC1-R$6XnplVEm~E*SWSr6keKjF zhui08D#>N|tg;Prn|1ly`14-$F%(@AyV8|&4e&BWDo=LEb5op=K`20e50k!(ue$;b zuAy~n-f8+l+q-S|>bBpDZC?ysNr~z1$_gB)C4QDZQ~Fft>IpO32ni)DK0}HZu!#68 z!k|woi<5)EWyIunv2GlnGb$CUcb%fOoD89Um2R_{76+D$4 zZnB8qe6H;&Q`F#GdyD20_Fq%ynIuVB`Z(Ale}Hj*X#v6etuM?b4t@@T|9^tZ-^21D znMrUzlgvHx4>9z0d@IPjXExFEIZ*t+;wOi}?|L>Uft6UA7JKC%1A^ZmC>ETpn*+0n zmL~;5Ia`|cqI?6ZFAc#y`6n3vMkNHd`aVBqg9Brcw3W&K;~vFfaD((tejiQ98B)g2 z;!IbEyoDh;O3K}Zsvjn16Q`IeeiTWg;^s5T13}h?LsJG_jS#d)4#GfAf+ARwtd(4i zrg-oSyzwBskBqE6iu4+%x-v+iQu+t^H8ba^1X5Z4M5Wo1v}IRuXa7qlan4f?5*DSE z6FSJQs!YUVA^+kx&Xi*4Bd}7J_J>h&&Ogu@Njn{RdP?e1+-Jf{V~A@)g3d+$5w?ZUG4hh3?|U-c!dgkMAbYWXK!kRPHxStp!OGmuSkd9464N;z}g6RG5ii;aqlc*LGr* zwH*l>uygP=P(V9WGkn0P=b)7L;?Z3ySVmysN#N1#B31hnd&;wmBm#e9&!qA(D=5>YhTLt?n? zU$({76144-fAhON#WjaGJcE2BBLf$ZLN{))WkAJi3~w?YX5`)dhB*o^T5uwjctI%g zLVJtGX?7P4u9yJ-f?x~#*hn#1`NAErqBn=!lP66hV~yFKokcVRnQuFNNl7fSsUF2e zFoZlE1g4bW=A_&LBcqnKR^i1lFQbUJO1!m@*u59HAs1 zQho)_xuC~oRU2nJUw?BNw;&e#P-p@b-W0Lts_f_xu1M9FayBTO2FmLVtF z3q|6J6-3%0Tq>t&sjMCdkGwD|DDTqMS=`pA3<_q^vGB8fN#Iwy^RE09T86`IJkBeVkNuLHd! zP{KrVXbL8f@Ed%g6Cy`>x}lC96!ai`M`_hUju_F^Ra{r5Ps#!Wa25Yz!L=_*KD5ft zgBvIvcpP^nexyh0fB%HN(REHLdHTdqjWiEDv@;`fhs_9fS)A7rD3=sIOO&t z8E8Wsq3z(Iq;d#I1Q5!#LH3bZMnX1+t5aYT7zf5}S8?MIsKqxHT);%$!8t&C2ho|r zN6@BrH5}TZc8-aZSmL1eg{%TlBC89|T_Q`wM}rC2a7RI+mx_`YUYG!ub!IPd3YwmU z##6lpl7VU|7$~xf1BhHE4=&9&$#?tCpB?;594@sv5umV5p*JIH!qXBrd8ZZack7M>)?{ z`bPv|Y1>Xh2$5B_Aj*c4!2@AbB^d4n96oRzMxv{@l}-j#)Isl3!HPtkoT8tdMX1q+ z;Ve$Vs+G!ysA7k!lgM0fZ45IDq86?+qSPm8oN$~=ZmFU{`5T@476b*{BU8iGZzVq| zjrt&Vt)K=BW_NMz5eoh?d?wCT;t$8h3UqsUi7{jvyNV8E9mq1`S_#zoe#vnz)M-HL zJ<=YQA{cFQ%&?)GhL<93Cp2(*QVG{MJ9I+|emAZmdb^VhMKk#{Q zNUI`2@^8FxSc0)}Mv9MB@-|4{i4kPEdF7sBYcI+sO;ljA%?2Hy!lAdVRFujp1J}3M z*^8Md8!al=OBn`u3y_$=h$f9b7&G#&O&rRnd6&J#^=0H{6^C3CHQ^Xs98keijsRjT zpo3B=>oQdiLB18$)vHOPAC@kyO2F7W;E;kL1dEwNnB{O0OlSw73n+LM49mV^QyDA} z**xlSiTlbFQOz4->;;PG4|2s+$w;VkNAeBm7~Dvf>4FWKlIzbkswX?U$k3O{47pkf zM^LGlFszLt+2B)`VCw29t{LK(3sfqI9OLLQFS+23;s%5s_bt2yy;n08eU*%8x&UwJMF!Wl9$#}Y1MhzfRT!zDupGY6ebIkC(o?iM zf2K6KLg*JMg7MgAVSWz(g>p6K5$pK#eN9BCV&B*PAc~b1)<;NiGy)F9ipLL8ktj%w z3#GD{BpT%MEtIoE#<^e=rz719VI}CSr$Rj#PnwFmCv%-qswK1gv7s zW;~%}iUiGH5v-RA`Q-Ysi|{37oF-901#N<=r}}ULF_J^7ezk`*dCrx8MN_NY!sw`d z#U<(@x@rV`MybChsrfg2-Aib|=at5XD>r}b_;la3HFIm5sIq6&yh;m-9zP2AlP#ioN41?Uuu(@BYZc=`X3cf&<4s=QyQ892x zj0%KHe)>E5*@Omb5SC@V8&&U*Dte0>mHM9GLOu$+gc=LAJ%7Hr+pkHXfG4eL$3_dd zL7{d`MzM%rS1K7q5|tzk^qr(~UP&aC)zmPw#2E!LrPi3Qv@ASREJa|+=cs950+`TzSJqFI;KD6&_qw!37OmP{6r-PN#Dkn^Vc0vgITxCnY%*#~Cga)8&XG2e-%* z;#en#8adL(!8VR>u@RGGmAGn1i6WZ;5)YUPJ?#H{QtLEZ~d&{@p zk8hi<`nXz))Lq~5j`&D#`rk;6zU85YW5t-?zT4Lh z`dW{#wfI_xubuihu2nT$J9}^S-kH|BvAKqmcfENC`dR&7V)fMBd*{Htm(M

    ixZ zux7)p!Y4J+sy(Hbx^I8!&hEK}LwEY=r7wmr?YPxCgSGnZ3{m&-u)F>CGc(@e?&ezu zW}cdBXurLhX7>aex8BOk^v^Zyo7qLZz2O>rX6o+<0_TYS;OL2YKr^V9z-hU4VrJ`H z!~PlGw=aCBXXcqZg}H{~ce(qF4%#c656ool_S0g|KiL0;Ib-W5%VJgAKduc%leg<< zc&nrOgJUO4!}Y;1aX5JN?v8syuhP;d^am$jCOENgxbncA z;=MDkKaA*&r}Vj(&(2pxs?IGywSQ*#?m8Om*XIU~(ctlg!M0n)nZ2~`)(6{KXxY{h z_Tj3L#!U}4Z=h}MH4-45M3dUt%T z;l(?UOTFr7*xi169f6=X_RQ@)Kr0U!kig^1R%Z+7FpTbtf7e<0o!H+$b5`|-wo(^dCsHhieuZ1hXodFd^DbGTzh1feNKfql05eF>;{X5v diff --git a/scenarios/__pycache__/alice_bob_carol.cpython-312.pyc b/scenarios/__pycache__/alice_bob_carol.cpython-312.pyc deleted file mode 100644 index 619b306826fb6bed53067d6da7da44a86475bce7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7782 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 diff --git a/scenarios/__pycache__/browser_grant.cpython-312.pyc b/scenarios/__pycache__/browser_grant.cpython-312.pyc deleted file mode 100644 index d199de0c17f4e197b6a8621e980afb72740b9ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6130 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 diff --git a/scenarios/__pycache__/full_journey.cpython-312.pyc b/scenarios/__pycache__/full_journey.cpython-312.pyc deleted file mode 100644 index 65e17f80c0b44a136c677eb86bab6f08b7588136..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5134 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 diff --git a/src/testdriver/__pycache__/__init__.cpython-312.pyc b/src/testdriver/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 833fb3f45533c57342643bb6abf13ddb01edb6e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1323 zcmYk5%WoV-5Qlr8vroU@vE#|ZBuiv32qZ@cAz98I%ptM72}pfeb!OW3K-bKwyLY4I z1Xs>T+_~|$a9VMqFN@%SxFK@OiK?C@@f^OHs_Cl!RaN&d?RJCV^YPv9zfxt!{v_l7 zr#Sz3{X2gA$YRD>T!@RR07YJe5-&lSmkZ=8sR~qi6#^c3yR2$Z=XGfChPNxK2`%1& zHgCfMU+})FT7)IO1j~FGR``nd1!@)6_!_M9b#K?y25j<8*y3BT&9`BP?|6S*-GW`d z3wwOe+YNOa_W3@9JcK*^j`uayUAV{Z!F_%o4)}rhwbXm?fIonT{2_FBr@*dQ-2SP+ z-=8dW7DvyqOe>8&jCC@WI{f3?A3}U5mq{dSlBJRT{~25q<5N&t4j- z$37VMwHnm}uBx0Wk$|h8rDLHJ6z75$MxF{Iaf^1}3M=zSsa@quVWaC#+0{ND#aBT4 zR-b7RDd~bQq>hsaqcd!nPzs|r&QcLWVodT<$#acAQh{<@BPBAsNe+_!S*mT~L16FQ**QCZkwOi;!`Eb7j* ziaUGyHjY8>6WW9=LX}V>)CqJM^af#putI1ORtcMgfUrZ@Cfp*F2up-rLW_X6iRlVq zk+4TtBPABqU-LB8`(8F@^;>n z?qHCli5(1%hLbn7Pa%s(N`9t4#2j?vOb_u-sZc2V#`s_CWXeuv>}bY5n6bxG_ISn) lr|fXX9?jVCuk3inKAFwe98bwSn6iU^%e7|lyFhm_(|_RCai0JH diff --git a/src/testdriver/__pycache__/actions.cpython-312.pyc b/src/testdriver/__pycache__/actions.cpython-312.pyc deleted file mode 100644 index 7b9fe8ee3104f970a44ae7c06e7e14984a901f1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3602 zcmb7G-)|Jh9iQFX`{6s^0XBv5QxhP;YncO_(3BQXEI<^cF|HtLb6}mfQBK4Q5wr@tJYU`(dX7|=`4teOx z{@%=dXTJ0O`T5Qtip4y^_raE*P5&fE$Y13o`O@(~S^WruIbx9tu@p;nl!jVS6**2h zsfJe38tF0tYNsmZBoPZZO;|da4qWB85IGq8732Q z(xMHcMIAO}`*y?dnbV?yVC8&%go^I-)HND7GdNQ>{6T69I>~Hz3c^jV(R6H4XVwsP z*>%S0VBMP;EYnN4YXZXw?9Ln1;x?EEaWD|J%S5aY1hKc9%=8(Q^Qc)j+$r|`NY4p* zl{_44?HiL0qqfChl;6txU`kW2L#m*h37-e1A8@JEzz+@`IdW8o8E0{2tK$J`G1D=y zv)c={FRy4a-mv|S7H|Rm%j_@Y0b9U#^vt0n$I5iX&BK=-$9ddsm~|WG3OX^x;pi$n z0i!0sKd^s9Ni z0lwkVz~$^(0F#-O??m&E2qpy_6UbN((V4n!)}>vZ%cxh2R4@(SaJ;DiG6XZ>DId`f zd?U(^GX1gb*S)}pV{y!^GxO?@yvvw^!>Nf8%<>sE@PkA$=p^^9GVlW&<90g|Lru^1 zx#vW=CQOgBJam_yh@4Xk9NJ*gGTSt;$ugSp_2v9OWwz@|STJ08C)P<6*26!huRMQ z?PPD4vlXo3Q&u;FK6SQqbxTDE`#X*t_587<@Y-kL)Q&%AkTskcj@_29@c$H4c~sYU zA8zISl5CYkn!&eA5@{<9;=2;E7Xu-Y{x%7<3-J!g?6PM)d0cRw+OsivfYfQ0`B=Nx zvA>eF(nzc*fxyeHBYlsR#dJvYKy zcHM9SbOMV`0yt%wTdc`IaN&hXWVA&1fs4a>g7(;kMiPlb^b&M@idVAb#9@^PDu>t; zHww<09`^;c@$b#J2~3nDVY~=mhnmcG;KC-0)r`RLt7u&i&}wh#l>KGY(hvl<#zW2E zQ=(mpF+eb1vc|){b!e}4uu_b+4<+z%`Er*WZ*m$=93LN|lb+{{(;IXY2pSf<{A6}o zIrJk$J|B=C%Ia@0m?JmHv|Qcr@sS(K^EuZQKJ0hW3+N+vX&Vk>dRMj78wzO3&nDdG z%S%%4F0r)tv&rlorA1mqPmi{!agi5Ab(z?5n;Pm-}|iANWB3l|H{`@uf4%{d?||7wPa<{aAgp^XP+} zN0<7C7yDkm|LRIw-Ev|zrS+Fqh*m7Eq{zUJl*PinsNl^`z2YuHq=Tb?&SQXApECU{ zSMI=Pskh0~usuI$)9ay%&q$geKoXcUUt75;Qvff~jUNJ1(Fi4h z&uaNds9X(|>q4d`fFg?CTF(hQ1|+JSY7cIRT-?AWS^0$Hp|^`u<@LSag$N*-LN_H36Qz%r*G zVcPatLvSfdSNV%_DaR!=;n~!cWw}I~_V#a3^Hm%cCqa-~{oCh`zjque{J!?-rO)5` z?5)qMpH-JmjxK%Y!o%HTOZ{U%%`NwBo73OZ@9df%nXk`R7OpLB(id}jlsqVgmmnyH zs|;s&gSw$6VFOAYOE`M*xm{_S@2p>*r~mwWf$Kl5i+8mgHf^1ecMEt;qN-`4;0D zxgztQ%T$gY6JgKUw@ns3abnL=9vmr6|f{wO7&pwVNpW z|4s(}Nc0Cpf1Dv|;m(11>!Gs$-)dUfxk5lzQ$#(mBBxI_E6SKMuRkI3_i^so-P@GG O6#^3Neym~?+5JBZ?aZVA diff --git a/src/testdriver/__pycache__/agentic.cpython-312.pyc b/src/testdriver/__pycache__/agentic.cpython-312.pyc deleted file mode 100644 index 836c8670f13714cc7b7697023a594ee785e8e743..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11662 zcmb_iU2q%Mb>0OQ{{TS%Bt?q)SxKZM&=O=tQe#mv9mS+9SvDO@%A{r@!%OUv1c@JJ zcR?Bmm@=`GKpD?SirkQn<1sURC_Q#2nm&1^ovGSPr=7MBWS~^Yj%K1XnQ8n+iE0x2 zso%M~3y2iuC~bEJ7kmHCJ@?*o&i&50`){F;pTm=D|L*wXJ2~#xl(8R|`NFS$hUd6B z?u(qv4RJCrJ2HIMG34Os-I;L?Iq@%Kgsf}Gm30rfS-C6Y$$E#pS>KQkdAIDz__Kkb zKsGoOMBXd=Wd9ExLm@e!G|9o^7)TDuO{^@;%EDCU;1rkK{6XY>j8Bh)dxn#vuXA$j zeTP}{zWK)uHE-Cq1#Md&Xd7X4+EBMiiN5bNNesnUX*)_g6kolxMHc1FuM0!1@(#HZ z|81<*7PQ)G(;eEx%C@0wd%di^=#1|y{EfhICsKM|71cscPiGaaR~*Yvi;}1*SqUX6 zQA+9Qd`=uzQh8LPCY8^nR7F?BbWT@PvpV7TpRh@YX-yoHahVgDN~Btpoc1j@%x{%Z-S!5 zwK$rdQgX=GtH&fwl+#)&kKT&x&*k;8bZ(UKk&<%Ain5Z;=QLfFFcV3ZCUuGCiHV$_ z&f9b~F$2Ql7-;NceThlTAHBf(u%b^Z7#4+DVwEaS?SK67gQD{4q@rRqb9%4e-y^=# zZ*fvQYp(JuBC${HrBO7ZRaUbJ@mwmeVu`_^oR*0%HdH>NiP!*pL;RwsrAKoTO7~8s zwe)aC5q0HNeV;gzRx+}fldw(5c zUzcA28O$mzYdt*)@$?8bLY&6TMJbcXPh&UryjajM7@IEbTmi!kqh3@Y94a=Pc(XTX zT9H(?v7gZCn7LQkJUXcPVG={OT=@~|4{8`5@Bg3%vy*wvl4ocjM1<6{ zkirU$U}?-H0KJ6&BeIBb-Uu*FW_qg)#vO)_BsrClG|h0asi4exB3CrLUr_UUK9$dW zM1~rr-hRsx8J>ZRLW&x987^?ADy0A!6PUe}LUcw|m_fsx&P}CtrR0}nS%hwb<+xzD zRb>imS_)66^)Z?D-|STisW2`LBA!Byk;cG5MlWemM>`^5WlNjobV~m+CcRJ83zHee zd`%=07cLmyb1x0PF!<8*=Rm}-6^6%Q29s&o@PnId8tVp*cr}LU8R4@7FMjd#*@6D# z$*V1a6>%KPX|s>9w(+l5o9Mj_k_X1X za-Jc#>_yIJNjObY? zSGvSD^?5~C(aJF$;?cnxG+R6XtPZ_8`-! zD$^=NgpE0@GF2lJuun{>MHsHk8hR!t66(hk($z^-VJ0$#IpGXs(oVyOQ&Oe?6;$)k zjWj!;M63j~uA#<^K~i+$0y0hq4NIvBQqctKY&aovh6kEW5Mb065GYY5 zFX={b8r&zTDw)+(0yc&dXTQ-}Kd7`MDQjAW-IEQkwG$dB(grG;;bW#pOQv&%-+IN7 zKUnf(T(K+;VlNFBGaxAoNiiOLNFk;C>c8VbmxN9JwJgL?P+ zTGq?EVJX9%YimFuxVD6HC~exXwE4kO+3`c~IWF!T{D|0&d)3YOQ@2pEjgsw@h?MN0 z1c;YYcOi-USWCmD<_kIbQ9AI3fMak(qXiW|`OJYaz_$ZHTUu)D014)PS%sZb4`^zN z<*lp*ND`Ap!y{=)vPh-P59(yXsyhMd+6zc#x!apM=gL>gx3=t9=(@S{(DKeh*Iuk{ z`E0E_ezW_jLinfKbeH=6f*Q4OeVitkTO<{Cz%A~L~%Ho zyzi_?CLdt|)i^kKk5hZ_r|zYs-A)pC(T0$Gi@PJZUEY;ut|{``bG6M|XP>*=T@|+0 zcI;ddI_3{mg`KsQ*4a~)R8?rL#ad>cshq0{Ew$FR+0zxRDzw$wHqAbJ*;y4fVRdE) zD!o-<%RRyG@|(lbh$;N)k0tB;>L7|f#b%TB7MN{qSZ*rwurhk{vNs>znC&hG;z2|B zLPpA!5+?}TJOJ^TVKaq<5Gu^5k}Bv*LhS%6hC8e1V|m$doBqHj_w5&S{DR>&?Umt! zd1J6jF@gYpWR{bJ`q|6w;*fAWM3fOaxzZHz4>xkZHP;g$f`7Ss_b zr6dO9!iLjcH)Gm4l@by`jhx`uIYT&WPKe6aOsFn0B5E2FqGMjcG0()nB|C8d3q>LB zHi9R}zdCE41?J`oq)w^zwiSf=RVtk0irjnrAln$sU=NB6ukGpqq%jAQDXSsCA<;DI zM29p}D?F6FoYEu7)Y{5VZ{ z-6Qi;IJrD*)i z(A)GV4KFPc@VTTu1;Pdz83KUGgyGbsQNsn$p=ySc++BxyhFW+m`@&?%7PerL86qZ) zn))TQo4`*yk7SlxadYik=89K}SHJcstDtRm$Q03Z`&dZH*x zYZflHLJSmCDOyf186iTCpr}kLNPv{>2m?Gv;9VWWP?Q@*sKK&TCMpIL9z{n@9D(DN zL9Bzc`e1@tI6F20$RQI}&PsX;$W@d?tq6Cwm?aPos4J2wJjQx{#_Y*_aSOjhDNShIiQ7jL0Af%KE7ZrrrdQsd#G?zW2kbjNIke6Ez)!4B!%m2sJaj>%O zf_F%30u+st0e*!nWe{Lu^!i_T-u5N-i3rR|l(W{5ycC2mXd85(cPx7vfsRozlP}1a z2ez9wvmQ6X&M=aQF%=LGL5or5x!0p0Ok^e$WsOuQ$W4aA<^}faFjC+)u@xbJT?VgSQI=|ksx1YQ4 zD;Q3n9nG6GA&uk_Dj)Jm#CZun&dsSLSc-iy1 zx9sZYY_9Cl)wXg-_Lf56E>sSV(*e5fk?WlDT-mL5mfdCl1iX|-=;^mdK~Kkc=Q_g3 z!WXkvQg+kOGfm~Da$tPxgDq{oal{bEfluW)Xj8?wA&r0I@5`QzW(GQ;adNQMJ>`1; zvTwxMp!LSD1y0{#H-?wD(|&LK>)rNy*=zTdn?4BJ@%fo>*`xJ7nxvNnItbe7hiFb zOw2SxYU?96q!y4Ml5(U85&(6~M9Pt}6MGXbM|8sI>?u3T5!zLohpUb^HVNEJ6s_G2 ztt&_EdYbJ_tQ=F1{=coyCbmB9I(ZB1DaY*5-savB?Duc-|HlytLz?s-U28k!&GxE~ z6GmP4*b@K0vjgR*+*uAm2DX%&X{MlZWZeMB*2f5cu=RZ_7E%XZ5dg1kg9e}cgcnVa zOcc}?DIvhJ22Vm*I81_HC5P)T`7<2PP~`=LQV1_zbWCyI=jV8yd&4ilJ@~P6nrD#L zbP}9~Bk?%k8;&(YAY7*rJyD!xc=r?EahzDVLs9!md)K2M<{Bi9XYx3@wZ25X<(nYD z0P!Dw%l%=N`&snJLjUE%^M~I&z8pRBF>^UyYl`qH>1(OoK2U8?Vk3*vmNmFTWf*`W z-*mO2eMHMp+Wc^kQF0s;Rf;CXon~NX8{Sz==cC_ZhNWG=Q8olv=lmha4cr4vR|<)H z8__he6l~lFY4J6CK-@r8`Bgf{2-C|vsUN~ijzP9#=3?`PQ_WA`=TCg%J)V)W!?M&@ z+VjVj*J}7<&}F{SEVuCVBLAb4v!+jW9xjY?LP4wuk!*y;l~T~2A7&$#BBGoJ=3`eR z2&hlu`rs z@J|(0jZ*y=kq`rL8dC~lnTR2@Qjv@KQOsRpNM9wCZ#X4f2)J>n1E`CzI9zgFeU>VO z@q9XG26>o=;mjyGGfqT4GNNgDRkwm2^s30r(==QKkWw)tL^0y6%=Ym2-L)LuRgHF6Jhx(< zbH}e7UkEHt+)SKUPMo;D>$+A=oLSocd^I*$@!pEGyqUb&x_7yC?_%e*;cDyAYNWT~ zzJ2ge#a(M|pKH3(RBaY3u3AgST`uZ7!B_fk#l(e{YHT;&TIj81cV)l|2F|^F<>iG_ ziy(8ba`N_$U6p4LOREgr3P-EaBa5eQM33AEAE`CB&PT5JFS}~Zn~46>_MyFWg98s%KY63MuNK>OGuE{n>smNhjl~ytEXVd$`fK6XB0Zl#+hb#E^h>#nu5&z-(<`qs|w z1?8`L5b(R_5n}#|=Z>FiZoAdB_h#3T<*p;uuFrnBXSwUd_4CWSPFJ3}5fpDlch#at zu1#D^u5kPSzx~$soeM|aF3o2a_pLbj$P=qhXRK+3bB3B${G2a*DR42c+}?AozY@6N zJzCqb2f7K@bX&z$Db9D@^Ku>C3+JotJ#c5E{@cwhG)etp8IEiy^5(9~^8Dc|<5v$X z2Y0ME(V*gn>l*cga;)Qrhvui=KDHd)UGe-P5dC8uZ=3(xe12(v-``DLAN||ESn7LW zsrd`5P6x5-2sMF^9o;v@gUjNtFc2jV@H=`N2{@8YpXtAjUA}PI%@6P<_q(q3uhO73twAmJ4CVMj<-7A?yR+R z-V1psgzWM8Kfc?E$!K)U{d4E$Gj3r}J&E_Yd&3wT(<9Of^XTiLHx~7MiQXvD=m&d? zXxkk}6QaH%7u-JEe^2PM!?n~Zg@1;pRnMOWNwYg@Z!VO(Qb-fsta!}JlveluW|SLhrvnoO zr}W33vd88ItKzdGr#m3`#8!A5( zc87`BiP@6J`XovvYhLQKHM{=Bk@#h+!IP!P1uL@2E`7+Ln9!SGu9~K#?nRZl%#V>^ z8b5{NC;SC<9R1=Eb%MHQC?QP7aBc&invjtot*TSPTn&mRv#TK!@Y04dl&VhC+p9?8 zfsG)lT11uMwb?T9Xxe&YiDUj| zY}ayZ*Ui|T<=CFZKs9z4crx0xc>X6Zz4y}f$c^aJ6%XR`+jhVE@>?%gx9tU$mb|AJC==@PH!(;mw#}>b`boAM!<}(dY17?~x&+oW6QxSfX=>70;HSxLM zIUP}dZFkT0{(tHJ$LA{j>kt+y31Q*y9{RSdg*K0ZdX9hi=N~?MU0P~8^)SS<9drHo zZaaq1=zRHyjy(grg`al$1|AcBnus8!E5`4jMy0DOc3)-)^!bGejXV#BMipwm5k7jI zDk%9^{4~0;CVb=pK8kX|J+u9*0`J;=&)sQ*Bx(vKNVrt8bBqb*S3OW#^1_#+kDxBZ zJJ$D=++ag5!7nnhX4r+xtsS{4Z|TN|0+EicU;cBj#=-LziX9q@(wCL zSZnP<@d3wdcq#H2E4~xt9D&O%H~6;SJGSr;ZX~Nt&ar8QvUmC#wO(Fa;gDFhc)Qoe z^XK?^-#w20?|Gg4S^n}9_b}R7z!9F`x$1TCq2D*Z$b%9`>F;xn9^QYKL&7HcKieZn A6951J diff --git a/src/testdriver/__pycache__/browser.cpython-312.pyc b/src/testdriver/__pycache__/browser.cpython-312.pyc deleted file mode 100644 index 956759afbb8b271749008080c7031045a9130796..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10497 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 diff --git a/src/testdriver/__pycache__/classification.cpython-312.pyc b/src/testdriver/__pycache__/classification.cpython-312.pyc deleted file mode 100644 index ea83da061588dc1e2da79d108f94a4eccc651799..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11620 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 G$o~Q^aLiW# diff --git a/src/testdriver/__pycache__/crystallization.cpython-312.pyc b/src/testdriver/__pycache__/crystallization.cpython-312.pyc deleted file mode 100644 index 9eee1fbdc993d28ba969e85eea62a900f869ddc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12833 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

    62MTV94om?^%)$Ub#M@zs zI1O-Siuc;<8ZtBGDoa97Av!_ftst&Q%S~;whnL$rXOAs6xBu)2>ss?!xAG9Q!Y!{_ zpxltWS|lWCvPLdwu3uh_j9{%Lg1QNmHHu9_(%5*d5i%#;mPgZJ76k`C1IC>5JVt(`oohBCBR3QS&$(hk9a_E&toTQ7L*lM#W`SUopJVw8mN> zkPJc2+CcbGU5Atcd~4SAh7_UeEQ~&g7PbS$dQ`D)Y(qid=HCJFru0Zv!`j276iZ${ zyqxM-R6CZN+b)kTr@9u^uH|^@^2l<0^P;+WrK$ba@KRHH_Q2K9l9~>%iesf^hQmD@ zY5xMt|3Mn!ORb}71LkU|if%wvfWlZ_v)1D;cK4}g+)Bd80)JwZMq9#a0$Xz(w~e-> zu(i}}sfIC|tXAmPCT81dwL@WUwz{kiEYQ|wYZE+MtFiPJKbfr+&{Kwa!AJrnvH;I& zP&*j)3>!)s0hX2sAOkU1Lp9>F41Gwc!aZ`HLX8`TB4J~J0a7qpE zq#p2w^#CIL2&@3vkl-eD3}(CHrNXIh8X$zF;^`1KJbbX1un*7)$|JROpakp1mISQW z<^|F8q_t>s?~R5$bJkBb@_)KRIIJh$Szm*1U>o;SaMWNERUMLvEI`3W4Q>yeBhQ>Uj^lcG$Ub(-FQu+*M@6GUW2zRRVDTun9~YFYC>(tKBxSwcT4t|^vCW=KQNT$>6jmXOcjal&Hm`~Ll%!@rX6H)rRy?3eK1Sc|W>_o;tW`&6@j5`ac5*CGrbfzo(N zn5kF&OEPS8BM86~uZG~jR4yrY!x>{nS=;V+WlM&z)z23}UzE=}Y1s0+G6XRl1aSs_ zKrjz^^>fFh_OUc+C%*jZp84b}*DlT(Kd*vv zGkxo|_g;VJ_4o95^u^>WpQFpw=v>o+_Wa|B)Y5T%`mO1kz3+eh1MkD!QuD~XHuB}? zQSjl2`rq{rrPZ{`_Jb~}B%~?oRhZ+eSi`}B7!6LICsF%0h}#MidJpL7whe`vWzcN^ z1%4nX%-=-qTOfQDGg1&oOdD*EXvA#9aCg}dieVI^C^i)HL2N^TH-8%h7V|I^^Cl_P za{1VDt0?9Ta;06}gR@8HLW}C)^0w~TV{^|fs@*FuzI1PR>BXVhBFKypHdt|<;dr{rL(l_uIb*V2qdt$!5cTvr*^!DEyTk1V9uXfBii|T<@RSsuX zBXanV{5TR0AC-gCftcZIFtK#Ihy?yBj8`C{@T-PaqQ{FHu2&0;d-L&4gONT%YFbZNOfKT@h~LI@*^cK ztN-3C$vvM+iBF`R3)0R{q~4FEO&?30k0T+uW7+ARPAq diff --git a/src/testdriver/__pycache__/html.cpython-312.pyc b/src/testdriver/__pycache__/html.cpython-312.pyc deleted file mode 100644 index 2151e4c04c6f66dd9007bf278bf05f7ec346b670..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7178 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 DrE&Cu diff --git a/src/testdriver/__pycache__/observers.cpython-312.pyc b/src/testdriver/__pycache__/observers.cpython-312.pyc deleted file mode 100644 index 033be7dd72170073546fa9d17ad8c122de543334..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2910 zcmb_e-D_OO6`%XH-z%+c$#(3}Of1RT)yKN6TT0~M#>gRGjnYOng^kVSYG+n^mAm(D zW@fYOvIav^*p|?y^udAf;RmGaII1YcX@l)X(E$Lo%$Q-)@bJYAs@D3NWfr-m#6>MijodvD+ zy5jBgI&$C$H}G+_?)X0Sz{*=K&?9)Qg9)v=Trw{&e)mTU;G1N?V!*)7S|I9C3^HmC zL4!)f#N6q~K*`s9>em8Rr46_$ZbBO59a@eDp^<>{GQR9`XPwbVV2z44r9MO(aEe7c zz%IuP>iDj|UTb-fH|z?IgSL;EyIvPdu$3YZNQS%Xz9U+U%6!UPwZIBti_ z;XJfzF7*hU8JGM{m|BIr%4h#MoFr;2=u$tlxEBas9RW=J7|}-CI}3}Oh@y%Hpw_Pd zlq&|&0j|cgz)>qxt~ypJ5n8`+M77?1@e(fb*4l=;B%?fNLDEZ*ahIvv@+$Qm<_5U! z_%eeLz6f?|LIIPq4m>4omP3OJ7G_4aY?p-D*c@zDN>-S%ZQp57+YU3f-3Um_lk1#q zzXk6);v{XG1XVa5x9xptvh7=FPhRuU56;zt20hmX#8>O*1m$9pFc+|XjK%EJ%Msr9W9okreFGYL_FKcg;$=lP%@L{3@V<##P__@p9mK@E%cNuAax-cbdE& z0BThQOWd-Sf~&+M2^tRITj3h}LA%VL$H;m^f#6!0 zY)ddu-W}sIl*KrCEGJEw@^Px84h9DZ$sP)@)AnA69(WVE=(;Ap;>X?Zy52(@qaLZW zM&vTO79w=r=ouU4{_|-40l*eG@(u^S5739kbrWo+4lrQ5Az%2wcewq-ZO7fX2a}*@ zf+t*#Nhu-B|eHq{CYyAJ_%iQNn-;jlH;CoE8qj%NNd!Lv{9E+8DdW>>- z&nb9M>oM7qg>~TTS+OqU+v-_yzTcZMQBPY%rNqi3ZK<1WvS5wca!4(8k0@l?P0AWB zmlI~Gn~V5u<_fyhO*pbKFO{;;iKt+w!6%b1#l|Fg0!Wzo+F)2XXfGVOQ|3a$AtX%j zfC);%oHA|0NQE85>tA$3;5@9-Sa?rh15rxK^w4;1-iD9fhc3iqo#f98G{*8(+ z$LCLj6fZ);Z=jv;;J)$6#EIWO-%syMK5_Hv@2-B1vgyVC^E;ELhLbac$(ikmvs=!e ztzq$*LGhXG*`@8H7y8RPv-5xI{h>FUy*QY?xKo%M7Vw~ew`PWC&JWI<-!t^$SbzEb z`OWI)mF>dRAUD06K;`e>y?X2FaPj5A;>(ArltE?t=+xHo)(^J}r9o~EbV`eNbGLHC z;&X%IbBF1aq??6JzDc(W(}Ua$sN|3T_SIj#x;ZmEH9t5t|8Z_%_XJ$%i<9WdGh3y5 zrx!j)TKZ>N|COD&^4*173&XkP!QAp+U%5B;Q!sUQ^YmtZyKwfS-0ZF)tfS}DV10WsO}nS?w$Dv1O!lRYf7M62o12rN&^(|JiI zBvAuFz8gCk6A2<-1R|%$OAqpecYgBsr>6gM<^EF_ZoJU9@0k~N3i!t5{?t7ae_={U( e-j&;jW0F5{UpxM#eo{NOi-1V(iHCBl?(<)3oZlG$ diff --git a/src/testdriver/__pycache__/oracles.cpython-312.pyc b/src/testdriver/__pycache__/oracles.cpython-312.pyc deleted file mode 100644 index d8a11d5fe1a7445b3028f6c568823873b6ad209c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4622 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 diff --git a/src/testdriver/__pycache__/provenance.cpython-312.pyc b/src/testdriver/__pycache__/provenance.cpython-312.pyc deleted file mode 100644 index 71c71369f92c7cad4b69407cf0dcbc50cb3f73ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2366 zcmaJ?%}*Og6rZuz#w-v*AWqr92Mxx$;l0nmZX$-th+&rTagZrzu+6AjkRkL6E6x?EU5@pk=z&HE{S2MP(&s^*JnsY(txi<^3g>_mJ%vy7;|pJ zt%=7Ki6e4W?>gd{E=dlntKboCQQWVby+T&2!h@kA{0a49h|svF!cQc(bsr#D=3Wfz zLdC{+O>zJwhWF2NPFUoru?4Q;DJfRC1l*Jo72%oJOmQWa!eYR#kU1)2a-(Sfp&@s0 z+C#%IYP?y&(3%dDz-y$VVVk+Zd+)$_6LD0=knaq`6<0H4~>hCJsaE0byD#13icx?_Ge-CVGnE*3zP%pFJyX|{*|8SX=!ZvdZEBDp9SkP+M(=UyyU zL|ivy2O$7CxD$t_lN75v_NM`hrBVNg6qmj$SmaF*$7zdoL z0j&XHF5zx-{eiDY)=9NqivSD-{%FXESFEjC&;`~)#V zjG%%BN-a?thO4@YdC-o@$w*yW($kZ-rb`R%C-?5ox-+wLccy1yIJq!$x1>3$HKTN{ z$?Ng4Y83D>(4g|FV=?f5lon`wUs2zo;5f}9rMB{kq)UG~B7 z2PBWdpX}8}Lubr!=%^x?4fL}$`l@$ueR`*7V0~)m)W!9?JLJP{>&;iWzP~bs+;zN{ zMfqcYnr_3D_Hw8KG*yN7wA;fKpq_EE>8Y8p4Obh(wU6#mp`Ze*KadL z;U08!QCNomqfHIR&7z0UQ~Vr0XRxpN;p*J`Ji{{ISzAqbzQA?lWJ_zuNfl(&rW;w? z>?rRC@7CqaDBv(IS|zJd;w%?pgizF0#7q-7M<8Y?4-T z^70HgYOwh&=%rcs49kAqvr19O9osNL>#34})<92ECoHv~I0jN@O1`a)DJ9+0Pjo?o zQf(e;qCG;Q*M(~hVSX$xz&V{zH4bJsi!laiVC(N8gwOqsPVVOi@OAub@EO}jy0?D` T?-%meHjnrR^u3z0 diff --git a/src/testdriver/__pycache__/runner.cpython-312.pyc b/src/testdriver/__pycache__/runner.cpython-312.pyc deleted file mode 100644 index d9431ba1cac3e0c87fb41738216940518bc2aa92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11363 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 rCRl!DCnndt|32058w6pks;De2w diff --git a/src/testdriver/__pycache__/scenario.cpython-312.pyc b/src/testdriver/__pycache__/scenario.cpython-312.pyc deleted file mode 100644 index 3ef1d6055aa3a5728eb0d32862d6b11d40afbed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2217 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 diff --git a/tests/__pycache__/test_agentic_realization.cpython-312-pytest-7.4.4.pyc b/tests/__pycache__/test_agentic_realization.cpython-312-pytest-7.4.4.pyc deleted file mode 100644 index d2ac8c23123c916bfe9acdc3c9da267789ae2fac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21982 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 diff --git a/tests/__pycache__/test_audit_core_e2_use_case.cpython-312-pytest-7.4.4.pyc b/tests/__pycache__/test_audit_core_e2_use_case.cpython-312-pytest-7.4.4.pyc deleted file mode 100644 index 78d416ea218bd30d7830d673a1d442cc71038b57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12422 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 diff --git a/tests/__pycache__/test_classification.cpython-312-pytest-7.4.4.pyc b/tests/__pycache__/test_classification.cpython-312-pytest-7.4.4.pyc deleted file mode 100644 index e875d95186040a9f31036466157b8237bde4510c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30781 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 Vr&mYC_;f=^+&_bJkBWRq{y!YQgyR4J diff --git a/tests/__pycache__/test_kernel_guarantees.cpython-312-pytest-7.4.4.pyc b/tests/__pycache__/test_kernel_guarantees.cpython-312-pytest-7.4.4.pyc deleted file mode 100644 index 0fcf25b8e6b396f926051b044f1d70c6b9b0715a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16114 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 diff --git a/tests/__pycache__/test_kernel_guarantees.cpython-312.pyc b/tests/__pycache__/test_kernel_guarantees.cpython-312.pyc deleted file mode 100644 index 6f6df561844b4bd6c551f67f0b7132b31aba8571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9051 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 W 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 diff --git a/tests/selfverification/__pycache__/__init__.cpython-312.pyc b/tests/selfverification/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 0b3bffb7e06c44edbba6b2ebce24549aeeae6687..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmX@j%ge<81QB9gSs?l`h(HIQS%4zb87dhx8U0o=6fpsLpFwJVS?g!y=cekH=NA&ryk0@&FAkgB{FKt1 YRJ$TppjnJSTnu7-WM*V!EMf+-0F8+zPyhe` diff --git a/tests/selfverification/__pycache__/checks.cpython-312.pyc b/tests/selfverification/__pycache__/checks.cpython-312.pyc deleted file mode 100644 index b46525bbbaa393365f54924bab446e850737bfe8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10530 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 ZO~9R1;(qT9z6<43LB9FRemt=i{U1wxLh1kj diff --git a/tests/selfverification/__pycache__/test_checks_can_fail.cpython-312-pytest-7.4.4.pyc b/tests/selfverification/__pycache__/test_checks_can_fail.cpython-312-pytest-7.4.4.pyc deleted file mode 100644 index 003d529a6a677afd711b5f854786b8f0b2800d4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20586 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 diff --git a/tests/selfverification/__pycache__/test_self_verification.cpython-312-pytest-7.4.4.pyc b/tests/selfverification/__pycache__/test_self_verification.cpython-312-pytest-7.4.4.pyc deleted file mode 100644 index f9e0cff4be238c5c0ec86fc087f802b378741586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15515 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�v?z^kjJX^uGI&)~@Tq>v|H0%IE%O4R(G)~rC^HJxOD4&m#Ezdwn?+U!N%jy%}>_b#IWcu?tfg?Q!`QnfE`(E$X=o+r}132KNK&E$n@=$gi7R3qjMs%m)l&rZc8VJpE)ziy^hEL zj|>dj;yIJXy&GcwJb7qRFCm)6j?5q7vqNCc!(C!klqvG1C`f@pNYlqC_|$rJ zq`vm+p~>~?OZ9b6{R&O5^c;VY-v`q0>IwHN$BD4o)dEN(zw?8d%IF6?(9&)Za-;l0B7@kMau8`9ui z#@q1~j>;7jmQrh$xj4LO?LJ(U5u`Fw`t)*FW$W*EGZOLthQ2l#N%ubDymaXpkFz`& zS0%++JXa;+Ec0)?h_6bD`0AlVAE_XAf_!2m^_mA|RVLCw5fJ(uE|)8tJi&MykHRe5 zm7-Y`nK{U4o}_S1o-%_;BX6)>!xs=p*+FoHz9}Px_`t%ND&P~00Uj_7rPSPM)Q_?Y zga?hs@z9;dvCDcW1_a*2!!DftnC#mG2=sTeVd9hxv!~vj2|S!%bDS6y zk+b7YJ3B?U&iTg0`Fv-CpDQ(h;95>s@Z}tm*zsK*4_-MR0`ZJ+b71A?FayqaOFRwU z$-Ly=ZT?KtIIEM+z?ohrZIY4VxL8h8?IjepR8-lFokprWoEa9w*HS!liKhkd$P;%= zbJqqZVH~RY<8)&3XGjyJt$&_4RKy2O1^o!4SR#c9%paq`7c-*xX+#pG|7;h;P5&kc z7ld!6e=2nRtMKSeVb9MaNip(s0mW@9KIs!WzxHAJ;SW0=`?O6;M;6*{ceabWZapT7 z{kJ+J;xX})ln_aLd*k_yOJd)m*!S+n54Iesi%01UyKhH@2qdU_Ykfog<3seY?BA|Ae#lEfXiIwkSANX>_CV|$2C3jYU$bRPBq diff --git a/usecases/__pycache__/__init__.cpython-312.pyc b/usecases/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index df4655cd3be8d46e5217330b4d3752e17aade148..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmXv~u}T9$5Z%3tBt%l#MT9ME0wxDm79xlSD{T^+G{a_hG^=;JVRlbRI@|n!Utr<4 z*w~s%5DPmYT`KoPr?@W?b9G0k<7^CB4~ zoaywMkJ4GKvoSwAElG}Z6ajq@#s;)uPu$`(2#-@qGN8C3R|w^-B8h{$L1~gFc)b5BikG?nS4ztOIDL0G2zl)Fyy(gn;`H<)jTTcBR#l zX20{*u*`FSXSS;DSa-9DD=@ov(CLT@@-Hx3J@%N&oW edQj!dZ^iVTa?an_`6oMg-)z4&w;$@%i2Wa$a$qe0 diff --git a/usecases/__pycache__/audit_core_e2_tenant_boundary.cpython-312.pyc b/usecases/__pycache__/audit_core_e2_tenant_boundary.cpython-312.pyc deleted file mode 100644 index 8c790cb41edff0aefd19b70b65b5d19387db472c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10754 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