[object Object]

← back to Ventura Corridor

feat(coverage): rejected-ideas drawer below the idea-loop feed

7d1fe85411c675f7258eda697dca988ee9a6dc64 · 2026-05-08 00:22:21 -0700 · SteveStudio2

Collapsible <details> below accepted-ideas grid. Shows recently rejected
debate-panel ideas (red score, type pill, title + body). Editorial
sanity-check: are we missing good ideas?

Routes:
  GET /api/ideas/rejects   {count, rows[]} from rejects.jsonl, newest
                           first, top 20. 60s cache.

UI:
  /coverage.html idea-section   collapsible "show recently rejected ideas"
                                drawer; styled red-toned to differentiate
                                from accepted gold.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit 7d1fe85411c675f7258eda697dca988ee9a6dc64
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Fri May 8 00:22:21 2026 -0700

    feat(coverage): rejected-ideas drawer below the idea-loop feed
    
    Collapsible <details> below accepted-ideas grid. Shows recently rejected
    debate-panel ideas (red score, type pill, title + body). Editorial
    sanity-check: are we missing good ideas?
    
    Routes:
      GET /api/ideas/rejects   {count, rows[]} from rejects.jsonl, newest
                               first, top 20. 60s cache.
    
    UI:
      /coverage.html idea-section   collapsible "show recently rejected ideas"
                                    drawer; styled red-toned to differentiate
                                    from accepted gold.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---
 public/coverage.html |  4 ++++
 src/server/index.ts  | 24 ++++++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/public/coverage.html b/public/coverage.html
index 89c9f9f..0cfdaf8 100644
--- a/public/coverage.html
+++ b/public/coverage.html
@@ -89,6 +89,10 @@ main{padding:32px;max-width:1200px;margin:0 auto}
   <p style="font-family:'Cormorant Garamond',serif;font-style:italic;font-size:13px;color:var(--ink-mute);margin:0 0 14px">Surviving ideas from the autonomous idea-loop debate panel (qwen3 + gemma3 + deepseek-r1). Full viewer at <a href="http://127.0.0.1:9920/" target="_blank" rel="noopener" style="color:var(--metal)">:9920</a>.</p>
   <div id="idea-stats" style="font-family:var(--mono);font-size:10px;letter-spacing:.16em;color:var(--ink-mute);margin-bottom:14px;text-transform:uppercase"></div>
   <div id="idea-feed"></div>
+  <details style="margin-top:18px;padding-top:14px;border-top:1px dotted var(--rule)">
+    <summary style="cursor:pointer;font-family:var(--mono);font-size:10px;letter-spacing:.18em;color:var(--ink-mute);text-transform:uppercase">show recently rejected ideas (panel said no)</summary>
+    <div id="idea-rejects" style="margin-top:10px"></div>
+  </details>
 </div>
 
 <div class="bar-section">
diff --git a/src/server/index.ts b/src/server/index.ts
index 2f64a2f..90e6684 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -5213,6 +5213,30 @@ app.get('/api/fleet', async (_req, res) => {
   res.json({ macs: [mac1, mac2], ts: Date.now() });
 });
 
+// Recent REJECTS — what did the debate panel kill, with the verdict reasons.
+// Useful editorial signal when accept rate is low: "are we missing good ideas
+// because they were prematurely rejected?"
+app.get('/api/ideas/rejects', async (_req, res) => {
+  try {
+    const fs = await import('node:fs/promises');
+    const path = await import('node:path');
+    const home = process.env.HOME || '/Users/stevestudio2';
+    const p = path.join(home, '.claude', 'skills', 'idea-loop', 'data', 'rejects.jsonl');
+    let raw = '';
+    try { raw = await fs.readFile(p, 'utf8'); }
+    catch { return res.json({ count: 0, rows: [] }); }
+    const ideas = raw.split(/\r?\n/).filter(Boolean).map((line) => {
+      try { return JSON.parse(line); } catch { return null; }
+    }).filter(Boolean);
+    // Newest first (jsonl is append-only so reverse works)
+    ideas.reverse();
+    res.set('Cache-Control', 'public, max-age=60');
+    res.json({ count: ideas.length, rows: ideas.slice(0, 20) });
+  } catch (e: any) {
+    res.status(500).json({ error: e.message });
+  }
+});
+
 app.get('/api/ideas/recent', async (_req, res) => {
   try {
     const fs = await import('node:fs/promises');

← 4a0ab3d feat(fleet): Mac1+Mac2 dashboard bridge on corridor homepage  ·  back to Ventura Corridor  ·  fix: 3 bugs caught by codex-2way audit at tick 73 1229e88 →