← back to AbramsEgo
chore: replenish audit (fable) — all 8 SPEC panels live + hard rules hold; tasks 20/21 verified on running instance; 1 real gap: cron model field 0/114 populated (parser only greps plist, models live in invoked scripts) → enqueue task 23 + re-queue replenisher 24
ec4ed7b810606c843f8571b06611fb8d9b496588 · 2026-07-01 14:27:49 -0700 · Steve
Files touched
R100 build-queue/tasks/22-replenish.md build-queue/done/22-replenish.mdA build-queue/tasks/23-cron-model-from-script.mdA build-queue/tasks/24-replenish.mdM data/local-fleet.json
Diff
commit ec4ed7b810606c843f8571b06611fb8d9b496588
Author: Steve <steve@designerwallcoverings.com>
Date: Wed Jul 1 14:27:49 2026 -0700
chore: replenish audit (fable) — all 8 SPEC panels live + hard rules hold; tasks 20/21 verified on running instance; 1 real gap: cron model field 0/114 populated (parser only greps plist, models live in invoked scripts) → enqueue task 23 + re-queue replenisher 24
---
build-queue/{tasks => done}/22-replenish.md | 0
build-queue/tasks/23-cron-model-from-script.md | 27 +++++++++++++++++++++++++
build-queue/tasks/24-replenish.md | 28 ++++++++++++++++++++++++++
data/local-fleet.json | 2 +-
4 files changed, 56 insertions(+), 1 deletion(-)
diff --git a/build-queue/tasks/22-replenish.md b/build-queue/done/22-replenish.md
similarity index 100%
rename from build-queue/tasks/22-replenish.md
rename to build-queue/done/22-replenish.md
diff --git a/build-queue/tasks/23-cron-model-from-script.md b/build-queue/tasks/23-cron-model-from-script.md
new file mode 100644
index 0000000..edf482f
--- /dev/null
+++ b/build-queue/tasks/23-cron-model-from-script.md
@@ -0,0 +1,27 @@
+# AbramsEgo task 23 — cron cards: derive model from the INVOKED SCRIPT (0/114 populated today)
+
+Read SPEC.md. Panel 4 requires every scheduled job to show its **model**. Task 20 added the
+`model` field + card rendering, but the parser (`server.js` `readCronPlistMeta()`, ~lines 257-261)
+only greps the **plist XML** for `--model` / `claude-*` tokens — and NO com.steve.* plist carries
+one (verified 2026-07-01: 0 of 114 jobs have a model). The models live one hop away, in the
+script the plist invokes: e.g. `com.steve.abramsego-loop` → its bash script contains
+`claude-fable-5`; `com.steve.yolo-queue-loop` → `claude-opus-4-8`; `com.steve.dwphoto` → a
+`--model` arg. So the model line on every cron card is a dead placeholder in practice. ~12 min.
+
+1. In `readCronPlistMeta()` (`server.js:223`), after the existing plist-XML model match fails:
+ - Resolve the invoked script: from `ProgramArguments`, take the first arg that starts with `/`
+ and ends in `.sh|.js|.cjs|.mjs|.py` (skip `/bin/bash`, `/usr/bin/env` etc.); fall back to the
+ last arg if it's an existing file path.
+ - If the file exists and is < 512 KB, read it and reuse the SAME two regexes already at lines
+ 258-259 (`--model` arg form adapted for shell: `/--model[= ]["']?([\w.-]+)/` + the
+ `claude-(?:opus|sonnet|haiku|fable)[\w.-]*` token). First hit wins → `meta.model`.
+ - Keep it synchronous + try/catch'd like the rest of the function — never throw, degrade to null.
+2. `pm2 restart abramsego`, then verify:
+ `curl -s -u admin:'DW2024!' http://127.0.0.1:9773/api/data | node -e 'let d="";process.stdin.on("data",c=>d+=c).on("end",()=>{const j=JSON.parse(d).crons.jobs.filter(c=>c.model);console.log(j.length,"jobs with model:",j.slice(0,5).map(c=>c.label+"="+c.model))})'`
+ — expect ≥3 jobs (abramsego-loop=claude-fable-5, yolo-queue-loop=claude-opus-4-8, dwphoto…).
+ Load http://127.0.0.1:9773/ and confirm those cron cards show the model on the runs line.
+3. Commit:
+ `git add -A && git commit -m "fix: cron cards derive model from invoked script (was 0/114 populated)" --author="Steve <steve@designerwallcoverings.com>"`
+
+Do NOT touch the card render (already done in task 20). Jobs whose script genuinely names no
+model correctly stay null — don't invent one. Local only, no deploy.
diff --git a/build-queue/tasks/24-replenish.md b/build-queue/tasks/24-replenish.md
new file mode 100644
index 0000000..ff6e1a1
--- /dev/null
+++ b/build-queue/tasks/24-replenish.md
@@ -0,0 +1,28 @@
+# AbramsEgo task 24 — REPLENISH: fresh-eyes full-completion audit (Fable 5)
+
+You are the queue replenisher. Read SPEC.md FIRST, then audit the RUNNING dashboard, not the
+file bookkeeping.
+
+1. Pull the live surface: `curl -s -u admin:'DW2024!' http://127.0.0.1:9773/api/data` and read
+ `public/index.html` + `server.js`. Check every SPEC panel (1–8) is present AND wired to real
+ data (no dead placeholders), and every Steve hard rule holds:
+ - 🕓 created date+time chip visible on EVERY admin card/row (full ISO in `title=`).
+ - sort `<select>` + density slider + infinite scroll on every grid that can exceed ~40 rows,
+ localStorage-persisted. (Officers panel is compliant via the panel-level fetchedAt chip —
+ officers carry no per-record timestamp; the local fleet list at ~3 procs was deliberately
+ left without grid controls in task 15 — don't re-flag those.)
+ - every cost figure labeled; free/local shows `$0 (local)`.
+ - Verify task 23 (cron model derived from the invoked script — expect ≥3 of the 114 cron
+ jobs with a non-null `model` in /api/data) actually landed on the live instance.
+2. For each REAL gap found (broken data, missing SPEC feature, hard-rule violation): write ONE
+ surgical <15-min task file to `build-queue/tasks/NN-<slug>.md` (NN starting at 25), following
+ the style of `build-queue/done/12-officers-datetime-chip.md` — name exact files/lines, one
+ verify command, one commit line. BOUND: enqueue at most 3 tasks, highest-value first. Also
+ re-enqueue a copy of this replenisher as the LAST task (next number) ONLY if you enqueued ≥1 task.
+3. If NO real gaps: enqueue nothing, do NOT re-enqueue yourself — the loop rests, the build is
+ at full completion. Don't invent busywork to justify the run.
+4. Move this file to `build-queue/done/` and commit
+ `chore: replenish audit (fable) — <verdict>` with author `steve@designerwallcoverings.com`.
+
+Local only. No deploy, no DNS, no publish — draft any gated need to
+~/.claude/yolo-queue/pending-approval/ instead.
diff --git a/data/local-fleet.json b/data/local-fleet.json
index 8067613..1c7789f 100644
--- a/data/local-fleet.json
+++ b/data/local-fleet.json
@@ -1 +1 @@
-{"fetchedAt":"2026-07-01T21:23:08.090Z","procs":[{"name":"pm2-logrotate","status":"online","cpu":0,"memMB":45,"restarts":0,"uptimeMs":990505,"startedAt":"2026-07-01T21:06:37.585Z"},{"name":"abramsego","status":"online","cpu":24,"memMB":75,"restarts":3,"uptimeMs":715,"startedAt":"2026-07-01T21:23:07.375Z"},{"name":"api-token-dashboard","status":"online","cpu":0,"memMB":56,"restarts":2,"uptimeMs":59418,"startedAt":"2026-07-01T21:22:08.672Z"}]}
\ No newline at end of file
+{"fetchedAt":"2026-07-01T21:27:40.536Z","procs":[{"name":"pm2-logrotate","status":"online","cpu":0,"memMB":45,"restarts":0,"uptimeMs":1262951,"startedAt":"2026-07-01T21:06:37.585Z"},{"name":"abramsego","status":"online","cpu":0,"memMB":63,"restarts":3,"uptimeMs":273161,"startedAt":"2026-07-01T21:23:07.375Z"},{"name":"api-token-dashboard","status":"online","cpu":0,"memMB":56,"restarts":2,"uptimeMs":331864,"startedAt":"2026-07-01T21:22:08.672Z"}]}
\ No newline at end of file
← 9e9911e fix: Kamatera fleet panel surfaces cache age + ssh-failure n
·
back to AbramsEgo
·
fix: cron cards derive model from invoked script (was 0/114 f2100b7 →