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.jsFull 3 rounds, all 15 posts
node content_supervisor.js --resumeResume after interruption
node content_supervisor.js --limit 1Cheap 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.