← Back to Articles & Artefacts
artefactseast

🦅 Ceremony of Inquiry — The Unwired Pipeline

IAIP Research
ep103-the-blooming-gate---pr-intake-ceremony-runtime

🦅 Ceremony of Inquiry — The Unwired Pipeline

The keystone pane→domain join into the hook envelope · held in delayed resolution

This is the only issue this ceremony will create. It carries the whole payload. Contribution artifact: Hook·Meta·Assembly — The Unwired Pipeline.html — field survey №099b·+1, VERIFIED 2026·07·21, authored by a relational developer of this circle. Vessel: ep103 The-Blooming-Gate · drop 9b575026-6bfc-41f9-8922-947ac8f8923b · session 680268a5-a4e8-474e-8fd5-803d7c912410 Lineage intent: picked up later by @miadi/inquiry-weave to open an episode, branch one, or join a lineage.


🕯️ The Covenant of Delayed Resolution

We are beginning a ceremony, not a build. This issue names the structural tension and holds it.

We will not do it. We will prepare for it.

The survey is verified. The keystone is known. Every seam, prompt, and acceptance test below is prepared and precise. And still — we do not resolve. Holding the space between what is and what must become is the sacred part of the work, not a delay to be rushed past. The tension itself is generative; it is the mana. When the circle chooses to advance, the whole payload is already laid; until then, the charge is allowed to build. Nothing in this issue is an instruction to implement. It is an instruction to see clearly, and wait well.


🌅 The Contribution — the field, read from above

Six lands each exist and work alone. Almost none of the seams between them are wired. The pipeline is a set of neighbours introduced on paper — hooks-core's routing block, forgewright's rispecs, assembly-voice's Redis event — that do not yet call each other.

The six lands

LandPathStatus
🧩 hooks-core@miadi/hooks-core@0.5.0 · /src/Miadi/packages/hooks-coreDESIGNED · runtime-broken on Node 24
🌊 tide-runtimeironsilk@0.9.30 · /usr/local/src/ironsilk/runtime/tide-runtimeLIVE · holds the pane→domain join
📱 gmtermux/workspace/repos/miadisabelle/gmtermuxLIVE · Yaupon intake gate (skill)
🔊 assembly-voice/workspace/repos/miadisabelle/assembly-voiceLIVE · disconnected (Redis island)
🖥️ forgewright/workspace/repos/miadisabelle/forgewright · Next.js · :3131LIVE display · ingest spec'd only
🪝 capture/opt/binscripts/hooksLIVE · flat file writes

The eleven seams

SeamStatusReading
capture → _sessiondataWIREDFiles land. The one seam that actually runs.
capture → hooks-coreMISSINGhooks-core broken & uninvoked; capture never pipes to it.
hooks-core → tide-runtimeDESIGNEDLayered above tide by design — not connected.
hooks-core → hooks-gatewayPLANNEDA future HTTP receiver / queue. On paper.
tide-runtime → envelope joinMISSING · KEYSTONEtide knows pane→domain; the envelope is never told.
assembly-voice → Redis assembly:voice:eventsWIREDEmits — but the stream is an island; manual trigger.
perspective.ready → assembly-voice TTSMISSINGThe ep099b bridge. Still manual / CLI-run.
gmtermux Yaupon skill → intake / provenanceWIREDThe intake gate exists today, as a skill.
forgewright → Medicine-Wheel API :3940WIREDHTTP, not npm. Reads nodes by miadi.artifact-ref.v1.
forgewright → inquiry-weave visibilitySPEC'Drispecs/09 names it. No representation yet.
forgewright → _sessiondata / hooks-coreMISSINGDisplay has its own store; event ingestion unbuilt.

The keystone envelope — which strata are deposited today

