tools/compose-repo-import.sh builds the homelab-compose repo on VM103 from
each stack's compose.yaml only and refuses to commit an inline secret.
deploy/arcane/compose.yaml runs a pinned Arcane over /opt/homelab/compose,
LAN only, with its own updates off. DEPLOY.md has the owner's import and
pilot steps; IMPLEMENTATION.md and TASK_STATE.md record phase F.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
typescript ~6.0.3 (not 7.x): typescript-eslint 8.70 peers typescript <6.1.0, so 7.x would break lint.
eslint + typescript-eslint: strict type-checked lint; @eslint/js: base rules.
vitest: tests next to code; vite + @preact/preset-vite: frontend bundle; preact: UI.
fastify + @fastify/static: HTTP API/SSE and serving the built UI; zod: validation at boundaries.
@types/node: Node 24 typings. SQLite uses the built-in node:sqlite, so no native dependency.
Layer rule domain -> app -> infra -> http/web lives in tools/layer-rules.ts and is tested.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>