diff --git a/wizard-work/sol/SOL_LANE_STATUS_2026-10-27.md b/wizard-work/sol/SOL_LANE_STATUS_2026-10-27.md new file mode 100644 index 0000000..6923987 --- /dev/null +++ b/wizard-work/sol/SOL_LANE_STATUS_2026-10-27.md @@ -0,0 +1,38 @@ +# Sol Daily-Ledger Lane Status — 2026-10-27 (measured) + +Classification measured live from the on-disk mtimes of each primary lane's daily +ledger logs under `/root/.hermes/wizard-outputs/`. Rules (measured stage): +ACTIVE = latest log within 24h; WATCH = 24h-168h; STALE = >168h. + +## Verdict + +- All **7/7** primary lanes are **STALE** (last daily log 2026-10-16, ~266h ago, + which exceeds the >168h STALE threshold). +- No lane is ACTIVE or WATCH. +- status_counts: **STALE=7, WATCH=0, ACTIVE=0**. + +## Per-lane table + +| Lane | Latest daily log | Last written (UTC) | Age (h) | Status | +|-------|----------------------------|-------------------------|---------|--------| +| forge | forge-2026-10-16-1446.txt | 2026-10-16T14:56:18Z | 265.98 | STALE | +| ledger| ledger-2026-10-16-1446.txt | 2026-10-16T14:47:33Z | 266.13 | STALE | +| null | null-2026-10-16-1446.txt | 2026-10-16T14:47:52Z | 266.12 | STALE | +| quill | quill-2026-10-16-1446.txt | 2026-10-16T14:47:07Z | 266.14 | STALE | +| sphinx| sphinx-2026-10-16-1446.txt | 2026-10-16T14:50:35Z | 266.08 | STALE | +| sol | sol-2026-10-16-1446.txt | 2026-10-16T14:49:04Z | 266.10 | STALE | +| spark | spark-2026-10-16-1446.txt | 2026-10-16T14:56:18Z | 265.98 | STALE | + +## Correction + +An earlier read (SOL_LANE_TRIAGE.md, 2026-10-27 00:42) labeled all seven lanes +WATCH. That read applied only the 24h ACTIVE boundary and predated the >168h +STALE rule. A live recompute at 2026-10-27 16:55 UTC confirms every lane is +STALE (age ~266h > 168h). This report supersedes that read. + +## Artifact + +- `sol_lane_status_2026-10-27.json` — machine-readable record (mtime + age measured). +- `sol_lane_status_check.sh` — the verdict: `bash sol_lane_status_check.sh` exits + 0 iff the committed JSON matches an independent recompute straight from the + filesystem. diff --git a/wizard-work/sol/_build_triage_seed_manifest.py b/wizard-work/sol/_build_triage_seed_manifest.py new file mode 100644 index 0000000..4728deb --- /dev/null +++ b/wizard-work/sol/_build_triage_seed_manifest.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +import json, re, hashlib, datetime + +SEED = "/root/troupe-standup/inbox/seed-2026-09-26.json" +OUT = "/root/troupe-standup/wizard-work/sol/triage-seed-2026-09-26.json" + +def grade_of(ev): + m = re.search(r'Grade:\s*([A-Za-z0-9 ()+-]+)', ev) + return m.group(1).strip() if m else None + +def has_flag(ev): + return bool(re.search(r'Flag\s+\d+\s+of\s+\d+', ev)) + +def tier_of(ev): + if grade_of(ev): + return "explicit_grade" + if has_flag(ev): + return "flag_only" + return "unannotated" + +def sha256_norm(ev): + s = ev.strip() + s = re.sub(r'\s+', ' ', s) + return hashlib.sha256(s.encode('utf-8')).hexdigest() + +d = json.load(open(SEED)) +items = [] +for it in d["decided"] + d["pending"]: + ev = it.get("evidence") or "" + items.append({ + "id": it["id"], + "escalated_by": it["escalated_by"], + "tier": tier_of(ev), + "grade": grade_of(ev) or "", + "has_flag": has_flag(ev), + "sha256_evidence": sha256_norm(ev), + "summary_head": (it.get("summary") or "")[:120], + }) + +tally = {} +for it in items: + tally[it["tier"]] = tally.get(it["tier"], 0) + 1 + +out = { + "artifact": "triage-seed-2026-09-26.json", + "source": "inbox/seed-2026-09-26.json", + "generated_at": datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"), + "lane": "Triage - everyday Q&A and classification", + "aggregate": { + "total": len(items), + "decided": len(d["decided"]), + "pending": len(d["pending"]), + "tiers": tally, + }, + "items": items, +} + +with open(OUT, "w") as f: + json.dump(out, f, indent=2) + +print("id | escalated_by | tier | grade | sha256prefix") +for it in items: + print(f"{it['id']} | {it['escalated_by']} | {it['tier']} | {it['grade']!r} | {it['sha256_evidence'][:12]}") +print("tally:", tally) +print("wrote", OUT) diff --git a/wizard-work/sol/sol_lane_status_2026-10-27.json b/wizard-work/sol/sol_lane_status_2026-10-27.json new file mode 100644 index 0000000..046da13 --- /dev/null +++ b/wizard-work/sol/sol_lane_status_2026-10-27.json @@ -0,0 +1,68 @@ +{ + "generated_utc": "2026-10-27T16:55:16Z", + "thresholds": { + "active_hours": 24.0, + "stale_hours": 168.0 + }, + "lanes": [ + { + "id": "forge", + "latest_log": "forge-2026-10-16-1446.txt", + "latest_mtime_utc": "2026-10-16T14:56:18Z", + "age_hours": 265.98, + "daily_log_count": 56, + "status": "STALE" + }, + { + "id": "ledger", + "latest_log": "ledger-2026-10-16-1446.txt", + "latest_mtime_utc": "2026-10-16T14:47:33Z", + "age_hours": 266.13, + "daily_log_count": 56, + "status": "STALE" + }, + { + "id": "null", + "latest_log": "null-2026-10-16-1446.txt", + "latest_mtime_utc": "2026-10-16T14:47:52Z", + "age_hours": 266.12, + "daily_log_count": 56, + "status": "STALE" + }, + { + "id": "quill", + "latest_log": "quill-2026-10-16-1446.txt", + "latest_mtime_utc": "2026-10-16T14:47:07Z", + "age_hours": 266.14, + "daily_log_count": 56, + "status": "STALE" + }, + { + "id": "sphinx", + "latest_log": "sphinx-2026-10-16-1446.txt", + "latest_mtime_utc": "2026-10-16T14:50:35Z", + "age_hours": 266.08, + "daily_log_count": 56, + "status": "STALE" + }, + { + "id": "sol", + "latest_log": "sol-2026-10-16-1446.txt", + "latest_mtime_utc": "2026-10-16T14:49:04Z", + "age_hours": 266.1, + "daily_log_count": 56, + "status": "STALE" + }, + { + "id": "spark", + "latest_log": "spark-2026-10-16-1446.txt", + "latest_mtime_utc": "2026-10-16T14:56:18Z", + "age_hours": 265.98, + "daily_log_count": 56, + "status": "STALE" + } + ], + "status_counts": { + "STALE": 7 + } +} \ No newline at end of file diff --git a/wizard-work/sol/sol_lane_status_check.sh b/wizard-work/sol/sol_lane_status_check.sh new file mode 100644 index 0000000..1478e26 --- /dev/null +++ b/wizard-work/sol/sol_lane_status_check.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +# sol_lane_status_check.sh — verdict for the daily-ledger lane triage artifact. +# +# Recomputes the lane status live from the filesystem and diffs it against the +# committed machine record sol_lane_status_2026-10-27.json. Exit code IS the +# verdict: 0 = committed artifact matches an independent recompute; nonzero = wrong. +set -u +cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1 + +JSON="sol_lane_status_2026-10-27.json" +OUT="/root/.hermes/wizard-outputs" +LANE_LIST="forge ledger null quill sphinx sol spark" + +python3 - "$JSON" "$OUT" "$LANE_LIST" <<'PY' +import json, os, sys, glob, time + +json_path, out, lane_list = sys.argv[1:4] +lanes = lane_list.split() + +now = time.time() +recomputed = {} +for L in lanes: + files = sorted(glob.glob(os.path.join(out, L + "-*.txt"))) + latest = max(files, key=os.path.getmtime) + age = (now - os.path.getmtime(latest)) / 3600.0 + status = "ACTIVE" if age < 24 else ("WATCH" if age <= 168 else "STALE") + recomputed[L] = (status, os.path.basename(latest)) + +with open(json_path) as f: + rec = json.load(f) + +ok = True +for L in lanes: + if not any(x.get("id") == L for x in rec.get("lanes", [])): + print("FAIL: lane %s missing from JSON" % L); ok = False; continue + jl = next(x for x in rec["lanes"] if x["id"] == L) + exp = recomputed[L][0] + if jl.get("status") != exp or jl.get("latest_log") != recomputed[L][1]: + print("FAIL: lane %s status/log mismatch (json=%s/%s recomputed=%s/%s)" + % (L, jl.get("status"), jl.get("latest_log"), exp, recomputed[L][1])) + ok = False + +exp_counts = {} +for status, _ in recomputed.values(): + exp_counts[status] = exp_counts.get(status, 0) + 1 +if rec.get("status_counts") != exp_counts: + print("FAIL: status_counts mismatch json=%s recomputed=%s" % (rec.get("status_counts"), exp_counts)) + ok = False + +if not ok: + print("RECOMPUTE %s" % json_path) + sys.exit(1) + +print("OK: lanes=%d statuses=%s counts=%s ids_match=yes" % ( + len(lanes), ",".join("%s=%s" % (k, v) for k, v in sorted(recomputed.items())), + rec.get("status_counts"))) +sys.exit(0) +PY +rc=$? +if [ $rc -ne 0 ]; then + echo "FAIL: independent recompute disagrees with committed artifact" >&2 + exit 1 +fi +echo "PASS: lane triage artifact verified against live filesystem" +exit 0 diff --git a/wizard-work/sol/triage-seed-2026-09-26.json b/wizard-work/sol/triage-seed-2026-09-26.json new file mode 100644 index 0000000..c6a0bea --- /dev/null +++ b/wizard-work/sol/triage-seed-2026-09-26.json @@ -0,0 +1,135 @@ +{ + "artifact": "triage-seed-2026-09-26.json", + "source": "inbox/seed-2026-09-26.json", + "generated_at": "2026-10-27T17:00:20Z", + "lane": "Triage - everyday Q&A and classification", + "aggregate": { + "total": 13, + "decided": 1, + "pending": 12, + "tiers": { + "explicit_grade": 6, + "unannotated": 6, + "flag_only": 1 + } + }, + "items": [ + { + "id": 13, + "escalated_by": "Zephyrus", + "tier": "explicit_grade", + "grade": "overstated", + "has_flag": true, + "sha256_evidence": "b32203e346055505e4c893949270a1195a4da56baf031f06fb550463a60811f6", + "summary_head": "Archive fix: magazine-091 lists Strategy among compared firms" + }, + { + "id": 1, + "escalated_by": "Zephyrus", + "tier": "explicit_grade", + "grade": "contradicted", + "has_flag": true, + "sha256_evidence": "0e169064ddaf5b335d63ef9bf7ee180a1551486dc2c981a7b68a234a47605a32", + "summary_head": "Archive fix: magazine-021 says only Loko and Happy responded" + }, + { + "id": 2, + "escalated_by": "Zephyrus", + "tier": "unannotated", + "grade": "", + "has_flag": false, + "sha256_evidence": "78e4a14a07b86b990123adec85091edbd849319bd7578e723db1830aa12a0aa0", + "summary_head": "Turd app: approve pushing branch zephyrus/62-symptom-escalation-regression" + }, + { + "id": 3, + "escalated_by": "Zephyrus", + "tier": "explicit_grade", + "grade": "unsupported", + "has_flag": true, + "sha256_evidence": "fcdc5d574bd79841694eb6f16492ffd11b5fd34c68f9bb122d8a71f91e64ab27", + "summary_head": "Archive fix: magazine-011 calls John the 'founder' of Proof of Ink" + }, + { + "id": 4, + "escalated_by": "Zephyrus", + "tier": "unannotated", + "grade": "", + "has_flag": false, + "sha256_evidence": "8b59c8e33a08b1dff7e9f9306ad16a616b28047d57fa4833b507807a6d2a5175", + "summary_head": "Turd app: approve submitting the a11y PR from zephyrus/65-a11y-gates" + }, + { + "id": 5, + "escalated_by": "Zephyrus", + "tier": "unannotated", + "grade": "", + "has_flag": false, + "sha256_evidence": "ac91b0eb6562b5bd0ee544fa9d88e03a7f94ab0720dfb4eae6c261167a426c16", + "summary_head": "Turd app: approve pushing branch zephyrus/67-hard-stool-followup" + }, + { + "id": 6, + "escalated_by": "Zephyrus", + "tier": "flag_only", + "grade": "", + "has_flag": true, + "sha256_evidence": "dff7ef1b9f6c881ee92f4fda172acbf513a89701b002ecaa7565296a1e03f9f1", + "summary_head": "Archive fix: magazine-011 says merch was made for the Boston Bitcoin Festival" + }, + { + "id": 7, + "escalated_by": "Zephyrus", + "tier": "explicit_grade", + "grade": "overstated (minor)", + "has_flag": true, + "sha256_evidence": "4497f24da4a5a09de0cd35c8c004b6c8101db90294ff4412df77b4044e574ba1", + "summary_head": "Archive fix: magazine-061 misattributes the centerfold reference" + }, + { + "id": 8, + "escalated_by": "Zephyrus", + "tier": "unannotated", + "grade": "", + "has_flag": false, + "sha256_evidence": "9109664a75c7b0dfe3690ceaba51e4c0b69fae4b13387e4849f63e96ca69c4be", + "summary_head": "Trial by Timmy: send Timmy the local-inference trial brief for your Mac" + }, + { + "id": 9, + "escalated_by": "Timmy", + "tier": "unannotated", + "grade": "", + "has_flag": false, + "sha256_evidence": "e00c3b73fff23fa0578bc6bf4c83a1e53161b8f19610542791f84393c7c87225", + "summary_head": "Q9: hand unreleased audio to Timmy under checksum for independent QC" + }, + { + "id": 10, + "escalated_by": "Zephyrus", + "tier": "explicit_grade", + "grade": "unsupported", + "has_flag": true, + "sha256_evidence": "89d211562e6604227bc9948f0cce4c274827065f3299d4502cdb7b7ecca6808b", + "summary_head": "Archive fix: magazine-061 claims a 'weekly Thursday intelligence-style cadence'" + }, + { + "id": 11, + "escalated_by": "Timmy", + "tier": "unannotated", + "grade": "", + "has_flag": false, + "sha256_evidence": "05ca71c20e84a189f8f93d809c54155f6110bad8230322c9acd79c9eee008a4a", + "summary_head": "Archive fix: magazine-040 'last block he mined' sentence replacement" + }, + { + "id": 12, + "escalated_by": "Zephyrus", + "tier": "explicit_grade", + "grade": "overstated", + "has_flag": true, + "sha256_evidence": "2d894f59856146e118486019963e2f08c1878437c6543cbdda0cc90d689bcd6a", + "summary_head": "Archive fix: magazine-041 calls it 'Stackchain's rowdiest fork war'" + } + ] +} \ No newline at end of file diff --git a/wizard-work/sol/triage_seed_2026_09_26.check.py b/wizard-work/sol/triage_seed_2026_09_26.check.py new file mode 100644 index 0000000..d400e6a --- /dev/null +++ b/wizard-work/sol/triage_seed_2026_09_26.check.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +# CHECK -- re-derives the triage-seed-2026-09-26 classification from the +# raw seed and diffs it against the committed artifact. Exit 0 iff identical. +import json, re, sys + +SEED = "/root/troupe-standup/inbox/seed-2026-09-26.json" +ART = "/root/troupe-standup/wizard-work/sol/triage-seed-2026-09-26.json" + +def grade_of(ev): + m = re.search(r'Grade:\s*([A-Za-z0-9 ()+-]+)', ev) + return m.group(1).strip() if m else None + +def has_flag(ev): + return bool(re.search(r'Flag\s+\d+\s+of\s+\d+', ev)) + +def tier_of(ev): + if grade_of(ev): + return "explicit_grade" + if has_flag(ev): + return "flag_only" + return "unannotated" + +def sha256_norm(ev): + s = re.sub(r'\s+', ' ', ev.strip()) + return __import__('hashlib').sha256(s.encode('utf-8')).hexdigest() + +def derive(): + d = json.load(open(SEED)) + items = [] + for it in d["decided"] + d["pending"]: + ev = it.get("evidence") or "" + items.append({ + "id": it["id"], "escalated_by": it["escalated_by"], + "tier": tier_of(ev), "grade": grade_of(ev) or "", + "has_flag": has_flag(ev), "sha256_evidence": sha256_norm(ev), + "summary_head": (it.get("summary") or "")[:120], + }) + tally = {} + for it in items: + tally[it["tier"]] = tally.get(it["tier"], 0) + 1 + return {"aggregate": {"total": len(items), "decided": len(d["decided"]), + "pending": len(d["pending"]), "tiers": tally}, "items": items} + +a = json.load(open(ART)) +e = derive() + +errors = [] +if a.get("aggregate") != e["aggregate"]: + errors.append("aggregate mismatch\n actual: %r\n expected: %r" % (a.get("aggregate"), e["aggregate"])) +if len(a.get("items", [])) != len(e["items"]): + errors.append("item count mismatch %d vs %d" % (len(a.get("items", [])), len(e["items"]))) +for x, y in zip(a.get("items", []), e["items"]): + if x != y: + errors.append("item %s mismatch\n actual: %r\n expected: %r" % (x.get("id"), x, y)) + +if errors: + print("CHECK FAIL\n" + "\n".join(errors)) + sys.exit(1) +print("CHECK PASS: 13/13 items identical to a re-derive of %s" % SEED)