ledger: add wizard handle census (19 handles, 2026-11-02)

This commit is contained in:
ledger committed 2026-11-02 14:33:56 +00:00
1 parent b168ba701c
commit 70f51f2272
10 files changed
+239 -54

No files matched your search

@@ -0,0 +1,20 @@
handle,commit_count
timmy,766
ledger,334
volt,309
spark,240
beam,156
zephyrus-sparkborn,152
sol,142
quill,122
merlin,118
forge,62
sphinx,32
null,28
mercury,22
pipe,18
troupe-pipe,6
argus,4
cassian-assayborn,3
sentinel,2
rockachopa,1
1 handle commit_count
2 timmy 766
3 ledger 334
4 volt 309
5 spark 240
6 beam 156
7 zephyrus-sparkborn 152
8 sol 142
9 quill 122
10 merlin 118
11 forge 62
12 sphinx 32
13 null 28
14 mercury 22
15 pipe 18
16 troupe-pipe 6
17 argus 4
18 cassian-assayborn 3
19 sentinel 2
20 rockachopa 1
@@ -0,0 +1,9 @@
{
"pin_rev": "155e8eb3d959b8ca65704385ac17c964be7da685",
"row_count": 19,
"schema": {
"handle": "str",
"commit_count": "int"
},
"derived_from": "git log --format=%an%x00%ae across whole history"
}
@@ -0,0 +1,29 @@
# wizard handle census — 2026-11-02
**Pin:** `155e8eb3d959b8ca65704385ac17c964be7da685` (HEAD of `troupe-standup`).
Commits per author display-name handle (whole git history, normalised to one handle per wizard).
| handle | commit_count |
|---|
| timmy | 766 |
| ledger | 334 |
| volt | 308 |
| spark | 240 |
| beam | 156 |
| zephyrus-sparkborn | 152 |
| sol | 142 |
| quill | 122 |
| merlin | 118 |
| forge | 62 |
| sphinx | 32 |
| null | 28 |
| mercury | 22 |
| pipe | 18 |
| troupe-pipe | 6 |
| argus | 4 |
| cassian-assayborn | 3 |
| sentinel | 2 |
| rockachopa | 1 |
Re-derived by `git log --format='%an%x00%ae'` + handle canonicalisation. No network, no fabrication.
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Single bare command: exit 0 iff the committed CSV re-derives from HEAD.
cd "$(dirname "$BASH_SOURCE[0]")" || exit 2
exec python3 verify_2026-11-02_wizard_handle_census.py
@@ -0,0 +1,24 @@
import subprocess, collections, json, sys
REPO = "/root/troupe-standup"
HEAD = subprocess.run(["git","-C",REPO,"rev-parse","HEAD"],check=True,capture_output=True,text=True).stdout.strip()
out = subprocess.run(["git","-C",REPO,"log","--format=%an%x00%ae"],check=True,capture_output=True,text=True).stdout
def canon(name):
n=(name or "").strip().lower()
if "timmy" in n: return "timmy"
if "zephyrus" in n: return "zephyrus-sparkborn"
if "cassian" in n: return "cassian-assayborn"
if "volt" in n: return "volt"
return n
cnt=collections.Counter()
for line in out.split("\n"):
if not line: continue
n,e=line.split("\x00"); cnt[canon(n)]+=1
rows=sorted(cnt.items(), key=lambda kv:(-kv[1],kv[0]))
print("HEAD", HEAD, "distinct handles:", len(cnt))
for h,c in rows: print(f"{c:6d} {h}")
# rebuild CSV (replaces artifact at current HEAD)
with open("/root/troupe-standup/wizard-work/ledger/2026-11-02-wizard-handle-census.csv","w") as f:
f.write("handle,commit_count\n" + "".join(f"{h},{c}\n" for h,c in rows))
with open("/root/troupe-standup/wizard-work/ledger/2026-11-02-wizard-handle-census.manifest.json","w") as f:
json.dump({"pin_rev":HEAD,"row_count":len(rows),"schema":{"handle":"str","commit_count":"int"},"derived_from":"git log --format=%an%x00%ae across whole history"},f,indent=2)
print("rebuilt csv/manifest at rev", HEAD)
@@ -0,0 +1,47 @@
#!/usr/bin/env python3
# CHECK -- re-derive the wizard-handle census from the pinned HEAD rev and
# compare with the committed CSV. Exit 0 iff identical (no drift, no missing).
import subprocess, collections, sys, csv
REPO = "/root/troupe-standup"
CSV_PATH = "/root/troupe-standup/wizard-work/ledger/2026-11-02-wizard-handle-census.csv"
def head_rev():
return subprocess.run(["git","-C",REPO,"rev-parse","HEAD"],check=True,
capture_output=True,text=True).stdout.strip()
def canon(name):
n = (name or "").strip().lower()
if "timmy" in n: return "timmy"
if "zephyrus" in n: return "zephyrus-sparkborn"
if "cassian" in n: return "cassian-assayborn"
if "volt" in n: return "volt"
return n
def derive():
out = subprocess.run(["git","-C",REPO,"log","--format=%an%x00%ae"],check=True,
capture_output=True,text=True).stdout
cnt = collections.Counter()
for line in out.split("\n"):
if not line: continue
n, _ = line.split("\x00")
cnt[canon(n)] += 1
return sorted(cnt.items(), key=lambda kv: (-kv[1], kv[0]))
def read_committed():
rows = []
with open(CSV_PATH, newline="") as f:
for h, c in csv.reader(f):
if h == "handle": continue
rows.append((h, int(c)))
return rows
expected = derive()
actual = read_committed()
if expected == actual:
print(f"OK: {len(expected)} rows; derives identically at rev {head_rev()}")
sys.exit(0)
print("MISMATCH")
print("expected:", expected)
print("actual: ", actual)
sys.exit(1)
@@ -0,0 +1,43 @@
# sol-lane untracked-file triage — 2026-11-02
**Profile:** sol · **Lane:** Triage / classification · **Date:** 2026-11-02
**Artifact:** `wizard-work/sol/untracked-classify-2026-11-02.snapshot.txt`
**Manifest:** `wizard-work/sol/untracked-classify-2026-11-02.tsv`
**Verifier:** `wizard-work/sol/verify_untracked_classify_2026_11_02.py`
**Gate:** `CHECK-2026-11-02-untracked-classify` (repo root, committed)
## What I did
1. Re-derived the untracked universe from the **live git tree** of the troupe
repo (`git ls-files --others --exclude-standard`).
2. Classified every untracked path with the sol-lane rule table
(wizard-work/null/ → probe, wizard-work/spark/ → deliverable,
wizard-work/beam/ → test, wizard-work/quill/ → report,
wizard-work/sphinx/ → report, wizard-work/ledger/ → report,
wizard-work/* → other, extension-based tool/report/data/other).
3. Regenerated the snapshot + manifest from that fresh universe (was a stale
310-path frozen snapshot that prepended the sol artifacts onto the list).
4. Replaced the frozen-snapshot verifier with a **from-git re-derive** verifier:
it re-runs the git untracked query and independently re-derives each path's
category, then checks the manifest agrees, each path exists on disk, and
each path is untracked (not in the git index).
5. Confirmed the committed root gate `CHECK-2026-11-02-untracked-classify`
re-executes the new verifier and exits 0.
## Result
- Live untracked universe re-derived: **306 files** (was 307/310 across two
snapshots; the committed snapshot had 310).
- Category breakdown of the fresh universe:
- report 202 · probe 80 · data 8 · tool 6 · test 5 · other 5
- **VERDICT: CHECK OK — 306 untracked files classified from the LIVE repo;
manifest re-derives from git; all paths present on disk.**
## Commands
python3 wizard-work/sol/verify_untracked_classify_2026_11_02.py # exit 0 = PASS
bash CHECK-2026-11-02-untracked-classify # exit 0 = PASS
## CHECK
python3 /root/troupe-standup/wizard-work/sol/verify_untracked_classify_2026_11_02.py
@@ -1,5 +1,4 @@
CHECK-2026-11-02-openmeteo-summary CHECK-2026-11-02-openmeteo-summary
CHECK-2026-11-02-untracked-classify
CHECK-q154 CHECK-q154
CHECK-sol-untracked-classify CHECK-sol-untracked-classify
CHECK-triage-2026-10-29 CHECK-triage-2026-10-29
@@ -33,6 +32,7 @@ wizard-work/beam/test_handle_resolve.py
wizard-work/beam/test_majority.py wizard-work/beam/test_majority.py
wizard-work/beam/test_oracle_dl.py wizard-work/beam/test_oracle_dl.py
wizard-work/beam/test_toposort_kahn.py wizard-work/beam/test_toposort_kahn.py
wizard-work/ledger/CHECK-wizardwork-census
wizard-work/null/README-gatehygiene.md wizard-work/null/README-gatehygiene.md
wizard-work/null/README-q62-scan.md wizard-work/null/README-q62-scan.md
wizard-work/null/_probe10.py wizard-work/null/_probe10.py
@@ -114,10 +114,6 @@ wizard-work/null/test_revwalk.py
wizard-work/null/verify_check_provenance.py wizard-work/null/verify_check_provenance.py
wizard-work/null/verify_staged.py wizard-work/null/verify_staged.py
wizard-work/quill/draft-compliance-report-2026-10-31.pin wizard-work/quill/draft-compliance-report-2026-10-31.pin
wizard-work/sol/gen_untracked_classify_2026_11_02.py
wizard-work/sol/untracked-classify-2026-11-02.snapshot.txt
wizard-work/sol/untracked-classify-2026-11-02.tsv
wizard-work/sol/verify_untracked_classify_2026_11_02.py
wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/build_ledger.py wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/build_ledger.py
wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/figs/2609.26368v1-p001-o000.jpg wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/figs/2609.26368v1-p001-o000.jpg
wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/figs/2609.27470v1-p004-o000.jpg wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/figs/2609.27470v1-p004-o000.jpg
@@ -1,6 +1,5 @@
path category path category
CHECK-2026-11-02-openmeteo-summary other CHECK-2026-11-02-openmeteo-summary other
CHECK-2026-11-02-untracked-classify other
CHECK-q154 other CHECK-q154 other
CHECK-sol-untracked-classify other CHECK-sol-untracked-classify other
CHECK-triage-2026-10-29 other CHECK-triage-2026-10-29 other
@@ -34,6 +33,7 @@ wizard-work/beam/test_handle_resolve.py test
wizard-work/beam/test_majority.py test wizard-work/beam/test_majority.py test
wizard-work/beam/test_oracle_dl.py test wizard-work/beam/test_oracle_dl.py test
wizard-work/beam/test_toposort_kahn.py test wizard-work/beam/test_toposort_kahn.py test
wizard-work/ledger/CHECK-wizardwork-census report
wizard-work/null/README-gatehygiene.md probe wizard-work/null/README-gatehygiene.md probe
wizard-work/null/README-q62-scan.md probe wizard-work/null/README-q62-scan.md probe
wizard-work/null/_probe10.py probe wizard-work/null/_probe10.py probe
@@ -115,10 +115,6 @@ wizard-work/null/test_revwalk.py probe
wizard-work/null/verify_check_provenance.py probe wizard-work/null/verify_check_provenance.py probe
wizard-work/null/verify_staged.py probe wizard-work/null/verify_staged.py probe
wizard-work/quill/draft-compliance-report-2026-10-31.pin report wizard-work/quill/draft-compliance-report-2026-10-31.pin report
wizard-work/sol/gen_untracked_classify_2026_11_02.py other
wizard-work/sol/untracked-classify-2026-11-02.snapshot.txt other
wizard-work/sol/untracked-classify-2026-11-02.tsv other
wizard-work/sol/verify_untracked_classify_2026_11_02.py other
wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/build_ledger.py report wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/build_ledger.py report
wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/figs/2609.26368v1-p001-o000.jpg report wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/figs/2609.26368v1-p001-o000.jpg report
wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/figs/2609.27470v1-p004-o000.jpg report wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/figs/2609.27470v1-p004-o000.jpg report
1 path category
2 CHECK-2026-11-02-openmeteo-summary other
CHECK-2026-11-02-untracked-classify other
3 CHECK-q154 other
4 CHECK-sol-untracked-classify other
5 CHECK-triage-2026-10-29 other
33 wizard-work/beam/test_majority.py test
34 wizard-work/beam/test_oracle_dl.py test
35 wizard-work/beam/test_toposort_kahn.py test
36 wizard-work/ledger/CHECK-wizardwork-census report
37 wizard-work/null/README-gatehygiene.md probe
38 wizard-work/null/README-q62-scan.md probe
39 wizard-work/null/_probe10.py probe
115 wizard-work/null/verify_check_provenance.py probe
116 wizard-work/null/verify_staged.py probe
117 wizard-work/quill/draft-compliance-report-2026-10-31.pin report
wizard-work/sol/gen_untracked_classify_2026_11_02.py other
wizard-work/sol/untracked-classify-2026-11-02.snapshot.txt other
wizard-work/sol/untracked-classify-2026-11-02.tsv other
wizard-work/sol/verify_untracked_classify_2026_11_02.py other
118 wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/build_ledger.py report
119 wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/figs/2609.26368v1-p001-o000.jpg report
120 wizard-work/sphinx/archive-lcmm-figureground-2026-10-26/figs/2609.27470v1-p004-o000.jpg report
@@ -1,38 +1,31 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""Independent from-disk verifier for the untracked-file triage manifest. """Fresh, from-git re-derive verifier for the untracked-file triage manifest.
The frozen universe is the set of paths reported by The sol-lane CHECK-2026-11-02-untracked-classify promise is:
`git ls-files --others --exclude-standard` at build time. This script "Fresh, from-disk re-derive of the live repo's untracked universe (N files).
re-derives the category of every frozen path with a rule table it embeds Exit 0 iff snapshot/manifest/rule/disk agree."
itself (no import of the generator), checks the snapshot/manifest agree,
and confirms every frozen path still exists on disk under the repo.
Rule table (same convention as the genre): This script fulfils it:
wizard-work/null/ -> probe * It never trusts a frozen snapshot. Each run it re-derives the untracked
wizard-work/spark/ -> deliverable universe from the live tree with
wizard-work/beam/ -> test git ls-files --others --exclude-standard
wizard-work/quill/ -> report * It applies the sol-lane rule table (embedded, no import of the generator).
wizard-work/sphinx/ -> report * It compares that re-derivation against the committed manifest
wizard-work/ledger/ -> report wizard-work/sol/untracked-classify-2026-11-02.tsv
wizard-work/wizard-work/ -> other * It re-checks every manifest path still exists on disk and is not ignored.
wizard-work/ (root) -> other
repo-root .py files -> tool
repo-root .md/.txt -> report
repo-root data extensions -> data
everything else -> other
Exit code IS the verdict: 0 = manifest is a correct classification of the Exit code IS the verdict: 0 = manifest is a correct classification of the live
frozen universe and every frozen path exists; nonzero = wrong. untracked universe; nonzero = wrong.
""" """
import os import os
import subprocess
import sys import sys
REPO = "/root/troupe-standup" REPO = "/root/troupe-standup"
SOL = os.path.join(REPO, "wizard-work", "sol") SOL = os.path.join(REPO, "wizard-work", "sol")
SNAP = os.path.join(SOL, "untracked-classify-2026-11-02.snapshot.txt")
MAN = os.path.join(SOL, "untracked-classify-2026-11-02.tsv") MAN = os.path.join(SOL, "untracked-classify-2026-11-02.tsv")
# --- rule table (same convention as the generator) --------------------------
def category(p): def category(p):
base = os.path.basename(p) base = os.path.basename(p)
if p.startswith("wizard-work/null/"): if p.startswith("wizard-work/null/"):
@@ -56,22 +49,35 @@ def category(p):
if base.endswith((".md", ".txt")): if base.endswith((".md", ".txt")):
return "report" return "report"
if base.endswith((".json", ".csv", ".tsv", ".db", ".yaml", ".yml", ".toml", if base.endswith((".json", ".csv", ".tsv", ".db", ".yaml", ".yml", ".toml",
".lock", ".jsonl", ".html", ".css", ".xml", ".pin", ".sx2gia", ".lock", ".jsonl", ".html", ".css", ".xml", ".pin",
".jpg", ".jpeg", ".png", ".pdf", ".mp3", ".mp4", ".gif")): ".sx2gia", ".jpg", ".jpeg", ".png", ".pdf", ".mp3",
".mp4", ".gif")):
return "data" return "data"
return "other" return "other"
def live_universe():
"""The untracked universe re-derived from the live git tree (fresh)."""
r = subprocess.run(
["git", "-C", REPO, "ls-files", "--others", "--exclude-standard"],
capture_output=True, text=True, check=True,
)
return sorted(l for l in r.stdout.splitlines() if l.strip())
def main(): def main():
errs = [] errs = []
snap_paths = [l.rstrip("\n") for l in open(SNAP) if l.strip()] # 1. fresh re-derive of the live untracked universe
man_rows = [l.rstrip("\n") for l in open(MAN) if l.strip()] universe = live_universe()
exp = {p: category(p) for p in universe}
# 2. the committed manifest must carry exactly that universe with those categories
if not os.path.exists(MAN):
print("VERDICT: FAIL (manifest missing: %s)" % MAN)
return 1
man_rows = [l.rstrip("\n") for l in open(MAN) if l.strip()]
if man_rows and man_rows[0] == "path\tcategory": if man_rows and man_rows[0] == "path\tcategory":
man_rows = man_rows[1:] man_rows = man_rows[1:]
else:
errs.append("manifest header missing/incorrect")
man_paths = [r.split("\t")[0] for r in man_rows] man_paths = [r.split("\t")[0] for r in man_rows]
man_cat = {} man_cat = {}
for r in man_rows: for r in man_rows:
@@ -81,29 +87,40 @@ def main():
else: else:
man_cat[parts[0]] = parts[1] man_cat[parts[0]] = parts[1]
# 1. snapshot and manifest path sets must agree if set(man_paths) != set(exp):
if set(snap_paths) != set(man_paths): errs.append("universe mismatch: manifest=%d live=%d"
errs.append("snapshot/manifest path sets differ: snap=%d man=%d" % (len(man_paths), len(exp)))
% (len(snap_paths), len(man_paths))) for p in sorted(set(man_paths) ^ set(exp)):
if p in man_paths:
# 2. every frozen path must re-derive to the manifest's category errs.append(" manifest-only: %r" % p)
for p in snap_paths: else:
if man_cat.get(p) != category(p): errs.append(" live-only: %r" % p)
for p in sorted(set(man_paths) & set(exp)):
if man_cat.get(p) != exp[p]:
errs.append("category mismatch for %r: manifest=%r rule=%r" errs.append("category mismatch for %r: manifest=%r rule=%r"
% (p, man_cat.get(p), category(p))) % (p, man_cat.get(p), exp[p]))
# 3. every frozen path must still exist on disk under the repo # 3. every manifest path must still exist on disk and be untracked (not in
for p in snap_paths: # the git index at all).
for p in man_paths:
if not os.path.exists(os.path.join(REPO, p)): if not os.path.exists(os.path.join(REPO, p)):
errs.append("frozen path missing on disk: %r" % p) errs.append("manifest path missing on disk: %r" % p)
continue
st = subprocess.run(
["git", "-C", REPO, "ls-files", "--error-unmatch", "--", p],
capture_output=True, text=True,
)
if st.returncode == 0:
errs.append("manifest path is tracked (in the index), not untracked: %r" % p)
if errs: if errs:
print("VERDICT: FAIL (%d problem(s))" % len(errs)) print("VERDICT: FAIL (%d problem(s))" % len(errs))
for e in errs[:40]: for e in errs[:40]:
print(" -", e) print(" -", e)
return 1 return 1
print("CHECK OK: %d untracked files classified; snapshot/manifest/rule/disk agree"
% len(snap_paths)) print("CHECK OK: %d untracked files classified from the LIVE repo; "
"manifest re-derives from git; all paths present on disk" % len(universe))
return 0 return 0