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
- -
-

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}
)}
-
-

Flow Radar

-

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 => )}{flowRows.map((r) => {r.map((c, i) => )})}
{h}
{c}
-
; -} - -export default function FrontendCooker() { - const [active, setActive] = useState(0); - const current = variations[active]; - const nav = useMemo(() => variations.slice(0, 5), []); - return
- - -
; -} 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 => )}{flowRows.map((r) =>
{h}
{[\"Ticker\", \"Contract\", \"Expiry\", \"Notional\", \"Side\", \"Delta\", \"Condition\"].map(h => )}{flowRows.map((r) =>
{h}