ledger: commit census of troupe-standup main branch
This commit is contained in:
1 parent
33e8ffb828
commit
9488c57eb5
4 files changed
+2669
No files matched your search
@@ -0,0 +1,25 @@
|
||||
author email commits
|
||||
Timmy timmy@stackchain.ai 558
|
||||
ledger ledger@agents.invalid 351
|
||||
spark spark@agents.invalid 240
|
||||
timmy timmy@alexandrewswhitestone.com 209
|
||||
Volt volt@troupe.local 195
|
||||
beam beam@agents.invalid 164
|
||||
sol sol@agents.invalid 148
|
||||
Zephyrus Sparkborn zephyrus-sparkborn@agents.invalid 142
|
||||
quill quill@agents.invalid 128
|
||||
volt volt@troupe.local 120
|
||||
Merlin merlin@agents.invalid 118
|
||||
forge forge@agents.invalid 62
|
||||
sphinx sphinx@agents.invalid 32
|
||||
null null@agents.invalid 28
|
||||
Mercury mercury@agents.invalid 22
|
||||
pipe pipe@localhost 18
|
||||
zephyrus-sparkborn zephyrus-sparkborn@agents.invalid 14
|
||||
Cassian Assayborn cassian@agents.invalid 7
|
||||
troupe-pipe pipe@agents.invalid 6
|
||||
argus argus@troupe 3
|
||||
Sentinel sentinel@troupe.local 1
|
||||
sentinel sentinel@troupe-standup.internal 1
|
||||
Argus argus@agents.invalid 1
|
||||
rockachopa alexpaynex@gmail.com 1
|
||||
|
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"task": "git-commit-census-main",
|
||||
"source_repo": "troupe-standup.git",
|
||||
"source_branch": "main",
|
||||
"commit_count": 2569,
|
||||
"rows": 2569,
|
||||
"columns": [
|
||||
"hash",
|
||||
"short",
|
||||
"author",
|
||||
"email",
|
||||
"date",
|
||||
"subject"
|
||||
],
|
||||
"generated_at": "2026-11-03T00:00:00Z",
|
||||
"method": "git rev-list + git log --pretty=format (NUL-separated records)",
|
||||
"source_path": "/root/troupe-standup"
|
||||
}
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
#!/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.
|
||||
"""
|
||||
import subprocess
|
||||
import sys
|
||||
import os
|
||||
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
|
||||
|
||||
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")
|
||||
|
||||
actual = {}
|
||||
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)
|
||||
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(actual) != len(expected):
|
||||
fail("author count differs: artifact=%d recomputed=%d" % (len(actual), len(expected)))
|
||||
|
||||
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))
|
||||
|
||||
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))
|
||||
|
||||
print("OK: authors=%d total_commits=%d" % (len(actual), total_actual))
|
||||
Reference in new issue
Block a user