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:
1 parent
16649ee3b4
commit
3e3384c592
2 files changed
+211
No files matched your search
Executable
+130
@@ -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 $?
|
||||
@@ -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 |
|
||||
Reference in new issue
Block a user