bhcto.com

Reproducibility & Methodology

Everything here is reproducible. These are the modules, the commands, and the configuration that produced every artifact in this review.

Pipeline modules

lib/env.js.env reader — case-insensitive, walks up to the repo root
lib/briefs.jsParses the 15 briefs from tierA_content_briefs.md
lib/serp.jsSerpApi call (Chicago, IL), 60s timeout + 4 retries
lib/scrape.jsHeadless scrape with Bright Data US proxy fallback; block detection by body-text length
lib/onpage.jscheerio on-page extraction — title, meta, headings, density, schema
lib/batch.jsprobeModel, runRound, shortId, web-search config, poll/collect
lib/prompts.jsSystem prompts + per-round builders; reviewer-placeholder rule
lib/clean.jscleanArticle() strips any model preamble

Top-level scripts

Re-run commands

Run from NIRC/. Dependencies and .env resolve from the repo root automatically.

node seo_intel.js [--slug <slug> | --limit N]
Stage 0 — competitor intel (needs SERP_API)
node content_supervisor.js
Full 3 rounds, all 15 posts
node content_supervisor.js --resume
Resume after interruption
node content_supervisor.js --limit 1
Cheap smoke test (1 post × 3 rounds)

Secrets & environment

The pipeline reads four secrets from a gitignored .env at the repo root: SERP_API ANTHROPIC_API_KEY Brightdata_Username Brightdata_Password. None of these values are included in this review build — only the names. The Bright Data endpoint defaults to a US residential exit node.

About this review site

This site is a static Next.js app. At build time, a sync script copies a whitelist of pipeline artifacts into the app — the analysis tables, the SEO intel, all three rounds of every post, and the run records. The 4.6 GB content corpus is deliberately excluded; it's represented by the inventories and topic mine derived from it.

One artifact is unique to this provider: NIR's own site content was captured through a net-new sitemap harvester, because its WordPress REST API is deliberately disabled.