diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl
index c0fa90a..0e9785d 100644
--- a/.beads/issues.jsonl
+++ b/.beads/issues.jsonl
@@ -24,6 +24,7 @@
{"_type":"issue","id":"islandflow-ayo","title":"Drop stale backlog events from live fanout","description":"Follow-up to live freshness rollout: /ws/live was still fanning out stale backlog events for freshness-gated channels, which kept tape panes in Live feed behind despite active synthetic ingest. Gate fanout and cache ingest by freshness for options/nbbo/equities/flow.","status":"closed","priority":1,"issue_type":"bug","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-04-28T21:26:39Z","created_by":"dirtydishes","updated_at":"2026-04-28T21:26:44Z","started_at":"2026-04-28T21:26:44Z","closed_at":"2026-04-28T21:26:44Z","close_reason":"Completed","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-0v6","title":"Fix tape freshness, NBBO coverage, pause controls, and filter popup","description":"Implement the tape fixes requested for synthetic options notional sizing, strict live freshness, live-mode pause/resume behavior, stronger NBBO snapshot coverage, and moving flow filters behind a popup. Includes server-side live cache changes, web terminal state/UI changes, and tests for synthetic pricing, live snapshot freshness/NBBO retention, and live pause/filter interactions.","status":"closed","priority":1,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-04-28T21:02:52Z","created_by":"dirtydishes","updated_at":"2026-04-28T21:13:38Z","started_at":"2026-04-28T21:02:57Z","closed_at":"2026-04-28T21:13:38Z","close_reason":"Completed","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-e4r","title":"Implement smart-money flow filtering and synthetic firehose modes","description":"Implement the approved multi-surface plan for named synthetic market profiles, options raw-vs-signal filtering, live/API filter contracts, Tape page client-side flow filters, firehose-readiness improvements, tests, and README updates.","status":"closed","priority":1,"issue_type":"feature","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-04-28T20:10:49Z","created_by":"dirtydishes","updated_at":"2026-04-28T20:29:29Z","started_at":"2026-04-28T20:10:53Z","closed_at":"2026-04-28T20:29:29Z","close_reason":"Implemented synthetic market profiles, options signal-path filtering, signal-aware API/replay contracts, Tape page filters, tests, and README updates. Follow-up tracked in islandflow-biq.","dependency_count":0,"dependent_count":0,"comment_count":0}
+{"_type":"issue","id":"islandflow-5jt","title":"Add anatomy reference page","description":"Create a standalone docs/anatomy.html reference explaining how prints move through ingest, tape, flow packets, smart-money events, classifier hits, and alerts, including diagrams.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-31T21:20:34Z","created_by":"dirtydishes","updated_at":"2026-05-31T21:25:54Z","started_at":"2026-05-31T21:20:44Z","closed_at":"2026-05-31T21:25:54Z","close_reason":"Added the standalone anatomy reference page and linked it from the docs index.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-cig","title":"Expand CI quality gates","description":"Add a more robust CI workflow for the Bun/TypeScript monorepo, including formatting, linting, type checking, builds, and tests where appropriate.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-30T06:29:33Z","created_by":"dirtydishes","updated_at":"2026-05-30T06:34:11Z","started_at":"2026-05-30T06:29:41Z","closed_at":"2026-05-30T06:34:11Z","close_reason":"Expanded CI quality gates with Biome formatting/linting, public API route checks, Docker snapshot validation, tests, typecheck, and web build validation.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-3l6","title":"fix ci typecheck bun path resolution","description":"Forgejo CI fails in scripts/typecheck.ts because the script shells out to bunx, which expects bun on PATH. The runner installs Bun by absolute path, so the typecheck helper should use the current Bun executable instead of PATH lookup.","status":"closed","priority":2,"issue_type":"bug","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-30T05:34:55Z","created_by":"dirtydishes","updated_at":"2026-05-30T06:00:31Z","started_at":"2026-05-30T05:35:02Z","closed_at":"2026-05-30T06:00:31Z","close_reason":"Fixed the Forgejo CI terminal import mismatch by switching the terminal client component to a namespace import; verified locally and on Forgejo run #56.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-wtg","title":"Harden drawer dialog focus behavior","description":"Fix terminal drawers so they expose modal dialog semantics, trap keyboard focus while open, and restore focus to the invoking control after close.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-29T22:55:25Z","created_by":"dirtydishes","updated_at":"2026-05-29T23:09:45Z","started_at":"2026-05-29T22:56:22Z","closed_at":"2026-05-29T23:09:45Z","close_reason":"Implemented modal dialog semantics, focus trapping, Escape dismissal, focus restoration, validation, and turn documentation.","dependency_count":0,"dependent_count":0,"comment_count":0}
diff --git a/docs/anatomy.html b/docs/anatomy.html
new file mode 100644
index 0000000..0878ff9
--- /dev/null
+++ b/docs/anatomy.html
@@ -0,0 +1,893 @@
+
+
+
+ A compact anatomy map for the path a market print takes through ingest, the live
+ tape, flow packet construction, smart-money profiling, classifier hits, and alerts.
+
+
+
+
+
+
+
+ ingest
+ tape
+ derived
+ profile
+ alert
+
+
+
+
+
+
+
+
+
The pipeline is two paths that meet again
+
+
+ Ingest publishes the live market row. The API can show that row immediately as tape,
+ while compute consumes the signal stream and builds slower, richer derived events from
+ the same traceable print evidence.
+
+
+
+
+
+ 1
+
+ Adapters publish raw market events.
+
+ Options prints, option NBBO, equity prints, and equity quotes land on NATS subjects
+ such as options.prints, options.nbbo, and
+ equities.prints. Each event carries source_ts,
+ ingest_ts, seq, and trace_id.
+
+
+
+
+ 2
+
+ Signal prints become the options tape head.
+
+ The options ingest path enriches prints with contract metadata, NBBO side,
+ notional, ETF classification, and signal_pass. Signal-qualified rows
+ are published to options.prints.signal.
+
+
+
+
+ 3
+
+ Compute clusters print evidence into flow packets.
+
+ Compute consumes signal prints and NBBO context, groups nearby activity, derives
+ features, writes flow_packets, and publishes flow.packets.
+
+
+
+
+ 4
+
+ Parent events, hits, and alerts preserve the evidence chain.
+
+ A flow packet can produce a SmartMoneyEvent, one or more
+ ClassifierHitEvent rows, and an AlertEvent. The resulting
+ alert keeps evidence_refs back to packet and print identifiers.
+
+
+
+
+
+
+
+
+
+
Prints are the smallest inspectable fact
+
+
+ A print is not yet a theory. It is a timed execution row plus enough enrichment to say
+ whether it deserves live attention and whether it can support later inference.
+
+
+
+
+
+
OptionPrint
+
+
option_contract_idThe contract key, parsed into root, expiry, strike, and right when possible.
+
price + sizeThe execution terms used for premium and notional.
+
nbbo_sideWhere the trade printed versus bid, ask, midpoint, missing quote, or stale quote.
+
signal_passWhether the print survives the configured smart-money, balanced, or all mode filter.
+
+
+
+
EquityPrint
+
+
underlying_idThe equity symbol or internal underlying identifier.
+
price + sizeThe trade terms used for candles and equity context.
+
offExchangeFlagA direct flag for off-exchange prints before dark inference adds interpretation.
+
trace_idThe stable evidence handle used for joins, drawers, history, and replay.
+
+
+
+
+
+
+
+
+
Flow packets are parent evidence, not final conclusions
+
+
+ Compute creates a FlowPacket when activity is strong enough to inspect as a
+ grouped unit. It stores member print ids, aggregate features, and join-quality metrics
+ so later events can explain what they used.
+
+
+
+
+
+
+
+
+
+
+
+
Smart-money events turn packet features into profiles
+
+
+ A SmartMoneyEvent is the parent interpretation of a flow packet. It keeps
+ packet ids and member print ids, then records profile probabilities, direction,
+ abstention state, and any suppression reasons.
+
+
+
+
+
+
Profiles
+
+ Current profile ids include institutional_directional,
+ retail_whale, event_driven, vol_seller,
+ arbitrage, and hedge_reactive.
+
+
+
+
Direction
+
+ Direction is normalized as bullish, bearish,
+ neutral, mixed, or unknown, with profile reasons
+ kept beside the probability.
+
+
+
+
Suppression
+
+ Special print context, stale quotes, missing NBBO coverage, or cross-like executions
+ can lower confidence or cause an abstained event rather than a confident call.
+
+
+
+
+
+
+
+
+
Classifier hits are named detections with reasons
+
+
+ Classifiers look at packet and smart-money context, then emit hit events with a
+ classifier id, confidence, direction, and explanation strings. They are deliberately
+ narrower than alerts.
+
+
+
+
+
+
+
+
Layer
+
Primary input
+
Important fields
+
What the operator sees
+
+
+
+
+
FlowPacket
+
Signal option prints and quote context
+
members, features, join_quality
+
Grouped flow row, packet drawer, linked member prints
+
+
+
SmartMoneyEvent
+
One flow packet plus event calendar context when available
Classifier feed row and decorators on linked tape rows
+
+
+
AlertEvent
+
Flow packet plus one or more classifier hits
+
score, severity, hits, evidence_refs
+
Alert row, severity strip, alert context drawer
+
+
+
+
+
+
+
+
+
+
Alerts package evidence for action
+
+
+ Alerts do not replace the underlying evidence. They score it, attach severity, and keep
+ enough references for the UI and API to reconstruct the supporting packet and prints.
+
+ Alert scoring combines packet premium, strongest classifier confidence, and hit count,
+ then maps the score into low, medium, or high
+ severity. The important operational detail is that the alert remains reversible:
+ open it, inspect the hit, inspect the packet, then inspect the print evidence.
+
+
+
+
+
+
+
+
+
Traceability is the contract between live and replay
+
+
+ Every major row carries cursor-friendly time metadata and a trace handle. The live API
+ uses NATS for fresh events, ClickHouse for snapshots and older history, and the same
+ schemas for replay.
+
+
+
+
+
+
Live channels
+
+ The terminal subscribes to channels including options, flow,
+ smart-money, classifier-hits, and alerts. Each
+ channel can deliver snapshots, events, watermarks, and history cursors.
+
+
+
+
History tables
+
+ Derived rows are persisted as flow_packets,
+ smart_money_events, classifier_hits, and
+ alerts. Alert context lookup resolves evidence references across those
+ tables and the option print store.
+