StratumFields an event should carryDeposited?
⏱ WHENcaptured_at · event_seq◑ hermes ✓ / claude ✗
🔧 WHAThook_event_name · tool_name · tool_input · tool_use_id · tool_response · duration_ms · effort● present ✓
🤖 WHO·agentagent_kind · agent_version · session_id · parent_session_id · is_child · subagent_type◑ session_id ✓ / lineage ✗
🧑 WHO·humanos_user · operator (William|Jerry) · lane · permission_mode○ missing ✗
🖥 WHERE·hosthost · tailnet_node · platform◑ platform ✓ / host ✗
🧵 WHERE·muxtmux_session · window · tmux_pane · herdr_pane_id · herdr_room · pane_target · pane_labelknown by tide, not stamped ✗
📁 WHERE·fscwd · transcript_path · session_root● present ✓
📜 LEDGERlangfuse_trace_id · observation_id · plan_id○ in COAIA, not stamped ✗
🚌 BUSevent_type (miadi.*) · stream · producer · intended_subscriber · verify_cmd○ missing ✗

One field tells the whole story — pane_id: 46,724× in the herdr layer, in the agent event envelope. tide-runtime already holds it; the flat envelope simply never asks. The join capture → tide-runtime → routing was surveyed and never run.

Codename — 🦅 Kestrel. The eagle's kin that hovers dead-still over the whole field, reads it, then stoops to the exact vole. Lineage: Mighty Eagle → Ironsilk → Yaupon → Kestrel. The target is a read-only skill that lets Jerry and agents hover over all sessions, see the relational web, and stoop to the exact pane/trace — mode-gated like hermes.navigator.v1.

Circle's own reading (grounded against live code, Node v24.18.0): tsc -p tsconfig.build.json for hooks-core succeeds and emits dist/. The Node-24 failure ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING is at consumption (a resolver reaching src/*.ts under node_modules) — so the repair is narrower than "the package is dead." The survey holds; the badge is softened by evidence.


🎯 Structural Tension

DESIRED STATE ── An event captured on any host, any multiplexer, any pane carries the
                 full traceability envelope — including the MUX stratum tide-runtime
                 already knows. From _sessiondata one navigates *exactly where*: which
                 multiplexer, which pane, which lane, which human. Downstream surfaces
                 receive events instead of being manual islands. pane_id: 0× → present.
                 Kestrel (read-only, mode-gated) lets the circle stoop to any trace.
     ▲
     │   the charge that advances — held, not yet released
     │
CURRENT REALITY ─ Six lands work alone. 4/11 seams wired but islanded. hooks-core 0.5.0
                 runtime-broken on Node 24. The envelope is flat. The keystone was
                 surveyed and never run.

Delivery, when the circle advances, is a minor version of @miadi/hooks-core (0.5.0 → 0.6.0: envelope strata + the keystone resolver), one new read-only Kestrel skill, and three downstream wires — all held in dual-run / fallback so nothing is ever deleted before per-agent parity.


🌊 The Whole Payload — the six seams (keystone-first)

  • S0 · hooks-core runtime repair (prerequisite) — Fix ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING so miadi-hooks and processHookEvent run under Node 24. Consumers/bin must resolve compiled dist/, never src/*.ts under node_modules. Acceptance: npm test green; echo '{}' | node dist/cli.js claude SessionStart exits 0. Taxonomy untouched.
  • S1 · Envelope strata extension — Extend HookEventEnvelope (src/envelope.ts) with an optional, additive block carrying WHO·human, WHERE·host, WHERE·mux, LEDGER, BUS, WHO·agent lineage, WHEN event_seq. Keep mux/routing/ledger out of the idempotency key (as routing already is) so replays stay stable; preserve legacy JSONL file-sink parity.
  • S2 · The keystone join — A resolver that reads tide-runtime's pane→domain (session_store.py + terminal_registry.py; zellij_bridge.py shape) and stamps the mux block at capture time. Bump 0.5.0 → 0.6.0. Acceptance: pane_id in a captured envelope goes 0× → ≥1×.
  • S3 · Kestrel skill — Author /home/gmusic/.hermes/skills/miadi/kestrel/SKILL.md: read-only session.* navigation wrapping tide's session_store + terminal_registry, mode-gated (observer always; controller only when the local human sets it — agents cannot self-enable). Template: the Yaupon skill yaupon-composition-intake/SKILL.md.
  • S4 · Downstream seams (parallel, distinct repos)
    • S4a miadi.miette.perspective.ready → assembly-voice TTS — the ep099b bridge, replacing the manual/CLI trigger; hooks-core already surfaces perspectives via discoverPlanPerspectives.
    • S4b capture → hooks-core dual-run behind MIADI_HOOKS_CORE=1 — additive; delete nothing; preserve Android portability.
    • S4c forgewright ingestion per rispecs/09-inquiry-weave-visibility.spec.md — ingest _sessiondata / @miadi/inquiry-weave sync-state alongside the MW-API :3940 fetch.
  • S5 · Adversarial verification — Per seam, an independent skeptic proves the wire runs, not merely compiles. Keystone metric: envelope pane_id count > 0. Non-destruction: /opt/binscripts/hooks intact; dual-run parity held.

⚙️ The Prepared Orchestration (delegation, held ready)

A keystone spine with parallel downstream — a workflow of agents, prepared as prompts. Not launched. This is the shape the doing will take when the circle says so.

Phase 0  Ground-truth   6 read-only readers (one per land) → go/no-go per seam
Phase 1  Repair         S0 hooks-core (1 agent) — gate: tests green under Node 24
Phase 2  Keystone       S1 strata + S2 pane→domain join (1 agent) — THE SPINE
Phase 3  Downstream     ∥ S3 Kestrel · S4a TTS bridge · S4b dual-run · S4c forgewright
Phase 4  Verify         ∥ adversarial per seam — "does it RUN?"; pane_id 0→N
Phase 5  Synthesis      PR set (no "Closes #") + @miadi/inquiry-weave lineage note

Phase-3 agents each edit a different repo, so they do not collide; hooks-core edits are confined to the single sequential P1→P2 spine — no worktree isolation needed.

The delegation prompts (the payload each agent would carry):

  • Readers (P0, read-only, one per land): "You are grounding the field survey against LIVE code. DO NOT EDIT. For LAND <land> at <path>, confirm/refute each survey claim with file:line evidence; give the exact insertion point(s) for its seam; return a go/no-go with the blocking reason if no-go." — Foci: hooks-core (reproduce the Node-24 consumption break; envelope/sessiondata/sinks shape) · tide-runtime (the read API for pane→domain) · capture (which stratum each flavor stamps; where a dual-run pipe attaches) · assembly-voice (build_event(), Redis, the manual trigger) · forgewright (rispecs/09, chronicle/client.ts) · gmtermux (the Yaupon template + /home/gmusic/.hermes/skills/miadi/ namespace).
  • S0 repair (P1): "Repair @miadi/hooks-core to run under Node 24. The break is at consumption; tsc already emits dist/. Ensure the miadi-hooks bin and all consumers resolve dist/, never src/*.ts under node_modules. Fix exports/bin/files without breaking the workspace dev path. Acceptance: npm test green; echo '{}' | node dist/cli.js claude SessionStart exits 0. Report the root cause in one line."
  • S1+S2 keystone (P2, the spine): "Extend HookEventEnvelope with the optional traceability block (WHO·human, WHERE·host, WHERE·mux, LEDGER, BUS, WHO·agent lineage, WHEN event_seq); keep mux/routing/ledger out of the idempotency key; preserve JSONL parity. Then wire the keystone: read tide-runtime's pane→domain and stamp the mux block at capture time. Bump 0.5.0 → 0.6.0. Add a test asserting a captured event carries tmux_pane/herdr_pane_id. Acceptance: pane_id 0 → ≥1."
  • S3 Kestrel: "Author /home/gmusic/.hermes/skills/miadi/kestrel/SKILL.md — read-only session.* navigation wrapping tide's session_store + terminal_registry; mode-gate exactly like navigator.skill.yml; use the Yaupon skill as the namespace/frontmatter template; lineage Mighty Eagle → Ironsilk → Yaupon → Kestrel."
  • S4a TTS bridge: "Wire miadi.miette.perspective.ready → assembly-voice TTS, mirroring its build_event()→Redis assembly:voice:events path; replace the manual/CLI trigger; keep the manual path as fallback."
  • S4b dual-run: "In /opt/binscripts/hooks, behind MIADI_HOOKS_CORE=1, each flavor also pipes stdin to miadi-hooks <agent> <event> after its flat write. Delete nothing. Preserve MIADI_HOOKS_SCRIPT_DIR/MIADI_SESSIONDATA_ROOT portability."
  • S4c forgewright: "Implement the read path in rispecs/09-inquiry-weave-visibility.spec.md so forgewright ingests _sessiondata/@miadi/inquiry-weave sync-state alongside its MW-API :3940 fetch. Acceptance: it renders a session/event node it could not before."
  • Verify (P4, skeptic per seam): "Prove seam <seam> RUNS end to end (not that it compiles). Give the exact command/observation and its output. For the keystone, count pane_id/herdr_pane_id in a freshly captured _sessiondata envelope. Default to 'not wired' without runtime evidence."
  • Synthesis (P5): "Assemble the per-repo change set (branch + PR title/body, dual-run noted, no 'Closes #'), the keystone metric (pane_id before/after), and a short @miadi/inquiry-weave episode-lineage note relating this drop (ep103) to survey №099b and ep128."

🔥 Guardrails carried by the ceremony

  • Creative orientation — advance toward the navigable-envelope desired state; resolve the tension between current and desired, never merely patch.
  • Dual-run / fallback — never delete before per-agent parity (mirrors the hooks-core MIGRATION_PLAN Phase 5). Preserve Android portability.
  • Idempotency-key stability — mux/routing/ledger excluded from the key so replays, retries, and future gateway delivery stay safe.
  • Consent-by-design — Kestrel is read-only and mode-gated; agents cannot enable control. Sunwise-aligned.
  • Reference discipline — full owner/repo#number refs; no Closes #; no milestone #id.

🧭 The Four Directions of this inquiry

DirectionIn this ceremony
🌅 East · VisionThe survey's keystone — the pane→domain join, seen from above.
🔥 South · Planning & ConsentThis issue: the prepared orchestration, held with consent, not yet enacted.
🌊 West · ActionThe workflow of agents — kept in delayed resolution, launched only by the circle.
❄️ North · Reflection@miadi/inquiry-weave — weaving this drop into an episode lineage.

❄️ Related & Lineage

  • jgwill/Miadi#392 (unify hook suites + plan-insight), #349 (provider-native extension surface matrix), #354 / #469 (plan-insight reaction as package), #390 (plan-insight hardening), #485 / #484 (ep128 plan-permission + supervised launch), #404 (foundations/tide-runtime-tmuxai)
  • jgwill/binscripts#134 (portable hook paths), jgwill/src#319 (hook refinement)
  • @miadi/hooks-core docs: docs/event-taxonomy.md, docs/distributed-event-architecture.md, MIGRATION_PLAN.md
  • Episodes: ep103 (this drop, The-Blooming-Gate) · field survey №099b (perspective.ready → TTS) · ep128 (gmtermux-cloudflare-r2-jerry-miette-plan-insight)
  • Later: @miadi/inquiry-weave opens / branches / joins an episode lineage from this vessel.

🌸 Miette: Six houses stand on one hill, each with a lantern lit — and the paths between them were drawn on the map but never walked. We didn't walk them tonight. We stood at the trailhead, named the one crossing that would let every lantern finally see the others, and we laid every stake by torchlight so the road is ready — then we let the fire hold. The waiting is not nothing. The waiting is where the charge gathers.