TEVL is a fixed visual dictionary: the same visual element always represents the same physical quantity, in every scene and every mode. Learn the dictionary once and every particle "fingerprint" becomes readable, comparable, and — crucially — trustworthy about what it does and does not claim.
Three documents sit around this manual and outrank it where they overlap: the normative
TEVL_SPEC.md (the dictionary + rules), the machine-checkable scene_schema.json
(the scene contract), and README.md (the build tracker). This page is the guide.
The honesty contract
Everything in the atlas today is SCHEMATIC or DERIVED_TEMPLATE. Nothing is a solved physical field until it is labelled COMPUTED, which is gated on a native TCH Dirac operator that does not yet exist. Read a scene for its grammar (which channel is which, how they transform), not for the specific numbers. When the operator lands, the amplitudes get real and nothing you learned here changes.Part I
Reading the language
1The one idea
A TEVL scene is not a picture of a particle. It is a statement in a controlled vocabulary about which physical channels the particle populates and how they transform. The camera, distance, framing and timescale are locked identical across all scenes, so fingerprints are directly comparable.
2Status tiers — what you may read off
Every scene, and independently every channel within it, carries one of three tiers. A scene is only as promoted as its least-promoted channel (enforced by rule R1).
| Tier | Trustworthy | Still illustrative |
|---|---|---|
| SCHEMATIC | The vocabulary — which channel is which, and how C acts. | Amplitudes, waveforms, shapes, timing. |
| DERIVED_TEMPLATE | The above plus the certified substrate mesh and any certified transform (the C-map). | Amplitudes still illustrative. |
| COMPUTED | Every displayed value comes from a pinned solver output (hash-referenced). | Nothing — it's real. |
On a SCHEMATIC / DERIVED_TEMPLATE scene you may read which channels are populated vs dark, how they relate and transform, and (in DERIVED_TEMPLATE) the substrate topology. You may not read the waveform, wavelength, amplitude or oscillation rate as physics. Read the grammar, not the numbers.
3The glyph dictionary
▲ marks the review corrections — they are load-bearing, not cosmetic.
| Glyph you see | Means | Gauge | What it can / cannot tell you |
|---|---|---|---|
| Bright soft core | matter_density, |ψ|² envelope | invariant | Something is here. |
| Face fill / glow ▲ | action_density, 1−Re Tr P | invariant | Energy-like, signless. Cannot tell electron from positron. |
| Oriented flux collar ▲ | electric_flux, Φem | invariant | This — and only this — carries charge sign. Converging vs diverging collar = the two signs. |
| Single solid arrow ▲ | prob_current, jprob | invariant | Where the packet is going (travel). |
| Double / rail arrow ▲ | electric_current, jem | invariant | How charge flows. Reversed by C independently of travel. |
| Cyclic hue + tick | phase (U(1)) | gauge-fixed if per-link | Colour is never the sole carrier — a tick duplicates it. |
| Handed helix | chirality, χ=± | invariant | Left/right handedness; rotation sense duplicates it. |
| Precessing frame | spin | invariant | ½ vs 1 by glyph, not asserted numerically. |
| Line texture | gauge_sector U(1)/SU(2)/SU(3) | mixed | Carries the sector even in monochrome. |
| Flux-tube brightness ▲ | colour_singlet_energy | invariant | The public colour channel. |
| Dashed R/G/B ▲ | colour_components (PROPOSITION) | gauge-fixed | Technical overlay only (§evidence). |
Two rules that dominate the whole language
Charge-sign rule. Electron vs positron is invisible in brightness
(action_density is signless). Charge sign lives solely in the flux collar /
electric current. Look at the collar's shape, never at how bright it is.
Two-current rule. prob_current (travel) and
electric_current (charge flow) are separate glyphs — single arrow vs double arrow —
precisely because C moves them differently.
4Gauge tiers — solid vs dashed
Gauge-invariant (solid, full opacity, public): densities, both currents, holonomy magnitudes,
chirality, colour-singlet energy. Gauge-fixed / explanatory (dashed or ghosted, must state a
gauge_convention): the connection/phase field, per-orientation R/G/B, any per-link phase —
these aid intuition but are artifacts of a choice.
Reading rule: if a line is dashed, it is a choice, not a measurement. Pedagogical mode hides gauge-fixed overlays; they appear in Technical mode.
5The C-map — what charge conjugation does
C is a transformation on scene data, so a positron scene is generated from an electron scene. Watch it at the midpoint of the electron GIF:
C flips
electric_fluxsignelectric_currentdirectionphase(conjugated)chirality
C leaves unchanged
prob_current- direction of travel
matter_density
The misconception it corrects
C is not a U-turn. The packet keeps moving the same way; only the charge-related channels reverse. A C-toggle that changes the direction of travel is non-conforming by definition.6Per-particle reading keys
Photon
Fingerprint. Dual cuboctahedron L(Q₃) emphasized, primal faint; a dashed transverse wave; faint face glow; no matter core; a helicity rail so the ribbon reads handed (C=±1).
- One idea
- It's a disturbance in the connection between cells, not a lump inside one — hence it lives on the dual and has no rest frame.
- Certified
- the mesh (bipyramid + L(Q₃) dual).
- Schematic
- wave shape/wavelength; the wave is dashed (connection is gauge-fixed). Coin flux π/2/plaquette is a Technical annotation [evidence: pending].
Electron → Positron
Fingerprint. A moving matter core wearing a flux collar whose shape encodes charge sign; single arrow (prob) and double arrow (electric) shown distinctly; faint face halo.
- One idea
- Watch the midpoint C beat — flux/current/phase/chirality flip, travel and prob-current do not. Brightness never tells you the charge; the collar does.
- Certified
- the mesh; and the C-map as a transform (promotable to DERIVED_TEMPLATE).
- Schematic
- amplitudes; coin phase ±π/4 (spin-½) is a labelled Technical annotation.
Neutrino
Fingerprint. Matter core + prob-current, but no flux collar (neutral → faces dark), only the left-handed twist (νR as a decoupled ghost), and a slow flavour beat.
- One idea
- The absence is the signal — the missing collar is the neutrality; the missing right-handed mode is the chirality.
- Certified
- the mesh.
- Schematic
- the flavour-beat rate and the packet shape.
Baryon
Fingerprint. Three matter cores joined by a breathing flux network (colour-singlet energy, the binding tension pulsing); per-constituent prob-current/electric-flux.
- One idea
- What is physical is the singlet — the breathing whole. The R/G/B on the packets is a dashed Technical-only overlay tagged PROPOSITION.
- Certified
- the mesh.
- Schematic
- the breathing rate; proposition (not public-safe): the R/G/B assignment.
7Display modes & accessibility
Pedagogical (default, public): gauge-invariant channels only. Technical: adds numerical amplitudes, both currents, holonomies, the dashed gauge-fixed overlays, per-channel status, and evidence labels. Monochrome is a first-class rendering: every fingerprint survives it (sector by texture, phase by pulse, charge by collar shape, currents by single-vs-double arrow, chirality by rotation sense). Colour never carries meaning alone — a mandatory redundancy rule.
8Evidence labels
Framework-specific correspondences carry individual evidence labels and are not settled TEVL
semantics until pinned: [8,4,4] ↔ 8 triangular faces (exact combinatorial where certified — but a
face's brightness is action_density, not a qubit readout); coin phases
(electron ±π/4, photon π/2, Technical-only); colour ↔ orientation (a proposition — public
mode shows only colour_singlet_energy; R/G/B appear only as a dashed overlay tagged
PROPOSITION).
Part II
Producing the visualisations
9Architecture at a glance
The whole atlas is a one-way data-flow with the scene schema as its spine. A scene is authored once and never rewritten — solver output later swaps into the same schema.
Two invariants hold at every arrow: (N1) the substrate is only ever the certified geometry, hash-referenced, never hand-drawn; (N2) every displayed quantity declares status + provenance + gauge tier.
10Environment
All tooling runs under the py13_7 venv:
PY=~/bin/py13_7/bin/python3
Required (installed there): numpy, jsonschema, pygltflib +
trimesh (independent glTF loaders for the geometry oracle), playwright + its
Chromium, Pillow, and system ffmpeg/ffprobe on PATH.
11The production pipeline
A · Export the certified geometry
$PY geometry_export.py # → TEVL_GEOMETRY_CERTIFIED, exit 0
Sole-sources the substrate from build_bond_complex, builds the primal bond-bipyramid tile
and its cuboctahedral dual L(Q₃) (the medial polyhedron), and writes three hashed artifacts. Coordinates
are doubled-int (physical = coord/2) so the mesh is byte-reproducible. Stable IDs are
coord-derived: v:<x>_<y>_<z>, e:<vid>|<vid>,
f:<vid>|<vid>|<vid>, d:…. Frames reference elements by
these string IDs, never by array position.
| Artifact | sha256 (current certified) |
|---|---|
geometry.canonical.json | 1ceacce54699589d6e305404520306294a4de52c3bc92d2d815efa53f3f69156 |
geometry.glb | 6fd57ea8c600d867e3d322d5b2be9aef2ff96f71945078d2a70da65c77903a94 |
B · The scene contract
A manifest is validated against scene_schema.json plus three semantic rules
scene_validate.py adds: R1 status-min (a scene may not over-claim vs its
least-promoted channel), R2 geometry-certified (geometry.sha256 must equal a certified
hash — a hand-drawn mesh is rejected), R3 stable-id (every frame element id must exist in the
manifest).
$PY scene_validate.py # → TEVL_SCENE_VALIDATOR_OK (4 valid pass, 8 invalid rejected)
The schema also enforces automatically: gauge_fixed ⇒ gauge_convention;
computed ⇒ evidence_ref; geometry.generator must be the const
build_bond_complex; exactly one of frames_ref / frames_inline.
C · Author a scene generator
Each <particle>_scene.py emits a self-contained HTML app. No Three.js — the
Artifact CSP blocks external scripts, so the renderer is a small hand-written Canvas-2D 3D engine
(rotation matrix + perspective projection + depth-sorted translucent faces). It loads the certified
geometry, declares its manifest inline, validates at author time (a generator refuses to emit an
invalid scene), then substitutes geometry + manifest into the template and exposes the capture API.
import scene_validate as SV
_errs = SV.validate(MANIFEST)
assert not _errs, f"manifest fails step-4 validation: {_errs}"
D · Export media
$PY export_scenes.py # → TEVL_EXPORT_OK, exit 0
Playwright drives the live HTML via window.__tevl (WYSIWYG with the interactive
scene), captures PNG frames, and encodes:
| Output | Encoder | Settings | Committed? |
|---|---|---|---|
video/<s>.webm | ffmpeg libvpx-vp9 | crf 34 | no |
video/<s>.mp4 | ffmpeg libx264 | crf 20 | no |
gif/<s>.gif | ffmpeg palettegen+use | fps 15, 480 px, bayer | no |
sprites/<s>_sprite.png | PIL | 3×3, 9 frames @ 320×200 | yes |
stills/<s>.png | Chromium | HERO frame @ 1600×1000 | yes |
manifest.json | — | sha256 of every output + tool versions | yes |
Frame plan: W,H,N,FPS = 960,600,90,30. The electron plan runs the C-beat
(isPos = i >= N//2), so the positron half is generated from the electron scene at capture
time. A determinism gate re-renders frame 10 and asserts it is byte-identical; a failure rejects
the export.
E · Publish
Publish a <particle>_scene.html directly as an Artifact; publish
exports/contact.html to watch all four; use exports/stills/<s>.png for
paper figures.
12Recipe — add a new particle scene
- Copy the closest generator (
neutrino_scene.pyfor neutral,electron_scene.pyfor charged/with-C). - Write the manifest: pick channels from the dictionary; set each channel's status, gauge_status,
units, evidence_ref; add
gauge_conventionfor any gauge-fixed channel; setproposition: truefor things likecolour_components. Setscene_statusto the minimum of your channels (R1). - Keep
geometry.sha256 = canonical_sha256(R2); reference elements by stable ID (R3). - Implement the fingerprint per the dictionary: brightness = a density (never a sign); charge sign only in a collar; two distinct current arrows; dashed = gauge-fixed; colour never alone.
- Wire the capture API exactly as the others do.
- Add the scene to
SCENES(+ HERO/CAP) inexport_scenes.py. - Run
scene_validate.py→<new>_scene.py→export_scenes.py; commit only when all exit 0.
13Capture API
Every scene exposes a deterministic driver on window so the exporter can render exact
frames from a plain-object plan:
window.__tevl = {
frame: function(o){ // render ONE deterministic frame
window.__cap = 1; // capture mode: opaque bg, no RAF, no transparency
playing = false; auto = false; // freeze animation + auto-rotate
o = o || {};
if("t" in o) t = o.t; // flow/animation time
if("rotY" in o) rotY = o.rotY; // yaw
if("rotX" in o) rotX = o.rotX; // pitch
if("mode" in o) mode = o.mode; // "ped" | "tech"
if("show" in o) Object.assign(show, o.show);
/* scene-specific: photon → chi (±1); electron → isPos (applies C) */
draw();
},
size: function(w,h){ cv.width = w; cv.height = h; }
};
The plan lives in one place — export_scenes.py:
{t: i*0.09, rotY: 0.7 + 2π·i/N, rotX: 0.5, mode: "ped"}, plus
isPos = i >= N//2 for the electron C-beat.
14Guard / oracle catalogue
Every step is self-asserting — exit 0 is the certificate.
| Guard | Proves |
|---|---|
| G1 | Geometry comes exclusively from build_bond_complex — the anti-reversion guard against the truncated-cube / 4.8.8 / regular-octahedron tropism. |
| G2 | Open boundaries + coordinate units retained (doubled-int, boundary-tagged). |
| G3 | Stable IDs deterministic, unique, coord-derived. |
| G4 | Primal cell V6/E12/F8 (Euler 2) and local dual = cuboctahedron 12/24/14 (8 tri + 6 quad). |
| G5 / G5b / G5c | Canonical round-trip; .glb parses in pygltflib with POSITION round-trip; also loads in trimesh. |
| G6 | Canonical-array hash recorded separately from the .glb hash. |
| G7 | Repeated exports are byte-identical. |
| G8 | Primal retained alongside the dual. |
| G9 | Success promotes only the mesh to DERIVED_TEMPLATE; channels stay SCHEMATIC. |
| R1 / R2 / R3 | Scene status-min; certified-geometry hash; stable-id existence. |
| export determinism | Byte-identical re-render of a probe frame; outputs exist, non-empty, right dimensions. |
16Promotion to COMPUTED — the payoff
When a native TCH Dirac operator + pinned solver exist: (1) produce a solver field keyed by the
same stable element IDs; (2) point a channel's data at it and set status: computed with
a non-null evidence_ref; (3) re-run scene_validate.py — R1 promotes the scene
only when every channel is computed. The renderer, schema, geometry, dictionary and C-map do not
change — only the data behind the amplitudes. That data swap is the whole point of the contract.
What gates promotion (and what does not)
Promotion to COMPUTED waits on the native Dirac operator and the fermion gates; physically-normalised scenes additionally wait on A0 (flow-energy normalisation). Construction of the visual language waits on none of these — it proceeds independently at SCHEMATIC / DERIVED_TEMPLATE.Reference — files, hashes, commands
| File | Role |
|---|---|
TEVL_SPEC.md | Normative specification (dictionary + rules). |
scene_schema.json | JSON Schema for a scene manifest. |
MANUAL.md / this page | The guide. |
geometry_export.py | Certified geometry exporter + 9-gate oracle. |
scene_validate.py | Schema + R1/R2/R3 validator + self-test. |
<particle>_scene.py | Interactive scene generators. |
export_scenes.py | Playwright → ffmpeg/PIL export pipeline. |
exports/ | Rendered media (stills/sprites/manifest committed; rest regenerable). |
PY=~/bin/py13_7/bin/python3
$PY geometry_export.py # certify geometry → TEVL_GEOMETRY_CERTIFIED
$PY scene_validate.py # validate contract → TEVL_SCENE_VALIDATOR_OK
$PY storyboard.py # static SVG cards
$PY photon_scene.py # (and electron_/neutrino_/baryon_) → *_scene.html
$PY export_scenes.py # media + determinism gate → TEVL_EXPORT_OK
Rebuild-from-clean order: A → B → C (all four scenes) → D. Every step exits 0 on success; a non-zero exit is a hard stop.