<!-- station:product-laws:start -->

Executable product laws

This file is generated from the product-law manifest. The manifest is the authority; this Markdown is a readable projection. Each law has exact behavior and fault observations evaluated through structured test results. A PASS means both named observations passed, a FAIL means either failed, and NOT_VERIFIED means the runner could not produce a trustworthy structured observation. The manifest is bounded to 6 laws, 6 test files, and 150s total runtime. None of these results create a second completion lane.

Law IDObservable invariantOwning ModuleAffected InterfaceBehavior observationFault observationRemediation owner
station.queue-dispatch.ordered-drainWhen a turn completes, Station removes exactly the queued head before canonical dispatch; a definitive 4xx rejection removes that head instead of requeueing it into a refusal loop.Chat queue draindrainQueuedMessageOnTurnCompletedpops the head synchronously, then dispatches the canonical Agent target after the settle delaya definitive 4xx rejection drops the entry instead of requeueing and surfaces the failurestation#613
station.lifecycle-completion.gate-derivedA Flow run advances only when its gate evaluates matching evidence; completion is derived from that gate outcome rather than asserted by the caller.Flow run serviceFlowRunService.evaluatepasses the gate and advances when claim evidence matchesroutes back on failed evidence with attempt budgetstation#1555
station.approvals.actionable-resolutionOnly a known approval action can resolve actionable orchestration attention; an unknown action is rejected rather than failing open, and a real resolution marks the request actioned.Approval inboxApprovalInboxServicemarks orchestration notifications actioned when the request resolvesrejects unknown approval actions instead of failing openstation#1284
station.home-role.recovery-floorA granted Home renderer failure falls back to the built-in Home with the actual failure and a recovery action, never a blank root.Home role paneHomeRolePanea renderer that throws on mount lands on the built-in Home with the actual failure textretry into a still-broken renderer lands back on the built-in, not a loop or a blankstation#3122
station.release-stage.inventory-truthRelease staging accepts only the complete required variant inventory, checksums, updater sidecars, and immutable container descriptor for one source identity.Release artifact inventoryvalidateReleaseInventoryassembles every required variant, sidecar, and immutable containerfails when uploaded bytes differ from the assembled checksumstation#818
station.mobile-context.primary-actionsProject and conversation switching remain directly reachable with readable context in the mobile dock header; opening a Project must not rebind the active conversation.Mobile chat dock headerChatDockMobileHeaderkeeps project and conversation switching directly reachable with readable contextopening a project preserves the active conversation bindingstation#1540

The contributor workflow regenerates this projection after intentional manifest changes. The gate rejects hand-edited projection drift, duplicate IDs, empty owners or selectors, nonexistent tests, a missing fault observation, and selectors absent from the exact structured test observation. <!-- station:product-laws:end -->