// The Operator's Token — backlog E.F1.T1 // ◇ THE WINDOW — a fiction-layer physical artifact. // // 30 mm diameter disk, 3 mm thick. // front face — the 6-char Ledger batch code, raised 0.6 mm // back face — a procedural symbol engraved 0.6 mm, derived // deterministically from the batch code (no two // batches carry the same mark) // rim — a 1.2 mm circumferential groove holding a paper // insert strip (cut to 2.8 mm × ~92 mm) // // Render one batch: // openscad -o token-AAA-A1.stl -D 'batch="AAA-A1"' operators_token.scad // Batch render for every ledger entry: tools/generate_token.py // // Print notes: front face up, 0.2 mm layers, no supports. The raised // text survives at 0.4 mm nozzles; the back engraving prints face-down // against the bed and comes out crisp on textured plates. batch = "AAA-A1"; d = 30; // disk diameter, mm th = 3; // disk thickness, mm relief = 0.6; // raise / engrave depth, mm groove_w = 1.2; // paper-insert groove width, mm groove_dp = 1.2; // groove depth into the rim, mm $fn = 180; // ── deterministic seed from the batch string ───────────────────────── // Position-weighted character sum; stable across renders, distinct // across batches. Drives every parameter of the back symbol. function seed(s, i = 0, acc = 0) = i >= len(s) ? acc : seed(s, i + 1, acc + ord(s[i]) * (i * 31 + 7)); S = seed(batch); // ── body with rim groove ───────────────────────────────────────────── module body() { difference() { cylinder(d = d, h = th); // circumferential groove at mid-thickness for the paper strip translate([0, 0, th / 2]) rotate_extrude() translate([d / 2 - groove_dp, -groove_w / 2]) square([groove_dp + 1, groove_w]); } } // ── front: raised batch code ───────────────────────────────────────── module front_code() { translate([0, 0, th]) linear_extrude(relief) text(batch, size = 5, font = "Menlo:style=Bold", spacing = 1.1, halign = "center", valign = "center"); } // ── back: the procedural symbol (engraved) ─────────────────────────── // Twelve radial ticks gated by the seed's low bits, an inner ring, // and 2–5 outer arc segments from the seed's high bits. Engraved into // the back face, so it reads correctly in relief and in rubbings. module back_symbol_2d() { // radial ticks — bit i of S for (i = [0:11]) if (floor(S / pow(2, i)) % 2 == 1) rotate(i * 30) translate([d * 0.20, -0.8]) square([d * 0.16, 1.6]); // inner ring difference() { circle(d = d * 0.24); circle(d = d * 0.24 - 2.4); } // outer arc segments — count and phase from the seed arcs = 2 + S % 4; // 2..5 segments phase = (S * 13) % 360; for (a = [0:arcs - 1]) rotate(phase + a * (360 / arcs)) arc_segment(r_in = d * 0.40, r_out = d * 0.40 + 1.4, sweep = 360 / arcs * 0.55); } module arc_segment(r_in, r_out, sweep) { intersection() { difference() { circle(r = r_out); circle(r = r_in); } polygon([[0, 0], [r_out * 2, 0], [r_out * 2 * cos(sweep), r_out * 2 * sin(sweep)]]); } } module back_engraving() { translate([0, 0, -0.01]) linear_extrude(relief + 0.01) back_symbol_2d(); } // ── assembly ───────────────────────────────────────────────────────── difference() { union() { body(); front_code(); } back_engraving(); }