Candidate 382858f on feat-provisioner-state implements local installation-plan enrollment and immutable authorization state on the existing encrypted signed journal and independent floor. The prior a6057b1 candidate remains untouched and reviewable.
Public API: InstallationPlan, InstallationTarget, EnrollmentInfo and EnrollPlan. Native CLI provision enroll takes a bounded private --plan-fd separate from --password-fd. It returns state=local-plan and does not claim remote enrollment or owner approval. Internal enroll/prepare/markInFlight/transition APIs replay finalized signed events to derive current generation, independent credential/directory accepted heads, pending slots and exact saved requests/results. Preparing or recording an orphan result never advances a role. Ambiguity retains its slot; a refused outcome releases an unaccepted slot only after expiry. No CLI or completion adapter can manufacture accepted/stopped facts.
Exact signed request bytes are stored directly as encrypted payload. A valid 64KiB result is stored separately without JSON/base64 expansion; acceptance references its signed record digest. Journal recovery finalizes and persists the independent floor before any accepted head is derived. Typed result decoding uses the actual operator encoder, preserving its bytes rather than applying the native registry canonical encoding. State events preserve the timestamp checked by their transition validator so a second clock read cannot create an unreplayable event.
Focused tests pass: exact replay after expiry, changed-input refusal, independent role streams, no automatic replacement of ambiguity, expired refused-slot reuse, full 64KiB result, missing/tampered result reference, crash between result and acceptance at prepared/floor/finalized boundaries, older-registry refusal against the surviving floor, privacy scans, and actual native CLI/subprocess enrollment replay, process-lock exclusion and process death during signed preparation. Full make test is running at /tmp/oficina-provisioner-state-gate.log. No Fable invocation, merge, dispatch, deployment or live seeding occurred.