/t27f/graph/ -- where every byte on the page comes from ======================================================= The T27F graph view (epic gHashTag/trinity#1648, RFC gHashTag/trinity#1649). The page draws one box per node and one line per edge of a .t27 spec. It holds no graph, no layout and no verdict of its own: spec_graph_export.t27 reads the spec's bytes into the graph (exact nodes and edges only; at most 192 nodes and 254 edges; over that it refuses, never truncates) spec_graph_view.t27 places, sizes and colours every box and line spec_graph.t27 the graph IR both of them share Both run as t27f.wasm. t27f_graph.js (45 lines, comments included) is the whole of the hand-written graph JavaScript: it loads the wasm, writes the spec's bytes in, loops over nodes and edges and emits SVG. It is one module shared by /t27f/graph/ (graph.js, 8 lines: fetch the picked spec) and by the Spec Explorer's Graph layer (src/components/SpecGraphView.tsx imports it); there is no second copy. The one number it computes is how many characters of "kind name" fit in a box's first line (font size x 0.6, the width of the JetBrains Mono the boxes are set in); the full text is in the box's tooltip. Colours Every box fill, outline, dash and line colour comes from spec_graph_view.t27 (VIEW_LABEL_FILL, VIEW_LABEL_STROKE, VIEW_LABEL_DASH, VIEW_TEXT, VIEW_BACKDROP), changed in gHashTag/t27#10215 (closes #10213). They are the t27.ai site's own tokens (apps/website/src/index.css :root and src/lib/explorerTheme.ts in gHashTag/trinity), not docs/BRAND-KIT.md: exact is the site green 00FF88, derived the golden FFD700, suggested the blue 58A6FF, unknown the muted 8B9490. The dash per label stays distinct (solid, 6, 3, 2) so a label survives a colour-blind reader. The CSS in index.html styles the page chrome only (background, fonts, header, picker); it never recolours a box or a line. Source gHashTag/t27 master 538df0750, specs/t27f/spec_graph_view.t27 (t27#10215) gHashTag/t27 master 290ff17df, the other specs/t27f/ files and specs/tutorial/08_modules_and_arrays.t27 (specs/*.t27 here are byte-identical to those commits) Compiler t27c 0.5.2 (built from gHashTag/t27 90fc25b3b), zig 0.16.0, on the Railway lab Built in gHashTag/t27-mcp wasm/ (export.zig is the hand glue: byte buffers and getters, no spec knowledge; 138 lines), glue last changed in commit 95a9de52b69867c7b43c35727c6ae90ca76523bc (PR gHashTag/t27-mcp#13). It is built with the reel, deck, spec_graph_view, spec_graph_export and spec_graph_outline modules. wasm/BUILD there has the full recipe. Checksums (sha256) t27f.wasm 7b2a0f0caf6eafbeefa8813e9880346fb03d99b190efc396d59d4146aafa1e60 spec_graph_view.mjs 6918f5075e815f182fe854b8beab0d0202f1d1a11dbb67e556e03a4875bac9d4 generated Zig the wasm is built from, not vendored: spec_graph_view.zig 59c2c14184759efaa1c4756d31f0c0b3b037d2d4c127eeed5be8e91bb6df5bab spec_graph_export.zig 5297308f1d54c2688801995d56db402809fc794a7dbe5f28ad119c5b3593ede7 specs/spec_graph.t27 a3dbe0ec5110c48183ebea101109598e8542bb0ffdf9e061c672162d7da03fe7 specs/spec_graph_view.t27 662df660969b2ebccaf99129ea8d9eb41f38ded82ff34e085cf5e07b629e3089 specs/spec_graph_export.t27 ef4ee24d5debc51be4a10835947c86a0211b867dd6ca97890a15198daa744728 specs/ui_plan.t27 383fdfb78aa13f2e48172a20e9863d91aa5147b63b1685be8e3a40667243a3f1 Reproduced on the Railway lab on 2026-10-18 from these vendored specs: t27c gen-js spec_graph_view.t27 gives spec_graph_view.mjs byte for byte; t27c gen spec_graph_view.t27 and spec_graph_export.t27 give the two .zig above; zig build-exe export.zig -target wasm32-freestanding -fno-entry -rdynamic -O ReleaseSmall -femit-bin=t27f.wasm gives t27f.wasm byte for byte. (Generate from a directory laid out as specs/t27f/, so that the `use t27f::...` lines resolve.) Not here yet: derived edges. t27 has the derive pass (spec_graph_derive.t27, t27#10198), but it is a separate module that the wasm glue does not call, and wiring it in means more hand-written glue. Until the wasm exports it, every edge on the page is exact, and the page says so.