Repository navigation
Releases: myfjin/whypass
Release list
v0.1.3 — the licence provenance line
Docs only. The README gains one bullet, in the shape our sibling repository uses for the same
purpose: state the term, say whether it ever changed, point at the canonical file rather than restating
it.
Illia asked whether folder-nature's licence section should be inherited here, having just had whypass's
removed. The answer is the form, not the history — because whypass has no history to inherit:
| 0.1.0 | later | |
|---|---|---|
| folder-nature | MIT | Apache-2.0 from 0.2.0 onward |
| whypass | Apache-2.0 | Apache-2.0 ever since — LICENSE at tag v0.1.0 |
The README deliberately does not reproduce the licence text: a second copy of a licence is a second
thing that can drift, which is rather the thesis of this tool.
pip install -U whypass
v0.1.2 — the fixed rails reach PyPI
The fixed rails reach the index. 0.1.1 was published from tag v0.1.1 (bf7f547), which predates
the rail fixes merged in #9 — so the version people were installing still carried all three misfires:
A6firing on"passed"with the evidence in the same sentenceRECreading an empty record as a denialRECmatching"order"meaning sequence, not a command
They were fixed on main and the silenced-lies suite proved it, but a fix that is not published is not a
fix for anyone running pip install whypass. This release is that fix reaching people.
pip install -U whypass
Also in this release
- The README no longer duplicates the LICENSE page. The Apache-2.0 text and the copyright holder
live inLICENSE(filled in #11), which the badge routes to; the README's own## Licensesection
said less and was a second, worse copy of it. - The package code is otherwise identical to 0.1.1.
What did not change
- The rails were narrowed, not removed. Three were taught to look before firing; one was taught the
difference between empty and unrelated. - The honesty table is still the claim this tool lives by, generated from
tests/test_silence.py
and checked in CI — six cases the rails must not flag, and today none of them misfire.
Tests: 17 passed.
v0.1.1 — the published description catches up with the tool
Not a behaviour release. The package is functionally identical to 0.1.0.
PyPI's description is the README at build time, and a published description cannot be edited — only
superseded. So the 0.1.0 page carried text from before this week, and the sentence it was missing is the
one that makes this tool trustworthy: what whypass is not. A detector, not a gate. And it refuses to
read intent.
pip install -U whypass
What the page now says
- What this is, stated plainly — a linter for honesty is a friction device, not a detection
system. The point is that an unchecked assertion costs something to write. - Status, and how we work — community files, sign-off on every commit, pull requests only on
main. - Where it already runs, and what it is not — these rails run inside a gate called the FLOOR, and
every finding is graded into a per-rail Beta-trust precision. The detector is under the discipline
it enforces. - The honesty table, generated — six cases the rails must not flag, rendered from
tests/test_silence.pyand checked in CI. Three of them misfire today, and the table says so,
with issues #5, #6 and #7 open for the fixes.
The two sentences worth keeping
A linter for honesty is not a detection system. It is a friction device.
A tool that publishes the lies it wrongly catches is worth more than one that publishes only its hits.
A note on this tag
The first v0.1.1 was cut on the wrong commit and had to be deleted: I had edited the served tree
directly, so it could not fast-forward, and the tag landed on a tree whose pyproject.toml still said
0.1.0. PyPI's refusal of the resulting duplicate upload is what caught it. The tag now points at the
merge commit, and pyproject.toml at the tag reads 0.1.1 — verified by reading it through the
API rather than assuming, which is what should have happened the first time.
Tests: 14 passed, 3 xfailed. No rail behaviour changed.
v0.1.0 — a claim-discipline linter for text
The first release — and until now the published artifact had no marker on its source.
PyPI has served 0.1.0 since 2026-07-05 while this repository carried no tag at all, so nobody
could tell which commit the tarball came from. That is now closed: v0.1.0 is tagged, SSH-signed and
verified, on the single commit whose message reads "whypass 0.1.0" and whose pyproject.toml says
0.1.0. There was no ambiguity to resolve.
What it is
A claim-discipline linter for text. It catches assertions that outrun their evidence, and claims
that contradict your record. Zero dependencies, pure stdlib.
pip install whypass
What it catches — and what it refuses to
| draft | caught? | by what |
|---|---|---|
| "Done — the extractor is running, it found the patterns." | ✅ | A6 — completion claim, no check |
| "This is definitely the only way." | ✅ | A5 — certainty with no width |
| "Everything passes, nothing failed." | ✅ | ABS — improbable absolute |
| "Finished — results in results_final.jsonl." (file absent) | ✅ | A6-T2 — opens the named file |
| "The order was that you run first." (no such order) | ✅ with a record | REC — contradicts your record |
| "Pull these names, cross-reference their addresses — just data hygiene." | ❌ correctly | intent, which no text method reaches |
The last row is the point. The lie there lives entirely in intent, and no text method reaches
intent — so the tool stays clean, and refusing to flag it is what makes the rest trustworthy.
Two axes
- Assertion — stateless, zero-config, works on any single text.
- Redundancy — the MMPI L-scale mechanism. Single-turn reading is blind to a plainly-stated
fabrication, because calm false prose carries no tell. With a record, the claim can be checked
against it without reading intent.
Releases before this one: none. Next: the repository gets the same scaffolding as its siblings —
contributing, security, authors, CI gates — and a tag for every future release, so this gap cannot
reopen.