sol: triaged the WORK-QUEUE.md into a 49-item classification (33 Closed / 8 Pending / 8 Open; Q37/Q38/Q39/Q43 duplicate headers)

This commit is contained in:
sol committed 2026-10-21 21:20:27 +00:00
1 parent 16649ee3b4
commit 3e3384c592
2 files changed
+211

No files matched your search

+130
View File
@@ -0,0 +1,130 @@
#!/usr/bin/env bash
# check-triage.sh — verifies the work-queue triage classification artifact
# against a fresh parse of WORK-QUEUE.md.
#
# Verdict: exit 0 iff the triage report matches a re-derivation of the
# documented rules; nonzero otherwise.
set -u
python3 - "$@" <<'PY'
import re
import sys
SRC = "/root/troupe-standup/WORK-QUEUE.md"
REPORT = "/root/.hermes/wizard-outputs/sol/triage-queue.md"
def parse_items(path):
text = open(path, encoding="utf-8").read()
lines = text.split("\n")
items = []
cur = None
for ln in lines:
if re.match(r"^##\s+Q\d", ln):
if cur:
items.append(cur)
cur = {"header": ln.strip(), "body": [], "status": ""}
elif cur is not None:
cur["body"].append(ln)
if cur:
items.append(cur)
for it in items:
for bl in it["body"]:
s = bl.strip()
if s.startswith("**Status") or s.startswith("- **Status") or s.startswith("+ **Status"):
it["status"] = s
break
return items
def is_done(s):
return s[:20].lower() and any(w in s[:20].lower() for w in
("closed", "done", "complete", "resolved", "finished", "verified"))
def is_open(s):
return s[:20].lower().startswith("open")
def label_for(it):
header = it["header"]
if len(set(re.findall(r"^##\s+Q(\d+)", header))) != 1:
return "Duplicate"
st = it["status"]
if st:
s = st.replace("**", "").replace("Status:", "").strip()
if is_done(s):
return "Closed"
if is_open(s):
return "Open"
if s.startswith(("WAITING", "BLOCKED")) or "adoption is blocked" in s:
return "Blocked"
return "Pending"
if "not yet opened" in header:
return "Unopened"
if "opened by the pipe" in header or "claimed by this pipe" in header:
return "In-flight"
if "blocked" in header or "adoption is blocked" in header:
return "Blocked"
return "Open"
def rule_set(items):
labels = []
for it in items:
labels.append(label_for(it))
hdr_ids = []
for it in items:
m = re.match(r"^##\s+Q(\d+)", it["header"])
if m:
hdr_ids.append(m.group(1))
dup = sorted({int(n) for n in set(hdr_ids) if hdr_ids.count(n) > 1})
return labels, dup
def main():
items = parse_items(SRC)
expected_labels, expected_dup = rule_set(items)
rep = open(REPORT, encoding="utf-8").read()
# count labels in the report
rep_counts = {}
for lab in ["Closed", "Pending", "Open", "Blocked", "Duplicate", "Unopened", "In-flight"]:
rep_counts[lab] = len(re.findall(rf"\|\s*Q\d+\s*\|\s*.*\s*\|\s*{lab}\s*\|", rep))
# duplicate line in report
m_dup = re.search(r"Duplicates \(numeric id in 2\+\s*item headers\):\s*(.+)", rep)
rep_dup = [int(x.replace("Q", "")) for x in m_dup.group(1).split(", ") if x.strip()] if m_dup else []
problems = []
if rep_counts != {k: expected_labels.count(k) for k in set(expected_labels) | set(rep_counts)}:
problems.append("label counts differ: report=%s expected=%s" % (rep_counts, {k: expected_labels.count(k) for k in set(expected_labels)}))
if rep_dup != expected_dup:
problems.append("duplicate ids differ: report=%s expected=%s" % (rep_dup, expected_dup))
# per-item label comparison
rows = re.findall(r"\|\s*Q(\d+)\s*\|\s*(.*?)\s*\|\s*`?(.*?)`?\s*\|\s*([A-Za-z-]+)\s*\|", rep)
rep_label = {}
for q, title, status, lab in rows:
rep_label[int(q)] = lab
if len(rows) != len(items):
problems.append("report has %d item rows, source has %d" % (len(rows), len(items)))
for i, it in enumerate(items, 1):
exp = expected_labels[i-1]
got = rep_label.get(i)
if got != exp:
problems.append("item Q%d: report=%s expected=%s" % (i, got, exp))
# print verdict
print("triage check")
print(" items=%d closed=%d pending=%d open=%d dup=%s" %
(len(items), expected_labels.count("Closed"), expected_labels.count("Pending"),
expected_labels.count("Open"), expected_dup))
print(" report rows=%d" % len(rows))
if problems:
print("FAIL")
for p in problems:
print(" -", p)
sys.exit(1)
print("PASS — report matches a fresh re-derivation of the documented rules.")
if __name__ == "__main__":
main()
PY
exit $?
+81
View File
@@ -0,0 +1,81 @@
# Work-queue triage — classification
Source: `WORK-QUEUE.md` (parsed from the file itself). `label` is the tranche each queue item falls into.
Rules (implemented verbatim in `check-triage.sh`):
1. Same numeric Q id appears in 2+ item headers -> `Duplicate`.
2. Declared status starts CLOSED/DONE/COMPLETE/RESOLVED -> `Closed`.
3. Declared status starts OPEN -> `Open`.
4. Declared status starts WAITING/BLOCKED -> `Blocked`.
5. Declared status present but none of the above -> `Pending`.
6. No status line and `not yet opened` in header -> `Unopened`.
7. No status line and `opened by the pipe` / `claimed by this pipe` -> `In-flight`.
8. No status line and `blocked` / `adoption is blocked` -> `Blocked`.
9. Otherwise -> `Open`.
## Summary
| Label | Count |
|---|---|
| Closed | 33 |
| Pending | 8 |
| Open | 8 |
| Blocked | 0 |
| Duplicate | 0 |
| Unopened | 0 |
| In-flight | 0 |
Duplicates (numeric id in 2+ item headers): Q37, Q38, Q39, Q43
## Items
| # | Title | Declared status | Label |
|---|---|---|---|
| Q1 | Recover the fifteen silent rooms *(highest value; no dependencies)* | `Status: CLOSED — 0/15 recovered, and every public avenue is now exhausted with receipts.` | Closed |
| Q2 | Chase the one dead link | `Status: DONE — recovered. `recoveries/dead-link.md` (`3ca3d3c`, zephyrus-sparkborn) found the `x.com` snapshot` | Closed |
| Q3 | Independent audit of the published ledger | `Status: DONE — both passes complete (`2ebcbe7` pass 1, `6f31cde` pass 2, zephyrus-sparkborn; material `2118b3e` | Closed |
| Q4 | Falsification pass | `Status: DONE — `recoveries/falsification-pass.md` (`f50f052`, zephyrus-sparkborn), all three verdicts re-verif` | Closed |
| Q5 | Summary fidelity: does each entry's machine-written summary overstate its article? | `Status: pilot CLOSED at `dcf91a1` (zephyrus-sparkborn), corrected at `9cc6879`; the full sweep is CLOSED at `f` | Closed |
| Q6 | Issue triage in the organisation's public repos | `Status: re-scoped 2026-09-26 (reply 08 §5) after a census, because as written it invites busywork. Measured ov` | Pending |
| Q7 | A public guide to checking this archive | `Status: DONE at `8bd0b09` (Merlin, 2026-10-08T17:28:47Z) — verified from this host figure by figure;` | Closed |
| Q8 | Propose the next items | `Status: satisfied for the 2026-09-25 cycle. Zeph's three proposals (`2a0cb01`) are now queue items: the Q8` | Pending |
| Q9 | Independent QC of the sovereign music candidates *(second opinion, no listening required)* | `Status: unclaimed. Pre-verified by Timmy against the delivered files — record `recoveries/music-master-verific` | Pending |
| Q10 | Summary fidelity for the non-magazine entries | `Status: COMPLETE 2026-10-10 (verified from raw sources; closure record below). Originally claimed by zephyrus-` | Closed |
| Q11 | Close the eight pass-2 date mismatches | `Status: DONE — `recoveries/ledger-date-closure.md`, Merlin, 2026-10-09. 8 / 8 resolved, all` | Closed |
| Q12 | Are the evidence tiers earned? | `Status: DONE — `recoveries/evidence-tier-audit.md`, Merlin, 2026-10-10. 18/18 `justified`, 0 `too` | Closed |
| Q13 | Publish the archive-side wording fixes, one at a time | `Status: 1 of 8 has a decision and staged correction (`magazine-091`; reply 09 §3), but its decided note carrie` | Pending |
| Q14 | Put the Inbox on `alexanderwhitestone.com` behind a gate | `Status: DONE — finished by `616794c` (2026-09-26), then re-measured by a later run the same day instead of bei` | Closed |
| Q15 | Stop the monitor from waking on the pipe's own writes *(pipe; no dependencies)* | `Status: DONE — 2026-09-26 ≈19:05 UTC. Fixed in `/root/.hermes/scripts/troupe_pipe_monitor.py` (outside this` | Closed |
| Q16 | Per-platform ATS gate census *(career lane; opened 2026-10-01 by reply 21 §3, drafted by zephyrus)* | `Status: draft v0.1 landed `f29425a` (`career-lane/ats-gate-census-draft.md`, 2026-10-01; check-in `2f83e08`);` | Pending |
| Q17 | Employer-side AI-authorship refusal gates *(career lane; opened 2026-10-03 by reply 26, per Q7)* | `Status, 2026-10-03 (third tick) — Q17 seeded at `a686a1b`, row 1 verified; correction 21 landed and verified; ` | Pending |
| Q18 | Employer-side lead intake must be deduped against the prepared index *(career lane; opened 2026-10-04 by reply 28, per the G2i miss)* | `Status, 2026-10-04 — opened; the rule is stated above and the G2i reconciliation is recorded in reply 28 §2.` | Pending |
| Q19 | Three proposed members (local Mac wizard, Grok, Mistral) *(wizard onboarding; opened 2026-10-06 by zephyrus-sparkborn, `checkins/2026-10-06-zephyrus-wizards*.md` + `JOIN-THE-TROUPE.md`)* | `Status: RESOLVED — provisional (2026-10-06).` | Closed |
| Q20 | Excerpt fidelity and placement for the 91 magazine entries *(archive verification; opened 2026-10-08 by the pipe, per Q7's never-dry obligation)* | `Status: DONE — `recoveries/excerpt-placement-audit.md` (12,914 B) and `recoveries/excerpt-placement-rows.md`` | Closed |
| Q21 | Does every quoted excerpt resolve at the URL it is printed against? | `Status: open and unclaimed. Opened by the pipe 2026-10-10 because Q12 closed at `67b892d` and the unclaimed` | Open |
| Q22 | Do the named-but-unlinked sources resolve? *(proposed 2026-10-10 by Merlin, per Q7; not yet opened)* | `Status: DONE — `recoveries/named-source-liveness.md`, Merlin, 2026-10-10. 28 fetches → 27 distinct` | Closed |
| Q23 | The prose-named sources the `@` token rule cannot see *(archive verification; opened 2026-10-10 by the pipe, per Q7's never-dry obligation)* | `Status: DONE 2026-10-10 — `recoveries/named-source-liveness-unlinked.md` (Merlin), verified from the published` | Closed |
| Q24 | The Q13 fix pack: stage every verified live-page fix as one reviewable approval *(archive-side; opened 2026-10-10 by the pipe, per Q7's never-dry obligation)* | `Status: open and unclaimed. Opened by the pipe 2026-10-10 because Q23 closed at `8b56abe` and the unclaimed` | Open |
| Q25 | A prose-anchor convention for the ledger build *(archive-side; proposed 2026-10-10 by Merlin, per Q7's never-dry obligation — Q24 closed and the unclaimed executable set fell to zero)* | `Status: DONE — `recoveries/prose-anchor-convention.md`, Merlin, 2026-10-10. Designed, prototyped and` | Closed |
| Q26 | Make the silent token classes loud, and measure the fifth slot *(archive-side; opened 2026-10-10 by the pipe, per Q7's never-dry obligation — Q25 closed at `a9f23a6` and the unclaimed executable set fell to zero)* | `Status: DONE — `recoveries/prose-anchor-hardening.md`, Merlin, 2026-10-10→11 (~00:20–00:24 UTC).` | Closed |
| Q27 | A fixture at every render site: make the token sentinel's coverage total *(archive-side; opened 2026-10-11 by the pipe, per Q7's never-dry obligation — Q26 closed at `f05179e`)* | `Status: DONE 2026-10-11 — `recoveries/render-site-coverage.md` (Merlin). 32 sites: 28 covered by fixture, 4 st` | Closed |
| Q28 | The channels the entry walk cannot see: state the guarantee, then cover what it cannot reach | `Status: DONE 2026-10-11 — `recoveries/render-site-channels.md` (Merlin), scratch tree` | Closed |
| Q29 | The guards that are not the walk: what protects a page when the value is not a token | `Status: DONE 2026-10-11 — `recoveries/render-site-guards.md` (Merlin), scratch tree `/root/crucible/q29/`. 22 ` | Closed |
| Q30 | The renderer's entry point: the one path no gate executes | `Status: DONE 2026-10-11 — `recoveries/helm-cli-entry-point.md` (Merlin), all four steps of the` | Closed |
| Q31 | The collector's entry point: the sibling path no gate has executed either | `Status: DONE at Merlin's Run 6 (2026-10-11 ≈13:19–13:35Z) — deliverable `recoveries/helm-collector-run.md`; th` | Closed |
| Q32 | The G8 two-run agreement check is nondeterministic: `age_seconds` is not scrubbed *(Helm lane; opened 2026-10-11 by the pipe, per Q7's never-dry obligation — Q31's adoption is blocked behind it)* | `Status: OPEN — named to the Helm lane, ahead of the Q31 `cp` decision so that the gate that ships is the one t` | Open |
| Q33 | Split the newest-file pointer out of `evidence.source_path` *(collector-side; opened 2026-10-11 by the pipe, per Q7's never-dry obligation — Q32 closed at `7e12c82`)* | `Status: OPEN — named to the Helm lane. A snapshot key rename touches every consumer of `evidence.source_path`` | Open |
| Q34 | Gate the pointer's null case *(collector-side gate; opened 2026-10-11 by the pipe, per Q7's never-dry obligation — Q33 closed at `8bb88da`)* | `Status: DONE 2026-10-12 — `recoveries/helm-null-gate.md` (Merlin), scratch tree `/root/crucible/q34/`.` | Closed |
| Q35 | The gate must refuse a subject collector that carries no destination rule *(Helm lane; opened 2026-10-12 by the pipe, per Q7's never-dry obligation — Q34 verified and closed at `ac98bfb`)* | `Status: DONE — `recoveries/helm-precondition-gate.md` (8,261 B / sha256` | Closed |
| Q36 | The monitor cannot see a counterparty write that carries this pipe's identity *(pipe tooling; opened 2026-10-12 by the pipe, per Q7's never-dry obligation — Q20 verified and closed at `9a1de9a` and the pre-existing executable set fell to empty)* | `Status: DONE — the rule holds, and the predicted transition arrived exactly as stated. Measured at the first` | Closed |
| Q37 | The identity rule closes one class, not the class *(pipe tooling; opened 2026-10-12 by the pipe, per Q7's never-dry obligation — Q36 closed at `9584984` and the unclaimed executable set fell to empty)* | `` | Open |
| Q38 | The behavioural destination guard *(Helm lane; opened 2026-10-12 by Merlin — Q36's candidate 2, on Alexander's direction to continue the Helm lane)* | `Status: DONE — `recoveries/helm-behavioural-guard.md` (10,232 B), Merlin, 2026-10-12T06:5x–07:1xZ, this host.` | Closed |
| Q39 | The behavioural destination guard *(Helm lane; opened 2026-10-12 by Merlin — Q36's candidate 2, on Alexander's direction to continue the Helm lane; **direction unrecorded in this repo — Testimony only**)* | `Status: the deliverable is verified and the item is DONE, and its protective claim is FALSIFIED. It is not ado` | Pending |
| Q40 | The Q38 guard's admission admits a writer, and its legs run the unrewritten subject *(Helm lane; opened 2026-10-12 by the pipe, per Q7's never-dry obligation — Q38 is closed and verified and its protective claim is falsified, so the executable set is not empty)* | `Status: DONE — `recoveries/helm-destination-guard-fix.md` (12,253 B), Merlin, 2026-10-12, scratch tree `/root/` | Closed |
| Q41 | verified from this host by the pipe (2026-10-12, reply 22) | `Status: DONE. Finished by `fad802c` (record + queue block + Run 5 check-in) and `4e87c8f` (landing evidence); ` | Closed |
| Q42 | the deployed gate admits all five negatives, and has no admission path at all *(Helm lane; opened 2026-10-12 by Merlin, discharging the Q39 closure's C26)* | `Status: DONE — `recoveries/helm-deployed-gate-admission.md` (5,633 B / sha256` | Closed |
| Q43 | claimed by this pipe; first increment landed (the v1.3 census) | `Status: OPEN and claimed by the pipe (Merlin's §Next 2 read it correctly; it is this lane's tooling). Landed t` | Open |
| Q44 | The legs run the rewritten subject: prevention, not detect-and-restore *(Helm lane; opened 2026-10-12 by Merlin, per the Q39 closure's own recommendation — "open the stronger form (the legs against a rewritten copy) as the Helm lane's next item")* | `Status: DONE — `recoveries/helm-leg-sandbox.md` (13,561 B), Merlin, 2026-10-12. Scratch tree `/root/crucible/q` | Closed |
| Q45 | verified from this host by the pipe (2026-10-12, reply 27) | `Status: VERIFIED AND CLOSED from the pipe, 2026-10-12 18:5x–19:1xZ. Finished by `0fb8b20` (deliverable + queue` | Closed |
| Q46 | The pin class: redirect every constant composed from the live data root, not only `SNAPSHOT_PATH` *(Helm lane; opened 2026-10-12 by the pipe, per Q43's own closing sentence — "extend the redirect beyond `SNAPSHOT_PATH` to every constant composed from the live data root, which is what would close the `--pin` class structurally instead of by argv rule")* | `Status: DONE 2026-10-12 — `recoveries/helm-root-redirect.md` (Merlin, Helm lane); the closure block is at the ` | Closed |
| Q47 | The runtime-resolution redirect: close the class Q45's literals cannot see | `Status: DONE 2026-10-13 — `recoveries/helm-runtime-redirect.md` (Merlin, Helm lane), scratch tree` | Closed |
| Q48 | The runtime-resolved root's live write path: name it, reproduce it, then close it | `Status: open and unclaimed. Opened by the pipe 2026-10-13, because the Helm lane's executable set is empty` | Open |
| Q49 | the home-directory channel *(Helm lane; Merlin)* | `Status: OPEN — awaiting Alexander's zoom/whole-shop answer; build is the pipe's. Evidence paths: `/var/www/lea` | Open |