.agents/skills/core-platform/SKILL.md
Use this for changes touching lib/core/, lib/manager/, core/, services/helper/, Android app/service modules, build
hooks, system proxy, tray, VPN, TUN, or platform-specific desktop/mobile behavior.
lib/core/controller.dart, lib/core/interface.dart, and lib/core/method.dart.lib/core/lib.dart, lib/plugins/service.dart, and Android ServicePlugin.ServiceState; binding/process-time bookkeeping: ServiceController.lib/core/service.dart; lifecycle/process ownership: lib/core/desktop/lifecycle.dart.lib/core/desktop/transport.dart and lib/core/desktop/rpc_client.dart.lib/core/desktop/launcher.dart; Windows Helper HTTP contract:
lib/core/desktop/helper_client.dart and services/helper/.lib/providers/actions/core.dart and system.dart; UI/event observation: lib/manager/.ServiceState identity-checks the latest native RunRequest.CoreController and CoreHandlerInterface. Do not bypass desktop process leases or create a
second Android service binding owner.core/message.go.SystemExitCoordinator sequences resource cleanup, window close, Core close,
and process exit; widget/manager disposal must not race it..agents/commands.md:
test/core/desktop/ plus test/core/service_test.dart.test/core/protocol_contract_test.dart and CGO_ENABLED=0 go test ..test/providers/action_test.dart and test/providers/system_action_test.dart.windows-service feature on Windows.Read .agents/architecture.md for the current core modes, manager stack, build hooks, local plugins, and Windows helper notes.
/start must return the submitted session and PID;
/stop must never terminate a different session; Dart must verify the connected named-pipe peer PID./start must release the previously managed Core before it verifies, so no /start outcome leaves a Helper-managed
Core behind for the caller's direct-launch fallback to race.200 from /stop means the Core is gone; when
termination cannot be confirmed the Helper keeps the child and answers coreStopFailed, and /start reports the same
code instead of spawning a replacement. Keep that code out of the Dart pre-spawn fallback set in
helper_client.dart, or the direct launch will race a Core the Helper still owns.CoreController.close() is terminal. Do not call it from a reusable manager lifecycle or recover by starting it again.ServiceBroadcastReceiver.goAsync() must finish once even on timeout; its watchdog releases the broadcast only and must
not become a service timeout.VPN_START_REQUESTED; revoke is explicit through VPN_REVOKED.plugins/setup/ is a build harness, not a Dart API plugin.