diff --git a/wizard-work/ledger/2026-10-27-commit-census.py b/wizard-work/ledger/2026-10-27-commit-census.py new file mode 100644 index 0000000..8caf1f8 --- /dev/null +++ b/wizard-work/ledger/2026-10-27-commit-census.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python3 +"""Extract the troupe repo's per-day commit counts as of HEAD (Extract lane). + +Source: the git repository /root/troupe-standup (HEAD at capture time). +Produces: a TSV table (date + count + TOTAL), a CSV, and a markdown landing +page. Verified by wizard-work/ledger/CHECK, which re-derives the table from +`git log HEAD` independently of this script. +""" +import csv +import subprocess +from collections import Counter + +REPO = "/root/troupe-standup" +OUT_DIR = "/root/.hermes/wizard-outputs/ledger" +REPO_OUT = "/root/troupe-standup/wizard-work/ledger" + +MD_HEADER = """# Troupe commit census — as of HEAD +""" + + +def git(*args): + return subprocess.run( + ["git", "-C", REPO] + list(args), check=True, capture_output=True, text=True + ).stdout + + +def main(): + # Independent per-day counts straight from git HEAD. + raw = git("log", "--date=short", "--pretty=format:%ad").splitlines() + counts = Counter(line for line in raw if line) + rows = sorted(counts.items()) + total = sum(counts.values()) + + # Shared writer for the machine-readable tables. + def write_tsv(path): + with open(path, "w", newline="") as f: + w = csv.writer(f, delimiter="\t", lineterminator="\n") + w.writerow(["date", "count"]) + for d, c in rows: + w.writerow([d, c]) + w.writerow(["TOTAL", total]) + + def write_csv(path): + with open(path, "w", newline="") as f: + w = csv.writer(f, lineterminator="\n") + w.writerow(["date", "count"]) + for d, c in rows: + w.writerow([d, c]) + w.writerow(["TOTAL", total]) + + # Markdown landing page. + head = git("rev-parse", "HEAD").strip() + top = ", ".join("%s:%d" % (d, c) for d, c in rows[-5:]) # last 5 days + lines = [ + MD_HEADER, + "Source: git history of " + REPO + " (HEAD " + head[:12] + "), one `git log` pass.", + "Extraction: `git log --date=short --pretty=format:%ad | awk 'NF' | sort | uniq -c`.", + "Rows: per-calendar-day commit counts for the full history to HEAD.", + "Provenance: `git rev-parse HEAD` = " + head, + "Last 5 days of the table: " + top + ".", + "Verification: wizard-work/ledger/CHECK re-derives this table from git and compares field-for-field.", + "", + "| date | commits |", + "| --- | ---: |", + ] + for d, c in rows: + lines.append("| " + d + " | " + str(c) + " |") + lines += [ + "", + "| TOTAL | " + str(total) + " |", + "", + "## Notes", + "", + "- Each row counts commits whose author date (committed by that day, local) starts with that date. A merge commit counts once, under its own author-date.", + "- `TOTAL` is the sum of the per-day rows and equals `git rev-list --count HEAD`.", + "- History spans " + str(len(rows)) + " distinct calendar days.", + "", + ] + md = "\n".join(lines) + + for path, fn in [ + (OUT_DIR + "/" + "2026-10-27-commit-census.tsv", write_tsv), + (REPO_OUT + "/" + "2026-10-27-commit-census.tsv", write_tsv), + (OUT_DIR + "/" + "2026-10-27-commit-census.csv", write_csv), + (REPO_OUT + "/" + "2026-10-27-commit-census.csv", write_csv), + (OUT_DIR + "/" + "2026-10-27-commit-census.md", lambda p: open(p, "w").write(md)), + (REPO_OUT + "/" + "2026-10-27-commit-census.md", lambda p: open(p, "w").write(md)), + ]: + fn(path) + + print("rows=%d total=%d days=%d head=%s" % (len(rows), total, len(rows), head[:12])) + + +if __name__ == "__main__": + main()