.claude/skills/dev/SKILL.md
LLM-focused workflow for working in this repo: compile Zig, run the orchestrated test runner, consume test-report.json/html artifacts, and discover/debug ConfigFlags.
npx skillsauth add atopile/atopile devInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill is written for LLMs working inside this repo. It focuses on the fastest, most reliable inner loop:
ato dev test --llm, not raw test output)artifacts/test-report.json, artifacts/test-report.html, artifacts/test-report.llm.json)ConfigFlags correctly (and inventory them repo-wide)source .venv/bin/activate
ato dev compile
ato dev test --llm -k solver
ato dev test --llm --view HEAD --open
ato dev test --reuse --baseline HEAD~1
ato dev flags
src/atopile/cli/dev.py
ato dev compile (triggers Zig build via import faebryk.core.zig)ato dev test --llm (runs test/runner/main.py with args; supports baseline/CI report helpers)src/faebryk/core/zig/__init__.py (ZIG_NORECOMPILE, ZIG_RELEASEMODE)src/faebryk/libs/util.py (ConfigFlag, ConfigFlagInt, …)test/runner/main.py (artifacts/test-report.json, artifacts/test-report.html, artifacts/test-report.llm.json).github/workflows/pytest.yml (test-report.json, test-report.html)dev commands are the primary interface for GitHub Actions workflows.ato dev compile after modifying Zig code.ato dev compile: compile native extensions (graph/typegraph/sexp bindings).ato dev test --llm: runs the orchestrated test runner (defaults to -p test -p src); supports:
-k filter (-- -k ... also works via passthrough args)--baseline comparisons (commit hash or HEAD~N style)--view / --open to fetch and open the test-report.html artifact from GitHub Actions (requires gh CLI)--ci to apply the CI marker expression (not not_in_ci and not regression and not slow)--direct -k <testname> to run a single test via test/runtest.py (tight single-test loops)Local test runs write:
artifacts/test-report.json (single source of truth; outcomes/durations/memory/baseline compare status + stdout/stderr/logs/tracebacks; see tests[].output_full)artifacts/test-report.html (human dashboard; derived from JSON; controlled by FBRK_TEST_GENERATE_HTML=1)artifacts/test-report.llm.json (LLM-friendly; derived from JSON; ANSI stripped logs)CI uploads both artifacts (see .github/workflows/pytest.yml):
test-report.jsontest-report.htmlNotes for LLM debugging:
artifacts/test-report.json or artifacts/test-report.llm.json over raw output; they include structured failures, logs, baseline compare, and collection errors.Remote/baseline behavior:
ato dev test --llm --baseline <commit> uses the CI test-report.json artifact as the baseline (requires gh CLI).ato dev test --llm --view <commit> --open currently fetches/opens only the HTML artifact; for JSON, download the test-report.json artifact via gh run download.ato dev test --reuse --baseline <commit> rebuilds JSON/HTML/LLM against a baseline without rerunning tests.ato dev test --keep-open keeps the live report server running after tests finish.Useful test-runner environment variables (see test/runner/main.py):
FBRK_TEST_REPORT_INTERVAL (seconds; report refresh cadence)FBRK_TEST_LONG_THRESHOLD (seconds; “long test” threshold)FBRK_TEST_WORKERS (0 = cpu count, negative scales workers)FBRK_TEST_GENERATE_HTML (1/0)FBRK_TEST_PERIODIC_HTML (1/0)FBRK_TEST_OUTPUT_MAX_BYTES (truncate preview output used by HTML; tests[].output_full remains complete)FBRK_TEST_OUTPUT_TRUNCATE_MODE (head or tail)FBRK_TEST_BIND_HOST (orchestrator bind host; default 0.0.0.0)FBRK_TEST_REPORT_HOST (host used in printed report URL; default bind host)FBRK_TEST_PERF_THRESHOLD_PERCENT (default 0.30)FBRK_TEST_PERF_MIN_TIME_DIFF_S (default 1.0)FBRK_TEST_PERF_MIN_MEMORY_DIFF_MB (default 50.0)LLM quick usage:
artifacts/test-report.llm.json is always generated (ANSI stripped, full tests + logs).ato dev test --llm prints a concise summary + schema + jq hints (stdout only).llm.jq_recipes.ato dev test enables the summary automatically when running under claude-code/codex-cli/cursor.FBRK_TEST_LLM=1 or FBRK_TEST_LLM=0.ConfigFlag is the repo’s “toggle-by-env-var” mechanism. The environment variable name is the first argument to ConfigFlag(...).
Usage:
export SOME_FLAG=1
Inventory all ConfigFlags in-tree (preferred over trying to maintain a manual list):
ato dev flags
Prefer using ato dev flags when you want the full picture (types/defaults/descriptions + callsite counts) in one place.
High-leverage flags you’ll use often:
ZIG_NORECOMPILE, ZIG_RELEASEMODESLOG, SVERBOSE_TABLE, SPRINT_START, SMAX_ITERATIONS, SSHOW_SS_ISCOLOR_LOGS, LOG_TIME, LOG_FILEINFOsrc/faebryk/core/zig/src/ -> Run ato dev compile.ato dev profile <command> to generate a flamegraph or stats.ato dev test --llm.test/ that exercise the command surface.ConfigFlag instead of commenting out code.development
How the Faebryk parameter solver works (Sets/Literals, Parameters, Expressions), the core invariants enforced during mutation, and practical workflows for debugging and extending the solver. Use when implementing or modifying constraint solving, parameter bounds, or debugging expression simplification.
development
# SEXP Benchmark Strategy ## Goal Measure and improve S-expression pipeline performance with a focus on: - Throughput per stage - Peak memory per stage - End-to-end behavior on realistic KiCad PCB inputs ## Pipeline Stages Benchmark these layers separately: - `tokenizer` - `ast` - `parser` (typed decode) - `encode` (typed encode to raw SEXP) - `pretty` (formatting) ## Dataset Dimensions Use a matrix over: - `depth`: shallow vs deep nesting - `size`: small, medium, large Recommended size buck
development
How the Zig S-expression engine and typed KiCad models work, how they are exposed to Python (pyzig_sexp), and the invariants around parsing, formatting, and freeing. Use when working with KiCad file parsing, S-expression generation, or layout sync.
tools
How the Zig↔Python binding layer works (pyzig), including build-on-import, wrapper generation patterns, ownership rules, and where to add new exported APIs. Use when adding Zig-Python bindings, modifying native extensions, or debugging C-API interactions.