diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl
index c5a49ac..58e5b6b 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-dk5","title":"Remove frontend cooker route","description":"Remove the experimental /frontend-cooker page and update repository references that still list it as an available public route.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-29T13:50:38Z","created_by":"dirtydishes","updated_at":"2026-05-29T13:53:05Z","started_at":"2026-05-29T13:50:48Z","closed_at":"2026-05-29T13:53:05Z","close_reason":"Removed the /frontend-cooker Next.js route, cleaned route/scanner references, documented the work, and validated the web build.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-ep2","title":"Configure Impeccable live mode","description":"Initialize the repository's Impeccable live-mode configuration so future design iteration can start without first-time setup.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-29T08:03:47Z","created_by":"dirtydishes","updated_at":"2026-05-29T08:05:01Z","started_at":"2026-05-29T08:03:52Z","closed_at":"2026-05-29T08:05:01Z","close_reason":"Configured Impeccable live mode and documented validation.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-9en","title":"Install Impeccable skill for Codex","description":"Install the Impeccable skill in the Codex-compatible project locations after the upstream installer selected unused harness folders.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-29T07:59:10Z","created_by":"dirtydishes","updated_at":"2026-05-29T07:59:22Z","started_at":"2026-05-29T07:59:18Z","closed_at":"2026-05-29T07:59:22Z","close_reason":"Installed Impeccable into .agents and mirrored it into .codex/skills for Codex use.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-444","title":"Add typecheck to Forgejo CI","description":"Forgejo CI already validates PRs and pushes to main, but it does not run the new repository-wide typecheck gate. Add bun run typecheck before tests so type drift fails early in CI.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-29T06:27:47Z","created_by":"dirtydishes","updated_at":"2026-05-29T06:29:33Z","started_at":"2026-05-29T06:27:49Z","closed_at":"2026-05-29T06:29:33Z","close_reason":"Added repository typecheck to the Forgejo PR/main CI workflow.","dependency_count":0,"dependent_count":0,"comment_count":0}
diff --git a/apps/web/app/frontend-cooker/frontend-cooker.module.css b/apps/web/app/frontend-cooker/frontend-cooker.module.css
deleted file mode 100644
index 34df997..0000000
--- a/apps/web/app/frontend-cooker/frontend-cooker.module.css
+++ /dev/null
@@ -1,2 +0,0 @@
-.cookerShell{min-height:100vh;display:grid;grid-template-columns:280px 1fr;background:#080806;color:#f4efe3}.chrome{position:sticky;top:0;height:100vh;padding:18px;display:flex;flex-direction:column;gap:22px;background:#111;border-right:1px solid #333;z-index:5}.chrome p{margin:0 0 8px;color:#d6a84f;text-transform:uppercase;letter-spacing:.18em;font-size:12px}.chrome h2{margin:0 0 8px;font-family:Georgia,serif;font-size:28px;line-height:1}.chrome small,.chrome footer{color:#aaa;line-height:1.45}.chrome footer{margin-top:auto;font-size:12px}.switcher{display:grid;gap:9px}.switcher button{display:grid;grid-template-columns:28px 1fr;gap:10px;align-items:center;text-align:left;padding:10px;border:1px solid #333;border-radius:14px;background:#191919;color:#ddd;cursor:pointer;transition:.18s}.switcher button:hover,.switcher .active{transform:translateX(3px);border-color:#d6a84f;background:#272111}.switcher b{display:grid;place-items:center;width:24px;height:24px;border-radius:50%;background:#333;color:#fff}.mock{min-height:100vh;padding:28px;font-family:var(--body,serif);transition:background .25s,color .25s}.productNav{display:flex;align-items:center;gap:18px;margin-bottom:28px}.productNav strong{margin-right:auto;letter-spacing:.16em}.productNav span{opacity:.75}.productNav button,.panelHead button{border:0;border-radius:999px;padding:10px 14px;cursor:pointer;background:var(--accent);color:var(--accentText)}.hero{display:grid;grid-template-columns:minmax(0,1.25fr)360px;gap:24px;align-items:stretch}.kicker{margin:0 0 10px;color:var(--accent);letter-spacing:.18em;text-transform:uppercase;font-size:12px}.hero h1{margin:0;font-family:var(--display,Georgia,serif);font-size:clamp(42px,6vw,92px);line-height:.9;letter-spacing:-.05em;text-transform:none}.copy{max-width:680px;font-size:18px;line-height:1.5;opacity:.78}.statusCard,.metrics article,.primaryPanel,.sidePanel,.tableWrap{border:1px solid var(--line);background:var(--panel);box-shadow:var(--shadow);border-radius:var(--radius)}.statusCard{padding:24px;font-size:15px}.statusCard b{display:block;margin:28px 0 4px;font-size:48px;font-family:var(--display)}.liveDot{display:inline-block;width:10px;height:10px;border-radius:50%;background:#28d77f;box-shadow:0 0 18px #28d77f;margin-right:8px}.metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:20px 0}.metrics article{padding:18px;font-weight:700}.workspace{display:grid;grid-template-columns:1.45fr .75fr;gap:18px}.primaryPanel,.sidePanel{padding:18px}.panelHead{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.panelHead h2,.sidePanel h2{margin:0;font-family:var(--display);font-size:24px}.chart{height:330px;position:relative;display:flex;align-items:flex-end;gap:1.8%;padding:24px;overflow:hidden;background:var(--chart);border-radius:calc(var(--radius) - 6px)}.chart i{flex:1;background:var(--bar);border-radius:99px 99px 0 0;animation:rise .7s both}.chart b{position:absolute;left:5%;right:5%;top:45%;height:3px;background:var(--accent);transform:rotate(-8deg);box-shadow:0 0 24px var(--accent)}.alert,.empty,.loading,.error{padding:14px;margin-top:12px;border-radius:14px;border:1px solid var(--line);background:rgba(255,255,255,.06)}.loading{background:repeating-linear-gradient(90deg,rgba(255,255,255,.08),rgba(255,255,255,.08) 12px,transparent 12px,transparent 24px)}.error{color:#ffb1a8}.tableWrap{margin-top:18px;overflow:auto}.tableWrap table{width:100%;border-collapse:collapse}.tableWrap th,.tableWrap td{padding:14px 16px;border-bottom:1px solid var(--line);text-align:left}.tableWrap tr:hover td{background:rgba(255,255,255,.08)}@keyframes rise{from{transform:scaleY(.25);opacity:.2}to{transform:scaleY(1);opacity:1}}
-.pit{--display:Impact,Haettenschweiler,'Arial Narrow Bold',sans-serif;--body:'Trebuchet MS',sans-serif;--accent:#ffb000;--accentText:#1a0c00;--line:#3e321b;--panel:#16120b;--chart:#080602;--bar:linear-gradient(#ffcf52,#b35b00);--radius:4px;--shadow:inset 0 0 0 1px #000,0 18px 0 rgba(0,0,0,.25);background:radial-gradient(circle at 70% -10%,#5d2500,transparent 35%),#0b0905;color:#fff0c9}.pit .productNav{border-bottom:6px solid #ffb000;padding-bottom:12px}.atlas{--display:'Didot','Bodoni 72',serif;--body:'Avenir Next',Verdana,sans-serif;--accent:#00b894;--accentText:#001b15;--line:rgba(16,80,70,.28);--panel:rgba(235,255,250,.68);--chart:linear-gradient(135deg,#dff9ef,#b8d6e5);--bar:#0b8874;--radius:28px;--shadow:0 30px 80px rgba(30,90,90,.16);background:linear-gradient(120deg,#eef8f3,#cbdde1);color:#17322f}.ledger{--display:'Iowan Old Style',Georgia,serif;--body:Georgia,serif;--accent:#8b3f1f;--accentText:#fff8ee;--line:#d8c7a9;--panel:#fffaf0;--chart:#f7ecd8;--bar:#1f3f35;--radius:0;--shadow:8px 8px 0 #d8c7a9;background:#f4ead8;color:#24190f}.ledger.mock,.ledger .tableWrap table{font-size:17px}.neon{--display:'Courier New',monospace;--body:'Courier New',monospace;--accent:#39ff14;--accentText:#001400;--line:#263cff;--panel:rgba(4,8,28,.82);--chart:#03040f;--bar:linear-gradient(#ff2bd6,#263cff);--radius:18px;--shadow:0 0 32px rgba(57,255,20,.2),inset 0 0 24px rgba(38,60,255,.18);background:linear-gradient(180deg,#050718,#110014);color:#d6fff4}.neon .hero h1{text-shadow:0 0 20px #ff2bd6}.paper{--display:'Franklin Gothic Medium','Arial Narrow',sans-serif;--body:'Times New Roman',serif;--accent:#c5281c;--accentText:#fff;--line:#111;--panel:#f8f1df;--chart:repeating-linear-gradient(0deg,#efe4cc,#efe4cc 14px,#e2d3b8 15px);--bar:#111;--radius:0;--shadow:none;background:#eee2c8;color:#111}.paper .productNav,.paper .hero,.paper .metrics{border-bottom:3px double #111;padding-bottom:14px}@media(max-width:900px){.cookerShell{grid-template-columns:1fr}.chrome{height:auto;position:relative}.switcher{grid-template-columns:repeat(2,1fr)}.hero,.workspace,.metrics{grid-template-columns:1fr}.productNav{flex-wrap:wrap}.mock{padding:18px}}
\ No newline at end of file
diff --git a/apps/web/app/frontend-cooker/page.tsx b/apps/web/app/frontend-cooker/page.tsx
deleted file mode 100644
index c985524..0000000
--- a/apps/web/app/frontend-cooker/page.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-"use client";
-
-import { useMemo, useState } from "react";
-import styles from "./frontend-cooker.module.css";
-
-const variations = [
- { id: "pit", name: "Open-Outcry Pit", rationale: "A loud exchange-floor command center optimized for immediate threat recognition and dense scan paths." },
- { id: "atlas", name: "Glass Atlas", rationale: "A calm geospatial intelligence room that makes flow feel mapped, layered, and explorable." },
- { id: "ledger", name: "Ivory Ledger", rationale: "A refined analyst notebook with editorial hierarchy for slower, higher-confidence review." },
- { id: "neon", name: "Neon Underpass", rationale: "A kinetic cyberpunk tape for traders who want momentum, heat, and speed above all." },
- { id: "paper", name: "Signal Gazette", rationale: "A newspaper-like briefing that turns raw options activity into a morning intelligence digest." }
-];
-
-const flowRows = [
- ["NVDA", "910C", "05-17", "$4.8M", "AA", "+92%", "Sweep"],
- ["TSLA", "175P", "05-10", "$2.1M", "BB", "−68%", "ISO"],
- ["AAPL", "205C", "06-21", "$1.4M", "A", "+41%", "Block"],
- ["SPY", "520P", "05-03", "$8.7M", "B", "−53%", "Split"],
- ["AMD", "162C", "05-24", "$910K", "AA", "+77%", "Sweep"]
-];
-
-function MiniChart({ variant }: { variant: string }) {
- return
- {Array.from({ length: 22 }).map((_, i) => )}
-
-
;
-}
-
-function AppMock({ id }: { id: string }) {
- return
-
- ISLANDFLOW Overview Live Tape Signals Replay Filter Flow
-
-
- Live Options Intelligence
Unusual flow surfaced before the crowd. Representative redesign of the IslandFlow terminal: live status, option sweeps, inferred dark activity, classifier hits, and replay controls.
- Connected · 1,284 msgs/min$42.6M premium tracked in active window
-
- {["Alert score 87", "Bullish 62%", "Dark pool 14", "Stale feeds 0"].map(x => {x} )}
-
-
- Classifier Hits High conviction: NVDA call sweep above ask with confirming equity print.
Empty state: no stale NBBO quotes in the last 15s.
Loading replay baseline…
Error state: dark inference source delayed.
-
- {["Ticker", "Contract", "Expiry", "Notional", "Side", "Delta", "Condition"].map(h => {h} )} {flowRows.map((r) => {r.map((c, i) => {c} )} )}
- ;
-}
-
-export default function FrontendCooker() {
- const [active, setActive] = useState(0);
- const current = variations[active];
- const nav = useMemo(() => variations.slice(0, 5), []);
- return
-
Frontend Cooker
{current.name} {current.rationale} {nav.map((v, i) => setActive(i)}>{i + 1} {v.name} )}
Target: IslandFlow trading terminal overview
-
- ;
-}
diff --git a/docs/turns/2026-05-29-remove-frontend-cooker.html b/docs/turns/2026-05-29-remove-frontend-cooker.html
new file mode 100644
index 0000000..d4fc89c
--- /dev/null
+++ b/docs/turns/2026-05-29-remove-frontend-cooker.html
@@ -0,0 +1,225 @@
+
+
+
+
+
+ Remove frontend cooker route
+
+
+
+
+
+ Remove frontend cooker route
+ Removed the experimental /frontend-cooker page from the Next.js app and cleaned up repository references that still listed it as a public route or scanner candidate.
+
+ 2026-05-29 09:51 EDT
+ Beads: islandflow-dk5
+ Scope: web route removal
+
+
+
+
+ Summary
+ The frontend cooker prototype is no longer routable in the web app. Its page component and CSS module were deleted, and the attack-surface documentation now reflects the remaining public pages.
+
+
+
+ Changes Made
+
+ Deleted apps/web/app/frontend-cooker/page.tsx.
+ Deleted apps/web/app/frontend-cooker/frontend-cooker.module.css.
+ Removed /frontend-cooker from the architecture entrypoint inventory.
+ Removed /frontend-cooker from the public routes authorization matrix.
+ Removed stale scanner candidate entries for the deleted page from piolium/attack-surface/candidates-summary.md and piolium/attack-surface/candidates.jsonl.
+
+
+
+
+ Context
+ The removed page was an experimental visual exploration route with several mock terminal variations. It was still exposed by file-system routing and listed in security inventory artifacts even though it was not part of the core Islandflow terminal workflow.
+
+
+
+ Important Implementation Details
+ Next.js removes the route when the corresponding folder no longer contains a page file. No redirects or replacement route were added, so requests to /frontend-cooker will now fall through to the app's not-found behavior.
+ The existing local modification to apps/web/next-env.d.ts was left untouched because it predated this task.
+
+
+
+ Relevant Diff Snippets
+ The repo asks for @pierre/diffs output by default. Attempting bunx @pierre/diffs --help failed because the package does not expose a runnable CLI executable, so this document includes a labeled plain unified diff fallback.
+ diff --git a/apps/web/app/frontend-cooker/page.tsx b/apps/web/app/frontend-cooker/page.tsx
+deleted file mode 100644
+--- a/apps/web/app/frontend-cooker/page.tsx
++++ /dev/null
+@@ -1,55 +0,0 @@
+-"use client";
+-
+-import { useMemo, useState } from "react";
+-import styles from "./frontend-cooker.module.css";
+-...
+-export default function FrontendCooker() {
+- const [active, setActive] = useState(0);
+- const current = variations[active];
+- const nav = useMemo(() => variations.slice(0, 5), []);
+- return <div className={styles.cookerShell}>...</div>;
+-}
+ diff --git a/piolium/attack-surface/architecture-entrypoints.md b/piolium/attack-surface/architecture-entrypoints.md
+@@ -12,7 +12,7 @@
+ ### Web app (`apps/web/app`, Next.js on port 3000)
+-- Pages: `/`, `/tape`, `/signals`, `/charts`, `/news`, `/options`, `/replay`, `/frontend-cooker`.
++- Pages: `/`, `/tape`, `/signals`, `/charts`, `/news`, `/options`, `/replay`.
+ diff --git a/piolium/attack-surface/public-routes-authz-matrix.md b/piolium/attack-surface/public-routes-authz-matrix.md
+@@ -29,7 +29,7 @@
+-| 17 | Next public pages `/`, `/tape`, `/signals`, `/charts`, `/news`, `/options`, `/replay`, `/frontend-cooker` | ...
++| 17 | Next public pages `/`, `/tape`, `/signals`, `/charts`, `/news`, `/options`, `/replay` | ...
+
+
+
+ Expected Impact for End-Users
+ Users will no longer be able to open the experimental frontend cooker page. The production terminal routes remain unchanged: /, /tape, /signals, /charts, /news, /options, and /replay.
+
+
+
+ Validation
+ Passed: bun --cwd=apps/web run build. The resulting Next.js route list did not include /frontend-cooker.
+ Also checked the repository with rg -n "frontend-cooker|Frontend Cooker|/frontend-cooker" -S .; no remaining references were found after the cleanup.
+
+
+
+ Issues, Limitations, and Mitigations
+ No runtime redirect was added. That is intentional for a removal request, but any external bookmark to /frontend-cooker will now receive the app's not-found response.
+ The @pierre/diffs CLI was not available through bunx, so the diff section uses a plain unified diff fallback.
+
+
+
+ Follow-up Work
+ No follow-up issue was filed because the requested route and known references were removed, and validation passed.
+
+
+
+
diff --git a/piolium/attack-surface/architecture-entrypoints.md b/piolium/attack-surface/architecture-entrypoints.md
index 03ba1c8..df0dc59 100644
--- a/piolium/attack-surface/architecture-entrypoints.md
+++ b/piolium/attack-surface/architecture-entrypoints.md
@@ -12,7 +12,7 @@
- WebSockets: `GET /ws/options`, `/ws/options-nbbo`, `/ws/equities`, `/ws/equity-candles`, `/ws/equity-quotes`, `/ws/equity-joins`, `/ws/inferred-dark`, `/ws/flow`, `/ws/classifier-hits`, `/ws/smart-money`, `/ws/alerts`, `/ws/live`.
### Web app (`apps/web/app`, Next.js on port 3000)
-- Pages: `/`, `/tape`, `/signals`, `/charts`, `/news`, `/options`, `/replay`, `/frontend-cooker`.
+- Pages: `/`, `/tape`, `/signals`, `/charts`, `/news`, `/options`, `/replay`.
- Next API admin proxy: `GET /api/admin/synthetic/status`, `GET|PUT /api/admin/synthetic/control`.
### Desktop (`apps/desktop`)
diff --git a/piolium/attack-surface/candidates-summary.md b/piolium/attack-surface/candidates-summary.md
index 46bd34a..3cc77b1 100644
--- a/piolium/attack-surface/candidates-summary.md
+++ b/piolium/attack-surface/candidates-summary.md
@@ -63,7 +63,6 @@ Generated by piolium at 2026-05-27T05:18:10.316Z
- `apps/web/app/replay/page.tsx`: score 65, 1 match(es)
- `apps/web/app/signals/page.tsx`: score 65, 1 match(es)
- `apps/web/app/tape/page.tsx`: score 65, 1 match(es)
-- `apps/web/app/frontend-cooker/page.tsx`: score 55, 1 match(es)
## Highest-Ranked Matches
@@ -143,7 +142,6 @@ Generated by piolium at 2026-05-27T05:18:10.316Z
- hidden-control-channel (normal, score 55) at `apps/desktop/src/security.ts:6` - new URL(DESKTOP_LOCAL_DEV_URL).origin,
- hidden-control-channel (normal, score 55) at `apps/desktop/src/security.ts:26` - return TRUSTED_ORIGINS.has(url.origin);
- hidden-control-channel (normal, score 55) at `apps/desktop/src/security.ts:35` - return !TRUSTED_ORIGINS.has(url.origin);
-- path-traversal-file-access (normal, score 55) at `apps/web/app/frontend-cooker/page.tsx:43` - {["Ticker", "Contract", "Expiry", "Notional", "Side", "Delta", "Condition"].map(h => {h} )} {flowRows.map((r) => {[\"Ticker\", \"Contract\", \"Expiry\", \"Notional\", \"Side\", \"Delta\", \"Condition\"].map(h => {h} )} {flowRows.map((r) =>