PicoGK Code-as-CAD (tools/cad)

SkillAI & models

Use when working on the silken_net Code-as-CAD surface, PicoGK voxel/SDF geometry generation in tools/cad/ (the Ti-coin in-vitro coupon, the Zone-1 gyroid anode, the CartesianGyroid SDF, the PEEK Radome, shipped, `dotnet run -- build cem/radome.json`) and the CEM (Computational Engineering Model) manifests that drive them. Knows the non-obvious gotchas, render lattices via `new Voxels(IImplicit, BBox3)` + BoolIntersect NOT voxBounding.voxIntersectImplicit (uncatchable native OpenVDB abort at fine voxel on thin bored parts), headless `Library.Go(voxel, task, bEndAppWithTask:true)` not the stale v1.6 `new Library()`, ImplicitRadialGyroid axis-singularity → cartesian gyroid, dimensionless gyroid wallParam + voxel-dependent porosity (MEASURE it), the voxel-resolution floor, ImplicitUsings-ENABLED for vendored LEAP source, the voxel-FE elasticity tract (`fea` → apparent stiffness of the real part in units of E_solid; **`fea --fit` → the Gibson-Ashby `C`/`n` MEASURED over a wall_param sweep since 2026-09-12**, per-resolution caches under `tools/cad/cache/fea/` pinned to canon by `scripts/fea_canon_sync.rb`; the formula is never our stiffness CALCULATOR, but its coefficients are now our MEASUREMENT, and a single-density `C` is a statement about the GRID, never about the lattice), the resolution-adequacy gate (is a declared feature ≥2 voxels on the grid its own manifest asks for), and the local-verify discipline (`dotnet run -- verify` → metrics.json, exit 0/1). ALSO the engineering-drawing tract: `draw <cem>` → SVG (human) + DXF (factory, GD&T/CMM acceptance) built from the CEM `tolerances`/`notes` blocks, the rule that an absent field prints `NOT SPECIFIED IN CEM` rather than a plausible default, the two readers (SVG clips, DXF does not), and the committed gallery under docs/images/cad that lags its generator unless you re-run it. Routes to 01_02 §6 (PicoGK stack + Noyron methodology + the drawing NORM) + 01_01 §5 (anchor geometry) + tools/cad/README, does not restate. Examples: \"generate the gyroid anchor\", \"add a CEM part / per-species SKU\", \"change anchor Ø / porosity / pore period\", \"why does the anchor crash with 'outside value 0'\", \"add the radial pore gradient\", \"build the Ti-coin STL\", \"make a factory drawing / DXF\", \"add a surface-finish or coating note to a CEM\", \"what is the anchor lattice stiffness / run the FEA\", \"is this feature resolvable at this voxel\", \"set up the .NET CAD project\".

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the PicoGK Code-as-CAD (tools/cad) skill

What this skill tells your AI

The instructions your AI receives, as published by alexey-lukin/silken_net in .claude/skills/picogk/SKILL.md and read by ahel’s review.

