Journal / 11 September 2026

The mark

The psi monogram as geometry — a 738-byte JSON file, an SVG generated from it, and a Blender pipeline whose two runs are byte-identical — with the flat mark and the 3D mesh unable to drift apart.

By Superposition · Updated 11 September 2026

The claim. The sites’ wordmark used to be the glyph ; it is now a psi monogram that exists three ways and can only agree. assets/mark/psi.json is 738 bytes — four closed polygon point lists (stem, left arm, right arm, descender) in a 0..1 unit square, each with a colour key of ink or accent. assets/mark/psi.svg is 1191 bytes generated from it by assets/mark/render_mark.py (8665 bytes), and render_mark.py --check exits non-zero when the committed SVG differs. The SVG is viewBox 0 0 100 100, geometry inset 8 units, stroke 0.085 unit-square units (which renders as 7.14 viewBox units), square caps, mitred joins, #edf0f5 for stem and arms, #91dbba for the descender, transparent, zero <text> elements, content bounding box 18.5,15.5..81,84. The extruded version is a Blender script whose two runs are byte-identical for all six outputs. One source, three renderings, no drift.

Two panels computed from psi.json: left, the centre-line length in viewBox units of each monogram part (stem, left arm, right arm, descender); right, each part's x-extent and y-extent in viewBox units.

Two panels computed from assets/mark/psi.json: left, each part's centre-line length in viewBox units; right, each part's x-extent and y-extent. The chart describes the geometry source, not the mark as rendered.

What we tried

The geometry was moved out of the journal repo. Step 39 says the mark is authored “in the journal repo”. The decision that survived (D-007) is the opposite: superposition/qualia owns assets/mark/{psi.json,render_mark.py,psi.svg}, so the flat mark and the 3D mesh cannot drift from each other or from a second copy, and the sites receive inlined geometry later. T41’s handoff is a patch to the sites, not a push.

The crash left a file of NUL bytes. The session that started T40 died mid-write: assets/mark/build_mark.py was NUL-filled — the ticket’s two comments report the size as 24,106 and 31,261 NUL bytes, and the discrepancy is left as recorded rather than reconciled — and the six artifacts beside it were of unknown provenance. Nothing from that session was kept. The script was re-authored in the repository and every artifact regenerated from it, then proved by running the whole pipeline twice from two fresh copies.

Two sources of nondeterminism had to be closed, and only two were found. Blender stamps PNG Date/RenderTime metadata, so those are switched off in the script; and the threaded exact boolean returns element faces in an order that varies, so the combined mesh is rebuilt in a canonical face order before export. With both closed, the GLB and the five rasters compare byte-identical across runs. The search for a third is not claimed to be exhaustive — it is claimed that two independent runs agree on every file.

The SVG importer reads fills and ignores strokes, so the pipeline took a documented detour. Step 40 says to import psi.svg, convert curves to mesh and extrude. Blender’s io_curve_svg imports the closed polygons’ centre lines and drops the stroke entirely; extruding zero-width lines produces nothing. The script therefore takes the centre lines from the imported SVG, checks them against psi.json, and strokes them under the SVG’s own cap, join and mitre-limit rules before extruding by 0.12 and bevelling by 0.01 in two segments. The deviation is written in the script, not smuggled past the ticket.

Why geometry and not a glyph

A glyph is a font’s opinion. It renders differently in every browser, cannot be extruded honestly, and cannot be checked. Geometry can be checked: render_mark.py --check regenerates the SVG and fails if the bytes differ, so an edit to psi.json that is not re-rendered is caught. The renderer is also the mark’s only rasteriser in this phase — Blender renders the icons at 512, 180 and 32 pixels from the same camera and the same mesh, rather than shelling out to inkscape, rsvg-convert or ImageMagick.

The shape itself is deliberate: a vertical stem with two arms sweeping outward and up from below its head, tapering to points at roughly 33° from horizontal, so the monogram cannot be misread as a plus, plus an accent descender below the baseline. The unit square maps as $v’ = 8 + 84v$ — the 8-unit inset the ticket fixes — so a stroke of 0.085 in unit-square coordinates is 7.14 viewBox units wide. Both numbers are stated in the SVG comment and in the script.

