To future contributors: when you add rules or checkpoints, keep the language minimal but never skip a real aspect to verify — this list must stay short, concrete and effective, not a verbose essay. If a rule lives elsewhere (ARCHITECTURE.md, RELEASING.md, AGENT_TOOLS_GUIDE.md), reference it and keep the actionable line here.
Run before publishing the app or pushing master. The Debug binary enforces rule 1 at startup (it refuses to run when broken) — start it once as the final check.
- No
*.jsonsits directly next to the executable — only the SDK-generatedagent.deps.json,agent.runtimeconfig.json,agent.staticwebassets.endpoints.jsonare allowed there. AppConfig's DEBUG guard (startup) fails otherwise. - Every persistent, non-overwritable file lives under
PersistentData\(appsettings.json,providers.json,telegram.json,telegram.session,tools.json) or in the OS app-data folder (setup.json,autoupdate.json,crashreport.json,sipstate.json) — see docs-dev/ARCHITECTURE.md "Where files live (storage tiers)". - The release archive contains no user config: nothing under
PersistentData\ships, noappsettings.json/providers.json/telegram.jsonat the archive root. - No new file was added next to the executable by code or build targets; new runtime
state goes to
PersistentData\(or app data), never to the assembly folder.
- The app works when launched from any directory (terminal CWD ≠ exe folder): config
and content are resolved from the executable folder (
AppContext.BaseDirectory), never from the CWD;AppConfig.Initialize()anchors the CWD at startup. - Spawned child processes (voiceagent, voiceagent-stt) set their
WorkingDirectory— they never inherit an arbitrary CWD. - New code paths use
AppConfig.*Filefor config files — never a bare relative path.
-
PersistentData\and the OS app-data folder are never deleted or overwritten by the updater; the archive is overwrite-only distribution content (see docs/autoupdate.md). -
AutoUpdate.csprotects by the single-directory rule (nothing user-editable is in the archive), not by per-file whitelists.
-
dotnet build -c Debugsucceeds and a Debug start prints no stray-json refusal. - Publish output (any RID) has no root config json before the release.
- Local archive downloads use
download-release.ps1(background-safe, verifies integrity withtar -tzfbefore extraction) — a foreground download of the ~950 MB archives can be killed mid-transfer and leave a silently truncated.tar.gz. - Docs stay truthful: file locations in docs/ (user) and docs-dev/ (developer) match the
layout above;
IsPrereleasegate handled per AGENTS.md. - If
docs/changed, the wiki syncs from it:.github/workflows/sync-wiki.ymlregenerates the public wiki on push — never hand-edit the wiki repo (it is overwritten). Verify the/docscommand and Help → Documentation point at the wiki URL. - The release note in
release.yml("Create GitHub Release" step,body:) describes THIS release: it is pre-pended to the auto-generated notes on every release, so it must be updated (or emptied) here before pushing the gate-off commit — a stale note ships the previous release's news to every user and AI engine reading the release. - Tool plugins still resolve after the change (start the app,
/v1/modelslists the expected agent sets).
- Checklist reviewed before
git push/release.ps1— the pre-push hook reminds you; do not push a release while any box above is unchecked.