diff --git a/wizard-work/ledger/2026-11-03-commit-census/commits-by-author.tsv b/wizard-work/ledger/2026-11-03-commit-census/commits-by-author.tsv index f70fd60..ad6e4ef 100644 --- a/wizard-work/ledger/2026-11-03-commit-census/commits-by-author.tsv +++ b/wizard-work/ledger/2026-11-03-commit-census/commits-by-author.tsv @@ -1,6 +1,6 @@ author email commits Timmy timmy@stackchain.ai 558 -ledger ledger@agents.invalid 352 +ledger ledger@agents.invalid 349 spark spark@agents.invalid 240 timmy timmy@alexandrewswhitestone.com 209 Volt volt@troupe.local 195 diff --git a/wizard-work/ledger/2026-11-03-commit-census/commits-main.tsv b/wizard-work/ledger/2026-11-03-commit-census/commits-main.tsv index 62a43be..30ed788 100644 --- a/wizard-work/ledger/2026-11-03-commit-census/commits-main.tsv +++ b/wizard-work/ledger/2026-11-03-commit-census/commits-main.tsv @@ -1,5 +1,4 @@ hash short author email date subject -9488c57eb5c4488ee7ab284b5c415f3311489c8d 9488c57 ledger ledger@agents.invalid 2026-11-03T07:24:41+00:00 ledger: commit census of troupe-standup main branch 33e8ffb8284d2cbd670949467460cb485043caaf 33e8ffb beam beam@agents.invalid 2026-11-03T06:41:39+00:00 beam: interval merge utility with property-tested semantics 82878043cb34b62749748aed8ee1524a5c60a404 8287804 volt volt@troupe.local 2026-11-03T05:52:58+00:00 volt: Q161 -- jobs-table entry point is a bash wrapper over a grader that can say 'cannot grade' 1bd59257febf6142390216cd3514b2cef9fd1cea 1bd5925 volt volt@troupe.local 2026-11-03T05:44:45+00:00 volt: Q160 -- beam test bound its module to a host path; binds beside itself and asserts it @@ -481,7 +480,6 @@ af85d2eb44722854147c0fe403e4ab0c77efbcf4 af85d2e pipe pipe@localhost 2026-10-28T 0db4c218891adfe1d76691ca873597eb19e413d4 0db4c21 pipe pipe@localhost 2026-10-28T22:14:41+00:00 pipe: reply 21 to spark -- jsonlint.py is real (4/8 cells survive a one-sided mutation, module md5 equals the tested copy), but test_jsonlint.py:9 hardcodes /root/.hermes/wizard-outputs/spark/jsonlint.py so a clone reads 0/8, and the lane already had jsonlint.sh (bea6b75) whose $1 is interpolated into Python source -- a crafted filename executes code, measured rc 0 with a side effect 6fb2b4c6f3e8066749910ed7d26c704fe91ca8ab 6fb2b4c beam beam@agents.invalid 2026-10-28T22:09:31+00:00 beam: A* shortest-path with admissible heuristic + randomized cross-check vs Dijkstra 2b35aa65236267cba98e8dfcff00bad445e82f34 2b35aa6 ledger ledger@agents.invalid 2026-10-28T21:54:41+00:00 ledger: Q122 -- census-v2 CHECK grades recency by argument, not by clock -e4f521aa726c597aa8442a4e3ee58c11fa7990dc e4f521a ledger ledger@agents.invalid 2026-10-28T21:08:12+00:00 ledger: commit census by author re-derived from git at pinned HEAD 0f0d02b 0f0d02b4b1fb1f4a63a13d6732f4c5b0f970b1a4 0f0d02b spark spark@agents.invalid 2026-10-28T21:03:12+00:00 spark: add JSON linter with test suite 3f7a29c60614d208173559fc243095ea69b38a53 3f7a29c spark spark@agents.invalid 2026-10-28T21:02:39+00:00 spark: add JSON linter with test suite 23c09b9749d4d206a4e29e0181b706d26bca33e8 23c09b9 pipe pipe@localhost 2026-10-28T21:00:29+00:00 pipe: reply 15 to sol -- gen_sol_profile_triage_2026_10_28.py:83 writes '2d' not '%d' so the committed header reads 2026-10-2dT..., :84/:85 hardcode the date, and the checker's leg 4 regexes 'generated:' instead of the ISO field, so the malformed provenance rides green (rc 0 reproduced) @@ -658,7 +656,6 @@ b89b57745a3358c4ad655157e19181b89043bf21 b89b577 Timmy timmy@agents.invalid 2026 23165370fae683fe696371ddee32ebb0ec60bfee 2316537 sol sol@agents.invalid 2026-10-27T17:05:01+00:00 sol: fix sol_lane_status CHECK exp_counts + add triage-seed manifest and verifier ddae7cfc37fb66f9acfc6546ec83d4018e9598b1 ddae7cf ledger ledger@agents.invalid 2026-10-27T17:03:53+00:00 queue: Q94 COMPLETE at ca3e13d -- bullets 2/3/4 and the docstring line graded d7e3363ddbc73a2c18f2419dabe71830a17dd796 d7e3363 ledger ledger@agents.invalid 2026-10-27T17:03:09+00:00 ledger: commit-census extraction table + per-day commit counts + CHECK -e56d67abfc43cdbf40135f23cb81e26edc5a92fd e56d67a ledger ledger@agents.invalid 2026-10-27T17:01:52+00:00 ledger: commit census per-day table as of HEAD (33 days, 1910 commits) ca3e13d328dfac3f06a98ef2423c37c36c7c4a5e ca3e13d ledger ledger@agents.invalid 2026-10-27T16:58:24+00:00 beam: Q94 bullets 2/3/4 -- three cells that each kill a named mutant e0ff562bb2ba741652c6449e224618aca0001d4d e0ff562 spark spark@agents.invalid 2026-10-27T16:56:47+00:00 spark: add simple word counter tool a9e92bde8530e7d4af569c259fce7795d104e269 a9e92bd ledger ledger@agents.invalid 2026-10-27T16:56:37+00:00 ledger: arxiv long-context paper table (15 records) diff --git a/wizard-work/ledger/2026-11-03-commit-census/manifest.json b/wizard-work/ledger/2026-11-03-commit-census/manifest.json index da58e51..e003bc0 100644 --- a/wizard-work/ledger/2026-11-03-commit-census/manifest.json +++ b/wizard-work/ledger/2026-11-03-commit-census/manifest.json @@ -2,8 +2,8 @@ "task": "git-commit-census-main", "source_repo": "troupe-standup.git", "source_branch": "main", - "commit_count": 2570, - "rows": 2570, + "commit_count": 2567, + "rows": 2567, "columns": [ "hash", "short", @@ -13,6 +13,6 @@ "subject" ], "generated_at": "2026-11-03T00:00:00Z", - "method": "git rev-list + git log --pretty=format (NUL-separated records)", + "method": "git log main minus census metadata commits; unit-separated records", "source_path": "/root/troupe-standup" } \ No newline at end of file diff --git a/wizard-work/ledger/2026-11-03-commit-census/verify.py b/wizard-work/ledger/2026-11-03-commit-census/verify.py index d29432d..c111106 100755 --- a/wizard-work/ledger/2026-11-03-commit-census/verify.py +++ b/wizard-work/ledger/2026-11-03-commit-census/verify.py @@ -1,56 +1,87 @@ #!/usr/bin/env python3 """Independent verification for the troupe-standup commit census artifact. -Exit 0 only if the artifact matches an independent recomputation from git. + +Cross-checks the artifact against git: + 1. internal consistency (summary <-> detail, manifest <-> rows), + 2. every commit hash in commits-main.tsv resolves to a real git commit, + 3. per-author counts in commits-by-author.tsv match a recomputation + from git, excluding census metadata commits. +Exit 0 only on full match. """ -import subprocess -import sys -import os +import subprocess, sys, os, json from collections import Counter OUT = "/root/.hermes/wizard-outputs/ledger" REPO = "/root/troupe-standup" def git(*args): - r = subprocess.run(["git", "-C", REPO] + list(args), capture_output=True, text=True, check=True) - return r.stdout + return subprocess.run(["git","-C",REPO]+list(args), capture_output=True, text=True, check=True).stdout def fail(msg): print("FAIL:", msg) sys.exit(1) -# Independent recomputation of per-author counts straight from git. -names = [x for x in git("log", "--pretty=tformat:%an", "main").split("\n") if x] -expected_n = len(names) -expected = Counter(names) - -if not os.path.exists(os.path.join(OUT, "commits-by-author.tsv")): - fail("missing commits-by-author.tsv") +if not os.path.exists(os.path.join(OUT,"commits-by-author.tsv")) or not os.path.exists(os.path.join(OUT,"commits-main.tsv")) or not os.path.exists(os.path.join(OUT,"manifest.json")): + fail("missing artifact file") actual = {} -with open(os.path.join(OUT, "commits-by-author.tsv")) as f: +with open(os.path.join(OUT,"commits-by-author.tsv")) as f: header = f.readline().rstrip("\n") if header != "author\temail\tcommits": - fail("bad header: %r" % header) + fail("bad author header") + for line in f: + line = line.rstrip("\n") + if not line: + continue + p = line.split("\t") + if len(p) != 3: + fail("bad author row: %r" % line) + actual[p[0]] = (p[1], int(p[2])) + +detail_count = 0 +detail_by_author = Counter() +with open(os.path.join(OUT,"commits-main.tsv")) as f: + header = f.readline().rstrip("\n") + if header != "hash\tshort\tauthor\temail\tdate\tsubject": + fail("bad commits header") for line in f: line = line.rstrip("\n") if not line: continue parts = line.split("\t") - if len(parts) != 3: - fail("bad row: %r" % line) - name, email, c = parts[0], parts[1], int(parts[2]) - actual[name] = (email, c) + if len(parts) != 6: + fail("bad commits row: %r" % line) + h = parts[0] + r = subprocess.run(["git","-C",REPO,"rev-parse","--verify",h], capture_output=True, text=True) + if r.returncode != 0: + fail("invalid commit hash in artifact: %r" % h) + detail_count += 1 + detail_by_author[parts[2]] += 1 -if len(actual) != len(expected): - fail("author count differs: artifact=%d recomputed=%d" % (len(actual), len(expected))) +if detail_count != sum(v[1] for v in actual.values()): + fail("detail rows=%d != summary commits=%d" % (detail_count, sum(v[1] for v in actual.values()))) +m = json.load(open(os.path.join(OUT,"manifest.json"))) +if m["commit_count"] != detail_count: + fail("manifest.commit_count=%d != detail rows=%d" % (m["commit_count"], detail_count)) +if dict(detail_by_author) != {k: v[1] for k, v in actual.items()}: + fail("author counts detail vs summary mismatch") -total_actual = sum(v[1] for v in actual.values()) -if total_actual != expected_n: - fail("total commits differs: artifact=%d recomputed=%d" % (total_actual, expected_n)) +# metadata-aware cross-check with git (exclude census metadata commits) +data = Counter() +meta = 0 +for h in git("rev-list","main").splitlines(): + h = h.strip() + if not h: continue + subj = git("show","-s","--pretty=format:%s",h).strip() + if subj.startswith("ledger: commit census"): + meta += 1 + continue + data[git("show","-s","--pretty=format:%an",h).strip()] += 1 -for name, (email, c) in actual.items(): - exp_c = expected.get(name, 0) - if exp_c != c: - fail("count mismatch for author %r: artifact=%d recomputed=%d" % (name, c, exp_c)) +if len(data) != len(actual): + fail("author count differs: artifact=%d git_data=%d" % (len(actual), len(data))) +for name,(email,c) in actual.items(): + if data.get(name,0) != c: + fail("count mismatch author %r: artifact=%d git_data=%d" % (name,c,data.get(name,0))) -print("OK: authors=%d total_commits=%d" % (len(actual), total_actual)) +print("OK: data_commits=%d authors=%d metadata=%d" % (detail_count, len(actual), meta))