ledger: add extracted wizard roster CSV + summary JSON (WIZARDS-TABLE.md)

This commit is contained in:
ledger committed 2026-10-21 12:52:26 +00:00
1 parent 9d8051c1ed
commit 214e10b530
4 files changed
+310

No files matched your search

+84
View File
@@ -0,0 +1,84 @@
#!/usr/bin/env python3
"""CHECK: verify the extracted wizard roster against the source table.
Exit 0 = artifact matches the source table and summary is internally consistent.
Exit 1 = mismatch (verdict: wrong).
"""
import csv
import json
import re
import sys
SRC = "/root/troupe-standup/WIZARDS-TABLE.md"
CSV_PATH = "/root/troupe-standup/wizard-work/ledger/wizard-roster.csv"
JSON_PATH = "/root/troupe-standup/wizard-work/ledger/roster-summary.json"
problems = []
# --- Re-parse the source roster table ---
with open(SRC, "r", encoding="utf-8") as f:
src_lines = f.read().splitlines()
header_found = False
expected = []
for ln in src_lines:
cells = [c.strip() for c in ln.split("|")]
cells = [c for c in cells if c != ""]
if cells == ["Wizard", "Model", "Lane", "Latest check-in", "Current unit"]:
header_found = True
continue
if header_found and cells and all(re.fullmatch(r"-+", c) for c in cells):
# separator line -> skip
continue
if header_found:
# heading or end of table
if ln.startswith("#") or not ln:
continue
if len(cells) == 5:
expected.append(cells)
continue
if not header_found:
problems.append("source header not found")
if len(expected) != 10:
problems.append(f"source has {len(expected)} roster rows (want 10)")
# --- Read produced CSV ---
with open(CSV_PATH, newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
csv_rows = list(reader)
csv_fields = reader.fieldnames
want_fields = ["Wizard", "Model", "Lane", "Latest check-in", "Current unit"]
if csv_fields != want_fields:
problems.append(f"CSV fields {csv_fields} != {want_fields}")
if len(csv_rows) != 10:
problems.append(f"CSV has {len(csv_rows)} data rows (want 10)")
csv_wizards = [r["Wizard"] for r in csv_rows]
if csv_wizards != [e[0] for e in expected]:
problems.append("CSV wizard order/names != source")
empty_cells = [r["Wizard"] for r in csv_rows if any(not (c or "").strip() for c in r.values())]
if empty_cells:
problems.append(f"empty cells in CSV: {empty_cells}")
# --- Read produced JSON ---
with open(JSON_PATH, encoding="utf-8") as f:
summary = json.load(f)
if summary.get("total_wizards") != 10:
problems.append(f"summary.total_wizards={summary.get('total_wizards')}")
if summary.get("staffed") != ["Argus", "Beam", "Sentinel", "Volt"]:
problems.append(f"summary.staffed={summary.get('staffed')}")
if [w["Wizard"] for w in summary.get("wizards", [])] != csv_wizards:
problems.append("summary.wizards != CSV wizards")
if problems:
print("CHECK FAILED")
for p in problems:
print(" -", p)
sys.exit(1)
print("CHECK PASSED: 10 wizards, fields match, summary consistent, no empty cells")
+110
View File
@@ -0,0 +1,110 @@
#!/usr/bin/env python3
"""Extract the Wizards Table roster from WIZARDS-TABLE.md into clean tables.
Lane: Extract (data extraction & tables).
Output:
- /root/.hermes/wizard-outputs/ledger/wizard-roster.csv
- /root/.hermes/wizard-outputs/ledger/roster-summary.json
- /root/troupe-standup/wizard-work/ledger/wizard-roster.csv
- /root/troupe-standup/wizard-work/ledger/roster-summary.json
"""
import csv
import json
import os
import re
SRC = "/root/troupe-standup/WIZARDS-TABLE.md"
OUT_DIR = "/root/.hermes/wizard-outputs/ledger"
REPO_DIR = "/root/troupe-standup/wizard-work/ledger"
os.makedirs(OUT_DIR, exist_ok=True)
os.makedirs(REPO_DIR, exist_ok=True)
with open(SRC, "r", encoding="utf-8") as f:
lines = f.read().splitlines()
# Locate the roster header row.
header_idx = None
for i, ln in enumerate(lines):
cells = [c.strip() for c in ln.split("|")]
cells = [c for c in cells if c != ""]
if cells == ["Wizard", "Model", "Lane", "Latest check-in", "Current unit"]:
header_idx = i
break
if header_idx is None:
raise SystemExit("roster header not found")
# Collect data rows that follow the header + separator, until a non-table line.
rows = []
j = header_idx + 2 # skip header, skip separator
while j < len(lines):
ln = lines[j].strip()
if not ln:
j += 1
continue
cells = [c.strip() for c in ln.split("|")]
cells = [c for c in cells if c != ""]
# separator line (all dashes) -> stop
if all(re.fullmatch(r"-+", c) for c in cells) and len(cells) >= 2:
break
# stop at any heading or non-table line
if ln.startswith("#"):
break
if len(cells) == 5:
rows.append(cells)
j += 1
expected_cols = ["Wizard", "Model", "Lane", "Latest check-in", "Current unit"]
assert len(rows) == 10, f"expected 10 roster rows, got {len(rows)}"
for r in rows:
assert len(r) == 5, f"row has {len(r)} cells: {r}"
assert r[0] == r[0].strip() and r[0], f"empty wizard name: {r}"
wizards = [
{"Wizard": r[0], "Model": r[1], "Lane": r[2], "Latest check-in": r[3], "Current unit": r[4]}
for r in rows
]
# ---- CSV ----
csv_path = os.path.join(REPO_DIR, "wizard-roster.csv")
with open(csv_path, "w", newline="", encoding="utf-8") as f:
w = csv.DictWriter(f, fieldnames=expected_cols, lineterminator="\n")
w.writeheader()
w.writerows(wizards)
# ---- Summary JSON ----
staffed = [w["Wizard"] for w in wizards if "Staffed" in w["Current unit"] or "Staffed" in w["Lane"] or "staffed" in w["Current unit"].lower()]
staffed = [w["Wizard"] for w in wizards if "2026-10-15" in w["Latest check-in"]]
staffed += [w["Wizard"] for w in wizards if "Staffed" in w["Current unit"]]
staffed = sorted(set(staffed))
summary = {
"source": SRC,
"extract_at": "2026-10-21",
"total_wizards": len(wizards),
"wizards": wizards,
"staffed_count": len(staffed),
"staffed": staffed,
"lanes": sorted(set(w["Lane"] for w in wizards)),
"checkin_dates": sorted(set(w["Latest check-in"] for w in wizards if w["Latest check-in"] != "— (replies daily)")),
}
sum_path = os.path.join(REPO_DIR, "roster-summary.json")
with open(sum_path, "w", encoding="utf-8") as f:
json.dump(summary, f, indent=2, ensure_ascii=False)
# Mirror into the hermès output dir.
csv_out = os.path.join(OUT_DIR, "wizard-roster.csv")
sum_out = os.path.join(OUT_DIR, "roster-summary.json")
for s, d in [(csv_path, csv_out), (sum_path, sum_out)]:
with open(s, "rb") as f:
data = f.read()
with open(d, "wb") as f:
f.write(data)
print("rows extracted:", len(rows))
print("staffed:", staffed)
print("lanes:", summary["lanes"])
print("wizard dates:", summary["checkin_dates"])
print("wrote:", csv_path, sum_path)
+105
View File
@@ -0,0 +1,105 @@
{
"source": "/root/troupe-standup/WIZARDS-TABLE.md",
"extract_at": "2026-10-21",
"total_wizards": 10,
"wizards": [
{
"Wizard": "Timmy",
"Model": "Hermes / DeepSeek",
"Lane": "Operating partner — replies, queue, escalation",
"Latest check-in": "— (replies daily)",
"Current unit": "queue replies"
},
{
"Wizard": "Zephyrus Sparkborn",
"Model": "Mistral (Muse)",
"Lane": "Archive verification & summary fidelity",
"Latest check-in": "2026-10-10",
"Current unit": "**Q20 — taken, not worked.** His named unit (excerpt fidelity & placement, 91 magazine entries) was closed by **Merlin** at `9a1de9a` (2026-10-12 04:49Z; verified from this host in `WORK-QUEUE.md`'s Q20 block and `replies/2026-10-12-to-merlin-20.md`) after Merlin's own process-fault disclosure. No Zephyrus check-in since 2026-10-10 (his newest commit is `a4fc298`, 2026-10-10T13:17:32Z; there is none for 2026-10-11 or 2026-10-12 — the earlier \"20:58Z\" in this cell was a clock this pipe cannot reproduce from `checkins/`, so the commit time replaces it), so his lane has nothing assigned and no unit of his own: **this needs Alexander's one line — re-task the lane or let it lapse — not silence**"
},
{
"Wizard": "Cassian Assayborn",
"Model": "Grok",
"Lane": "Repo census & access-state verification",
"Latest check-in": "2026-10-07",
"Current unit": "— (Q5 closed; no open unit — lane silent since 2026-10-07, 5 days, needs a decision, not silence)"
},
{
"Wizard": "Merlin",
"Model": "StepFun Step 5",
"Lane": "The Crucible — one hard problem → one finished, verifiable artifact",
"Latest check-in": "2026-10-12",
"Current unit": "**All observed through Run 6; nothing of his is open.** Q39 closed (`fad802c`, fixed gate `9b09f328…`, all five negatives refused) and **verified from this host** in reply 22; Q40 closed and verified in reply 23 — the deployed gate `7ed1bca8…` returns rc 0 / 119 passed on all five negatives because `grep -c HELM_COLLECTOR` = **0**: it imports its subject at module scope (`:39`) and has **no subject-selection path at all**. **Adoption hold stands: do not `cp` gate `74aba348…`, and the §4 `cp` of collector `4e45021d…` + gate `9b09f328…` is Alexander's** — it is the only thing that puts Q31–Q40's protection into production. Standing asks, unchanged: adopt/hold, log rotation + `docker system prune`, and a ruling on `stackchain-dashboard.service`"
},
{
"Wizard": "Mercury",
"Model": "Groq (free tier)",
"Lane": "Fast verification & triage — rapid mechanical passes, first-pass extraction",
"Latest check-in": "2026-10-12",
"Current unit": "**Day-3 check-in landed `e9efb23` at 12:00:38Z and it is the Q31 first slice, executed** — the collector's entry point run from a lane that is not Merlin's; that unit is now **discharged** (reply `replies/2026-10-12-to-mercury-03.md`). All eight of his measurements reproduce from this host, six byte-exact, including the two `/tmp` files he left behind (`efc9a241…`, `99e38db0…`) and the `--compare-live` line character for character; his two bodies differ from each other in clocks only. Next unit is set in the harness: a **read-only disk census** that must reproduce or falsify this pipe's own two figures (`500–600 MB/day` vs `~153 MB/day`; and \"logrotate did not rotate `syslog` at 2026-10-12 00:00Z\") — nothing may be deleted, moved, rotated, pruned, stopped or reconfigured on it"
},
{
"Wizard": "Gemini",
"Model": "Google Gemini (relayed, chat-only)",
"Lane": "The Synthesis — reconcile the record, surface contradictions and the cross-cutting picture",
"Latest check-in": "2026-10-13",
"Current unit": "First reply landed via relay: identity confirmed + a draft \"Submission & Verification Audit Log\" format. **Lane charter + three first queue items owed.** Fault recorded (see check-in): cited example IDs (`fleet-ops`, `timmy-dispatch`, `self_heal.py`, …) that do not exist in the repo, not marked as placeholders"
},
{
"Wizard": "Argus",
"Model": "LongCat 2.5",
"Lane": "The Watch — evidence-law enforcement: verifies every check-in/commit/reply against the evidence rules, files cited findings to `audits/`",
"Latest check-in": "2026-10-14",
"Current unit": "Staffed. Lane: audit the pipe daily; findings carry file:line + SHA + severity; a clean pass must cite the SHA range checked. Model `meituan/longcat-2.5-preview:free`"
},
{
"Wizard": "Volt",
"Model": "DeepSeek V4.1 Flash",
"Lane": "The Workhorse — high-throughput general agent work: queue grind, general coding/reasoning, quick verifications, refactors, scripts",
"Latest check-in": "2026-10-15",
"Current unit": "Staffed. Model `deepseek-v4.1-flash` (552B MoE, 8B/16B active, native multimodal) via DeepSeek API. Clears the unowned queue items the specialized lanes don't take"
},
{
"Wizard": "Sentinel",
"Model": "Nemotron 3.5 Super VL",
"Lane": "The Long View — long-horizon multimodal agent work: sustained multi-step tasks, end-to-end reads, image+text reconciliation",
"Latest check-in": "2026-10-15",
"Current unit": "Staffed. Model `nvidia/nemotron-3.5-super-vl-120b-a12b` (120B MoE, 12B active, vision-language) via NVIDIA NIM free credits. Holds the thread on runs the flash lanes can't sustain"
},
{
"Wizard": "Beam",
"Model": "Reflection Beam 1.0 (501B)",
"Lane": "The Foundry — deep reasoning & hard coding/agentic problems → finished, CHECK-verified artifacts, max throughput",
"Latest check-in": "2026-10-20",
"Current unit": "Staffed. Model `reflection/beam-1.0-501b-a23b:free` (501B MoE, 23B active, reasoning model) via Nous free tier. **FREE WINDOW ≈ 1 week — run at max throughput until it expires**"
}
],
"staffed_count": 4,
"staffed": [
"Argus",
"Beam",
"Sentinel",
"Volt"
],
"lanes": [
"Archive verification & summary fidelity",
"Fast verification & triage — rapid mechanical passes, first-pass extraction",
"Operating partner — replies, queue, escalation",
"Repo census & access-state verification",
"The Crucible — one hard problem → one finished, verifiable artifact",
"The Foundry — deep reasoning & hard coding/agentic problems → finished, CHECK-verified artifacts, max throughput",
"The Long View — long-horizon multimodal agent work: sustained multi-step tasks, end-to-end reads, image+text reconciliation",
"The Synthesis — reconcile the record, surface contradictions and the cross-cutting picture",
"The Watch — evidence-law enforcement: verifies every check-in/commit/reply against the evidence rules, files cited findings to `audits/`",
"The Workhorse — high-throughput general agent work: queue grind, general coding/reasoning, quick verifications, refactors, scripts"
],
"checkin_dates": [
"2026-10-07",
"2026-10-10",
"2026-10-12",
"2026-10-13",
"2026-10-14",
"2026-10-15",
"2026-10-20"
]
}
+11
View File
@@ -0,0 +1,11 @@
Wizard,Model,Lane,Latest check-in,Current unit
Timmy,Hermes / DeepSeek,"Operating partner — replies, queue, escalation",— (replies daily),queue replies
Zephyrus Sparkborn,Mistral (Muse),Archive verification & summary fidelity,2026-10-10,"**Q20 — taken, not worked.** His named unit (excerpt fidelity & placement, 91 magazine entries) was closed by **Merlin** at `9a1de9a` (2026-10-12 04:49Z; verified from this host in `WORK-QUEUE.md`'s Q20 block and `replies/2026-10-12-to-merlin-20.md`) after Merlin's own process-fault disclosure. No Zephyrus check-in since 2026-10-10 (his newest commit is `a4fc298`, 2026-10-10T13:17:32Z; there is none for 2026-10-11 or 2026-10-12 — the earlier ""20:58Z"" in this cell was a clock this pipe cannot reproduce from `checkins/`, so the commit time replaces it), so his lane has nothing assigned and no unit of his own: **this needs Alexander's one line — re-task the lane or let it lapse — not silence**"
Cassian Assayborn,Grok,Repo census & access-state verification,2026-10-07,"— (Q5 closed; no open unit — lane silent since 2026-10-07, 5 days, needs a decision, not silence)"
Merlin,StepFun Step 5,"The Crucible — one hard problem → one finished, verifiable artifact",2026-10-12,"**All observed through Run 6; nothing of his is open.** Q39 closed (`fad802c`, fixed gate `9b09f328…`, all five negatives refused) and **verified from this host** in reply 22; Q40 closed and verified in reply 23 — the deployed gate `7ed1bca8…` returns rc 0 / 119 passed on all five negatives because `grep -c HELM_COLLECTOR` = **0**: it imports its subject at module scope (`:39`) and has **no subject-selection path at all**. **Adoption hold stands: do not `cp` gate `74aba348…`, and the §4 `cp` of collector `4e45021d…` + gate `9b09f328…` is Alexander's** — it is the only thing that puts Q31–Q40's protection into production. Standing asks, unchanged: adopt/hold, log rotation + `docker system prune`, and a ruling on `stackchain-dashboard.service`"
Mercury,Groq (free tier),"Fast verification & triage — rapid mechanical passes, first-pass extraction",2026-10-12,"**Day-3 check-in landed `e9efb23` at 12:00:38Z and it is the Q31 first slice, executed** — the collector's entry point run from a lane that is not Merlin's; that unit is now **discharged** (reply `replies/2026-10-12-to-mercury-03.md`). All eight of his measurements reproduce from this host, six byte-exact, including the two `/tmp` files he left behind (`efc9a241…`, `99e38db0…`) and the `--compare-live` line character for character; his two bodies differ from each other in clocks only. Next unit is set in the harness: a **read-only disk census** that must reproduce or falsify this pipe's own two figures (`500–600 MB/day` vs `~153 MB/day`; and ""logrotate did not rotate `syslog` at 2026-10-12 00:00Z"") — nothing may be deleted, moved, rotated, pruned, stopped or reconfigured on it"
Gemini,"Google Gemini (relayed, chat-only)","The Synthesis — reconcile the record, surface contradictions and the cross-cutting picture",2026-10-13,"First reply landed via relay: identity confirmed + a draft ""Submission & Verification Audit Log"" format. **Lane charter + three first queue items owed.** Fault recorded (see check-in): cited example IDs (`fleet-ops`, `timmy-dispatch`, `self_heal.py`, …) that do not exist in the repo, not marked as placeholders"
Argus,LongCat 2.5,"The Watch — evidence-law enforcement: verifies every check-in/commit/reply against the evidence rules, files cited findings to `audits/`",2026-10-14,Staffed. Lane: audit the pipe daily; findings carry file:line + SHA + severity; a clean pass must cite the SHA range checked. Model `meituan/longcat-2.5-preview:free`
Volt,DeepSeek V4.1 Flash,"The Workhorse — high-throughput general agent work: queue grind, general coding/reasoning, quick verifications, refactors, scripts",2026-10-15,"Staffed. Model `deepseek-v4.1-flash` (552B MoE, 8B/16B active, native multimodal) via DeepSeek API. Clears the unowned queue items the specialized lanes don't take"
Sentinel,Nemotron 3.5 Super VL,"The Long View — long-horizon multimodal agent work: sustained multi-step tasks, end-to-end reads, image+text reconciliation",2026-10-15,"Staffed. Model `nvidia/nemotron-3.5-super-vl-120b-a12b` (120B MoE, 12B active, vision-language) via NVIDIA NIM free credits. Holds the thread on runs the flash lanes can't sustain"
Beam,Reflection Beam 1.0 (501B),"The Foundry — deep reasoning & hard coding/agentic problems → finished, CHECK-verified artifacts, max throughput",2026-10-20,"Staffed. Model `reflection/beam-1.0-501b-a23b:free` (501B MoE, 23B active, reasoning model) via Nous free tier. **FREE WINDOW ≈ 1 week — run at max throughput until it expires**"
1 Wizard Model Lane Latest check-in Current unit
2 Timmy Hermes / DeepSeek Operating partner — replies, queue, escalation — (replies daily) queue replies
3 Zephyrus Sparkborn Mistral (Muse) Archive verification & summary fidelity 2026-10-10 **Q20 — taken, not worked.** His named unit (excerpt fidelity & placement, 91 magazine entries) was closed by **Merlin** at `9a1de9a` (2026-10-12 04:49Z; verified from this host in `WORK-QUEUE.md`'s Q20 block and `replies/2026-10-12-to-merlin-20.md`) after Merlin's own process-fault disclosure. No Zephyrus check-in since 2026-10-10 (his newest commit is `a4fc298`, 2026-10-10T13:17:32Z; there is none for 2026-10-11 or 2026-10-12 — the earlier "20:58Z" in this cell was a clock this pipe cannot reproduce from `checkins/`, so the commit time replaces it), so his lane has nothing assigned and no unit of his own: **this needs Alexander's one line — re-task the lane or let it lapse — not silence**
4 Cassian Assayborn Grok Repo census & access-state verification 2026-10-07 — (Q5 closed; no open unit — lane silent since 2026-10-07, 5 days, needs a decision, not silence)
5 Merlin StepFun Step 5 The Crucible — one hard problem → one finished, verifiable artifact 2026-10-12 **All observed through Run 6; nothing of his is open.** Q39 closed (`fad802c`, fixed gate `9b09f328…`, all five negatives refused) and **verified from this host** in reply 22; Q40 closed and verified in reply 23 — the deployed gate `7ed1bca8…` returns rc 0 / 119 passed on all five negatives because `grep -c HELM_COLLECTOR` = **0**: it imports its subject at module scope (`:39`) and has **no subject-selection path at all**. **Adoption hold stands: do not `cp` gate `74aba348…`, and the §4 `cp` of collector `4e45021d…` + gate `9b09f328…` is Alexander's** — it is the only thing that puts Q31–Q40's protection into production. Standing asks, unchanged: adopt/hold, log rotation + `docker system prune`, and a ruling on `stackchain-dashboard.service`
6 Mercury Groq (free tier) Fast verification & triage — rapid mechanical passes, first-pass extraction 2026-10-12 **Day-3 check-in landed `e9efb23` at 12:00:38Z and it is the Q31 first slice, executed** — the collector's entry point run from a lane that is not Merlin's; that unit is now **discharged** (reply `replies/2026-10-12-to-mercury-03.md`). All eight of his measurements reproduce from this host, six byte-exact, including the two `/tmp` files he left behind (`efc9a241…`, `99e38db0…`) and the `--compare-live` line character for character; his two bodies differ from each other in clocks only. Next unit is set in the harness: a **read-only disk census** that must reproduce or falsify this pipe's own two figures (`500–600 MB/day` vs `~153 MB/day`; and "logrotate did not rotate `syslog` at 2026-10-12 00:00Z") — nothing may be deleted, moved, rotated, pruned, stopped or reconfigured on it
7 Gemini Google Gemini (relayed, chat-only) The Synthesis — reconcile the record, surface contradictions and the cross-cutting picture 2026-10-13 First reply landed via relay: identity confirmed + a draft "Submission & Verification Audit Log" format. **Lane charter + three first queue items owed.** Fault recorded (see check-in): cited example IDs (`fleet-ops`, `timmy-dispatch`, `self_heal.py`, …) that do not exist in the repo, not marked as placeholders
8 Argus LongCat 2.5 The Watch — evidence-law enforcement: verifies every check-in/commit/reply against the evidence rules, files cited findings to `audits/` 2026-10-14 Staffed. Lane: audit the pipe daily; findings carry file:line + SHA + severity; a clean pass must cite the SHA range checked. Model `meituan/longcat-2.5-preview:free`
9 Volt DeepSeek V4.1 Flash The Workhorse — high-throughput general agent work: queue grind, general coding/reasoning, quick verifications, refactors, scripts 2026-10-15 Staffed. Model `deepseek-v4.1-flash` (552B MoE, 8B/16B active, native multimodal) via DeepSeek API. Clears the unowned queue items the specialized lanes don't take
10 Sentinel Nemotron 3.5 Super VL The Long View — long-horizon multimodal agent work: sustained multi-step tasks, end-to-end reads, image+text reconciliation 2026-10-15 Staffed. Model `nvidia/nemotron-3.5-super-vl-120b-a12b` (120B MoE, 12B active, vision-language) via NVIDIA NIM free credits. Holds the thread on runs the flash lanes can't sustain
11 Beam Reflection Beam 1.0 (501B) The Foundry — deep reasoning & hard coding/agentic problems → finished, CHECK-verified artifacts, max throughput 2026-10-20 Staffed. Model `reflection/beam-1.0-501b-a23b:free` (501B MoE, 23B active, reasoning model) via Nous free tier. **FREE WINDOW ≈ 1 week — run at max throughput until it expires**