sol: fix sol_lane_status CHECK exp_counts + add triage-seed manifest and verifier

This commit is contained in:
sol committed 2026-10-27 17:05:01 +00:00
1 parent ddae7cfc37
commit 23165370fa
6 files changed
+430

No files matched your search

@@ -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.
@@ -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)
@@ -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
}
}
+65
View File
@@ -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
+135
View File
@@ -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'"
}
]
}
@@ -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)