Chronolith 3.2.2 — What An Agent Found Using It
An agent used Chronolith from end to end while shipping another project, and
filed a reproduction for every defect it hit. This release is those fixes. The
theme is uncomfortable and worth stating plainly: the tool did not enforce the
doctrine it printed.
pip install --upgrade chronolith-proThe one that mattered
check exited 0 on detected drift, by default.
With stock defaults — not permissive, no --strict — the old logic printed
[!] DNA DRIFT DETECTED and then fell through to exit 0. A CI job running plain
chronolith-pro check passed on a drifting repository. That is the exact
failure a fail-closed governance tool exists to prevent, and the opposite of the
module's own Law 3.
It was nearly invisible to a human — who sees the red text and reacts — and
catastrophic to an agent, who reads the exit code and proceeds. That distinction
is the lesson of the whole release.
check now fails closed by default. CHRONOLITH_MODE=permissive is the only way
past an inconsistency, and it says so.
The rest, all with reproductions
-
Severity is respected. Any finding was collapsed into a security failure,
socheckhalted on the very sovereign keyssovereign-initcreates — it told
you to make a key, then failed you for having one. Only a tracked key in the
index (a real leak) is a failure now; an untracked local key is a warning. -
The pre-push hook is portable. It wrote a bare
pythonand a hardcoded
absolute site-packages path; under git-bash on Windowspythonis often not on
PATH, so the hook died with "command not found" and blocked every push. It now
invokessys.executable -mthe module. -
The status panel cannot lie. It printed
Status: Status: OKabove the
fail-closed check, announcing OK on a run about to halt. The verdict is
computed first; the panel says OK or INCONSISTENT to match the exit code. -
.chronolithignore. A repo that vendors backup trees had them hashed as
governed content, so an edit inside a dead copy triggered drift on the live
project. One fnmatch glob per line, the.gitignoresyntax you already know. -
--quietoncheck, for clean CI and agent output. The banner and spinner
go; the status panel and exit code stay, because those are the contract. -
initis honest on re-run. A secondinitcreated nothing and printed
nothing, reading as a successful re-crystallization. It now says the core is
already present and points atcheck --accept. -
Docs reference real commands.
HOW_TO_USE_IT.mdtold you to run
chronolith status --fix. There is nostatuscommand and no--fix. Doc
drift in a drift-detection tool is the one it can least afford. -
Descriptions say what each package does — not "industrial-grade" or
"Enterprise Oracle" or "Shannon Entropy physics" (it computes an entropy
metric). A tool whoseverifyreports what it did not prove should not
overclaim in its own summary.
Every fix ships with a regression test that reproduces the original defect,
including the exit-0 reproduction.
First release published through Trusted Publishing across all four packages
chronolith, chronolith-lite, chronolith-pro and chronolith-omega are
built and published by this repository's workflow. PyPI holds an attestation
naming the repo and workflow for each file — you can confirm where the wheel came
from without trusting the author, which is the claim the tool makes about
everything else.
Full detail: CHANGELOG.md
