TCH Particle Atlas · TEVL v0.1

TEVL Manual

A reader's guide to the TCH Excitation Visual Language — how to read a particle scene and know exactly what each glyph claims — and an operator's guide to producing the visualisations.

SCHEMATIC mesh · DERIVED_TEMPLATE COMPUTED · gated v0.1

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).

TierTrustworthyStill illustrative
SCHEMATICThe vocabulary — which channel is which, and how C acts.Amplitudes, waveforms, shapes, timing.
DERIVED_TEMPLATEThe above plus the certified substrate mesh and any certified transform (the C-map).Amplitudes still illustrative.
COMPUTEDEvery 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 seeMeansGaugeWhat it can / cannot tell you
Bright soft corematter_density, |ψ|² envelopeinvariantSomething is here.
Face fill / glow action_density, 1−Re Tr PinvariantEnergy-like, signless. Cannot tell electron from positron.
Oriented flux collar electric_flux, ΦeminvariantThis — and only this — carries charge sign. Converging vs diverging collar = the two signs.
Single solid arrow prob_current, jprobinvariantWhere the packet is going (travel).
Double / rail arrow electric_current, jeminvariantHow charge flows. Reversed by C independently of travel.
Cyclic hue + tickphase (U(1))gauge-fixed if per-linkColour is never the sole carrier — a tick duplicates it.
Handed helixchirality, χ=±invariantLeft/right handedness; rotation sense duplicates it.
Precessing framespininvariant½ vs 1 by glyph, not asserted numerically.
Line texturegauge_sector U(1)/SU(2)/SU(3)mixedCarries the sector even in monochrome.
Flux-tube brightness colour_singlet_energyinvariantThe public colour channel.
Dashed R/G/B colour_components (PROPOSITION)gauge-fixedTechnical 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_flux sign
  • electric_current direction
  • phase (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

transverse connection wave on the dual

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

matter with a signed collar, and the C beat

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

the electron minus its electric structure

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

three packets, one breathing singlet

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.

build_bond_complexcertified geometry · single source
geometry_export.py9 gates G1–G9
geometry.canonical.jsonhashed manifest
geometry.glbrender asset
geometry.manifest.jsontwo sha256
scene_schema.json + scene_validate.pythe contract · R1/R2/R3
<particle>_scene.pyembeds geometry + manifest · validates · emits HTML
<particle>_scene.htmlCanvas-2D app · CSP-safe · window.__tevl API
export_scenes.pyPlaywright → PNG frames
WebM / MP4
GIF
sprite sheet
hi-res still
contact.html

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.

Artifactsha256 (current certified)
geometry.canonical.json1ceacce54699589d6e305404520306294a4de52c3bc92d2d815efa53f3f69156
geometry.glb6fd57ea8c600d867e3d322d5b2be9aef2ff96f71945078d2a70da65c77903a94

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:

OutputEncoderSettingsCommitted?
video/<s>.webmffmpeg libvpx-vp9crf 34no
video/<s>.mp4ffmpeg libx264crf 20no
gif/<s>.gifffmpeg palettegen+usefps 15, 480 px, bayerno
sprites/<s>_sprite.pngPIL3×3, 9 frames @ 320×200yes
stills/<s>.pngChromiumHERO frame @ 1600×1000yes
manifest.jsonsha256 of every output + tool versionsyes

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

  1. Copy the closest generator (neutrino_scene.py for neutral, electron_scene.py for charged/with-C).
  2. Write the manifest: pick channels from the dictionary; set each channel's status, gauge_status, units, evidence_ref; add gauge_convention for any gauge-fixed channel; set proposition: true for things like colour_components. Set scene_status to the minimum of your channels (R1).
  3. Keep geometry.sha256 = canonical_sha256 (R2); reference elements by stable ID (R3).
  4. 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.
  5. Wire the capture API exactly as the others do.
  6. Add the scene to SCENES (+ HERO/CAP) in export_scenes.py.
  7. Run scene_validate.py<new>_scene.pyexport_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.

GuardProves
G1Geometry comes exclusively from build_bond_complex — the anti-reversion guard against the truncated-cube / 4.8.8 / regular-octahedron tropism.
G2Open boundaries + coordinate units retained (doubled-int, boundary-tagged).
G3Stable IDs deterministic, unique, coord-derived.
G4Primal cell V6/E12/F8 (Euler 2) and local dual = cuboctahedron 12/24/14 (8 tri + 6 quad).
G5 / G5b / G5cCanonical round-trip; .glb parses in pygltflib with POSITION round-trip; also loads in trimesh.
G6Canonical-array hash recorded separately from the .glb hash.
G7Repeated exports are byte-identical.
G8Primal retained alongside the dual.
G9Success promotes only the mesh to DERIVED_TEMPLATE; channels stay SCHEMATIC.
R1 / R2 / R3Scene status-min; certified-geometry hash; stable-id existence.
export determinismByte-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

FileRole
TEVL_SPEC.mdNormative specification (dictionary + rules).
scene_schema.jsonJSON Schema for a scene manifest.
MANUAL.md / this pageThe guide.
geometry_export.pyCertified geometry exporter + 9-gate oracle.
scene_validate.pySchema + R1/R2/R3 validator + self-test.
<particle>_scene.pyInteractive scene generators.
export_scenes.pyPlaywright → 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.