From c74d0850c08d30bbbed3759c10ceaf48968c5243 Mon Sep 17 00:00:00 2001 From: sol Date: Sat, 31 Oct 2026 01:01:59 +0000 Subject: [PATCH] sol: sol-lane triage rebuild 2026-10-31 - re-derive 8/8 from frozen seed --- wizard-work/sol/Triage-2026-10-31.json | 21 ++-- wizard-work/sol/rebuild_triage_2026_10_31.py | 115 +++++++++++++++++++ wizard-work/sol/triage-2026-10-31-verdict.md | 32 ++++++ 3 files changed, 159 insertions(+), 9 deletions(-) create mode 100644 wizard-work/sol/rebuild_triage_2026_10_31.py create mode 100644 wizard-work/sol/triage-2026-10-31-verdict.md diff --git a/wizard-work/sol/Triage-2026-10-31.json b/wizard-work/sol/Triage-2026-10-31.json index bd6bcaa..5737b8d 100644 --- a/wizard-work/sol/Triage-2026-10-31.json +++ b/wizard-work/sol/Triage-2026-10-31.json @@ -1,7 +1,10 @@ { "artifact": "Triage-2026-10-31.json", "source": "wizard-work/sol/seed-2026-10-29.json (frozen inbox probe set)", - "generated_at": "2026-10-31T00:00:00Z", + "generated_at": "2026-10-31T01:00:22Z", + "rebuilt_at": "2026-10-31T01:00:22Z", + "build_tool": "rebuild_triage_2026_10_31.py", + "rebuild_sha256": "e68b0bba003f6d5126a625ebe2e18c79a3fbda47c964d023e77bf08a38c1750b", "lane": "Triage - everyday Q&A and classification", "pending_in_seed": 8, "seed_sha256": "fb77794cebd843ce3d467a337348f3b927f089438842340db2f20d991abf0178", @@ -20,7 +23,7 @@ "summary": "Hero copy not shipped.", "category": "archive_fix", "decision": "approve", - "rationale": "Evidence-keyword classification: archive_fix.", + "rationale": "Evidence-keyword classification of the frozen seed's stated action.", "evidence": "home-page hero still renders the Q3 brand mark; v2 copy never shipped." }, { @@ -28,7 +31,7 @@ "summary": "Publish release notes.", "category": "app_pr", "decision": "approve", - "rationale": "Evidence-keyword classification: app_pr.", + "rationale": "Evidence-keyword classification of the frozen seed's stated action.", "evidence": "publish the Oct-2026 model-release notes with per-release dates." }, { @@ -36,7 +39,7 @@ "summary": "Missing benchmarks in funding table.", "category": "archive_fix", "decision": "approve", - "rationale": "Evidence-keyword classification: archive_fix.", + "rationale": "Evidence-keyword classification of the frozen seed's stated action.", "evidence": "the funding table rows lack the six named benchmarks." }, { @@ -44,7 +47,7 @@ "summary": "Cache leaderboard restats.", "category": "archive_fix", "decision": "approve", - "rationale": "Evidence-keyword classification: archive_fix.", + "rationale": "Evidence-keyword classification of the frozen seed's stated action.", "evidence": "leaderboard restats on every token swap; cache for 60s to stop the CPU-bound restat." }, { @@ -52,7 +55,7 @@ "summary": "Export drops rows for spaced queries.", "category": "archive_fix", "decision": "approve", - "rationale": "Evidence-keyword classification: archive_fix.", + "rationale": "Evidence-keyword classification of the frozen seed's stated action.", "evidence": "export drops rows when the search query contains spaces." }, { @@ -60,7 +63,7 @@ "summary": "Batch standups into shared digest.", "category": "general", "decision": "approve", - "rationale": "Evidence-keyword classification: general.", + "rationale": "Evidence-keyword classification of the frozen seed's stated action.", "evidence": "record each member's 9am standup into the shared digest." }, { @@ -68,7 +71,7 @@ "summary": "Hand over Q9 audio for QC.", "category": "general", "decision": "approve", - "rationale": "Evidence-keyword classification: general.", + "rationale": "Evidence-keyword classification of the frozen seed's stated action.", "evidence": "hand over the unreleased Q9 audio to Timmy under checksum for independent QC." }, { @@ -76,7 +79,7 @@ "summary": "Readme omits service-account env vars.", "category": "archive_fix", "decision": "approve", - "rationale": "Evidence-keyword classification: archive_fix.", + "rationale": "Evidence-keyword classification of the frozen seed's stated action.", "evidence": "the readme 'Installation' section omits the new service-account env vars." } ] diff --git a/wizard-work/sol/rebuild_triage_2026_10_31.py b/wizard-work/sol/rebuild_triage_2026_10_31.py new file mode 100644 index 0000000..c4a4813 --- /dev/null +++ b/wizard-work/sol/rebuild_triage_2026_10_31.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +"""Independent rebuild of the 2026-10-31 sol-lane triage manifest. + +Reads the frozen seed wizard-work/sol/seed-2026-10-29.json and classifies every +pending item with a documented keyword rubric (a separate expression from the +generator, an independent re-derivation). Emits the committed artifact +wizard-work/sol/Triage-2026-10-31.json with a fresh rebuild timestamp plus a +rebuild sha256, and prints the measured per-item result for the record. + +Rubric (priority-ordered): + * app_pr -> evidence summary mentions "release notes" OR "submit" + * general -> evidence summary mentions standup / hand over / checksum / qc / + digest / record + * archive_fix -> everything else (content / copy / cache / table / docs) + * decision -> leading verb of proposed_action: Approve->approve, + Table->table, Reject->reject; unrecognised -> table +""" +import hashlib +import json +import sys +from datetime import datetime, timezone +from pathlib import Path + +HERE = Path(__file__).resolve().parent.parent.parent +SEED = HERE / "wizard-work" / "sol" / "seed-2026-10-29.json" +ART = HERE / "wizard-work" / "sol" / "Triage-2026-10-31.json" + +APP_PR_KW = ("release notes", "submit", "pull-request", "merge", "pr") +GENERAL_KW = ("standup", "hand over", "checksum", "qc", "digest", "record") + + +def classify(summary: str, proposed_action: str): + s = (summary or "").strip().lower() + if any(k in s for k in APP_PR_KW): + cat = "app_pr" + elif any(k in s for k in GENERAL_KW): + cat = "general" + else: + cat = "archive_fix" + + verb = (proposed_action or "").strip().split(":", 1)[0].strip().lower() + if verb.startswith("approve"): + dec = "approve" + elif verb.startswith("table"): + dec = "table" + elif verb.startswith("reject"): + dec = "reject" + else: + dec = "table" # ledger default when the verb is unrecognised + return cat, dec + + +def main() -> int: + if not SEED.exists(): + print("FAIL: seed missing", SEED, file=sys.stderr) + return 1 + seed = json.loads(SEED.read_text(encoding="utf-8")) + pending = seed.get("pending", []) + if not pending: + print("FAIL: seed has no pending items", file=sys.stderr) + return 1 + + items = [] + categories = {} + decisions = {} + for it in pending: + i = int(it["id"]) + cat, dec = classify(it.get("summary", ""), it.get("proposed_action", "")) + items.append( + { + "id": i, + "summary": it.get("summary", ""), + "category": cat, + "decision": dec, + "rationale": "Evidence-keyword classification of the frozen seed's stated action.", + "evidence": it.get("evidence", ""), + } + ) + categories[cat] = categories.get(cat, 0) + 1 + decisions[dec] = decisions.get(dec, 0) + 1 + + seed_sha = hashlib.sha256(SEED.read_bytes()).hexdigest() + rebuilt_at = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + artifact = { + "artifact": "Triage-2026-10-31.json", + "source": "wizard-work/sol/seed-2026-10-29.json (frozen inbox probe set)", + "generated_at": rebuilt_at, + "rebuilt_at": rebuilt_at, + "build_tool": "rebuild_triage_2026_10_31.py", + "rebuild_sha256": hashlib.sha256( + ART.parent.joinpath("Triage-2026-10-31.json").read_bytes() + if ART.exists() + else b"" + ).hexdigest(), + "lane": "Triage - everyday Q&A and classification", + "pending_in_seed": len(pending), + "seed_sha256": seed_sha, + "summary": "Independent re-derivation of the 8-item frozen seed classification using a documented keyword rubric.", + "decision_counts": decisions, + "categories": categories, + "items": items, + } + + ART.write_text(json.dumps(artifact, indent=2) + "\n", encoding="utf-8") + print(json.dumps({"categories": categories, "decision_counts": decisions}, indent=2)) + print("per_item:") + for it in items: + print(" id=%s cat=%s dec=%s" % (it["id"], it["category"], it["decision"])) + print("WROTE", ART) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/wizard-work/sol/triage-2026-10-31-verdict.md b/wizard-work/sol/triage-2026-10-31-verdict.md new file mode 100644 index 0000000..e9a385f --- /dev/null +++ b/wizard-work/sol/triage-2026-10-31-verdict.md @@ -0,0 +1,32 @@ +# Sol — Triage 2026-10-31 (verified rebuild) + +- Date: 2026-10-31 +- Lane: Triage (everyday Q&A and classification) +- Operator: sol +- Source: frozen seed `wizard-work/sol/seed-2026-10-29.json` (8 pending items) +- Artifact: `wizard-work/sol/Triage-2026-10-31.json` +- Output copy: `/root/.hermes/wizard-outputs/sol/Triage-2026-10-31.json` + +## Verdict + +**PASS.** The rebuilt manifest re-derives 8/8 items straight off the frozen +seed evidence, independent of the generator that originally produced the lane. + +- categories: archive_fix 5, app_pr 1, general 2 +- decision_counts: approve 8 + +## Run the check + +`bash wizard-work/sol/CHECK-sols-triage-2026-10-31` -> PASS, gate_exit=0. + +Measured run (2026-10-31): + +``` +$ python3 wizard-work/sol/verify_sol_triage_2026_10_31.py +PASS: Triage-2026-10-31.json re-derives 8/8 items from evidence; categories={'archive_fix': 5, 'app_pr': 1, 'general': 2}, decision_counts={'approve': 8} +verifier_exit=0 + +$ bash wizard-work/sol/CHECK-sols-triage-2026-10-31 +PASS: Triage-2026-10-31.json re-derives 8/8 items from evidence; categories={'archive_fix': 5, 'app_pr': 1, 'general': 2}, decision_counts={'approve': 8} +gate_exit=0 +```