# YC homepage-link methods — September 19, 2026

This package makes the link classification, URL eligibility, robots policy, guarded retrieval and aggregate calculations inspectable. It accompanies the [frozen public observations](../yc-homepage-links-2026-09-19.json).

- [collect.mjs](collect.mjs): original collection logic, with portable imports and input paths.
- [guarded-fetch.mjs](guarded-fetch.mjs): the exact public-URL, DNS/socket checks, bounded GET/HEAD, redirect and robots functions used by that collector, extracted from the larger application module. No credentials or application services are required.
- [recount.mjs](recount.mjs): the original aggregation functions, reading the frozen observations; does not make network requests.
- [package.json](package.json): dependencies for a new collection or parser inspection.

## Recount the published observations

Download the JSON and this directory, preserving their relative paths. With Node 22 or newer:

```sh
node recount.mjs ../yc-homepage-links-2026-09-19.json
```

This reproduces the overall, cohort and primary-industry numerators and denominators from retained company observations, including the conservative documentation-URL sensitivity subset. It needs no dependencies or network access.

## Inspect or run a new collection

After installing this directory's pinned dependencies with `npm install --ignore-scripts`, `parseHomepage` and `safeURL` can be imported from `collect.mjs` for local fixture tests. Running `node collect.mjs` starts a **new** credential-free homepage collection against the frozen roster, honoring robots policy, concurrency three and bounded responses. It never fetches advertised reference destinations. Use a fresh working directory; the collector resumes existing row files.

A new run is not a replay of September 19 HTML. Websites and robots rules change. The publication deliberately does not distribute raw third-party HTML or labels. Therefore the retained historical classification cannot be independently reconstructed from raw historical pages; it can be recounted, its algorithm inspected and the parser exercised on fixtures or newly retrieved responses.

## Provenance and portability changes

The dataset's `sourceCodeSHA256` identifies the original local collector (`cd2ead55607382d59c2cb37e6f9cf4a9e4a2a66d2577d2623f011bfb228b563e`). `guardedFetchSHA256` identifies the entire original application content module (`40063db12e6a326e6b4f90d30f4842946d406af8bf618273642ac81143d76d99`), not this extracted helper. These hashes remain historical provenance, not hashes of the portable files.

The portable collector changes only dependency/input paths and the roster adapter. Its URL filters, HTML parser, fetch/robots workflow, timeouts, concurrency and output logic are unchanged. The adapter reconstructs roster inputs from published company fields; published URLs omit queries/fragments. Consequently a future collection uses those sanitized URLs, not a claim of byte-identical original inputs. The extracted guard functions are unchanged; unrelated application conversion and retrieval code is omitted. Recounting omits the original comparison-to-earlier-snapshot metadata, which is not needed for the paired-response results.

These observations are advertised links and raw HTML metadata. They do not establish valid destination content, native WebMCP, successful agent calls, adoption, ranking effects or causality.
