[object Object]

← back to Approvals Viewer

rollup: detect gated packet-memos per task (real convergence signal)

4529deddce09de7d213ef221051bd4cee81ad8be · 2026-07-28 10:32:36 -0700 · Steve Abrams

Files touched

Diff

commit 4529deddce09de7d213ef221051bd4cee81ad8be
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Jul 28 10:32:36 2026 -0700

    rollup: detect gated packet-memos per task (real convergence signal)
---
 rollup.js | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/rollup.js b/rollup.js
index 12e1584..524a3b1 100644
--- a/rollup.js
+++ b/rollup.js
@@ -4,10 +4,34 @@
 // state from the LATEST action/comment line that mentions "task N/10". Shows a
 // summary bar: opened · prepped · awaiting-GO · done. Auto-refreshes. Zero deps.
 const http = require('http');
+const fs = require('fs');
+const path = require('path');
 
 const PORT = Number(process.env.PORT || 9793);
 const PARENT = process.env.PARENT || 'TK-10012';
 const BOARD = { host: '127.0.0.1', port: 9794, auth: 'admin:DW2024!' };
+const PA_DIR = path.join(process.env.HOME, '.claude', 'yolo-queue', 'pending-approval');
+
+// Real progress signal: each session stages its gated step as a NEW packet-memo in
+// pending-approval (slug ends -DONE/-STAGED/-READY/-PREFLIGHT/-cutover/-revocation/
+// -followups/-fix). Match each task to its packet; a packet present = prep done,
+// AWAITING-GO. Keyword must avoid matching the ORIGINAL approved draft.
+const TASK_MATCH = [
+  /* 1 */ /^tk-10-(launch-hardening|godaddy|.*follow)|homesonspec.*(ready|hardening|packet)/i,
+  /* 2 */ /^tk-22-.*(fix|ready|packet|ratelimit)/i,
+  /* 3 */ /dw-signup-fulfillment.*(ready|packet|golive-ready)|go-live packet.*signup/i,
+  /* 4 */ /(stale-)?needs-image.*(done|staged|ready|packet)/i,
+  /* 5 */ /tk10002.*(phase2|governance|ready|done)|sku-collision.*(ready|done|packet)/i,
+  /* 6 */ /gmc-remediation.*(preflight|done|ready)|gmc.*preflight-done/i,
+  /* 7 */ /tk-50-.*(staged|backfill|ready|done)|provenance.*(staged|ready)/i,
+  /* 8 */ /(sample-only|tk-?17).*(ready|done|staged|packet)/i,
+  /* 9 */ /(de-?badge|prwn).*(ready|done|staged|packet)/i,
+  /* 10 */ /york.*(ready|done|staged|packet|cadence-go)/i,
+];
+function packetMemos() {
+  try { return fs.readdirSync(PA_DIR).filter(f => f.endsWith('.md')).map(f => f.slice(0, -3)); }
+  catch { return []; }
+}
 
 function boardTickets() {
   return new Promise((resolve) => {
@@ -38,8 +62,15 @@ async function rollup() {
       if (m) { const n = +m[1]; tasks[n] = { text: a.text, ts: a.ts, state: classify(a.text) }; }
     }
   }
+  const memos = packetMemos();
   const rows = [];
-  for (let n = 1; n <= 10; n++) rows.push(Object.assign({ n, state: 'opened', text: '(no update yet)', ts: 0 }, tasks[n] || {}));
+  for (let n = 1; n <= 10; n++) {
+    const row = Object.assign({ n, state: 'opened', text: '(no update yet)', ts: 0 }, tasks[n] || {});
+    // packet-memo present overrides the ticket-log state → prep done, awaiting Steve's GO
+    const packet = memos.find(m => TASK_MATCH[n - 1].test(m));
+    if (packet) { row.state = 'awaiting-GO'; row.packet = packet; row.text = 'packet staged → ' + packet; }
+    rows.push(row);
+  }
   return { found: !!t, id: t ? t.id : PARENT, status: t ? t.status : '?', rows };
 }
 

← 9ff4214 add top-10 fan-out rollup board (:9793) tracking TK-10012 ta  ·  back to Approvals Viewer  ·  approvals yes/no swipe viewer 4cc1b1d →