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