Every change happens in a lane, never in the main checkout and never in a bare git worktree add.
lane new <name>, then work in the tree it prints (.lane/trees/<name>). lane clones ignored files by reflink, sonode_modulesand the native build scratch innative2/.buildcome along without a reinstall or refetch.lane why <path>before editing a file, and keep what its notes say still true.- Commit. Record a constraint another agent would otherwise rediscover with a
Why: <path> | <note>trailer (see.agents/skills/lane/SKILL.md). Don't use trailers to summarize the change. lane check, and confirm, replace or retire every stale note.lane push, thengh pr create, and squash-merge the PR.- In the main checkout:
git pull --ff-only, thenlane prune --dry-run. Prune misses lanes whose PRs were squash-merged, so remove a merged lane withlane rm <name>.
npm run dev-app builds and launches the one dev copy of the app; see docs/build.md. All native code is the Swift package in native2/ (see native2/README.md); swift test --package-path native2 runs its tests without the desktop. A tool's description and schema live in native2/Sources/DesktopProtocol/ContractTools.swift: run npm run contract after changing them, which regenerates src/contract.ts, what embedders import as /tools.