Navigation aid + non-obvious gotchas. The SSOT is the docs + code + tools/cad/README.md below — this skill points, it does not restate (so it can't drift). Verify a fact at its home before trusting a summary. Methodology (per LEAP 71 Noyron): a CEM is a deterministic algorithm, not generative ML — an agent writes the generator, the generator computes the geometry.

SSOT Documents — Read These First

DocumentWhat it covers
tools/cad/README.mdOperational home: layout, local-verify recipe, the FULL gotcha list, license
docs/01_02_Ti_6Al_4V_Metallurgy_and_DMLS.md §6PicoGK stack (.NET 9, PicoGK 2.2 NuGet + ShapeKernel/LatticeLibrary submodules), Noyron methodology, real API, honest caveats — and the engineering-drawing NORM: why a drawing is derived from the CEM and not the mesh, the two readers (SVG clips, DXF does not), the loud-absence rule, what the acceptance contract must carry. The tools-local file below stays the RESEARCH + phase roster
docs/01_01_Coaxial_Gyroid_Topology_and_PEEK.md §5/§6Anchor geometry: gyroid 65% porosity, pore gradient 300→100µm, Gibson-Ashby isoelasticity, Ti-coin Stage-2 coupon (A=2cm²+eyelet)
docs/00_07_Action_Plan_Tracker.md HW.1 / HW.33Build state + the anchor geometry audit (founder decisions: orientation-agnostic gyroid (б), Ø11; the June gaps are spent — PEEK/hole chain frozen, FEA-E measured — so the open set is its **Стан:**, split still-judged ⊥ ratified-but-unapplied)
docs/01_01_Coaxial_Gyroid_Topology_and_PEEK.md §6Cross-biome 5-SKU (pine/oak/broadleaf/mangrove/tropical)
docs/00_03_TRL_Matrix_HIL_and_Beyond.md §3.6Code-as-CAD vs generative-AI; In-Silico for the Hardware stream
tools/cad/docs/drawings_program.mdEngineering-drawing program: CEM-native DXF (netDxf) + SVG, the ASME-Y14.5≠projection fix, lattice-as-inspection-card, phased §7 rollout
extern/.../README_ImplicitLibrary.mdLEAP's own implicit/TPMS guide (splitting logic, modular workflow for the graded v2)

Source Files

FileRole
tools/cad/cem/*.jsonCEM manifests — the Git-SSOT parameter inputs (kind discriminator: ti_coin, anchor_zone1, mechanical_lock, cathode_flange, radome, zone2_sleeve, anchor_assembly, anchor_axial_stack)
tools/cad/src/SilkenCad/Program.csCLI dispatch — ⛔ ростер бери з switch у Main, не звідси (він уже раз відстав на три верби): станом на 2026-09-12 це smoke/build/verify/sweep/scan/draw/render/section/probe/fea + RunHeadless (the Library.Go wrapper); draw is pure-managed (no Library.Go), render/section drive the native viewer
tools/cad/src/SilkenCad/Cem.csCEM records + JSON parse (snake_case). Engineering-drawing PMI lives here: optional ToleranceSpec (fits / Lamé-µm / GD&T datums / a LIST of Features, since 2026-09-11 — the single slot it replaced silently capped a part at ONE toleranced size, which is why the cathode flange could not give its own primary datum a dimensional row; a named feature with NO limits still renders, as loud absence) + NotesSpec (material/process/post-process/surface/coating-restriction/lattice-spec/inspection) on each part record — Noyron-native SSOT, fed to draw
tools/cad/src/SilkenCad/Drawing.csCEM-native engineering drawings (draw <cem>): SVG (human) + DXF via netDxf (CAD-native factory deliverable, opens in AutoCAD/Fusion) — no PDF (never built; drawings_program §3). Pure-managed string/entity build, no Library.Go. Consumes the CEM ToleranceSpec/NotesSpec (zero hard-coded eng-text); DrawingStandard param (ISO 1st-angle default / ASME). ⛔ The roster of shipped kinds is Program.Draw's switch, never a prose list here — this line carried one and it was stale within the day. What does NOT rot: each kind is a Drawing.X + Drawing.XDxf pair, and adding one means adding its shipped-CEM round-trip row (gotcha #11) and its gallery pin. Phasing + the kinds deliberately NOT drawn, with their grounds → tools/cad/docs/drawings_program.md §7. ⚠️ gotcha #11
tools/cad/src/SilkenCad/TiCoin.csTi-coin coupon — BaseCylinder disc + BaseRing eyelet, BoolAdd
tools/cad/src/SilkenCad/Zone1Anode.csZone-1 anode + CartesianGyroid:IImplicit (the from-scratch SDF) + Anode() render path
tools/cad/src/SilkenCad/Validation.csgolden-metrics via Voxels.CalculateProperties (porosity needs an envelope ref) + reuses LEAP Measure.fGetSurfaceArea
tools/cad/src/SilkenCad/Connectivity.csARCH.25 two-phase topological audit — SDF-sample + 6-conn flood-fill (open/closed-pore, percolation, solid-island, specific-surface); pure-managed, display-less xUnit. ⊕ Since 2026-09-12 it is also the MESH SOURCE for VoxelFea: SampleRegion (sampling with a phase OVERRIDE — the SDF-invisible bus rod has to be FORCED solid) and LargestComponentMask (membership, which Components does not keep)
tools/cad/src/SilkenCad/VoxelFea.csVoxel-FE пружності (00_07 HW.51/HW.33) — solid-воксель Connectivity.Grid → трилінійний гексаедр; матрично-вільний поелементний множник, 8-кольоровий за парністю вокселя, Якобі-CG. Верб fea. ⛔ Меш бере лише найбільше гране-звʼязне тіло (плавучий острівець = жорсткий рух), відкинуте — рапортується. Стеля оголошена в шапці класу; числа — 01_01 §5.2, кеш tools/cad/cache/fea/ (ВЕРСІОНОВАНИЙ, на відміну від out/)
tools/cad/src/SilkenCad/Resolution.csДостатність роздільності (00_07 HW.51) — чи влазить фіча у воксель, якого просить її збірка. Ходить по РОЗПАРСЕНОМУ дереву записів, не по ключах json, і несе ВИВЕДЕНІ величини (щілина стрижень↔канал, товщина ґратки). HARD-носій — ResolutionTests + рядок у кожному verify-репортері
tools/cad/src/SilkenCad/MechanicalLock.cs§4.3 mechanical lock — MechanicalLockShank asymmetric ratchet-barb + DIN-471 groove SDF on the shank (Zone-1 solid monolithic / Zone-3 channelled); render = solid voxConstruct + thin barb-ridge BoolAdd; self-support metric (Noyron manufacturing-awareness)
tools/cad/src/SilkenCad/CathodeFlange.csДеталь 3 — Zone-3 cathode flange (Ø25): reuses the §4.3 shank/barbs via ShankCem + radial bayonet lugs + bus channel + the capsule's SINGLE face-seal O-ring groove on the top face — depth · width · radii DERIVED from the o_ring block and the socket band shared with the radome (CathodeFlange.ORingGroove*; 00_07 HW.33 branch (а), applied 2026-09-14), nothing stored; the flange sheet draws it as geometry in both readers and its depth tolerance as loud absence
tools/cad/src/SilkenCad/Radome.csДеталь 4 — PEEK radome v2c (Ø25): hollow dome + shield bell + a LOCAL INTERNAL RIM BOSS (Radome.Boss*/SealLand*: socket band lug + clearance outside ⊥ seal land gland width + 2·clearance inside; rim cavity ≤ Ø15.57 at the 80 % gland fill — every term a MINIMUM, a ceiling HW.9 takes as an input, ⚖️ 2026-09-14) + the bayonet socket, cut in the boss's OUTER band only + PCB cavity; the rim is FLAT — the single O-ring groove is the flange's, derived from the o_ring block both manifests carry (gotcha #9 INVERTED — hollow is intended). ⛔ ONE ratified-but-still-shipped divergence lives in this file: the CAP is still a FULL HEMISPHERE where ⚖️ 2026-09-11 ratified a FLAT CROWN with an R5 edge fillet (rise 12.5 → 5.0, height over bark 25.5 → 18.0), and it waits on ⚖️ HW.30 (piezo placement), not on a budget. ⚠️ Applying it silently inflates hollow_fraction, because Validation's reference solid still adds a hemisphere — recompute that formula in the same commit — and bell_rise_mm/bell_radius_mm must become DRIVERS, which today they are not. ⚠️ The raised COLLAR that carries the lugs at Assembly.RequiredLugZMm (20.5) is modelled on NEITHER part — its wall is set by nothing (no bayonet load model), and a placeholder would print on the flange sheet as a decision — so the socket keeps its L-slot shape (clipped to the outer band, pocket socket band − skin = 1.6 deep, skin 0.2) until that leg reshapes it: socket and collar are the female and male halves of one band. verify radome MEASURES the seal land solid over the full rim face (SealLandSolidFraction), the xUnit pins only derive it
tools/cad/src/SilkenCad/Assembly.csCapsule-end mate-audit (Деталь 3↔4, 02_02 §4.4) — bayonet datum via voxApplyTransformation lift + Z/MATE-Ø/RF mismatch + skirt/inboard candidates; pure mate-math (xUnit) + render interference (verify)
tools/cad/src/SilkenCad/Zone2Sleeve.csДеталь 2 — Zone-2 PEEK sleeve (bore Ø11 / OD Ø15 / 50 mm): plain hollow tube via BasePipe (smooth bore; hex + flange-shoulder deferred, bench-gated)
tools/cad/src/SilkenCad/AxialStack.csFull axial stack mate-audit (Зони 1↔2↔3↔4, 02_02 §4.5) — press-fit interference + insertion budget + span; reuses Assembly.Build + Zone-1 envelope; pure mate-math (xUnit) + render (verify)
tools/cad/src/SilkenCad.Leap/vendored LEAP source compiled in (ImplicitUsings ON, warnings relaxed — not ours)
tools/cad/extern/LEAP71_{ShapeKernel,LatticeLibrary}git submodules (source-only; not on NuGet)

Voxel/triangle counts, porosity AND the FE stiffness ratio all drift with voxel size — don't hardcode them ([[feedback_no_volatile_counts]]); MEASURE via verify (geometry) or fea --sweep / fea --fit (stiffness AND the Gibson-Ashby coefficients — a single row is an UPPER bound by construction, and the FITTED C itself still moves with the step (0.954 · 0.989 · 0.983 at period/16 · /24 · /32), so nothing is quoted without its convergence ladder).

State (what is built / open ⚖️ / curator lessons) lives in memory, not here: [[project_picogk_code_as_cad]] (⊕ its journal twin [[log_picogk_cad]] — the BODIES were evicted there 2026-09-12, so a pin followed from the parent alone lands on a rule without its numbers) · [[project_bus_monolithic_onehome]] (bus topology + the PEEK-liner trap below) · [[project_coin_bakeoff_trl4]] (the Ti-coin keystone this CAD feeds). This pointer was missing until 2026-08-08 — every sibling skill (ssot-maintenance, ml-engineering, web3-pipeline) carried one and this file did not, so CAD state was reachable only by someone who already knew it existed.

Gotchas Not Obvious From Docs

  1. 🔴 tools/cad/cem/*.json is the parameter SSOT, and its liner 0.15 mm is now a RATIFIED branch — but read why before you touch it. For months that number silently elected PEEK while 01_01 §1.4 still called the implementation open: Parylene ~10 µm and TiO₂ ~0.1–10 µm cannot reach 0.15 mm, so a frozen dimension had decided an undecided question. ⚖️ Closed 2026-09-10 in PEEK's favour — the liner is STRUCTURAL — and its STRUCTURAL half was RE-OPENED 2026-09-10 (00_07 HW.34). The ground was «without lateral support not one of the six bake-off alloys reaches infinite fatigue life at the canon rod Ø1.0», and that ground is an AS-PRINTED number: 55_bus_mechanical derates endurance by AS_PRINTED_DERATE, so the rod-fabrication verdict of the next day (a welded cold-drawn wire) doubles every safety factor. 🔴 Measured 2026-09-11 the doubling cleared only FOUR (Ta 1.41 · CP-Ti 1.96 under the SF-2 line) — and that reading was RETIRED 2026-09-12 with the span it rode: at the CEM-derived 23 mm protrusion every alloy clears bare on the welded branch (SF 2.21–6.08, binding Ta 2.21), and the printed branch predicts no failure either (1.10–3.04). ⛔ Do not quote «four of six» — it is an era-36 figure. ⛔ The model is a homogeneous cantilever, so the ×2 describes the WIRE, not the JOINT — ⊕ but since 2026-09-12 the seam is BOUNDED rather than unpriced: its knockdown k is measured nowhere, so 55 inverts the question and reports the break-even k instead (binding candidate Ta) — ⛔ and the bound REVERSED on 2026-09-12 when the rod protrusion was corrected (break-even 0.554 against our own AS_PRINTED_DERATE = 0.50, −0.054), then was RETIRED outright on 2026-09-14: the stress it was inverted from is a free-cantilever root stress at a free-shape crossing station, which no equilibrium configuration produces, and the root sees two regimes (a bracketed coaxial drag ⊥ a static mean from a channel offset) that no single fully-reversed k can price without a mean-stress model the tree lacks (55 §weld_seam.break_even_k_not_derived_because; the root loading per regime and geometry is what the cache carries instead). So there is no house number bracketing the weld at all — k comes from the vendor.RE-JUDGED the same day (⚖️ founder 2026-09-11): the liner stays STRUCTURAL, and the whole fatigue ground was RETIRED rather than narrowed. Both L_FREE_* columns are FREE cantilevers — no wall anywhere — while the rod threads a Ø1.35 bore, so at the ~165 µm play a 10 µm film leaves, the rod takes up the play and bears on the wall inside the bore. ✅ That station was RE-DERIVED 2026-09-14 on the contact equilibrium (tools/in_silico/lib/beam_contact.py, one solver for scripts 55 and 68): the free-cantilever reading at full drag was never a station — on a coaxial channel the wall is met only at the EXIT (the liner's flush end) on every swept µ and every geometry, the mouth is never reached, and the root stress against a rigid wall (8.04 MPa on the placeholder, µ-invariant) is the LOWER end of a bracket to the Ti-bore stop (56.3 MPa at µ 0.5) — the contact compliance that places it is unmeasured — while a channel off the root axis by more than the play makes the mouth a contact station and puts a MEAN on the root. Every «bears N mm in / on the mouth edge on µ …» figure in this entry is a free-shape crossing and RETIRED; the ratified verdicts stand with their grounds corrected beside them (01_01 §1.4), the channel-coaxiality ⚖️ stays open (00_07 HW.34). 🔴 «on every µ the script sweeps» stood here and was falsified by the protrusion fix (2026-09-12), NOT by a new argument: a 23 mm span is a stiffer rod, so a conformal film now first touches the wall at 13.9–23.0 mm, i.e. past the bore end at the lowest swept µ (0.2) only — it still bears on µ 0.3–0.5. ⚖️ The ratified verdict holds — the SHIPPED branch (PEEK liner) touches down on every µ (at the EXIT, per the equilibrium above; the «past the mouth / on the mouth edge» stations this line used to carry are retired) — but the argument against the REJECTED conformal branches is weaker than this line claimed: they touch down on part of the sweep («two lowest µ» and «no longer empty» came from a regime label that read «not on every µ» as «never», fixed in 55 2026-09-14; since the equilibrium re-derivation the same day the per-branch answer is clearance_regime.branches[].touches_down_on_mus with an explicit quantifier — on the placeholder the films touch down at the exit on µ 0.3–0.5, across the lock window on every µ). For the shipped branch an unsupported SF is still a number for a configuration that does not exist. What carries instead is WEAR: the same contact makes rubbing geometrically forced, and a 10 µm film is being asked to be a bearing in a THROUGH bore of L/D ≈ 12.6 whose wear-through is a ~0.5 V anode↔cathode short (the ratio is DERIVED in the cache since 2026-09-11 — clearance_regime.channel.aspect_ratio_l_over_d — so it moves with the channel Ø instead of being retyped). 🔑 Two portable halves. (a) Before quoting an idealised SF, ask what the idealisation ASSUMES AWAY — here a wall the real part has; a free-cantilever number is not conservative when the omitted feature changes the regime rather than the magnitude. (b) The thermal sense here is INVERTED relative to the Zone1↔2 press-fit the corpus models: PEEK is the INNER part, so cooling shrinks it AWAY from the Ti wall (~2 µm diametral over 40 K), where in Zone1↔2 cooling grips harder. The INSULATION half was never in dispute. 🔑 What survives as the lesson, and it is the reason this entry stays: the contradiction lived in the CANON PROSE, and the manifest was the symptom — patching the JSON toward another branch would have broken the AxialStack.BusRodClears F3 gate (rod + 2×liner ≤ channel) instead of settling anything. ⚠️ Both halves of the sentence that used to close this entry are now spent, and in opposite ways. F3 was and blessed a ZERO-clearance stack — it is < since 2026-09-11, because the clearance verdict opened the channel to Ø1.35 and made zero a state nobody intends (pin: Zero_Nominal_Clearance_Is_Not_A_Pass__The_Pre_Verdict_Channel). And clearance ALLOCATION is no longer an open leg — direction and size are both ratified (00_07 HW.34, branch (в)); what stays open is the ROD side (drawn-wire tolerance and Sa, in no canon) and the diametral BAND of the machined bore, which is an RFQ answer, not a computation. The gate still judges NOMINALS only.

0b. 🔴 A manifest can be silent for a SECOND reason, and this one is worse than a default: the record has no SLOT, so the key you write EVAPORATES. Cem.Parse runs without UnmappedMemberHandling.Disallow, so an unmapped member is dropped without a word — and until 2026-09-11 AnchorCem (every anchor_zone1.*) and RadomeCem had no Notes property at all. A notes block written into those manifests would have parsed cleanly, rendered nowhere, and read as done; the tracker leg that asked for it (00_07 HW.1) described the gap as «the manifests do not carry notes», which is the symptom, not the mechanism. ⊕ The tell that this is a distinct shape from 0a: there a WRONG value is in force, here NO value exists and nothing says so. 🔑 Reflex before writing any new CEM field: grep the record in Cem.cs for the property FIRST — a JSON key with no matching property is not a small mistake, it is an invisible one. ⚠️ And the same absence hides in the opposite direction: Drawing renders a FIXED field set, so a field the record holds but the generator's kind never draws is equally mute. ⛔ Carriers, since neither is gated: the notes are pinned present by AnchorTests.Every_Shipped_Anchor_Cem_Declares_Its_Coating_Restriction — declared ceiling PRESENCE, never correctness. 🔴 The carrier half CLOSED 2026-09-11 (draw anchor_zone1 + draw zone2_sleeve), and closing it proved this gotcha catches a FIELD and not a CLASS: AnchorCem had no Tolerances property either, so the very next block written into those manifests would have evaporated exactly the same way, one day after the Notes fix. The two holes sat in one record and the first pass saw only the one it was looking for. So the reflex is not «grep the record for THIS property» but «list what the record holds against what the schema offers» — the absence you are not hunting is the one that survives. radome stays deliberately undrawn (its cap is still the hemisphere the ratified flat crown rejects — ⚖️ HW.30, HW.33; the rim boss and flat rim ARE applied), so its notes are still a source without a carrier (00_07 HW.1). ⊕ Worth carrying from the same pass: the production ORDER of 01_02 §1.3 (print+HIP → hot press-fit → EAAE → bake) puts the press-fit shank surfaces inside the PEEK joint BEFORE etching, so the dual-scale Sa/Sv spec does not reach them — a CONSEQUENCE on two unverified conditions, not a spec: the order sits under an open ⚖️ (00_07 HW.34), and nobody has measured that the press-fit masks the etch (00_07 HW.26). A coating there is a FIT problem (2t of interference), not a DET one, on either branch.

0a. 🔴 «CEM json = parameter SSOT» is true only where the manifest SPEAKS — and cem_canon_sync guards exactly that half, so the silent half has no gate at all. Where a manifest omits a field, the effective geometry is the Cem.cs record default, and nothing binds that default to canon: the guard reads cem/*.json, and the C# xUnit pins the defaults against numbers hand-written in the TEST (that arrangement locked an off-spec groove once — repaired, see the guard's header). Measured 2026-09-09 (00_07 HW.45): 14 such fields, all in the assembly-level manifests (anchor_assembly*.json, anchor_axial_stack.json), and the sharpest are the ones that CROSS machine halves — o_ring_gap_mm = 1.424f WAS derived from in-silico script 52 (ORING_CS 1.78 × 0.80 — the pre-verdict 20 % squeeze: ⚖️ 2026-09-10 ratified 24.5 % in ONE flange groove against a flat rim, APPLIED 2026-09-14 — the field is GONE, not zeroed, the squeeze is the flange groove's own derived depth (CathodeFlangeCem.ORing), and the gland spec now crosses the halves EXPLICITLY: both manifests carry the o_ring block, 52 reads it back and refuses a mismatch, RadomeTests pins the C# derivation against 52's cache), rf_clearance_min_mm = 12f mirrors 02_01 §5.3, and zone1_insertion_mm = 30 carries no provenance comment at all while the same 30 lives in scripts 54/58 and in a JSON _note sentence. 🔴 «All correct today» stood here until 2026-09-11 and it was FALSE for the very field this entry uses as its example — rf_clearance_min_mm = 12f. 02_01 §5.3, the home it names, requires «≥ 8 мм (мінімум), бажано 10–15» with «λ/40 = 8.6» as the ground and «HFSS обовʼязкова якщо < 10» as the trigger; the only 12 there is the OUTCOME of a proposed two-deck layout («standoff 8–10 над Power Deck, що стоїть ~2 над фланцем → ~12 ✓»). So the constant mirrors a design POINT as if it were a floor, and 52_z_stack_tolerance.RF_ANT_TI_CLEARANCE_MIN = 12.0 mirrors it again in the other machine half. 🔑 Why the check passed anyway, and this is the portable half: the verification was of the ADDRESS, not of the CLAUSE. «§5.3 exists and is about antenna↔Ti clearance» is true; «§5.3 requires 12» was never read. ⊕ git log -S prices it: the canon row was born 2026-05-16 (4228f53a), the 12 a month later in two commits of one day (02469300 code · 52eb1f8a docs), and it now stands in nine homes — one date, ONE witness, and contradicting its own source from birth. ⚠️ The in-silico half already had the rule that catches this and it was never applied here: skill in-silico #9 — if canon gives a RANGE, say which END you took and why. The 12 took neither end. Practice: a record default that can be the EFFECTIVE value names its home in the comment beside it (canon row · CEM field · the in-silico script that computes it) — and «names its home» means you OPENED the home and read the clause, not that the address resolves; changing a number in one machine half, ask which artefact in the OTHER half re-states it, because the two share no identifier vocabulary and grep across them only works on the VALUE.

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
22
Forks
1
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
picogk
Source
github.com/alexey-lukin/silken_net