CLAUDE.md · git:20261001.ef759f0 · 2026-10-01 · sha256 6a8851cdb7904301
CLAUDE.md git:20261001.ef759f0A
Immutable. This exact content never changes and is served at /api/v1/blob/6a8851cdb7904301.
# Navvi v3
Self-healing scraper compiler. The current plan lives in
`fellowship-dev/claude-buddy` under
`specs/plans/2026-09-22-007-navvi-prompt-to-scraper.md` — brief to spec to
investigation to scraper, with the original compiler plan
(`specs/plans/2026-09-19-001-feat-jev-compiled-scraper-actor-plan.md`) behind
it, and `specs/plans/2026-09-22-008-navvi-remaining-phases.md` after it — the
driver (`navvi make`, `src/make/`), sample, determinism, and the live run
that found three seam defects no unit test could see. That plan's two
transcripts under "The flow" are `tests/make.test.ts`'s specification,
*exactly as written*.
## Verify
- `npm run typecheck`, `npm run typecheck:tests` and `npm test` on every
change. Tests are offline: recorded chooser answers, fixtures served from
disk.
- `npm run typecheck` reads `tsconfig.json`, which excludes `tests/`; vitest
only strips test types. `npm run typecheck:tests` (`tsconfig.test.json`,
same strictness) is the only command that checks them, so a change under
`tests/` is not verified without it.
- `npm run demo` runs the two-version pharmacy proof offline.
- `npm run test:live` needs a key and is required after changes under
`src/chooser`, `src/compile`, `src/navigate`, `src/replay/heal.ts`,
`src/secrets` or `src/browser/policy.ts`.
## Rules
- `playwright` stays pinned to 1.60.0 (the Apify Dockerfiles and `.devcontainer/` follow it; `scripts/check-image-pins.mjs` checks): `camoufox-js` caps `playwright-core`
below 1.61 and the Apify Camoufox image tops out at 1.60.0.
- Secrets are `{{secret:name}}` placeholders filled by code. A secret value
never enters a chooser question, a log, a trace or the scraper JSON.
- The chooser only picks among code-enumerated options. Never let model
output become a selector or a script.
- `storage/` holds browser profiles with live sessions. Never commit it,
never copy it between machines.
- A heuristic ships with its fixture in the same commit
(`src/heuristics/`, `tests/fixtures/heuristics/`). A rule with no eval is
prose, and prose does not execute: every finding of 2026-09-22 was already
written down in a plan document and was rediscovered anyway.