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.
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 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 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 in6894d7f(PR #203, merged 2026-09-11T19:31:10Z); its two site legs merged a few minutes earlier —superposition/superposition.github.io#16(mergeccd441b, 2026-09-11T19:24:49Z) andsuperposition/mage#82(merge7a798f6, 2026-09-11T19:24:53Z) — so both sites now carry the inlined four-path wordmark and the 180×180 touch icon, andassets/mark/install_mark.py --checkproves 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’s02909f4committed the three figures this entry now carries underdocs/figures/the-mark/—mark-geometry.svg,mark-anatomy.svgandturntable.glb. The mark itself is not among the entries T42 gave a hero:c9f77f0addedhero.webpto the three milestone entriesthe-connectome-as-a-prior,the-ladderandthe-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.