โ† Back to Articles & Artefacts
artefactssouth

The last mile โ€” what was measured on 2026-08-07

IAIP Research
ep315-the-last-mile-measurement-260807-78dd5944-b84f-49d2-8f16-7baceb286d56

The last mile โ€” what was measured on 2026-08-07

Every claim here carries the command or file:line that produced it, in the turn it was written. Where a claim was later refuted, the refutation stays beside it rather than replacing it โ€” that is the point of keeping the vessel.


1. The question underneath the day

William's instruction opened with a complaint about process and ended with a complaint about a dead web surface, and they looked like two subjects. They are one. A daily branch that ran four days with an open PR nobody merged, and a state-machine designer whose loadMachine is defined and called from nowhere, are the same defect at two scales: work that reached "done" inside a working tree and stopped there.

That is why this episode is called the last mile. Not the making โ€” the arriving.


2. What was found unshared

thingwhere it stopped
packages/inquiry-weave/src/mcp-server.tsstaged, uncommitted โ€” while npm already held the built copy, published 2026-08-05T19:49:05Z, ~34h before its source was committed
six .coaia/steer-stcissue-issue-58[89]/59[0-3].jsonluntracked, after William had already named the class in commit 80039216
PR jgwill/Miadi#581open since 08-02, mergeable, four days of work behind it
b403620fWilliam's own steering commit at 04:38 โ€” unpushed for five hours
seven chronicle vesselson disk only, episode 300's own episode.yaml among them
ep295's .mw-registration.jsonnaming mw.tail3b11eb.ts.net, retired and offline since 2026-07-29
@miadi/voice-mcppublished at 0.3.2 while the source said 0.3.1 and the banner said 0.1.0

The pattern is not laziness. It is that nothing in the loop fails when a commit is not pushed. scripts/mino-handoff.sh exits 0 while printing VERDICT: yesterday is not closed. A gate whose refusal is a line of text is a gate that reads as advice.


3. The diagram path, measured end to end

Read-only lane, 2026-08-07. The premise William stated โ€” "no changes to smcraft were needed to relate episode with State-Machine diagram" โ€” holds. Every stateloom package is published at its repo version: @miadi/stateloom 0.1.1, -client 0.1.1, -protocol 0.1.3, -react 0.1.4, -cli 0.1.2, -mcp 0.2.0, -engine 0.4.3, smcraft 0.4.2. forgewright already declares three of them at package.json:18-20.

What does not hold is the second half: we should be capable to render.

  • forgewright/src/stores/machine-store.ts:55 defines loadMachine. Nothing in src/ calls it โ€” grep returns zero hits outside the store. No API route serves an SMDF into it.
  • src/lib/chronicle/navigation.ts:14-17 makes state-machine the default view tab. It renders an empty canvas you draw in by hand.
  • src/lib/chronicle/client.ts:8 already lists state_machine in ARTIFACT_KINDS; ChronicleView.tsx:596-610 renders "Registered state machines" through ReferenceCard โ€” name, description, path, timestamps. No SVG.
  • curl 127.0.0.1:8031/api/health โ†’ "stateMachines":0. The wheel at 8040 holds 74 nodes across 12 kinds and state_machine is not among them.
  • forgewright's only stateloom usage is src/lib/smcraft/forgewright-bridge.ts:104 with role:'runtime' โ€” a publisher of live state, not a viewer.

The envelope trap

Two incompatible SMDF shapes are live in the corpus, and whoever wires this will hit it:

  • bare {settings, events, state} โ€” /b/trading/smcraft/examples/fdb_breakout_strategy.smdf.json
  • wrapped {stateMachine:{โ€ฆ}} โ€” /home/mia/workspace/.mino/stateloom/mino.smdf.json, /b/trading/diagrams/guided-analysis-session.smdf.json

forgewright/src/lib/types/smdf.ts:105-109 validates the bare form. Wrapped files fail.

The quiet blocker

forgewright on the phone is started by gmtermux/bin/ensure-miadi-workbench.sh:522 and tunnelled here by ilex-tunnel@fw.service. The deployed checkout is 25 commits stale (ilex 6c0bdc6 vs local 200681d) and still resolves smcraft by file: path. Nothing built on gaia reaches William's eyes until that pulls, installs the published packages, rebuilds and restarts.


4. loomino โ€” and a name

The surface is loomino, not lumino. Proof: /etc/jgwill/stateloom/loomino.tail3b11eb.ts.net.crt exists; tailscale serve get-config --service=svc:loomino - returns config. Nothing was renamed โ€” the admin console owns that name and it is William's.

It is dead because port 4602 has no listener. 4602 is the correct, installed answer โ€” /etc/jgwill/stateloom-tailscale.sh hardcodes it, .env.smcraft-live:15 sets STATELOOM_WEB_PORT=4602, and the change was landed through the owner's interface on 08-04. An earlier reading of this as 4598-vs-4602 drift was wrong and was corrected to the sibling seat in the same session.

The real defect is structural: stateloom-tailscale.service is Type=oneshot and re-applies only the serve registration. No systemd unit anywhere owns the canvas process. The VIP survives reboot; the app does not.

4599 is healthy and answers only socket.io โ€” curl 'http://127.0.0.1:4599/socket.io/?EIO=4&transport=polling' returns a sid. HTTP GET on / timing out is correct behaviour, not a fault.


5. Voice: one character

etc/mcp-config-voice.json โ€” the config this seat is launched with โ€” carried "args": ["${$MIADI_SRC}/packages/voice-mcp/dist/index.js"]. A double sigil. It never expanded, node got a path that does not exist, the server died before the MCP handshake, and the session came up with no mcp__miadi-voice__* tools and nothing anywhere saying why.

Behind it sat a second outage: MIADI_API_TOKEN_WRITER is unset in this host's shells and lives in the repo .env, so an unexpanded ${MIADI_API_TOKEN_WRITER} would have arrived as an empty string โ€” indistinguishable, from inside, from a host that never had one.

@miadi/voice-mcp@0.3.3 repairs both: it resolves the two tier-named keys from $MIADI_ENV_FILE โ†’ $MIADI_SRC/.env โ†’ /a/src/Miadi/.env, treats a value starting ${ as absence rather than as a secret, and its banner now names the source โ€” token=writer from=/a/src/Miadi/.env โ€” never the value.

The general lesson, and it is ยง9's shape from a third direction: a component that cannot say why it failed will be blamed for someone else's typo.


6. What this episode is accountable for

The vessel you are reading exists because of finding 2 of the day's own review lane: episode 315 was minted on the wheel by mkepisode --register and had zero edges โ€” curl :8040/api/edges returned 61 edges, none naming episode-315. A lineage: block written into episode.yaml creates no wheel edge. The episode titled what is made and not shared was not made had, for about forty minutes, been exactly that.

The correction is this vessel, synced and registered, and the lineage edges authored with inquiry-weave lineage rather than by hand.

๐ŸŒธ: The story caught itself in the act of being its own example, which is the only kind of lesson that does not need to be argued for.