Skip to content

W4/honest readme - #234

Merged
evkir merged 4 commits into
mainfrom
w4/honest-readme
Aug 26, 2026
Merged

W4/honest readme#234
evkir merged 4 commits into
mainfrom
w4/honest-readme

Conversation

@evkir

@evkir evkir commented Aug 26, 2026

Copy link
Copy Markdown
Owner

What this changes

How it was measured

Checklist

  • ruff format --check cyberai/ tests/ and ruff check cyberai/ tests/ pass
  • pytest -W ignore::DeprecationWarning -m "not slow and not smoke" passes
  • New behaviour is covered by a test that fails without the change
  • I have read CLA.md and I hereby sign the CLA

evkir added 4 commits August 26, 2026 07:28
The version badge in README said v1.5.0 while the package shipped 1.5.0 and
was about to ship 1.6.0; the tests badge said 2075 against 2252 collected.
Both are hand-written statements of a fact the code already knows, and
neither had a gate, so they drifted across a release without failing
anything.

tests/unit/test_cli_version.py does not cover this. It reads __version__ and
asserts the CLI prints it, which stays true whatever the badge claims. The
badge is a second, independent statement aimed at a reader who will never
run the command -- and it was the wrong one. The new architecture test pins
the badge to __version__ and nothing else: the test count is left ungated on
purpose, because it changes with almost every commit and a gate on it would
fail on green work.

The launch-post draft carried the same class of stale number: 24,169 lines
of production and 24,088 of tests against 25,498 and 28,569 measured now,
and 2001 tests at v1.5.0. It is tracked in the public repository, so it is
corrected here rather than left for a publication date.

CHANGELOG: the Unreleased section becomes 1.6.0, dated. Its contents were
already written by W5 and W2 -- the licence change and the contamination
fix are what this release is.
README published the probe score. By the project's own docstring the probe
engine measures the targets and the harness, not the product -- so the
number on the front page answered a question nobody asked, while the
pipeline's own 4/4 sat unmentioned in examples/. The two engines are now
separated by what they answer rather than by how they are driven, and the
pipeline's run metrics are on the page: four endpoints, 21 requests, four
in-band proofs and one out-of-band.

The stronger claim is the one that was missing entirely: the pipeline
reaches 4/4 without contacting a model. That is measured, not assumed --
the agent engine constructs no LLM client on either path, and the card
carries a proven zero with its cause rather than a blank. README said 28
requests against 21 measured, which is the figure the decontamination of
W2 moved; both scorecards were regenerated at 1.6.0 against live targets
and the totals did not move.

Two documents now quote the same measurement, which doubles the surface a
stale number can hide on -- CJ in the tail list, where a published card
lagged the code by two days and nothing failed. The new architecture test
compares README's table to the committed card cell by cell, ignoring the
availability column README drops and the emphasis it adds. It does not
re-run the bench: the card is the artifact of a real run by construction,
and the gap that actually opened was between that artifact and the prose
quoting it.

docs/benchmarks/local-suite.md carried 2026-08-13 at 1.5.0 in a table two
paragraphs above its own rule that these numbers come from a measured run
and never by hand. Corrected to the run that produced the cards.
README described the security design of the code before W1. It said every
phase output is injection-scanned before it propagates, that the
orchestrator neutralizes a malicious banner before the data reaches the
model, and that the trust boundary is an injection-scan at every phase edge.
The phase scan runs after the agent has already called the provider -- the
code says so in its own docstring, and calls itself an audit signal rather
than a barrier. The banner sentence was worse than wrong: recon contacts no
model at all, so it described a defence on a path with nothing to defend.

What is true is now on the page. TrustGuard sits inside LLMClient ahead of
the provider branch on all four entry points; it scores the raw message and
sanitises the copy it sends, in that order, because the reverse was measured
to blind the detector -- sanitisation strips three of the categories the
detector scores on, so a template marker lowered an injection's score.
The three policies are documented with the reason annotate is the default
and quarantine is not: quarantine mutates content, and the detector it would
mutate on flagged 42 of 43 real scan reports. The phase scan stays described,
as the audit signal it is.

The pattern count was wrong in the other direction. README said 33, which is
correct; docs/security/adversarial-robustness.md and the module docstring of
core/safety.py said thirty-eight. Two security documents named a number a
reviewer can check in one line, and nothing failed. The new architecture test
pins all three spellings -- one digit, two English words -- to
len(INJECTION_PATTERNS), and rejects a stale word left beside a corrected
one. Only the count is pinned: a test over the wording would fail on every
paragraph edit and train the reviewer to regenerate without reading.
The documentation table listed five files. README's own prose linked to
seven more -- adversarial-robustness, local-suite, cve-bench,
contamination-2026-08, licensing among them -- so a reader who scrolled to
the table saw a smaller project than the one they had just read about. The
contamination write-up in particular was cited in the benchmarks section and
absent from the index, which is the arrangement that looks like hiding even
when it is only an oversight. Twelve entries now, including the two
walkthroughs, the command recipes and the known-issues list.

Six documents stay out on purpose: an EVMBench adapter note, a competitive
landscape, a phantom-stack integration note, a scoring-criterion essay, a
live-recon workflow and an older benchmarks index. They belong to threads a
first-time reader is not on, and an index that lists everything indexes
nothing.

The shipped table stopped at v1.4 while the repository was tagging 1.5 and
this branch releases 1.6. Both rows added.

The new architecture test resolves every repository-relative link in README
against the filesystem: thirty links, twenty-three distinct paths, none of
them checked by anything until now. A renamed document leaves a 404 on the
page a reviewer reads first, which reads as an abandoned project rather than
as a typo. External URLs are deliberately not fetched -- a test that reaches
the network fails for reasons that have nothing to do with the change, and
gets ignored. Anchors are stripped: whether a heading still exists is a
question about someone else's document.

The W4.7 item is closed by checking rather than by editing. `mcp-scan` is a
real command, agents/mcp_scan carries poisoning, attestation and trust
analysis, and W1 put a guard in front of the model, so the line about
red-teaming AI rather than only building with it is now backed by shipped
code and stays.
@codecov-commenter

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@evkir
evkir merged commit 9b66238 into main Aug 26, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants