# evals/public_demo — Lane Contract

**ADR:** ADR-0099
**Invariants:**
- ``public_showcase_pure_composition``
- ``public_showcase_all_claims_supported``
- ``public_showcase_json_byte_equality``

## Purpose

Prove that ADR-0099's `core demo showcase` is a single ≤60-second
artifact composing four invariants (determinism, honest unknown,
reviewed learning, multi-hop with trace) **without introducing any
new mechanism**. Every claim it makes is backed by an existing,
shipped, separately-tested adapter.

Reference budget is 60s wall-clock after CGA substrate + denser spine
work (cold RegisterTour alone can exceed 30s on typical dev hardware).

## Cases

- ``determinism_run_to_run_byte_equality`` — two consecutive
  showcase runs produce byte-identical JSON (after stripping
  ``total_runtime_ms``). SHA-256 pinned.
- ``all_claims_supported`` — single run reports
  ``all_claims_supported=True`` and every scene reports
  ``all_claims_supported=True``.
- ``runtime_under_budget`` — total runtime ≤ 60 seconds on the
  reference dev hardware (soft case; hard raise is opt-in via
  ``CORE_SHOWCASE_HARD_BUDGET=1``).
- ``pure_composition_no_new_mechanism`` — grep gate over
  ``core/demos/showcase.py``'s import graph refuses any symbol whose
  module path is not within the existing shipped packages
  (``core/``, ``chat/``, ``generate/``, ``packs/``,
  ``teaching/``, ``evals/`` for adapter-lane bridges).

## Determinism

Two showcase runs produce identical JSON bytes when
``total_runtime_ms`` is excluded (timing is the one legitimate piece
of non-determinism — every other field is pinned by the showcase
contract and the underlying adapter byte-equality from ADR-0098).

## Exit code

Non-zero on any case whose actual outcome diverges from the case spec.

## Known Environment Caveat

**`runtime_under_budget` is environment-sensitive.**

The pinned artifact (`results/v1_dev.json`) records all 4 cases
passing, including `runtime_under_budget` (`divergence: null`).

History: the original 30s budget was repeatedly exceeded on slower or
shared hardware (observed 47–50s during PR gates and post-CGA cold
RegisterTour). Budget was raised to 60s and the showcase hard-raise
was demoted to opt-in (`CORE_SHOWCASE_HARD_BUDGET=1`) so content cases
still complete when wall-clock slips.

This remains a timing signal more than a content regression:

- Content lanes (`determinism_run_to_run_byte_equality`,
  `all_claims_supported`, `pure_composition_no_new_mechanism`) are the
  correctness gate.
- `runtime_under_budget` still fails the lane if wall-clock exceeds 60s
  — that is intentional regression detection for pathological slowdowns.

**Implication for evaluators:** failures well above 60s warrant
profiling (RegisterTour is typically the cold cost center). Content
SHA mismatches are always correctness failures.
