Skip to content
Code Recycle

Component · for humans & their agents

Extraction Contract Verdict

verified · first-partyactively maintained$0 during beta (was $69)

charThreshold is documented as the number of characters an article must have to return a result. It is not enforced: set it to 100000 and you still get back a footer copyright line as the article.

by Code Recycle

Get it free — beta

Every claim on this page is refundable if it is untrue — refund policy.

Verified: 89 tests

Checks what a readability-style extractor actually returned against the facts you already have from the page -- article length against the threshold you set, the metadata title against the document's own title and h1, and the metadata byline against the byline visible in the extracted text.

Checks what a readability-style extractor actually returned against the facts you already have from the page -- article length against the threshold you set, the metadata title against the document's own title and h1, and the metadata byline against the byline visible in the extracted text.

THE SILENT FAILURE. Extraction returns a well-formed object whether or not it extracted the right thing, and the failures below all produce a confident, non-null result.

THE THRESHOLD IS NOT A FLOOR. Readability's README says charThreshold is 'the number of characters an article must have in order to return a result'. The only null-forcing check in the source is a ZERO check, not a threshold check. Observed on 0.6.0: with charThreshold set to 100000, parse() returned a non-null 80-character article whose text was the page's FOOTER COPYRIGHT LINE, while the real article text was discarded. No exception, no warning.

A STALE og:title SILENTLY WINS. The DOM-heuristic title extractor is only consulted if no title-like meta tag exists at all, so an og:title templated to the bare site name -- an extremely common CMS misconfiguration -- overrides both the document's correct title tag and its single unambiguous h1. And isProbablyReaderable, the library's own documented pre-check, still returns true, so a caller following the recommended usage pattern exactly gets the wrong title with no signal at all.

THE BYLINE COMES FROM METADATA, NOT THE PAGE. A stale JSON-LD or meta author wins over the byline actually printed in the extracted content.

IT FAILS CLOSED, INCLUDING AGAINST YOUR TYPOS. If you supply none of the trigger fields, the answer is NOT ok with NO_CHECKS_RUN -- because nothing being examined is a different fact from nothing being wrong, and a misspelled field name is indistinguishable from an omitted one at runtime. Malformed input is refused with a reason rather than throwing, since a caller who catches an exception is left with no verdict at all.

NO I/O, AND NO RUNTIME DEPENDENCY ON THE EXTRACTOR. It takes plain values -- lengths, titles, h1 texts -- so it works against any extractor's output.

VERIFIED: 89 tests, measured by running the suite, every mutation observed FAILING before restore. The fail-closed behaviour above was itself a defect found by an independent adversarial reviewer: the package returned ok:true for an empty input and for a one-letter misspelling of a field name.

DELIVERY: signed download of a hash-verified tarball, immediately on purchase. Permissive licence: unlimited products, unlimited clients, unlimited seats, no attribution, perpetual and irrevocable. One restriction, do not republish the source as source.

Interface

What you call, and what comes back. Types and signatures only — the implementation ships with the source.

  export function checkAnchor( articleLength: number, charThreshold: number ): AnchorVerdict;
  export function checkByline( metadataByline: string | null | undefined, visibleBylineCandidates: readonly string[] | null | undefined ): BylineVerdict;
  export function normalizeText(value: string): string;
  export function presence(value: string | null | undefined): string | null;
  export function stripSiteNameSuffix(title: string): string;
  export function titlesAgree(a: string, b: string): boolean;
  export function bylinesAgree(metadataByline: string, candidate: string): boolean;
  export function checkTitle( metadataTitle: string | null | undefined, documentTitle: string | null | undefined, h1Texts: readonly string[] | null | undefined ): TitleVerdict;
  export function checkExtraction(input: ExtractionCheckInput): ExtractionVerdict;
  export type TitleSignal = "documentTitle" | "h1";

01Capabilities

Does

  • + Input validation
  • + Content extraction verification

Doesn’t

  • No exclusions declared

02Requirements & stack

Depends on

No declared dependencies

Credentials needed

None declared

Stack

typescript

03Community

No endorsements yet

No verified confirmations yet — be the first.

Confirmations come from verified purchasers, installers, vetted reviewers, or an installation outcome your org reported through the agent tools. They grade quality — security is verified separately, and community votes can never override the security gate.

Open an issue

Sign in to confirm — weight comes from verified usage, not vote count.

0 open · 0 answered · 0 fixed · 1 said it worked

04Trust Passport

Full passport →
–/100

0/0 automated components pass. An automated score is never a security guarantee.

✓ Verified · first-partyreviewed Sep 20, 2026 · re-verification due Dec 19, 2026
  • publisher identity Publisher status verified; 1 verification(s) on file
  • malicious pattern scan No known malicious-behavior patterns across 23 source file(s) plus listing text
  • capability contract All 0 observed capability reference(s) match the declared manifest
  • agent safety scan No injection patterns in agent-readable content
  • provenance No release signature or provenance attestation
  • behavioral sandbox Not performed in this environment — requires the production isolated runner (docs/sandbox-requirements.md). No untrusted code is ever executed on the application host.

Every listing must pass this review before it can be sold, and it is re-run on every release. Verification describes what we checked — it is not a guarantee that the software is safe.

VersionChannelReleasedNotes
1.0.0stableAug 5, 2026First public release.