refactor(daemon): extract appstate target admission into its own module
Summary
Part of #3424 (CRAP burn-down, umbrella #3414). Layer 4 of 4 (top as first opened; now stacked under a follow-up removal layer); stacks on #3457 (appstate leaf modules).
Moves the appstate target-selection/admission decision out of handleAppStateCommand in src/daemon/handlers/session-state.ts into src/daemon/handlers/session-appstate.ts: admitAppStateTarget answers every refusal (missing explicit session, no session-or-selector, --platform ios/macos without a session-bearing target), and the apple-session decision carries the admitted session itself so the response path never re-reads the store for a session that could have gone missing. handleAppStateCommand becomes a dispatcher over that decision. Also retires the stale complexity_critical baseline for session-state.ts in fallow-baselines/health.json. No behavior change to wire shapes.
What is in this diff: session-appstate.ts (new), session-state.ts (admission branches removed), session-appstate-apple-session.ts (exports AppStateSessionRecord for the decision type), fallow-baselines/health.json, daemon-layer-manifest.json, and tests: new mirrored session-appstate.test.ts (missing-session error plus message-level --platform ios/macos session-required refusal cases), the admission test removed from session-appstate-input.test.ts, session-appstate-device-runtime.test.ts added, and session-state.test.ts reduced to dispatcher coverage.
Per-finding results: handleSessionStateCommands 34 → 4.0, handleAppStateCommand 30 → 5.0; check:coverage-crap --all reports no function >= 30.
Validation
pnpm check:affected --runon this head: passed (2026-10-12, mkdir lock).pnpm check:coverage-crap --all: clean.pnpm check:layering: pass (R75 overlay unchanged).
Created by Apex.