Skip to content

docs: rewrite README and npm page around what the gate catches - #304

Open
EivMeyer wants to merge 4 commits into
devfrom
docs/readme-rewrite
Open

docs: rewrite README and npm page around what the gate catches#304
EivMeyer wants to merge 4 commits into
devfrom
docs/readme-rewrite

Conversation

@EivMeyer

@EivMeyer EivMeyer commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Summary

Rewrites README.md and the npm page at packages/opcore/README.md. No code changes.

Both pages opened with "changed-file validation gate", which is the category husky, lint-staged and every pre-commit config already occupy, and then spent the hero example on a TS2322 that tsc --noEmit already reports. The Rust graph, which is the only claim on the page a competitor cannot copy, was a subtitle clause beginning "Backed by".

What changed

Lead with the gate, not one check family. The hero is now the whole pass and the single exit code. An earlier draft of this led with dead exports instead, which was worse: TS_DEAD_CODE_UNUSED_EXPORT is warning severity and exits 0, so headlining it would have promised blocking behaviour the check does not have.

The example shows the mix. One blocking FAIL next to two graph-only WARNs, severities visible. The type error demonstrates the gate is sufficient; the dead export and the missing TESTED_BY edge demonstrate what a per-file linter cannot reach.

Introduced report mode is documented. Neither page mentioned it. check --changed defaults to --report-mode introduced (packages/opcore/src/check.ts:167, and the CLI help says so at :246), so a pre-existing error in a file you touched does not block you. That is the reason the gate survives contact with a repo that has debt, and it was invisible.

Checks grouped by decay type, not by language. Structure, untested surface, duplication, size and complexity, documentation, correctness. The old table sorted by stack with a Deep / Useful / Experimental column, so a Python reader met "Experimental" before meeting any value. Stack maturity survives as a small reference table with counts instead of adjectives.

The documentation checks exist now. Ten of them, named, labelled opt-in. They were absent from both pages. clone.duplication was too.

Numbers. "41 checks, 25 in the default gate." Neither page carried a quantity.

Known limits, five distinct failure modes. Graph must be built first, docs checks are opt-in, higher-order usage reads as dead (#299), public entrypoints need declaring, Python maturity. A specific admitted flaw with an issue number buys more trust than the four denial sentences it replaces.

Removed. "not for remote publishing or opaque ratings", "does not publish, install packages, run wrapper tools, or edit source files", "does not invent findings or ratings", and the "Providers assess; ASP hosts decide" slogan. Four denials of accusations nobody made. Also "Metric output is named evidence and deltas", which parses to nothing, and the term "evidence" everywhere it was not naming a graph edge.

Added opcore graph build to the command list. On a fresh repo I got zero structural findings until I ran it, then nine. Real first-run cliff, undocumented.

On the count

Counted against the check-ids.ts arrays on main @ ab887a7: typescript 10, rust 11, python 9, docs 10, clone 1 = 41.

Worth flagging: python grew from 6 to 9 when python.ruff-lint, python.ruff-format and python.pytest arrived with #258 and #259. Anything still saying 38 is counting against af09b7c.

The default gate is 25, taken from an actual check --changed manifest rather than inferred: { typescript: 7, rust: 11, python: 6, clone: 1 }. The 16 opt-in checks reconcile exactly: 10 docs, typescript.lint, two config-gated TypeScript checks, and the three new Python ones, all carrying defaultScopes: [].

Verification

  • tests/launch-claim-scrub.test.mjs 8/8
  • npm run release:hygiene passes
  • tests/package-identity.test.mjs 5/5. This one caught a real mistake: my first draft reworded the ASP provider section and dropped the required "opcore package exposes both" phrasing, which the test asserts against both this README and docs/quickstart.md. Restored.
  • Every check ID in the new copy grepped against packages/validation-*/src/.

Open question

I regrouped into six buckets rather than the deck's CLEAN / CONTEXT / SHAPE, because three buckets made "Shape" and "Clean" carry too much. If the deck and README should use identical language, say so and I will collapse them back.

EivMeyer and others added 4 commits September 3, 2026 21:24
release: promote Opcore 0.2.2 nested-workspace fix
Both pages led with "changed-file validation gate", a category husky and
lint-staged already occupy, and spent the hero example on a TS2322 that tsc
already reports. The graph, which is the part nothing else does, sat in a
subtitle clause.

- lead with the whole gate and one exit code, not one check family
- hero example shows a blocking FAIL next to two graph-only WARNs, with
  severities visible, so nobody reads dead-code as blocking
- document introduced report mode, which was undocumented on both pages
  despite being the reason the gate is usable in a repo with existing debt
- group checks by the decay they find rather than by language, so a Python
  or Rust reader is not told they are second tier before seeing any value
- surface the ten documentation checks and clone.duplication, previously
  absent from both pages entirely
- state 41 checks with 25 in the default gate, verified against the check-id
  arrays and against a real `check --changed` manifest, rather than no number
- add Known limits covering five distinct failure modes: graph must be built,
  docs checks are opt-in, higher-order usage reads as dead (#299), public
  entrypoints need declaring, Python maturity
- add `opcore graph build` to the command list; a fresh repo reports nothing
  structural until it runs
- drop four denial sentences that answered accusations nobody made, and the
  internal term "evidence" everywhere it was not naming a graph edge

Counts verified on main @ ab887a7: typescript 10, rust 11, python 9, docs 10,
clone 1. Python grew from 6 with the ruff and pytest checks from #258/#259.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TytwH459JMysvWDj1PopjH
opcore emits graph findings before compiler diagnostics. Verified on a live
run: TS_DEAD_CODE_UNUSED_EXPORT lands at position 2, the TS2322 errors at 3
and 4. The example had FAIL first, which was a rhetorical reordering rather
than a transcript, and it buried the findings nothing else produces.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TytwH459JMysvWDj1PopjH
check-workspace.mjs enforces a machine-checked copy contract that the rewrite
broke in three places, which is why CI went red on this branch:

- README.md must include "hybrid" (check-workspace.mjs:178); the architecture
  sentence had been reworded to drop it
- packages/opcore/README.md must include "Unsupported platforms return typed
  degraded status" and "freshly `git init` repo with no commits"

Also removes "fan-in hotspots" and "god modules". No adapter implements either.
rust.graph-signals emits RUST_GRAPH_DEAD_PUB_EXPORT, RUST_GRAPH_MODULE_CYCLE,
RUST_GRAPH_MODULE_ORPHAN and RUST_GRAPH_UNTESTED_SURFACE, and it is Rust-only,
so attributing fan-in detection to TypeScript was wrong twice over. The claim
predates this branch; it is on main today in both the hero subtitle and the
TypeScript row.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TytwH459JMysvWDj1PopjH
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