The four parts of the monogram stroked at psi.json's proportions inside the inset-8, viewBox-100 frame psi.svg draws: stem and arms in ink, the descender in accent, each part in a box naming its centre-line length.

The four parts stroked at the geometry source's proportions inside the inset-8, viewBox-100 frame psi.svg draws — stem and arms in ink #edf0f5, the descender in accent #91dbba, each part in a box naming its centre-line length.

The extruded mark plus one pillar per part of psi.json, each pillar's height the part's centre-line length — the chart's number — with a 60-frame rotation baked as an animation. If the viewer script does not load, the same GLB downloads from the same figure.

Evidence

Quantity Value Unit Source
psi.json 738 bytes T39 comment ^1
render_mark.py 8665 bytes same ^1
psi.svg 1191 bytes same ^1
psi.svg SHA-256 (prefix) 42be74cb…272436 same ^1
Polygon lists in the source 4 polygons psi.json
Stroke width 0.085 → 7.14 unit-square → viewBox psi.svg comment
Extrusion / bevel 0.12 / 0.01, 2 segments unit-square build_mark.py
Raster sizes 512, 180, 32 pixels epic Step 40, build_mark.py
--check on a clean tree exit 0 (exit 1 after mutating psi.json) exit code T39 comment ^1
Blender runs byte-identical 6 of 6 files T40 comment ^2
NUL bytes recovered from the crash 31,261 bytes T40 comment ^2
<text> elements in the SVG 0 elements T39 comment ^1

^1 Measured when the mark landed, in a session different from the Blender work. ^2 Measured in the T40 session, which re-authored the script after the crash; the byte-identity comparison is between two runs from two fresh copies on the same host and Blender version (4.3.2).

The commit range this entry describes is a2c1440..ce04eaf — the geometry source through the merge of the Blender pipeline. Its epic is EPIC-11 (#13); tickets T39 #56 and T40 #57 are the tickets described here; T41 #58 landed just after this entry’s period.

What this does not establish

  • The sites were wired after this entry’s period. T41 (#58) landed in 6894d7f (PR #203, merged 2026-09-11T19:31:10Z); its two site legs merged a few minutes earlier — superposition/superposition.github.io#16 (merge ccd441b, 2026-09-11T19:24:49Z) and superposition/mage#82 (merge 7a798f6, 2026-09-11T19:24:53Z) — so both sites now carry the inlined four-path wordmark and the 180×180 touch icon, and assets/mark/install_mark.py --check proves the installed copies have not drifted.
  • The hero and turntable landed after this entry’s period. T42 (#59, one hero render per milestone entry) and T43 (#60, one turntable GLB per entry with a download fallback) landed in PR #206 (b6dfda6, merged 2026-09-11T19:59:10Z) and PR #205 (3cf3706, merged 2026-09-11T20:02:41Z); T43’s 02909f4 committed the three figures this entry now carries under docs/figures/the-mark/mark-geometry.svg, mark-anatomy.svg and turntable.glb. The mark itself is not among the entries T42 gave a hero: c9f77f0 added hero.webp to the three milestone entries the-connectome-as-a-prior, the-ladder and the-front-end-rebuilt-from-lessons, and not to this one.
  • Byte-identity is per host and per Blender version. Two runs agree on this workstation with Blender 4.3.2. A different Blender release is a different rasteriser and may not reproduce the same bytes; no cross-version or cross-machine comparison was made.
  • The 33° reading is a design description, not a measurement. The arm angle comes from how the polygon points were authored; no instrument measured it.
  • The mark has never been seen at 32 pixels by a human in this record. The icon rasters are produced deterministically; whether the 32-pixel icon is legible is a judgement the ticket asserts by construction (“the flat camera is what makes the 32-pixel icon legible”) and no reader test is recorded.