@@ -38,7 +38,8 @@ those descriptors or authorize a second local/provider chooser.
3838 tested for the exact platform leaf, device kind/backend, and provider mode; family ownership never
3939 implies uniform leaf support.
4040- Command descriptors declare one typed execution shape: inventory use, or platform-neutral required
41- device operations with separately declared preferred fast paths. Runtime owners report
41+ device operations with separately declared preferred optimizations and fact-conditional semantic
42+ operations. Runtime owners report
4243 device-specific facts and expose behavior-bearing facets; platform and provider implementations
4344 never name commands.
4445- ` RequestExecutionScope.bindDevice(device, use) ` resolves provider ownership, validates the facts
@@ -67,8 +68,9 @@ those descriptors or authorize a second local/provider chooser.
6768- Evidence is tiered by what a unit imports: request-scoped device units prove facts, operations,
6869 and parity cells; only durable-resource units carry the section 4–5 lifecycle evidence.
6970- A handler binds once with its execution use. Admission, ` capabilities ` , and doctor questions use
70- side-effect-free facts inspection; required-only declarations are the default and a preferred
71- operation requires a recorded measurement.
71+ side-effect-free facts inspection; required-only declarations are the default, a preferred
72+ operation requires a recorded measurement, and a conditional operation requires parity evidence
73+ explaining why correctness depends on the owner fact.
7274- Cross-cutting facets land with their first consuming command unit. Daemon startup recovery is
7375 evidence-gated, daemon shutdown is two-phase (detach, then stop), and session-teardown steps
7476 belong to their owning domains — there is no generic lifecycle-hook API.
@@ -156,11 +158,15 @@ procedure.
156158### 2. Runtime use joins facts and narrows the bound runtime
157159
158160` CommandDescriptor ` remains the command declaration root. Its runtime-use declaration has a typed set
159- of required platform-neutral operations and may separately name preferred optimizations. Commands
160- whose use depends on normalized input first produce a discriminated execution plan that retains
161- literal required/preferred types. Required and preferred operation keys are disjoint, and the
162- required-only path is semantically complete; preferred operations may improve execution but are
163- never necessary for command correctness.
161+ of required platform-neutral operations and may separately name preferred optimizations or
162+ fact-conditional semantic operations. Commands whose use depends on normalized input first produce a
163+ discriminated execution plan that retains literal required/preferred/conditional types. The three
164+ operation sets are pairwise disjoint. Preferred operations may improve execution but are never
165+ necessary for command correctness. A conditional operation is different: an owner that advertises
166+ it must provide it because that owner's semantically complete path depends on the observation; an
167+ owner that reports it unavailable must have a parity-proven complete path through the required
168+ operations. This prevents a correctness-bearing owner variation from being mislabeled as an
169+ optimization or made unconditionally required across owners without that semantic source.
164170
165171Inventory commands have a separate ` inventoryUse ` declaration. ` devices ` calls the composed
166172` DeviceInventoryGateway ` , which selects canonical family sources and provider-owned inventory sources
@@ -180,22 +186,23 @@ operations from the same facet.
180186` RequestExecutionScope.bindDevice(device, use) ` is the trust choke point. It:
181187
1821881 . resolves the exact local or provider runtime owner;
183- 2 . checks every required operation and classifies each preferred operation against facts for the
184- platform leaf, device kind/backend, and provider mode;
189+ 2 . checks every required operation and classifies each preferred and conditional operation against
190+ facts for the platform leaf, device kind/backend, and provider mode;
1851913 . creates or reuses one request binding for that ownership-qualified device;
186- 4 . verifies that every required operation and every preferred operation advertised as available has
187- a concrete facet implementation; an advertised operation with no implementation is a
188- runtime-contract error; and
192+ 4 . verifies that every required operation and every preferred or conditional operation advertised as
193+ available has a concrete facet implementation; an advertised operation with no implementation is
194+ a runtime-contract error; and
1891955 . returns a selected operation projection: required operations are non-optional, declared preferred
190- operations are optional and present only when available, and undeclared operations are inaccessible.
196+ and conditional operations are optional and present only when available, and undeclared operations
197+ are inaccessible.
191198
192199The cached broad runtime remains private to ` RequestExecutionScope ` ; narrowing does not intersect a
193200wide optional aggregate that would still expose undeclared facets. The descriptor and its specialized
194201handler share one non-widened declaration, and a widened generic descriptor carries no static proof.
195202A compile-time contract test proves the selected projection. A structural
196203** runtime-facet-narrowing gate** covers every runtime-migrated handler owner and rejects attempts to
197204manufacture required-operation proof with assertions or optional admission. Optional access is
198- permitted only for descriptor-declared preferred operations. The tracking issue owns the gate
205+ permitted only for descriptor-declared preferred or conditional operations. The tracking issue owns the gate
199206implementation and its required planted violation.
200207
201208Absence or failure of a preferred path may change optimization/path disclosure, not whether the
@@ -204,6 +211,11 @@ reason and an explicit descriptor/ADR 0011 path classification; it is never a ge
204211fallback. Helper/session reuse hidden inside one required operation remains that facet's implementation
205212detail and follows ADR 0002 rather than becoming a daemon-visible preferred operation.
206213
214+ Conditional operations do not inherit that fallback rule. Their absence is valid only when the owner
215+ fact reports them unavailable and parity evidence establishes the required path for that owner cell.
216+ When the fact reports one available, omission of its implementation is a runtime-contract failure;
217+ the handler must not silently continue through a path known to lose the observation.
218+
207219Family registration and support coverage are separate gates. The immutable registry owns each of the
208220six canonical families exactly once. Before a command cuts over, an independent parity artifact
209221freezes its legacy supported/unsupported cells and hints. Runtime-fact scenarios expand canonical
@@ -677,6 +689,11 @@ a preferred operation requires a recorded measurement of the fast path's benefit
677689review; the direct-selector fast path is the model. A preferred operation declared without a
678690measurement is speculative surface and is rejected in review.
679691
692+ Declaring a conditional operation instead requires a parity artifact showing both sides: the owner
693+ cells whose semantic path depends on the operation and the owner cells whose required path remains
694+ complete without it. A conditional declaration justified only by speed belongs under ` preferred ` ;
695+ one justified only by universal correctness belongs under ` required ` .
696+
680697### 10. Process-lifetime and cross-cutting surfaces
681698
682699A cross-cutting facet — one consumed from more than one command's execution path, such as snapshot
@@ -727,8 +744,8 @@ platform-freedom is structurally enforced rather than measured.
727744 [ ADR 0007] ( 0007-remote-device-leases.md ) : daemon request-policy traits, lease admission, and lock
728745 ordering remain daemon-owned. Binding happens only after their admission requirements are met.
729746- [ ADR 0008] ( 0008-command-descriptor-registry.md ) : the descriptor registry remains the command root.
730- Device-command capability buckets evolve into typed required/preferred runtime use joined with
731- exact runtime facts; inventory commands declare inventory use.
747+ Device-command capability buckets evolve into typed required/preferred/conditional runtime use
748+ joined with exact runtime facts; inventory commands declare inventory use.
732749- [ ADR 0009] ( 0009-apple-platform-consolidation.md ) : the Apple family and ` AppleOS ` leaf axis remain.
733750 The shallow ` PlatformPlugin ` shape is superseded as command units migrate; physical shared
734751 mechanics move only through the legal injected substrate transition or after their last legacy
0 commit comments