AGENTS.md · git:20260910.17774f6 · 2026-09-10 · sha256 29951e59a5db51b7

AGENTS.md git:20260910.17774f6A

Immutable. This exact content never changes and is served at /api/v1/blob/29951e59a5db51b7.

# frisket — agent instructions

Frisket is a local-first data-journalism workbench: import data,
transcribe audio, OCR documents, run AI actions over spreadsheet
columns — with cost estimates and explicit consent before anything
paid or external runs.

## Commands

- Python suite: `pytest -q -n 8 --dist loadfile` (~5 min; do not run
  the full suite serially). Single file: plain `pytest tests/<file>`.
- Web (from `web/`): `npx vitest run`; types: `npx tsc -b` (the root
  tsconfig uses project references; `tsc --noEmit` alone checks no files).
- Lint: `ruff check src tests` and `ruff format --check src tests`,
  plus the gates in `scripts/ci/lint_*.py` and
  `scripts/ci/check_import_boundaries.py --source-root src
  --config scripts/ci/import_boundaries.json`.
- Sidecar (from `sidecar/`): `uv run --no-sync pytest -q tests`.

## Conventions

- Tests self-skip when an optional extra is absent; a red test in an
  installed area is real. Test failures are named, not averaged.
- No live network in tests; provider calls replay recorded transports.
- Secrets never appear in reprs, errors, or logs. Malformed config
  refuses and names the offending knob.
- Money/consent code carries facts by value end to end; a bare
  `confirmed` boolean is never consent. Changes on that seam ship a
  regression that fails when a consumer drops one of those facts.
- After this pre-public follow-up round, schema changes require data-preserving
  migrations; reset or reseed only during explicitly authorized maintenance,
  never as a routine upgrade.
- Prefer deleting dead code over commenting it out; a change that only
  adds is worth a second look.
- See CONTRIBUTING.md for PR and testing expectations.