Skip to content

Tighten the docs, and run them through the writing checker - #91

Merged
QuiteYellow merged 3 commits into
mainfrom
docs/tighten-prose
Sep 13, 2026
Merged

QuiteYellow merged 3 commits into
mainfrom
docs/tighten-prose

Conversation

@QuiteYellow

Copy link
Copy Markdown
Owner

Three commits: a duplicated table removed, the docs run through the writing checker for the first time, and a pass over the sentences carrying the most words. README 5034 words to 4639.

The module table was duplication

"Supported library imports" carried fifteen hand-maintained rows of modules and responsibilities beside docs/api.md, which now lists every module with a summary read off the code. The table could only drift. 447 words to 171, with the pointer to the generated reference doing the work.

The docs had never been through the checker

Every PR body and comment this week went through local-tools/avoid_ai_check.py. The README and docs/ never had, which is where most of the words are.

It found three real breaches of the solo-maintainer voice rule: "a reverse-engineering problem we haven't cracked yet", "We mint our own key and have AC14K_M sign our leaf", and "not ours" in the bridge doc. The last one I missed in my own follow-up sweep, which matched our and skipped ours.

It also caught something systematic: the API generator was emitting 114 em dashes into docs/api.md, one per entry and per method, from two separators. A colon does the same work without making a reference page a stylometric outlier.

Left alone on purpose: the "we" in a code comment inside an example, where it means author and reader; two library docstrings that say "we" for the library, which would read oddly as "I"; and api.md's heading count, bullet lists, repeated vocabulary and bold labels, which are what a generated reference page is.

Tightening, with every fact kept

  • The write-coverage trap was 194 words in one bullet, and its last third was bridge behaviour: optimistic publish, the deferred re-read, and why the bridge avoids a fetch-back. That moved to docs/bridge-demo.md, leaving the protocol lesson at 126 words.
  • The dryer note restated push-versus-poll, which "Under the hood" and "How the app keeps in sync" each already explain. 62 words to 30, keeping both dryer-specific facts and the ~100ms measurement.
  • Five README sentences of 40 to 53 words came down without losing a measurement: the OBSERVE-silence trap, the write_max_attempts pair, the rate-limit budget, the PSK identity arithmetic, and the CoAP-TCP scope note.

What the numbers actually say

The corpus is 12454 words to 12328, down 126. The split moved content between files, and each new file needs a header and an index entry, so the deletions are partly offset. The README cut is real at 8%.

Below that means dropping findings. The checker confirms the prose is not padded: near-zero filler markers across all six files, and the remaining 35-word-plus sentences are dense lists where every clause is a fact, such as the SamsungServerProfile ClientHello constraints and the Block2 reader's five properties.

Validation

798 tests pass on Python 3.11, 3.12, 3.13 and 3.14, and on the dependency floor. check_share_safety.py is clean. Rebased onto main after #90.

"Supported library imports" carried a fifteen-row table of modules and
responsibilities, hand-maintained beside docs/api.md, which now lists every
module with a summary read off the code. The table could only drift, and
its three following paragraphs restated the contract at length.

447 words to 171, with the pointer to the generated reference doing the
work the table was doing.
Every PR body and issue comment this week went through
local-tools/avoid_ai_check.py. The README and docs/ never did, which is
where most of the words are and where most readers land.

Two real breaches of the solo-maintainer voice rule, both in prose that
predates this week: "a reverse-engineering problem we haven't cracked yet"
in Traps to avoid, and "We mint our own key and have AC14K_M sign our leaf"
in the certificate material, which reads better impersonally anyway.

The generator was emitting 114 em dashes into docs/api.md, one per entry
and method, from two separators. A colon does the same work without
turning a reference page into a stylometric outlier.

Left alone deliberately: the "we" in a code comment inside an example,
where it means author and reader; two library docstrings that say "we" for
the library, which is idiomatic in source and would read oddly as "I"; and
api.md's heading count, bullet lists, repeated vocabulary and bold labels,
which are what a generated reference page is.
A pass over the sentences carrying the most words, keeping every fact.

The write-coverage trap was 194 words in one bullet, and its last third was
bridge behaviour: optimistic publish, the deferred re-read, and why the
bridge avoids a fetch-back. That moved to docs/bridge-demo.md, where the
architecture lives, leaving the protocol lesson at 126 words.

The dryer note restated push-versus-poll, which Under the hood and "How the
app keeps in sync" each already explain. 62 words to 30, keeping both
dryer-specific facts and the ~100ms measurement.

Five README sentences of 40 to 53 words came down without losing a
measurement: the OBSERVE-silence trap, the write_max_attempts pair, the
rate-limit budget, the PSK identity arithmetic, and the CoAP-TCP scope
note.

One more first-person-plural, "not ours" in the bridge doc. My earlier
sweep matched `our` and missed `ours`.

README 5034 words to 4639 across both passes, 8% down, with the module
table gone and no finding lost.
@QuiteYellow
QuiteYellow merged commit 61738fd into main Sep 13, 2026
8 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.

1 participant