🦅 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: ep103The-Blooming-Gate· drop9b575026-6bfc-41f9-8922-947ac8f8923b· session680268a5-a4e8-474e-8fd5-803d7c912410Lineage intent: picked up later by@miadi/inquiry-weaveto 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
| Land | Path | Status |
|---|---|---|
| 🧩 hooks-core | @miadi/hooks-core@0.5.0 · /src/Miadi/packages/hooks-core | DESIGNED · runtime-broken on Node 24 |
| 🌊 tide-runtime | ironsilk@0.9.30 · /usr/local/src/ironsilk/runtime/tide-runtime | LIVE · holds the pane→domain join |
| 📱 gmtermux | /workspace/repos/miadisabelle/gmtermux | LIVE · Yaupon intake gate (skill) |
| 🔊 assembly-voice | /workspace/repos/miadisabelle/assembly-voice | LIVE · disconnected (Redis island) |
| 🖥️ forgewright | /workspace/repos/miadisabelle/forgewright · Next.js · :3131 | LIVE display · ingest spec'd only |
| 🪝 capture | /opt/binscripts/hooks | LIVE · flat file writes |
The eleven seams
| Seam | Status | Reading |
|---|---|---|
capture → _sessiondata | WIRED | Files land. The one seam that actually runs. |
| capture → hooks-core | MISSING | hooks-core broken & uninvoked; capture never pipes to it. |
| hooks-core → tide-runtime | DESIGNED | Layered above tide by design — not connected. |
| hooks-core → hooks-gateway | PLANNED | A future HTTP receiver / queue. On paper. |
| tide-runtime → envelope join | MISSING · KEYSTONE | tide knows pane→domain; the envelope is never told. |
assembly-voice → Redis assembly:voice:events | WIRED | Emits — but the stream is an island; manual trigger. |
perspective.ready → assembly-voice TTS | MISSING | The ep099b bridge. Still manual / CLI-run. |
| gmtermux Yaupon skill → intake / provenance | WIRED | The intake gate exists today, as a skill. |
| forgewright → Medicine-Wheel API :3940 | WIRED | HTTP, not npm. Reads nodes by miadi.artifact-ref.v1. |
| forgewright → inquiry-weave visibility | SPEC'D | rispecs/09 names it. No representation yet. |
forgewright → _sessiondata / hooks-core | MISSING | Display has its own store; event ingestion unbuilt. |
The keystone envelope — which strata are deposited today
| Stratum | Fields an event should carry | Deposited? |
|---|---|---|
| ⏱ WHEN | captured_at · event_seq | ◑ hermes ✓ / claude ✗ |
| 🔧 WHAT | hook_event_name · tool_name · tool_input · tool_use_id · tool_response · duration_ms · effort | ● present ✓ |
| 🤖 WHO·agent | agent_kind · agent_version · session_id · parent_session_id · is_child · subagent_type | ◑ session_id ✓ / lineage ✗ |
| 🧑 WHO·human | os_user · operator (William|Jerry) · lane · permission_mode | ○ missing ✗ |
| 🖥 WHERE·host | host · tailnet_node · platform | ◑ platform ✓ / host ✗ |
| 🧵 WHERE·mux | tmux_session · window · tmux_pane · herdr_pane_id · herdr_room · pane_target · pane_label | ○ known by tide, not stamped ✗ |
| 📁 WHERE·fs | cwd · transcript_path · session_root | ● present ✓ |
| 📜 LEDGER | langfuse_trace_id · observation_id · plan_id | ○ in COAIA, not stamped ✗ |
| 🚌 BUS | event_type (miadi.*) · stream · producer · intended_subscriber · verify_cmd | ○ missing ✗ |
One field tells the whole story — pane_id: 46,724× in the herdr layer, 0× 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.jsonfor hooks-core succeeds and emitsdist/. The Node-24 failureERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPINGis at consumption (a resolver reachingsrc/*.tsundernode_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_STRIPPINGsomiadi-hooksandprocessHookEventrun under Node 24. Consumers/bin must resolve compileddist/, neversrc/*.tsundernode_modules. Acceptance:npm testgreen;echo '{}' | node dist/cli.js claude SessionStartexits 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, WHENevent_seq. Keep mux/routing/ledger out of the idempotency key (asroutingalready 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.pyshape) and stamps the mux block at capture time. Bump0.5.0 → 0.6.0. Acceptance:pane_idin a captured envelope goes 0× → ≥1×. - S3 · Kestrel skill — Author
/home/gmusic/.hermes/skills/miadi/kestrel/SKILL.md: read-onlysession.*navigation wrapping tide'ssession_store+terminal_registry, mode-gated (observer always; controller only when the local human sets it — agents cannot self-enable). Template: the Yaupon skillyaupon-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 viadiscoverPlanPerspectives. - S4b
capture → hooks-coredual-run behindMIADI_HOOKS_CORE=1— additive; delete nothing; preserve Android portability. - S4c forgewright ingestion per
rispecs/09-inquiry-weave-visibility.spec.md— ingest_sessiondata/@miadi/inquiry-weavesync-state alongside the MW-API :3940 fetch.
- S4a
- S5 · Adversarial verification — Per seam, an independent skeptic proves the wire runs, not merely compiles. Keystone metric: envelope
pane_idcount > 0. Non-destruction:/opt/binscripts/hooksintact; 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-coreto run under Node 24. The break is at consumption;tscalready emitsdist/. Ensure themiadi-hooksbin and all consumers resolvedist/, neversrc/*.tsundernode_modules. Fix exports/bin/files without breaking the workspace dev path. Acceptance:npm testgreen;echo '{}' | node dist/cli.js claude SessionStartexits 0. Report the root cause in one line." - S1+S2 keystone (P2, the spine): "Extend
HookEventEnvelopewith the optional traceability block (WHO·human, WHERE·host, WHERE·mux, LEDGER, BUS, WHO·agent lineage, WHENevent_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 carriestmux_pane/herdr_pane_id. Acceptance:pane_id0 → ≥1." - S3 Kestrel: "Author
/home/gmusic/.hermes/skills/miadi/kestrel/SKILL.md— read-onlysession.*navigation wrapping tide'ssession_store+terminal_registry; mode-gate exactly likenavigator.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 itsbuild_event()→Redisassembly:voice:eventspath; replace the manual/CLI trigger; keep the manual path as fallback." - S4b dual-run: "In
/opt/binscripts/hooks, behindMIADI_HOOKS_CORE=1, each flavor also pipes stdin tomiadi-hooks <agent> <event>after its flat write. Delete nothing. PreserveMIADI_HOOKS_SCRIPT_DIR/MIADI_SESSIONDATA_ROOTportability." - S4c forgewright: "Implement the read path in
rispecs/09-inquiry-weave-visibility.spec.mdso forgewright ingests_sessiondata/@miadi/inquiry-weavesync-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, countpane_id/herdr_pane_idin a freshly captured_sessiondataenvelope. 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-weaveepisode-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_PLANPhase 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#numberrefs; noCloses #; no milestone#id.
🧭 The Four Directions of this inquiry
| Direction | In this ceremony |
|---|---|
| 🌅 East · Vision | The survey's keystone — the pane→domain join, seen from above. |
| 🔥 South · Planning & Consent | This issue: the prepared orchestration, held with consent, not yet enacted. |
| 🌊 West · Action | The 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-coredocs: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-weaveopens / 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.