Repository navigation
docs(readme): state the positioning claim as the two measured layer figures (#1187) - #1197
Merged
Merged
Conversation
…igures (#1187) The banner sold the app as "~170k tokens of typed ObjectStack metadata (~18,000 lines)" — a hand measurement of a tree that had since moved, and the one number in the repo with no source. It now states the two layers the maintainer asked customers to be shown, each read from the gate landed in #1183: business semantics ~81k tokens, interaction layer ~39k, with translations and seed data outside the count by ruling. test/docs-readme-token-figures.test.ts holds the banner to a live --json run of scripts/check-source-token-ratchet.mjs, within the maintainer's already- ruled 5% working buffer, so the next drift fails CI instead of surviving to the next audit.
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
os-steve
marked this pull request as ready for review
August 17, 2026 05:27
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #1187
The README banner sold the app as "~170k tokens of typed ObjectStack metadata
(~18,000 lines)". Both figures were a hand measurement of a tree that had since
moved — the one number in the repo with no source, on the first line a reader
sees. It now states the two layers the maintainer asked customers to be shown,
each read from the gate that landed in #1183.
The figures are the gate's, taken on this branch
The banner says ~81k, where the ruling said 「写实测值 ~80k / ~39k」 — please
sanity-check this one. That is not a departure from the ruling, it is the
ruling applied to today's tree: the instruction was to publish the measured
values, and the digits quoted alongside it were the measurement as it stood at
that moment.
mainhas moved since. ~81k is what the gate's ownheadline()prints, so the README and the command it tells readers to run agree character
for character. Nothing was hand-rounded.
Translations and seed data stay out of the accounting per
「translations + seed 肯定是不需要算 token 的」, and the banner says so in one
small-print clause — without it a reader who compares ~81k against the size of
src/is being told a number for a surface they cannot see.The phrasing: accurate today vs accurate in six months
The card asked me to argue this choice rather than just pick digits. The
measurement moved 80,411 → 80,356 → 81,233 → 80,767 in one working day as four
ordinary PRs landed, crossing the ~80k/~81k rounding boundary twice. A banner
pinned to today's rounded reading would need a PR at every one of those steps —
which is the same maintenance defect this card is closing, one decimal place
down, and the first person to pay that tax twice deletes the guard.
I did not solve that by weakening the claim into a bound ("under 85k"). A
ceiling is a bigger, vaguer number, and it works against the message: the
selling point here is that the app is small, so inflating the published figure
to buy durability trades away the thing being sold.
Instead the durability lives in the tolerance, and the tolerance is one the
maintainer has already ruled: 「给 5% 缓冲」, the same 5% working buffer the
ratchet's ceilings carry through its
anchor(). Reusing it rather than inventinga README-specific number is what makes this stick — the banner and the ratchet
ceiling now go stale at almost the same reading, so re-stating the claim is a
maintainer-ruling moment rather than merge overhead:
On business semantics the band's upper edge sits just past the ceiling, so the
ratchet goes red first — the banner cannot be lying while CI is green. On the
interaction layer the ceiling's round-up-to-1k left it 7.5% of headroom instead
of 5%, so the doc guard is the tighter of the two and fires about 1k early.
Early is the safe direction for a doc guard; late is the direction that cost us
this card.
So: accurate today and accurate in six months, without buying the second
with a vaguer claim.
The claim now defends itself
test/docs-readme-token-figures.test.tsparses both figures out of the bannerand compares them against a live
--jsonrun of the gate. Expected values arenever written down in the test — they are read by running the same command CI
runs, for the reason the #729 count rule gives: a hard-coded expectation is just
the hand-maintained number moved into a test file, stale on the next merge. Five
assertions: a vacuity guard (one figure per layer, so a reflow cannot silently
disarm the rule), the layer names matching the gate's own, the accounting-basis
clause, the 5% tolerance, and a check that the banner never claims a figure the
ratchet would already reject.
It is a sibling file rather than a block inside
test/docs-drift.test.ts,which is where the card pointed it.
docs-drift.test.tsis 100,190 bytes againstthe 102,400-byte ceiling in
scripts/check-source-hygiene.mjs— appending thisblock took it to 107KB and turned the hygiene gate red. Most of that rule family
already lives in sibling
test/docs-*.test.tsfiles, so this follows theconvention instead of inventing one. Filed the near-cap condition separately, see
below.
Reverse verification
Predicted red-before / green-after and measured both ways, from the committed
state each time.
Restoring the pre-fix banner — the drift that opened this card — reddens three of
the five assertions:
Hand-corrupting the interaction figure to ~41k — deliberately chosen as inside
the ratchet ceiling (42,000) but outside the 5% band — isolates the tolerance
assertion, which is the one that could have been vacuous:
The ceiling assertion correctly stayed green there, since 41,000 is under 42,000.
#1191 — the repository description
Update, mid-task: the description is no longer the drifted string, and it is
being edited live. When I started it read the
~170k tokenssentence #1191quotes. It then changed twice while this branch was in verification — both
observations inside four minutes:
I did not set either and cannot — the GitHub MCP surface here has no
update_repositoryand there is noghCLI — so another actor on our sharedidentity is applying them. Flagging rather than touching or chasing: read the
live value, not my transcription above, which may already be stale again.
Where that leaves the card, for your call:
~170kclaim is gone from the live surface, which was The GitHub repository description still quotes the drifted "~170k tokens" claim — it is not in the tree, so #1187's grep cannot find it #1191'sactual defect. Every value I saw it hold is true against today's gate: business
semantics 80,767 is under 100k, and the authored total 133,465 was under the
150k the earlier version also carried.
think that split is right rather than an inconsistency to iron out — the
description has no CI guard and cannot get one, so it should not carry digits
that drift, while the README can carry them precisely because the test above
holds them honest.
shown two layers, and the current description states a single bound, on
business logic only. The interaction layer is no longer represented there.
If you would rather the description mirror the README's pair, this matches it
(297 chars, GitHub's limit is 350):
Otherwise the current string needs no edit from me. Either way #1191 is not
closed by this PR — merging it does not touch repo metadata — and it is now
best assessed against the live description rather than the one quoted in its body.
Two corrections to the card's scope
The archived report never carried this claim, so there was nothing to leave
alone. The card records
docs/archive/2026-02/CRM_INDUSTRY_AI_TRANSFORMATION_REPORT.mdas the second tracked file stating it. That is a false positive from grepping
bare
18,000: the only hit in that file is120 hours/month × $150/hour = $18,000/month, a labor-cost calculation with norelation to tokens. Searching the whole tracked tree for
170k,170,000,18,000 linesandcontext windowfinds the claim inREADME.mdand nowhereelse. I did not touch the archive — and I agree with the card's reasoning that
rewriting a dated historical record to match today's measurement would be worse
than leaving it, had there been anything there to rewrite.
No other surface carries it.
objectstack.manifest.json's description is afeature list with no token claim;
content/docs/,apps/docs/,README.legacy.mdand the marketplace publisher are all clean. Re-checked afterthe change:
Gates
Full
pnpm verifygreen on the pushed tree,f5373112— the real exit code, nota piped one:
Also ran, since they are
ci.ymlstepsverifydoes not cover:node scripts/check-stackblitz-lock.mjs(in sync) andpnpm changeset status --since=origin/main(hotcrm → patch).Left to CI, per #1149:
test:coverage(same suite, instrumented),e2e.yml(Playwright, needs a running app — this change touches no runtime metadata),
link-check.yml(the only URL in the added lines is the pre-existing ObjectStacklink, target unchanged), and CodeQL.
Out-of-scope finding
test/docs-drift.test.tssits at 100,190 of the 102,400-byte hygiene ceiling —97.8% full, so the next rule added to it turns the gate red, as this card's first
attempt did. Filed unassigned as #1196 rather than fixed here — two closed
precedents (#814, #635) show the same condition being found only when it bites.
Generated by Claude Code