@@ -14,12 +14,15 @@ description: A research software laboratory for finite Wang tilings and inspecta
Tiling Foundry
- Follow one Cubic Monotone 1-in-3 SAT instance through independent Boolean
- and Wang models, the Yang–Zhang construction, two native solver paths,
- explicit verification, and presentation-only views.
+ Can a region be tiled using a fixed set of 23 Wang tiles? Tiling Foundry
+ turns a Cubic Monotone 1-in-3 SAT formula into such a region using the
+ Yang–Zhang construction. Four decision paths compare results, separate
+ checkers validate SAT witnesses, and a PDF dossier records the run.
@@ -32,7 +35,7 @@ description: A research software laboratory for finite Wang tilings and inspecta
- - The fixed tile vocabulary supplies one immutable domain.
+ - The fixed tile vocabulary contains the 23 tiles used by every Wang solver.
- Boolean Z3 checks the source formula.
- Yang–Zhang constructs one finite Wang region.
- Reference and optimized native paths solve the same region.
@@ -45,17 +48,17 @@ description: A research software laboratory for finite Wang tilings and inspecta
Verified output
-
A selected result, not a visual proof
+
A checked tiling from one SAT run
{% include narrative-static.html asset_id="home_preview" image="/assets/narrative/pipeline-overview/home-preview.png" alt="A compact square Wang witness preview for the captured SAT source." width="1520" height="860" label="observed" caption="Selected verified SAT square output for the captured instance." source="wang-solution-v1" %}
- The image is downstream of an independently checked square witness. Read
+ Independent checkers validated the square tiling shown here. Read
the named example for
- its source identity and the
+ its input and checks, and the
visualization component
- for the transformation boundary.
+ for the square, generalized, and hex views of that same witness.
@@ -67,10 +70,12 @@ description: A research software laboratory for finite Wang tilings and inspecta
Use the pipeline story to
- understand responsibilities, the reference index
- for maintained contracts and history, and the
- evidence index for dated,
- source-bound measurements. Reproducible captures remain separately indexed
- under run dossiers.
+ follow the input through each component, the
+ reference index
+ for specifications and implementation guides, and the
+ evidence index for measurements
+ with their dates, inputs, and limits. The
+ dossier guide
+ explains how to run your own input and inspect the recorded result.
diff --git a/docs/pipeline.md b/docs/pipeline.md
index e5de333..bc13168 100644
--- a/docs/pipeline.md
+++ b/docs/pipeline.md
@@ -9,9 +9,12 @@ description: Component order, data flow, independence, and trust boundaries from
# The complete pipeline
-Tiling Foundry keeps construction, decision, verification, and presentation as
-separate responsibilities. A result is useful only when its source identity,
-component boundary, and independent checks remain visible.
+A CM1-in-3 formula enters four decision paths. When they agree on SAT, their
+returned witnesses must pass independent checks. When they agree on UNSAT,
+the run records that result without claiming an independent UNSAT certificate.
+The dossier and optional PDF reuse the recorded input, results, and checks.
+Use the [demo guide]({{ '/run-dossiers/#new-cm1-in-3-input' | relative_url }})
+to run a new formula through this sequence.
{% include narrative-animation.html asset_id="pipeline_overview" animation="/assets/narrative/pipeline-overview/trace.gif" fallback="/assets/narrative/pipeline-overview/frame-07.png" contact_sheet="/assets/narrative/pipeline-overview/contact-sheet.png" alt="The captured formula moves through Boolean Z3, Yang-Zhang reduction, both native solvers, Wang Z3, verification, and presentation." width="1080" height="620" label="observed" caption="One validated v2 capture in fixed component order." source="wang-run-dossier-v2#named-components" %}
@@ -23,7 +26,9 @@ the formula directly. Independently, the
[Yang–Zhang component]({{ '/components/yang-zhang/' | relative_url }}) constructs
a finite region over the fixed [tile vocabulary]({{ '/components/tileset/' | relative_url }}).
The reference solver, optimized solver, and Wang Z3 oracle consume that same
-hash-bound region and tileset.
+region and tileset, identified by their hashes. The paper proves the reduction's
+equivalence; the builder implements it, and the tests check that implementation
+on concrete inputs.
| Step | Input | Output | Relationship |
| --- | --- | --- | --- |
@@ -48,6 +53,7 @@ they do not trust a raster.
- `SAT` is accepted only with the applicable witness checks.
- `UNSAT` from a solver is a terminal observation, not a standalone certificate.
- `UNKNOWN` is preserved where an oracle can return it; it is never rewritten as UNSAT.
+- Timeout, errors, disagreement, or incomplete traces stop the demo; none means UNSAT.
- Trace replay presents recorded semantic events but does not solve again.
- Generalized and hex views are downstream transformations, not new solvers.
diff --git a/docs/plans/2026-09-15-exam-ready-s2.md b/docs/plans/2026-09-15-exam-ready-s2.md
new file mode 100644
index 0000000..34edd89
--- /dev/null
+++ b/docs/plans/2026-09-15-exam-ready-s2.md
@@ -0,0 +1,209 @@
+# Exam Ready S2 — input libero e dossier completo
+
+> **For agentic workers:** usare `superpowers:subagent-driven-development` per
+> eseguire e revisionare i task in sequenza. Il coordinatore verifica la chiusura.
+
+**Goal:** `make demo INPUT=...` produce un dossier/PDF completo e verificato da
+una formula CM1-in-3 nuova, senza risultato atteso fornito dall'utente.
+
+**Architecture:** estendere in modo compatibile i contratti esistenti per
+un'aspettativa assente; riusare la cattura v2 e i suoi consumatori. Un processo
+supervisore gestisce il limite complessivo e l'interruzione del worker e dei
+suoi figli. Nessuna seconda pipeline o seconda esecuzione dei motori.
+
+**Tech stack:** Python stdlib, libreria C e adapter esistenti, ambienti uv
+lockati, Z3, renderer esistente e pdfLaTeX. Linux resta la piattaforma supportata.
+
+**Spec:** sezione S2 di `2026-09-15-exam-ready-v1.0.md`. L'analisi concreta dei
+confini è conservata in `build/exam-ready-s2/contract-design.md`.
+
+## Vincoli globali
+
+- Base di sessione `e179cc1` (S1 verificata e committata localmente).
+- Una PR complessiva in S6; commit locali per checkpoint. Nessun push/merge/tag.
+- Core C, ABI, ownership, oracoli, lock e asset canonici restano invariati.
+- Dossier v1 invariati; dossier v2 precedenti ancora leggibili e generabili.
+- Ogni motore eseguito una volta. Il PDF consuma solo la cattura validata.
+- Input nuovo copiato prima del parsing; hash, esportatori e motori usano quei byte.
+- SAT richiede witness validi; UNSAT non inventa witness o certificati.
+- UNKNOWN, timeout, errori, disaccordo e trace incomplete non producono successo.
+- Non cancellare `examples/sudoku3.cm13`, QA, log, fixture o rollback precedenti.
+- S3 suite narrata, S4 riscrittura documentale e S5 CI/QA finale restano separati.
+
+## Decisioni del design
+
+### Aspettativa assente e risultato osservato
+
+`MultiEngineRunCase.expected_status` diventa `str | None`; nei trasporti il
+campo resta obbligatorio e accetta `null`, `sat` o `unsat`. Il comando diretto
+passa sempre `None`. Builder e validator stabiliscono prima che tutti i quattro
+stati siano terminali e uguali; soltanto dopo controllano un'eventuale aspettativa.
+
+```python
+observed_status = statuses["reference"]
+if any(status not in {"sat", "unsat"} for status in statuses.values()):
+ raise PipelineSnapshotError("full-pipeline dossier forbids UNKNOWN results")
+if any(status != observed_status for status in statuses.values()):
+ raise PipelineSnapshotError("engine status mismatch")
+if case.expected_status is not None and case.expected_status != observed_status:
+ raise PipelineSnapshotError("known expected status mismatch")
+```
+
+Tutti i rami di witness, verifiche, tempi applicabili, asset e PDF usano lo stato
+osservato. `agreement.expected_status` conserva esattamente l'aspettativa, anche
+nulla. Gli stati duplicati in agreement devono coincidere con i rispettivi motori.
+
+Il manifest narrativo autonomo necessita di un discriminante osservato esplicito
+solo nella nuova forma; la forma legacy e gli hash canonici restano invariati:
+
+```json
+{"id":"demo-run","expected_status":null,"observed_status":"sat","source_sha256":"