carlos / platform Public

WIP claim Plan 14 Part 3 checkpoint 9 (not for merge)

E3 runtime and retry authority; persisted-device fixes and reboot tests; H2 extended.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Paul Campbell pushed by claude agent, operated by paul@keymail.dev da7f4f7caa800b0832f283362214e8e0e58d9e3a parent 070222c
56 files changed, +1673 −126
  • internal/host/claimassembly.go +2 −1
  • internal/host/claimlaunch_root.go +29 −1
  • internal/host/claimretire_transport.go +14 −11
  • internal/host/claimroleassembly_linux.go +2 −2
  • internal/host/claimstop_kernel_linux.go +5 −1
  • internal/host/claimstop_writers_linux.go +11 −2
  • internal/host/claimstop_writers_linux_test.go +1 −1
  • internal/host/claimunit.go +10 −0
  • internal/host/claimunit_test.go +15 −0
  • internal/host/plan14_generation_kernel_linux_test.go +6 −1
  • internal/host/plan14_generation_kernel_process_linux_test.go +7 −1
  • internal/host/plan14_generation_parked_linux_test.go +12 −4
  • internal/host/plan14_generation_payload_files_linux_test.go +1 −0
  • internal/host/plan14_generation_payload_root_linux_test.go +1 −1
  • internal/host/plan14_generation_requirements_linux_test.go +1 −0
  • internal/host/plan14_installed_launch_root_linux_test.go +43 −1
  • internal/host/plan14_root_failures_test.go +17 −0
  • internal/host/proofbinding.go +18 −6
  • internal/host/prooffile.go +37 −0
  • internal/host/proofnamed.go +15 −2
  • internal/host/restartscope.go +3 −0
  • internal/host/rollout.go +3 −1
  • internal/host/rootgeneration_kernel_linux.go +6 −2
  • internal/host/rootgeneration_parked.go +1 −1
  • internal/host/rootgeneration_payload_linux.go +3 −6
  • internal/host/rootgenerations_launch.go +19 −8
  • internal/host/rootinventory.go +31 −27
  • internal/host/rootinventory_identity.go +59 −0
  • internal/host/rootinventory_state_linux.go +1 −1
  • internal/host/rootinventory_test.go +28 −1
  • internal/host/rootmigration_bootstrap_root_linux_test.go +8 −1
  • internal/host/rootmigration_historic_linux_test.go +1 −0
  • internal/host/rootpersisted_identity_linux_test.go +44 −0
  • internal/host/rootpersisted_reboot_root_linux_test.go +314 −0
  • internal/host/rootstop_reboot_linux.go +58 −0
  • internal/host/rootstop_reboot_linux_test.go +36 −0
  • internal/host/rootupdates.go +36 −2
  • internal/host/rootupdates_projection_root_linux_test.go +152 −0
  • internal/host/rootupdates_runtime.go +287 −0
  • internal/host/rootupdates_runtime_test.go +109 −0
  • internal/hostbox/coldhandover.go +3 −3
  • internal/hostbox/coldhandover_test.go +2 −2
  • internal/hostbox/inventory_identity.go +48 −0
  • internal/hostbox/migration_census_linux.go +2 −7
  • internal/hostbox/plan14_cold_process_test.go +2 −2
  • internal/hostbox/reconcile_adapter.go +1 −1
  • internal/hostbox/stopinventory.go +4 −1
  • internal/hostbox/typedpark_linux.go +41 −4
  • internal/hostbox/typedpark_other.go +1 −0
  • internal/hostbox/typedretire.go +11 −9
  • internal/provision/plan14_p3_census_test.go +11 −1
  • internal/provision/testdata/plan14-root-reads-p3.tsv +61 −11
  • internal/release/plan14_generation_pins_test.go +23 −0
  • internal/release/rootgenerationpins.go +6 −0
  • internal/release/rootupdates.go +1 −0
  • internal/rollout/rootfailures.go +10 −0

CI failed — run details

CI log
amadan: log truncated — showing the last 467720 bytes of 580827
ainst the retained stop receipt and exact inventory; inspect parked identities, require retired rows absent or an independently inventoried successor, and retain generation pins. Fixtures: TestPlan14GenerationParkedPayload, TestPlan14GenerationParkedCrash, TestPlan14GenerationParkedKeepsReservation, TestPlan14GenerationParkedReadback; TestPlan14GenerationParkedRootRunner is runner-pending. Timer producer matches retained entries once and preserves successors on replay: TestPlan14GenerationTimerRetirement. No claims-off path changes.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/restore.go	ColdRestore.Install	C	linux:internal/host/claimwakeassembly.go:ClaimWakeAssembly.Build	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/disk.go	Disk.VerifyFile	F	linux:internal/hostfloor/image_linux.go:Disk.Exec	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart.go	rootRestartRouteWith	B3	linux:internal/host/agent.go:runAdoptUnderRootRelease	rev3=merge-ruling-6;basis=Select main stamped-unit effects before binding dispatch without a census; ordinary routes still bypass census and record reads.
    plan14_input_inventory_test.go:424: J4	internal/host/rootexecution_settle.go	ClaimRootHTTP.beginExecutionRecoveryFence	D	linux:internal/host/rootexecution_settle.go:ClaimRootHTTP.cleanupExecution	Root cleanup checks exact retained installation, launch journal and kernel evidence; CC9 requires a fresh terminal or exclusion claim.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/root.go	Guard.AbandonRootInventory	C	linux:internal/host/rootinventory.go:ClaimRootHTTP.recoverRootInventory	Clear only an exact pending intent proved superseded, retaining quarantine and all prior denials.
    plan14_input_inventory_test.go:424: J4	internal/registry/artifacthosts.go	Registry.ArtifactHosts	E2	linux:internal/registry/remote_dispatch.go:Registry.dispatchRemote	E32: census-only E2 completeness discovers the bounded union of route and timer hosts, including inactive orphan timers, through the service-user read-only parser. Unknown hosts refuse even with an empty root installation list; discovery supplies no authority and never removes a retained obligation. Pre-flight 33, 80, 82, 83, 89 and 90. Fixtures: TestArtifactHosts, TestRemoteReadOnlyWALRegistry, TestPlan14GenerationRegistryRows, TestPlan14GenerationRegistryProductionReader; extended TestPlan14GenerationRequiredArtifactsRootRunner remains runner-pending.
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_kernel_linux.go	linuxClaimLaunchKernel.member	C+G	linux:internal/host/claimlaunch_kernel_linux.go:linuxClaimLaunchKernel.Observe	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/movesinstall.go	installRun.installAuthority	C+G	linux:internal/host/movesinstall.go:installRun.local_	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostexec/rootbroker.go	RootBroker.Execute	D	linux:internal/host/rootexecution_transport.go:ClaimRootHTTP.serveExecution	Retry transient authority reads within existing admission slack; bounded replay and permanent mismatches remain enforced.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/coldhandover.go	ColdHandover.retireIntended	C	linux:internal/hostbox/coldhandover.go:ColdHandover.Run	rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=captures persistent identity for root-guarded empty directories before identity-conditional retirement
    plan14_input_inventory_test.go:424: J4	internal/host/rootupdates.go	initializeMigrationFailures	E3+G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;run=8;identity=offline journal-migrate uid 0;basis=requires complete root census before creating migration-bound root failure book; missing legacy history supplies no known refusal
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloor.go	readLocalFloor	F	linux:internal/host/movesfloor.go:withMovesFields	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostbox/launchjournal.go	LaunchJournal.SessionLaunches	C	linux:internal/host/claimwakestop.go:ClaimAssembly.collectRetirementStop	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/movesstage.go	heldReleaseStaged	C+E1	linux:internal/host/movesstage.go:heldReleaseHooksVia	root-route;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	settingsApply	E3	linux:internal/host/buildstate.go:buildStates.wakeTarget	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/claimassembly.go	ClaimAssembly.Build	C+G	linux:internal/host/claimassembly.go:productionClaimFactory	Assembly supplies root registration client to moves alongside guard, enrollment and typed inventory. PROPOSED E46: local root installation obligations, exact root intention and inventory revision; service SQL is a deny-only consistency check. Executing identity: root instance-control or root participation/update.
    plan14_input_inventory_test.go:424: J4	internal/host/rolloutdeclined.go	failureHolds.retryHost	E1+E3	linux:internal/host/rolloutdeclined.go:rolloutRetryHost	fix1-merge-review;basis=Refuses retry while a failure-book save is owed; verifies the signed current book/epoch grant before clearing.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalmigration_linux.go	JournalService.holdsLegacyRows	C	linux:internal/hostbox/journalmigration_linux.go:JournalService.MigrateLegacy	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rolloutdeclined.go	failureHolds.skipRoutes	E1+E3	linux:internal/host/restart.go:restartRequestLeg	root-route
    plan14_input_inventory_test.go:424: J4	internal/release/materializeheld.go	materializeHeld	C+E1+E2	linux:internal/release/materializeheld.go:MaterializeHeldUnderWithPins	root-route;kept=C,E1;scope=protected-decision-only E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/host/bootstrap.go	const tmpfilesConf	A+C+G	linux:internal/host/bootstrap.go:bootstrapWith	root-input;kept=A,C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostrelocate/worker.go	Worker.self	C+D	linux:internal/hostrelocate/worker.go:Worker.ConvertLanding	Worker identity requires current active directory enrollment, home-region match and termination-fence check.
    plan14_input_inventory_test.go:424: J4	internal/rootstate/file_other.go	CheckPublicConfig	A+B3	darwin:internal/host/proofnamed.go:proofBindingSource.trustedBytes	fix1;basis=Non-Linux descriptor checks fail closed.
    plan14_input_inventory_test.go:424: J4	internal/host/agent.go	runAdoptWithEnsureSystemUnits	B3+C+D+E1+E2+E3+E4+F	linux:internal/host/agent.go:runAdopt	PROPOSED E45 / R-E45-3: root checks census presence before opening release exclusion; absent census uses main adoption with no release directory or lock. Retained census remains protected with either flag value. PROPOSED E45: root enforces census-gated release ordering, bounded acquisition and scoped recovery; registry timer primitives preserve supplied identity but producer integration remains pending.;rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0;basis=passes the same census source to release exclusion and root settings to preserve the no-census branch
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_creation.go	RootHistory.ConsumeCreation	E1	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.startRecorded	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_startup.go	verifyRootMigrationFloors	F+G	linux:internal/host/rootmigration_startup.go:verifyRootMigrationStartup	rev3=PROPOSED-p3;identity=root claim controller construction uid 0;basis=checks installed and guard signed binaries against both locally retained protocol bounds without remote access
    plan14_input_inventory_test.go:424: J4	internal/host/rootfloor_healthy.go	type rootFloorHealthy	F	linux:internal/host/rootfloor_healthy.go:rootMovesFloors.healthy	rev3=PROPOSED-p3;identity=root system apply/adopt health or floor decision uid 0; recovery readers uid 0;basis=binds a root health observation to deployment, box, enrollment and signed binary identity
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/transaction.go	type heldTransaction	D+F	linux:internal/rootparticipation/transaction.go:TransactionLedger	rev3=PROPOSED-p3;identity=root system apply/recover uid 0;basis=binds transaction reuse to a root-opened ledger and live callback lifetime
    plan14_input_inventory_test.go:424: J4	internal/host/claimmoveparks.go	refusingClaimMoveWake	C+G	linux:internal/host/claimassembly.go:ClaimAssembly.Build	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalservice.go	NewJournalService	C	linux:internal/host/claimconstruction.go:OpenProductionClaimAssembly	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/proofnamed.go	proofBindingSource.trustedBytes	B3	linux:internal/host/proofnamed.go:proofBindingSource.record	rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=captures persistent evidence from the checked root-owned unit file descriptor alongside its bytes
    plan14_input_inventory_test.go:424: J4	internal/rootstate/link_linux.go	directory.readLink	A+E1	linux:internal/rootstate/link_linux.go:ReadTrustedLink	Pins the symlink inode with O_PATH and checks owner/type/link count before readlinkat. Fixture: TestPlan14TrustedLiveLink.
    plan14_input_inventory_test.go:424: J4	internal/host/namedrecovery.go	type namedUnitRecovery	E1	linux:internal/host/namedrecovery.go:productionNamedUnitRecovery	E13: signed recovery allows unknown history but preserves usable refusals, including retained originals; verified later promotion clears only D1. Health recording is independent of program recording; minting requires a census. Fixtures: TestPlan14RecoveryUnknownHistory, TestPlan14RecoveryKnownRefusal, TestPlan14RecoveryOriginalRefusalWithUnknownHistory, TestPlan14RootHistoryVerifiedRetryBeforeAttempt, TestPlan14ProgramFailureStillRecordsHealth, TestPlan14RootHistoryMintCensus.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_parked.go	generationRetirementRecords	E2	linux:internal/host/rootgeneration_parked.go:generationReadRetirements	E38: reconcile completed root retirement against the retained stop receipt and exact inventory; inspect parked identities, require retired rows absent or an independently inventoried successor, and retain generation pins. Fixtures: TestPlan14GenerationParkedPayload, TestPlan14GenerationParkedCrash, TestPlan14GenerationParkedKeepsReservation, TestPlan14GenerationParkedReadback; TestPlan14GenerationParkedRootRunner is runner-pending. Timer producer matches retained entries once and preserves successors on replay: TestPlan14GenerationTimerRetirement. No claims-off path changes.
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloor_linux.go	movesDir.removedDuringOpen	F	linux:internal/host/movesfloor_linux.go:movesDir.lockNamed	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostguard/record_unix.go	openDirectory	C	linux:internal/hostguard/flock_unix.go:acquire	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/healthy_root.go	rootHealthyStore	B+B4	linux:internal/release/healthy_root.go:recordRootHealthy	fix1;basis=Normalizes the no-account operator app to the existing ops namespace before opening the root-owned public history.
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_kernel_linux.go	scanStopCgroupsMode	C+G	linux:internal/host/claimstop_kernel_linux.go:LinuxStopKernel.RecoverStopped	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/rootstate/persistent.go	PersistentIdentity.Same	A+E2	linux:internal/hostbox/inventory_identity.go:VerifyInventoryFile	rev3=PROPOSED-p3;run=8;identity=root generation verification uid 0;basis=device and mount numbers are exact only within one boot; cross-boot equality requires persistent evidence and unchanged attachment topology;rev3=PROPOSED-p3;run=8;identity=root generation verification uid 0;basis=device and mount numbers are exact only within one boot; cross-boot equality requires persistent evidence and unchanged attachment topology
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	type passConfig	E2+E3	linux:internal/release/adopt.go:BakeDir	E19: both destructive readers use the root reservation snapshot under existing release exclusion. Exact artifact and containing-tree identities are retained; missing completeness refuses destruction. Production installation/launch/kernel completeness and verified retirement remain unfinished. Fixtures: TestPlan14GenerationDeletionCannotUnpin, TestPlan14GenerationSnapshotCompleteness, TestPlan14GenerationSnapshotPermitsUnreservedRestage, TestPlan14GenerationSnapshotPinsContainingTree, TestPlan14GenerationSnapshotEmptyIsUnknown, TestPlan14GenerationConsumerMode, TestPlan14GenerationProductionModeGate, TestPlan14GenerationSnapshotPermitsFreshTree.;rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0; legacy agent pass uid carlos;basis=stores the typed census-only root update provider and per-pass resolved input authority
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.decidePrev	F	linux:internal/host/systemapply.go:systemApplier.install	root-input;kept=F;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerations.go	generationKey	E2	linux:internal/release/rootgenerationpins.go:RootGenerations.Reservations	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/reconcile_adapter.go	ReconcileAdapter.Install	C	linux:internal/hostbox/reconcile_adapter.go:ReconcileAdapter.Configure	Reconcile adapter binds record and routes landing mint through root registration while preserving existing typed ownership paths.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_boot.go	withRootFloorGuardCandidate	F	linux:internal/host/guardexec.go:RunSystemGuardExec	rev3=PROPOSED-p3;identity=carlos system guard-exec apply/recover, systemd root units uid 0;basis=release then previous-binary exclusion; participation check precedes moves and seeds locks; certified current remains executor fallback
    plan14_input_inventory_test.go:424: J4	internal/host/claimcleanup_identity.go	verifyClaimCleanupEnrollment	C+G	linux:internal/host/claimproduction.go:ProductionClaimOwnerProvider.OpenClaimOwners	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/rollout/failures.go	OpenFailureBook	E1+E3	linux:internal/host/updatesroot.go:updatesPassOption	fix1-merge-review;basis=Loads schema-three durable generations and refuses unsafe identity recovery on entropy failure.
    plan14_input_inventory_test.go:424: J4	internal/host/rootrollback.go	settleRollbackAttempt	B3+E1	linux:internal/host/rootrestart.go:rollbackUnitRestart	Independent signed recovery authority and retained attempt outcomes. Fixtures: TestPlan14SignedRestartWithoutHealthHistory, TestPlan14CapturedRollbackWithoutHealthHistory, TestPlan14IndependentRecoveryRetainsMintBarrier, TestPlan14ActiveRecoveryProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory.go	recordRootProgram	E1	linux:internal/host/agent.go:runAdoptUnderRootRelease	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/units/carlos-system-recover.service	external	F	linux:internal/host/bootstrap.go:var unitsFS	rev3=PROPOSED-p3;identity=systemd update/recover oneshot shell uid 0;basis=guard branch is conditional on executable presence; unarmed units retain main selector; installed guard selects from root local floor
    plan14_input_inventory_test.go:424: J4	internal/host/recoveryrefusals.go	rootRestartChecks.retainRecoveryHistory	E1	linux:internal/host/recoveryrefusals.go:rootRestartChecks.mintRefusals	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/release/materializeheld.go	MaterializeHeldUnderWithPins	E2	linux:internal/host/movesheldrelease_root.go:movesHeldReleaseRoot.publishRelease	E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/inventory_identity.go	VerifyInventoryPath	C+E2+G	linux:internal/host/claimroleassembly_linux.go:ClaimRoleAssembly.Launch	rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=opens the checked inventory path and delegates strict retained persistent identity verification
    plan14_input_inventory_test.go:424: J4	internal/hostguard/rootview.go	RootAuthority.Installation	E2	linux:internal/host/rootinstallation.go:rootInstallationHostApp	E20: read the atomic root installation under the existing host exclusion without recursive lock acquisition; retain fresh claim, canonical record, signed artifact and final reservation checks. Fixtures: TestPlan14GenerationLaunchDoesNotReenterRootLock, TestPlan14GenerationLaunchRefusals, TestPlan14RootDispatchRejectsRegistryMutation.
    plan14_input_inventory_test.go:424: J4	internal/host/claimmoveaccess.go	claimMoveReadAccess.Launch	C+G	linux:internal/host/moveswakesource.go:movesReadLaunch	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/restart.go	seedRestartMarks	E1+E3	linux:internal/host/restart.go:restartSeed	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationcompleteness.go	GenerationEvidence.valid	E2	linux:internal/release/rootgenerationcompleteness.go:RootGenerations.Certify	E23: versioned generation completeness binds exact reservations to independently supplied installation, launch and kernel evidence. Reservation mutations invalidate before commit; every destructive read reconciles again and retries sync. Production reconciliation remains unavailable. Fixtures: TestPlan14GenerationCompleteness, TestPlan14GenerationCompletenessInvalidation, TestPlan14GenerationCompletenessDurability, TestPlan14GenerationCompletenessCertificateSyncFailure, TestPlan14GenerationCompletenessPinConsumer, TestPlan14GenerationCompletenessProcessCrash; TestPlan14GenerationCompletenessCheckedRootStore passed on the E25 root runner.
    plan14_input_inventory_test.go:424: J4	internal/rootstate/authorityfile_linux.go	openAuthorityFile	E2	linux:internal/rootstate/authorityfile_linux.go:OpenAuthorityFile	E33: census-only generation journal reads accept private root-owned ancestry without chmod or repair. Every ancestor remains descriptor-checked, root-owned and non-writable by group/other; leaves remain single-link regular root-owned files, checked for DB/WAL/SHM. Public-file callers remain unchanged. Fixtures: TestPlan14AuthorityFilePrivateAncestors, TestPlan14AuthorityFileAbsoluteBoundary; TestPlan14GenerationPrivateJournalRootRunner and TestPlan14GenerationRequiredArtifactsRootRunner are runner-pending. Pre-flight 76, 78, 82 and 89.
    plan14_input_inventory_test.go:424: J4	internal/host/rootseedsfloor.go	readRootSeedsBinary	F	linux:internal/host/rootseedsfloor.go:rootSeedsAllowsBinary	rev3=PROPOSED-p3;identity=carlos adopt seeds judgement and root system apply/recover candidate checks, uid 0;basis=delegates checked signed executable read then selects seeds protocol
    plan14_input_inventory_test.go:424: J4	internal/hostguard/rootmigration.go	migrationDenied	C+G	linux:internal/hostguard/rootmigration.go:RootAuthority.CompleteMigrationInventory	rev3=PROPOSED-p3;identity=carlos instance-control, root control service uid 0; denial views also consumed by carlos agent uid carlos;basis=old sessions at/below retained captured stamp refuse root and agent admission
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationpins.go	passConfig.generationWriteCheck	E2	linux:internal/release/adopt.go:PassFilter	E19: both destructive readers use the root reservation snapshot under existing release exclusion. Exact artifact and containing-tree identities are retained; missing completeness refuses destruction. Production installation/launch/kernel completeness and verified retirement remain unfinished. Fixtures: TestPlan14GenerationDeletionCannotUnpin, TestPlan14GenerationSnapshotCompleteness, TestPlan14GenerationSnapshotPermitsUnreservedRestage, TestPlan14GenerationSnapshotPinsContainingTree, TestPlan14GenerationSnapshotEmptyIsUnknown, TestPlan14GenerationConsumerMode, TestPlan14GenerationProductionModeGate, TestPlan14GenerationSnapshotPermitsFreshTree.
    plan14_input_inventory_test.go:424: J4	internal/release/rollback.go	rollbackGroup	B3+E1+E3	linux:internal/release/adopt.go:adoptHost	root-route;kept=B3,E1,E3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/activator/rolelaunch_root_linux.go	RoleLaunch.startIsolated	C	linux:internal/activator/rolelaunch_linux.go:RoleLaunch.Start	root installation and fence authority; registration and recovery; agent RPC lock ordering
    plan14_input_inventory_test.go:424: J4	internal/host/claimmoveaccess.go	claimMoveReadAccess.bind	C+G	linux:internal/host/claimassembly.go:ClaimAssembly.Build	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootrecovery_rebind.go	ClaimRootHTTP.rebindRecoveryInventory	C	linux:internal/host/rootinventory.go:ClaimRootHTTP.recoverRootInventory	Retain fresh claim and inventory checks and refuse a box listed Lost.
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/disk.go	Disk.WithParticipation	D	linux:internal/host/systemapply.go:systemApplier.runWithRelease	Claims-on or retained root census uses root exclusion; claims-off with no census preserves main participation and recovery behavior. PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner.
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_run.go	RunInstanceControl	C+D+G	linux:main.go:main	Refuse premature claim activation and continue serving recovery after per-host startup failures. PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner. PROPOSED E45: root enforces census-gated release ordering, bounded acquisition and scoped recovery; registry timer primitives preserve supplied identity but producer integration remains pending.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgenerations_launch.go	type rootGenerationSource	E2+E3	linux:internal/host/claimlaunch_root.go:type ClaimLaunchRoot	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=binds production runtime authority and persistent file capture to the root launch source
    plan14_input_inventory_test.go:424: J4	internal/host/claimowners.go	ClaimOwnerDispatch.Select	C+G	linux:internal/host/claimconstruction.go:OpenProductionClaimAssembly	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/rootstate/file_linux.go	CheckPublicConfig	A+B3	linux:internal/host/proofnamed.go:proofBindingSource.trustedBytes	fix1;basis=Checks root:root ownership, exact 0644 mode and single-link regular-file identity on the already opened operator configuration descriptor.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_status.go	RootHistory.ProjectMigrationStatus	E1	linux:internal/host/roothistory_maintenance.go:rootHistoryMaintenance.run	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	enrolled	E1	linux:internal/historyreadback/workflow.go:Operation.Deliver	E17: operator saves exact signed authorization and challenge before delivery, resumes without renewal, and verifies enrolled-root exact completion. Existing proof branches are unchanged. Tests: TestPlan14HistoryOperatorWorkflow, TestPlan14HistoryOperatorConflicts, TestPlan14HistoryOperatorExactCompletion, TestPlan14HistoryWorkflowProcessCrash, TestPlan14HistoryCommandResume, TestPlan14HistorySavedFiles, TestPlan14HistoryCLIDispatch.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_source.go	rootProtocolLegacy	F	linux:internal/host/rootmovesfloor_source.go:rootFloorLegacy	rev3=PROPOSED-p3;identity=carlos adopt and system apply refresh, uid 0; no recovery or boot-selector call;basis=bounded agent-writable JSON and line mirrors contribute only increasing denies; neither can establish accepted state
    plan14_input_inventory_test.go:424: J4	internal/host/claimready_linux.go	claimProbeSocketReady	B3	linux:internal/host/claimconstruction.go:claimGroupDWiring	root-route;kept=B3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/restartscope.go	restartScopeLeg	E1+E3	linux:internal/host/restart.go:restartPass	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/restartscope.go	scopedHosts	E1+E3	linux:internal/host/restartscope.go:bounceScopedRoutes	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/rolloutdeclined.go	failureHolds.gate	E1+E3	linux:internal/host/rolloutdeclined.go:honourDeclinedFailures	root-route
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalmigration_linux.go	lockJournalMigration	C	linux:internal/hostbox/journalmigration_linux.go:JournalService.MigrateLegacy	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_requirements.go	productionGenerationCreation	E2	linux:internal/host/rootgeneration_inventory.go:readProductionGenerationInventory	E34: census-only generation completeness requires E1 root creation evidence for an empty installation without retained predecessors. The exact host/account/app/installation must remain fresh on both sides of kernel inspection. Existing predecessor obligations remain mandatory. Production root history uses checked private ancestry and recommits before granting freshness, so read or sync failure refuses. Pre-flight 20, 33, 79 and 80. Fixtures: TestPlan14GenerationEmptyInstallationRequiresCreation, TestPlan14GenerationCreationFromRegistration, TestPlan14GenerationRequiredArtifacts; production checked-path TestPlan14GenerationRequiredArtifactsRootRunner remains runner-pending. No new history initialization or claims-off call.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_production_other.go	migrateRootClaimAuthority	G	darwin:internal/host/claimjournal_migration.go:migrateClaimJournalsWith	rev3=PROPOSED-p3;identity=non-Linux offline journal-migrate CLI;basis=unsupported-platform stub returns ErrUnsupported without reading or granting migration authority
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/disk.go	Disk.withParticipation	D+F	linux:internal/hostfloor/disk.go:Disk.WithParticipation	rev3=PROPOSED-p3;identity=root system apply/recover or root participation caller uid 0;basis=uses a live root-minted scoped ledger only for its original store; otherwise opens the ordinary census; absent census keeps legacy behavior
    plan14_input_inventory_test.go:424: J4	internal/caps/caps.go	Set.UnmarshalJSON	E4	linux:cli.go:readCapabilities	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/movespass.go	armMovesPass	B+C	linux:internal/host/agent.go:runAgent	Agent moves construction passes registration client and existing guarded publication and park providers.
    plan14_input_inventory_test.go:424: J4	internal/host/claimparticipation.go	productionClaimLocal.participateHost	D	linux:internal/host/claimparticipation.go:productionClaimLocal.participate	Production selects the broker client; the old local controller path is selected only by explicit legacy test fixtures.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/empty_census.go	EmptyInstallationCensus.CheckRootRegisteredRow	C	linux:internal/host/rootinventory.go:ClaimRootHTTP.commitRootInventoryPending	Crash census exception admits only the row named by root pending registration; all other census checks remain required.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_outcomes.go	historyRecoveryKey	E1	linux:internal/release/roothistory_outcomes.go:RootHistory.RetainRecovery	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_timers.go	rootMigrationTimers.adopt	G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=offline migration root uid 0;basis=offline migration binds the exact observed pre-claim registrations to root retained stop evidence and denies; durable intention precedes conditional registry adoption and root inventory completion
    plan14_input_inventory_test.go:424: J4	internal/host/rootupdates_runtime.go	rootUpdateSource.beginRuntime	E3	linux:internal/host/rootupdates.go:rootUpdateSource.resolve	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=persists a root intent before effects; independently records failures or readiness plus exact process revalidation and request completion
    plan14_input_inventory_test.go:424: J4	internal/hostguard/record_unix.go	recordDir.write	C	linux:internal/hostguard/root.go:Guard.AbandonRootInventory	root installation/fence backend and lock-free agent projection; establishment blocked; draft incomplete
    plan14_input_inventory_test.go:424: J4	internal/host/claimparticipation_stale.go	productionClaimLocal.clearUntracked	D	linux:internal/host/claimparticipation.go:productionClaimLocal.prepareLegacyWith	Untracked participation cleanup now carries exact controller binding into retirement before stale-state clearing.
    plan14_input_inventory_test.go:424: J4	internal/release/materializeheld.go	verifyHeldLive	B2+C+E1	linux:internal/release/materializeheld.go:VerifyHeldLive	Live held verification consumes the configured root proof gate and verifies pinned bytes under the same held lock.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalmigration_linux.go	copyLegacyJournal	C	linux:internal/hostbox/journalmigration_linux.go:readLegacyJournals	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_status.go	RootHistory.MigrationStatus	E1	linux:internal/release/roothistory_status.go:RootHistory.MigrationStatusWithSources	Exact completion binds the accepted authorization digest from durable private history to enrolled-root signed readback. Pending originals, changed evidence and canonical sources cannot supply retirement completion. Fixtures: TestPlan14HistoryReconstructionCompletion, TestPlan14HistoryRetirementCompletion, TestPlan14ReadReconstructionCompletion, TestPlan14ReadRetirementCompletion, TestPlan14RecoveryRetirementProductionCallback, TestPlan14RootHistoryReconstructionCrash, TestPlan14HistoryRetirementProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_requirements.go	type generationRecord	E2	linux:internal/host/rootgeneration_inventory.go:type generationInventory	E30: derive route and ordinary-instance state-container requirements from schema- and shape-validated canonical deployment records bound to retained installation incarnation; include record contents and ETag in both source reads and the certificate digest. Missing, mismatched, omitted or changed evidence refuses without retiring pins. Fixtures: TestPlan14GenerationRequiredArtifacts, TestPlan14GenerationProductionModeGate. Production fixed-path witness TestPlan14GenerationRequiredArtifactsRootRunner is runner-pending. Timer classes, parked artifacts, positive empty-installation evidence and running-tenant containment remain incomplete.
    plan14_input_inventory_test.go:424: J4	internal/host/restart.go	dispatchBoundedWakes	E1+E3	linux:internal/host/restart.go:cycleWorkers	root-route
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	adoptHost	B3+E1+E2+E3+E4	linux:internal/release/adopt.go:PassFilter	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers. E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.;rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0; legacy agent pass uid carlos;basis=applies root settings to canonically resolved routes including named units while legacy settings eligibility remains unchanged
    plan14_input_inventory_test.go:424: J4	internal/release/refusal.go	ReadRefusal	E1+E3	linux:internal/host/buildstate.go:buildStates.heldWakeInput	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/claimparticipation.go	productionClaimLocal.prepareLegacyWith	D	linux:internal/host/rootexecution_client.go:productionClaimLocal.prepareWith	Production selects the broker client; the old local controller path is selected only by explicit legacy test fixtures.
    plan14_input_inventory_test.go:424: J4	internal/host/claimjournal_migration_linux.go	quiesceLegacyClaimJournals	C+G	linux:internal/host/claimjournal_migration.go:migrateClaimJournalsWith	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart.go	rootRestartChecks.live	B3+E1	linux:internal/host/roothistory_recovery.go:linkRootHistory	Signed named-unit recovery is independent of release and health history. Root rechecks canonical source, unit, process, signed target and trusted live pointer; captures attempt authority before publication; verifies readiness and resumes without repeated effects. Fixtures: TestPlan14SignedActiveFixIgnoresHistory, TestPlan14SignedActiveFixAuthority, TestPlan14SignedFixSupersedesOlderAttempt, TestPlan14ActiveRecoveryProcessCrash, TestPlan14SignedRestartWithoutHealthHistory, TestPlan14CapturedRollbackWithoutHealthHistory, TestPlan14SignedRestartRequiresTrustedLiveLink.
    plan14_input_inventory_test.go:424: J4	internal/activator/backend_exec.go	ExecBackend.spawnInCgroupGated	E2	linux:internal/activator/backend_exec.go:ExecBackend.StartWorkerStaged	E40: claim-enabled raw backend refuses unsupported direct, placed and legacy-control launches before spawn. Claims-off body unchanged. TestPlan14GenerationBackendDirectBoundary, TestPlan14GenerationBackendControlBoundary, TestPlan14GenerationBackendAuxiliaryBoundary; each guard has an independent behavioral mutation. Agent-side refusal is not root reservation or containment evidence.
    plan14_input_inventory_test.go:424: J4	internal/host/claimparticipation_stale.go	participationCleanupRead.Read	D	linux:internal/host/rootinstallation.go:rootInstallationHostApp	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/proofroot.go	proofRoot.stillLive	B3	linux:internal/host/proofroot.go:proofRoot.mintAndLog	route-and-input
    plan14_input_inventory_test.go:424: J4	internal/host/unitsettle.go	systemdUnits.Exe	B3	linux:internal/host/unitsettle.go:settleUnit	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/materializeheld.go	heldShape	C+E1	linux:internal/release/materializeheld.go:VerifyHeldLive	root-route;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostexec/rootbroker.go	RootBroker.retry	D	linux:internal/hostexec/rootbroker.go:RootBroker.Execute	Bound transport retries by original monotonic slack and context; never extend a permit.
    plan14_input_inventory_test.go:424: J4	internal/host/rootseedsfloor.go	judgeRootSeedsPrev	F	linux:internal/host/rootseedsfloor.go:rootRefreshAndJudgeSeedsPrev	rev3=PROPOSED-p3;identity=carlos adopt and system apply refresh, uid 0; no recovery or boot-selector call;basis=evaluates signed current and prev seeds support under shared durable floor judge and independent downgrade completeness
    plan14_input_inventory_test.go:424: J4	internal/host/movesstage.go	heldReleaseReady	C+E1	linux:internal/host/movesstage.go:heldReleaseHooksVia	root-route;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/reconcile.go	Reconciler.holdOnly	C	linux:internal/hostbox/reconcile.go:Reconciler.installWithWork	Hold-only write rechecks claim, record and source inventory under local lock without root RPC there.
    plan14_input_inventory_test.go:424: J4	internal/host/relocatepass.go	RelocationRuntime.finishCompletion	C+D	linux:internal/host/relocatepass.go:RelocationRuntime.once	Completion dispatch requires authoritative completed operation and current executor before discharge.
    plan14_input_inventory_test.go:424: J4	internal/host/proofroot.go	proofRoot.around	B3+B4	linux:internal/host/agent.go:runAdoptUnderRootRelease	Continue minting observations for unaffected routes even when adoption reports a route error.
    plan14_input_inventory_test.go:424: J4	internal/release/materializeheld.go	materializeHeldChecked	E2	linux:internal/release/materializeheld.go:serveHeldStageRequest	E23: old held-stage relay forwards the root generation source before artifact writes and outside publication exclusion. Request fields retain their prior hint/authorization checks; only root pins authorize destructive staging on census boxes. No-census source yields empty pins. Fixtures: TestPlan14GenerationLegacyRelay, TestHeldStagePassIsANoOpWithoutRequests, TestHeldStagePassDropsAnUnauthorizedBuild, TestServeHeldStageRequestsRefusesStaleAndTraversal. Production source wiring is inspected; privileged completeness is not claimed.
    plan14_input_inventory_test.go:424: J4	internal/host/rootseedsfloor.go	rootSeedsAllowsBinary	F	linux:internal/host/rootmovesfloor_boot.go:withRootFloorGuardCandidate	rev3=PROPOSED-p3;identity=root adopt refresh, root system update/recovery and root guard floor readers, uid 0;basis=compares signed seeds protocol to published root bound only while a certified current, prev or staged candidate meets it; no remote reads
    plan14_input_inventory_test.go:424: J4	internal/console/apirestartscope.go	restartRouteRows	E1+E3	linux:internal/console/apirestartscope.go:Server.handleAPIRestartScope	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/claimmoveparks.go	openProductionClaimMoveWake	C+G	linux:internal/host/claimproduction.go:ProductionClaimOwnerProvider.OpenClaimOwners	Moves owner construction wraps every bucket request in bound identity check and preserves wake refusal.
    plan14_input_inventory_test.go:424: J4	internal/host/restart.go	restartPass	E1+E3	linux:internal/host/agent.go:runAdoptUnderRootRelease	root-route
    plan14_input_inventory_test.go:424: J4	internal/instancectl/server.go	runWithClaim	C+D+G	linux:internal/instancectl/claim.go:RunWithClaim	Claim instance controller adds held-release RPC dispatch within existing launch/participation execution boundary.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_retirement.go	generationRetirement.retireAll	E2	linux:internal/host/rootgeneration_retirement.go:productionRetireGenerations	E25: validate installation, controller, exact unit and process before retaining an active or prelaunch pin. Only closed writers plus a settled unit reach durable retirement and independent kernel absence. Use the checked read-only journal and continue past active pins. Fixtures: TestPlan14GenerationRetirementKeepsActivePin, TestPlan14GenerationRetirementKeepsPrelaunchPin, TestPlan14GenerationRetirementContinuesPastActivePin, TestPlan14GenerationRetirementBindingProcessCrash, TestPlan14GenerationRetirementCensusGate. Running-tenant completeness remains unfinished.
    plan14_input_inventory_test.go:424: J4	internal/console/apirestartscope.go	resolveRestartScope	E1+E3	linux:internal/console/apirestartscope.go:Server.handleAPIRestartScope	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.restoreFiles	F	linux:internal/host/systemapply.go:systemApplier.recoverIfNeeded	rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=selects signed prev identity and checks staged restore against both root bounds before rename; version sidecar cannot authorize
    plan14_input_inventory_test.go:424: J4	internal/host/rootexecution_recovery.go	recoverRootExecution	D	linux:internal/host/guardtransaction.go:var recoverPendingControllers	Claims-on or retained root census uses root exclusion; claims-off with no census preserves main participation and recovery behavior.
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart.go	rootRestartChecks.runningVersion	B3	linux:internal/host/agent.go:runAdoptUnderRootRelease	rev3=merge-ruling-6;basis=Without a census return no running build, so main's cur stays the rollback target and no record is resolved; census-backed retention unchanged.
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	repairSibling	E2	linux:internal/release/adopt.go:stageFrom	E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/host/claimproduction.go	productionClaimRegional.Authorize	C+G	linux:internal/host/claimproduction.go:ProductionClaimOwnerProvider.OpenClaimOwners	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/proofask.go	mintAsker.tick	B3	linux:internal/host/agent.go:fastConvergeLoop	route-and-input;kept=B3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_creation.go	RootHistory.RecordCreation	E1	linux:internal/host/rootinventory.go:ClaimRootHTTP.commitRootInventoryPending	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationcompleteness.go	generationDigest	E2	linux:internal/release/rootgenerationcompleteness.go:RootGenerations.Certify	E23: versioned generation completeness binds exact reservations to independently supplied installation, launch and kernel evidence. Reservation mutations invalidate before commit; every destructive read reconciles again and retries sync. Production reconciliation remains unavailable. Fixtures: TestPlan14GenerationCompleteness, TestPlan14GenerationCompletenessInvalidation, TestPlan14GenerationCompletenessDurability, TestPlan14GenerationCompletenessCertificateSyncFailure, TestPlan14GenerationCompletenessPinConsumer, TestPlan14GenerationCompletenessProcessCrash; TestPlan14GenerationCompletenessCheckedRootStore passed on the E25 root runner.
    plan14_input_inventory_test.go:424: J4	internal/host/claimparticipation_completed.go	ClaimAssembly.completedRelocationDischarge	C+D	linux:internal/host/claimparticipation.go:productionClaimLocal.cleanup	Completed-relocation discharge requires exact claim completion and verified retirement receipt; unread evidence refuses cleanup.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_inventory.go	productionLocalGenerationInventory	E2	linux:internal/host/rootlaunchverifier.go:registerProductionLaunchVerifier	PROPOSED E46: root participation/recovery reads retained root census, fences, inventory and kernel evidence; no deployment-store network dependency. SQL remains deny-only.
    plan14_input_inventory_test.go:424: J4	internal/host/prooffile.go	sameProofFiles	B3	linux:internal/host/proofbinding.go:proofBindingSource.binding	rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=compares retained and current proof files using persistent evidence, refusing an implicit upgrade of old unproven files
    plan14_input_inventory_test.go:424: J4	internal/host/movesinstall.go	installRun.local_	C+G	linux:internal/host/movesinstall.go:installGeneration	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/coldhandover.go	writeColdJournal	C	linux:internal/hostbox/coldhandover.go:ColdHandover.Run	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_retirement.go	RootHistory.RetireRecovery	E1	linux:internal/release/roothistory_delivery.go:RootHistory.ReceiveRecoveryRetirements	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart_requests.go	type rootRestartRequests	E1	linux:internal/host/rootrestart_requests.go:productionRestartRequestPass	E15: census-only root unit-restart consumption uses retained installations, canonical records, exact requests, invocation evidence and admission after durable intent under release exclusion. No-census effects use the original consumer. Fixtures: TestPlan14RootRestartProductionConsumption, TestPlan14RootRestartProductionHeldRollover, TestPlan14RootRestartProductionAdmissionAfterIntent, TestPlan14RootRestartProductionUnknown, TestPlan14RootRestartProductionSyncFailure, TestPlan14RootRestartProductionCrash, TestPlan14RootRestartRequestCensusGate.
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/production.go	Open	D	linux:internal/rootparticipation/production.go:OpenForUpdate	Claims-on or retained root census uses root exclusion; claims-off with no census preserves main participation and recovery behavior. PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner.
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory_readback.go	publishRootHistoryReadback	E1	linux:internal/host/roothistory.go:openRootHistory	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	productionGenerationAbsence	E2	linux:internal/host/rootgeneration_retirement.go:productionRetireGenerations	E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/typedpark_linux.go	TypedParker.verifyDestination	C	linux:internal/hostbox/typedpark_linux.go:TypedParker.Park	rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=checks parked artifact replay using persistent evidence under descriptor-held ancestry
    plan14_input_inventory_test.go:424: J4	internal/host/legacyrestart.go	legacyCheckedUnitRestart	B3	linux:internal/host/rootrestart.go:rootRestartRouteWith	rev3=merge-ruling-6;basis=Restore main stamped-unit restart and D1 settle, including diagnostics; only clock, readiness and health-hook adapters differ.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_pass.go	RootHistoryPass.begin	E1	linux:internal/release/adopt.go:adoptHost	Root history intent is linked to captured canonical rollback authority before live effects; verified recovery settles only its exact intent. Fixtures: TestPlan14HistoryRollbackLink, TestPlan14HistoryRecoveryRefusesChanges, TestPlan14HistoryRecoveryProcessCrash, TestPlan14HistorySettlementRetriesVisibleSync. E1 migration and restart consumption remain incomplete.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor.go	rootMovesFloors.persist	F	linux:internal/host/rootmovesfloor.go:rootMovesFloors.refresh	rev3=PROPOSED-p3;identity=carlos system apply/recover and root adopt, systemd root units or offline CLI, uid 0;basis=writes quarantine before selector and deny ratchet, then accepted state, then synced public acknowledgement
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor.go	rootMovesFloors.projection	F	linux:internal/host/rootmovesfloor_boot.go:rootFloorPrevVerdict	rev3=PROPOSED-p3;identity=carlos system apply/recover and root adopt, systemd root units or offline CLI, uid 0;basis=matches public acceptance to private generation, identity and retained componentwise maximum
    plan14_input_inventory_test.go:424: J4	internal/host/proofnamed.go	proofBindingSource.record	B3	linux:internal/host/rootroute.go:proofBindingSource.needsRestart	rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=binds named-unit provenance to boot-stable file evidence and preserves the original no-census hash shape
    plan14_input_inventory_test.go:424: J4	internal/host/rolloutdeclined.go	failureHolds.pass	E1+E3	linux:internal/host/rolloutdeclined.go:failureHolds.pointerLoop	fix1-merge-review;basis=Saves the failure book before processing pointer retries; preserves signed retry and restriction checks.
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.Run	D+F	linux:internal/host/systemapply.go:systemApplier.runWithRelease	root-input;kept=D,F;scope=protected-decision-only PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner. PROPOSED E45: root enforces census-gated release ordering, bounded acquisition and scoped recovery; registry timer primitives preserve supplied identity but producer integration remains pending. PROPOSED E45: root enforces census-gated release ordering, bounded acquisition and scoped recovery; registry timer primitives preserve supplied identity but producer integration remains pending.
    plan14_input_inventory_test.go:424: J4	internal/host/units/carlos-stage.service	external	B3+C+D+E1	linux:internal/host/bootstrap.go:var unitsFS	root-input;kept=B3,C,D,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimproduction.go	ProductionClaimOwnerProvider.OpenClaimOwners	C+G	linux:internal/host/claimconstruction.go:OpenProductionClaimAssembly	Production owner factory wires bounded C8 and relocation providers and closes partial construction on error.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/restore.go	writeGeneration	C	linux:internal/hostbox/restore.go:ColdRestore.Install	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_pass.go	RootHistoryPass.resolve	E1	linux:internal/release/roothistory_pass.go:RootHistoryPass.selectRoute	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers.
    plan14_input_inventory_test.go:424: J4	internal/host/rootseedsfloor.go	rootFloorBinary.forSeeds	F	linux:internal/host/rootmovesfloor_boot.go:withRootFloorGuardCandidate	rev3=PROPOSED-p3;identity=carlos system apply/recover and root adopt uid 0;basis=projects signed SeedsProtocol (zero when absent); comparisons are gated by verified signed publication and available certified builds
    plan14_input_inventory_test.go:424: J4	internal/host/rootseedsfloor.go	systemApplier.seedsActivationRefusal	F	linux:internal/host/systemapply.go:systemApplier.activationRule	rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=refuses activation below selected local seeds release bound; missing unknown history grants no acceptance projection
    plan14_input_inventory_test.go:424: J4	internal/host/units/carlos-system-update.path	external	F	linux:internal/host/bootstrap.go:var unitsFS	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostbox/typedretire.go	writeJournal	C	linux:internal/hostbox/typedretire.go:TypedRetirement.Run	root-input
    plan14_input_inventory_test.go:424: J4	internal/rootstate/state_other.go	EnsurePublicDir	A+B4	darwin:internal/host/rootrestart.go:productionRootRestartChecks	fix1;basis=Non-Linux shared-directory setup fails closed.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	type RestartTarget	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.consume	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/proofbinding.go	proofBindingSource.binding	B3	linux:internal/host/proofbinding.go:proofBindingSource.forHost	rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=compares retained rollback files by persistent evidence rather than old-boot device numbers
    plan14_input_inventory_test.go:424: J4	internal/host/rootinventory_requirements.go	ClaimRootHTTP.verifyInventoryTimers	E2	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	E37: retain independently initialized state-directory and timer requirements in the root installation transaction; preserve them through crash/reopen and rebind. Unknown history cannot certify completeness. Recommit under root-host exclusion before generation use. Canonical record and root retained obligations constrain agent candidate lists; timer enumeration is deny-only. Pre-flight 33, 80, 83. Fixtures: TestPlan14GenerationRequiredArtifacts, TestPlan14GenerationRegistryRows, TestPlan14RootTimerInventory, TestPlan14InventoryRequirementsRegistration, TestPlan14InventoryRequirementsUnknownAndRatchet, TestPlan14InventoryArtifactsCrash, TestPlan14InventoryRequirementsHistoryIdentity. Changed RequiredArtifacts and ExactRetirement root-runner witnesses await acceptance; remaining E2 launch/parked/containment integration is incomplete.
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/migration.go	Ledger.MigrationCensus	G	linux:internal/host/rootmigration.go:rootMigration.run	rev3=PROPOSED-p3;identity=carlos system journal-migrate offline uid 0;basis=under participation transaction exclusion, preserves completed census revisions, refuses foreign pending state, and revokes failed completion
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationcompleteness.go	RootGenerations.invalidateCompleteness	E2	linux:internal/release/rootgenerationcompleteness.go:RootGenerations.Certify	E23: versioned generation completeness binds exact reservations to independently supplied installation, launch and kernel evidence. Reservation mutations invalidate before commit; every destructive read reconciles again and retries sync. Production reconciliation remains unavailable. Fixtures: TestPlan14GenerationCompleteness, TestPlan14GenerationCompletenessInvalidation, TestPlan14GenerationCompletenessDurability, TestPlan14GenerationCompletenessCertificateSyncFailure, TestPlan14GenerationCompletenessPinConsumer, TestPlan14GenerationCompletenessProcessCrash; TestPlan14GenerationCompletenessCheckedRootStore passed on the E25 root runner.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_refresh.go	rootFloorDowngradeIdle	D+E2+F	linux:internal/host/rootmovesfloor_boot.go:withRootFloorGuardCandidate	rev3=PROPOSED-p3;identity=root adopt, guard boot selector and system apply/recover uid 0;basis=uses E network-free retained generation obligations and kernel census under participation before floor; borrowed transaction matches the original root store; no deployment provider read
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/transaction.go	type transactionKey	D+F	linux:internal/rootparticipation/transaction.go:TransactionLedger	rev3=PROPOSED-p3;identity=root system apply/recover uid 0;basis=unexported key prevents callers from forging the held participation scope
    plan14_input_inventory_test.go:424: J4	internal/host/rootupdates_runtime.go	rootUpdateSource.publishRetry	E3	linux:internal/host/rootupdates.go:rootUpdateSource.resolve	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=projects the root book identity and epoch and includes a mirror acknowledgement only after the root denial is durably cleared
    plan14_input_inventory_test.go:424: J4	internal/hostbox/typedpark_linux.go	sameArtifactAt	C+E2+G	linux:internal/hostbox/typedpark_linux.go:TypedParker.Park	rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=verifies retained typed artifacts through descriptor-relative opens and persistent identity before any retirement effect
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationcompleteness.go	RootGenerations.writeCompleteness	E2	linux:internal/release/rootgenerationcompleteness.go:RootGenerations.Certify	E23: versioned generation completeness binds exact reservations to independently supplied installation, launch and kernel evidence. Reservation mutations invalidate before commit; every destructive read reconciles again and retries sync. Production reconciliation remains unavailable. Fixtures: TestPlan14GenerationCompleteness, TestPlan14GenerationCompletenessInvalidation, TestPlan14GenerationCompletenessDurability, TestPlan14GenerationCompletenessCertificateSyncFailure, TestPlan14GenerationCompletenessPinConsumer, TestPlan14GenerationCompletenessProcessCrash; TestPlan14GenerationCompletenessCheckedRootStore passed on the E25 root runner.
    plan14_input_inventory_test.go:424: J4	internal/host/claimhandover_crossbox.go	claimCrossBoxHandover.After	C+G	linux:internal/host/claimhandover_crossbox.go:wireClaimAdmission	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimroleassembly_linux.go	verifiedClaimExecutable	C+G	linux:internal/host/claimroleassembly_linux.go:ClaimRoleAssembly.Launch	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/relocationreleases.go	ReleaseObligation.Complete	C	linux:internal/host/relocationeffects.go:RelocationEffects.Release	Release obligation completion reads fresh claim before verifying and recording root stop receipt.
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory_launch.go	ClaimLaunchRoot.rootInstalledProgram	E1	linux:internal/host/claimlaunch_production.go:WithProductionClaimLaunch	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/generationinventory.go	RootAuthority.GenerationInstallations	E2	linux:internal/host/rootgeneration_inventory.go:generationInventoryAt	E37: retain independently initialized state-directory and timer requirements in the root installation transaction; preserve them through crash/reopen and rebind. Unknown history cannot certify completeness. Recommit under root-host exclusion before generation use. Canonical record and root retained obligations constrain agent candidate lists; timer enumeration is deny-only. Pre-flight 33, 80, 83. Fixtures: TestPlan14GenerationRequiredArtifacts, TestPlan14GenerationRegistryRows, TestPlan14RootTimerInventory, TestPlan14InventoryRequirementsRegistration, TestPlan14InventoryRequirementsUnknownAndRatchet, TestPlan14InventoryArtifactsCrash, TestPlan14InventoryRequirementsHistoryIdentity. Changed RequiredArtifacts and ExactRetirement root-runner witnesses await acceptance; remaining E2 launch/parked/containment integration is incomplete.
    plan14_input_inventory_test.go:424: J4	internal/host/rootexecution_read.go	readRootExecution	D	linux:internal/host/rootexecution_read.go:rootExecutionRead	Descriptor-checked root opener shared by root Prepare/Check, initial launch authorization and final executable checks; no agent fallback.
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory.go	boundRootHistory	E1	linux:internal/host/roothistory.go:openRootHistory	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/release/buildstate.go	Consumed.ForeignTo	E3	linux:internal/host/buildstate.go:buildStates.beforeExec	ForeignTo binds consumed decisions to account/app before root release history can be reused.
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	buildStates.heldWakeInput	E3	linux:internal/host/buildstate.go:buildStates.beforeExec	Held wake reads tenant-bound consumed decisions, refusal ledger and installed release; no downgrade to diagnostic.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_recovery_policy.go	RootHistory.recoveryDenials	E1	linux:internal/release/roothistory.go:RootHistory.Blocks	E13: signed recovery allows unknown history but preserves usable refusals, including retained originals; verified later promotion clears only D1. Health recording is independent of program recording; minting requires a census. Fixtures: TestPlan14RecoveryUnknownHistory, TestPlan14RecoveryKnownRefusal, TestPlan14RecoveryOriginalRefusalWithUnknownHistory, TestPlan14RootHistoryVerifiedRetryBeforeAttempt, TestPlan14ProgramFailureStillRecordsHealth, TestPlan14RootHistoryMintCensus.
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory_creation.go	rootHistoryInstallation	E2	linux:internal/host/rootgeneration_inventory.go:generationReconciler.reconcile	E37: retain independently initialized state-directory and timer requirements in the root installation transaction; preserve them through crash/reopen and rebind. Unknown history cannot certify completeness. Recommit under root-host exclusion before generation use. Canonical record and root retained obligations constrain agent candidate lists; timer enumeration is deny-only. Pre-flight 33, 80, 83. Fixtures: TestPlan14GenerationRequiredArtifacts, TestPlan14GenerationRegistryRows, TestPlan14RootTimerInventory, TestPlan14InventoryRequirementsRegistration, TestPlan14InventoryRequirementsUnknownAndRatchet, TestPlan14InventoryArtifactsCrash, TestPlan14InventoryRequirementsHistoryIdentity. Changed RequiredArtifacts and ExactRetirement root-runner witnesses await acceptance; remaining E2 launch/parked/containment integration is incomplete.
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/begun.go	ReadBegun	F	linux:internal/host/guardtransaction.go:systemApplier.guardFinished	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/claimhandover_crossbox.go	wireClaimAdmission	C+D	linux:internal/host/claimhandover_crossbox.go:wireProductionAdmission	Admission constructor adds completed-relocation recovery owners while retaining typed root recovery rebind.
    plan14_input_inventory_test.go:424: J4	internal/host/claimrecoveryjournal.go	claimRecoveryJournal.successor	C+G	linux:internal/host/claimrecoveryjournal.go:claimCrossBoxHandover.completeRecovery	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/inventory_identity.go	OpenInventoryFile	C+E2+G	linux:internal/hostbox/inventory_identity.go:VerifyInventoryPath	rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=opens inventory paths through no-follow checked directory and file descriptors for persistent identity verification
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloorgate.go	floorGateMain	F	linux:internal/host/movesfloorgate.go:RunSystemFloorAllowsPrev	rev3=PROPOSED-p3;identity=carlos system apply/recover and root adopt, systemd root units or offline CLI, uid 0;basis=dispatches explicit root previous gate; legacy argument shape preserved
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_production.go	NewProductionClaimStopHandler	C+G	linux:internal/host/claimassembly.go:NewProductionRootClaimStop	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloor_linux.go	movesDir.names	F	linux:internal/host/movesfloor_linux.go:movesDir.lockNamed	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostbox/inventoryscope.go	ReconcileAdapter.retirementRoute	C	linux:internal/hostbox/reconcile_adapter.go:ReconcileAdapter.Retire	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	keepsBuildState	E3	linux:internal/host/buildstate.go:buildStates.wakeTarget	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/claimhandover_recovery.go	claimCrossBoxHandover.rebindRecoveryRows	C+G	linux:internal/host/claimhandover_recovery.go:claimCrossBoxHandover.installRecoveryInventory	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_inventory.go	generationReconciler.reconcile	E2	linux:internal/host/rootgenerationpins.go:productionRootGenerationPins	E38: reconcile completed root retirement against the retained stop receipt and exact inventory; inspect parked identities, require retired rows absent or an independently inventoried successor, and retain generation pins. Fixtures: TestPlan14GenerationParkedPayload, TestPlan14GenerationParkedCrash, TestPlan14GenerationParkedKeepsReservation, TestPlan14GenerationParkedReadback; TestPlan14GenerationParkedRootRunner is runner-pending. Timer producer matches retained entries once and preserves successors on replay: TestPlan14GenerationTimerRetirement. No claims-off path changes. PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner. PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening. PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/rootview.go	RootAuthority.viewLocked	C+G	linux:internal/hostguard/rootview.go:RootAuthority.Installation	rev3=PROPOSED-p3;identity=carlos instance-control, root control service uid 0; denial views also consumed by carlos agent uid carlos;basis=projects root migration denials together with canonical installation and existing fences
    plan14_input_inventory_test.go:424: J4	internal/host/agent.go	runAgent	B+C+D+F	linux:internal/host/agent.go:RunAgent	rev3=census-ruling-seeded-instances;basis=the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): main's body with wireSeedPlacement called in the activator start's Configure step, before armMovesPass, and the startup sweep's result stored for the import rollback in Recover; read sites unchanged, offsets moved; main's B,C,D,F authority retained PROPOSED E46: captured claim selection and root journal mutation; root RPC outside service host exclusion; SQL/route data never grants root authority. Executing identity: service controller; root for inventory/retirement callbacks.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory.go	RootHistory.readRecord	E1	linux:internal/release/roothistory.go:RootHistory.read	Root reconstruction reads exact durable records and preserves pending restrictions during signed replacement. Fixtures: TestPlan14ReconstructionReplacement, TestPlan14ReconstructionReplacementCrash.
    plan14_input_inventory_test.go:424: J4	history_cli.go	historyCommandWithSave	E1	linux:history_cli.go:historyCommand	E17: operator saves exact signed authorization and challenge before delivery, resumes without renewal, and verifies enrolled-root exact completion. Existing proof branches are unchanged. Tests: TestPlan14HistoryOperatorWorkflow, TestPlan14HistoryOperatorConflicts, TestPlan14HistoryOperatorExactCompletion, TestPlan14HistoryWorkflowProcessCrash, TestPlan14HistoryCommandResume, TestPlan14HistorySavedFiles, TestPlan14HistoryCLIDispatch.
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/ledger.go	Ledger.Idle	D+F	linux:internal/host/rootmovesfloor_refresh.go:rootFloorDowngradeIdle	rev3=PROPOSED-p3;identity=root system apply/recover or root participation caller uid 0;basis=checks settled execution and local launch completeness under participation; nested activation uses only its already-held store
    plan14_input_inventory_test.go:424: J4	internal/host/rootgenerationpins.go	generationPinSource.StagedPins	E2	linux:internal/release/adopt.go:PassFilter	E24: independent root installation and launch enumeration, exact reservation reconciliation and fresh quiescent whole-version-tree kernel census; missing sources, open unreserved launches, foreign namespaces and uncontained tasks refuse. Production pin source certifies this evidence before returning pins. Fixtures: TestPlan14GenerationInventoryCompleteness, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationInventoryLifecycle, TestPlan14GenerationInventoryProcessCrash, TestPlan14GenerationKernelCensusUnknownReference, TestPlan14GenerationLaunchInventory, TestPlan14GenerationReaderDoesNotInitialize, TestPlan14GenerationInstallationInventory. Checked production source/kernel witnesses passed on the E27 root runner. E29 physical-payload and installed-unit witnesses passed on the controller runner; E30 required-artifact witness pending.
    plan14_input_inventory_test.go:424: J4	internal/console/apirestartscope.go	routeWithHost	E1+E3	linux:internal/console/apirestartscope.go:resolveRestartScope	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/systemparticipation.go	systemApplier.clearUpdateBegun	D	linux:internal/host/systemparticipation.go:systemApplier.settleUpdateBegun	Claims-on or retained root census uses root exclusion; claims-off with no census preserves main participation and recovery behavior. PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner.
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_kernel_linux.go	linuxClaimLaunchKernel.Observe	C+G	linux:internal/host/roothistory_launch.go:ClaimLaunchRoot.rootInstalledProgram	root-input;kept=C,G;scope=protected-decision-only PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloor.go	withPrevLock	F	linux:internal/host/rootmovesfloor_boot.go:withRootFloorGuardCandidate	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostbox/wakepolicy.go	relocationProbe	C	linux:internal/hostbox/wakepolicy.go:Policy.check	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart.go	checkedUnitRestart	B3+E1	linux:internal/host/rootrestart.go:rootRestartRouteWith	Signed named-unit recovery is independent of release and health history. Root rechecks canonical source, unit, process, signed target and trusted live pointer; captures attempt authority before publication; verifies readiness and resumes without repeated effects. Fixtures: TestPlan14SignedActiveFixIgnoresHistory, TestPlan14SignedActiveFixAuthority, TestPlan14SignedFixSupersedesOlderAttempt, TestPlan14ActiveRecoveryProcessCrash, TestPlan14SignedRestartWithoutHealthHistory, TestPlan14CapturedRollbackWithoutHealthHistory, TestPlan14SignedRestartRequiresTrustedLiveLink.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/empty_census.go	censusRule.check	C	linux:internal/hostbox/empty_census.go:EmptyInstallationCensus.checkLocal	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostguard/coldhandover.go	Guard.AbandonColdHandover	C	linux:internal/hostbox/coldhandover.go:ColdHandover.Recover	Fresh successor claim permits abandonment; retire barrier stamp and retain predecessor receipt.
    plan14_input_inventory_test.go:424: J4	internal/host/unitsettle.go	systemdUnits.StartTime	B3	linux:internal/host/proofobserve.go:proofObserver.observe	kept=B3;scope=canonical-binding-and-readiness;implementation-incomplete
    plan14_input_inventory_test.go:424: J4	internal/host/legacyrestart.go	legacyRootRestart	B3+G	linux:internal/host/roothistory_creation.go:productionCreationHistory	E9 merge ruling 6: E effects require a census; no-census recovery delegates to main or records evidence only. Fixtures: TestPlan14ERecoveryNoCensus, TestPlan14ERecoveryNoCensusResume, TestR2ERecoveryFlagWithoutCensus, TestPlan14ERecoveryRestartOutcome. Census-backed recovery retains captured authority and outcome precedence.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgenerations_launch.go	generationLaunchPermit.started	E2	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.launchLocked	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals. PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/host/restart.go	bounceExecRoutes	E1+E3	linux:internal/host/restart.go:restartRequestLeg	root-route
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_delivery.go	HistoryRecoveryRetirementKey	E1	linux:internal/historyreadback/workflow.go:Operation.Deliver	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/versionsweep.go	sweepStagedVersionsPass	E2	linux:internal/host/agent.go:runAdoptUnderRootRelease	E19: both destructive readers use the root reservation snapshot under existing release exclusion. Exact artifact and containing-tree identities are retained; missing completeness refuses destruction. Production installation/launch/kernel completeness and verified retirement remain unfinished. Fixtures: TestPlan14GenerationDeletionCannotUnpin, TestPlan14GenerationSnapshotCompleteness, TestPlan14GenerationSnapshotPermitsUnreservedRestage, TestPlan14GenerationSnapshotPinsContainingTree, TestPlan14GenerationSnapshotEmptyIsUnknown, TestPlan14GenerationConsumerMode, TestPlan14GenerationProductionModeGate, TestPlan14GenerationSnapshotPermitsFreshTree.
    plan14_input_inventory_test.go:424: J4	internal/host/legacyrestart.go	legacySettleOptions	B3	linux:internal/host/legacyrestart.go:legacyRollbackRestart	rev3=merge-ruling-4;basis=Legacy settle uses main readiness inputs and limits; these do not authorize root health history.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_refresh.go	rootFloorBinary.supports	F	linux:internal/host/guardarm.go:RunSystemGuardArm	rev3=PROPOSED-p3;identity=root apply/recover/adopt units uid 0 and agent edges publisher carlos-edge.service uid carlos;basis=signed digest/release are required; protocol minimum applies only when a retained floor exists, preserving unknown-history permission
    plan14_input_inventory_test.go:424: J4	internal/rootstate/state_linux.go	directory.Sync	A+F+G	linux:internal/rootstate/state.go:Sync	rev3=PROPOSED-p3;identity=checked filesystem callers including root control/apply/migration uid 0;basis=rechecks private descriptor identity then fsyncs directory durability
    plan14_input_inventory_test.go:424: J4	internal/hostexec/local_unix.go	localDir.read	D	linux:internal/hostexec/rootmirror.go:ProjectRootClient	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	CapabilityRoute	E4	linux:internal/host/adopt_advice.go:adviseHostRoleGateMissing	root-route;kept=E4;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/caps_pass.go	stagedManifestOfLiveVersion	E4	linux:internal/host/agent.go:runAgent	root-route
    plan14_input_inventory_test.go:424: J4	internal/hostclaim/relocation.go	requireReceiptOfInstallation	C	linux:internal/hostclaim/relocation.go:RecordLocalInstall	Receipt guard binds target, enrollment, install stamp and digest and refuses remaking opened prepared generation.
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloor.go	rootJudgePrevWithSource	F	linux:internal/host/movesfloor.go:rootJudgePrev	rev3=PROPOSED-p3;identity=carlos adopt root pass, uid 0;basis=normal adopt path refreshes and judges both independent protocol floors only on census boxes
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/report.go	Disk.Running	F	linux:internal/console/hostreports.go:Server.localHostReport	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_outcomes.go	type HistoryRecovery	E1	linux:internal/host/roothistory_recovery.go:rootRestartChecks.settleHistory	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	rootRestartRecord.advance	E1	linux:internal/release/rootrestart_history.go:RootRestarts.Finish	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootstop_reboot_linux.go	LinuxStopKernel.rebootStopFiles	C	linux:internal/host/claimstop_kernel_linux.go:LinuxStopKernel.recoverAfterReboot	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=maps old journal descriptor devices only through root-retained filesystem and directory-handle evidence; ambiguous or unknown filesystems refuse, and the resulting inode set only adds denies
    plan14_input_inventory_test.go:424: J4	internal/hostbox/restore.go	readGeneration	C	linux:internal/hostbox/restore.go:ColdRestore.Install	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/caps_pass.go	capabilityPass	E4	linux:internal/host/agent.go:runAdoptUnderRootRelease	root-route
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalservice.go	journalPrepare	C	linux:internal/hostbox/journalservice.go:journalCall	root installation and fence authority; registration and recovery; agent RPC lock ordering
    plan14_input_inventory_test.go:424: J4	internal/hostbox/launchjournal.go	OpenLaunchJournal	C	linux:internal/host/claimjournal_migration.go:var openClaimRootJournal	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/materializeheld.go	serveHeldStageRequest	E2	linux:internal/release/materializeheld.go:ServeHeldStageRequestsWithPins	E23: old held-stage relay forwards the root generation source before artifact writes and outside publication exclusion. Request fields retain their prior hint/authorization checks; only root pins authorize destructive staging on census boxes. No-census source yields empty pins. Fixtures: TestPlan14GenerationLegacyRelay, TestHeldStagePassIsANoOpWithoutRequests, TestHeldStagePassDropsAnUnauthorizedBuild, TestServeHeldStageRequestsRefusesStaleAndTraversal. Production source wiring is inspected; privileged completeness is not claimed.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_reconstruct.go	RootHistory.Reconstruct	E1	linux:internal/release/roothistory_delivery.go:RootHistory.ReceiveReconstruction	Signed replacement binds the exact pending digest and current sources/revisions; old intended refusals and hold bounds remain restrictive. Fixtures: TestPlan14ReconstructionReplacement, TestPlan14ReconstructionReplacementCrash.
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	Respond	E1	linux:internal/host/roothistory_readback.go:historyReadbackPublisher.publish	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/guardroster.go	readGuardRoster	F	linux:internal/host/guardarm.go:RunSystemGuardArm	root-input;kept=F;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/transaction.go	Ledger.WithTransaction	D+F	linux:internal/host/systemapply.go:systemApplier.activationGuard	rev3=PROPOSED-p3;identity=root system apply/recover uid 0;basis=takes participation before the effective floor and registry; releases on every return and invalidates the scoped token
    plan14_input_inventory_test.go:424: J4	internal/host/claimhandover_crossbox.go	claimCrossBoxHandover.sourceEvidence	C+G	linux:internal/host/claimhandover_crossbox.go:claimCrossBoxHandover.After	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootrecovery_rebind.go	ClaimRootHTTP.serveRecoveryRebind	C	linux:internal/host/claimretire_transport.go:ClaimRootHTTP.ServeHTTP	root installation and fence authority; recovery rebind and timer identity
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	ReadStatus	E1	linux:internal/historyreadback/workflow.go:Operation.Read	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/release/ratchet.go	DigestRatchet.marked	E1	linux:internal/release/ratchet.go:DigestRatchet.Admit	root-input;kept=E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/movespass.go	movesWorker.hostBlocked	C	linux:internal/host/movesfinal.go:movesWorker.sweepFinalJournals	root-input;kept=C;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory_recovery.go	rootRestartChecks.settleHistory	B3+E1	linux:internal/host/rootrestart.go:rollbackUnitRestart	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_pass.go	type RootHistoryPass	B3+E1	linux:internal/host/agent.go:runAdoptUnderRootRelease	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerations.go	type GenerationBinding	E2	linux:internal/host/rootgenerations_launch.go:type rootGenerationSource	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals. PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.;rev3=PROPOSED-p3;run=8;identity=root generation journal uid 0;basis=additive persistent executable and tree fields preserve historical device and inode records
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationKernel.boot	E2	linux:internal/host/rootgeneration_census_linux.go:generationKernel.census	E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance.
    plan14_input_inventory_test.go:424: J4	internal/host/rootlaunchverifier.go	registerProductionLaunchVerifier	E2	linux:internal/host/claimstop_run.go:RunInstanceControl	PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner. PROPOSED E46: local root installation obligations, exact root intention and inventory revision; service SQL is a deny-only consistency check. Executing identity: root instance-control or root participation/update.
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_kernel_linux.go	stopIdentity	C+G	linux:internal/host/claimstop_kernel_linux.go:scanStopCgroupsMode	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/rootstate/link_linux.go	ReadTrustedLink	A+E1	linux:internal/host/namedrecovery.go:productionNamedUnitRecovery	Checks the full root-owned parent chain before descriptor-based live-link reading. Fixture: TestPlan14TrustedLiveLink; privileged acceptance remains required.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerations.go	GenerationBinding.valid	E2	linux:internal/release/rootgenerations.go:RootGenerations.Read	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals. PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/generationpayload.go	LaunchJournal.GenerationPayloads	E2	linux:internal/host/rootgeneration_inventory.go:generationInventoryAt	E26: checked read-only payload enumeration includes inventory and revision orphans; completeness binds current and retained predecessor inventories, exact current revision and both source reads. Fixtures: TestPlan14GenerationPayloadCompleteness, TestPlan14GenerationPayloadRetainedPredecessor, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationPayloadInventory, TestPlan14GenerationPayloadReaderDoesNotInitialize. Checked root reader acceptance passed at E27; running-tenant containment remains unfinished.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/retirement_timers.go	retirementWithTimers	C+E2	linux:internal/hostbox/reconcile_adapter.go:ReconcileAdapter.Retire	E38: reconcile completed root retirement against the retained stop receipt and exact inventory; inspect parked identities, require retired rows absent or an independently inventoried successor, and retain generation pins. Fixtures: TestPlan14GenerationParkedPayload, TestPlan14GenerationParkedCrash, TestPlan14GenerationParkedKeepsReservation, TestPlan14GenerationParkedReadback; TestPlan14GenerationParkedRootRunner is runner-pending. Timer producer matches retained entries once and preserves successors on replay: TestPlan14GenerationTimerRetirement. No claims-off path changes. PROPOSED E44: root timer intention must precede materialization; exact registration and row identity required; root retirement cannot infer ownership from registry enumeration. Tests: TestPlan14TimerIntentionBeforeMaterialization, TestPlan14GenerationTimerRetirement; root timer intention, sync-failure retry and retirement acceptance. Scheduler producer wiring remains incomplete.
    plan14_input_inventory_test.go:424: J4	internal/host/proofbinding.go	proofBindingSource.rollback	B3	linux:internal/host/rootrestart.go:productionRootRestartChecks	canonical record/unit/executable authority and one-attempt rollback; draft incomplete
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_parked.go	generationPhysicalPayloads	E2	linux:internal/host/rootgeneration_inventory.go:generationReconciler.reconcile	E38: reconcile completed root retirement against the retained stop receipt and exact inventory; inspect parked identities, require retired rows absent or an independently inventoried successor, and retain generation pins. Fixtures: TestPlan14GenerationParkedPayload, TestPlan14GenerationParkedCrash, TestPlan14GenerationParkedKeepsReservation, TestPlan14GenerationParkedReadback; TestPlan14GenerationParkedRootRunner is runner-pending. Timer producer matches retained entries once and preserves successors on replay: TestPlan14GenerationTimerRetirement. No claims-off path changes. PROPOSED E46: Root rejects unfinished live inventory but accepts intended timer entries only behind exact completed retirement.
    plan14_input_inventory_test.go:424: J4	internal/host/seedsfloor.go	systemApplier.armSeedsFloor	F	linux:internal/host/systemapply.go:systemApplier.armFloor	rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=normal apply refreshes root seeds history on census participants; nonparticipants retain legacy sync; never called by recovery or boot
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_kernel_linux.go	linuxClaimLaunchKernel.Verify	C+G	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.startRecorded	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/pins.go	BuildStateKept	E2	linux:internal/release/pins.go:SettingsRefs	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/movesheldrelease_production.go	WithProductionMovesHeldRelease	B2+C+E1+E2	linux:internal/host/claimstop_run.go:RunInstanceControl	Root held-release constructor requires root guard and private release store, authenticates peer and reads root health history. E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/hostclaim/relocation.go	install	C	linux:internal/hostclaim/relocation.go:ToInstalling	Install transition allocates authoritative stamp and pinned release, records target before effects and removes prior local receipt.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory.go	RootHistory.Refusals	E1	linux:internal/release/roothistory_app.go:RootHistory.MintRefusals	E1 retains independently recorded outcomes in private history before minting/reconstruction. Failure bits never clear by replay, ambiguous attempts remain restrictive, and signed reconstruction cannot erase them. Fixtures: TestPlan14IndependentRecoveryRetainsMintBarrier, TestPlan14IndependentRecoveryRecordsHistory, TestPlan14HistoryRetainsRecoveryOutcomes, TestPlan14HistoryRecoveryCannotWeaken, TestPlan14HistoryReconstructionKeepsRecovery, TestPlan14HistoryRecoveryProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_retirement.go	validHistoryRetirement	E1	linux:internal/release/roothistory_retirement.go:RootHistory.RetireRecovery	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationcompleteness.go	type GenerationCompleteness	E2	linux:internal/release/rootgenerationcompleteness.go:RootGenerations.Certify	E23: versioned generation completeness binds exact reservations to independently supplied installation, launch and kernel evidence. Reservation mutations invalidate before commit; every destructive read reconciles again and retries sync. Production reconciliation remains unavailable. Fixtures: TestPlan14GenerationCompleteness, TestPlan14GenerationCompletenessInvalidation, TestPlan14GenerationCompletenessDurability, TestPlan14GenerationCompletenessCertificateSyncFailure, TestPlan14GenerationCompletenessPinConsumer, TestPlan14GenerationCompletenessProcessCrash; TestPlan14GenerationCompletenessCheckedRootStore passed on the E25 root runner.
    plan14_input_inventory_test.go:424: J4	internal/rootstate/authorityfile_linux.go	OpenAuthorityFile	E2	linux:internal/host/rootmovesfloor_boot.go:rootFloorJournalPresent	E33: census-only generation journal reads accept private root-owned ancestry without chmod or repair. Every ancestor remains descriptor-checked, root-owned and non-writable by group/other; leaves remain single-link regular root-owned files, checked for DB/WAL/SHM. Public-file callers remain unchanged. Fixtures: TestPlan14AuthorityFilePrivateAncestors, TestPlan14AuthorityFileAbsoluteBoundary; TestPlan14GenerationPrivateJournalRootRunner and TestPlan14GenerationRequiredArtifactsRootRunner are runner-pending. Pre-flight 76, 78, 82 and 89.
    plan14_input_inventory_test.go:424: J4	internal/host/rootexecution_runtime.go	newClaimExecutionRuntime	D	linux:internal/host/claimassembly.go:NewProductionRootClaimStop	Positive claim or fence mismatches are terminal; transport failures retain bounded retry eligibility. PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/rootrebind.go	Guard.RebindRootInventory	E2	linux:internal/host/rootrecovery_rebind.go:ClaimRootHTTP.rebindRecoveryInventory	E37: retain independently initialized state-directory and timer requirements in the root installation transaction; preserve them through crash/reopen and rebind. Unknown history cannot certify completeness. Recommit under root-host exclusion before generation use. Canonical record and root retained obligations constrain agent candidate lists; timer enumeration is deny-only. Pre-flight 33, 80, 83. Fixtures: TestPlan14GenerationRequiredArtifacts, TestPlan14GenerationRegistryRows, TestPlan14RootTimerInventory, TestPlan14InventoryRequirementsRegistration, TestPlan14InventoryRequirementsUnknownAndRatchet, TestPlan14InventoryArtifactsCrash, TestPlan14InventoryRequirementsHistoryIdentity. Changed RequiredArtifacts and ExactRetirement root-runner witnesses await acceptance; remaining E2 launch/parked/containment integration is incomplete.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/guard.go	Guard.locked	C	linux:internal/hostguard/fence.go:Guard.CompleteFence	rev3=merge-ruling-4;basis=Only positively unsafe legacy locks durably quarantine; timeout and I/O errors return without changing root installation state.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration.go	rootMigrationSnapshot.preflight	G	linux:internal/host/rootmigration_startup.go:verifyRootMigrationState	rev3=PROPOSED-p3;identity=carlos system journal-migrate, offline operator CLI, uid 0;basis=refuses active moves, unfinished seeds, incomplete inventories or mismatched migration identity before effects
    plan14_input_inventory_test.go:424: J4	internal/rollout/rootfailures.go	OpenRootFailures	E3	linux:internal/host/rootupdates.go:productionRootUpdates	rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0;basis=requires exact root migration marker and durable book; rewrites visible state before exposing any retry or failure permission
    plan14_input_inventory_test.go:424: J4	internal/host/restart.go	restartEligible	E1+E3	linux:internal/host/rollout.go:feedRestarts	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/relocationflush.go	ReleasePositionsFile.Recorded	C	linux:internal/host/relocationeffects.go:RelocationEffects.flushStopped	Release-position candidate is bound to exact stop request and process identity before receipt construction; unrelated replication positions remain legacy payload.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	RootRestarts.read	E1	linux:internal/release/rootrestart_history.go:RootRestarts.Bindings	E14 restart journal: exact canonical request/target snapshot, durable before-invocation intent, no ambiguous replay, explicit completeness and completion. Component only; production target/dispatch wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartPendingSurvivesRollover, TestPlan14RootRestartAmbiguousDoesNotReplay, TestPlan14RootRestartVisibleSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_root.go	ClaimLaunchRoot.startRecorded	E1+E2+E3	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.start	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=persists the root failure intent before launch and independently revalidates readiness and the exact unit invocation before served/request completion
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_kernel_linux.go	scanRebootCgroups	C+G	linux:internal/host/rootmigration_collect_linux.go:migrationStopKernel.RecoverStopped	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/namedrecovery.go	namedUnitRecovery.checkHistory	E1	linux:internal/host/namedrecovery_active.go:namedUnitRecovery.recover	E13: signed recovery allows unknown history but preserves usable refusals, including retained originals; verified later promotion clears only D1. Health recording is independent of program recording; minting requires a census. Fixtures: TestPlan14RecoveryUnknownHistory, TestPlan14RecoveryKnownRefusal, TestPlan14RecoveryOriginalRefusalWithUnknownHistory, TestPlan14RootHistoryVerifiedRetryBeforeAttempt, TestPlan14ProgramFailureStillRecordsHealth, TestPlan14RootHistoryMintCensus.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor.go	rootMovesFloors.localBound	F	linux:internal/host/rootmovesfloor_boot.go:withRootFloorGuardCandidate	rev3=PROPOSED-p3;identity=carlos system apply/recover and root adopt, systemd root units or offline CLI, uid 0;basis=retains every readable independent deny; missing or corrupt history adds no invented refusal or acceptance
    plan14_input_inventory_test.go:424: J4	internal/host/claimwakestop.go	ClaimAssembly.collectRetirementStop	C+G	linux:internal/host/claimassembly.go:ClaimAssembly.Build	route-and-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloor.go	rootJudgePrev	F	linux:internal/host/agent.go:runAdoptUnderRootRelease	rev3=PROPOSED-p3;identity=carlos adopt root pass, root unit uid 0;basis=normal adopt combines moves and seeds verdict errors; unpublished seeds remain inert; raised bounds never block recording signed prev
    plan14_input_inventory_test.go:424: J4	internal/host/rolloutdeclined.go	failureHolds.heldRoute	E1+E3	linux:internal/host/rolloutdeclined.go:failureHolds.skipRoutes	root-route
    plan14_input_inventory_test.go:424: J4	internal/hostbox/reconcile.go	Reconciler.installWithWork	C	linux:internal/hostbox/inventory_registration.go:ReconcileAdapter.installRemote	Install dispatch preserves serving registration and distinguishes hold-only relocation from installation.
    plan14_input_inventory_test.go:424: J4	internal/host/movesstage.go	heldReleaseProbeRelease	C+E1	linux:internal/host/moveswakesource.go:movesWakeSources.Open	root-route;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerations.go	GenerationProcess.valid	E2	linux:internal/release/rootgenerations.go:validGeneration	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals. PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationpins.go	stageGenerationSibling	E2	linux:internal/release/adopt.go:backfillManifestDigest	E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/rollout/failures.go	FailureBook.saveLocked	E3	linux:internal/rollout/rootfailures.go:RootFailures.ImportLegacy	rev3=PROPOSED-p3;run=8;identity=root adoption uid 0 or legacy rollout uid carlos;basis=root instance uses checked store writer; legacy instances retain the original atomic file writer and epoch semantics
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_delivery.go	RootHistory.ReceiveReconstruction	E1	linux:internal/host/roothistory_maintenance.go:rootHistoryMaintenance.run	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/caps/render.go	RenderService	E4	linux:internal/caps/converge.go:Converge	root-input
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/ledger.go	Ledger.BeginUpdateWith	D	linux:internal/hostfloor/disk.go:Disk.Begin	rev3=PROPOSED-p3;identity=root system apply/recover and root participation callers uid 0;basis=retains existing census authority and same-ledger transaction exclusion; nested activation journal completion reuses live root-held context; Root census and transaction lock exclude acquisition and update; interrupted intents clear only after positive launch completeness.
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	validScope	E1	linux:internal/historyreadback/readback.go:enrolled	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_containment_linux.go	generationContainedStatus	E2	linux:internal/host/rootgeneration_containment_linux.go:generationKernel.containedTask	PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration.go	rootMigration.run	G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=carlos system journal-migrate offline uid 0;basis=offline guarded migration reobserves changed claims, retains union of session tuples, publishes only durable completion and verifies completed replay without rewriting census
    plan14_input_inventory_test.go:424: J4	internal/hostguard/record_unix.go	recordDir.openRecord	C	linux:internal/hostguard/record_unix.go:recordDir.read	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/relocationowners.go	relocationAfterAdmission	C	linux:internal/host/relocationowners.go:RelocationSource.Open	After-admission installation binds local journal bytes to authoritative receipt hash and installed stamp.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_production_linux.go	randomMigrationID	G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=carlos system journal-migrate, offline operator CLI, uid 0;basis=cryptographic nonce identifies newly collected stop evidence, never authorizes a stop
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_kernel_linux.go	linuxClaimLaunchKernel.VerifyDigest	C+G	linux:internal/host/claimlaunch_authority.go:ClaimLaunchRoot.authorize	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	Adoptable	C+E3	linux:internal/host/proofask.go:mintAsker.tick	root-route;kept=C,E3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostrelocate/participant.go	Participant.Sweep	C+D		Sweep reads fresh claim before retiring a participant; absence never manufactures a local discharge.
    plan14_input_inventory_test.go:424: J4	internal/host/rootupdates_runtime.go	rootUpdateReady	E3	linux:internal/host/rootupdates.go:productionRootUpdates	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=probes the canonical deployment endpoint before root records runtime served/request success
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	buildStates.retained	E3	linux:internal/host/buildstate.go:buildStates.heldTarget	root-route
    plan14_input_inventory_test.go:424: J4	internal/hostbox/launchjournal.go	LaunchJournal.Prelaunch	C	linux:internal/host/claimroleassembly_linux.go:ClaimRoleAssembly.Prelaunch	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/movesheldrelease.go	decodeHeldReleaseRequest	C+E1	linux:internal/host/movesheldrelease_root.go:movesHeldReleaseRoot.ServeHTTP	root-input;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/relocationinstall.go	ClaimAssembly.relocationVerifyLocal	C	linux:internal/host/relocationassembly.go:ClaimAssembly.RelocationEffects	Installation verification combines claim-bound receipt, captured stamp, held row and exact prepared files manifest; cannot first-register at installed.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/coldhandover.go	ColdHandover.Recover	C	linux:internal/host/claimretire_transport.go:ClaimRootHTTP.RecoverPending	A provably superseded cold admission can abandon its barrier without discarding its receipt.
    plan14_input_inventory_test.go:424: J4	internal/release/rollback.go	writeGroupRefusals	E1	linux:internal/release/adopt.go:adoptHost	E1 group refusal writer persists root denial before its diagnostic projection; pending attempt remains restrictive.
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	type Request	E1	linux:internal/historyreadback/workflow.go:Operation.Deliver	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_root.go	ClaimLaunchRoot.start	E1+E2	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.Serve	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals.
    plan14_input_inventory_test.go:424: J4	internal/rootstate/state_linux.go	directory.write	A+F+G	linux:internal/rootstate/state_linux.go:directory.Write	rev3=PROPOSED-p3;identity=checked filesystem callers including root control/apply/migration uid 0;basis=rechecks descriptor and uses same validated durable write for production and privileged fault wrapper
    plan14_input_inventory_test.go:424: J4	internal/host/legacyrestart.go	rootRestartChecks.noteLegacy	B3	linux:internal/host/rootrestart.go:rollbackUnitRestart	rev3=merge-ruling-4;basis=Log the no-census legacy restart once through the pass-shared diagnostic latch.
    plan14_input_inventory_test.go:424: J4	internal/release/releaseexclusion.go	type ReleaseExclusion	E2	linux:internal/host/rootlaunchverifier.go:type rootLaunchVerifier	PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner. PROPOSED E45: root enforces census-gated release ordering, bounded acquisition and scoped recovery; registry timer primitives preserve supplied identity but producer integration remains pending.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_containment_linux.go	generationKernel.containedBinding	E2	linux:internal/host/rootgeneration_containment_linux.go:generationKernel.containedTask	PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening. PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening. PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.
    plan14_input_inventory_test.go:424: J4	internal/host/namedrecovery_pass.go	namedUnitRecovery.passOption	B3+E1	linux:internal/host/agent.go:runAdoptUnderRootRelease	Production recovery wrapper preserves main exit status for per-host failures; only remaining named routes can probe the census for history selection. Ordinary routes make no census or binding-store reads. Fixtures: TestPlan14ERecoveryOrdinaryPass, TestPlan14Fix4AdoptPerHostFailureExitsZero, TestPlan14Fix5MainEquivalence.
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/production.go	Ledger.UpdateRequired	D	linux:internal/rootparticipation/production.go:OpenForUpdate	Select root participation when claims are enabled or a census exists; only absent state with claims off selects the legacy protocol.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_inventory.go	generationInstallation	E2	linux:internal/host/rootgeneration_inventory.go:generationReconciler.reconcile	E24: independent root installation and launch enumeration, exact reservation reconciliation and fresh quiescent whole-version-tree kernel census; missing sources, open unreserved launches, foreign namespaces and uncontained tasks refuse. Production pin source certifies this evidence before returning pins. Fixtures: TestPlan14GenerationInventoryCompleteness, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationInventoryLifecycle, TestPlan14GenerationInventoryProcessCrash, TestPlan14GenerationKernelCensusUnknownReference, TestPlan14GenerationLaunchInventory, TestPlan14GenerationReaderDoesNotInitialize, TestPlan14GenerationInstallationInventory. Checked production source/kernel witnesses passed on the E27 root runner. E29 physical-payload and installed-unit witnesses passed on the controller runner; E30 required-artifact witness pending.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalservice.go	JournalService.read	C	linux:internal/hostbox/journalservice.go:JournalService.executeWithInventory	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostguard/writerstop.go	operationWriter	C	linux:internal/hostguard/writerstop.go:LandingWriter	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/proofgate.go	ProofGate.admit	B3	linux:internal/release/adopt.go:adoptHost	root-route;kept=B3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootexecution_authority.go	ClaimRootHTTP.executionAuthority	D	linux:internal/host/rootexecution_migration.go:ClaimRootHTTP.executionAuthorityWithMigration	Fresh claim, deployment binding and root installation authorize participation, including the retained source only.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_inventory.go	type generationInventory	E2	linux:internal/host/rootgeneration_inventory.go:productionLocalGenerationInventory	E38: reconcile completed root retirement against the retained stop receipt and exact inventory; inspect parked identities, require retired rows absent or an independently inventoried successor, and retain generation pins. Fixtures: TestPlan14GenerationParkedPayload, TestPlan14GenerationParkedCrash, TestPlan14GenerationParkedKeepsReservation, TestPlan14GenerationParkedReadback; TestPlan14GenerationParkedRootRunner is runner-pending. Timer producer matches retained entries once and preserves successors on replay: TestPlan14GenerationTimerRetirement. No claims-off path changes.
    plan14_input_inventory_test.go:424: J4	internal/hostexec/rootserving.go	RootBroker.servingView	D	linux:internal/hostexec/rootbroker.go:RootBroker.Execute	Tokenless serving needs completed migration and settled root state; preinstallation grants no privileged effect.
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/ledger.go	Ledger.readCensus	D	linux:internal/rootparticipation/ledger.go:Ledger.Census	Root census and transaction lock exclude acquisition and update; interrupted intents clear only after positive launch completeness.
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory_readback.go	type historyReadbackPublisher	E1	linux:internal/host/roothistory_readback.go:publishRootHistoryReadback	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_source.go	readRootProtocolProjection	F	linux:internal/host/rootmovesfloor_source.go:readRootFloorProjection	rev3=PROPOSED-p3;identity=carlos agent in carlos-edge.service uid carlos;basis=checked public root projection must agree with selector and directory sync before advertising acceptance
    plan14_input_inventory_test.go:424: J4	internal/host/rootfloor_healthy.go	rootMovesFloors.healthy	F	linux:internal/host/rootfloor_healthy.go:rootMovesFloors.capLegacy	rev3=PROPOSED-p3;identity=root health acceptance, normal floor refresh and local seeds-bound readers, uid 0;basis=reads bounded private root health record; missing or malformed record supplies no legacy cap
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_timers.go	type rootMigrationTimerRecord	G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=offline migration root uid 0;basis=retains original stopped inventory, exact observed timer contents and registrations, successor inventory and root revision through interrupted migration
    plan14_input_inventory_test.go:424: J4	internal/rollout/failures.go	newBookID	E1+E3	linux:internal/rollout/failures.go:OpenFailureBook	fix1-merge-review;basis=Uses the named entropy source and propagates failure; retains authority classification despite no scanner-recognized direct read.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgenerationpins.go	type generationPinSource	E2	linux:internal/host/rootgenerationpins.go:productionRootGenerationPins	E24: independent root installation and launch enumeration, exact reservation reconciliation and fresh quiescent whole-version-tree kernel census; missing sources, open unreserved launches, foreign namespaces and uncontained tasks refuse. Production pin source certifies this evidence before returning pins. Fixtures: TestPlan14GenerationInventoryCompleteness, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationInventoryLifecycle, TestPlan14GenerationInventoryProcessCrash, TestPlan14GenerationKernelCensusUnknownReference, TestPlan14GenerationLaunchInventory, TestPlan14GenerationReaderDoesNotInitialize, TestPlan14GenerationInstallationInventory. Checked production source/kernel witnesses passed on the E27 root runner. E29 physical-payload and installed-unit witnesses passed on the controller runner; E30 required-artifact witness pending.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration.go	rootMigration.write	G	linux:internal/host/rootmigration.go:rootMigration.run	rev3=PROPOSED-p3;identity=carlos system journal-migrate, offline operator CLI, uid 0;basis=serializes migration phase records through checked private store durability
    plan14_input_inventory_test.go:424: J4	internal/host/claimunit.go	readClaimUnitSettings	C+E3+G	linux:internal/host/bootstrap.go:bootstrapWith	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=retains exact no-census unit settings; a claims-enabled complete census prepares the root-owned retry directory before the hardened controller starts
    plan14_input_inventory_test.go:424: J4	internal/host/restart.go	cycleWorkers	E1+E3	linux:internal/host/restart.go:restartRequestLeg	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/claimhandover_crossbox.go	relocationBefore	C	linux:internal/host/claimhandover_crossbox.go:wireClaimAdmission	Before-admission dispatch binds relocation executor and probe phase before typed handover.
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	RouteAccount	B3+E3+E4	linux:cli.go:runRoute	root-route;kept=B3,E3,E4;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/heldwake.go	DecideHeldWake	E3	linux:internal/host/buildstate.go:buildStates.beforeExec	root-input;kept=E3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/proofbinding.go	proofBindingSource.unitBinding	B3+E1	linux:internal/host/namedrecovery_active.go:namedUnitRecovery.recover	rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=hashes persistent file identity into the canonical unit binding while preserving exact legacy source hashes without census
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_census_linux.go	generationKernel.census	E2	linux:internal/host/rootgeneration_census_linux.go:productionGenerationKernelCensus	E24: independent root installation and launch enumeration, exact reservation reconciliation and fresh quiescent whole-version-tree kernel census; missing sources, open unreserved launches, foreign namespaces and uncontained tasks refuse. Production pin source certifies this evidence before returning pins. Fixtures: TestPlan14GenerationInventoryCompleteness, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationInventoryLifecycle, TestPlan14GenerationInventoryProcessCrash, TestPlan14GenerationKernelCensusUnknownReference, TestPlan14GenerationLaunchInventory, TestPlan14GenerationReaderDoesNotInitialize, TestPlan14GenerationInstallationInventory. Checked production source/kernel witnesses passed on the E27 root runner. E29 physical-payload and installed-unit witnesses passed on the controller runner; E30 required-artifact witness pending.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalservice.go	JournalService.Replay	C	linux:internal/host/rootinventory.go:ClaimRootHTTP.commitRootInventoryPending	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/disk.go	Disk.Load	F	linux:internal/host/guardexec.go:RunSystemGuardExec	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostguard/guard.go	Guard.With	C	linux:internal/hostbox/work.go:selectedWork.With	Recheck remote root denial immediately before the protected effect.
    plan14_input_inventory_test.go:424: J4	history_cli.go	historySave	E1	linux:history_cli.go:historyCommand	E17: operator saves exact signed authorization and challenge before delivery, resumes without renewal, and verifies enrolled-root exact completion. Existing proof branches are unchanged. Tests: TestPlan14HistoryOperatorWorkflow, TestPlan14HistoryOperatorConflicts, TestPlan14HistoryOperatorExactCompletion, TestPlan14HistoryWorkflowProcessCrash, TestPlan14HistoryCommandResume, TestPlan14HistorySavedFiles, TestPlan14HistoryCLIDispatch.
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_kernel_linux.go	linuxClaimLaunchKernel.tenant	C+G	linux:internal/host/claimlaunch_kernel_linux.go:linuxClaimLaunchKernel.Observe	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/guardtransaction.go	installFloorHook	D	linux:internal/host/systemapply.go:RunSystemApply	Claims-on or retained root census uses root exclusion; claims-off with no census preserves main participation and recovery behavior.
    plan14_input_inventory_test.go:424: J4	internal/host/units/carlos-config-sync.service	external	B3+C+D+E1	linux:internal/host/bootstrap.go:var unitsFS	root-input;kept=B3,C,D,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/typedpark_linux.go	TypedParker.Park	C	linux:internal/hostbox/typedretire.go:TypedRetirement.Run	rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=requires persistent evidence for root-protected retirement and verifies source or replay destination before rename
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	validRootRestart	E1	linux:internal/release/rootrestart_history.go:RootRestarts.Bindings	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationRead	E2	linux:internal/host/rootgeneration_census_linux.go:productionGenerationKernelCensus	E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationcompleteness.go	type GenerationEvidence	E2	linux:internal/host/rootgeneration_inventory.go:generationReconciler.reconcile	E23: versioned generation completeness binds exact reservations to independently supplied installation, launch and kernel evidence. Reservation mutations invalidate before commit; every destructive read reconciles again and retries sync. Production reconciliation remains unavailable. Fixtures: TestPlan14GenerationCompleteness, TestPlan14GenerationCompletenessInvalidation, TestPlan14GenerationCompletenessDurability, TestPlan14GenerationCompletenessCertificateSyncFailure, TestPlan14GenerationCompletenessPinConsumer, TestPlan14GenerationCompletenessProcessCrash; TestPlan14GenerationCompletenessCheckedRootStore passed on the E25 root runner.
    plan14_input_inventory_test.go:424: J4	internal/hostexec/controller.go	ClearStale	D	linux:internal/host/claimparticipation.go:productionClaimLocal.prepareLegacyWith	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostexec/local_unix.go	openDir	D	linux:internal/hostexec/local_unix.go:openLocal	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostexec/pending_linux.go	recoverPending	D	linux:internal/hostexec/pending_linux.go:RecoverPending	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/program.go	ArtifactProgram	E1	linux:internal/release/program.go:ReleaseProgram	root-input;kept=E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_writers_linux.go	rootInstallationCoverage	C+G	linux:internal/host/claimstop_writers_linux.go:verifyNoProcessAt	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=captures current checked descriptor identity for the extra state directory root derives from the canonical host; this ephemeral directory only expands the stop scan denial set
    plan14_input_inventory_test.go:424: J4	internal/host/proofbinding.go	proofRouteReady	B3	linux:internal/host/proofobserve.go:productionProofObserver	kept=B3;scope=canonical-binding-and-readiness;implementation-incomplete
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	buildStates.beforeExec	E3	linux:internal/host/buildstate.go:buildStateHook	Consumed request is tenant-bound before execution; unread registry refuses before state merge.
    plan14_input_inventory_test.go:424: J4	internal/release/healthy_root.go	readRootHealthy	B+B4	linux:internal/release/healthy.go:ReadHealthy	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_retirement.go	historyRetirementKey	E1	linux:internal/release/roothistory_retirement.go:RootHistory.RetireRecovery	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_refresh.go	rootRefreshAndJudgeMovesPrev	F	linux:internal/host/movesfloor.go:rootJudgeMovesPrevWithSource	rev3=PROPOSED-p3;identity=carlos adopt root pass, root unit uid 0;basis=adopt opens deployment store then refreshes floor before any no-prev return
    plan14_input_inventory_test.go:424: J4	internal/host/namedrecovery_active.go	namedUnitRecovery.recover	B3+E1	linux:internal/host/namedrecovery_pass.go:namedUnitRecovery.passOption	E13: signed recovery allows unknown history but preserves usable refusals, including retained originals; verified later promotion clears only D1. Health recording is independent of program recording; minting requires a census. Fixtures: TestPlan14RecoveryUnknownHistory, TestPlan14RecoveryKnownRefusal, TestPlan14RecoveryOriginalRefusalWithUnknownHistory, TestPlan14RootHistoryVerifiedRetryBeforeAttempt, TestPlan14ProgramFailureStillRecordsHealth, TestPlan14RootHistoryMintCensus.
    plan14_input_inventory_test.go:424: J4	internal/host/rootfloor_available.go	systemApplier.activationFloor	F	linux:internal/host/systemapply.go:systemApplier.activationRule	rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=keeps no-census main behavior; logs once and permits repair when no available signed copy supports the bound
    plan14_input_inventory_test.go:424: J4	internal/release/healthy.go	ReadHealthy	B+B4	linux:internal/host/proofbinding.go:productionProofBindingSource	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootrollback.go	captureRollback	B3+E1	linux:internal/host/roothistory_recovery.go:linkRootHistory	Signed named-unit recovery is independent of release and health history. Root rechecks canonical source, unit, process, signed target and trusted live pointer; captures attempt authority before publication; verifies readiness and resumes without repeated effects. Fixtures: TestPlan14SignedActiveFixIgnoresHistory, TestPlan14SignedActiveFixAuthority, TestPlan14SignedFixSupersedesOlderAttempt, TestPlan14ActiveRecoveryProcessCrash, TestPlan14SignedRestartWithoutHealthHistory, TestPlan14CapturedRollbackWithoutHealthHistory, TestPlan14SignedRestartRequiresTrustedLiveLink.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerations.go	const RootGenerationsDir	E2	linux:internal/host/rootlaunchverifier.go:registerProductionLaunchVerifier	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/root.go	type InstallationArtifacts	E2	linux:internal/hostguard/root.go:type RootInstallation	E37: retain independently initialized state-directory and timer requirements in the root installation transaction; preserve them through crash/reopen and rebind. Unknown history cannot certify completeness. Recommit under root-host exclusion before generation use. Canonical record and root retained obligations constrain agent candidate lists; timer enumeration is deny-only. Pre-flight 33, 80, 83. Fixtures: TestPlan14GenerationRequiredArtifacts, TestPlan14GenerationRegistryRows, TestPlan14RootTimerInventory, TestPlan14InventoryRequirementsRegistration, TestPlan14InventoryRequirementsUnknownAndRatchet, TestPlan14InventoryArtifactsCrash, TestPlan14InventoryRequirementsHistoryIdentity. Changed RequiredArtifacts and ExactRetirement root-runner witnesses await acceptance; remaining E2 launch/parked/containment integration is incomplete.
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.floorArmed	F	linux:internal/host/systemapply.go:systemApplier.activationGuard	rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=dormancy decision includes unreadable or present moves and seeds floors from selected authority
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalmigration_linux.go	readLegacyJournals	C	linux:internal/hostbox/journalmigration_linux.go:JournalService.MigrateLegacy	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_boot.go	rootFloorJournalPresent	F	linux:internal/host/guardexec.go:RunSystemGuardExec	rev3=PROPOSED-p3;identity=carlos system apply/recover and root adopt, systemd root units or offline CLI, uid 0;basis=checked authority-file presence selects recovery without opening a deployment store
    plan14_input_inventory_test.go:424: J4	internal/hostguard/rootview.go	Guard.fenceLocked	C+G	linux:internal/hostguard/recoveryfence.go:Guard.ResumeFence	rev3=PROPOSED-p3;identity=carlos instance-control, root control service uid 0; denial views also consumed by carlos agent uid carlos;basis=projects root-only migration denials into agent admission snapshot without trusting local hostguard records
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/ledger.go	Ledger.RecoverAcquisition	D+F	linux:internal/host/rootexecution_runtime.go:newClaimExecutionRuntime	rev3=PROPOSED-p3;identity=root system apply/recover or root participation caller uid 0;basis=retains acquisition-recovery checks and census commit under the same participation transaction; no new authority from a missing record
    plan14_input_inventory_test.go:424: J4	internal/host/rootroute.go	rootRecordRoute	B3	linux:internal/host/rootroute.go:proofBindingSource.needsRestart	trusted deployment record and root unit binding; durable per-attempt rollback and recovery
    plan14_input_inventory_test.go:424: J4	internal/hostguard/retirement.go	Guard.WithNoInstallation	C	linux:internal/host/claimproduction.go:claimAdminTokens.With	Use the already-held root host lock for empty-installation authority checks.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_status.go	type HistoryHostStatus	E1	linux:internal/release/roothistory_status.go:type HistoryMigrationStatus	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/console/browserrestart.go	Server.handleBrowserRestart	E1+E3	linux:internal/console/browserrestart.go:Server.handleAppRestart	root-route
    plan14_input_inventory_test.go:424: J4	internal/hostbox/coldhandover.go	coldNamespaceEmpty	C	linux:internal/hostbox/coldhandover.go:ColdHandover.Run	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/consumedfence_linux.go	lockConsumedCarry	E3	linux:internal/release/consumedfence.go:FenceCarry	root-input;kept=E3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	syncSibling	E2	linux:internal/release/adopt.go:stageFrom	E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/hostclaim/relocation.go	PinFailover	C	linux:internal/hostrelocate/worker.go:Worker.Step	Failover pinning requires recorded source fence and completed acknowledgement barrier.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerations.go	RootGenerations.Reserve	E2	linux:internal/host/rootgenerations_launch.go:rootGenerationSource.reserve	E20: exact reservation closure precedes retirement verification; retained tombstones forbid replay and require sync recommit. Retired records release only their own pins; completeness remains a separate mandatory verifier, still unavailable in production. Fixtures: TestPlan14GenerationRetirementReleasesExactPin, TestPlan14GenerationRetirementRefusals, TestPlan14GenerationClosedReplayRefused, TestPlan14GenerationRetirementProcessCrash, TestPlan14GenerationRetirementKeepsIndependentReference, TestPlan14GenerationClaimsOffRestageMatchesMain.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_source.go	rootMovesFloorIdentity	F	linux:internal/host/guardarm.go:RunSystemGuardArm	rev3=PROPOSED-p3;identity=carlos system apply/recover and root adopt, systemd root units or offline CLI, uid 0;basis=root-only census reader supplies deployment/box/enrollment; edge mode cannot call it
    plan14_input_inventory_test.go:424: J4	internal/host/proofbinding.go	proofBinding.authorizedRecovery	B3+E1	linux:internal/host/rootupdates.go:rootUpdateSource.resolve	Independent signed recovery authority and retained attempt outcomes. Fixtures: TestPlan14SignedRestartWithoutHealthHistory, TestPlan14CapturedRollbackWithoutHealthHistory, TestPlan14IndependentRecoveryRetainsMintBarrier, TestPlan14ActiveRecoveryProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/recoveryrefusals.go	recoveryResultKey	E1	linux:internal/host/rootrollback.go:settleRollbackAttempt	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/proofnamed.go	proofExecPath	B3	linux:internal/host/proofobserve.go:proofObserver.observe	fix1;basis=Authorizes recordless units only from descriptor-checked root configuration, installed console guard evidence, root history or the matching root update capture.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	type RestartIntent	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.run	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootinventory_requirements.go	inventoryTimerNames	E2	linux:internal/host/rootgeneration_requirements.go:generationRequiredInventory	E37: retain independently initialized state-directory and timer requirements in the root installation transaction; preserve them through crash/reopen and rebind. Unknown history cannot certify completeness. Recommit under root-host exclusion before generation use. Canonical record and root retained obligations constrain agent candidate lists; timer enumeration is deny-only. Pre-flight 33, 80, 83. Fixtures: TestPlan14GenerationRequiredArtifacts, TestPlan14GenerationRegistryRows, TestPlan14RootTimerInventory, TestPlan14InventoryRequirementsRegistration, TestPlan14InventoryRequirementsUnknownAndRatchet, TestPlan14InventoryArtifactsCrash, TestPlan14InventoryRequirementsHistoryIdentity. Changed RequiredArtifacts and ExactRetirement root-runner witnesses await acceptance; remaining E2 launch/parked/containment integration is incomplete.
    plan14_input_inventory_test.go:424: J4	internal/host/claimroleassembly_linux.go	ClaimRoleAssembly.PrepareState	C	linux:internal/host/claimwakeassembly.go:ClaimWakeAssembly.Build	rev3=PROPOSED-p3;identity=carlos agent claim lifecycle uid carlos; final authorization remains in root;basis=reuses state directories using root-captured persistent identity when present; legacy local inventories retain the prior same-device comparison
    plan14_input_inventory_test.go:424: J4	internal/host/units/carlos-restart.service	external	B3+C+D+E1	linux:internal/host/bootstrap.go:var unitsFS	root-input;kept=B3,C,D,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	backfillManifest	E2	linux:internal/release/adopt.go:backfillManifestDigest	E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/participation.go	checkLegacyParticipation	D	linux:internal/hostfloor/disk.go:Disk.Begin	Claims-on or retained root census uses root exclusion; claims-off with no census preserves main participation and recovery behavior.
    plan14_input_inventory_test.go:424: J4	internal/host/movesheldrelease_root.go	movesHeldReleaseRoot.heldGenerationPins	E2	linux:internal/host/movesheldrelease_root.go:movesHeldReleaseRoot.publishRelease	E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.armFloor	F	linux:internal/host/systemapply.go:systemApplier.Run	rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=normal update refreshes root moves and seeds histories in census mode; unknown history remains unacknowledged; no recovery or boot refresh
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloor.go	readLine	F	linux:internal/host/movesfloor.go:withMovesFields	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostexec/pending_linux.go	tryExistingPendingLock	D	linux:internal/hostexec/pending_linux.go:recoverPending	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/versions.go	PointLive	B3+E2	linux:internal/host/namedrecovery_active.go:namedUnitRecovery.recover	rev3=merge-ruling-5;basis=Compare resolved current and previous paths before retaining the running build; preserve repoint errors and canonical retained pointers.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	RootRestarts.Finish	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.run	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/release/releaseexclusion.go	ReleaseExclusion.With	E2	linux:internal/host/rootlaunchverifier.go:registerProductionLaunchVerifier	PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner. PROPOSED E45: root enforces census-gated release ordering, bounded acquisition and scoped recovery; registry timer primitives preserve supplied identity but producer integration remains pending.
    plan14_input_inventory_test.go:424: J4	internal/release/updatetarget.go	NextConsumed	E3	linux:internal/release/adopt.go:settingsTarget	Next consumed settings reset foreign decisions and stamp canonical tenant plus effective update policy.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_retirement.go	retirementEvidence	E1	linux:internal/release/roothistory_retirement.go:RootHistory.RetireRecovery	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/release/proofgate.go	ProofGate.hold	B3	linux:internal/release/proofgate.go:ProofGate.admit	root-route;kept=B3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	type generationMount	E2	linux:internal/host/rootgeneration_kernel_linux.go:generationMounts	E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_boot.go	rootFloorPrevVerdict	F	linux:internal/host/rootmovesfloor_boot.go:rootFloorBootCandidate	rev3=PROPOSED-p3;identity=carlos system apply/recover and root adopt, systemd root units or offline CLI, uid 0;basis=matches actual signed previous binary to identity and accepted generation before allowing its gate
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/image_linux.go	ExecutingHash	F	linux:internal/host/guardarm.go:RunSystemGuardArm	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/materializeheld.go	stageHeld	C+E1+E2	linux:internal/release/materializeheld.go:StageHeldVerifiedWithPins	root-route;kept=C,E1;scope=protected-decision-only E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/host/rootinventory_requirements.go	rootInventoryArtifacts	E2	linux:internal/host/rootinventory.go:ClaimRootHTTP.commitRootInventoryPending	E37: retain independently initialized state-directory and timer requirements in the root installation transaction; preserve them through crash/reopen and rebind. Unknown history cannot certify completeness. Recommit under root-host exclusion before generation use. Canonical record and root retained obligations constrain agent candidate lists; timer enumeration is deny-only. Pre-flight 33, 80, 83. Fixtures: TestPlan14GenerationRequiredArtifacts, TestPlan14GenerationRegistryRows, TestPlan14RootTimerInventory, TestPlan14InventoryRequirementsRegistration, TestPlan14InventoryRequirementsUnknownAndRatchet, TestPlan14InventoryArtifactsCrash, TestPlan14InventoryRequirementsHistoryIdentity. Changed RequiredArtifacts and ExactRetirement root-runner witnesses await acceptance; remaining E2 launch/parked/containment integration is incomplete.
    plan14_input_inventory_test.go:424: J4	internal/host/guardarm.go	RunSystemGuardArm	F	linux:system.go:runSystem	rev3=PROPOSED-p3;identity=carlos system guard-arm, offline CLI uid 0;basis=root guard-arm checks retained census floor before installing guard; no census retains main
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	capabilityPlan	E4	linux:internal/release/adopt.go:adoptHost	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/seedsfloor.go	readLocalSeedsFloor	F	linux:internal/host/seedsfloor.go:withSeedsFields	rev3=census-ruling-seeded-instances;basis=system apply (/opt/carlos/carlos system apply, or carlos.prev system apply, with --recover at boot; carlos-system-update.service and carlos-system-recover.service; root) and the adopt pass (/opt/carlos/carlos adopt in every mode; carlos-adopt.service, carlos-config-sync.service, carlos-restart.service and carlos-stage.service; root); also the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos), for its hourly refresh and its edges file: seeds twin of the moves floor (F,J4); deny-only; Part 3 F2-F4 must cover the seeds floor alongside the moves floor.
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory_recovery.go	linkRootHistory	B3+E1	linux:internal/host/agent.go:runAdoptUnderRootRelease	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_delivery.go	RootHistory.ReceiveRecoveryRetirements	E1	linux:internal/host/roothistory_maintenance.go:rootHistoryMaintenance.run	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_retirement.go	generationRetirement.retire	E2	linux:internal/host/rootgeneration_retirement.go:generationRetirement.retireAll	E25: validate installation, controller, exact unit and process before retaining an active or prelaunch pin. Only closed writers plus a settled unit reach durable retirement and independent kernel absence. Use the checked read-only journal and continue past active pins. Fixtures: TestPlan14GenerationRetirementKeepsActivePin, TestPlan14GenerationRetirementKeepsPrelaunchPin, TestPlan14GenerationRetirementContinuesPastActivePin, TestPlan14GenerationRetirementBindingProcessCrash, TestPlan14GenerationRetirementCensusGate. Running-tenant completeness remains unfinished.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_evidence.go	readMigrationStop	G	linux:internal/host/rootmigration_collect_linux.go:recoverMigrationStop	rev3=PROPOSED-p3;identity=carlos system journal-migrate offline operator uid 0;basis=revalidates enrolled immutable stop signature and exact launch inventory journal tuple; preserves original bytes and evidence time
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_production_linux.go	rootMigrationLegacySuspects	G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=carlos system journal-migrate, offline operator CLI, uid 0;basis=agent-writable hostguard filenames only identify unexplained hosts to refuse, never authorize inventory
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor.go	openRootMovesFloors	F	linux:internal/host/rootmovesfloor_boot.go:withRootFloorGuardCandidate	rev3=PROPOSED-p3;identity=root adopt refresh, root system update/recovery and root guard floor readers, uid 0;basis=selects fixed moves namespace then delegates checked root store opening
    plan14_input_inventory_test.go:424: J4	internal/host/seedsfloor.go	withSeedsFields	F	linux:internal/host/edgesfile.go:edgesFileLoop	rev3=PROPOSED-p3;identity=carlos agent in carlos-edge.service uid carlos;basis=root participation selects checked root projection; legacy agent mirror remains unchanged for nonparticipants
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerations.go	type GenerationProcess	E2	linux:internal/host/rootgeneration_inventory.go:generationReconciler.reconcile	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals. PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.runWithRelease	D+F	linux:internal/host/systemapply.go:RunSystemApply	rev3=PROPOSED-p3;identity=root system apply/recover or root participation caller uid 0;basis=root CLI carries E release exclusion through apply and recovery; nested guards reuse its token; absent census runs the exact legacy body
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationCurrentBinding	E2	linux:internal/host/rootgeneration_kernel_linux.go:generationKernel.absent	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=permits an old generation without persistent evidence only in its recorded boot; otherwise refuses instead of guessing identity
    plan14_input_inventory_test.go:424: J4	internal/host/units/carlos-adopt.service	external	B3+C+D+E1	linux:internal/host/bootstrap.go:var unitsFS	root-input;kept=B3,C,D,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/regionalworker.go	RegionalWorker.runHost	C	linux:internal/hostbox/regionalworker.go:RegionalWorker.Run	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootinventory.go	ClaimRootHTTP.verifyInventoryPath	C	linux:internal/host/rootinventory.go:ClaimRootHTTP.commitRootInventoryPending	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=uses checked persistent evidence for protected installation entries; explicit legacy fixtures preserve their same-boot check
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationKernel.absent	E2	linux:internal/host/rootgeneration_census_linux.go:generationKernel.census	E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance.;rev3=PROPOSED-p3;run=8;identity=root generation kernel census uid 0;basis=uses current-boot scanner identities only after retained filesystem and handle verification; immutable reservations remain unchanged
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloor.go	withMovesFields	F	linux:internal/host/edgesfile.go:edgesFileLoop	rev3=PROPOSED-p3;identity=carlos agent edgesFileLoop, carlos-edge.service uid carlos;basis=agent uses root-owned public projection when participating and its original writable mirror otherwise
    plan14_input_inventory_test.go:424: J4	internal/release/buildstate.go	ReadConsumed	E3	linux:internal/host/updatesreport.go:updatesReader	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostbox/inventory_registration.go	ReconcileAdapter.RegisterLanding	C	linux:internal/host/claimassembly.go:ClaimAssembly.Build	Landing client snapshots and registers outside host lock, then revalidates record/claim/revision before activation.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor.go	rootMovesFloors.selector	F	linux:internal/host/rootmovesfloor_source.go:readRootProtocolProjection	rev3=PROPOSED-p3;identity=root apply/recover/adopt units uid 0 and agent edges publisher carlos-edge.service uid carlos;basis=strict bounded canonical protocol/release line supplies independent crash-surviving deny
    plan14_input_inventory_test.go:424: J4	internal/host/claimjournal_proof.go	legacyJournalProof	C+G	linux:internal/host/claimjournal_migration.go:migrateClaimJournalsWith	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/movespass.go	armPhase1	B2+C	linux:internal/host/movespass.go:armMovesPass	rev3=census-ruling-seeded-instances;basis=the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): main's body with the S1 probe hook refusing a row whose import gate is set; main's B2,C authority retained
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/remote.go	CheckRemote	F	linux:internal/hostexec/controller.go:Config.checkRemoteUpdateIdentity	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_status.go	type HistoryMigrationStatus	E1	linux:internal/host/roothistory.go:openRootHistory	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/hostrelocate/participant.go	Participant.sameInstallation	C	linux:internal/hostrelocate/participant.go:Participant.Step	Installation comparison binds fresh operation, executor, phase, prepared object, incarnation, stamp and session.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_production_linux.go	publishMigrationReceipt	G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=carlos system journal-migrate, offline operator CLI, uid 0;basis=reconstructs immutable key/digest from original signed receipt bytes without changing evidence time
    plan14_input_inventory_test.go:424: J4	internal/host/versionsweep.go	settingsPins	E2	linux:internal/host/versionsweep.go:sweepStagedVersions	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/movesheldrelease_root.go	movesHeldReleaseRoot.authority	C+E1	linux:internal/host/movesheldrelease_root.go:movesHeldReleaseRoot.publishRelease	Held publication independently binds holder, operation, canonical deployment incarnation and hold; registry is a checked candidate.
    plan14_input_inventory_test.go:424: J4	internal/host/proofnamed.go	proofBindingSource.findRecord	B3	linux:internal/host/namedrecovery_active.go:namedUnitRecovery.recover	rev3=merge-ruling-5;basis=Cache index success or failure once per pass; selected records and ETags remain freshly read.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_payload_linux.go	generationPayloadFiles	E2	linux:internal/host/rootgeneration_inventory.go:generationReconciler.reconcile	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=verifies materialized payload entries by persistent filesystem evidence before admitting their files into the absence scan
    plan14_input_inventory_test.go:424: J4	internal/host/claimunit_binding.go	claimUnitBindings.check	E2	linux:internal/host/claimunit_placement.go:ClaimLaunchRoot.checkUnitBinding	PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.
    plan14_input_inventory_test.go:424: J4	internal/host/rootseedsfloor.go	rootRefreshAndJudgeSeedsPrev	F	linux:internal/host/movesfloor.go:rootJudgePrevWithSource	rev3=PROPOSED-p3;identity=carlos adopt and system apply refresh, uid 0; no recovery or boot-selector call;basis=normal adopt/update refreshes root seeds state under prev exclusion; recovery never calls this remote path
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart_requests.go	productionRestartRequestPass	E1	linux:internal/host/agent.go:runAdoptUnderRootRelease	E15: census-only root unit-restart consumption uses retained installations, canonical records, exact requests, invocation evidence and admission after durable intent under release exclusion. No-census effects use the original consumer. Fixtures: TestPlan14RootRestartProductionConsumption, TestPlan14RootRestartProductionHeldRollover, TestPlan14RootRestartProductionAdmissionAfterIntent, TestPlan14RootRestartProductionUnknown, TestPlan14RootRestartProductionSyncFailure, TestPlan14RootRestartProductionCrash, TestPlan14RootRestartRequestCensusGate.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	RootRestarts.write	E1	linux:internal/release/rootrestart_history.go:RootRestarts.Finish	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/inventory_identity.go	VerifyInventoryFile	C+E2+G	linux:internal/host/rootgeneration_payload_linux.go:generationPayloadFiles	rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=requires persistent root evidence and compares filesystem handle, ownership and stable mount attachment across boots
    plan14_input_inventory_test.go:424: J4	internal/host/rolloutdeclined.go	failureHolds.report	E1+E3	linux:internal/host/rollout.go:legacyRolloutStatusProbe	fix1-merge-review;basis=Reports only durable published restriction epochs and the supported retry protocol; reports do not grant authority.
    plan14_input_inventory_test.go:424: J4	internal/host/guardtransaction.go	systemApplier.beginGuard	D	linux:internal/host/systemapply.go:systemApplier.Run	Claims-on or retained root census uses root exclusion; claims-off with no census preserves main participation and recovery behavior. PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/rolelaunch.go	LaunchJournal.UnitReservation	C	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.launchLocked	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostguard/root.go	RootAuthority.read	C+G	linux:internal/hostguard/root.go:Guard.Capture	rev3=PROPOSED-p3;identity=carlos instance-control, root control service uid 0; denial views also consumed by carlos agent uid carlos;basis=strict checked root record decoding includes retained migration session denials
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationRootTask	E2	linux:internal/host/rootgeneration_kernel_linux.go:generationKernel.task	E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/restore.go	syncFile	C	linux:internal/hostbox/restore.go:ColdRestore.Install	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostguard/guard.go	Guard.freshObserved	C	linux:internal/hostguard/guard.go:Guard.fresh	root-input
    plan14_input_inventory_test.go:424: J4	internal/console/apirestartscope.go	environmentNames	E1+E3	linux:internal/console/apirestartscope.go:resolveRestartScope	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	productionSysOps	D+F	linux:internal/host/agent.go:runAdopt	root-input;kept=D,F;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimjournal_migration.go	migrateClaimJournalsWith	G	linux:internal/host/claimjournal_migration.go:RunSystemJournalMigrate	rev3=PROPOSED-p3;identity=carlos system journal-migrate, offline operator CLI, uid 0;basis=opens verified actor and root journal then selects full offline census or unchanged legacy journal import
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_refresh.go	rootFloorAdvertisementFor	F	linux:internal/host/rootmovesfloor_refresh.go:withRootMovesFields	rev3=PROPOSED-p3;identity=carlos agent edgesFileLoop, carlos-edge.service uid carlos;basis=agent reports accepted only for matching generation with signed compatible current and previous verdict
    plan14_input_inventory_test.go:424: J4	internal/hostops/move_fence_release.go	MoveRecoveryGrant.ReleaseFencedTarget	C+D	linux:internal/console/movesrecovery.go:Server.movesRecovery	Public release wrapper delegates verified target-fence release and returns its typed outcome; record-first close remains in the reviewed implementation.
    plan14_input_inventory_test.go:424: J4	internal/release/program.go	FileProgram	E1	linux:internal/release/adopt.go:adoptHost	root-input;kept=E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration.go	rootMigrationSnapshot.fingerprint	G	linux:internal/host/rootmigration.go:rootMigration.run	rev3=PROPOSED-p3;identity=carlos system journal-migrate, offline operator CLI, uid 0;basis=binds exclusion and membership across observations/restart while allowing boot metadata and independently recovered payload revision
    plan14_input_inventory_test.go:424: J4	internal/host/claimunit.go	var readClaimUnitFile	C+G	linux:internal/host/claimunit.go:readClaimUnitSettings	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootinventory_install.go	landingRegistrationMatches	C	linux:internal/host/rootinventory.go:ClaimRootHTTP.commitRootInventoryPending	Root landing metadata binds the original op and minted row; checking/configured require the registration session, while later session phases use the freshly bound authoritative current session.
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.activationGuard	D+F	linux:internal/host/systemapply.go:systemApplier.install	rev3=PROPOSED-p3;identity=carlos system apply/recover root units and offline root CLI uid 0;basis=release exclusion then scoped participation transaction then effective moves/seeds floor and registry; signed candidate checks remain inside guard; nested journal close reuses live exclusion
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalservice.go	journalPrune	C	linux:internal/hostbox/journalservice.go:JournalService.executeWithInventory	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostbox/writer.go	Writer.Published	C	linux:internal/host/claimwakeassembly.go:ClaimWakeAssembly.Build	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootrollback_resume.go	recoverRootRestarts	B3	linux:internal/host/agent.go:runAdoptUnderRootRelease	Recover every attempt independently, skip settled writes and remove leftover capabilities.
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	RequestKey	E1	linux:internal/historyreadback/workflow.go:Operation.Deliver	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgenerations_launch.go	rootGenerationSource.reserve	E2+E3	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.startRecorded	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=writes root runtime intent after the generation reservation and before launch under release and host exclusion
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationcompleteness.go	const rootGenerationCompletenessLimit	E2	linux:internal/release/rootgenerationcompleteness.go:RootGenerations.Completeness	E23: versioned generation completeness binds exact reservations to independently supplied installation, launch and kernel evidence. Reservation mutations invalidate before commit; every destructive read reconciles again and retries sync. Production reconciliation remains unavailable. Fixtures: TestPlan14GenerationCompleteness, TestPlan14GenerationCompletenessInvalidation, TestPlan14GenerationCompletenessDurability, TestPlan14GenerationCompletenessCertificateSyncFailure, TestPlan14GenerationCompletenessPinConsumer, TestPlan14GenerationCompletenessProcessCrash; TestPlan14GenerationCompletenessCheckedRootStore passed on the E25 root runner.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_inventory.go	generationOwner	E2	linux:internal/host/rootgeneration_inventory.go:generationReconciler.reconcile	E24: independent root installation and launch enumeration, exact reservation reconciliation and fresh quiescent whole-version-tree kernel census; missing sources, open unreserved launches, foreign namespaces and uncontained tasks refuse. Production pin source certifies this evidence before returning pins. Fixtures: TestPlan14GenerationInventoryCompleteness, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationInventoryLifecycle, TestPlan14GenerationInventoryProcessCrash, TestPlan14GenerationKernelCensusUnknownReference, TestPlan14GenerationLaunchInventory, TestPlan14GenerationReaderDoesNotInitialize, TestPlan14GenerationInstallationInventory. Checked production source/kernel witnesses passed on the E27 root runner. E29 physical-payload and installed-unit witnesses passed on the controller runner; E30 required-artifact witness pending.
    plan14_input_inventory_test.go:424: J4	internal/hostexec/local_unix.go	tryAcquireNamed	D	linux:internal/hostexec/local_unix.go:tryAcquire	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/claimowners.go	claimServingOwners.launchDigest	C+G	linux:internal/host/claimconstruction.go:OpenProductionClaimAssembly	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/pins.go	GenerationVersions	E2	linux:internal/host/versionsweep.go:sweepStagedVersions	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostexec/clock_linux.go	BootID	D	linux:internal/host/rootexecution_runtime.go:newClaimExecutionRuntime	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/proofgate.go	ProofGate.bindRecording	B3	linux:internal/release/roothistory_pass.go:passConfig.bindProof	root-route;kept=B3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootgenerationpins.go	productionRootGenerationPins	E2	linux:internal/host/movesheldrelease_production.go:WithProductionMovesHeldRelease	E24: independent root installation and launch enumeration, exact reservation reconciliation and fresh quiescent whole-version-tree kernel census; missing sources, open unreserved launches, foreign namespaces and uncontained tasks refuse. Production pin source certifies this evidence before returning pins. Fixtures: TestPlan14GenerationInventoryCompleteness, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationInventoryLifecycle, TestPlan14GenerationInventoryProcessCrash, TestPlan14GenerationKernelCensusUnknownReference, TestPlan14GenerationLaunchInventory, TestPlan14GenerationReaderDoesNotInitialize, TestPlan14GenerationInstallationInventory. Checked production source/kernel witnesses passed on the E27 root runner. E29 physical-payload and installed-unit witnesses passed on the controller runner; E30 required-artifact witness pending.
    plan14_input_inventory_test.go:424: J4	internal/release/materializeheld.go	publishHeld	C+E1	linux:internal/release/materializeheld.go:materializeHeld	root-route;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostexec/rootclient.go	requestIdentity	D	linux:internal/hostexec/rootclient.go:RootClient.close	D1 supplies collision-resistant request correlation only; root authenticates peer and authority independently.
    plan14_input_inventory_test.go:424: J4	internal/host/systemunits.go	ensureSystemUnits	F	linux:internal/host/agent.go:runAdopt	root-input;kept=F;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/stopjournal_reader.go	LaunchJournal.ReadStopKernelJournal	C	linux:internal/host/rootmigration_collect_linux.go:migrationStopKernel.RecoverStopped	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/relocationowners.go	ClaimAssembly.relocationReleaseHold	C+D	linux:internal/host/relocatepass.go:newCompletionRuntime	Completion releases hold only after verified participation discharge, then lifts agent-owned probe fence and marks authoritative completion.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	type generationKernel	E2	linux:internal/host/rootgeneration_census_linux.go:productionGenerationKernelCensus	E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance. PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/registry/remote.go	serveRemote	E2	linux:internal/registry/remote.go:ServeRemote	Mixed declaration: E2 adds only the ArtifactHosts read operation; all existing dispatch and write behavior stays legacy. Original immutable legacy fingerprints retained. E32: census-only E2 completeness discovers the bounded union of route and timer hosts, including inactive orphan timers, through the service-user read-only parser. Unknown hosts refuse even with an empty root installation list; discovery supplies no authority and never removes a retained obligation. Pre-flight 33, 80, 82, 83, 89 and 90. Fixtures: TestArtifactHosts, TestRemoteReadOnlyWALRegistry, TestPlan14GenerationRegistryRows, TestPlan14GenerationRegistryProductionReader; extended TestPlan14GenerationRequiredArtifactsRootRunner remains runner-pending.
    plan14_input_inventory_test.go:424: J4	internal/hostclaim/relocation.go	FenceSource	C	linux:internal/hostrelocate/worker.go:Worker.Step	Source-loss transition independently verifies termination fence and enrollment before revoking its participation.
    plan14_input_inventory_test.go:424: J4	internal/host/movesheldrelease_root.go	type movesHeldReleaseRoot	E2	linux:internal/host/movesheldrelease_production.go:WithProductionMovesHeldRelease	E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/caps/converge.go	Ops.ensureUser	E4	linux:internal/caps/converge.go:Converge	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostguard/root.go	type RootInstallation	E2	linux:internal/host/rootinstallation.go:rootInstallationHostApp	E37: retain independently initialized state-directory and timer requirements in the root installation transaction; preserve them through crash/reopen and rebind. Unknown history cannot certify completeness. Recommit under root-host exclusion before generation use. Canonical record and root retained obligations constrain agent candidate lists; timer enumeration is deny-only. Pre-flight 33, 80, 83. Fixtures: TestPlan14GenerationRequiredArtifacts, TestPlan14GenerationRegistryRows, TestPlan14RootTimerInventory, TestPlan14InventoryRequirementsRegistration, TestPlan14InventoryRequirementsUnknownAndRatchet, TestPlan14InventoryArtifactsCrash, TestPlan14InventoryRequirementsHistoryIdentity. Changed RequiredArtifacts and ExactRetirement root-runner witnesses await acceptance; remaining E2 launch/parked/containment integration is incomplete.
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/controllers_linux.go	EnsureControllerDir	F	linux:internal/host/guardarm.go:guardArmControllers	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/claimunit.go	claimUnitContent	E1+E3	linux:internal/host/bootstrap.go:bootstrapWith	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=adds write permission for exactly the public retry directory only when the root settings reader has verified a complete census and prepared that directory
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_timers.go	rootMigrationTimers.key	G	linux:internal/host/rootmigration_timers.go:rootMigrationTimers.adopt	rev3=PROPOSED-p3;identity=offline migration root uid 0;basis=scopes the durable timer adoption intention to the root-observed installation and denied session
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationcompleteness.go	const generationCompletenessKey	E2	linux:internal/release/rootgenerationpins.go:RootGenerations.Reservations	E23: versioned generation completeness binds exact reservations to independently supplied installation, launch and kernel evidence. Reservation mutations invalidate before commit; every destructive read reconciles again and retries sync. Production reconciliation remains unavailable. Fixtures: TestPlan14GenerationCompleteness, TestPlan14GenerationCompletenessInvalidation, TestPlan14GenerationCompletenessDurability, TestPlan14GenerationCompletenessCertificateSyncFailure, TestPlan14GenerationCompletenessPinConsumer, TestPlan14GenerationCompletenessProcessCrash; TestPlan14GenerationCompletenessCheckedRootStore passed on the E25 root runner.
    plan14_input_inventory_test.go:424: J4	internal/host/rootfloor_healthy.go	systemApplier.acceptRootFloorHealthy	F	linux:internal/host/systemapply.go:systemApplier.install	rev3=PROPOSED-p3;identity=carlos system apply, root update unit or offline root CLI, uid 0;basis=reads signed installed bytes after the system health gate; writes independent moves and published-seeds root observations
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloor_linux.go	openMovesDir	F	linux:internal/host/movesheldlock.go:withHeldStageLock	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/unitsettle.go	routeReady	B3	linux:internal/host/agent.go:agentCheckedUnitRestart	root-route
    plan14_input_inventory_test.go:424: J4	internal/hostclaim/relocation.go	JournalRelease	C	linux:internal/hostrelocate/participant.go:Participant.Step	Release transition binds executor session, enrollment and immutable stop receipt reference; replication position payload remains legacy.
    plan14_input_inventory_test.go:424: J4	internal/host/claimretire_transport.go	ClaimRootHTTP.retire	C+G	linux:internal/host/claimretire_transport.go:ClaimRootHTTP.RecoverPending	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=requires persistent root-captured artifact evidence when constructing the protected retirement parker
    plan14_input_inventory_test.go:424: J4	internal/release/sweep.go	treeStats	E2	linux:internal/release/sweep.go:SweepStaged	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/claimproduction.go	claimInputPolicy	C+G	linux:internal/host/claimproduction.go:ProductionClaimOwnerProvider.OpenClaimOwners	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rolloutdeclined.go	failureHolds.pointerLoop	E1+E3	linux:internal/host/agent.go:fastConvergeLoop	fix1-merge-review;basis=Delegates each iteration to pass; retains ownership of the retry/restriction authority path despite no direct read.
    plan14_input_inventory_test.go:424: J4	internal/instancectl/peer_tuple_linux.go	AuthenticatePeerTuple	C+G	linux:internal/host/claimstop_production.go:NewProductionClaimStopHandler	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/generationpayload.go	type GenerationPayload	E2	linux:internal/host/rootgeneration_inventory.go:type generationInventory	E26: checked read-only payload enumeration includes inventory and revision orphans; completeness binds current and retained predecessor inventories, exact current revision and both source reads. Fixtures: TestPlan14GenerationPayloadCompleteness, TestPlan14GenerationPayloadRetainedPredecessor, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationPayloadInventory, TestPlan14GenerationPayloadReaderDoesNotInitialize. Checked root reader acceptance passed at E27; running-tenant containment remains unfinished.
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.install	F	linux:internal/host/systemapply.go:systemApplier.Run	rev3=PROPOSED-p3;identity=carlos system apply, root update unit or offline root CLI, uid 0;basis=root verifies staged signature and final locked bounds before rename, then records root accepted floor history only after health succeeds
    plan14_input_inventory_test.go:424: J4	internal/host/rootseedsfloor_publication.go	readRootSeedsBound	F	linux:internal/host/rootmovesfloor_boot.go:withRootFloorGuardCandidate	rev3=PROPOSED-p3;identity=root normal adopt/apply refresh, system apply/recover and guard floor readers, uid 0;basis=unpublished seeds supplies no bound; verified retained publication and root-capped denies determine the bound
    plan14_input_inventory_test.go:424: J4	internal/host/rootupdates_runtime.go	rootUpdateSource.retryStatus	E3	linux:internal/host/rootupdates_runtime.go:rootUpdateSource.publishRetry	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=derives retry identity and restrictions from root-held failures and epoch-bound served observations
    plan14_input_inventory_test.go:424: J4	internal/hostbox/reconcile_adapter.go	ReconcileAdapter.MintHeld	C	linux:internal/hostbox/reconcile_adapter.go:ReconcileAdapter.MintHeldUnder	Local held-row mint requires matching nested installation ownership and operation; production remote path uses separate registration.
    plan14_input_inventory_test.go:424: J4	internal/host/rootexecution_client.go	productionClaimLocal.prepareWith	D	linux:internal/host/claimparticipation.go:productionClaimLocal.Prepare	Agent selects the single root lease owner over authenticated RPC; its mirror grants no root authority.
    plan14_input_inventory_test.go:424: J4	internal/host/rolloutdeclined.go	failureHolds.plan	E1+E3	linux:internal/host/rolloutdeclined.go:honourDeclinedFailures	root-route
    plan14_input_inventory_test.go:424: J4	internal/registry/importjournal.go	Registry.ImportJournalHosts	G	linux:internal/registry/remote_dispatch.go:Registry.dispatchRemote	rev3=census-ruling-seeded-instances;basis=its SQLite arm as carlos, in the agent or the registry child (carlos __registry-child); its remote arm in whichever process holds a remote handle, and a root pass does. No caller in the tree yet, outside the child's dispatch: deny-only activation input; G wires its caller and must keep it deny-only. If it ever feeds a decision that allows rather than refuses, it needs a new ruling.
    plan14_input_inventory_test.go:424: J4	internal/release/materializeheld.go	StageHeldVerifiedWithPins	E2	linux:internal/host/movesheldrelease_root.go:movesHeldReleaseRoot.stageRelease	E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/rootstate/file_linux.go	OpenTrustedFile	A+B3	linux:internal/host/rootgenerations_launch.go:productionRootGenerations	kept=B3;scope=canonical-binding-and-readiness;implementation-incomplete
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_production_linux.go	migrateRootClaimAuthority	E3+G	linux:internal/host/claimjournal_migration.go:migrateClaimJournalsWith	rev3=PROPOSED-p3;identity=offline migration root uid 0;basis=offline migration adopts pre-claim timers only after verified root stop evidence; resumes its exact saved intention under release and migration exclusion, rechecking kernel absence before completion;rev3=PROPOSED-p3;run=8;identity=offline journal-migrate uid 0;basis=initializes root failure history after a complete census; legacy bytes add only denies and never retry permission
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/image_linux.go	OpenProtected	F	linux:internal/host/guardarm.go:RunSystemGuardArm	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_retirement.go	generationRetirement.closure	E2	linux:internal/host/rootgeneration_retirement.go:generationRetirement.retire	E25: validate installation, controller, exact unit and process before retaining an active or prelaunch pin. Only closed writers plus a settled unit reach durable retirement and independent kernel absence. Use the checked read-only journal and continue past active pins. Fixtures: TestPlan14GenerationRetirementKeepsActivePin, TestPlan14GenerationRetirementKeepsPrelaunchPin, TestPlan14GenerationRetirementContinuesPastActivePin, TestPlan14GenerationRetirementBindingProcessCrash, TestPlan14GenerationRetirementCensusGate. Running-tenant completeness remains unfinished. PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.
    plan14_input_inventory_test.go:424: J4	internal/host/claimwakestop.go	ClaimAssembly.stopRetryAttempt	C+G	linux:internal/host/claimwakestop.go:ClaimAssembly.bindClaimWakeStop	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/guardtransaction.go	legacyGuardEntries	D	linux:internal/host/guardtransaction.go:installFloorHook	Claims-on or retained root census uses root exclusion; claims-off with no census preserves main participation and recovery behavior.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalmigration_linux.go	JournalService.CheckLegacyMigration	C	linux:internal/host/claimjournal_migration.go:checkClaimJournalMigration	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/healthy_root.go	addRootHealthy	B+B4	linux:internal/release/healthy_root.go:recordRootHealthy	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostbox/reconcile.go	Reconciler.completedHold	C	linux:internal/hostbox/reconcile.go:Reconciler.checkOn	Completed relocation catch-up can hold only its recorded old source row and creates no installation authority.
    plan14_input_inventory_test.go:424: J4	internal/host/rootinventory_timer_mutation.go	ClaimRootHTTP.applyTimerMutation	E2	linux:internal/host/rootinventory.go:ClaimRootHTTP.commitRootInventoryPending	PROPOSED E46: local root installation obligations, exact root intention and inventory revision; service SQL is a deny-only consistency check. Executing identity: root instance-control or root participation/update.
    plan14_input_inventory_test.go:424: J4	internal/release/pins.go	nextGenerationsSeq	E2	linux:internal/release/pins.go:WriteGenerations	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_pass.go	passConfig.recheckHistory	E1	linux:internal/release/adopt.go:adoptHost	E1 canonical binding selection and recheck; durable attempt precedes effects; only independent installed observation settles and retires the exact target refusal.
    plan14_input_inventory_test.go:424: J4	internal/host/relocationinstall.go	relocationRecord	C+E3	linux:internal/host/relocatepass.go:relocationRelocatable	Canonical relocation record and update policy derive nested installation shape; source account/incarnation is rechecked by root registration.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationpins.go	WithRootGenerationPins	E2	linux:internal/host/agent.go:runAdoptUnderRootRelease	E19: both destructive readers use the root reservation snapshot under existing release exclusion. Exact artifact and containing-tree identities are retained; missing completeness refuses destruction. Production installation/launch/kernel completeness and verified retirement remain unfinished. Fixtures: TestPlan14GenerationDeletionCannotUnpin, TestPlan14GenerationSnapshotCompleteness, TestPlan14GenerationSnapshotPermitsUnreservedRestage, TestPlan14GenerationSnapshotPinsContainingTree, TestPlan14GenerationSnapshotEmptyIsUnknown, TestPlan14GenerationConsumerMode, TestPlan14GenerationProductionModeGate, TestPlan14GenerationSnapshotPermitsFreshTree.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/empty_census.go	LaunchJournal.HasHost	C	linux:internal/hostbox/empty_census.go:EmptyInstallationCensus.checkLocal	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/proofbinding.go	proofBindingSource.forHost	B3	linux:internal/host/rootrestart.go:productionRootRestartChecks	canonical record/unit/executable authority and one-attempt rollback; draft incomplete
    plan14_input_inventory_test.go:424: J4	internal/hostbox/restore.go	loadPinned	C	linux:internal/hostbox/restore.go:ColdRestore.Install	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_retirement.go	RootHistory.recoveryRetired	E1	linux:internal/release/roothistory_delivery.go:RootHistory.ReceiveRecoveryRetirements	Exact completion binds the accepted authorization digest from durable private history to enrolled-root signed readback. Pending originals, changed evidence and canonical sources cannot supply retirement completion. Fixtures: TestPlan14HistoryReconstructionCompletion, TestPlan14HistoryRetirementCompletion, TestPlan14ReadReconstructionCompletion, TestPlan14ReadRetirementCompletion, TestPlan14RecoveryRetirementProductionCallback, TestPlan14RootHistoryReconstructionCrash, TestPlan14HistoryRetirementProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/rootstate/live.go	HoldLive	A+D	linux:internal/hostexec/rootbroker.go:RootBroker.write	fix1;basis=Requires the store to implement broker-only liveness holding and a non-acquiring query; unsupported stores fail closed.
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart_requests_source.go	rootRestartRequestSource.target	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.consume	E15: census-only root unit-restart consumption uses retained installations, canonical records, exact requests, invocation evidence and admission after durable intent under release exclusion. No-census effects use the original consumer. Fixtures: TestPlan14RootRestartProductionConsumption, TestPlan14RootRestartProductionHeldRollover, TestPlan14RootRestartProductionAdmissionAfterIntent, TestPlan14RootRestartProductionUnknown, TestPlan14RootRestartProductionSyncFailure, TestPlan14RootRestartProductionCrash, TestPlan14RootRestartRequestCensusGate.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_refresh.go	rootFloorJudge.judge	F	linux:internal/host/systemapply.go:systemApplier.notePrev	rev3=PROPOSED-p3;identity=carlos adopt normal refresh and carlos system apply notePrev, uid 0;basis=observes participation before floor lock; writes identity-bound current/prev verdict even under unknown history without blocking repair executor
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_inventory.go	productionGenerationInventory	E2	linux:internal/host/rootgenerationpins.go:productionRootGenerationPins	E38: reconcile completed root retirement against the retained stop receipt and exact inventory; inspect parked identities, require retired rows absent or an independently inventoried successor, and retain generation pins. Fixtures: TestPlan14GenerationParkedPayload, TestPlan14GenerationParkedCrash, TestPlan14GenerationParkedKeepsReservation, TestPlan14GenerationParkedReadback; TestPlan14GenerationParkedRootRunner is runner-pending. Timer producer matches retained entries once and preserves successors on replay: TestPlan14GenerationTimerRetirement. No claims-off path changes. PROPOSED E46: local root installation obligations, exact root intention and inventory revision; service SQL is a deny-only consistency check. Executing identity: root instance-control or root participation/update.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalservice.go	journalIdentity	C	linux:internal/hostbox/generationinventory.go:LaunchJournal.GenerationLaunches	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/heldstage.go	heldStageRow	C+E1	linux:internal/host/heldstage.go:heldStageAuthority	root-route;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/floor.go	Read	F	linux:internal/host/hostfencepass.go:hostFenceOnce	root-input
    plan14_input_inventory_test.go:424: J4	internal/provision/reconcile.go	RouteFor	C+E3	linux:internal/host/rootupdates.go:rootUpdateSource.resolve	rev3=census-ruling-seeded-instances;basis=the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos); also root, in the claim root's landing registration (ClaimRootHTTP.rootLandingRoute) and the relocation install (relocationRecord): main's body with one more field: the row's seed column, derived from the record's seed (SeedColumn). Every caller gets it, the two root ones included, so a root-registered row for a seeded record now carries the seed the activator places from; main's C,E3 authority retained
    plan14_input_inventory_test.go:424: J4	internal/host/rootexecution_settle.go	ClaimRootHTTP.settleExecution	D	linux:internal/host/rootexecution_runtime.go:newClaimExecutionRuntime	Root cleanup checks exact retained installation, launch journal and kernel evidence; CC9 requires a fresh terminal or exclusion claim.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgenerations_launch.go	rootGenerationSource.resolve	E2	linux:internal/host/rootgenerations_launch.go:rootGenerationSource.reserve	E20: read the atomic root installation under the existing host exclusion without recursive lock acquisition; retain fresh claim, canonical record, signed artifact and final reservation checks. Fixtures: TestPlan14GenerationLaunchDoesNotReenterRootLock, TestPlan14GenerationLaunchRefusals, TestPlan14RootDispatchRejectsRegistryMutation. PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.;rev3=PROPOSED-p3;run=8;identity=root claim launch uid 0;basis=captures persistent executable and tree proofs only after canonical installation and signed artifact verification under exclusion
    plan14_input_inventory_test.go:424: J4	internal/host/claimcleanup_identity.go	claimCleanupEnrollment.configureSigner	C+G	linux:internal/host/claim_evidence_wiring.go:ClaimOwnerBindings.claimEvidenceCoordinator	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimroleassembly_other.go	ClaimRoleAssembly.Launch	C+G	darwin:internal/host/claimwakeassembly.go:ClaimWakeAssembly.Build	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimparticipation_relocation.go	productionClaimLocal.Acknowledged	D	linux:internal/host/relocatepass.go:NewRelocationRuntime	Relocation acknowledgement waits for bound controller readiness; participates in execution admission.
    plan14_input_inventory_test.go:424: J4	internal/host/proofroot.go	proofRoot.recordLive	B3	linux:internal/host/proofroot.go:proofRoot.around	rev3=merge-ruling-5;basis=Exclude ordinary unstamped and derived routes before pre-pass binding and health observation.
    plan14_input_inventory_test.go:424: J4	internal/release/restartscope.go	RestartScope.Selects	E1+E3	linux:internal/host/restartscope.go:scopedHosts	root-route
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalmigration_linux.go	checkLegacySchema	C	linux:internal/hostbox/journalmigration_linux.go:readLegacyJournals	root-input
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	validStatus	E1	linux:internal/historyreadback/readback.go:ReadStatus	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_status.go	RootHistory.MigrationStatusWithSources	E1	linux:internal/host/roothistory_maintenance.go:rootHistoryMaintenance.run	Exact completion binds the accepted authorization digest from durable private history to enrolled-root signed readback. Pending originals, changed evidence and canonical sources cannot supply retirement completion. Fixtures: TestPlan14HistoryReconstructionCompletion, TestPlan14HistoryRetirementCompletion, TestPlan14ReadReconstructionCompletion, TestPlan14ReadRetirementCompletion, TestPlan14RecoveryRetirementProductionCallback, TestPlan14RootHistoryReconstructionCrash, TestPlan14HistoryRetirementProcessCrash.
    plan14_input_inventory_test.go:424: J4	history_cli.go	historyReadFile	E1	linux:history_cli.go:historyCommandWithSave	E17: operator saves exact signed authorization and challenge before delivery, resumes without renewal, and verifies enrolled-root exact completion. Existing proof branches are unchanged. Tests: TestPlan14HistoryOperatorWorkflow, TestPlan14HistoryOperatorConflicts, TestPlan14HistoryOperatorExactCompletion, TestPlan14HistoryWorkflowProcessCrash, TestPlan14HistoryCommandResume, TestPlan14HistorySavedFiles, TestPlan14HistoryCLIDispatch.
    plan14_input_inventory_test.go:424: J4	internal/host/claimjournal_transport.go	ClaimRootHTTP.serveJournal	C	linux:internal/host/claimretire_transport.go:ClaimRootHTTP.ServeHTTP	root installation and fence authority; registration and recovery; agent RPC lock ordering
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_root.go	claimUnitStopKernel.settleUnits	C+E2+G	linux:internal/host/claimlaunch_root.go:claimUnitStopKernel.RecoverStopped	root-input;kept=C,G;scope=protected-decision-only PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/empty_census.go	EmptyInstallationCensus.CheckHeld	C	linux:internal/hostbox/reconcile_adapter.go:ReconcileAdapter.Install	Hold-only source checks its own row-owned installation inventory rather than the target holder stamp.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/recoveryfence.go	Guard.recordNames	C	linux:internal/hostguard/recoveryfence.go:Guard.PendingFences	root installation/fence backend and lock-free agent projection; establishment blocked; draft incomplete
    plan14_input_inventory_test.go:424: J4	internal/host/legacyrestart.go	rootRestartChecks.allowLegacy	B3+G	linux:internal/host/agent.go:runAdoptUnderRootRelease	rev3=merge-ruling-4;basis=Evaluate the explicit census selector; omitted test selector remains strict.
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/report.go	ReadEnrollment	F	linux:internal/host/guardarm.go:RunSystemGuardArm	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory_creation.go	rootRestartRequestSource.creation	E1	linux:internal/host/roothistory_creation.go:rootHistoryCreation	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/rootmigration.go	RootAuthority.CompleteMigrationInventory	G	linux:internal/host/rootmigration_timers.go:rootMigrationTimers.adopt	rev3=PROPOSED-p3;identity=offline migration root uid 0;basis=root fence completion binds the migration inventory revision; timer adoption permits only its exact previous revision plus one and recommits visible failed writes
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	WithRunningVersion	B3	linux:internal/host/agent.go:runAdoptUnderRootRelease	rev3=fix3-Astra-P2;basis=Root-only hook supplies verified current or previous running authority before replacing pointers.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/coldhandover.go	ColdHandover.Run	C	linux:internal/hostbox/coldhandover.go:ColdHandover.Recover	rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=carries persistent identity into root-guarded cold retirement without treating old device numbers as filesystem identity
    plan14_input_inventory_test.go:424: J4	internal/hostbox/empty_census.go	EmptyInstallationCensus.CheckLocal	C	linux:internal/host/claimassembly.go:ClaimAssembly.Build	Delegates strict empty census with no allowed row; only root registered-row recovery supplies a specific ownership exception.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/inventory_registration.go	ReconcileAdapter.installRemote	C	linux:internal/hostbox/reconcile_adapter.go:ReconcileAdapter.Install	Remote install snapshots old source inventory outside host lock and rechecks revision in hold-only path.
    plan14_input_inventory_test.go:424: J4	history_cli.go	historySync	E1	linux:history_cli.go:historySave	E17: operator saves exact signed authorization and challenge before delivery, resumes without renewal, and verifies enrolled-root exact completion. Existing proof branches are unchanged. Tests: TestPlan14HistoryOperatorWorkflow, TestPlan14HistoryOperatorConflicts, TestPlan14HistoryOperatorExactCompletion, TestPlan14HistoryWorkflowProcessCrash, TestPlan14HistoryCommandResume, TestPlan14HistorySavedFiles, TestPlan14HistoryCLIDispatch.
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloorgate_linux.go	readFloorGateFile	F	linux:internal/host/movesfloorgate_linux.go:floorAllowsPrev	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_refresh.go	withRootMovesFields	F	linux:internal/host/movesfloor.go:withMovesFields	rev3=PROPOSED-p3;identity=carlos agent edgesFileLoop, carlos-edge.service uid carlos;basis=agent publishes only checked root public verdict and explicitly quarantines unreadable participant state
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_source.go	refreshRootMovesFloor	F	linux:internal/host/systemapply.go:systemApplier.armFloor	rev3=PROPOSED-p3;identity=carlos system apply/recover and root adopt, systemd root units or offline CLI, uid 0;basis=normal adopt/update combines remote object with independent deny-only legacy evidence under root floor lock
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	buildStates.heldTarget	E3	linux:internal/host/buildstate.go:buildStates.wakeTarget	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/retention.go	retentionPass	E2	linux:internal/host/agent.go:retentionLoop	root-route
    plan14_input_inventory_test.go:424: J4	internal/hostbox/empty_census.go	EmptyInstallationCensus.checkHeldInventory	C	linux:internal/hostbox/empty_census.go:EmptyInstallationCensus.CheckHeld	Held-inventory validator requires exact box/enrollment, ownership and single materialized route.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationKernel.task	E2	linux:internal/host/rootgeneration_kernel_linux.go:generationKernel.absent	E25: keep the descriptor-listing handle open through inspection, including when scanning the current process. Check every listed descriptor against paths and artifact identities. Fixtures: TestPlan14GenerationKernelOwnDescriptors and TestPlan14GenerationKernelReferences. Root-runner acceptance passed at E27: TestPlan14GenerationKernelCensusRootRunner and TestPlan14GenerationKernelRetirementRootRunner. PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationLinkRef	E2	linux:internal/host/rootgeneration_kernel_linux.go:generationKernel.task	E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance.
    plan14_input_inventory_test.go:424: J4	internal/caps/converge.go	scanClaims	E4	linux:internal/caps/converge.go:Ops.checkClaimsOnDisk	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/claimwakestop.go	ClaimAssembly.localStopIdentity	C+G	linux:internal/host/claimparticipation.go:productionClaimLocal.bind	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/instancectl/peer_tuple_linux.go	procStart	C+G	linux:internal/instancectl/peer_tuple_linux.go:AuthenticatePeerTuple	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/relocationinstall.go	ClaimAssembly.relocationInstall	B2+C+E2	linux:internal/host/relocationassembly.go:ClaimAssembly.RelocationEffects	Existing root inventory and installation obligations remain B2,C; E41: default relocation materializer refuses claim-mode direct stage/publication until a root-reserved relay exists. Claims-off body unchanged; already-live verified releases remain readable. TestPlan14GenerationRelocationDefaultMaterializer and TestPlan14GenerationRelocationRelayRefusal. Positive root relocation remains open.
    plan14_input_inventory_test.go:424: J4	internal/hostops/completion_fence.go	ProductionAuthority.completionFence	C	linux:internal/hostops/production_held_start.go:ProductionAuthority.startAppLifecycle	Completion-fence exception independently verifies enrolled box termination before bypassing completion barrier for deletion.
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_kernel_linux.go	LinuxStopKernel.recoverAfterReboot	C	linux:internal/host/claimstop_kernel_linux.go:LinuxStopKernel.RecoverStopped	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=rechecks the persisted inventory filesystem before rebasing deny-only descriptor identities into the current boot; old process and cgroup identities remain boot-scoped
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalnamespace_linux.go	prepareJournalDirectory	C+G	linux:internal/hostbox/journalnamespace_linux.go:PrepareRootJournalDirectory	rev3=PROPOSED-p3;identity=offline journal migration and instance-control/adopt startup uid 0;basis=admits only private root-owned authority and held-release alongside existing retire/migration namespaces; every ownership/type/mode check and unknown-directory refusal remains
    plan14_input_inventory_test.go:424: J4	internal/host/heldstage.go	heldStagePass	E2	linux:internal/host/agent.go:runAdoptUnderRootRelease	E23: old held-stage relay forwards the root generation source before artifact writes and outside publication exclusion. Request fields retain their prior hint/authorization checks; only root pins authorize destructive staging on census boxes. No-census source yields empty pins. Fixtures: TestPlan14GenerationLegacyRelay, TestHeldStagePassIsANoOpWithoutRequests, TestHeldStagePassDropsAnUnauthorizedBuild, TestServeHeldStageRequestsRefusesStaleAndTraversal. Production source wiring is inspected; privileged completeness is not claimed.
    plan14_input_inventory_test.go:424: J4	internal/host/proofbinding.go	proofBindingSource.resolve	B3	linux:internal/host/rootupdates.go:productionRootUpdates	fix1;basis=Binds deployment or root-managed named-unit evidence, trusted unit identity and digest history; registry names are hints only.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_startup.go	verifyRootMigrationRetained	F+G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=root claim controller construction uid 0;basis=requires each migrated installation to retain its old-session deny, exact stopped predecessor receipt and complete root inventory
    plan14_input_inventory_test.go:424: J4	internal/host/heldstage.go	heldStageCheck	C+E1	linux:internal/host/heldstage.go:heldStageAuthority	route-and-input;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	digest	E1	linux:internal/historyreadback/readback.go:RequestKey	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_creation.go	RootHistory.FreshInstallation	E1	linux:internal/host/rootgeneration_requirements.go:productionGenerationCreation	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers.
    plan14_input_inventory_test.go:424: J4	internal/release/materializeheld.go	MaterializeHeldUnder	C+E1+E2	linux:internal/host/relocationinstall.go:ClaimAssembly.relocationInstall	root-route;kept=C,E1;scope=protected-decision-only E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/host/relocationinstall.go	ClaimAssembly.relocationBuildAuthority	C+D	linux:internal/host/relocationbuild.go:ClaimAssembly.relocationBuild	Relocation build revalidates operation, captured install stamp, prepared pin and execution participation before writes.
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloor.go	judgePrevWith	F	linux:internal/host/movesfloor.go:rootJudgeMovesPrevWithSource	route-and-input
    plan14_input_inventory_test.go:424: J4	internal/instanceexec/claimexec_linux.go	checkClaimExec	E2	linux:internal/instanceexec/claimexec_linux.go:scopedClaimInit	PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/release/bake.go	LoadFirstSeen	E1+E3	linux:internal/release/adopt.go:PassFilter	root-input
    plan14_input_inventory_test.go:424: J4	internal/provision/rootrecord.go	RecordIndex.Find	B3+C	linux:internal/provision/rootrecord.go:FindRecordByHost	Use cached key identity but read and validate current record body and ETag.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_outcomes.go	RootHistory.recoveryRefusals	E1	linux:internal/release/roothistory.go:RootHistory.Refusals	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerations.go	type RootGenerations	E2	linux:internal/host/rootlaunchverifier.go:rootLaunchVerifier.verify	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals.
    plan14_input_inventory_test.go:424: J4	internal/host/claimbackfill.go	newClaimBackfill	C+G	linux:internal/host/agent.go:instancesLoop	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationStart	E2	linux:internal/host/rootgeneration_kernel_linux.go:generationKernel.controllerGone	E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance.
    plan14_input_inventory_test.go:424: J4	internal/host/claimjournal_migration_linux.go	createClaimEdgeMask	C+G	linux:internal/host/claimjournal_migration_linux.go:quiesceLegacyClaimJournals	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/roleintention_linux.go	LaunchJournal.ResolveRoleIntentions	C	linux:internal/host/claimstop_kernel_linux.go:LinuxStopKernel.resolveRoleIntentions	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	backfillManifestDigest	E2	linux:internal/release/adopt.go:adoptHost	E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/generationinventory.go	RootAuthority.generationInstallation	E2	linux:internal/hostguard/generationinventory.go:RootAuthority.GenerationInstallations	E37: retain independently initialized state-directory and timer requirements in the root installation transaction; preserve them through crash/reopen and rebind. Unknown history cannot certify completeness. Recommit under root-host exclusion before generation use. Canonical record and root retained obligations constrain agent candidate lists; timer enumeration is deny-only. Pre-flight 33, 80, 83. Fixtures: TestPlan14GenerationRequiredArtifacts, TestPlan14GenerationRegistryRows, TestPlan14RootTimerInventory, TestPlan14InventoryRequirementsRegistration, TestPlan14InventoryRequirementsUnknownAndRatchet, TestPlan14InventoryArtifactsCrash, TestPlan14InventoryRequirementsHistoryIdentity. Changed RequiredArtifacts and ExactRetirement root-runner witnesses await acceptance; remaining E2 launch/parked/containment integration is incomplete.
    plan14_input_inventory_test.go:424: J4	internal/host/unitsettle.go	systemdUnits.JournalTail	B3	linux:internal/host/unitsettle.go:settleUnit	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_timers.go	rootMigrationTimers.owner	G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=offline migration root uid 0;basis=derives installation ownership from root-observed host, incarnation, stamp and box, never a service row owner
    plan14_input_inventory_test.go:424: J4	internal/host/relocationattempts.go	relocationAttemptReader.ReadAttempt	C	linux:internal/host/claimlaunch_authority.go:ClaimLaunchRoot.authoritativeAttempt	Root attempt adapter cross-checks operation, executor and holder tuple with fresh claim; agent reservation metadata remains accepted legacy payload within this mixed declaration.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_authorization.go	rootMovesFloors.authorizeReconstruction	F		rev3=PROPOSED-p3;identity=offline root reconstruction capability, uid 0; no production caller installed;basis=issues private nonce capability for this root identity and next generation under stable lock; no production caller
    plan14_input_inventory_test.go:424: J4	internal/host/claimproduction_linux.go	readClaimEvidenceKey	C+G	linux:internal/host/claimproduction.go:ProductionClaimOwnerProvider.OpenClaimOwners	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostguard/guard.go	Guard.Activate	C	linux:internal/host/claimwakeassembly.go:ClaimWakeAssembly.Build	Pending intent and durable quarantine remain denial conditions.
    plan14_input_inventory_test.go:424: J4	internal/provision/reconcile.go	mintHeld	C	linux:internal/provision/reconcile.go:Reconcile	Held-row mint dispatch now reaches root registration for remote landing; exported canonical route construction preserves local legacy behavior.
    plan14_input_inventory_test.go:424: J4	internal/host/agent.go	agentRollbackUnitRestart	B3	linux:internal/host/agent.go:adoptLoop	kept=B3;scope=agent-only-legacy-behavior-preservation;not-root-authority
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_stopped_linux.go	verifyMigrationStopped	G	linux:internal/host/rootmigration_collect_linux.go:migrationStopKernel.RecoverStopped	rev3=PROPOSED-p3;identity=carlos system journal-migrate offline operator uid 0;basis=root checks real proc/cgroup mounts, closed writer journal and absence of cgroups and held inventory descriptors; all observations can only refuse recovery
    plan14_input_inventory_test.go:424: J4	internal/host/claimcensus.go	claimUnitCensus	C+G	linux:internal/host/claimcensus.go:claimGlobalSharedPaths	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimconstruction.go	refusingRootWake	C+G	linux:internal/host/claimassembly.go:ClaimAssembly.Build	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/versionsweep.go	sweepStagedVersions	E2	linux:internal/host/versionsweep.go:sweepStagedVersionsPass	root-route E19: both destructive readers use the root reservation snapshot under existing release exclusion. Exact artifact and containing-tree identities are retained; missing completeness refuses destruction. Production installation/launch/kernel completeness and verified retirement remain unfinished. Fixtures: TestPlan14GenerationDeletionCannotUnpin, TestPlan14GenerationSnapshotCompleteness, TestPlan14GenerationSnapshotPermitsUnreservedRestage, TestPlan14GenerationSnapshotPinsContainingTree, TestPlan14GenerationSnapshotEmptyIsUnknown, TestPlan14GenerationConsumerMode.
    plan14_input_inventory_test.go:424: J4	internal/host/claimrelocationrelease.go	RelocationReleaseReceipts.Complete	C+G	linux:internal/host/relocationreleases.go:verifyDischargedReceipt	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/relocationinstall.go	relocationActivationReader.Read	C	linux:internal/host/rootinstallation.go:rootInstallationHostApp	Activation reader obtains a fresh claim and applies typed relocation installation authority before activation.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/root.go	RootAuthority.write	C+G	linux:internal/hostguard/record_unix.go:recordDir.write	rev3=PROPOSED-p3;identity=carlos instance-control, root control service uid 0; denial views also consumed by carlos agent uid carlos;basis=retains migration denials atomically with the existing root installation, fence and retired-state record
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_pass.go	passConfig.bindProof	E1	linux:internal/release/adopt.go:adoptHost	E1 canonical binding selection and recheck; durable attempt precedes effects; only independent installed observation settles and retires the exact target refusal.
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/ledger.go	Ledger.idle	D	linux:internal/rootparticipation/ledger.go:Ledger.RecoverAcquisition	D3 enumerates root records and requires settled obligations plus an independently supplied launch/kernel census.
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory_readback.go	historyReadbackPublisher.publish	E1	linux:internal/host/roothistory_readback.go:publishRootHistoryReadback	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootseedsfloor_publication.go	type rootSeedsPublication	F	linux:internal/host/rootseedsfloor_publication.go:verifyRootSeedsPublication	rev3=PROPOSED-p3;identity=root normal adopt/apply floor refresh uid 0; local bound readers uid 0;basis=domain-separated signed seeds publication binds deployment and protocol object purpose
    plan14_input_inventory_test.go:424: J4	internal/hostexec/controller.go	Open	D	linux:internal/host/claimparticipation.go:productionClaimLocal.prepareLegacyWith	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/restart.go	restartGenPass	E1+E3	linux:internal/host/restart.go:restartRequestLeg	root-route
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/image_linux.go	Disk.Run	F	linux:internal/host/guardtransaction.go:systemApplier.guardRun	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/restart.go	loadRestartMarks	E1+E3	linux:internal/host/restart.go:restartPass	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration.go	rootMigration.census	G	linux:internal/host/rootmigration.go:rootMigration.run	rev3=PROPOSED-p3;identity=carlos system journal-migrate offline uid 0;basis=writes through Ledger.MigrationCensus under transaction.lock and preserves revisions on completed replay
    plan14_input_inventory_test.go:424: J4	internal/host/rootupdates_runtime.go	prepareRootRetryUnitDirectory	E3	linux:internal/host/claimunit.go:readClaimUnitSettings	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=root unit installer requires an independently opened complete census before creating the public retry directory or enabling its controller write path
    plan14_input_inventory_test.go:424: J4	internal/activator/backend_exec.go	ExecBackend.startSidecarUnitFrom	E2	linux:internal/activator/genbackend.go:ExecBackend.StartSidecarGen	E40: claim-enabled raw backend refuses unsupported direct, placed and legacy-control launches before spawn. Claims-off body unchanged. TestPlan14GenerationBackendDirectBoundary, TestPlan14GenerationBackendControlBoundary, TestPlan14GenerationBackendAuxiliaryBoundary; each guard has an independent behavioral mutation. Agent-side refusal is not root reservation or containment evidence.
    plan14_input_inventory_test.go:424: J4	internal/host/edgesfile.go	edgesFileWriteClaims	F	linux:internal/host/edgesfile.go:edgesFileLoop	root-route;kept=F;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/rootstate/state_linux.go	Open	A	linux:internal/host/movesheldrelease_production.go:WithProductionMovesHeldRelease	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/legacyrestart.go	restartEffectFailed	B3	linux:internal/host/rootrestart.go:restartBoundUnit	E8 merge ruling 5: optional identity failures preserve the same restart outcome; no second restart; real not-up takes main rollback. Fixtures: TestPlan14ERecoveryRestartOutcome, TestPlan14ERecoveryBindingRefusalKeepsPromotedFix, TestPlan14ERecoveryNotUpPrecedesBinding.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_containment_linux.go	generationIdentity	E2	linux:internal/host/rootgeneration_containment_linux.go:generationKernel.containedBinding	PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/host/claimproduction.go	declinedClaimGate	C+G	linux:internal/host/claimmoveaccess.go:claimMoveLaunchSource	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_writers_linux.go	LinuxStopKernel.VerifyNoProcess	C+G	linux:internal/host/rootexecution_settle.go:ClaimRootHTTP.cleanupExecution	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory.go	RootHistory.read	E1	linux:internal/release/roothistory.go:RootHistory.RecordInstalledProgram	Root per-binding refusal/program completeness and pending attempt state; strict decode and exact durable recommit before authority reads. E1 production integration is selected but incomplete.
    plan14_input_inventory_test.go:424: J4	internal/activator/backend_exec.go	ExecBackend.seedUnit	E2	linux:internal/activator/backend_exec.go:ExecBackend.Seed	E40: claim-enabled raw backend refuses unsupported direct, placed and legacy-control launches before spawn. Claims-off body unchanged. TestPlan14GenerationBackendDirectBoundary, TestPlan14GenerationBackendControlBoundary, TestPlan14GenerationBackendAuxiliaryBoundary; each guard has an independent behavioral mutation. Agent-side refusal is not root reservation or containment evidence.
    plan14_input_inventory_test.go:424: J4	internal/host/rootfloor_available.go	rootFloorAvailable	F	linux:internal/host/rootseedsfloor.go:rootSeedsAllowsBinary	rev3=PROPOSED-p3;identity=root system apply/recover candidate checks and carlos.prev floor-allows-prev via seeds gate, uid 0;basis=checks signed current, retained prev and fixed staged candidate; a floor constrains replacement only if a qualifying certified copy is available
    plan14_input_inventory_test.go:424: J4	internal/hostbox/launchjournal.go	LaunchJournal.mutate	C	linux:internal/hostbox/rolelaunch.go:LaunchJournal.CloseWriters	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_boot.go	rootFloorAllowsPrev	F	linux:internal/host/movesfloorgate.go:floorGateMain	rev3=PROPOSED-p3;identity=carlos.prev system floor-allows-prev --root, invoked by root guard selector, uid 0;basis=signed prev identity satisfies local moves and published seeds bounds, relaxed only when no certified build meets bound; caller checks participation separately
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_source.go	readRootProtocolBound	F	linux:internal/host/rootmigration_startup.go:verifyRootMigrationFloors	rev3=PROPOSED-p3;identity=root adopt refresh, root system update/recovery and root guard floor readers, uid 0;basis=reads local root accepted and retained deny state; public-only deny survives missing private history; missing unknown history is not acceptance
    plan14_input_inventory_test.go:424: J4	internal/host/claim_evidence_producer.go	ConfigureStopEvidence	C+G	linux:internal/host/claim_evidence_wiring.go:ClaimOwnerBindings.claimEvidenceCoordinator	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/reconcile_adapter.go	ReconcileAdapter.ownedRow	C	linux:internal/hostbox/reconcile_adapter.go:ReconcileAdapter.Install	Extracted row writer retains complete typed inventory and immutable route identity around guarded write.
    plan14_input_inventory_test.go:424: J4	internal/host/claimowners.go	claimServingOwners.Select	C+G	linux:internal/host/claimconstruction.go:OpenProductionClaimAssembly	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_kernel_linux.go	verifyStopKernelMounts	C+G	linux:internal/host/rootgeneration_census_linux.go:productionGenerationKernelCensus	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostclaim/relocation.go	StartRelocation	C		Relocation start binds verified failover fence, source/target enrollments and authoritative operation tuple; placement choice remains legacy.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_startup.go	verifyRootMigrationStartup	F+G	linux:internal/host/claimconstruction.go:OpenProductionClaimAssembly	rev3=PROPOSED-p3;identity=root claim controller construction uid 0;basis=checks root-owned migration records and typed journal revisions before issuing startup grants; absent census leaves main path intact
    plan14_input_inventory_test.go:424: J4	internal/host/claimready_linux.go	claimProbePeer	B3	linux:internal/host/claimready_linux.go:claimProbeSocketReady	root-input;kept=B3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	stageFrom	E2	linux:internal/release/adopt.go:ensureStagedDigest	E19: both destructive readers use the root reservation snapshot under existing release exclusion. Exact artifact and containing-tree identities are retained; missing completeness refuses destruction. Production installation/launch/kernel completeness and verified retirement remain unfinished. Fixtures: TestPlan14GenerationDeletionCannotUnpin, TestPlan14GenerationSnapshotCompleteness, TestPlan14GenerationSnapshotPermitsUnreservedRestage, TestPlan14GenerationSnapshotPinsContainingTree, TestPlan14GenerationSnapshotEmptyIsUnknown, TestPlan14GenerationConsumerMode, TestPlan14GenerationProductionModeGate, TestPlan14GenerationSnapshotPermitsFreshTree. E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.layoutReversalReasons	F	linux:internal/host/systemapply.go:systemApplier.install	rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=root participation and retained floor contribute refusal reasons before layout reversal
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/ledger.go	Ledger.BeginUpdate	D	linux:internal/host/systemparticipation.go:systemApplier.checkUnarmedParticipationRecovery	Root census and transaction lock exclude acquisition and update; interrupted intents clear only after positive launch completeness.
    plan14_input_inventory_test.go:424: J4	internal/host/restartscope.go	applyRetries	E1+E3	linux:internal/host/restart.go:restartRequestLeg	rev3=PROPOSED-p3;identity=carlos agent retry consumer uid carlos;basis=preserves legacy local retry behavior and relays independently verified root-book retry requests to the existing root adoption marker
    plan14_input_inventory_test.go:424: J4	internal/instanceexec/claim_generation_linux.go	ScopeClaimGeneration	E2	linux:internal/instanceexec/claimexec_linux.go:scopedClaimInit	PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	type RootRestarts	E1	linux:internal/host/rootrestart_requests.go:productionRestartRequestPass	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.restoreVersion	F	linux:internal/host/systemapply.go:systemApplier.recoverIfNeeded	rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=census rollback and recovery completion use signed previous executable identity; legacy sidecar remains only without census
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	buildStates.refreshAll	E3	linux:internal/host/agent.go:fastConvergeLoop	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/movesheldrelease_linux.go	readHeldRenderHash	C+E1	linux:internal/host/movesheldrelease_root.go:movesHeldReleaseRoot.publishRelease	root-input;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_authority.go	ClaimLaunchRoot.authorize	D+E2	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.startRecorded	Both root launch authorizations read root participation and match authenticated peer; TestPlan14ExecutionFinalLaunchUsesRootParticipation. PROPOSED E47: final named-unit launch authorization rechecks the retained root binding and refuses missing, retired, foreign or changed canonical shape.
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart.go	restartVerifiedOrdinaryUnit	B3	linux:internal/host/rootrestart.go:rootRestartRouteWith	rev3=merge-ruling-4;basis=Retain the checked ordinary-unit path for strict census-backed operation.
    plan14_input_inventory_test.go:424: J4	internal/host/recoveryrefusals.go	rootRestartChecks.mintRefusals	B3+E1	linux:internal/host/agent.go:runAdoptUnderRootRelease	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	buildStates.carryRequest	E3	linux:internal/host/buildstate.go:moveCarry	Only the route tenant's consumed request is carried into build state; kept settings and served-history boundary.
    plan14_input_inventory_test.go:424: J4	internal/release/sweep.go	LivePins	B3+E2	linux:internal/host/versionsweep.go:sweepStagedVersions	Pin root previous pointers as well as current pointers so rollback artifacts survive sweeping.
    plan14_input_inventory_test.go:424: J4	internal/host/claimready_other.go	claimProbeSocketReady	B3	darwin:internal/host/claimconstruction.go:claimGroupDWiring	root-route;kept=B3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rolloutdeclined.go	failureHolds.heldHost	E1+E3	linux:internal/host/rolloutdeclined.go:failureHolds.skipHost	root-route
    plan14_input_inventory_test.go:424: J4	internal/release/rootupdates.go	RootUpdateInputs.target	E3	linux:internal/release/adopt.go:settingsTarget	rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0;basis=re-resolves canonical route before selection and persists root request decision before permitting adoption
    plan14_input_inventory_test.go:424: J4	internal/host/agent.go	makeStartRoute	B3	linux:internal/host/agent.go:adoptLoop	root-route;kept=B3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	buildStates.write	E3	linux:internal/host/buildstate.go:buildStates.beforeExec	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rolloutdeclined.go	failureHolds.skipGet	E1+E3	linux:internal/host/agent.go:convergeLegFor	root-route
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	RootRestarts.Observe	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.run	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	type RestartBinding	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.run	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory_creation.go	type rootHistoryAccess	E1	linux:internal/host/claimretire_transport.go:type ClaimRootHTTP	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers.
    plan14_input_inventory_test.go:424: J4	internal/host/movesland.go	landingRun.checking	C	linux:internal/host/movesland.go:landingRun.step	Checking registers through root before reading held row; installation and later guarded work retain exact holder tuple.
    plan14_input_inventory_test.go:424: J4	internal/host/claimwakewriters.go	claimWakeAttempt.StopWriters	C+G	linux:internal/host/claimstop_writers.go:ClaimAssembly.writersStopped	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/rootstate/state_linux.go	descendSync	A	linux:internal/rootstate/state_linux.go:descend	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/movesstage.go	heldReleasePublished	C+E1	linux:internal/host/movesstage.go:heldReleaseHooksVia	root-route;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerations.go	RootGenerations.Check	E2	linux:internal/host/rootgenerations_launch.go:generationLaunchPermit.check	E20: exact reservation closure precedes retirement verification; retained tombstones forbid replay and require sync recommit. Retired records release only their own pins; completeness remains a separate mandatory verifier, still unavailable in production. Fixtures: TestPlan14GenerationRetirementReleasesExactPin, TestPlan14GenerationRetirementRefusals, TestPlan14GenerationClosedReplayRefused, TestPlan14GenerationRetirementProcessCrash, TestPlan14GenerationRetirementKeepsIndependentReference, TestPlan14GenerationClaimsOffRestageMatchesMain.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_parked.go	generationRetirements	E2	linux:internal/host/rootgeneration_parked.go:generationPhysicalPayloads	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=carries root-captured persistent artifact identity through generation retirement inventory
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor.go	rootMovesFloors.record	F	linux:internal/host/rootmovesfloor.go:rootMovesFloors.localBound	rev3=PROPOSED-p3;identity=carlos system apply/recover and root adopt, systemd root units or offline CLI, uid 0;basis=bounded strict private JSON read requires matching deployment, box and enrollment
    plan14_input_inventory_test.go:424: J4	internal/activator/workerbuild.go	Service.startWorker	E2	linux:internal/activator/activator.go:Service.doWake	E39: close the unsupported claimed worker path before backend entry, replacement or supervised stop. Claims-off paths remain unchanged. This is refusal coverage, not positive root-reserved worker launch support. Fixtures: TestPlan14GenerationWorkerStartBoundary, TestPlan14GenerationWorkerRealBackendRefusal, TestPlan14GenerationWorkerReplacementBoundary, TestPlan14GenerationWorkerSupervisionBoundary. Pre-flight 29 and E39 worker launch audit.
    plan14_input_inventory_test.go:424: J4	internal/host/unitsettle.go	systemdUnits.Show	B3	linux:internal/host/agent.go:agentCheckedUnitRestart	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostguard/guard.go	Guard.readLocked	C	linux:internal/hostguard/recoveryfence.go:Guard.PendingFences	Read-only access takes only the root host lock.
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	ResponseKey	E1	linux:internal/historyreadback/readback.go:ReadStatus	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.recoverIfNeeded	F	linux:internal/host/systemapply.go:systemApplier.Run	rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=network-free recovery uses local root floors and rechecks signed image at final forward-completion boundary
    plan14_input_inventory_test.go:424: J4	internal/host/rootfloor_healthy.go	rootMovesFloors.acceptHealthy	F	linux:internal/host/rootfloor_healthy.go:systemApplier.acceptRootFloorHealthy	rev3=PROPOSED-p3;identity=carlos system apply after successful root health gate, uid 0;basis=after successful root health gate, retains highest accepted build and publishes accepted floor only when that build supports it
    plan14_input_inventory_test.go:424: J4	internal/host/rootinventory.go	ClaimRootHTTP.commitRootInventoryPending	E2	linux:internal/host/rootinventory.go:ClaimRootHTTP.withRootInventoryHistory	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=canonicalizes persistent evidence under root exclusion while preserving the original request digest and durable replay
    plan14_input_inventory_test.go:424: J4	internal/host/guardtransaction.go	systemApplier.guardRun	F	linux:internal/host/systemapply.go:systemApplier.onDiskBuild	rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=verifies signed target digest and local retained bounds before executing a version or bootstrap request
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_collect_linux.go	type migrationStopKernel	G	linux:internal/host/rootmigration_collect_linux.go:migrationStopKernel.RecoverStopped	rev3=PROPOSED-p3;identity=carlos system journal-migrate uid 0;basis=root-only offline collector owns checked root journals and managed roots; no legacy candidate can supply inventory authority
    plan14_input_inventory_test.go:424: J4	internal/host/rootupdates.go	rootFailureLegacy	E3	linux:internal/host/rootupdates.go:productionRootUpdates	rev3=PROPOSED-p3;run=8;identity=carlos adopt and offline migration uid 0;basis=bounded legacy byte read feeds only failure tuples and unresolved intents to the root deny importer; no legacy book opener or retry grant
    plan14_input_inventory_test.go:424: J4	internal/host/relocationowners.go	relocationBeforeAdmission	C	linux:internal/host/relocationowners.go:RelocationSource.Open	Before-admission requires certified release or explicitly lost and fenced source; preserves independent claim evidence.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationpins.go	RootGenerations.Reservations	E2	linux:internal/host/rootlaunchverifier.go:rootLaunchVerifier.verify	E23: versioned generation completeness binds exact reservations to independently supplied installation, launch and kernel evidence. Reservation mutations invalidate before commit; every destructive read reconciles again and retries sync. Production reconciliation remains unavailable. Fixtures: TestPlan14GenerationCompleteness, TestPlan14GenerationCompletenessInvalidation, TestPlan14GenerationCompletenessDurability, TestPlan14GenerationCompletenessCertificateSyncFailure, TestPlan14GenerationCompletenessPinConsumer, TestPlan14GenerationCompletenessProcessCrash; TestPlan14GenerationCompletenessCheckedRootStore passed on the E25 root runner.
    plan14_input_inventory_test.go:424: J4	internal/host/claimconstruction.go	OpenProductionClaimAssembly	G	linux:internal/host/claimconstruction.go:ensureProductionClaimAssembly	rev3=PROPOSED-p3;identity=root claim controller construction uid 0;basis=verifies complete retained migration and typed inventories before constructing claim authority on a census box; no census preserves prior path
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart.go	rootStartRoute	B3	linux:internal/host/agent.go:runAdoptUnderRootRelease	rev3=merge-ruling-4;basis=Use main systemctl start for legacy non-NotUp recovery while retaining checked rollback when authority binds.
    plan14_input_inventory_test.go:424: J4	internal/instancectl/claimexec_socket_linux.go	claimListenExecSocket	C+G	linux:internal/instancectl/claimexec.go:ClaimUnits.prepareExecGate	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/consumedfence.go	publishConsumed	E3	linux:internal/release/adopt.go:settingsTarget	root-route;kept=E3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/rootstate/persistent_linux.go	Persistent	A+E2	linux:internal/host/claimassembly.go:NewProductionRootClaimStop	rev3=PROPOSED-p3;run=8;identity=root generation capture and verification uid 0;basis=captures filesystem ID, export handle, boot, inode, ownership and stable mount attachment from caller-checked descriptor;rev3=PROPOSED-p3;run=8;identity=root generation capture and verification uid 0;basis=captures filesystem ID, export handle, boot, inode, ownership and stable mount attachment from caller-checked descriptor
    plan14_input_inventory_test.go:424: J4	internal/activator/activator.go	Service.respawnWorkerLocked	E2	linux:internal/activator/activator.go:Service.convergeWorkerLocked	E39: close the unsupported claimed worker path before backend entry, replacement or supervised stop. Claims-off paths remain unchanged. This is refusal coverage, not positive root-reserved worker launch support. Fixtures: TestPlan14GenerationWorkerStartBoundary, TestPlan14GenerationWorkerRealBackendRefusal, TestPlan14GenerationWorkerReplacementBoundary, TestPlan14GenerationWorkerSupervisionBoundary. Pre-flight 29 and E39 worker launch audit.
    plan14_input_inventory_test.go:424: J4	internal/hostrelocate/worker.go	Worker.ConvertLanding	C	linux:internal/host/relocatepass.go:convertFencedLanding	Landing conversion requires verified local worker and termination-fence authority before claim conversion.
    plan14_input_inventory_test.go:424: J4	internal/host/rootseedsfloor.go	systemApplier.rootProtocolAllowsBinary	F	linux:internal/host/systemapply.go:systemApplier.install	rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=final installation restore or forward-completion checks signed image against both local root bounds while activation locks are held
    plan14_input_inventory_test.go:424: J4	internal/release/rootupdates.go	RootUpdateInputs.routes	E3	linux:internal/release/adopt.go:PassFilter	rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0;basis=uses registry hostname only as selector and replaces protected dispatch fields with independently resolved root inputs
    plan14_input_inventory_test.go:424: J4	internal/hostbox/reconcile.go	Reconciler.Install	C	linux:internal/hostbox/reconcile_adapter.go:ReconcileAdapter.Install	root installation and fence authority; registration and recovery; agent RPC lock ordering
    plan14_input_inventory_test.go:424: J4	internal/release/proofgate.go	ProofGate.bind	B3	linux:internal/release/roothistory_pass.go:passConfig.bindProof	root-route;kept=B3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/rootstate/authorityfile_other.go	OpenAuthorityFile	E2	darwin:internal/host/rootmovesfloor_boot.go:rootFloorJournalPresent	E33: census-only generation journal reads accept private root-owned ancestry without chmod or repair. Every ancestor remains descriptor-checked, root-owned and non-writable by group/other; leaves remain single-link regular root-owned files, checked for DB/WAL/SHM. Public-file callers remain unchanged. Fixtures: TestPlan14AuthorityFilePrivateAncestors, TestPlan14AuthorityFileAbsoluteBoundary; TestPlan14GenerationPrivateJournalRootRunner and TestPlan14GenerationRequiredArtifactsRootRunner are runner-pending. Pre-flight 76, 78, 82 and 89.
    plan14_input_inventory_test.go:424: J4	internal/rollout/failures.go	FailureBook.markLocked	E1+E3	linux:internal/rollout/rootfailures.go:RootFailures.ImportLegacy	fix1-merge-review;basis=Advances durable app restriction generations so old grants cannot clear new failures.
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/ledger.go	Ledger.Census	D	linux:internal/rootparticipation/production.go:Ledger.ActivationReady	Root census and transaction lock exclude acquisition and update; interrupted intents clear only after positive launch completeness.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_retirement.go	type generationRetirement	E2	linux:internal/host/rootgeneration_retirement.go:productionRetireGenerations	E21: release then host exclusion; root installation and exact settled launch with irreversibly closed writers bind retirement before and after independent kernel verification. Production invokes it from the census-only pin source. Fixtures: TestPlan14GenerationRetirementRootBinding, TestPlan14GenerationRetirementAfterLostStarted, TestPlan14GenerationRetirementBindingProcessCrash, TestPlan14GenerationRetirementCensusGate. Privileged production opener acceptance remains pending.
    plan14_input_inventory_test.go:424: J4	internal/host/claimhandover_recovery.go	claimCrossBoxHandover.recoveryEvidence	C+G	linux:internal/host/claimhandover_recovery.go:claimCrossBoxHandover.afterRecovery	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/relocatepass.go	RelocationRuntime.once	C+D	linux:internal/host/relocatepass.go:RelocationRuntime.Run	Agent pass re-reads claims around participant/worker effects and typed completion; unrelated journal sweep remains legacy.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_census_other.go	productionGenerationKernelCensus	E2	darwin:internal/host/rootlaunchverifier.go:registerProductionLaunchVerifier	E24: independent root installation and launch enumeration, exact reservation reconciliation and fresh quiescent whole-version-tree kernel census; missing sources, open unreserved launches, foreign namespaces and uncontained tasks refuse. Production pin source certifies this evidence before returning pins. Fixtures: TestPlan14GenerationInventoryCompleteness, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationInventoryLifecycle, TestPlan14GenerationInventoryProcessCrash, TestPlan14GenerationKernelCensusUnknownReference, TestPlan14GenerationLaunchInventory, TestPlan14GenerationReaderDoesNotInitialize, TestPlan14GenerationInstallationInventory. Checked production source/kernel witnesses passed on the E27 root runner. E29 physical-payload and installed-unit witnesses passed on the controller runner; E30 required-artifact witness pending.
    plan14_input_inventory_test.go:424: J4	internal/host/rootinventory_requirements.go	generationRetainedTimers	E2	linux:internal/host/rootgeneration_requirements.go:generationLocalObligations	E37: retain independently initialized state-directory and timer requirements in the root installation transaction; preserve them through crash/reopen and rebind. Unknown history cannot certify completeness. Recommit under root-host exclusion before generation use. Canonical record and root retained obligations constrain agent candidate lists; timer enumeration is deny-only. Pre-flight 33, 80, 83. Fixtures: TestPlan14GenerationRequiredArtifacts, TestPlan14GenerationRegistryRows, TestPlan14RootTimerInventory, TestPlan14InventoryRequirementsRegistration, TestPlan14InventoryRequirementsUnknownAndRatchet, TestPlan14InventoryArtifactsCrash, TestPlan14InventoryRequirementsHistoryIdentity. Changed RequiredArtifacts and ExactRetirement root-runner witnesses await acceptance; remaining E2 launch/parked/containment integration is incomplete.
    plan14_input_inventory_test.go:424: J4	internal/registry/registry.go	Registry.Upsert	E3	linux:cli.go:runAdd	rev3=census-ruling-seeded-instances;basis=the registry's SQLite side, as carlos: in the agent (/opt/carlos/carlos agent, carlos-edge.service) and in the registry child (carlos __registry-child, which a root pass forks as the service user); the remote arm, unchanged, in the process that holds a remote handle, root passes included: main's body with its insert defaults moved to normalizeRoute and its bind list to routeArgs, and two columns added (seed_source, import_gate); the conflict clause, with the tenant-change rule E3 names, is unchanged; main's E3 authority retained
    plan14_input_inventory_test.go:424: J4	internal/host/movesheldrelease_root.go	movesHeldReleaseRoot.publishRelease	C+E1+E2	linux:internal/host/movesheldrelease_root.go:movesHeldReleaseRoot.Serve	Replay and publication re-enter selected root guard and fresh canonical binding; receipt persistence remains inside guarded callback. E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.
    plan14_input_inventory_test.go:424: J4	internal/host/guardarm.go	guardArmIdle	F	linux:internal/host/guardarm.go:RunSystemGuardArm	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostexec/pending_linux.go	controllerProcessStart	D	linux:internal/hostexec/rootprocess_linux.go:ControllerAlive	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/image_other.go	Disk.Exec	F	darwin:internal/host/guardexec.go:RunSystemGuardExec	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostclaim/relocation_probestop.go	RecordProbeStop	C	linux:internal/hostrelocate/participant.go:Participant.Step	Probe-stop transition binds exact passed session and immutable receipt reference for later root handover verification.
    plan14_input_inventory_test.go:424: J4	internal/host/proofbinding.go	proofBindingSource.recovered	B3+E1	linux:internal/host/rootrestart.go:productionRootRestartChecks	Signed named-unit recovery is independent of release and health history. Root rechecks canonical source, unit, process, signed target and trusted live pointer; captures attempt authority before publication; verifies readiness and resumes without repeated effects. Fixtures: TestPlan14SignedActiveFixIgnoresHistory, TestPlan14SignedActiveFixAuthority, TestPlan14SignedFixSupersedesOlderAttempt, TestPlan14ActiveRecoveryProcessCrash, TestPlan14SignedRestartWithoutHealthHistory, TestPlan14CapturedRollbackWithoutHealthHistory, TestPlan14SignedRestartRequiresTrustedLiveLink.
    plan14_input_inventory_test.go:424: J4	internal/host/restartscope.go	bounceScopedRoutes	E1+E3	linux:internal/host/restart.go:restartRequestLeg	root-route
    plan14_input_inventory_test.go:424: J4	internal/hostexec/probe_unix.go	probeExisting	D	linux:internal/hostexec/probe_unix.go:probeLifetime	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/recoveryrefusals.go	recoveryHistoryOutcome	E1	linux:internal/host/roothistory_recovery.go:rootRestartChecks.settleHistory	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/recoveryrefusals.go	checkUnresolvedRecoveries	E1	linux:internal/host/recoveryrefusals.go:rootRestartChecks.retainRecoveryHistory	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_retirement.go	historyRecoveryDigest	E1	linux:internal/release/roothistory_delivery.go:RootHistory.ReceiveRecoveryRetirements	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	RootRestarts.Fail	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.consume	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	newBuildStates	E3	linux:internal/host/agent.go:runAgent	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootreleaselock.go	withClaimReleaseCensus	E2	linux:internal/host/rootreleaselock.go:withClaimRootRelease	PROPOSED E45: root enforces census-gated release ordering, bounded acquisition and scoped recovery; registry timer primitives preserve supplied identity but producer integration remains pending.
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_kernel_linux.go	scanStopDescriptors	C+G	linux:internal/host/claimstop_kernel_linux.go:LinuxStopKernel.RecoverStopped	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/disk.go	UpdateIdle	F	linux:internal/host/claimreport.go:claimReport	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/image_linux.go	Disk.Exec	F	linux:internal/host/guardexec.go:RunSystemGuardExec	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootexecution_migration.go	ClaimRootHTTP.executionAuthorityWithMigration	D	linux:internal/host/rootexecution_runtime.go:newClaimExecutionRuntime	Root participation census supplies migration generation; TestPlan14ExecutionMigrationIsIndependent and TestPlan14ExecutionPreinstallationBindsMigration.
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/production.go	OpenForUpdate	D	linux:internal/host/claimstop_run.go:RunInstanceControl	Unactivated absent census does not block update or recovery; retained census remains authoritative.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationTaskFDs	E2	linux:internal/host/rootgeneration_kernel_linux.go:generationKernel.task	E25: keep the descriptor-listing handle open through inspection, including when scanning the current process. Check every listed descriptor against paths and artifact identities. Fixtures: TestPlan14GenerationKernelOwnDescriptors and TestPlan14GenerationKernelReferences. Root-runner acceptance passed at E27: TestPlan14GenerationKernelCensusRootRunner and TestPlan14GenerationKernelRetirementRootRunner.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerations.go	type GenerationOwner	E2	linux:internal/host/rootgeneration_inventory.go:generationReconciler.reconcile	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals.
    plan14_input_inventory_test.go:424: J4	internal/host/claimhandover_recovery.go	claimCrossBoxHandover.installRecoveryInventory	C+G	linux:internal/host/claimhandover_recovery.go:claimCrossBoxHandover.afterRecovery	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimmovefence.go	claimBoxFenceVerifier	C+G	linux:internal/host/claimassembly.go:ClaimAssembly.Build	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostexec/controller.go	Controller.authority	D	linux:internal/hostexec/controller.go:Open	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_app.go	RootHistory.AppRefusals	E1	linux:internal/release/roothistory_app.go:RootHistory.MintRefusals	E1 retains independently recorded outcomes in private history before minting/reconstruction. Failure bits never clear by replay, ambiguous attempts remain restrictive, and signed reconstruction cannot erase them. Fixtures: TestPlan14IndependentRecoveryRetainsMintBarrier, TestPlan14IndependentRecoveryRecordsHistory, TestPlan14HistoryRetainsRecoveryOutcomes, TestPlan14HistoryRecoveryCannotWeaken, TestPlan14HistoryReconstructionKeepsRecovery, TestPlan14HistoryRecoveryProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory_creation.go	productionCreationHistory	E1	linux:internal/host/claimlaunch_production.go:WithProductionClaimLaunch	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers. PROPOSED E45: root enforces census-gated release ordering, bounded acquisition and scoped recovery; registry timer primitives preserve supplied identity but producer integration remains pending.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerations.go	validGeneration	E2	linux:internal/release/rootgenerationpins.go:RootGenerations.Reservations	E20: exact reservation closure precedes retirement verification; retained tombstones forbid replay and require sync recommit. Retired records release only their own pins; completeness remains a separate mandatory verifier, still unavailable in production. Fixtures: TestPlan14GenerationRetirementReleasesExactPin, TestPlan14GenerationRetirementRefusals, TestPlan14GenerationClosedReplayRefused, TestPlan14GenerationRetirementProcessCrash, TestPlan14GenerationRetirementKeepsIndependentReference, TestPlan14GenerationClaimsOffRestageMatchesMain.
    plan14_input_inventory_test.go:424: J4	internal/host/claimconstruction.go	claimConstructionProcessStart	C+G	linux:internal/host/claimconstruction.go:OpenProductionClaimAssembly	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/hold.go	RegistryHoldPolicy	C	linux:internal/host/claimassembly.go:ClaimAssembly.Build	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_root.go	ClaimLaunchRoot.launchRecord	C+E2+G	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.launchLocked	root-input;kept=C,G;scope=protected-decision-only PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.
    plan14_input_inventory_test.go:424: J4	internal/caps/converge.go	Ops.checkClaimsOnDisk	E4	linux:internal/caps/converge.go:Converge	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostbox/inventory_expected.go	StopInventoryDB.SnapshotRequest	C	linux:internal/host/rootinventory.go:ClaimRootHTTP.commitRootInventoryPending	Expose inventory revision and LastRequest for exact root commit recovery after receipt pruning.
    plan14_input_inventory_test.go:424: J4	internal/host/relocationeffects.go	RelocationEffects.EnsureLocal	C	linux:internal/hostrelocate/participant.go:Participant.Step	Installation repair compares authoritative local-install receipt, exact box/enrollment/stamp and re-verifies materialization.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_census_linux.go	checkedGenerationTree	E2	linux:internal/host/rootgeneration_census_linux.go:productionGenerationKernelCensus	E24: independent root installation and launch enumeration, exact reservation reconciliation and fresh quiescent whole-version-tree kernel census; missing sources, open unreserved launches, foreign namespaces and uncontained tasks refuse. Production pin source certifies this evidence before returning pins. Fixtures: TestPlan14GenerationInventoryCompleteness, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationInventoryLifecycle, TestPlan14GenerationInventoryProcessCrash, TestPlan14GenerationKernelCensusUnknownReference, TestPlan14GenerationLaunchInventory, TestPlan14GenerationReaderDoesNotInitialize, TestPlan14GenerationInstallationInventory. Checked production source/kernel witnesses passed on the E27 root runner. E29 physical-payload and installed-unit witnesses passed on the controller runner; E30 required-artifact witness pending. PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/recoveryfence.go	Guard.PendingFences	C	linux:internal/host/claimstop_recovery.go:ClaimStopHTTP.RecoverPending	Root-only read lock avoids an agent-held legacy lock at startup.
    plan14_input_inventory_test.go:424: J4	internal/host/claimunit_binding_source.go	readClaimUnitShapes	E2		PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.
    plan14_input_inventory_test.go:424: J4	internal/host/heldstage.go	heldStageAuthority	C+E1	linux:internal/host/heldstage.go:heldStagePass	route-and-input;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_source.go	rootFloorLegacy	F	linux:internal/host/rootmovesfloor_source.go:refreshRootMovesFloor	rev3=PROPOSED-p3;identity=carlos adopt and system apply refresh, uid 0; no recovery or boot-selector call;basis=selects existing moves mirror paths for denial-only generic legacy reader
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.verifyPointer	F	linux:internal/host/systemapply.go:systemApplier.Run	rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=signed pointer verified and independently cached for census target execution before earlier history exists
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journaltrust_linux.go	readTrustedJournal	C	linux:internal/hostbox/coldhandover.go:ColdHandover.Recover	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostclaim/relocating.go	ConvertCommittedLanding	C	linux:internal/hostrelocate/worker.go:Worker.ConvertLanding	Committed landing conversion verifies exact target termination fence and record commit before transferring installation authority.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/rootmigration.go	RootAuthority.RetainMigrationDeny	C+G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=carlos system journal-migrate, offline operator CLI, uid 0;basis=root retains old incarnation/stamp/session denial under stable per-host lock; grants no launch authority
    plan14_input_inventory_test.go:424: J4	internal/host/updatesroot.go	updatesPassOption	E3	linux:internal/host/agent.go:adoptLoop	rev3=PROPOSED-p3;run=8;identity=root adopt uid 0; unchanged agent opener uid carlos;basis=installs census-only root input provider while preserving the legacy failure-book opener for nonparticipating passes
    plan14_input_inventory_test.go:424: J4	internal/host/movesfinal.go	sourceFinal.parkLocal	C	linux:internal/host/movesfinal.go:sourceFinal.run	root installation/fence backend and lock-free agent projection; establishment blocked; draft incomplete
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_replace.go	replacementReconstruction	E1	linux:internal/release/roothistory_reconstruct.go:RootHistory.Reconstruct	Signed replacement binds the exact pending digest and current sources/revisions; old intended refusals and hold bounds remain restrictive. Fixtures: TestPlan14ReconstructionReplacement, TestPlan14ReconstructionReplacementCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_census_linux.go	productionGenerationKernelCensus	E2	linux:internal/host/rootlaunchverifier.go:registerProductionLaunchVerifier	E24: independent root installation and launch enumeration, exact reservation reconciliation and fresh quiescent whole-version-tree kernel census; missing sources, open unreserved launches, foreign namespaces and uncontained tasks refuse. Production pin source certifies this evidence before returning pins. Fixtures: TestPlan14GenerationInventoryCompleteness, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationInventoryLifecycle, TestPlan14GenerationInventoryProcessCrash, TestPlan14GenerationKernelCensusUnknownReference, TestPlan14GenerationLaunchInventory, TestPlan14GenerationReaderDoesNotInitialize, TestPlan14GenerationInstallationInventory. Checked production source/kernel witnesses passed on the E27 root runner. E29 physical-payload and installed-unit witnesses passed on the controller runner; E30 required-artifact witness pending. PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_writers.go	ClaimStopCoordinator.WritersStopped	C+G	linux:internal/host/claimstop_writers.go:ClaimStopHTTP.serveWritersStopped	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/materializeheld.go	restoreLive	C+E1	linux:internal/release/materializeheld.go:publishHeld	root-route;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/safefile/file_linux.go	writeAt	A+F+G	linux:internal/safefile/file_linux.go:Write	rev3=PROPOSED-p3;identity=checked filesystem callers including root control/apply/migration uid 0;basis=production wrapper always invokes each real syscall operation
    plan14_input_inventory_test.go:424: J4	internal/hostbox/reconcile_adapter.go	ReconcileAdapter.MintHeldUnder	C	linux:internal/host/relocationinstall.go:ClaimAssembly.relocationInstall	Remote held mint registers outside selected work, revalidates under work and checks exact held-row ownership.
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/disk.go	Disk.Begin	D	linux:internal/host/guardtransaction.go:systemApplier.beginGuard	Claims-on or retained root census uses root exclusion; claims-off with no census preserves main participation and recovery behavior. PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner.
    plan14_input_inventory_test.go:424: J4	internal/rootstate/state_linux.go	directory.Read	A	linux:internal/rootparticipation/production.go:OpenForUpdate	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloor.go	readBeneathLine	F	linux:internal/host/movesfloor.go:syncLocalFloor	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/restartscope.go	restartScopePass	E1+E3	linux:internal/host/restart.go:restartRequestLeg	fix1-merge-review;basis=Hands historical signed retry entries to the common verifier; unknown selectors do not widen scope.
    plan14_input_inventory_test.go:424: J4	internal/host/rootroute.go	sameProofCandidate	B3	linux:internal/host/proofbinding.go:proofBindingSource.resolve	canonical record/unit/executable authority and one-attempt rollback; draft incomplete
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	RunSystemApply	D+F	linux:system.go:runSystem	rev3=PROPOSED-p3;identity=carlos system apply/recover root systemd units uid 0;basis=registers local launch verifier and delegates to the census-gated outer release wrapper while retaining local root floor checks and main no-census path
    plan14_input_inventory_test.go:424: J4	internal/release/materializeheld.go	VerifyHeldLiveUnder	C+E1	linux:internal/host/relocationinstall.go:ClaimAssembly.relocationInstall	Under-lock held verification enforces claim-aware shape and delegates root proof validation.
    plan14_input_inventory_test.go:424: J4	internal/host/rootrollback_resume.go	resumeRootRestart	B3+E1	linux:internal/host/rootrollback_resume.go:recoverRootRestarts	Signed named-unit recovery is independent of release and health history. Root rechecks canonical source, unit, process, signed target and trusted live pointer; captures attempt authority before publication; verifies readiness and resumes without repeated effects. Fixtures: TestPlan14SignedActiveFixIgnoresHistory, TestPlan14SignedActiveFixAuthority, TestPlan14SignedFixSupersedesOlderAttempt, TestPlan14ActiveRecoveryProcessCrash, TestPlan14SignedRestartWithoutHealthHistory, TestPlan14CapturedRollbackWithoutHealthHistory, TestPlan14SignedRestartRequiresTrustedLiveLink.
    plan14_input_inventory_test.go:424: J4	internal/hostexec/rootread.go	ReadRoot	D	linux:internal/host/rootexecution_read.go:readRootExecution	fix1;basis=Queries broker OFD lock ownership without acquiring a lock; rechecks unchanged durable evidence and monotonic expiry.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_refresh.go	rootFloorJudge.refresh	F	linux:internal/host/rootmovesfloor_refresh.go:rootRefreshAndJudgeMovesPrev	rev3=PROPOSED-p3;identity=carlos system apply/recover and root adopt, systemd root units or offline CLI, uid 0;basis=refreshes retained floor before signed current/previous judgement, even when previous is absent
    plan14_input_inventory_test.go:424: J4	internal/host/movespass.go	movesWorker.liftFences	C	linux:internal/host/movespass.go:movesPass	root-route;kept=C;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/systemapply.go	systemApplier.notePrev	F	linux:internal/host/systemapply.go:systemApplier.decidePrev	rev3=PROPOSED-p3;identity=carlos system apply, root update unit or offline root CLI, uid 0;basis=writes prev then judges both signed protocol identities under root floor authority on census boxes
    plan14_input_inventory_test.go:424: J4	proof_cli.go	runProof	E1	linux:main.go:main	E17: operator saves exact signed authorization and challenge before delivery, resumes without renewal, and verifies enrolled-root exact completion. Existing proof branches are unchanged. Tests: TestPlan14HistoryOperatorWorkflow, TestPlan14HistoryOperatorConflicts, TestPlan14HistoryOperatorExactCompletion, TestPlan14HistoryWorkflowProcessCrash, TestPlan14HistoryCommandResume, TestPlan14HistorySavedFiles, TestPlan14HistoryCLIDispatch.
    plan14_input_inventory_test.go:424: J4	internal/host/rootinstallation.go	rootInstallationHostApp	E2	linux:internal/host/claimstop_run.go:RunInstanceControl	E20: read the atomic root installation under the existing host exclusion without recursive lock acquisition; retain fresh claim, canonical record, signed artifact and final reservation checks. Fixtures: TestPlan14GenerationLaunchDoesNotReenterRootLock, TestPlan14GenerationLaunchRefusals, TestPlan14RootDispatchRejectsRegistryMutation.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/migration_census_linux.go	CheckMigrationRoots	G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=checks retained materialized roots against persistent filesystem evidence before census migration accepts coverage
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/transaction.go	TransactionLedger	D+F	linux:internal/host/rootmovesfloor_refresh.go:rootFloorDowngradeIdle	rev3=PROPOSED-p3;identity=root system apply/recover uid 0;basis=returns only an active root-minted held ledger; stale and cancelled scopes refuse
    plan14_input_inventory_test.go:424: J4	internal/host/relocationhandover.go	relocationCompletedHandover.completedPrior	C	linux:internal/host/claimhandover_crossbox.go:wireCompletedHandover	Completed handover binds authoritative completed stop, session, generation and stamp to current serving writer.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/launchjournal.go	LaunchJournal.Create	C	linux:internal/hostbox/launchjournal.go:LaunchJournal.Prelaunch	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootinventory_state_linux.go	ClaimRoleAssembly.prepareStateInventory	C	linux:internal/host/rootinventory_state_linux.go:ClaimRoleAssembly.prepareStateRemote	rev3=PROPOSED-p3;identity=carlos agent claim lifecycle uid carlos; final authorization remains in root;basis=uses root-supplied persistent state identity for remote inventory reuse while keeping agent proposals non-authoritative
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/completion.go	ReadReconstruction	E1	linux:internal/historyreadback/workflow.go:Operation.Read	Exact completion binds the accepted authorization digest from durable private history to enrolled-root signed readback. Pending originals, changed evidence and canonical sources cannot supply retirement completion. Fixtures: TestPlan14HistoryReconstructionCompletion, TestPlan14HistoryRetirementCompletion, TestPlan14ReadReconstructionCompletion, TestPlan14ReadRetirementCompletion, TestPlan14RecoveryRetirementProductionCallback, TestPlan14RootHistoryReconstructionCrash, TestPlan14HistoryRetirementProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/claimmoveaccess.go	claimMoveReadAccess.selected	C+G	linux:internal/host/claimmoveaccess.go:claimMoveReadWork.With	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/moveswakesource.go	movesWakeSources.Open	B2+C	linux:internal/host/claimproduction.go:ProductionClaimOwnerProvider.OpenClaimOwners	Moves owner source wires authenticated root relay and root healthy-history proof gate with verified actor.
    plan14_input_inventory_test.go:424: J4	internal/host/rootexecution_read.go	rootExecutionRead	D	linux:internal/host/rootexecution_read.go:productionClaimLocal.checkRootParticipation	Production root observer selects the descriptor-checked participation reader.
    plan14_input_inventory_test.go:424: J4	internal/host/rootinventory_identity.go	ClaimRootHTTP.bindInventoryPaths	C+E2	linux:internal/host/rootinventory.go:ClaimRootHTTP.commitRootInventoryPending	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=discards all caller-supplied persistent evidence and captures or revalidates it independently against the retained root inventory
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_execpermit.go	ClaimLaunchRoot.execPermit	D	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.launchLocked	Root participation bounds the executable permit; TestPlan14ExecutionFinalLaunchUsesRootParticipation covers initial and final checks. PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journaltrust_linux.go	checkTrustedJournalDir	C	linux:internal/hostbox/reconcile_adapter.go:ReconcileAdapter.Retire	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostbox/wakepolicy.go	Policy.check	C	linux:internal/hostbox/wakepolicy.go:Policy.Check	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/restartscope.go	execBounceable	E1+E3	linux:internal/host/restart.go:bounceExecRoutes	root-route
    plan14_input_inventory_test.go:424: J4	internal/hostclaim/relocation.go	CompleteRelocation	C	linux:internal/hostrelocate/worker.go:Worker.Step	Completion requires stopped probe and retains exact stop reference for successor cold handover while queuing prior installations for retirement.
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_kernel_linux.go	LinuxStopKernel.readContainedJournal	C+G	linux:internal/host/claimstop_kernel_linux.go:LinuxStopKernel.RecoverStopped	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/empty_census.go	EmptyInstallationCensus.checkLocal	C+G	linux:internal/hostbox/empty_census.go:EmptyInstallationCensus.CheckLocal	Complete local census retains absence checks and only excludes explicitly root-registered row during crash recovery.
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	type Receipt	E1	linux:internal/historyreadback/workflow.go:Operation.Read	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/proofbinding.go	productionProofBindingSource	B3	linux:internal/host/rootupdates.go:productionRootUpdates	rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=enables persistent unit-file identity only for the census-required root proof path
    plan14_input_inventory_test.go:424: J4	internal/hostbox/inventory_registration.go	ReconcileAdapter.CaptureInventory	C	linux:internal/hostbox/inventory_registration.go:ReconcileAdapter.RegisterLanding	root installation and fence authority; registration and recovery; agent RPC lock ordering
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_containment_linux.go	generationKernel.containedTask	E2	linux:internal/host/rootgeneration_kernel_linux.go:generationKernel.task	PROPOSED E45: root uses retained reservation identities and live kernel containment checks; unrecognized processes still refuse. Current positive root acceptance requires rerun after proc-mount tightening.
    plan14_input_inventory_test.go:424: J4	internal/host/claimroleassembly.go	ClaimRoleAssembly.PreflightLaunch	C+G	linux:internal/host/claimwakeassembly.go:ClaimWakeAssembly.Build	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalmigration_linux.go	legacyJournalFiles	C	linux:internal/hostbox/journalmigration_linux.go:JournalService.MigrateLegacy	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/pins.go	readGenerationsSeq	E2	linux:internal/release/pins.go:ReadGenerations	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationpins.go	type RootGenerationPins	E2	linux:internal/host/rootmovesfloor_refresh.go:rootFloorDowngradeIdle	E23: versioned generation completeness binds exact reservations to independently supplied installation, launch and kernel evidence. Reservation mutations invalidate before commit; every destructive read reconciles again and retries sync. Production reconciliation remains unavailable. Fixtures: TestPlan14GenerationCompleteness, TestPlan14GenerationCompletenessInvalidation, TestPlan14GenerationCompletenessDurability, TestPlan14GenerationCompletenessCertificateSyncFailure, TestPlan14GenerationCompletenessPinConsumer, TestPlan14GenerationCompletenessProcessCrash; TestPlan14GenerationCompletenessCheckedRootStore passed on the E25 root runner.
    plan14_input_inventory_test.go:424: J4	internal/host/rootupdates_runtime.go	beginRootGenerationUpdate	E2+E3	linux:internal/host/rootgenerations_launch.go:productionRootGenerations	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=opens census-only root update authority, resolves the canonical host and refuses a known failure before runtime intent
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	buildStateRegions	E3	linux:internal/host/buildstate.go:newBuildStates	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_run.go	instanceRegistryHostApp	C+G	linux:internal/host/claimstop_run.go:RunInstanceControl	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	publish	E1	linux:internal/historyreadback/workflow.go:Operation.Deliver	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/release/adopt.go	PassFilter	B3+E1+E2+E3	linux:internal/release/adopt.go:Pass	Signed named-unit recovery is independent of release and health history. Root rechecks canonical source, unit, process, signed target and trusted live pointer; captures attempt authority before publication; verifies readiness and resumes without repeated effects. Fixtures: TestPlan14SignedActiveFixIgnoresHistory, TestPlan14SignedActiveFixAuthority, TestPlan14SignedFixSupersedesOlderAttempt, TestPlan14ActiveRecoveryProcessCrash, TestPlan14SignedRestartWithoutHealthHistory, TestPlan14CapturedRollbackWithoutHealthHistory, TestPlan14SignedRestartRequiresTrustedLiveLink. E7 applies merge ruling 4: unbound no-census routes use the legacy pass and restart; ordinary candidates make no binding store call. Fixtures: TestR2UnguardedERecoveryUpdate, TestR2UnguardedERecoveryIncidentRecipe, TestPlan14ERecoveryBindingRefusalKeepsPromotedFix. E19: both destructive readers use the root reservation snapshot under existing release exclusion. Exact artifact and containing-tree identities are retained; missing completeness refuses destruction. Production installation/launch/kernel completeness and verified retirement remain unfinished. Fixtures: TestPlan14GenerationDeletionCannotUnpin, TestPlan14GenerationSnapshotCompleteness, TestPlan14GenerationSnapshotPermitsUnreservedRestage, TestPlan14GenerationSnapshotPinsContainingTree, TestPlan14GenerationSnapshotEmptyIsUnknown, TestPlan14GenerationConsumerMode.;rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0; legacy agent pass uid carlos;basis=resolves protected route inputs before filters, recovery and dispatch on census boxes and bypasses service-owned failure opener only there
    plan14_input_inventory_test.go:424: J4	internal/host/relocatepass.go	newCompletionRuntime	C+D	linux:internal/host/relocatepass.go:NewRelocationRuntime	Completion-only runtime treats registry and journal hostnames as discovery and verifies claim and bound identity before discharge.
    plan14_input_inventory_test.go:424: J4	internal/release/signedhead.go	StageSignedHead	E1	linux:internal/host/namedrecovery_active.go:namedUnitRecovery.recover	Canonical route is supplied by the root unit verifier. Verifies signed channel, digest ratchet and manifest/artifact before staging; unavailable pin census never authorizes restaging differing bytes. Fixtures: TestPlan14Incident20261006WithLedger and TestPlan14SignedNamedRecoveryAuthority.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_parked.go	generationReadRetirements	E2	linux:internal/host/rootgeneration_parked.go:productionGenerationRetirements	E38: reconcile completed root retirement against the retained stop receipt and exact inventory; inspect parked identities, require retired rows absent or an independently inventoried successor, and retain generation pins. Fixtures: TestPlan14GenerationParkedPayload, TestPlan14GenerationParkedCrash, TestPlan14GenerationParkedKeepsReservation, TestPlan14GenerationParkedReadback; TestPlan14GenerationParkedRootRunner is runner-pending. Timer producer matches retained entries once and preserves successors on replay: TestPlan14GenerationTimerRetirement. No claims-off path changes.
    plan14_input_inventory_test.go:424: J4	internal/host/rootlaunchverifier.go	var participationRelease	E2	linux:internal/host/rootlaunchverifier.go:registerProductionLaunchVerifier	PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner. PROPOSED E45: root enforces census-gated release ordering, bounded acquisition and scoped recovery; registry timer primitives preserve supplied identity but producer integration remains pending.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/coldhandover.go	LaunchJournal.HasInstallationEffects	C	linux:internal/hostbox/coldhandover.go:ColdHandover.Run	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/movesheldrelease.go	newHeldReleaseRequestID	C+E1	linux:internal/host/movesheldrelease.go:heldReleaseVia.request	root-input;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerations.go	RootGenerations.Retire	E2	linux:internal/host/rootgeneration_retirement.go:generationRetirement.retire	E20: exact reservation closure precedes retirement verification; retained tombstones forbid replay and require sync recommit. Retired records release only their own pins; completeness remains a separate mandatory verifier, still unavailable in production. Fixtures: TestPlan14GenerationRetirementReleasesExactPin, TestPlan14GenerationRetirementRefusals, TestPlan14GenerationClosedReplayRefused, TestPlan14GenerationRetirementProcessCrash, TestPlan14GenerationRetirementKeepsIndependentReference, TestPlan14GenerationClaimsOffRestageMatchesMain.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationNames	E2	linux:internal/host/rootgeneration_kernel_linux.go:generationKernel.absent	E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/typedpark_linux.go	TypedParker.VerifyEmptyDirectory	C	linux:internal/hostbox/coldhandover.go:ColdHandover.retireIntended	rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=requires protected persistent identity before using emptiness to retire an intended directory
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	type RestartProgress	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.run	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_retirement.go	generationRetirement.verify	E2	linux:internal/host/rootgeneration_retirement.go:generationRetirement.retire	E21: release then host exclusion; root installation and exact settled launch with irreversibly closed writers bind retirement before and after independent kernel verification. Production invokes it from the census-only pin source. Fixtures: TestPlan14GenerationRetirementRootBinding, TestPlan14GenerationRetirementAfterLostStarted, TestPlan14GenerationRetirementBindingProcessCrash, TestPlan14GenerationRetirementCensusGate. Privileged production opener acceptance remains pending.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_inventory.go	generationPayloadBindings	E2	linux:internal/host/rootgeneration_inventory.go:generationReconciler.reconcile	E29: current and retained predecessor payloads must have completed materialization for every artifact kind, including route and timer. Tests: TestPlan14GenerationRegistryPayloadUnfinished, TestPlan14GenerationPayloadCompleteness, TestPlan14GenerationPayloadRetainedPredecessor. E27 checked root reader passed; extended physical/root-unit witnesses passed at E29. Required-artifact derivation and running-tenant containment remain incomplete. PROPOSED E46: local root installation obligations, exact root intention and inventory revision; service SQL is a deny-only consistency check. Executing identity: root instance-control or root participation/update.
    plan14_input_inventory_test.go:424: J4	internal/host/movesheldrelease.go	heldReleaseVia.publish	C+E1	linux:internal/host/movesstage.go:heldReleasePublished	root-route;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_delivery.go	HistoryReconstructionKey	E1	linux:internal/historyreadback/workflow.go:Operation.Deliver	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/restart.go	restartRequestLeg	E1+E3	linux:internal/host/agent.go:fastConvergeLoop	fix1-merge-review;basis=Reads the new host-retry log while preserving root-signed grant verification and ordinary restart gates.
    plan14_input_inventory_test.go:424: J4	internal/host/claimproduction.go	productionClaimRoster.Actor	C+G	linux:internal/hostbox/identity.go:IdentityProvider.Verify	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimroleassembly_other.go	ClaimRoleAssembly.PrepareState	C+G	darwin:internal/host/claimwakeassembly.go:ClaimWakeAssembly.Build	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootgenerations_launch.go	generationLaunchPermit.check	E2	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.launchLocked	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals.
    plan14_input_inventory_test.go:424: J4	internal/activator/containment.go	ExecBackend.spawnInCgroupAtTier	E2	linux:internal/activator/backend_exec.go:ExecBackend.seedChild	E40: claim-enabled raw backend refuses unsupported direct, placed and legacy-control launches before spawn. Claims-off body unchanged. TestPlan14GenerationBackendDirectBoundary, TestPlan14GenerationBackendControlBoundary, TestPlan14GenerationBackendAuxiliaryBoundary; each guard has an independent behavioral mutation. Agent-side refusal is not root reservation or containment evidence.
    plan14_input_inventory_test.go:424: J4	internal/host/claimjournal_containment.go	validateClaimJournalContainment	C+G	linux:internal/host/claimjournal_transport.go:ClaimRootHTTP.serveJournal	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimjournal_migration_linux.go	currentClaimEdgeMaskAt	C+G	linux:internal/host/claimjournal_migration_linux.go:claimEdgeMaskStillOwned	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/movesfloor.go	rootJudgeMovesPrevWithSource	F	linux:internal/host/movesfloor.go:rootJudgePrevWithSource	rev3=PROPOSED-p3;identity=carlos adopt root pass, root unit uid 0;basis=adopt refreshes root floor only for census participants; legacy registry judgement otherwise unchanged
    plan14_input_inventory_test.go:424: J4	internal/hostbox/regionalworker.go	RegionalWorker.Census	C	linux:internal/hostbox/regionalworker.go:RegionalWorker.Run	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostclaim/relocation.go	ToProbing	C	linux:internal/hostrelocate/participant.go:Participant.Step	Probe transition requires exact local-install receipt at target enrollment and install stamp before admission.
    plan14_input_inventory_test.go:424: J4	internal/caps/converge.go	Ops.query	E4	linux:internal/caps/converge.go:Ops.applyUnitState	root-input
    plan14_input_inventory_test.go:424: J4	internal/rollout/rootfailures.go	RootFailures.ImportLegacy	E3	linux:internal/host/rootupdates.go:productionRootUpdates	rev3=PROPOSED-p3;run=8;identity=root adoption and migration uid 0;basis=imports bounded negative tuples, hold markers and unresolved intents once; ignores legacy epochs and retries and durably retains import fingerprints
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_root.go	type ClaimLaunchRoot	E1+E2	linux:internal/host/claimlaunch_production.go:WithProductionClaimLaunch	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals. PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.
    plan14_input_inventory_test.go:424: J4	internal/caps/converge.go	Ops.checkStateDirShape	E4	linux:internal/caps/converge.go:Converge	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostbox/inventory_registration.go	ReconcileAdapter.registerRemote	C	linux:internal/hostbox/inventory_registration.go:ReconcileAdapter.installRemote	root installation and fence authority; registration and recovery; agent RPC lock ordering
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	RestartTarget.valid	E1	linux:internal/release/rootrestart_history.go:RootRestarts.Observe	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_identity.go	rememberRootFloorSystemIdentity	F	linux:internal/host/systemapply.go:systemApplier.verifyPointer	rev3=PROPOSED-p3;identity=carlos system apply/recover and root adopt, systemd root units or offline CLI, uid 0;basis=re-fetches and verifies signed pointer equality before retaining its executable identity
    plan14_input_inventory_test.go:424: J4	internal/host/movesstage.go	writeHeldStageRequest	C+E1	linux:internal/host/movesstage.go:heldReleaseReady	root-input;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimunit_binding.go	claimUnitBindings.read	E2	linux:internal/host/claimunit_placement.go:ClaimLaunchRoot.checkUnitBinding	PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.
    plan14_input_inventory_test.go:424: J4	internal/host/adoptlock.go	lockExclusive	C+E1	linux:internal/host/adoptlock.go:lockAdoptPass	root-input;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimretire_transport.go	type ClaimRootHTTP	E1	linux:internal/host/claimstop_run.go:RunInstanceControl	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=binds the production inventory identity capturer to the root request handler; the agent cannot choose the capture implementation
    plan14_input_inventory_test.go:424: J4	internal/console/seedfloor.go	Server.seedRegionReady	F	linux:internal/console/apiinstanceimport.go:Server.handleAPIImportStopped	rev3=PROPOSED-p3;identity=carlos console serve uid carlos-console;basis=requires accepted seeds generation only from root-floor participants; mixed fleet nonparticipants retain exact legacy readiness
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_authorization.go	rootMovesFloors.authorizedReconstruction	F		rev3=PROPOSED-p3;identity=offline root reconstruction capability, uid 0; no production caller installed;basis=requires exact private persisted nonce, box identity and next generation; caller strings cannot authorize
    plan14_input_inventory_test.go:424: J4	internal/rollout/rootfailures.go	rootFailureWriter	E3	linux:internal/rollout/rootfailures.go:OpenRootFailures	rev3=PROPOSED-p3;run=8;identity=root adoption and migration uid 0;basis=writes migration identity, failure epochs and import fingerprints atomically through checked private root store
    plan14_input_inventory_test.go:424: J4	internal/host/claimassembly.go	NewProductionRootClaimStop	C+E2	linux:internal/host/claimstop_run.go:RunInstanceControl	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=installs root filesystem identity capture in the production inventory handler
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart_requests.go	logRestartRequestError	E1	linux:internal/host/agent.go:runAdoptUnderRootRelease	E15: census-only root unit-restart consumption uses retained installations, canonical records, exact requests, invocation evidence and admission after durable intent under release exclusion. No-census effects use the original consumer. Fixtures: TestPlan14RootRestartProductionConsumption, TestPlan14RootRestartProductionHeldRollover, TestPlan14RootRestartProductionAdmissionAfterIntent, TestPlan14RootRestartProductionUnknown, TestPlan14RootRestartProductionSyncFailure, TestPlan14RootRestartProductionCrash, TestPlan14RootRestartRequestCensusGate.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_startup.go	verifyRootMigrationState	F+G	linux:internal/host/rootmigration_startup.go:verifyRootMigrationStartup	rev3=PROPOSED-p3;identity=root claim controller construction uid 0;basis=binds complete root census and durable complete migration record to deployment box enrollment and migration generation
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	type RestartSnapshot	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.run	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/unitsettle.go	systemctlVerb	B3	linux:internal/host/unitsettle.go:systemdUnits.ResetFailed	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/claimproduction.go	claimServingLaunchSource	C+G	linux:internal/host/claimproduction.go:ProductionClaimOwnerProvider.OpenClaimOwners	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/proofpolicy.go	LoadProofPolicy	B3	linux:internal/host/proofask.go:mintAsker.tick	root-input;kept=B3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimwakeassembly.go	claimSocketReady	C+G	linux:internal/host/claimwakeassembly.go:ClaimWakeAssembly.Build	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/restart.go	restartApps	E1+E3	linux:internal/host/restart.go:restartPass	root-route
    plan14_input_inventory_test.go:424: J4	internal/host/restart.go	restartSeed	E1+E3	linux:internal/host/agent.go:fastConvergeLoop	fix1-merge-review;basis=Baselines both request logs without applying historical ordinary restarts; signed retry grants remain independently verified.
    plan14_input_inventory_test.go:424: J4	internal/release/consumedfence.go	publishGate	E3	linux:internal/release/consumedfence.go:publishConsumed	root-route;kept=E3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostops/backfill_seeds.go	CollectCensusSeeds	G	linux:internal/host/rootmigration_census.go:rootMigrationCollector.collect	rev3=census-ruling-seeded-instances;basis=no caller in the tree yet; G wires the census collector that will call it: deny-only activation input; G wires its caller and must keep it deny-only. If it ever feeds a decision that allows rather than refuses, it needs a new ruling.
    plan14_input_inventory_test.go:424: J4	internal/release/bake.go	LoadFirstSeenMigrating	E1+E3	linux:internal/release/adopt.go:PassFilter	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/agent.go	agentCheckedUnitRestart	B3	linux:internal/host/agent.go:adoptLoop	kept=B3;scope=agent-only-legacy-behavior-preservation;not-root-authority
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_production.go	claimLaunchFor	D	linux:internal/host/claimlaunch_production.go:WithProductionClaimLaunch	Production root runtime receives the unit-aware kernel wrapper before startup recovery.
    plan14_input_inventory_test.go:424: J4	internal/release/updatetarget.go	Target	E3	linux:internal/release/adopt.go:settingsTarget	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/movesheldrelease_root.go	movesHeldReleaseRoot.replayed	C+E1	linux:internal/host/movesheldrelease_root.go:movesHeldReleaseRoot.publishRelease	root-input;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostexec/participation.go	PreinstallationParticipant	D	linux:internal/host/rootexecution_authority.go:ClaimRootHTTP.executionAuthority	D1 selects only the fresh claim executor or named target in its allowed phase; Exec is a claim field, not a process invocation. No installation authority.
    plan14_input_inventory_test.go:424: J4	internal/release/rootgenerationcompleteness.go	generationHash	E2	linux:internal/release/rootgenerationcompleteness.go:GenerationEvidence.valid	E23: versioned generation completeness binds exact reservations to independently supplied installation, launch and kernel evidence. Reservation mutations invalidate before commit; every destructive read reconciles again and retries sync. Production reconciliation remains unavailable. Fixtures: TestPlan14GenerationCompleteness, TestPlan14GenerationCompletenessInvalidation, TestPlan14GenerationCompletenessDurability, TestPlan14GenerationCompletenessCertificateSyncFailure, TestPlan14GenerationCompletenessPinConsumer, TestPlan14GenerationCompletenessProcessCrash; TestPlan14GenerationCompletenessCheckedRootStore passed on the E25 root runner.
    plan14_input_inventory_test.go:424: J4	internal/instancectl/legacy_claim_cleanup.go	Server.clearLegacyClaimLaunch	C+G	linux:internal/instancectl/server.go:Server.handleStart	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/sweep.go	SweepStaged	E2	linux:internal/host/versionsweep.go:sweepStagedVersions	root-input
    plan14_input_inventory_test.go:424: J4	internal/registry/registry.go	normalizeRoute	E3	linux:internal/registry/registry.go:Registry.Upsert	rev3=census-ruling-seeded-instances;basis=the registry's SQLite side, as carlos: in the agent (/opt/carlos/carlos agent, carlos-edge.service) and in the registry child (carlos __registry-child, which a root pass forks as the service user), wherever Upsert's SQLite arm and the import swap run: the insert defaults from Registry.Upsert's body; E3, the same family as Registry.Upsert, whose body they came from
    plan14_input_inventory_test.go:424: J4	internal/hostops/production_delete.go	ProductionAuthority.StartDeleteClaim	C	linux:internal/hostops/operations.go:Controller.BeginRetire	Production delete obtains verified completed-box fence before permitting claim transition across completion barrier.
    plan14_input_inventory_test.go:424: J4	internal/release/refusal.go	ListRefusals	E1+E3	linux:internal/host/refusalwatch.go:refusalWatch.tick	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart.go	productionRootRestartChecks	B3+E1	linux:internal/host/agent.go:runAdoptUnderRootRelease	Signed named-unit recovery is independent of release and health history. Root rechecks canonical source, unit, process, signed target and trusted live pointer; captures attempt authority before publication; verifies readiness and resumes without repeated effects. Fixtures: TestPlan14SignedActiveFixIgnoresHistory, TestPlan14SignedActiveFixAuthority, TestPlan14SignedFixSupersedesOlderAttempt, TestPlan14ActiveRecoveryProcessCrash, TestPlan14SignedRestartWithoutHealthHistory, TestPlan14CapturedRollbackWithoutHealthHistory, TestPlan14SignedRestartRequiresTrustedLiveLink.
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	recheck	E1	linux:internal/historyreadback/workflow.go:Operation.Deliver	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_refresh.go	readRootFloorBinary	F	linux:internal/host/rootmovesfloor_boot.go:withRootFloorGuardCandidate	rev3=PROPOSED-p3;identity=root adopt refresh, root system update/recovery and root guard floor readers, uid 0;basis=verifies checked executable and signed system manifest; reads signed moves and seeds protocol numbers rather than version sidecar
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_requirements.go	generationLocalObligations	E2	linux:internal/host/rootgeneration_inventory.go:readProductionGenerationInventory	PROPOSED E46: root participation/recovery reads retained root census, fences, inventory and kernel evidence; no deployment-store network dependency. SQL remains deny-only.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/rootmigration_inventory.go	RootAuthority.MigrationInstallations	C+G	linux:internal/host/rootmigration_startup.go:verifyRootMigrationStartup	rev3=PROPOSED-p3;identity=carlos system journal-migrate, offline operator CLI, uid 0; also root claim startup uid 0;basis=read-only root installation enumeration includes incomplete records and never repairs before preflight
    plan14_input_inventory_test.go:424: J4	internal/host/claimstate_linux.go	claimPrivatePathOwner	C+G	linux:internal/host/claimstate_linux.go:prepareClaimStateDirectory	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/units/carlos-system-update.service	external	F	linux:internal/host/bootstrap.go:var unitsFS	rev3=PROPOSED-p3;identity=systemd update/recover oneshot shell uid 0;basis=guard branch is conditional on executable presence; unarmed units retain main selector; installed guard selects from root local floor
    plan14_input_inventory_test.go:424: J4	internal/host/rootupdates.go	rootUpdateSource.resolve	E3	linux:internal/host/rootupdates.go:productionRootUpdates	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=resolves canonical settings and signed retries; saves exact old legacy-book acknowledgements only after durable independent root retry
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_retirement.go	RootHistory.RecoveryRetired	E1	linux:internal/host/recoveryrefusals.go:checkUnresolvedRecoveries	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/renewing.go	RenewingLeases.Acquire	C	linux:internal/host/movespass.go:armPhase1	root-input
    plan14_input_inventory_test.go:424: J4	internal/hostexec/rootbroker.go	RootBroker.settle	D	linux:internal/hostexec/rootbroker.go:RootBroker.recoverSettlement	On uncertain ETag or delete conflict require both root and remote expiry, then conditionally delete the current ETag.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_rows.go	generationRegistryInventory	E2	linux:internal/host/rootgeneration_rows.go:productionGenerationRegistryInventory	E38: reconcile completed root retirement against the retained stop receipt and exact inventory; inspect parked identities, require retired rows absent or an independently inventoried successor, and retain generation pins. Fixtures: TestPlan14GenerationParkedPayload, TestPlan14GenerationParkedCrash, TestPlan14GenerationParkedKeepsReservation, TestPlan14GenerationParkedReadback; TestPlan14GenerationParkedRootRunner is runner-pending. Timer producer matches retained entries once and preserves successors on replay: TestPlan14GenerationTimerRetirement. No claims-off path changes. PROPOSED E46: local root installation obligations, exact root intention and inventory revision; service SQL is a deny-only consistency check. Executing identity: root instance-control or root participation/update.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_production_linux.go	migrationExecutionEmpty	G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=carlos system journal-migrate, offline operator CLI, uid 0;basis=any retained execution entry other than census/locks refuses migration; conservative settled-record limitation remains
    plan14_input_inventory_test.go:424: J4	internal/host/movesheldrelease.go	heldReleaseVia.claim	C+E1	linux:internal/host/movesheldrelease.go:heldReleaseVia.request	root-input;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootinventory_install.go	ClaimRootHTTP.rootLandingRoute	C+E3	linux:internal/host/rootinventory.go:ClaimRootHTTP.commitRootInventoryPending	Root derives flat landing row and settings from authoritative record and app policy after target/phase binding.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/relocationrows.go	RelocationRow	C	linux:internal/hostbox/reconcile.go:Reconciler.rowDecision	Relocation row decision consumes root admission-fence view and exact claim participation; grants no first registration itself.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_outcomes.go	validHistoryRecovery	E1	linux:internal/release/roothistory_status.go:RootHistory.MigrationStatusWithSources	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/fence.go	StopAuthorityMatches	C	linux:internal/host/claimwakestop.go:ClaimAssembly.collectCapturedStop	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/pins.go	GenerationPins	E2	linux:internal/release/adopt.go:PassFilter	root-route
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_retirement.go	type HistoryRecoveryRetirement	E1	linux:history_cli.go:historyCommandWithSave	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	RootRestarts.Begin	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.consume	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/rolelaunch.go	LaunchJournal.UnitIntentions	C	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.launchLocked	root-input
    plan14_input_inventory_test.go:424: J4	internal/rootstate/state.go	Sync	A+F+G	linux:internal/host/rootmovesfloor_source.go:readRootProtocolProjection	rev3=PROPOSED-p3;identity=checked filesystem callers including root control/apply/migration uid 0;basis=syncs an existing checked root descriptor before acknowledgement
    plan14_input_inventory_test.go:424: J4	internal/host/rootfloor_healthy.go	rootMovesFloors.capLegacy	F	linux:internal/host/rootseedsfloor_publication.go:readRootSeedsBound	rev3=PROPOSED-p3;identity=root normal adopt/apply refresh and local seeds-bound readers in apply/recover/guard, uid 0;basis=caps service-written protocol and release minima by highest root-observed healthy build; absent observation supplies no bound
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_pass.go	RootHistoryPass.complete	E1	linux:internal/release/adopt.go:adoptHost	E1 canonical binding selection and recheck; durable attempt precedes effects; only independent installed observation settles and retires the exact target refusal.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationRetainedFiles	E2	linux:internal/host/rootgeneration_kernel_linux.go:productionGenerationAbsence	E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance.;rev3=PROPOSED-p3;run=8;identity=root generation recovery uid 0;basis=requires verified persistent executable and tree identity through generationCurrentBinding
    plan14_input_inventory_test.go:424: J4	internal/host/prooffile.go	proofFileSource	B3	linux:internal/host/proofbinding.go:proofBindingSource.unitBinding	rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=excludes only boot-local numbers from persistent proof hashes; filesystem, handle, ownership and mount attachment remain bound
    plan14_input_inventory_test.go:424: J4	internal/host/rootrollback.go	readRollbackAttempt	B3	linux:internal/host/rootrollback.go:rootRestartChecks.finish	canonical record/unit/executable authority and one-attempt rollback; draft incomplete
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_outcomes.go	RootHistory.RetainRecovery	E1	linux:internal/host/roothistory_recovery.go:rootRestartChecks.settleHistory	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/claimhandover_crossbox.go	claimCrossBoxHandover.Before	C+G	linux:internal/host/claimhandover_crossbox.go:wireClaimAdmission	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory_recovery.go	historyRestartAttempt	B3+E1	linux:internal/host/rootrestart.go:checkedUnitRestart	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationMounts	E2	linux:internal/host/rootgeneration_kernel_linux.go:generationKernel.task	E27: refuse nsfs mounts explicitly because a mounted namespace can retain staged bind mounts after its last process and descriptor exit. Fixtures: TestPlan14GenerationKernelRetainedNamespaceMount (retirement and census); TestPlan14GenerationKernelNamespaceMountRootRunner (real namespace retention and release, passed on the E27 root runner). Other mount-device checks remain restrictive.
    plan14_input_inventory_test.go:424: J4	internal/host/restartscope.go	retryRequests	E1+E3	linux:internal/host/restartscope.go:applyRetries	root-route
    plan14_input_inventory_test.go:424: J4	internal/release/proof.go	FileSHA256	B3	linux:internal/host/proofobserve.go:proofObserver.observe	root-input;kept=B3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimrecovery_remote.go	claimCrossBoxHandover.installRecoveryRemote	C	linux:internal/host/claimhandover_recovery.go:claimCrossBoxHandover.afterRecovery	root installation and fence authority; recovery rebind and timer identity
    plan14_input_inventory_test.go:424: J4	internal/host/movesfiles.go	relocationPreparedManifest	C	linux:internal/host/movesfiles.go:movesFiles.preparedBinding	Prepared installation manifest is bound to authoritative claim digest, local-install receipt, box and install stamp before use.
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/transaction.go	Ledger.lockTransaction	D+F	linux:internal/rootparticipation/ledger.go:Ledger.Acquire	rev3=PROPOSED-p3;identity=root system apply/recover uid 0;basis=reuses transaction exclusion only for the identical root store; foreign stores refuse
    plan14_input_inventory_test.go:424: J4	internal/host/rootrollback.go	loadRollback	B3+E1	linux:internal/host/rootrestart.go:rollbackUnitRestart	Signed named-unit recovery is independent of release and health history. Root rechecks canonical source, unit, process, signed target and trusted live pointer; captures attempt authority before publication; verifies readiness and resumes without repeated effects. Fixtures: TestPlan14SignedActiveFixIgnoresHistory, TestPlan14SignedActiveFixAuthority, TestPlan14SignedFixSupersedesOlderAttempt, TestPlan14ActiveRecoveryProcessCrash, TestPlan14SignedRestartWithoutHealthHistory, TestPlan14CapturedRollbackWithoutHealthHistory, TestPlan14SignedRestartRequiresTrustedLiveLink.
    plan14_input_inventory_test.go:424: J4	internal/rootstate/state_linux.go	directory.Remove	A+B3	linux:internal/host/rootrollback.go:captureRollback	descriptor-checked root rollback capability identity/removal
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_status.go	const RootHistoryStatusDir	E1	linux:internal/host/roothistory.go:openRootHistory	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart.go	restartBoundUnit	B3	linux:internal/host/rootrestart.go:rollbackUnitRestart	E9 merge ruling 6: E effects require a census; no-census recovery delegates to main or records evidence only. Fixtures: TestPlan14ERecoveryNoCensus, TestPlan14ERecoveryNoCensusResume, TestR2ERecoveryFlagWithoutCensus, TestPlan14ERecoveryRestartOutcome. Census-backed recovery retains captured authority and outcome precedence.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_source.go	readEffectiveMovesFloor	F	linux:internal/host/systemapply.go:systemApplier.activationRule	rev3=PROPOSED-p3;identity=root adopt refresh, root system update/recovery and root guard floor readers, uid 0;basis=census chooses local root protocol bound; no census chooses existing legacy reader
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_timers.go	type rootMigrationTimers	G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=offline migration root uid 0;basis=holds root-private migration state, root inventory, root fence authority and isolated registry interface under offline exclusion
    plan14_input_inventory_test.go:424: J4	internal/host/claimlaunch_root.go	ClaimLaunchRoot.launchLocked	E1+E2	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.startRecorded	E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals. PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.
    plan14_input_inventory_test.go:424: J4	internal/rollout/rootfailures.go	RootFailures.VerifiedRetry	E3	linux:internal/host/rootupdates.go:rootUpdateSource.resolve	rev3=PROPOSED-p3;run=8;identity=root adoption uid 0;basis=verifies deployment-root signature, tuple, freshness and exact root book epoch before existing durable retry transition
    plan14_input_inventory_test.go:424: J4	internal/hostbox/wakepolicy.go	WakePhase	C	linux:internal/hostbox/wakepolicy.go:Policy.check	root-input
    plan14_input_inventory_test.go:424: J4	internal/release/consumedfence_linux.go	lockConsumedPublish	E3	linux:internal/release/consumedfence.go:publishConsumed	root-input;kept=E3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/release/pins.go	ReadGenerations	E2	linux:internal/release/pins.go:GenerationPins	root-input
    plan14_input_inventory_test.go:424: J4	internal/rootstate/state.go	type Store	A+B3	linux:internal/host/claimassembly.go:NewProductionRootClaimStop	descriptor-checked root rollback capability identity/removal
    plan14_input_inventory_test.go:424: J4	internal/hostbox/journalservice.go	JournalService.executeWithInventory	C	linux:internal/hostbox/journalservice.go:JournalService.ExecuteRootInventory	Journal transaction preserves original request hash while persisting independently derived root inventory and durable replay receipt.
    plan14_input_inventory_test.go:424: J4	internal/hostrelocate/worker.go	Worker.Step	C+D	linux:internal/host/relocatepass.go:RelocationRuntime.once	Worker transitions revalidate claim and fence and consume verified root stop receipts; generic transition timing remains legacy.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	RootRestarts.Complete	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.consume	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/guardtransaction.go	systemApplier.checkGuardRecovery	D	linux:internal/host/systemapply.go:systemApplier.Run	Claims-on or retained root census uses root exclusion; claims-off with no census preserves main participation and recovery behavior. PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner.
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart.go	restartOrdinaryUnit	B3	linux:internal/host/rootrestart.go:rootRestartRouteWith	rev3=merge-ruling-4;basis=No-census derived-unit try-restart is unconditional and nonfatal, matching main for absent rows and systemd lookup failures.
    plan14_input_inventory_test.go:424: J4	internal/host/legacyrestart.go	legacyRollbackRestart	B3	linux:internal/host/rootrestart.go:rollbackUnitRestart	rev3=merge-ruling-6;basis=Restore main reset-failed, restart and D1 settle even after an operator reset; retain main error wrapping and diagnostics.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_reconstruct.go	RootHistory.reconstructionState	E1	linux:internal/release/roothistory_reconstruct.go:RootHistory.reconstructionReady	E1 signed root-history reconstruction; exact namespace identity, revisions and canonical sources; journaled completion retains denies and stronger bounds. Tests: TestPlan14RootHistoryReconstruction, TestPlan14RootHistoryReconstructionCrash, TestPlan14RootHistoryReconstructionDeliveryPass.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_reconstruct.go	RootHistory.resumeReconstruction	E1	linux:internal/release/roothistory_reconstruct.go:RootHistory.Reconstruct	E1 signed root-history reconstruction; exact namespace identity, revisions and canonical sources; journaled completion retains denies and stronger bounds. Tests: TestPlan14RootHistoryReconstruction, TestPlan14RootHistoryReconstructionCrash, TestPlan14RootHistoryReconstructionDeliveryPass.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_retirement.go	RootHistory.recoveryRetirementDigest	E1	linux:internal/release/roothistory_retirement.go:RootHistory.recoveryRetired	Exact completion binds the accepted authorization digest from durable private history to enrolled-root signed readback. Pending originals, changed evidence and canonical sources cannot supply retirement completion. Fixtures: TestPlan14HistoryReconstructionCompletion, TestPlan14HistoryRetirementCompletion, TestPlan14ReadReconstructionCompletion, TestPlan14ReadRetirementCompletion, TestPlan14RecoveryRetirementProductionCallback, TestPlan14RootHistoryReconstructionCrash, TestPlan14HistoryRetirementProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	restartIntentID	E1	linux:internal/release/rootrestart_history.go:RootRestarts.Observe	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/agent.go	makeRestartRoute	B3	linux:internal/host/agent.go:adoptLoop	root-route;kept=B3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootgenerations_launch.go	type generationLaunchPermit	E2+E3	linux:internal/host/claimlaunch_root.go:ClaimLaunchRoot.startRecorded	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=retains the root runtime completion and close callbacks for the reserved launch
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_pass.go	passConfig.recordRefusal	E1	linux:internal/release/adopt.go:adoptHost	E1 canonical binding selection and recheck; durable attempt precedes effects; only independent installed observation settles and retires the exact target refusal.
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	buildStates.refresh	E3	linux:internal/host/buildstate.go:buildStates.wakeTarget	route-and-input
    plan14_input_inventory_test.go:424: J4	internal/host/systemparticipation.go	systemApplier.beginExecutableChange	D	linux:internal/host/systemapply.go:systemApplier.install	Claims-on or retained root census uses root exclusion; claims-off with no census preserves main participation and recovery behavior. PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner.
    plan14_input_inventory_test.go:424: J4	internal/host/claimroleassembly_other.go	ClaimRoleAssembly.Prelaunch	C+G	darwin:internal/host/claimwakeassembly.go:ClaimWakeAssembly.Build	root-route;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimproduction.go	readProductionRosterRow	C+G	linux:internal/host/movessources.go:productionRosterRegion	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootroute.go	proofBindingSource.needsRestart	B3	linux:internal/host/rootrestart.go:productionRootRestartChecks	Named units use authoritative deployment or root-owned local sources; ordinary recordless routes retain derived-unit dispatch.
    plan14_input_inventory_test.go:424: J4	internal/hostbox/generationinventory.go	OpenGenerationLaunchReader	E2	linux:internal/host/rootgeneration_inventory.go:openGenerationLaunchInventory	E24: independent root installation and launch enumeration, exact reservation reconciliation and fresh quiescent whole-version-tree kernel census; missing sources, open unreserved launches, foreign namespaces and uncontained tasks refuse. Production pin source certifies this evidence before returning pins. Fixtures: TestPlan14GenerationInventoryCompleteness, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationInventoryLifecycle, TestPlan14GenerationInventoryProcessCrash, TestPlan14GenerationKernelCensusUnknownReference, TestPlan14GenerationLaunchInventory, TestPlan14GenerationReaderDoesNotInitialize, TestPlan14GenerationInstallationInventory. Checked production source/kernel witnesses passed on the E27 root runner. E29 physical-payload and installed-unit witnesses passed on the controller runner; E30 required-artifact witness pending.
    plan14_input_inventory_test.go:424: J4	internal/console/boxselect.go	Server.selectMoveBoxes	F	linux:internal/console/apiinstancemove.go:Server.handleAPIInstanceMoveRequest	rev3=PROPOSED-p3;identity=carlos console serve, console.service uid carlos-console;basis=applies accepted/generation refusal only to advertised root-floor participants; legacy selection retains main exactly
    plan14_input_inventory_test.go:424: J4	internal/hostfloor/disk.go	Durable	F	linux:internal/host/guardarm.go:RunSystemGuardArm	root-input
    plan14_input_inventory_test.go:424: J4	internal/rootstate/state_linux.go	directory.Names	A	linux:internal/hostexec/rootbroker.go:RootBroker.Recover	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/recoveryrefusals.go	rootRestartChecks.copyRecoveryHistory	E1	linux:internal/host/recoveryrefusals.go:rootRestartChecks.retainRecoveryHistory	Exact signed recovery retirement binds namespace, complete outcome digest and a later root-verified success; pending originals and changed evidence remain restrictive. Independent settlement publishes status without controlling effects. Fixtures: TestPlan14HistoryExactRecoveryRetirement, TestPlan14HistoryRecoveryRetirementAuthority, TestPlan14HistoryRetirementVisibleSync, TestPlan14HistoryRetirementProcessCrash, TestPlan14RecoveryRetirementProductionCallback, TestPlan14IndependentRecoveryPublishesStatus.
    plan14_input_inventory_test.go:424: J4	internal/release/rollback.go	processGroup	B3+E1+E3	linux:internal/release/rollback.go:rollbackGroup	root-route;kept=B3,E1,E3;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_writers.go	ClaimAssembly.WritersStopped	C+G	linux:internal/host/relocationassembly.go:ClaimAssembly.RelocationEffects	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/movesinstall.go	installRun.configured	C+E1	linux:internal/host/movesinstall.go:installGeneration	Configured landing now validates root-created registration before render and held publication; source recovery keeps existing typed rebind.
    plan14_input_inventory_test.go:424: J4	internal/host/relocationreleases.go	ReleaseObligation.Queue	C	linux:internal/host/relocationeffects.go:RelocationEffects.Release	Queues exact relocation release retirement obligation and preserves already discharged receipt replay.
    plan14_input_inventory_test.go:424: J4	internal/rootstate/live.go	LiveHeld	A+D	linux:internal/hostexec/rootread.go:ReadRoot	fix1;basis=Requires the store to implement broker-only liveness holding and a non-acquiring query; unsupported stores fail closed.
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart_requests_source.go	rootRestartRequestSource.installation	E1	linux:internal/host/rootupdates.go:rootUpdateSource.resolve	E15: census-only root unit-restart consumption uses retained installations, canonical records, exact requests, invocation evidence and admission after durable intent under release exclusion. No-census effects use the original consumer. Fixtures: TestPlan14RootRestartProductionConsumption, TestPlan14RootRestartProductionHeldRollover, TestPlan14RootRestartProductionAdmissionAfterIntent, TestPlan14RootRestartProductionUnknown, TestPlan14RootRestartProductionSyncFailure, TestPlan14RootRestartProductionCrash, TestPlan14RootRestartRequestCensusGate.
    plan14_input_inventory_test.go:424: J4	internal/hostguard/rootview.go	FenceView.admit	G	linux:internal/hostguard/guard.go:Guard.With	rev3=PROPOSED-p3;identity=root claim controller construction uid 0;basis=read-only root view applies same predecessor-completion requirement as locked admission
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	prepareStatus	E1	linux:internal/historyreadback/workflow.go:PrepareOperation	E17: operator saves exact signed authorization and challenge before delivery, resumes without renewal, and verifies enrolled-root exact completion. Existing proof branches are unchanged. Tests: TestPlan14HistoryOperatorWorkflow, TestPlan14HistoryOperatorConflicts, TestPlan14HistoryOperatorExactCompletion, TestPlan14HistoryWorkflowProcessCrash, TestPlan14HistoryCommandResume, TestPlan14HistorySavedFiles, TestPlan14HistoryCLIDispatch.
    plan14_input_inventory_test.go:424: J4	internal/host/rootseedsfloor.go	readEffectiveSeedsFloor	F	linux:internal/host/rootseedsfloor.go:systemApplier.seedsActivationRefusal	rev3=PROPOSED-p3;identity=root adopt refresh, root system update/recovery and root guard floor readers, uid 0;basis=census selects verified signed publication plus capped retained deny; unpublished seeds impose no bound; no census retains legacy reader
    plan14_input_inventory_test.go:424: J4	internal/release/pins.go	BoxPins	E2	linux:internal/release/adopt.go:PassFilter	route-and-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_census.go	rootMigrationCollector.collect	G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=carlos system journal-migrate, offline operator CLI, uid 0;basis=signed collecting manifest and actor directory bound complete records/claims census; registry Seeds are refusal-only
    plan14_input_inventory_test.go:424: J4	internal/hostbox/stopinventory_db.go	StopInventoryDB.ReadStopInventory	C	linux:internal/hostbox/empty_census.go:EmptyInstallationCensus.checkLocal	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootinventory.go	ClaimRootHTTP.recoverRootInventory	C+E1	linux:internal/host/claimretire_transport.go:ClaimRootHTTP.RecoverPending	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers. PROPOSED E46: local root installation obligations, exact root intention and inventory revision; service SQL is a deny-only consistency check. Executing identity: root instance-control or root participation/update.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_inventory.go	generationInventoryAt	E2	linux:internal/host/rootgeneration_inventory.go:readProductionGenerationInventory	E26: checked read-only payload enumeration includes inventory and revision orphans; completeness binds current and retained predecessor inventories, exact current revision and both source reads. Fixtures: TestPlan14GenerationPayloadCompleteness, TestPlan14GenerationPayloadRetainedPredecessor, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationPayloadInventory, TestPlan14GenerationPayloadReaderDoesNotInitialize. Checked root reader acceptance passed at E27; running-tenant containment remains unfinished. PROPOSED E43: root; release-held context and D3 reservation/census verification under release-before-participation exclusion; no-census effects stay on the legacy path. TestPlan14LaunchVerifierToken, TestPlan14LaunchVerifierCallerOrder, TestPlan14LaunchVerifierNoCensus, TestPlan14LaunchVerifierRootRunner.
    plan14_input_inventory_test.go:424: J4	internal/host/claimstop_writers_linux.go	installationCoverage	C+G	linux:internal/host/claimstop_writers_linux.go:rootInstallationCoverage	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=validates stopped-installation data roots against persistent filesystem identity before treating descriptors as covered
    plan14_input_inventory_test.go:424: J4	internal/registry/registry.go	routeArgs	E3	linux:internal/registry/registry.go:Registry.Upsert	rev3=census-ruling-seeded-instances;basis=the registry's SQLite side, as carlos: in the agent (/opt/carlos/carlos agent, carlos-edge.service) and in the registry child (carlos __registry-child, which a root pass forks as the service user), wherever a route is inserted: Upsert, the cold handover restore and the import journal's inserts: the bind list from Registry.Upsert's body (and RestoreClaimRows'), with seed_source and import_gate added; E3, the same family as Registry.Upsert, whose body it came from
    plan14_input_inventory_test.go:424: J4	internal/hostbox/inventoryscope.go	ValidateAgentInventory	C	linux:internal/hostbox/reconcile_adapter.go:ReconcileAdapter.Retire	root-route PROPOSED E46: captured claim selection and root journal mutation; root RPC outside service host exclusion; SQL/route data never grants root authority. Executing identity: service controller; root for inventory/retirement callbacks.
    plan14_input_inventory_test.go:424: J4	internal/hostrelocate/worker.go	Worker.Start	C+D		Relocation start binds verified worker and source/target identity, checks termination fence and discharge; placement policy stays legacy.
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_reconstruct.go	RootHistory.reconstructionImages	E1	linux:internal/release/roothistory_reconstruct.go:RootHistory.Reconstruct	E1 signed root-history reconstruction; exact namespace identity, revisions and canonical sources; journaled completion retains denies and stronger bounds. Tests: TestPlan14RootHistoryReconstruction, TestPlan14RootHistoryReconstructionCrash, TestPlan14RootHistoryReconstructionDeliveryPass.
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory_creation.go	rootHistoryCreation	E1	linux:internal/host/roothistory.go:openRootHistory	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers.
    plan14_input_inventory_test.go:424: J4	internal/host/rolloutdeclined.go	failureHolds.refusal	E1+E3	linux:internal/host/rolloutdeclined.go:failureHolds.gate	root-route
    plan14_input_inventory_test.go:424: J4	internal/release/pins.go	SettingsRefs	E2	linux:internal/release/pins.go:BoxPins	root-route
    plan14_input_inventory_test.go:424: J4	internal/rootstate/shared_linux.go	ensurePublicChild	A+B4	linux:internal/rootstate/shared_linux.go:EnsurePublicDir	fix1;basis=Creates or descriptor-repairs only a root:root 0700/0755 shared directory, without following symlinks or admitting writable/foreign parents.
    plan14_input_inventory_test.go:424: J4	internal/hostexec/rootbroker.go	RootBroker.Monitor	D	linux:internal/hostexec/rootbroker.go:RootBroker.Run	Exponentially back off lost-record settlement retries; active cutoff monitoring remains independent.
    plan14_input_inventory_test.go:424: J4	internal/release/claim_identity.go	CheckRouteReleaseIdentity	C+E1	linux:internal/host/claimproduction.go:claimInputPolicy	root-route;kept=C,E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/provision/rootrecord.go	FindRecordByHost	B3+C	linux:internal/host/rootrecord_claim.go:rootClaimRecord	Discovery delegates to the collision-checking index and still reads the selected record afresh.
    plan14_input_inventory_test.go:424: J4	internal/hostclaim/relocation.go	PinAfterRelease	C	linux:internal/hostrelocate/worker.go:Worker.Step	Pin transition verifies source release authority and exact journal phase before removing execution authority.
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/completion.go	ReadRetirement	E1	linux:internal/historyreadback/workflow.go:Operation.Read	Exact completion binds the accepted authorization digest from durable private history to enrolled-root signed readback. Pending originals, changed evidence and canonical sources cannot supply retirement completion. Fixtures: TestPlan14HistoryReconstructionCompletion, TestPlan14HistoryRetirementCompletion, TestPlan14ReadReconstructionCompletion, TestPlan14ReadRetirementCompletion, TestPlan14RecoveryRetirementProductionCallback, TestPlan14RootHistoryReconstructionCrash, TestPlan14HistoryRetirementProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/rootstate/live_linux.go	directory.LiveHeld	A+D	linux:internal/rootstate/live.go:LiveHeld	fix1;basis=Retains a trusted private-file descriptor under an OFD write lock; readers query conflicting OFD ownership without locking.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	restartValue	E1	linux:internal/release/rootrestart_history.go:RootRestarts.Observe	E14 restart consumption component. Root-only canonical inputs under release exclusion; production wiring remains pending. Fixtures: TestPlan14RootRestartConsumption, TestPlan14RootRestartSelection, TestPlan14RootRestartReadMustSync, TestPlan14RootRestartProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/release/rootrestart_history.go	RootRestarts.Bindings	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.run	E15: census-only root unit-restart consumption uses retained installations, canonical records, exact requests, invocation evidence and admission after durable intent under release exclusion. No-census effects use the original consumer. Fixtures: TestPlan14RootRestartProductionConsumption, TestPlan14RootRestartProductionHeldRollover, TestPlan14RootRestartProductionAdmissionAfterIntent, TestPlan14RootRestartProductionUnknown, TestPlan14RootRestartProductionSyncFailure, TestPlan14RootRestartProductionCrash, TestPlan14RootRestartRequestCensusGate.
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor.go	rootMovesFloors.reconstruct	F		rev3=PROPOSED-p3;identity=offline root reconstruction capability, uid 0; no production caller installed;basis=requires private root-issued box/generation/nonce token and refuses weakening; no production caller installed
    plan14_input_inventory_test.go:424: J4	internal/hostbox/park.go	Regional.observe	C	linux:internal/hostbox/regionalworker.go:RegionalWorker.runHost	root-input
    plan14_input_inventory_test.go:424: J4	internal/rootstate/file_linux.go	Identity	A+B3	linux:internal/host/roothistory_launch.go:ClaimLaunchRoot.rootInstalledProgram	descriptor-checked root rollback capability identity/removal
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/ledger.go	IsAcquisitionRecovery	E2	linux:internal/host/rootlaunchverifier.go:rootLaunchVerifier.verify	PROPOSED E45: root enforces census-gated release ordering, bounded acquisition and scoped recovery; registry timer primitives preserve supplied identity but producer integration remains pending.
    plan14_input_inventory_test.go:424: J4	internal/host/claimowners.go	claimServingOwners.serving	C+G	linux:internal/host/claimowners.go:claimServingOwners.Select	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootseedsfloor.go	refreshRootSeedsFloor	F	linux:internal/host/seedsfloor.go:systemApplier.armSeedsFloor	rev3=PROPOSED-p3;identity=carlos adopt and system apply refresh, uid 0; no recovery or boot-selector call;basis=merges authoritative store floor with denial-only legacy seeds maxima into durable independent root state
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_kernel_linux.go	generationGroupGone	E2	linux:internal/host/rootgeneration_kernel_linux.go:productionGenerationAbsence	rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=refuses a present cgroup placement from another boot; an absent old placement carries no process identity to compare
    plan14_input_inventory_test.go:424: J4	internal/caps/caps.go	ValidCapabilities	E4	linux:cli.go:readCapabilities	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_inventory.go	openGenerationLaunchInventory	E2	linux:internal/host/rootgeneration_retirement.go:productionRetireGenerations	E33: census-only generation journal reads accept private root-owned ancestry without chmod or repair. Every ancestor remains descriptor-checked, root-owned and non-writable by group/other; leaves remain single-link regular root-owned files, checked for DB/WAL/SHM. Public-file callers remain unchanged. Fixtures: TestPlan14AuthorityFilePrivateAncestors, TestPlan14AuthorityFileAbsoluteBoundary; TestPlan14GenerationPrivateJournalRootRunner and TestPlan14GenerationRequiredArtifactsRootRunner are runner-pending. Pre-flight 76, 78, 82 and 89.
    plan14_input_inventory_test.go:424: J4	internal/host/rootgeneration_inventory.go	type generationReconciler	E2	linux:internal/host/rootlaunchverifier.go:registerProductionLaunchVerifier	E24: independent root installation and launch enumeration, exact reservation reconciliation and fresh quiescent whole-version-tree kernel census; missing sources, open unreserved launches, foreign namespaces and uncontained tasks refuse. Production pin source certifies this evidence before returning pins. Fixtures: TestPlan14GenerationInventoryCompleteness, TestPlan14GenerationInventoryPinConsumer, TestPlan14GenerationInventoryLifecycle, TestPlan14GenerationInventoryProcessCrash, TestPlan14GenerationKernelCensusUnknownReference, TestPlan14GenerationLaunchInventory, TestPlan14GenerationReaderDoesNotInitialize, TestPlan14GenerationInstallationInventory. Checked production source/kernel witnesses passed on the E27 root runner. E29 physical-payload and installed-unit witnesses passed on the controller runner; E30 required-artifact witness pending.
    plan14_input_inventory_test.go:424: J4	internal/instancectl/claimexec.go	ClaimUnits.prepareExecGate	C+E2+G	linux:internal/instancectl/claimunit.go:ClaimUnits.start	root-input;kept=C,G;scope=protected-decision-only PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.
    plan14_input_inventory_test.go:424: J4	internal/host/rootrecord_claim.go	rootClaimRecord	C	linux:internal/host/rootinstallation.go:rootInstallationHostApp	root installation and fence authority; registration and recovery; agent RPC lock ordering
    plan14_input_inventory_test.go:424: J4	internal/host/rootseedsfloor_publication.go	acceptRootSeedsPublication	F	linux:internal/host/rootseedsfloor.go:refreshRootSeedsFloor	rev3=PROPOSED-p3;identity=normal carlos adopt and system apply remote floor refresh, uid 0;basis=under stable floor lock, retains only verified nonregressing signed seeds publication; no publisher or activation switch added
    plan14_input_inventory_test.go:424: J4	internal/host/bootstrap.go	bootstrapWith	A+C+G	linux:internal/host/bootstrap.go:RunBootstrap	root-input;kept=A,C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/hostguard/record_unix.go	recordDir.read	C	linux:internal/hostguard/recoveryfence.go:Guard.PendingFences	root installation/fence backend and lock-free agent projection; establishment blocked; draft incomplete
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart.go	rollbackUnitRestart	B3+E1	linux:internal/host/agent.go:runAdoptUnderRootRelease	Captured canonical rollback authority is unchanged. Durable verified outcome permits later history settlement without another restart. Fixtures: TestPlan14HistoryRollbackLink and TestPlan14HistoryUnavailableCannotBlockCapturedRollback.
    plan14_input_inventory_test.go:424: J4	internal/host/relocationinstall.go	relocationInstallAuthority	C	linux:internal/host/relocationinstall.go:ClaimAssembly.relocationInstall	Existing relocation install authority binds exact kind/op/phase/executor/install stamp, lost state and unopened prepared generation.
    plan14_input_inventory_test.go:424: J4	internal/activator/containment.go	ExecBackend.startRole	E2	linux:internal/activator/backend_exec.go:ExecBackend.spawnUnitFrom	E40: claim-enabled raw backend refuses unsupported direct, placed and legacy-control launches before spawn. Claims-off body unchanged. TestPlan14GenerationBackendDirectBoundary, TestPlan14GenerationBackendControlBoundary, TestPlan14GenerationBackendAuxiliaryBoundary; each guard has an independent behavioral mutation. Agent-side refusal is not root reservation or containment evidence.
    plan14_input_inventory_test.go:424: J4	internal/rootparticipation/ledger.go	Ledger.Acquire	D	linux:internal/host/rootexecution_runtime.go:newClaimExecutionRuntime	rev3=PROPOSED-p3;identity=root system apply/recover and root participation callers uid 0;basis=retains existing census authority and same-ledger transaction exclusion; nested activation journal completion reuses live root-held context; Clear pending acquisition on a returned commit failure while preserving durable record-based exclusion.
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart_requests.go	rootRestartRequests.consume	E1	linux:internal/host/rootrestart_requests.go:rootRestartRequests.run	E15: census-only root unit-restart consumption uses retained installations, canonical records, exact requests, invocation evidence and admission after durable intent under release exclusion. No-census effects use the original consumer. Fixtures: TestPlan14RootRestartProductionConsumption, TestPlan14RootRestartProductionHeldRollover, TestPlan14RootRestartProductionAdmissionAfterIntent, TestPlan14RootRestartProductionUnknown, TestPlan14RootRestartProductionSyncFailure, TestPlan14RootRestartProductionCrash, TestPlan14RootRestartRequestCensusGate.
    plan14_input_inventory_test.go:424: J4	internal/host/claimrelocation.go	openClaimRelocationOwners	C+G	linux:internal/host/claimproduction.go:ProductionClaimOwnerProvider.OpenClaimOwners	Relocation owner constructor receives existing serving sources and verified identity inside feature gate.
    plan14_input_inventory_test.go:424: J4	internal/rollout/failures.go	var randRead	E1+E3	linux:internal/rollout/failures.go:newBookID	fix1-merge-review;basis=Names the cryptographic entropy source for failure-book identity; remains retry replay authority.
    plan14_input_inventory_test.go:424: J4	internal/host/roothistory.go	openRootHistory	E1	linux:internal/host/agent.go:runAdoptUnderRootRelease	E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers.
    plan14_input_inventory_test.go:424: J4	internal/hostexec/local_unix.go	localDir.write	D	linux:internal/hostexec/rootmirror.go:ProjectRootClient	root-input
    plan14_input_inventory_test.go:424: J4	internal/host/restart.go	restartCandidates	E1+E3	linux:internal/host/restart.go:restartApps	root-route
    plan14_input_inventory_test.go:424: J4	internal/instancectl/claimlaunch_snapshot_linux.go	claimRootDir	C+G	linux:internal/instancectl/claimlaunch_snapshot.go:ClaimUnits.freezeLaunch	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootrestart_requests_source.go	type rootRestartRequestSource	E1	linux:internal/host/rootupdates.go:productionRootUpdates	E15: census-only root unit-restart consumption uses retained installations, canonical records, exact requests, invocation evidence and admission after durable intent under release exclusion. No-census effects use the original consumer. Fixtures: TestPlan14RootRestartProductionConsumption, TestPlan14RootRestartProductionHeldRollover, TestPlan14RootRestartProductionAdmissionAfterIntent, TestPlan14RootRestartProductionUnknown, TestPlan14RootRestartProductionSyncFailure, TestPlan14RootRestartProductionCrash, TestPlan14RootRestartRequestCensusGate.
    plan14_input_inventory_test.go:424: J4	internal/host/agent.go	fastConvergeLoop	B3	linux:internal/host/agent.go:runAgent	rev3=census-ruling-carlos-run;basis=the agent (/opt/carlos/carlos agent, carlos-edge.service, user carlos): main's body with the runs worker's boot pass and pass called after reconcile; read sites unchanged, offsets moved; main's B3 authority retained
    plan14_input_inventory_test.go:424: J4	internal/host/buildstate.go	buildStates.wakeTarget	E3	linux:internal/host/agent.go:runAgent	root-route
    plan14_input_inventory_test.go:424: J4	internal/release/roothistory_reconstruct.go	RootHistory.ReconstructionStatus	E1	linux:internal/release/roothistory_delivery.go:RootHistory.ReceiveReconstruction	Exact completion binds the accepted authorization digest from durable private history to enrolled-root signed readback. Pending originals, changed evidence and canonical sources cannot supply retirement completion. Fixtures: TestPlan14HistoryReconstructionCompletion, TestPlan14HistoryRetirementCompletion, TestPlan14ReadReconstructionCompletion, TestPlan14ReadRetirementCompletion, TestPlan14RecoveryRetirementProductionCallback, TestPlan14RootHistoryReconstructionCrash, TestPlan14HistoryRetirementProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/release/ratchet.go	DigestRatchet.note	E1	linux:internal/release/ratchet.go:DigestRatchet.Admit	root-input;kept=E1;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/historyreadback/readback.go	type Scope	E1	linux:history_cli.go:historyCommandWithSave	Challenge-bound release-history readback authenticates the deployment request and active enrolled box key, rereads private history with original recovery restrictions, and rechecks roster/fence state. No status grants completeness or changes service effects. Fixtures: TestPlan14HistoryReadback, TestPlan14HistoryReadbackAuthority, TestPlan14HistoryReadbackReadRace, TestPlan14HistoryReadbackReenrollment, TestPlan14HistoryReadbackRequestRefusal, TestPlan14HistoryReadbackProduction, TestPlan14HistoryReadbackProcessCrash.
    plan14_input_inventory_test.go:424: J4	internal/host/claimwakestop.go	ClaimAssembly.collectCapturedStop	C+G	linux:internal/host/claimwakestop.go:ClaimAssembly.collectRetirementStop	root-input;kept=C,G;scope=protected-decision-only
    plan14_input_inventory_test.go:424: J4	internal/host/rootmigration_collect_linux.go	recoverMigrationStop	G	linux:internal/host/rootmigration_production_linux.go:migrateRootClaimAuthority	rev3=PROPOSED-p3;identity=carlos system journal-migrate uid 0;basis=preserves exact signed or retained receipt; absent signed evidence selects fresh collection only from previously authenticated root journals; begins root fence before observation
    plan14_input_inventory_test.go:424: J4	internal/host/rootmovesfloor_boot.go	rootFloorJudge.permits	F	linux:internal/host/rootmovesfloor_boot.go:rootFloorPrevVerdict	rev3=PROPOSED-p3;identity=root guard-exec apply/recover selection and carlos.prev floor-allows-prev, uid 0;basis=signed current, retained prev and fixed staged candidate determine whether a below-bound candidate must be refused; no available qualifying build preserves recovery
    plan14_input_inventory_test.go:424: J4	internal/hostguard/flock_unix.go	acquire	C	linux:internal/hostguard/guard.go:Guard.locked	rev3=merge-ruling-4;basis=Descriptor checks classify nonregular or foreign-owner locks as unsafe; honest contention waits with bounded exponential backoff.
    plan14_input_inventory_test.go:431: family E4 missing erasure fixture 
    plan14_input_inventory_test.go:431: family E4 missing hostile fixture 
    plan14_input_inventory_test.go:431: family E4 missing positive fixture 
    plan14_input_inventory_test.go:431: family E4 missing rename fixture 
    plan14_input_inventory_test.go:431: family E4 missing retry fixture 
    plan14_input_inventory_test.go:435: authority coverage: 16538 reachable declarations; 95 failures
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: refusing to mint route acme.go.tito.io (app "tito" acct "bac"): this box declares CARLOS_INBOUND=none (no-inbound) and cannot serve routed instance traffic
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted service route svc.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted instance route whole.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted instance route console.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted instance route shared.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: converged acme.go.tito.io channel stable -> edge
2026/10/15 23:31:53 provision: converged acme.go.tito.io channel edge -> canary/rehearsal
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: empty channel
2026/10/15 23:31:53 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: converged acme.go.tito.io environment "" -> "staging"
2026/10/15 23:31:53 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: converged acme.go.tito.io steering "" -> "latency"
2026/10/15 23:31:53 provision: converged acme.go.tito.io steering "latency" -> ""
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: converged acme.go.tito.io hibernate false -> true
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: converged acme.go.tito.io hibernate true -> false (replication "daily" cleared: only a hibernating route's rung is read)
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: converged acme.go.tito.io status-named false -> true
2026/10/15 23:31:53 provision: converged acme.go.tito.io status-named true -> false
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted service route ha.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: converged ha.go.tito.io upstreams addr "" -> "", addrs "127.0.0.1:7001,127.0.0.1:7002" -> "127.0.0.1:7001,127.0.0.1:7003" (probe "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}" -> "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}")
2026/10/15 23:31:53 provision: converged ha.go.tito.io upstreams addr "" -> "", addrs "127.0.0.1:7001,127.0.0.1:7003" -> "127.0.0.1:7003,127.0.0.1:7001" (probe "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}" -> "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}")
2026/10/15 23:31:53 provision: converged ha.go.tito.io upstreams addr "" -> "", addrs "127.0.0.1:7003,127.0.0.1:7001" -> "127.0.0.1:7003,127.0.0.1:7001" (probe "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}" -> "{\"path\":\"/healthz\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}")
2026/10/15 23:31:53 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: converged whole.go.tito.io upstreams addr "127.0.0.1:9443" -> "", addrs "" -> "127.0.0.1:9443,127.0.0.1:9444" (probe "" -> "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}")
2026/10/15 23:31:53 provision: converged whole.go.tito.io upstreams addr "" -> "", addrs "127.0.0.1:9443,127.0.0.1:9444" -> "" (probe "{\"path\":\"/\",\"status\":200,\"interval_ms\":2000,\"fail_after\":3,\"rise_after\":2}" -> "")
2026/10/15 23:31:53 provision: whole.go.tito.io: record describes a different route SHAPE than the row (kind "instance"/"service" unit ""/"" socket "/run/carlos/whole.go.tito.io.sock"/"" db "/data/whole.go.tito.io.db"/"") — not converged in place; `carlos remove whole.go.tito.io` purges this route's capability grants (registry.Delete's contract, not a bug) before the next pass re-mints it, so treat that as a last resort, not a routine fix
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: minted service route whole.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: skipping accounts/bac/account.json: malformed account manifest: invalid character 'o' in literal null (expecting 'u')
2026/10/15 23:31:53 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: manifest bac/tito: read failed: provision: manifest bac/tito: invalid character 'o' in literal null (expecting 'u')
2026/10/15 23:31:53 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: disagrees with its own path (host="wrong-host.go.tito.io" account="bac" app="tito")
2026/10/15 23:31:53 provision: skipping record apps/bac/tito/instances/acme$evil.go.tito.io.json: host "acme$evil.go.tito.io" is not a hostname
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: skipping record apps/bac/tito/instances/acme$evil.go.tito.io.json: host "acme$evil.go.tito.io" is not a hostname
2026/10/15 23:31:53 provision: not removing acme$evil.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/15 23:31:53 provision: skipping record apps/bac/tito/instances/bad-service.go.tito.io.json: invalid shape: kind service with no addr: the platform only proxies to a service, so the record must name the upstream it proxies to
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: skipping record apps/bac/tito/instances/bad-service.go.tito.io.json: invalid shape: kind service with no addr: the platform only proxies to a service, so the record must name the upstream it proxies to
2026/10/15 23:31:53 provision: not removing bad-service.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/15 23:31:53 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: skipping record apps/bac/tito/instances/no-channel.go.tito.io.json: empty channel
2026/10/15 23:31:53 provision: not removing no-channel.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: skipping record apps/bac/tito/instances/acme.go.tito.io.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/15 23:31:53 provision: not removing acme.go.tito.io: its record exists but could not be read cleanly this pass
2026/10/15 23:31:53 provision: removed retired instance route ghost.go.tito.io (record gone)
2026/10/15 23:31:53 provision: duplicate host dup.go.tito.io: keeping apps/bac/tito/instances/dup.go.tito.io.json, skipping apps/bad/tito/instances/dup.go.tito.io.json
2026/10/15 23:31:53 provision: minted instance route dup.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/15 23:31:53 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/15 23:31:53 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/15 23:31:53 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:53 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/15 23:31:53 provision: removed retired static route site.go.tito.io (app in the trash)
2026/10/15 23:31:53 provision: trash marker for bac/tito unreadable: release: malformed trash marker for bac/tito: invalid character 'n' looking for beginning of object key string — not minting for this app
2026/10/15 23:31:53 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/15 23:31:53 provision: removed retired instance route acme.go.tito.io (app in the trash)
2026/10/15 23:31:53 provision: bac/tito is in the trash — not minting instance routes for it
2026/10/15 23:31:53 provision: trash marker for bac/tito unreadable: release: malformed trash marker for bac/tito: invalid character 'n' looking for beginning of object key string — not minting for this app
2026/10/15 23:31:54 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/15 23:31:54 provision: converged acme.go.tito.io channel stable -> edge
2026/10/15 23:31:54 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/15 23:31:54 provision: converged acme.go.tito.io channel canary/rehearsal -> edge
2026/10/15 23:31:54 provision: converged acme.go.tito.io environment "staging" -> ""
2026/10/15 23:31:54 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/15 23:31:54 provision: acme.go.tito.io exists but is not the route this record describes (backing "unit" (box-scoped, not expressible in a record)) — leaving it alone
2026/10/15 23:31:54 provision: acme.go.tito.io exists but is not the route this record describes (tunnel "pi-fleet" (box-scoped, not expressible in a record)) — leaving it alone
2026/10/15 23:31:54 provision: acme.go.tito.io exists but is not the route this record describes (caps "port:25" (box-scoped, not expressible in a record)) — leaving it alone
2026/10/15 23:31:54 provision: acme.go.tito.io exists but is not the route this record describes (platform (owned by the domains reconcile pass)) — leaving it alone
2026/10/15 23:31:54 provision: acme.go.tito.io exists but is not the route this record describes (canary (owned by the domains reconcile pass)) — leaving it alone
2026/10/15 23:31:54 provision: acme.go.tito.io exists but is not the route this record describes (db "/data/other.db"/"/data/acme.go.tito.io.db") — leaving it alone
2026/10/15 23:31:54 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/15 23:31:54 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/15 23:31:54 provision: dry-run: would mint instance route acme.go.tito.io (app "tito" acct "bac" channel "stable")
2026/10/15 23:31:54 provision: dry-run: would adopt existing route adopt.go.tito.io (app "tito" acct "bac") — this record would own its channel and environment
2026/10/15 23:31:54 provision: dry-run: would converge adopt.go.tito.io channel stable -> edge
2026/10/15 23:31:54 provision: dry-run: would converge adopt.go.tito.io environment "" -> "staging"
2026/10/15 23:31:54 provision: dry-run: would converge owned.go.tito.io channel stable -> edge
2026/10/15 23:31:54 provision: dry-run: would converge owned.go.tito.io environment "" -> "staging"
2026/10/15 23:31:54 provision: dry-run: would converge owned.go.tito.io hibernate false -> true
2026/10/15 23:31:54 provision: dry-run: would converge owned.go.tito.io seed
2026/10/15 23:31:54 provision: dry-run: would remove retired instance route gone.go.tito.io (record gone)
2026/10/15 23:31:54 provision: adopted existing route adopt.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/15 23:31:54 provision: converged adopt.go.tito.io channel stable -> edge
2026/10/15 23:31:54 provision: converged adopt.go.tito.io environment "" -> "staging"
2026/10/15 23:31:54 provision: converged owned.go.tito.io channel stable -> edge
2026/10/15 23:31:54 provision: converged owned.go.tito.io environment "" -> "staging"
2026/10/15 23:31:54 provision: converged owned.go.tito.io hibernate false -> true
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: removed retired instance route gone.go.tito.io (record gone)
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: adopted existing route story.carlosframework.com (app "story" acct "bad") — this record now owns its channel and environment
2026/10/15 23:31:54 provision: story.carlosframework.com exists but is not the route this record describes (kind "instance"/"static") — leaving it alone
2026/10/15 23:31:54 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted service route pub.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted service route pubs.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted service route loop.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted service route named.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted service route priv.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route unit.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route exec.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted static route pisite.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted static route site.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: removed retired static route site.go.tito.io (record gone)
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: converged acme.go.tito.io replicas "ie,uk" -> "uk"
2026/10/15 23:31:54 provision: converged acme.go.tito.io replicas "uk" -> ""
2026/10/15 23:31:54 provision: minted instance route acme-uk.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: converged acme-uk.go.tito.io replica mark true -> false
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: acme.go.tito.io: row is on the nested layout (db "/data/instances/acme.go.tito.io/acme.go.tito.io.db" socket "/run/carlos/instances/acme.go.tito.io/app.sock"); the record's shared paths are not drift
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route router.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:54 provision: router.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/15 23:31:54 provision: acme.go.tito.io: not minting this pass: the box's layout intent could not be read: store down
2026/10/15 23:31:54 provision: adopted existing route acme.go.tito.io (app "tito" acct "bac") — this record now owns its channel and environment
2026/10/15 23:31:54 provision: converged acme.go.tito.io channel stable -> edge
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/15 23:31:54 provision: not removing acme.go.tito.io (record gone): participant of a running operation
2026/10/15 23:31:54 provision: removed retired instance route acme.go.tito.io (record gone)
2026/10/15 23:31:54 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
2026/10/15 23:31:54 provision: refusing to mint held route acme.go.tito.io (app "tito" acct "bac"): this box declares CARLOS_INBOUND=none (no-inbound) and cannot serve routed instance traffic
2026/10/15 23:31:54 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/15 23:31:54 provision: acme.go.tito.io: held restoring by rb_other, not by mv_acme; leaving it
2026/10/15 23:31:54 provision: acme.go.tito.io: the row is not this pass's (app "other" acct ""); not holding it for mv_acme
2026/10/15 23:31:54 provision: acme.go.tito.io exists but is not the route this record describes (app "other"/"tito") — leaving it alone
2026/10/15 23:31:54 provision: dry-run: would mint instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac" channel "stable")
2026/10/15 23:31:54 provision: acme.go.tito.io: not held landing by mv_acme: the row's hold changed under this pass; the next pass judges it afresh
2026/10/15 23:31:54 provision: held acme.go.tito.io landing by mv_acme (was ready)
2026/10/15 23:31:54 provision: minted instance route acme.example.com (app "shop" acct "bac")
2026/10/15 23:31:54 provision: minted instance route plain.example.com (app "shop" acct "bac")
2026/10/15 23:31:54 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/15 23:31:54 provision: skipping record apps/bac/shop/instances/liar.shop.example.com.json: disagrees with its own path (host="other.shop.example.com" account="bac" app="shop")
2026/10/15 23:31:54 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/15 23:31:54 provision: skipping record apps/bac/shop/instances/liar.shop.example.com.json: disagrees with its own path (host="other.shop.example.com" account="bac" app="shop")
2026/10/15 23:31:54 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/15 23:31:54 provision: skipping record apps/bac/shop/instances/liar.shop.example.com.json: disagrees with its own path (host="other.shop.example.com" account="bac" app="shop")
2026/10/15 23:31:54 provision: skipping record apps/bac/shop/instances/garbled.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/15 23:31:54 provision: listing apps/bac/shop/instances/: list refused — its records are unseen this pass
2026/10/15 23:31:54 provision: a.shop.example.com: swapped for import sd_txb3xiiw5xuhelg7xuye3vi5ti (the original route is journaled)
2026/10/15 23:31:54 provision: a.shop.example.com: import sd_txb3xiiw5xuhelg7xuye3vi5ti committed: its gate is cleared and its journal row dropped
2026/10/15 23:31:54 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_ynlvsz4oshms6y745rr3s6zdmy rolled back to its original route
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_ynlvsz4oshms6y745rr3s6zdmy: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_ynlvsz4oshms6y745rr3s6zdmy is cleaned up and its journal row retired
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_waktldflnitmtmvr3szaqs46me rolled back to its original route
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_waktldflnitmtmvr3szaqs46me: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_waktldflnitmtmvr3szaqs46me is cleaned up and its journal row retired
2026/10/15 23:31:55 provision: dry-run: would redo a.shop.example.com's swap record CAS for import sd_c5pilhfr25vynlt3vipfupn3aq
2026/10/15 23:31:55 provision: dry-run: would clear a.shop.example.com's import gate
2026/10/15 23:31:55 provision: dry-run: would converge a.shop.example.com seed source
2026/10/15 23:31:55 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/15 23:31:55 provision: a.shop.example.com: the import's record apps/bac/shop/instances/a.shop.example.com.json is not one this pass can use (connection reset)
2026/10/15 23:31:55 provision: a.shop.example.com: the import's record apps/bac/shop/instances/a.shop.example.com.json is not one this pass can use (provision: invalid maintenance projection or protected fields)
2026/10/15 23:31:55 provision: a.shop.example.com: the import's record apps/bac/shop/instances/a.shop.example.com.json is not one this pass can use (the record under apps/bac/shop/instances/a.shop.example.com.json is apps/bac/shop/instances/b.shop.example.com.json's)
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_3x577ant6sdbz2tyacwacslkpu cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_5io6her7fj6despbeg7cgilxia cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_34iq4nd5iaizbadi42mqazjw4a is journaled, but this box cannot act on imports; its row is left alone
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_qrmfbacrwd3p2aupyqcoks45wu is journaled, but this box cannot act on imports; its row is left alone
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_ky5cepqjldtutw5zsu7jantniu is journaled, but this box cannot act on imports; its row is left alone
2026/10/15 23:31:55 provision: the import journal could not be read: registry: import journal a.shop.example.com: original row: unexpected end of JSON input (no import is acted on and no route is removed this pass)
2026/10/15 23:31:55 provision: b.shop.example.com: import sd_xwfk37avpnrw6sgy2obgxdi5i4 left alone this pass: the import journal could not be read
2026/10/15 23:31:55 provision: c.shop.example.com: import sd_ogi2i3zl3epdfmif6sh4dvxdoa left alone this pass: the import journal could not be read
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_knjhurum6flnrtcs63lneqpb5e committed: its gate is cleared and its journal row dropped
2026/10/15 23:31:55 provision: a.shop.example.com: not converging import sd_klx7xbb26kxnftddkzcsbqhogm: it is swapped but not committed, and the row on this box has no import gate
2026/10/15 23:31:55 provision: a.shop.example.com: not converging import sd_3khzdjivi7m57bv4rvogq2meo4: it is swapped but not committed, and the row on this box has no import gate
2026/10/15 23:31:55 provision: a.shop.example.com: not converging import sd_fct2ajhzd3xvp4hslyymhrmotq: it is placed but not committed, and the row on this box has no import gate
2026/10/15 23:31:55 provision: a.shop.example.com: not converging import sd_ardjhyr3lbeeih4dhegnoyoica: it is placed but not committed, and the row on this box has no import gate
2026/10/15 23:31:55 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/15 23:31:55 provision: converge seed source on a.shop.example.com: constraint failed: seed_source is read-only here (1811)
2026/10/15 23:31:55 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_7tgg2hzni2x3whoi2o7x7sroru committed: its gate is cleared and its journal row dropped
2026/10/15 23:31:55 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/15 23:31:55 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:55 provision: acme.go.tito.io: row is on the nested layout (db "/data/instances/acme.go.tito.io/acme.go.tito.io.db" socket "/run/carlos/instances/acme.go.tito.io/app.sock"); the record's shared paths are not drift
2026/10/15 23:31:55 provision: acme.go.tito.io: not minting a seeded instance: this box does not mint nested (<nil>)
2026/10/15 23:31:55 provision: acme.go.tito.io: not minting a seeded instance: claim control is on for this box
2026/10/15 23:31:55 provision: acme.go.tito.io: aborted seed sd_edtqxbitv3vm3dkffoalnuhnii: this box cannot read seed markers, and places no seed; nothing local is removed
2026/10/15 23:31:55 provision: acme.go.tito.io: aborted seed sd_edtqxbitv3vm3dkffoalnuhnii rolled back (no box had swapped it)
2026/10/15 23:31:55 provision: acme.go.tito.io: not minting a seeded instance: its record does not describe a hibernating instance
2026/10/15 23:31:55 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:55 provision: removed instance route acme.go.tito.io (its seed sd_ixhmkvkgq6zgvpbtiiro74av3u was aborted); the next pass rolls it back
2026/10/15 23:31:55 provision: acme.go.tito.io: aborted seed sd_ixhmkvkgq6zgvpbtiiro74av3u: this box cannot read seed markers, and places no seed; nothing local is removed
2026/10/15 23:31:55 provision: acme.go.tito.io: aborted seed sd_ixhmkvkgq6zgvpbtiiro74av3u rolled back (no box had swapped it)
2026/10/15 23:31:55 provision: acme.go.tito.io: aborted seed sd_siljih5lswd436v5jpgh64dv7y has a row this pass may not remove; leaving the seed aborted
2026/10/15 23:31:55 provision: acme.go.tito.io: aborted seed sd_ku6hmphb52im4ucd6xh75itcbq rolled back (no box had swapped it)
2026/10/15 23:31:55 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:55 provision: removed instance route acme.go.tito.io (its seed sd_4bsquqnnrscjvysy7sntz7hhte was aborted); the next pass rolls it back
2026/10/15 23:31:55 provision: acme.go.tito.io: aborted seed sd_4bsquqnnrscjvysy7sntz7hhte has no route on this box: its local data is removed
2026/10/15 23:31:55 provision: acme.go.tito.io: aborted seed sd_4bsquqnnrscjvysy7sntz7hhte rolled back (no box had swapped it)
2026/10/15 23:31:55 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:55 provision: a.shop.example.com: swapped for import sd_k557xclr6szfkcb5snojkomlba (the original route is journaled)
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_k557xclr6szfkcb5snojkomlba rolled back to its original route
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_k557xclr6szfkcb5snojkomlba is cleaned up and its journal row retired
2026/10/15 23:31:55 provision: a.shop.example.com: swapped for import sd_tcemuokgl22m6zlt5mpzynqszm (the original route is journaled)
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_tcemuokgl22m6zlt5mpzynqszm rolled back to its original route
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_tcemuokgl22m6zlt5mpzynqszm is cleaned up and its journal row retired
2026/10/15 23:31:55 provision: a.shop.example.com: swapped for import sd_rbi2cbt3rs2tzybbmef5a33ozy (the original route is journaled)
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_rbi2cbt3rs2tzybbmef5a33ozy rolled back to its original route
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_rbi2cbt3rs2tzybbmef5a33ozy: the host's replica is left alone: its record no longer names this seed
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_rbi2cbt3rs2tzybbmef5a33ozy is cleaned up and its journal row retired
2026/10/15 23:31:55 provision: a.shop.example.com: swapped for import sd_zuezbxqa6p7y75hw6tdseb2sve (the original route is journaled)
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_zuezbxqa6p7y75hw6tdseb2sve rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_zuezbxqa6p7y75hw6tdseb2sve rolled back to its original route
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_zuezbxqa6p7y75hw6tdseb2sve is cleaned up and its journal row retired
2026/10/15 23:31:55 provision: a.shop.example.com: swapped for import sd_ajdjot6tqazxdwpkkyrzgt5yxq (the original route is journaled)
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_ajdjot6tqazxdwpkkyrzgt5yxq rollback deferred: the host is not fenced and stopped yet (stop unproven)
2026/10/15 23:31:55 provision: a.shop.example.com: swapped for import sd_rysmq2hzvx3uzkjsr2kss22p4u (the original route is journaled)
2026/10/15 23:31:55 provision: a.shop.example.com: import sd_rysmq2hzvx3uzkjsr2kss22p4u is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_drnk2ff256xz6swz3hv6bibv3q (the original route is journaled)
2026/10/15 23:31:56 provision: skipping record apps/bac/shop/instances/a.shop.example.com.json: malformed: provision: invalid maintenance projection or protected fields
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_drnk2ff256xz6swz3hv6bibv3q left alone this pass: its record could not be read
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_iaegvhzhxye24hmjgbhsige65u (the original route is journaled)
2026/10/15 23:31:56 provision: skipping record apps/bac/shop/instances/a.shop.example.com.json: read failed: connection reset
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_iaegvhzhxye24hmjgbhsige65u left alone this pass: its record could not be read
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_huvuw6otkq5mdfcouqtxluqdda (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_huvuw6otkq5mdfcouqtxluqdda: close the import gate: constraint failed: injected (1811)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_huvuw6otkq5mdfcouqtxluqdda rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_huvuw6otkq5mdfcouqtxluqdda is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_4h5ci7pquyyvt52rvv6szosz6u (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_4h5ci7pquyyvt52rvv6szosz6u: close the import gate: constraint failed: injected (1811)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_4h5ci7pquyyvt52rvv6szosz6u rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_4h5ci7pquyyvt52rvv6szosz6u is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_dskasdtjb52p7zmpetoi2ahsmm (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_dskasdtjb52p7zmpetoi2ahsmm rollback deferred: the host is not fenced and stopped yet (injected failure at fence)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_dskasdtjb52p7zmpetoi2ahsmm rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_dskasdtjb52p7zmpetoi2ahsmm is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_otvw62w6t3qs62j4lmrntbhetm (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_otvw62w6t3qs62j4lmrntbhetm rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_otvw62w6t3qs62j4lmrntbhetm is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_jjg2czvxqeqznqyrzonqjsdzhq (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_jjg2czvxqeqznqyrzonqjsdzhq: retire its instance key: injected failure at retire-key
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_jjg2czvxqeqznqyrzonqjsdzhq rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_jjg2czvxqeqznqyrzonqjsdzhq is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_qfjju4weitcm3dnxlos337hnii (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_qfjju4weitcm3dnxlos337hnii rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_qfjju4weitcm3dnxlos337hnii is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_zsf6cos2cx7dshz7wextn6jpfi (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_zsf6cos2cx7dshz7wextn6jpfi: remove its local data: injected failure at remove-local
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_zsf6cos2cx7dshz7wextn6jpfi rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_zsf6cos2cx7dshz7wextn6jpfi is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_5mqtssgn24tghyl2437opc6zzq (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_5mqtssgn24tghyl2437opc6zzq rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_5mqtssgn24tghyl2437opc6zzq is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_gclopagxuoea7id2bggas54lmi (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_gclopagxuoea7id2bggas54lmi: remove its local data: injected failure at remove-local-done
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_gclopagxuoea7id2bggas54lmi rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_gclopagxuoea7id2bggas54lmi is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_lgyulx3eqtdddfrozkakfe7hce (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_lgyulx3eqtdddfrozkakfe7hce rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_lgyulx3eqtdddfrozkakfe7hce is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_i4ypxntuiimfcy3ya3ybfvmyvi (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_i4ypxntuiimfcy3ya3ybfvmyvi: restore the original route: constraint failed: injected (1811)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_i4ypxntuiimfcy3ya3ybfvmyvi rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_i4ypxntuiimfcy3ya3ybfvmyvi is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_7i355encdkixu2y6flwsnr3tse (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_7i355encdkixu2y6flwsnr3tse: restore the original route: constraint failed: injected (1811)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_7i355encdkixu2y6flwsnr3tse rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_7i355encdkixu2y6flwsnr3tse is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_tnfiszvga2mh6o7sjdzpl74xyy (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_tnfiszvga2mh6o7sjdzpl74xyy is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_kbzmt6eursgqcko47rgmq4gabq (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_kbzmt6eursgqcko47rgmq4gabq rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_kbzmt6eursgqcko47rgmq4gabq: delete its snapshot: injected failure at delete-snapshot
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_kbzmt6eursgqcko47rgmq4gabq is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_zrc5se4ce253uchua2nunratim (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_zrc5se4ce253uchua2nunratim rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_zrc5se4ce253uchua2nunratim is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_iqaqjsl33hsrstla3ivwfozy24 (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_iqaqjsl33hsrstla3ivwfozy24 rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_iqaqjsl33hsrstla3ivwfozy24: delete the host's replica: injected failure at delete-replica
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_iqaqjsl33hsrstla3ivwfozy24 is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_i6u2qtkmjrwweuvhlfcorjdsye (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_i6u2qtkmjrwweuvhlfcorjdsye rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_i6u2qtkmjrwweuvhlfcorjdsye is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_xvcmt2dxpvmu35kklfm47cxehq (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_xvcmt2dxpvmu35kklfm47cxehq rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_xvcmt2dxpvmu35kklfm47cxehq: retire its journal row: constraint failed: injected (1811)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_xvcmt2dxpvmu35kklfm47cxehq is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_wl6m6qnucz2gz6srq7palrluxy (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_wl6m6qnucz2gz6srq7palrluxy rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_wl6m6qnucz2gz6srq7palrluxy: retire its journal row: constraint failed: injected (1811)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_wl6m6qnucz2gz6srq7palrluxy is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_yurrhyj726jpy2svpqnlmwfg7y (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_yurrhyj726jpy2svpqnlmwfg7y rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_yurrhyj726jpy2svpqnlmwfg7y is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: mark import sd_yurrhyj726jpy2svpqnlmwfg7y rolled back: injected failure at cas
2026/10/15 23:31:56 provision: a.shop.example.com: aborted seed sd_yurrhyj726jpy2svpqnlmwfg7y rolled back (no box had swapped it)
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_t2qutwmskvaewezstdmolv5wtm (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_t2qutwmskvaewezstdmolv5wtm rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_t2qutwmskvaewezstdmolv5wtm is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: aborted seed sd_t2qutwmskvaewezstdmolv5wtm rolled back (no box had swapped it)
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_bkofqoio3u362da4jzw5x6r6ci (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_bkofqoio3u362da4jzw5x6r6ci rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_bkofqoio3u362da4jzw5x6r6ci rollback deferred: the host is not fenced and stopped yet (<nil>)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_bkofqoio3u362da4jzw5x6r6ci rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_bkofqoio3u362da4jzw5x6r6ci is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_fy6pfldbktjr26rold7yznv6s4 (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_fy6pfldbktjr26rold7yznv6s4 rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_fy6pfldbktjr26rold7yznv6s4 is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_vgc6dkjmrhnux6e4dvl4gczh7e (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_vgc6dkjmrhnux6e4dvl4gczh7e rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_vgc6dkjmrhnux6e4dvl4gczh7e is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_z3mtvgxompmqekfyh5bi2tafyi (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_z3mtvgxompmqekfyh5bi2tafyi rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_z3mtvgxompmqekfyh5bi2tafyi is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_4dggbwm6nulttjm2rhxetmwgra (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_4dggbwm6nulttjm2rhxetmwgra rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_4dggbwm6nulttjm2rhxetmwgra is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_xtojekauit5lkepcwl4fyu23am (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_xtojekauit5lkepcwl4fyu23am rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_xtojekauit5lkepcwl4fyu23am is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_3ycsz22ikewa537p23red3cboe (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_3ycsz22ikewa537p23red3cboe rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_3ycsz22ikewa537p23red3cboe is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_hbumifxkfhe2calmtt5bx7efxm (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_hbumifxkfhe2calmtt5bx7efxm rolled back to its original route
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_hbumifxkfhe2calmtt5bx7efxm is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: minted instance route a.shop.example.com (app "other" acct "bac")
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_hbskzbfzrfgimozyvoiqer5jkq (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_hbskzbfzrfgimozyvoiqer5jkq has no route on this box: its local data is removed and no route is put back
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_hbskzbfzrfgimozyvoiqer5jkq is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_3sie2zkfcrk6slplnztztutvqa (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_a3uj774cjro4vpamlzgy7ciqca (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_c2oy7qnsuelsrbibez3qu5yaly (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_c2oy7qnsuelsrbibez3qu5yaly cannot roll back on this box: the activator is not wired; it stays journaled and gated
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_4mnmbkhr3wvs5o2hssyhvs6tq4 (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_4mnmbkhr3wvs5o2hssyhvs6tq4 is not rolled back: the route changed under the fence, so nothing there is touched
2026/10/15 23:31:56 provision: a.shop.example.com: import "../not-a-seed" names no snapshot and no replica; only its journal row is cleaned up
2026/10/15 23:31:56 provision: a.shop.example.com: import ../not-a-seed is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_ktqmaq25thdhwklbnq44m6xksm (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_fid64keq34rwoeij2gaivilzye (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_6hw727277gosrrdzfdbkc2zppy (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_bmqenhcev6zg7n2wn2eokjc7qm (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_baaj4uspmyyngl7nm52xltblyq (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_baaj4uspmyyngl7nm52xltblyq rollback deferred: the host is not fenced and stopped yet (stop evidence unreadable)
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_zvjexstgulz3rfsh7sm3op55zm (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_zvjexstgulz3rfsh7sm3op55zm has no route on this box: its local data is removed and no route is put back
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_zvjexstgulz3rfsh7sm3op55zm is cleaned up and its journal row retired
2026/10/15 23:31:56 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_qxr7ifk5szadx4akfay3lo5wri (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_qxr7ifk5szadx4akfay3lo5wri: remove its local data: injected failure at remove-local
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_qxr7ifk5szadx4akfay3lo5wri is not rolled back: the route at the host is not the import's, so nothing there is touched
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_xqaulejkqbdtso6om5fhl5sv5q (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_xqaulejkqbdtso6om5fhl5sv5q: a route appeared at the host, so its local database is left and the rollback waits
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_y6q62haccddxgr7h7ebrpphzzi (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_y6q62haccddxgr7h7ebrpphzzi rollback deferred: no fence generation: registry busy
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_srvwfr3it55un3bm5574pnmrdu (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import sd_srvwfr3it55un3bm5574pnmrdu rollback deferred: no fence generation: the generation source answered 0
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_54axda3spnhrxmoevd5zan6mc4 (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_ls5pw3ormyi327zgegovsjn5ri (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: swapped for import sd_z3bwxtk2lo3pwcqskbft3e5qua (the original route is journaled)
2026/10/15 23:31:56 provision: a.shop.example.com: import deferred: this box cannot read the instance's env file
2026/10/15 23:31:56 provision: a.shop.example.com: import deferred: the instance's env file could not be read: a symlink
2026/10/15 23:31:57 provision: a.shop.example.com: swapped for import sd_if4ku6ru4rxo3jpk2hchqpn3e4 (the original route is journaled)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_if4ku6ru4rxo3jpk2hchqpn3e4 rolled back to its original route
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_if4ku6ru4rxo3jpk2hchqpn3e4 is cleaned up and its journal row retired
2026/10/15 23:31:57 provision: a.shop.example.com: swapped for import sd_on5jhvn7bx6yxk4zgtkh2zzekm (the original route is journaled)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_on5jhvn7bx6yxk4zgtkh2zzekm rolled back to its original route
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_on5jhvn7bx6yxk4zgtkh2zzekm is cleaned up and its journal row retired
2026/10/15 23:31:57 provision: a.shop.example.com: swapped for import sd_smz6smfsdhjidxhjhbpgoibvum (the original route is journaled)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_smz6smfsdhjidxhjhbpgoibvum rolled back to its original route
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_smz6smfsdhjidxhjhbpgoibvum is cleaned up and its journal row retired
2026/10/15 23:31:57 provision: a.shop.example.com: swapped for import sd_yybm3fzvwmcriuijwb3wcrhzay (the original route is journaled)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_yybm3fzvwmcriuijwb3wcrhzay: retire its instance key: the env file is a symlink
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_yybm3fzvwmcriuijwb3wcrhzay rolled back to its original route
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_yybm3fzvwmcriuijwb3wcrhzay is cleaned up and its journal row retired
2026/10/15 23:31:57 provision: a.shop.example.com: swapped for import sd_2junllezsc7n5borprxxvdduay (the original route is journaled)
2026/10/15 23:31:57 provision: a.shop.example.com: row is on the nested layout (db "/data/instances/a.shop.example.com/a.shop.example.com.db" socket "/run/carlos/instances/a.shop.example.com/app.sock"); the record's shared paths are not drift
2026/10/15 23:31:57 provision: a.shop.example.com: swapped for import sd_n5johg2b5qqkfe3jtb3oywyreq (the original route is journaled)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_khyh3rq4cikf3jefz6xocsenwa refused: there is no route at a.shop.example.com to replace
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_emmzc5y22xpti4hvgskfcahi5a refused: the route's address is 127.0.0.1:9, not 127.0.0.1:8401
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_sfzs42e2bvlpfybdh4xjabdc4e refused: the route's address is 127.0.0.1:8401,127.0.0.1:8402, not 127.0.0.1:8401
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_f4chpqt4jkdyxnjt32nmfpfwzy refused: the route's address is 127.0.0.1:9, not 127.0.0.1:8401
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_hp4zbqkkrvmpy2lxcygr6pfpo4 refused: the route belongs to app other
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_u5hj64sexpjmrujv6xr65i46hy refused: the route is filed under another account
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_tckthjg6yjbyaatqlunp77oc7y refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_dbh5gir2cxbo2ownza5xhy3bxi refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_nda5djbscmvmslril566tu4bsa refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_plddnfdcka7lqzw775sgxc7k4a refused: the route is filed under the operator account, and no assignment maps shop to this app
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_6hm4zspvrrph2qur2a5uowzc5a refused: the route is not an address route this import can take over (socket)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_krkug7jdtehocmlkhamtyxnrw4 refused: the route is not an address route this import can take over (no address)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_6jl5welj7elk644trarbl537iq refused: the route is not an address route this import can take over (provisioned)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_rnjagurlknqsscsbxjnyohvjem refused: the route is not an address route this import can take over (kind static)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_bujbeh6r3l7wf7srwllvi6bskm refused: the route is not an address route this import can take over (backing)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_k77kb6hc675yqjrztre2vtjmcy refused: the route is not an address route this import can take over (tunnel)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_st4p5nqu7ctedevudl2q2iv4fe refused: the route is not an address route this import can take over (caps)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_z4yxovsg77w2s3liz3r7wlhzje refused: the route is not an address route this import can take over (platform)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_pf5y6sugkeurjdmubzknzwrssi refused: the route is not an address route this import can take over (canary)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_vquentswitvgkki4csdiomfo4m refused: the route is not an address route this import can take over (kind sidecar)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_rzcu4mmfz3wfqkx3etoyg27may refused: the route is not an address route this import can take over (region)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_qlv6cm2cpulduxtch7e63iw7kq refused: the route is not an address route this import can take over (fleet_box)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_j42ctwrimwsd7izarssvqs6tfe refused: the route is not an address route this import can take over (hibernate)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_nkt46a7xpuoqlhwqelj26cz5di refused: the route is not an address route this import can take over (claim_owner)
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_2ncppua7dsqhmhwnj5uulbel7m refused: this box does not run instances nested
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_5ktegpi3qnbdiavnstychm2gm4 refused: this box does not run instances nested
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_rycpa57ej7dgmrd4j762nf4n3m refused: claim control is on for this box
2026/10/15 23:31:57 provision: a.shop.example.com: swapped for import sd_5qdcmp3wkp5h4ddreq72ntgplq (the original route is journaled)
2026/10/15 23:31:57 provision: a.shop.example.com: swapped for import sd_jxvwkz6egdqf3hhkmov6uytlyq (the original route is journaled)
2026/10/15 23:31:57 provision: a.shop.example.com: import deferred: this box cannot read the legacy route assignments
2026/10/15 23:31:57 provision: a.shop.example.com: import deferred: the legacy route assignments could not be read: store down
2026/10/15 23:31:57 provision: a.shop.example.com: not swapping for import sd_sp4qw4yc7drvyhcmqhpakvqozi: its verify hash is not a sha256
2026/10/15 23:31:57 provision: a.shop.example.com: not swapping for import sd_kcysfkdptalnnt4f3vekf63xiu: its verify hash is not a sha256
2026/10/15 23:31:57 provision: a.shop.example.com: not swapping for import sd_zt74rfn6wjnjuxg4ppzvexuidm: its verify hash is not a sha256
2026/10/15 23:31:57 provision: a.shop.example.com: not swapping for import sd_../../x: its host or seed id is malformed (seeds: not a seed id)
2026/10/15 23:31:57 provision: A.shop.example.com/..: not swapping for import sd_q6qbwl2vvuzkeoon6bijuzneo4: its host or seed id is malformed (seeds: not a host)
2026/10/15 23:31:57 provision: a.shop.example.com: not swapping for import sd_sjr63cptrpqjvai5xc2w3rpcji: its record does not describe a nested, hibernating instance
2026/10/15 23:31:57 provision: a.shop.example.com: not swapping for import sd_pgsahhctsdocwj24etyw2ukgca: its record does not describe a nested, hibernating instance
2026/10/15 23:31:57 provision: a.shop.example.com: not swapping for import sd_7z7ntcgmwtayxu5iwfbzal5fie: its record does not describe a nested, hibernating instance
2026/10/15 23:31:57 provision: a.shop.example.com: not swapping for import sd_k7hpw5nvujxk77dueqx5abbr6m: its record does not describe a nested, hibernating instance
2026/10/15 23:31:57 provision: a.shop.example.com: import deferred: the box's layout intent could not be read: store down
2026/10/15 23:31:57 provision: a.shop.example.com: swapped for import sd_uq6kuctetpvdcflkbevyybd53m (the original route is journaled)
2026/10/15 23:31:57 provision: a.shop.example.com: import deferred: the box's nested probe did not answer: ready probe timed out
2026/10/15 23:31:57 provision: a.shop.example.com: swapped for import sd_fgaanhbrogebah3akx5tuctvfe (the original route is journaled)
2026/10/15 23:31:57 provision: a.shop.example.com: swapped for import sd_mrrrymg56xee5j3y5n7kokpnhq (the original route is journaled)
2026/10/15 23:31:57 provision: a.shop.example.com: import deferred: the route is held by operation op_1
2026/10/15 23:31:57 provision: dry-run: would consider swapping a.shop.example.com for import sd_vxwsmlzaoqimivxcezmzh5a4cy
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_76fx5zztux6ayx5hieg53eykle rolled back to its original route
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_76fx5zztux6ayx5hieg53eykle: the host's replica is left alone: the record apps/bac/shop/instances/a.shop.example.com.json holds the host
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_76fx5zztux6ayx5hieg53eykle is cleaned up and its journal row retired
2026/10/15 23:31:57 provision: a.shop.example.com: import sd_sjes3maqw6grwm2jwifwub6haa left alone: the import journal holds seed sd_afe6ku2e2x6oqv3pzsfvxhvlru at swapped
2026/10/15 23:31:57 provision: a.shop.example.com: not minting import sd_cs7qrmbfnzcq6rnh5vijvjogm4: it is swapped but not committed, and only its swap makes its row
2026/10/15 23:31:57 provision: a.shop.example.com: not minting import sd_zcil2ltw4uqgwanldm3ehdg64a: it is placed but not committed, and only its swap makes its row
2026/10/15 23:31:57 provision: a.shop.example.com: swapped for import sd_dwkoej4klnwwqqh4avsxjlezf4 (the original route is journaled)
2026/10/15 23:31:57 provision: a.shop.example.com: not minting import sd_dwkoej4klnwwqqh4avsxjlezf4: it is swapped but not committed, and only its swap makes its row
2026/10/15 23:31:57 provision: a.shop.example.com: not minting import sd_dwkoej4klnwwqqh4avsxjlezf4: it is placed but not committed, and only its swap makes its row
2026/10/15 23:31:57 provision: minted instance route a.shop.example.com (app "shop" acct "bac")
2026/10/15 23:31:57 provision: removed retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/15 23:31:57 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/15 23:31:57 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/15 23:31:57 provision: converged sidecar bot.eleven.bac.sidecar.internal args ["sidecar","run"] -> ["worker","run"]
2026/10/15 23:31:57 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/15 23:31:57 provision: converged sidecar bot.eleven.bac.sidecar.internal ceilings 300/3600 -> 60/120
2026/10/15 23:31:57 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/15 23:31:57 provision: converged sidecar bot.eleven.bac.sidecar.internal channel stable -> canary/eleven
2026/10/15 23:31:57 provision: converged sidecar bot.eleven.bac.sidecar.internal environment "other" -> "relay"
2026/10/15 23:31:57 provision: converged sidecar bot.eleven.bac.sidecar.internal hibernate true -> false
2026/10/15 23:31:57 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: read failed: failStore: reads disabled under apps/bac/eleven/sidecars/
2026/10/15 23:31:57 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: malformed: invalid character 'n' looking for beginning of object key string
2026/10/15 23:31:57 provision: not removing sidecar bot.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/15 23:31:57 provision: skipping sidecar record apps/bac/eleven/sidecars/bot.json: empty channel
2026/10/15 23:31:57 provision: skipping sidecar record apps/bac/eleven/sidecars/held.json: empty channel
2026/10/15 23:31:57 provision: not removing sidecar held.eleven.bac.sidecar.internal: its record exists but could not be read cleanly this pass
2026/10/15 23:31:57 provision: removed retired sidecar route old.eleven.bac.sidecar.internal (record gone)
2026/10/15 23:31:58 provision: bac/eleven has sidecar records but no sidecars manifest — not minting
2026/10/15 23:31:58 provision: bac/eleven is in the trash — not minting sidecar routes for it
2026/10/15 23:31:58 provision: sidecar bot.eleven.bac.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/15 23:31:58 provision: sidecar hub.relay.bac.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/15 23:31:58 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/15 23:31:58 provision: minted sidecar route hub.relay.bac.sidecar.internal (app "relay" acct "bac" args ["relay"])
2026/10/15 23:31:58 provision: sidecar bot.eleven.bac.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/15 23:31:58 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/15 23:31:58 provision: sidecar bot.eleven.bac.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/15 23:31:58 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/15 23:31:58 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/15 23:31:58 provision: sidecar bot.eleven.bac.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/15 23:31:58 provision: removed retired sidecar route bot.eleven.bac.sidecar.internal (record gone)
2026/10/15 23:31:58 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/15 23:31:58 provision: sidecar bot.eleven.bac.sidecar.internal is not placeable here: it asks for "no-inbound" placement and this box accepts inbound work (CARLOS_INBOUND="")
2026/10/15 23:31:58 provision: skipping sidecar record apps/bac/relay/sidecars/hub.json: read failed: failStore: reads disabled under apps/bac/relay/sidecars/
2026/10/15 23:31:58 provision: REFUSING to mint sidecar bot.eleven.bac.sidecar.internal: bot.eleven.bac.sidecar.internal-sidecar.env is staged on this box — the legacy file co-spawn and a native sidecar row are two mechanisms for one host; remove the file to migrate this host onto sidecar records
2026/10/15 23:31:58 provision: minted sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" args ["sidecar","run"])
2026/10/15 23:31:58 provision: dry-run: would mint sidecar route bot.eleven.bac.sidecar.internal (app "eleven" acct "bac" channel "stable" args ["sidecar","run"])
2026/10/15 23:31:58 provision: dry-run: would remove retired sidecar route gone.eleven.bac.sidecar.internal (record gone)
2026/10/15 23:31:58 provision: bot.eleven.bac.sidecar.internal exists but is not a sidecar row this pass owns (kind "sidecar" provisioned false app "eleven" acct "bac") — leaving it alone
2026/10/15 23:31:58 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:58 provision: converged acme.go.tito.io update settings "{\"updates\":\"manual\",\"channel\":\"stable\"}" -> ""
2026/10/15 23:31:58 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:58 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:58 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/15 23:31:58 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/15 23:31:58 provision: acme.go.tito.io: not minted this pass: the app's update policy could not be read
2026/10/15 23:31:58 provision: minted instance route acme.go.tito.io (app "tito" acct "bac")
2026/10/15 23:31:58 provision: manifest bac/tito: read failed: provision: manifest bac/tito: unexpected end of JSON input
2026/10/15 23:31:58 provision: acme.go.tito.io: not minted this pass: the app's update policy could not be read
2026/10/15 23:31:58 provision: minted instance route acme.go.tito.io held landing by mv_acme (app "tito" acct "bac")
FAIL
FAIL	github.com/carlosframework/platform/internal/provision	34.796s
ok  	github.com/carlosframework/platform/internal/publicrelease	0.007s
?   	github.com/carlosframework/platform/internal/regionname	[no test files]
ok  	github.com/carlosframework/platform/internal/registry	5.415s
ok  	github.com/carlosframework/platform/internal/relay	7.230s
ok  	github.com/carlosframework/platform/internal/release	22.372s
ok  	github.com/carlosframework/platform/internal/rollout	3.732s
ok  	github.com/carlosframework/platform/internal/rolloutwords	0.003s
ok  	github.com/carlosframework/platform/internal/rootaws	0.007s
ok  	github.com/carlosframework/platform/internal/rootparticipation	0.058s
ok  	github.com/carlosframework/platform/internal/rootstate	0.026s
ok  	github.com/carlosframework/platform/internal/runs	0.573s
ok  	github.com/carlosframework/platform/internal/s3compat	0.004s
ok  	github.com/carlosframework/platform/internal/safefile	0.004s
ok  	github.com/carlosframework/platform/internal/schedule	2.483s
ok  	github.com/carlosframework/platform/internal/seeds	0.011s
ok  	github.com/carlosframework/platform/internal/sim/hostlife	9.569s
ok  	github.com/carlosframework/platform/internal/sim/litestreamfacts	3.951s
ok  	github.com/carlosframework/platform/internal/status	0.037s
ok  	github.com/carlosframework/platform/internal/steering	0.006s
ok  	github.com/carlosframework/platform/internal/stopevidence	0.197s
ok  	github.com/carlosframework/platform/internal/svcrole	0.002s
ok  	github.com/carlosframework/platform/internal/telemetry	0.004s
ok  	github.com/carlosframework/platform/internal/termfence	0.005s
ok  	github.com/carlosframework/platform/internal/tunnelclient	0.004s
ok  	github.com/carlosframework/platform/internal/unixdial	0.002s
ok  	github.com/carlosframework/platform/internal/updatewords	0.004s
ok  	github.com/carlosframework/platform/internal/usage	0.004s
ok  	github.com/carlosframework/platform/internal/version	0.002s
ok  	github.com/carlosframework/platform/internal/vet	1.533s
FAIL
make: *** [Makefile:18: test] Error 1

amadan: step gate failed: exit status 2

amadan: job failed at step gate — its output is above, not at the tail of this log
diff --git a/internal/host/claimassembly.go b/internal/host/claimassembly.go
index 7089f1c64..90f74b151 100644
--- a/internal/host/claimassembly.go
+++ b/internal/host/claimassembly.go
@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"github.com/carlosframework/platform/internal/registry"
+ "github.com/carlosframework/platform/internal/rootstate"
"net/http"
"os"
"path/filepath"
@@ -358,7 +359,7 @@ func NewProductionRootClaimStop(ctx context.Context) (http.Handler, error) {
reconcile := *assembly.Reconcile
reconcile.Box, reconcile.Enrollment = actor.Box, actor.Enrollment
reconcile.Census = &hostbox.EmptyInstallationCensus{Inventory: assembly.Reconcile.Inventory, Registry: assembly.Reconcile.Registry, Launches: assembly.Launches, Box: actor.Box, Enrollment: actor.Enrollment, DirectoryRevision: fmt.Sprint(actor.Revision), Roots: assembly.ManagedRoots, SharedPaths: assembly.SharedPaths}
- root := ClaimRootHTTP{InventoryActor: assembly.actorForRoot, Journals: assembly.Journals, RequireNewWork: func(ctx context.Context) error { _, err := assembly.Identity.Verify(ctx); return err }, Launches: assembly.Launches, Stop: stop, Reconcile: reconcile, Roots: assembly.ManagedRoots}
+ root := ClaimRootHTTP{inventoryIdentity: rootstate.Persistent, InventoryActor: assembly.actorForRoot, Journals: assembly.Journals, RequireNewWork: func(ctx context.Context) error { _, err := assembly.Identity.Verify(ctx); return err }, Launches: assembly.Launches, Stop: stop, Reconcile: reconcile, Roots: assembly.ManagedRoots}
state, err := openClaimExecutionAuthority()
if err != nil {
return nil, err
diff --git a/internal/host/claimlaunch_root.go b/internal/host/claimlaunch_root.go
index 086cc4b39..ea069beb4 100644
--- a/internal/host/claimlaunch_root.go
+++ b/internal/host/claimlaunch_root.go
@@ -221,7 +221,7 @@ func (h *ClaimLaunchRoot) startRecorded(ctx context.Context, peer StopPeer, q ho
// The fence, the claim check, the journal intention, the unit start and
// the started record all happen under the host guard a root fence also
// takes, so no fence or second launch interleaves with them.
- err = h.Guard.With(ctx, t.Host, hostguard.Captured{Incarnation: t.Incarnation, Stamp: t.Stamp}, check, func() error {
+ err = h.Guard.With(ctx, t.Host, hostguard.Captured{Incarnation: t.Incarnation, Stamp: t.Stamp}, check, func() (outcome error) {
if history != nil {
if err := history.ConsumeCreation(binding); err != nil {
return err
@@ -235,6 +235,34 @@ func (h *ClaimLaunchRoot) startRecorded(ctx context.Context, peer StopPeer, q ho
return err
}
defer pin.ledger.Store.Close()
+ if pin.closeUpdate != nil {
+ defer pin.closeUpdate()
+ }
+ if pin.finishUpdate != nil {
+ defer func() {
+ finished := pin.finishUpdate(grant.UnitInvocationID, outcome, func() error {
+ started := instancectl.ClaimUnitStarted{Unit: grant.Unit, InvocationID: grant.UnitInvocationID, MainPID: grant.PID, ControlGroup: grant.Group.RelativePath}
+ observed, err := h.waitReady(ctx, started, r.Executable)
+ if err != nil {
+ return err
+ }
+ if observed.ProcessStart != grant.ProcessStart || observed.Group.Device != grant.Group.Device || observed.Group.Inode != grant.Group.Inode {
+ return hostbox.ErrChanged
+ }
+ return h.Units.Same(ctx, started)
+ })
+ if finished != nil && outcome == nil && grant.UnitInvocationID != "" {
+ cleanup, cancel := context.WithTimeout(context.WithoutCancel(ctx), 2*time.Minute)
+ defer cancel()
+ stopped := claimStopInvocation(cleanup, h.Units, t.Host, grant.UnitInvocationID)
+ if stopped == nil {
+ stopped = h.settleGone(cleanup, t, r.ID, grant.UnitInvocationID)
+ }
+ finished = errors.Join(finished, stopped)
+ }
+ outcome = errors.Join(outcome, finished)
+ }()
+ }
}
var e error
grant, e = h.launchLocked(ctx, peer, q, r, pin)
diff --git a/internal/host/claimretire_transport.go b/internal/host/claimretire_transport.go
index d53fad314..18577e431 100644
--- a/internal/host/claimretire_transport.go
+++ b/internal/host/claimretire_transport.go
@@ -6,9 +6,11 @@ import (
"encoding/json"
"errors"
"fmt"
+ "github.com/carlosframework/platform/internal/rootstate"
"io"
"net"
"net/http"
+ "os"
"path/filepath"
"time"
@@ -22,16 +24,17 @@ import (
)
type ClaimRootHTTP struct {
- history rootHistoryAccess
- executionRuntime *claimExecutionRuntime
- Execution *execlease.RootBroker
- InventoryActor func(context.Context) (hostbox.Actor, error)
- RequireNewWork func(context.Context) error
- Journals *hostbox.JournalService
- Launches *hostbox.LaunchJournal
- Stop ClaimStopHTTP
- Reconcile hostbox.ReconcileAdapter
- Roots map[string]string
+ inventoryIdentity func(*os.File) (rootstate.PersistentIdentity, error)
+ history rootHistoryAccess
+ executionRuntime *claimExecutionRuntime
+ Execution *execlease.RootBroker
+ InventoryActor func(context.Context) (hostbox.Actor, error)
+ RequireNewWork func(context.Context) error
+ Journals *hostbox.JournalService
+ Launches *hostbox.LaunchJournal
+ Stop ClaimStopHTTP
+ Reconcile hostbox.ReconcileAdapter
+ Roots map[string]string
}
func (h ClaimRootHTTP) RecoverPending(ctx context.Context) error {
@@ -161,7 +164,7 @@ func (h ClaimRootHTTP) retire(ctx context.Context, target hostguard.FenceTarget)
a.Reconciler.Guard = h.Stop.Coordinator.Guard
a.RequireTimerInventory = a.RequireTimerInventory || a.Reconciler.Guard.Root != nil
a.Stop = func(context.Context, registry.Route) (hostguard.FenceTarget, error) { return target, nil }
- a.Retirement.Filesystem = hostbox.TypedParker{Roots: h.Roots, ParkedRoots: h.Roots, Incarnation: target.Incarnation, Host: target.Host, Retirement: target.FenceID}
+ a.Retirement.Filesystem = hostbox.TypedParker{CapturePersistent: h.inventoryIdentity != nil, Roots: h.Roots, ParkedRoots: h.Roots, Incarnation: target.Incarnation, Host: target.Host, Retirement: target.FenceID}
a.Retirement.Authority = hostbox.InstallationCleanup{Guard: a.Reconciler.Guard, Verify: verifyRetirementReceipt}
a.Retirement.Ack = retirementAcknowledgement(h.Stop.Coordinator.Evidence)
return a.Retire(ctx, row)
diff --git a/internal/host/claimroleassembly_linux.go b/internal/host/claimroleassembly_linux.go
index ad98346c0..1a5bc6e75 100644
--- a/internal/host/claimroleassembly_linux.go
+++ b/internal/host/claimroleassembly_linux.go
@@ -148,7 +148,7 @@ func (a *ClaimRoleAssembly) Launch(ctx context.Context, o hostclaim.Observed, wo
if err = unix.Lstat(stateDir, &stat); err != nil {
return nil, err
}
- if stat.Mode&unix.S_IFMT != unix.S_IFDIR || uint64(stat.Dev) != entry.Device || stat.Ino != entry.Inode {
+ if stat.Mode&unix.S_IFMT != unix.S_IFDIR || (entry.Persistent.Boot != "" && hostbox.VerifyInventoryPath(stateDir, entry) != nil || entry.Persistent.Boot == "" && (uint64(stat.Dev) != entry.Device || stat.Ino != entry.Inode)) {
return nil, hostbox.ErrChanged
}
owned = true
@@ -397,7 +397,7 @@ func (a *ClaimRoleAssembly) PrepareState(ctx context.Context, o hostclaim.Observ
return hostbox.ErrTypedInventory
}
e := inventory.Entries[index]
- if e.Materialization != "materialized" || stat.Mode&unix.S_IFMT != unix.S_IFDIR || uint64(stat.Dev) != e.Device || stat.Ino != e.Inode {
+ if e.Materialization != "materialized" || stat.Mode&unix.S_IFMT != unix.S_IFDIR || (e.Persistent.Boot != "" && hostbox.VerifyInventoryPath(filepath.Join(root, relative), e) != nil || e.Persistent.Boot == "" && (uint64(stat.Dev) != e.Device || stat.Ino != e.Inode)) {
return hostbox.ErrTypedInventory
}
return nil
diff --git a/internal/host/claimstop_kernel_linux.go b/internal/host/claimstop_kernel_linux.go
index 1ce3933c3..1ba6589e8 100644
--- a/internal/host/claimstop_kernel_linux.go
+++ b/internal/host/claimstop_kernel_linux.go
@@ -416,7 +416,11 @@ func (k LinuxStopKernel) recoverAfterReboot(ctx context.Context, t hostguard.Fen
if err != nil {
return refuse(err)
}
- if err := scanStopDescriptors(ctx, k.ProcRoot, j.Files, paths); err != nil {
+ files, err := k.rebootStopFiles(ctx, in, j.Files)
+ if err != nil {
+ return refuse(err)
+ }
+ if err := scanStopDescriptors(ctx, k.ProcRoot, files, paths); err != nil {
return refuse(err)
}
if err := journal.SettleRecovered(ctx, t); err != nil {
diff --git a/internal/host/claimstop_writers_linux.go b/internal/host/claimstop_writers_linux.go
index 3ff206d34..4351d12c7 100644
--- a/internal/host/claimstop_writers_linux.go
+++ b/internal/host/claimstop_writers_linux.go
@@ -21,6 +21,7 @@ import (
"github.com/carlosframework/platform/internal/hostguard"
"github.com/carlosframework/platform/internal/instancectl"
"github.com/carlosframework/platform/internal/provision"
+ "github.com/carlosframework/platform/internal/rootstate"
"github.com/carlosframework/platform/internal/stopevidence"
)
@@ -210,6 +211,15 @@ func rootInstallationCoverage(managed map[string]string, host string, inv StopIn
return nil, nil, ErrClaimStopInventory
}
entry.Device, entry.Inode, entry.Materialization = uint64(st.Dev), st.Ino, "materialized"
+ opened, err := hostbox.OpenInventoryFile(dir)
+ if err != nil {
+ return nil, nil, err
+ }
+ entry.Persistent, err = rootstate.Persistent(opened)
+ opened.Close()
+ if err != nil {
+ return nil, nil, err
+ }
} else if !errors.Is(err, os.ErrNotExist) {
return nil, nil, err
}
@@ -260,8 +270,7 @@ func installationCoverage(managed map[string]string, inv StopInventory, dataOnly
if err != nil {
return nil, nil, err
}
- st, ok := info.Sys().(*syscall.Stat_t)
- if !ok || !info.IsDir() || uint64(st.Dev) != e.Device || st.Ino != e.Inode {
+ if !info.IsDir() || hostbox.VerifyInventoryPath(path, e) != nil {
return nil, nil, fmt.Errorf("%w: %s is not the inventory's directory", ErrClaimStopInventory, path)
}
entries, err := os.ReadDir(path)
diff --git a/internal/host/claimstop_writers_linux_test.go b/internal/host/claimstop_writers_linux_test.go
index 3c2059215..c8589c25a 100644
--- a/internal/host/claimstop_writers_linux_test.go
+++ b/internal/host/claimstop_writers_linux_test.go
@@ -188,7 +188,7 @@ func newWritersKernelFixture(t *testing.T) *writersKernelFixture {
}
sdev, sino := fileID(t, state)
fx.inv = StopInventory{Complete: true, Host: fx.target.Host, Incarnation: "inc-1", InstallationStamp: 11, Box: "box-1", Enrollment: "enrollment-1",
- Entries: []StopInventoryEntry{{Kind: "path", ManagedRoot: "data", RelativePath: "shop.example", Type: syscall.S_IFDIR, Device: sdev, Inode: sino, Materialization: "materialized"}}}
+ Entries: []StopInventoryEntry{{Kind: "path", ManagedRoot: "data", RelativePath: "shop.example", Type: syscall.S_IFDIR, Device: sdev, Inode: sino, Persistent: testPersistentInventory(t, state), Materialization: "materialized"}}}
fx.holdDB(t, 20, 7)
dev, ino := fileID(t, fx.db)
fx.hints = []stopevidence.DescriptorHint{{FD: 7, Device: dev, Inode: ino}}
diff --git a/internal/host/claimunit.go b/internal/host/claimunit.go
index e9e48fb39..5ad6a66df 100644
--- a/internal/host/claimunit.go
+++ b/internal/host/claimunit.go
@@ -22,6 +22,7 @@ const claimControlEnvironment = "EnvironmentFile=-/etc/carlos/host.env\n"
type claimUnitSettings struct {
enabled bool
+ rootRetry bool
data, opt string
}
@@ -83,6 +84,12 @@ func readClaimUnitSettings(path string) (claimUnitSettings, error) {
}
}
}
+ if cfg.enabled {
+ cfg.rootRetry, err = prepareRootRetryUnitDirectory()
+ if err != nil {
+ return claimUnitSettings{}, err
+ }
+ }
return cfg, nil
}
@@ -97,6 +104,9 @@ func claimUnitContent(name string, content []byte, cfg claimUnitSettings) []byte
return strconv.Quote(strings.ReplaceAll(p, "%", "%%"))
}
roots := []string{"/run/carlos-control", "/run/carlos", "/var/lib/carlos-claims", rootReleasePrivate, "/run/systemd/system", cfg.data, cfg.opt, "/etc/systemd/system", "/sys/fs/cgroup"}
+ if cfg.rootRetry {
+ roots = append(roots, rootRetryProjection)
+ }
for i, p := range roots {
roots[i] = quote(p)
}
diff --git a/internal/host/claimunit_test.go b/internal/host/claimunit_test.go
index 4477e43f6..ecd9638f0 100644
--- a/internal/host/claimunit_test.go
+++ b/internal/host/claimunit_test.go
@@ -282,3 +282,18 @@ func TestClaimBadUnitSettingsStillRepairSystemUnits(t *testing.T) {
t.Fatal("unknown settings restarted control service")
}
}
+
+func TestPlan14RootRetryUnitDirectoryScope(t *testing.T) {
+ raw := []byte("[Service]\nReadWritePaths=/run/carlos-control /run/systemd/system\nRestrictAddressFamilies=AF_UNIX\nMemoryMax=64M\n")
+ legacy := claimUnitContent(claimControlUnit, raw, claimUnitSettings{enabled: true, data: "/data", opt: "/opt/carlos"})
+ if bytes.Contains(legacy, []byte(rootRetryProjection)) {
+ t.Fatal("no-census unit received E3 write access")
+ }
+ census := claimUnitContent(claimControlUnit, raw, claimUnitSettings{enabled: true, rootRetry: true, data: "/data", opt: "/opt/carlos"})
+ if !bytes.Contains(census, []byte(" "+rootRetryProjection+"\n")) {
+ t.Fatal("root retry projection is read-only in the controller")
+ }
+ if got := claimUnitContent(claimControlUnit, raw, claimUnitSettings{rootRetry: true}); !bytes.Equal(got, raw) {
+ t.Fatal("disabled claims changed the unit")
+ }
+}
diff --git a/internal/host/plan14_generation_kernel_linux_test.go b/internal/host/plan14_generation_kernel_linux_test.go
index 493875da8..8ac04fcc9 100644
--- a/internal/host/plan14_generation_kernel_linux_test.go
+++ b/internal/host/plan14_generation_kernel_linux_test.go
@@ -215,13 +215,18 @@ func TestPlan14GenerationKernelRetainedFiles(t *testing.T) {
t.Run(attack, func(t *testing.T) {
f := generationProc(t)
b := f.reservation.Binding
+ boot, err := os.ReadFile("/proc/sys/kernel/random/boot_id")
+ if err != nil {
+ t.Fatal(err)
+ }
+ b.Target.BootID = strings.TrimSpace(string(boot))
switch attack {
case "path":
b.Executable.Inode++
case "tree":
b.TreeIdentity.Inode++
}
- err := generationRetainedFiles(b, func(path string) (*os.File, error) {
+ err = generationRetainedFiles(b, func(path string) (*os.File, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
diff --git a/internal/host/plan14_generation_kernel_process_linux_test.go b/internal/host/plan14_generation_kernel_process_linux_test.go
index df4823a88..a241b2cac 100644
--- a/internal/host/plan14_generation_kernel_process_linux_test.go
+++ b/internal/host/plan14_generation_kernel_process_linux_test.go
@@ -8,6 +8,7 @@ import (
"os/exec"
"path/filepath"
"strconv"
+ "strings"
"testing"
)
@@ -101,6 +102,11 @@ func TestPlan14GenerationKernelCgroup(t *testing.T) {
t.Fatal(err)
}
r := readGenerationLaunch(t, d)
+ boot, err := os.ReadFile("/proc/sys/kernel/random/boot_id")
+ if err != nil {
+ t.Fatal(err)
+ }
+ r.Binding.Target.BootID = strings.TrimSpace(string(boot))
root := t.TempDir()
group := filepath.Join(root, r.Process.Group)
if attack != "absent" {
@@ -130,7 +136,7 @@ func TestPlan14GenerationKernelCgroup(t *testing.T) {
t.Fatal(err)
}
}
- err := generationGroupGone(t.Context(), root, r)
+ err = generationGroupGone(t.Context(), root, r)
allow := attack == "absent" || attack == "empty"
if (err == nil) != allow {
t.Fatalf("group check=%v allow=%t", err, allow)
diff --git a/internal/host/plan14_generation_parked_linux_test.go b/internal/host/plan14_generation_parked_linux_test.go
index eec9a6032..9b05ead56 100644
--- a/internal/host/plan14_generation_parked_linux_test.go
+++ b/internal/host/plan14_generation_parked_linux_test.go
@@ -9,6 +9,7 @@ import (
"os"
"os/exec"
"path/filepath"
+ "strings"
"testing"
"time"
@@ -21,7 +22,7 @@ import (
"golang.org/x/sys/unix"
)
-func generationParkedFixture(t *testing.T) (generationInventory, hostbox.RetirementJournal, string) {
+func generationParkedFixture(t *testing.T, currentBoot ...bool) (generationInventory, hostbox.RetirementJournal, string) {
t.Helper()
root := t.TempDir()
t.Setenv("CARLOS_DATA_DIR", root)
@@ -42,8 +43,15 @@ func generationParkedFixture(t *testing.T) (generationInventory, hostbox.Retirem
if err := unix.Stat(path, &st); err != nil {
t.Fatal(err)
}
- in.Entries = append(in.Entries, hostbox.StopInventoryEntry{Kind: "path", ArtifactID: "state", ManagedRoot: "data", RelativePath: "instances/" + host, Ownership: "owner", Materialization: "materialized", Device: uint64(st.Dev), Inode: st.Ino, Type: unix.S_IFDIR})
+ in.Entries = append(in.Entries, hostbox.StopInventoryEntry{Kind: "path", ArtifactID: "state", ManagedRoot: "data", RelativePath: "instances/" + host, Ownership: "owner", Materialization: "materialized", Device: uint64(st.Dev), Inode: st.Ino, Type: unix.S_IFDIR, Persistent: testPersistentInventory(t, path)})
target := hostguard.FenceTarget{Host: host, Incarnation: in.Incarnation, Stamp: 1, Session: 1, Box: in.Box, Enrollment: in.Enrollment, DirectoryRevision: in.DirectoryRevision, FenceID: "retire", BootID: "boot", ControllerID: "controller", Op: "op", Phase: "retiring", ObligationID: "park"}
+ if len(currentBoot) > 0 && currentBoot[0] {
+ boot, err := os.ReadFile("/proc/sys/kernel/random/boot_id")
+ if err != nil {
+ t.Fatal(err)
+ }
+ target.BootID = strings.TrimSpace(string(boot))
+ }
receipt := StopReceipt{V: 1, ID: "receipt", Kind: "stopped", Host: host, Incarnation: target.Incarnation, InstallationStamp: target.Stamp, WriterSession: target.Session, Box: target.Box, Enrollment: target.Enrollment, DirectoryRevision: target.DirectoryRevision, FenceID: target.FenceID, BootID: target.BootID, ControllerID: target.ControllerID, OperationID: target.Op, Phase: target.Phase, ObligationID: target.ObligationID, EvidenceAt: time.Unix(100, 0).UTC()}
raw, err := json.Marshal(receipt)
if err != nil {
@@ -51,7 +59,7 @@ func generationParkedFixture(t *testing.T) (generationInventory, hostbox.Retirem
}
inventory := hostbox.RetirementInventory{Host: host, Captured: hostguard.Captured{Incarnation: in.Incarnation, Stamp: 1}, Ownership: "owner"}
for _, e := range in.Entries {
- inventory.Artifacts = append(inventory.Artifacts, hostbox.Artifact{Kind: hostbox.ArtifactKind(e.Kind), Root: e.ManagedRoot, Name: e.RelativePath, Owner: e.Ownership, RowID: e.RowIdentity, Dev: e.Device, Ino: e.Inode, Type: e.Type})
+ inventory.Artifacts = append(inventory.Artifacts, hostbox.Artifact{Kind: hostbox.ArtifactKind(e.Kind), Root: e.ManagedRoot, Name: e.RelativePath, Owner: e.Ownership, RowID: e.RowIdentity, Dev: e.Device, Ino: e.Inode, Type: e.Type, Persistent: e.Persistent})
}
j, err := hostbox.NewRetirementJournal(target.FenceID, inventory)
if err != nil {
@@ -394,7 +402,7 @@ func TestPlan14GenerationParkedReadback(t *testing.T) {
}
func TestPlan14GenerationParkedKeepsReservation(t *testing.T) {
- snapshot, j, root := generationParkedFixture(t)
+ snapshot, j, root := generationParkedFixture(t, true)
reg, err := registry.Open(filepath.Join(root, "registry.db"))
if err != nil {
t.Fatal(err)
diff --git a/internal/host/plan14_generation_payload_files_linux_test.go b/internal/host/plan14_generation_payload_files_linux_test.go
index ce445c3eb..622d8a0a9 100644
--- a/internal/host/plan14_generation_payload_files_linux_test.go
+++ b/internal/host/plan14_generation_payload_files_linux_test.go
@@ -50,6 +50,7 @@ func TestPlan14GenerationPayloadPhysicalIdentity(t *testing.T) {
t.Fatal(err)
}
entry := hostbox.StopInventoryEntry{Kind: "path", ArtifactID: "retained", ManagedRoot: "data", RelativePath: "state/retained", Ownership: "owner", Materialization: "materialized", Device: uint64(st.Dev), Inode: st.Ino, Type: st.Mode & unix.S_IFMT}
+ entry.Persistent = testPersistentInventory(t, path)
switch attack {
case "missing", "replaced", "symlink":
if err := os.Rename(path, path+".old"); err != nil {
diff --git a/internal/host/plan14_generation_payload_root_linux_test.go b/internal/host/plan14_generation_payload_root_linux_test.go
index 612eef835..67fc74bb4 100644
--- a/internal/host/plan14_generation_payload_root_linux_test.go
+++ b/internal/host/plan14_generation_payload_root_linux_test.go
@@ -83,7 +83,7 @@ func TestPlan14GenerationPayloadPhysicalRootRunner(t *testing.T) {
for _, stamp := range []uint64{2, 5} {
payload := hostbox.StopInventory{Complete: true, Host: in.Host, Incarnation: in.Incarnation, InstallationStamp: stamp, Box: in.Box, Enrollment: in.Enrollment, DirectoryRevision: "1"}
if stamp == 2 {
- payload.Entries = []hostbox.StopInventoryEntry{{Kind: "path", ArtifactID: "retained", ManagedRoot: "data", RelativePath: "retained", Ownership: "owner", Materialization: "materialized", Device: uint64(st.Dev), Inode: st.Ino, Type: unix.S_IFREG}}
+ payload.Entries = []hostbox.StopInventoryEntry{{Kind: "path", ArtifactID: "retained", ManagedRoot: "data", RelativePath: "retained", Ownership: "owner", Materialization: "materialized", Device: uint64(st.Dev), Inode: st.Ino, Type: unix.S_IFREG, Persistent: testPersistentInventory(t, path)}}
}
if err := service.Inventory.WriteStopInventory(t.Context(), payload); err != nil {
journal.Close()
diff --git a/internal/host/plan14_generation_requirements_linux_test.go b/internal/host/plan14_generation_requirements_linux_test.go
index 43dbde977..1f4bc4847 100644
--- a/internal/host/plan14_generation_requirements_linux_test.go
+++ b/internal/host/plan14_generation_requirements_linux_test.go
@@ -63,6 +63,7 @@ func plan14GenerationRequiredArtifacts(t *testing.T, local bool) {
}
snapshot := generationInventory{Census: rootparticipation.Census{Schema: 1, Box: f.target.Box, Enrollment: f.target.Enrollment, Migration: 1, Revision: 1, LaunchRevision: 1, Complete: true}, Installations: views, Launches: []hostbox.LaunchInventory{launch}, Payloads: generationPayloadFixture(views)}
entry := hostbox.StopInventoryEntry{Kind: "path", ArtifactID: "state", ManagedRoot: "data", RelativePath: rel, Ownership: "owner", Materialization: "materialized", Device: uint64(st.Dev), Inode: st.Ino, Type: unix.S_IFDIR}
+ entry.Persistent = testPersistentInventory(t, path)
snapshot.Payloads[0].Inventory.Entries = append(snapshot.Payloads[0].Inventory.Entries, entry)
store := f.root.generations.store
rec.Schema = 1
diff --git a/internal/host/plan14_installed_launch_root_linux_test.go b/internal/host/plan14_installed_launch_root_linux_test.go
index a10a33daf..b189e169f 100644
--- a/internal/host/plan14_installed_launch_root_linux_test.go
+++ b/internal/host/plan14_installed_launch_root_linux_test.go
@@ -24,11 +24,16 @@ import (
"github.com/carlosframework/platform/internal/hostguard"
"github.com/carlosframework/platform/internal/instancectl"
"github.com/carlosframework/platform/internal/provision"
+ "github.com/carlosframework/platform/internal/registry"
"github.com/carlosframework/platform/internal/release"
+ "github.com/carlosframework/platform/internal/rollout"
"github.com/carlosframework/platform/internal/rootstate"
)
func plan14InstalledTenant() {
+ if os.Getenv("PLAN14_TENANT_FAIL") == "1" {
+ os.Exit(1)
+ }
socket := os.Getenv("PLAN14_TENANT_SOCKET")
if socket == "" {
os.Exit(2)
@@ -53,7 +58,11 @@ func TestPlan14NamedClaimLaunchRootRunner(t *testing.T) {
}
}
-func plan14InstalledClaimLaunch(t *testing.T, boundUnit string) {
+func TestPlan14RootRuntimeInstalledCompletion(t *testing.T) { plan14InstalledClaimLaunch(t, "", true) }
+
+func TestPlan14RootRuntimeInstalledFailure(t *testing.T) { plan14InstalledClaimLaunch(t, "", false) }
+
+func plan14InstalledClaimLaunch(t *testing.T, boundUnit string, runtimeUpdate ...bool) {
if dir := os.Getenv("PLAN14_INSTALLED_RETIRE_CHILD"); dir != "" {
plan14InstalledRetire(t, dir)
return
@@ -268,6 +277,10 @@ func plan14InstalledClaimLaunch(t *testing.T, boundUnit string) {
f.req.Spec.Digest = hex.EncodeToString(digest[:])
f.req.Spec.Args = []string{"--socket", filepath.Join(provision.InstanceRunDir(host), "app.sock"), "--db", provision.NestedDBPath("/data", host)}
f.req.Spec.Env = []string{"CARLOS_ADMIN_TOKEN=test", "PLAN14_TENANT_SOCKET=" + filepath.Join(provision.InstanceRunDir(host), "app.sock")}
+ if len(runtimeUpdate) > 0 && !runtimeUpdate[0] {
+ f.req.Spec.Env = append(f.req.Spec.Env, "PLAN14_TENANT_FAIL=1")
+ f.root.ReadyBudget = 100 * time.Millisecond
+ }
inputs, err := f.req.Spec.Hash()
if err != nil {
t.Fatal(err)
@@ -275,6 +288,26 @@ func plan14InstalledClaimLaunch(t *testing.T, boundUnit string) {
f.req.Reservation.Inputs = inputs
f.claims.set(func(c *hostclaim.Claim) { c.Holder.WakeRetry.Attempt.LaunchInputs = inputs })
f.root.generations = &rootGenerationSource{store: store, optDir: "/opt/carlos", pub: func() (ed25519.PublicKey, error) { return pub, nil }, open: func() (rootstate.Store, error) { return rootstate.Open(filepath.Join(dir, "generations"), true, false) }, openFile: rootstate.OpenTrustedFile}
+ var updateSaved rootUpdateRecord
+ var runtimeBook *rollout.RootFailures
+ if len(runtimeUpdate) > 0 {
+ state, err := rootstate.Open(filepath.Join(dir, "failures"), true, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer state.Close()
+ book, err := rollout.InitializeRootFailures(state, "box/en/1", nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ updateSaved = rootUpdateRecord{Schema: 1, Installation: "fixture-installation", Route: registry.Route{Host: host, Account: rec.Account, App: rec.App, Socket: filepath.Join(provision.InstanceRunDir(host), "app.sock")}, Consumed: &release.Consumed{Resolved: &release.ResolvedRequest{ID: 7, Target: "v1"}}}
+ runtimeBook = book
+ source := rootUpdateSource{state: state, book: book, ready: func(rt registry.Route) error { return rootUpdateReady(t.Context(), rt) }}
+ f.root.generations.beginUpdate = func(ctx context.Context, _ *rootGenerationSource, b release.GenerationBinding) (func(string, error, func() error) error, func() error, error) {
+ finish, err := source.beginRuntime(&updateSaved, func() error { raw, _ := json.Marshal(updateSaved); return state.Write("settings.json", raw) }, b.Version, b.Digest, b.Attempt)
+ return finish, func() error { return nil }, err
+ }
+ }
lock := &release.ReleaseExclusion{Open: func() (rootstate.Store, error) { return rootstate.Open(filepath.Join(dir, "release"), true, false) }}
if err := f.req.Validate(); err != nil {
t.Fatal("request", err)
@@ -291,10 +324,19 @@ func plan14InstalledClaimLaunch(t *testing.T, boundUnit string) {
response, err = f.root.Serve(ctx, f.peer, f.req)
return err
})
+ if len(runtimeUpdate) > 0 && !runtimeUpdate[0] {
+ if err == nil || runtimeBook == nil || !runtimeBook.HeldDown(rec.Account, rec.App, "v1", host) || updateSaved.Build.State == nil || !updateSaved.Build.State.CompletedFailed || updateSaved.Build.State.Completed != 7 {
+ t.Fatal("installed failure lacked durable root refusal", err, updateSaved)
+ }
+ return
+ }
if err != nil {
logs, _ := exec.Command("journalctl", "-u", unit, "--no-pager", "-n", "80").CombinedOutput()
t.Fatalf("production launch: %v\n%s", err, logs)
}
+ if len(runtimeUpdate) > 0 && (updateSaved.Build.State == nil || updateSaved.Build.State.Completed != 7 || updateSaved.Build.State.CompletedFailed || updateSaved.Served["v1"].Invocation != response.Grant.UnitInvocationID) {
+ t.Fatal("root installed completion missing", updateSaved)
+ }
transport := &http.Transport{DialContext: func(ctx context.Context, _, _ string) (net.Conn, error) {
return (&net.Dialer{}).DialContext(ctx, "unix", filepath.Join(provision.InstanceRunDir(host), "app.sock"))
}}
diff --git a/internal/host/plan14_root_failures_test.go b/internal/host/plan14_root_failures_test.go
index fcf47ecca..e3ccc5311 100644
--- a/internal/host/plan14_root_failures_test.go
+++ b/internal/host/plan14_root_failures_test.go
@@ -202,6 +202,17 @@ func testRootSettingsPass(t *testing.T, book *rollout.RootFailures, attack strin
}
if attack == "verified-retry" {
+ legacy, err := rollout.OpenFailureBook(p.data)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err = legacy.Record(rollout.FailureRecord{Account: rec.Account, App: rec.App, Host: rec.Host, Build: "v1", HeldDown: []string{rec.Host}}); err != nil {
+ t.Fatal(err)
+ }
+ p.legacy, err = rootFailureLegacy(p.data)
+ if err != nil {
+ t.Fatal(err)
+ }
wire, err := release.SignHostRetry(release.RootSigner(priv), rec.Account, rec.App, rec.Host, "v1", book.ID(), book.PublishedEpoch(rec.Account, rec.App, "v1", rec.Host), time.Now())
if err != nil {
t.Fatal(err)
@@ -217,6 +228,12 @@ func testRootSettingsPass(t *testing.T, book *rollout.RootFailures, attack strin
if v, _ := release.LiveVersion(opt, rt.Host); v != "v1" {
t.Fatal("verified retry did not reach production adoption", v)
}
+ raw, _ = state.Read("settings-" + rt.Host + ".json")
+ var mirror rootUpdateRecord
+ if json.Unmarshal(raw, &mirror) != nil || mirror.RetryMirror == nil || mirror.RetryMirror.Book != legacy.ID() || mirror.RetryMirror.Epoch != legacy.PublishedEpoch(rec.Account, rec.App, "v1", rec.Host) {
+ t.Fatal("root did not bind agent mirror receipt", string(raw))
+ }
+
}
if attack == "provider-missing" {
if err := state.Remove(rec.Host + ".json"); err != nil {
diff --git a/internal/host/proofbinding.go b/internal/host/proofbinding.go
index 3842344e9..327c4f945 100644
--- a/internal/host/proofbinding.go
+++ b/internal/host/proofbinding.go
@@ -4,7 +4,6 @@ import (
"context"
"crypto/sha256"
"encoding/hex"
- "encoding/json"
"github.com/carlosframework/platform/internal/provision"
"io"
"os"
@@ -41,13 +40,15 @@ type proofBinding struct {
}
type proofUnitFile struct {
- Path string
- Identity rootstate.FileIdentity
+ Persistent rootstate.PersistentIdentity `json:",omitzero"`
+ Path string
+ Identity rootstate.FileIdentity
}
type proofBindingResolver func(context.Context, registry.Route) (proofBinding, error)
type proofBindingSource struct {
+ persistent func(*os.File) (rootstate.PersistentIdentity, error)
indexMu sync.Mutex
index *provision.RecordIndex
indexErr error
@@ -107,6 +108,9 @@ func productionProofBindingSource(store release.Store, sys unitSystem, optDir st
}
return nil
}}
+ if legacy, err := legacyRootRestart(); err == nil && !legacy {
+ source.persistent = rootstate.Persistent
+ }
if hostwrite.Enabled(os.Getenv) {
source.claim = func(ctx context.Context, host string) (hostclaim.Observed, error) {
return hostclaim.Read(ctx, store, host)
@@ -198,8 +202,16 @@ func (s *proofBindingSource) unitBinding(ctx context.Context, host string) (*pro
f.Close()
return nil, proofBinding{}, unitProps{}, err
}
- files = append(files, proofUnitFile{Path: path, Identity: identity})
- encoded, _ := json.Marshal(identity)
+ file := proofUnitFile{Path: path, Identity: identity}
+ if s.persistent != nil {
+ file.Persistent, err = s.persistent(f)
+ if err != nil {
+ f.Close()
+ return nil, proofBinding{}, unitProps{}, err
+ }
+ }
+ files = append(files, file)
+ encoded := proofFileSource(file)
definition.Write(encoded)
definition.Write([]byte(path + "\x00"))
n, copyErr := io.Copy(definition, io.LimitReader(f, rootstate.MaxRecord+1))
@@ -229,7 +241,7 @@ func (s *proofBindingSource) binding(ctx context.Context, host string, rollback
}
rt, source, etag, files := unit.Route, unit.Source, unit.RecordETag, unit.Files
running := rollback == nil || (len(prepare) == 2 && prepare[1])
- if rollback != nil && rollback.Source != source {
+ if rollback != nil && (rollback.Source != source || !sameProofFiles(rollback.Files, files)) {
return proofBinding{}, os.ErrPermission
}
var exe string
diff --git a/internal/host/prooffile.go b/internal/host/prooffile.go
new file mode 100644
index 000000000..66fcabd8e
--- /dev/null
+++ b/internal/host/prooffile.go
@@ -0,0 +1,37 @@
+package host
+
+import "encoding/json"
+
+func proofFileSource(file proofUnitFile) []byte {
+ if file.Persistent.Boot != "" {
+ stable := file.Persistent
+ stable.Boot, stable.Device, stable.MountID = "", 0, 0
+ raw, _ := json.Marshal(struct {
+ Path string
+ Stable any
+ }{file.Path, stable})
+ return raw
+ }
+ raw, _ := json.Marshal(file.Identity)
+ return raw
+}
+
+func sameProofFiles(prior, current []proofUnitFile) bool {
+ if len(prior) != len(current) {
+ return false
+ }
+ for i, p := range prior {
+ q := current[i]
+ if p.Path != q.Path {
+ return false
+ }
+ if p.Persistent.Boot != "" {
+ if !p.Persistent.Same(q.Persistent) {
+ return false
+ }
+ } else if p.Identity != q.Identity || q.Persistent.Boot != "" {
+ return false
+ }
+ }
+ return true
+}
diff --git a/internal/host/proofnamed.go b/internal/host/proofnamed.go
index a6e03eb99..f916bde76 100644
--- a/internal/host/proofnamed.go
+++ b/internal/host/proofnamed.go
@@ -59,7 +59,14 @@ func (s *proofBindingSource) trustedBytes(path string) ([]byte, proofUnitFile, e
if len(raw) > rootstate.MaxRecord {
return nil, proofUnitFile{}, os.ErrPermission
}
- return raw, proofUnitFile{Path: path, Identity: identity}, nil
+ file := proofUnitFile{Path: path, Identity: identity}
+ if s.persistent != nil {
+ file.Persistent, err = s.persistent(f)
+ if err != nil {
+ return nil, proofUnitFile{}, err
+ }
+ }
+ return raw, file, nil
}
func (s *proofBindingSource) record(ctx context.Context, host string) (proofRecord, error) {
@@ -79,7 +86,13 @@ func (s *proofBindingSource) record(ctx context.Context, host string) (proofReco
return nil, err
}
evidence = append(evidence, file)
- identity, _ := json.Marshal(file)
+ identity := proofFileSource(file)
+ if file.Persistent.Boot == "" {
+ identity, _ = json.Marshal(struct {
+ Path string
+ Identity rootstate.FileIdentity
+ }{file.Path, file.Identity})
+ }
hash.Write(identity)
hash.Write(raw)
return raw, nil
diff --git a/internal/host/restartscope.go b/internal/host/restartscope.go
index 92bfd3a13..5863a738b 100644
--- a/internal/host/restartscope.go
+++ b/internal/host/restartscope.go
@@ -342,6 +342,9 @@ func hostRetryPass(ctx context.Context, routes []registry.Route, store release.S
// book).
func applyRetries(routes []registry.Route, work []scopedRestart, mem *restartMemory) {
for _, rq := range retryRequests(routes, work) {
+ if relayRootRetry(mem.pub, rq) {
+ continue
+ }
if mem.retryHost == nil {
log.Printf("agent: retry requested for %s, dropped: rollout manager not armed on this box, so nothing is held to clear", rq.host)
continue
diff --git a/internal/host/rollout.go b/internal/host/rollout.go
index 6173a2b69..c401883db 100644
--- a/internal/host/rollout.go
+++ b/internal/host/rollout.go
@@ -540,7 +540,9 @@ type configLegs struct {
// each instance the book holds, with the build holding it and that
// restriction's epoch (failureHolds.report; Task 10, plan review #5), so
// the console can sign a retry for it.
-func rolloutStatusProbe() *status.RolloutReport {
+func rolloutStatusProbe() *status.RolloutReport { return rootRetryStatus(legacyRolloutStatusProbe()) }
+
+func legacyRolloutStatusProbe() *status.RolloutReport {
m := armedRollout()
if m == nil {
if why := rolloutUnarmed(); why != "" {
diff --git a/internal/host/rootgeneration_kernel_linux.go b/internal/host/rootgeneration_kernel_linux.go
index 029bfd3d1..358d9e7b4 100644
--- a/internal/host/rootgeneration_kernel_linux.go
+++ b/internal/host/rootgeneration_kernel_linux.go
@@ -540,10 +540,14 @@ func generationGroupGone(ctx context.Context, root string, r release.GenerationR
} else if err != nil {
return err
}
+ boot, err := os.ReadFile("/proc/sys/kernel/random/boot_id")
+ if err != nil || r.Binding.Target.BootID == "" || strings.TrimSpace(string(boot)) != r.Binding.Target.BootID {
+ return os.ErrPermission
+ }
if r.Process == (release.GenerationProcess{}) || r.Process.Group != group {
return os.ErrPermission
}
- _, err := scanStopCgroups(ctx, root, []hostbox.StopCgroupIdentity{{RelativePath: group, Device: r.Process.GroupIdentity.Device, Inode: r.Process.GroupIdentity.Inode}})
+ _, err = scanStopCgroups(ctx, root, []hostbox.StopCgroupIdentity{{RelativePath: group, Device: r.Process.GroupIdentity.Device, Inode: r.Process.GroupIdentity.Inode}})
return err
}
@@ -582,7 +586,7 @@ func generationCurrentBinding(b release.GenerationBinding, open func(string) (*o
if err != nil || !entry.stable.Same(now) {
return b, os.ErrPermission
}
- } else if id != entry.old {
+ } else if boot, err := os.ReadFile("/proc/sys/kernel/random/boot_id"); err != nil || b.Target.BootID == "" || strings.TrimSpace(string(boot)) != b.Target.BootID || id != entry.old {
return b, os.ErrPermission
}
*entry.dest = id
diff --git a/internal/host/rootgeneration_parked.go b/internal/host/rootgeneration_parked.go
index 99f2f159a..bfa1c3723 100644
--- a/internal/host/rootgeneration_parked.go
+++ b/internal/host/rootgeneration_parked.go
@@ -69,7 +69,7 @@ func generationRetirements(ctx context.Context, snapshot generationInventory) (m
if e.Ownership != j.Inventory.Ownership || (e.Materialization != "materialized" && !(e.Kind == "timer" && e.Materialization == "intended")) {
return nil, os.ErrPermission
}
- a := hostbox.Artifact{AllowAbsent: e.Kind == "timer" && (e.TimerRetired || e.Materialization == "intended"), Kind: hostbox.ArtifactKind(e.Kind), Root: e.ManagedRoot, Name: e.RelativePath, Owner: e.Ownership, RowID: e.RowIdentity, Dev: e.Device, Ino: e.Inode, Type: e.Type}
+ a := hostbox.Artifact{AllowAbsent: e.Kind == "timer" && (e.TimerRetired || e.Materialization == "intended"), Kind: hostbox.ArtifactKind(e.Kind), Root: e.ManagedRoot, Name: e.RelativePath, Owner: e.Ownership, RowID: e.RowIdentity, Dev: e.Device, Ino: e.Inode, Type: e.Type, Persistent: e.Persistent}
if expected[a] {
return nil, os.ErrPermission
}
diff --git a/internal/host/rootgeneration_payload_linux.go b/internal/host/rootgeneration_payload_linux.go
index 659c81f97..997d1df9d 100644
--- a/internal/host/rootgeneration_payload_linux.go
+++ b/internal/host/rootgeneration_payload_linux.go
@@ -50,15 +50,12 @@ func generationPayloadFiles(ctx context.Context, root string, payloads []hostbox
if err != nil {
return err
}
- var st unix.Stat_t
- err = unix.Fstat(file, &st)
- unix.Close(file)
+ f := os.NewFile(uintptr(file), e.RelativePath)
+ err = hostbox.VerifyInventoryFile(f, e)
+ f.Close()
if err != nil {
return err
}
- if uint64(st.Dev) != e.Device || st.Ino != e.Inode || st.Mode&unix.S_IFMT != e.Type {
- return os.ErrPermission
- }
}
}
return ctx.Err()
diff --git a/internal/host/rootgenerations_launch.go b/internal/host/rootgenerations_launch.go
index c1f2b1d05..d2fd4885a 100644
--- a/internal/host/rootgenerations_launch.go
+++ b/internal/host/rootgenerations_launch.go
@@ -20,16 +20,17 @@ import (
)
type rootGenerationSource struct {
- persistent func(*os.File) (rootstate.PersistentIdentity, error)
- store release.Store
- optDir string
- pub func() (ed25519.PublicKey, error)
- open func() (rootstate.Store, error)
- openFile func(string) (*os.File, error)
+ beginUpdate func(context.Context, *rootGenerationSource, release.GenerationBinding) (func(string, error, func() error) error, func() error, error)
+ persistent func(*os.File) (rootstate.PersistentIdentity, error)
+ store release.Store
+ optDir string
+ pub func() (ed25519.PublicKey, error)
+ open func() (rootstate.Store, error)
+ openFile func(string) (*os.File, error)
}
func productionRootGenerations(store release.Store, optDir string) *rootGenerationSource {
- return &rootGenerationSource{store: store, optDir: optDir, persistent: rootstate.Persistent,
+ return &rootGenerationSource{beginUpdate: beginRootGenerationUpdate, store: store, optDir: optDir, persistent: rootstate.Persistent,
pub: func() (ed25519.PublicKey, error) {
return release.ParsePublicKey(os.Getenv("CARLOS_RELEASE_PUBKEY"), "CARLOS_RELEASE_PUBKEY")
},
@@ -136,6 +137,8 @@ func (s *rootGenerationSource) resolve(ctx context.Context, h *ClaimLaunchRoot,
}
type generationLaunchPermit struct {
+ finishUpdate func(string, error, func() error) error
+ closeUpdate func() error
ledger *release.RootGenerations
reservation release.GenerationReservation
checkBinding func() (release.GenerationBinding, error)
@@ -159,7 +162,15 @@ func (s *rootGenerationSource) reserve(ctx context.Context, h *ClaimLaunchRoot,
store.Close()
return nil, err
}
- return &generationLaunchPermit{ledger: g, reservation: r, checkBinding: func() (release.GenerationBinding, error) { return s.resolve(ctx, h, peer, q) }}, nil
+ p := &generationLaunchPermit{ledger: g, reservation: r, checkBinding: func() (release.GenerationBinding, error) { return s.resolve(ctx, h, peer, q) }}
+ if s.beginUpdate != nil {
+ p.finishUpdate, p.closeUpdate, err = s.beginUpdate(ctx, s, b)
+ if err != nil {
+ store.Close()
+ return nil, err
+ }
+ }
+ return p, nil
}
func (p *generationLaunchPermit) check() error {
diff --git a/internal/host/rootinventory.go b/internal/host/rootinventory.go
index 5d938ff0c..d444c74cd 100644
--- a/internal/host/rootinventory.go
+++ b/internal/host/rootinventory.go
@@ -20,7 +20,6 @@ import (
"github.com/carlosframework/platform/internal/registry"
"github.com/carlosframework/platform/internal/release"
"github.com/carlosframework/platform/internal/rootstate"
- "github.com/carlosframework/platform/internal/safefile"
)
func (h ClaimRootHTTP) commitRootInventory(ctx context.Context, q hostbox.JournalRequest) (hostbox.JournalResponse, error) {
@@ -65,6 +64,7 @@ func (h ClaimRootHTTP) commitRootInventoryPending(ctx context.Context, q hostbox
return out, err
}
in, t := q.Inventory, q.Target
+ in.Entries = append([]hostbox.StopInventoryEntry(nil), in.Entries...)
if q.Op != "inventory-write" || !in.Complete || in.Box != actor.Box || in.Enrollment != actor.Enrollment || in.DirectoryRevision != strconv.FormatUint(actor.Revision, 10) || t.Host != in.Host || t.Incarnation != in.Incarnation || t.Stamp != in.InstallationStamp || t.Box != actor.Box || t.Enrollment != actor.Enrollment || t.ClaimETag == "" || q.RecordKey == "" || q.RecordETag == "" {
return out, hostbox.ErrChanged
}
@@ -174,6 +174,9 @@ func (h ClaimRootHTTP) commitRootInventoryPending(ctx context.Context, q hostbox
if err := h.verifyInventoryTimers(in); err != nil {
return err
}
+ if err := h.bindInventoryPaths(ctx, &in); err != nil {
+ return err
+ }
for _, e := range in.Entries {
if e.Ownership != canonical.ClaimOwner {
return hostbox.ErrTypedInventory
@@ -262,6 +265,7 @@ func (h ClaimRootHTTP) commitRootInventoryPending(ctx context.Context, q hostbox
old.Device = next.Device
old.Inode = next.Inode
old.Type = next.Type
+ old.Persistent = next.Persistent
}
if old != next {
return hostbox.ErrChanged
@@ -294,7 +298,7 @@ func (h ClaimRootHTTP) commitRootInventoryPending(ctx context.Context, q hostbox
return err
}
}
- if firstLanding {
+ if firstLanding || h.inventoryIdentity != nil {
out, err = h.Journals.ExecuteRootInventory(ctx, actor.Box+"/"+actor.Enrollment, q, in, pending)
} else if pending {
out, err = h.Journals.CompletePendingInventory(ctx, actor.Box+"/"+actor.Enrollment, q)
@@ -322,32 +326,32 @@ func (h ClaimRootHTTP) verifyInventoryPath(e hostbox.StopInventoryEntry) error {
if e.Materialization != "materialized" {
return hostbox.ErrTypedInventory
}
- f, err := safefile.OpenDir(path)
- if err != nil {
- f, err = safefile.OpenFile(path, os.O_RDONLY, 0)
- }
- if err != nil {
- return err
- }
- defer f.Close()
- id, err := rootstate.Identity(f)
- if err != nil {
- return err
- }
- st, err := f.Stat()
- if err != nil {
- return err
- }
- kind := uint32(0100000)
- if st.IsDir() {
- kind = 0040000
- } else if !st.Mode().IsRegular() {
- return hostbox.ErrTypedInventory
- }
- if id.Device != e.Device || id.Inode != e.Inode || kind != e.Type {
- return hostbox.ErrChanged
+ if h.inventoryIdentity == nil && e.Persistent.Boot == "" {
+ f, err := hostbox.OpenInventoryFile(path)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ id, err := rootstate.Identity(f)
+ if err != nil {
+ return err
+ }
+ info, err := f.Stat()
+ if err != nil {
+ return err
+ }
+ kind := uint32(0100000)
+ if info.IsDir() {
+ kind = 0040000
+ } else if !info.Mode().IsRegular() {
+ return hostbox.ErrChanged
+ }
+ if id.Device != e.Device || id.Inode != e.Inode || kind != e.Type {
+ return hostbox.ErrChanged
+ }
+ return nil
}
- return nil
+ return hostbox.VerifyInventoryPath(path, e)
}
func (h ClaimRootHTTP) recoverRootInventory(ctx context.Context) error {
diff --git a/internal/host/rootinventory_identity.go b/internal/host/rootinventory_identity.go
new file mode 100644
index 000000000..89673fa2e
--- /dev/null
+++ b/internal/host/rootinventory_identity.go
@@ -0,0 +1,59 @@
+package host
+
+import (
+ "context"
+ "github.com/carlosframework/platform/internal/hostbox"
+ "github.com/carlosframework/platform/internal/hostguard"
+ "github.com/carlosframework/platform/internal/rootstate"
+ "path/filepath"
+)
+
+func (h ClaimRootHTTP) bindInventoryPaths(ctx context.Context, in *hostbox.StopInventory) error {
+ if h.inventoryIdentity == nil {
+ return nil
+ }
+ prior, _, err := h.Journals.Inventory.Snapshot(ctx, in.Host, hostguard.Captured{Incarnation: in.Incarnation, Stamp: in.InstallationStamp})
+ if err != nil {
+ return err
+ }
+ for i, e := range in.Entries {
+ // Caller-supplied persistent evidence never creates root authority.
+ e.Persistent = rootstate.PersistentIdentity{}
+ if e.Kind != "path" || e.Materialization != "materialized" {
+ in.Entries[i] = e
+ continue
+ }
+ if e.ManagedRoot != "data" || !filepath.IsLocal(e.RelativePath) {
+ return hostbox.ErrTypedInventory
+ }
+ oldFound := false
+ for _, old := range prior.Entries {
+ if old.ArtifactID == e.ArtifactID && old.Materialization == "materialized" {
+ if old.Persistent.Boot == "" {
+ return hostbox.ErrTypedInventory
+ }
+ e.Persistent = old.Persistent
+ oldFound = true
+ }
+ }
+ path := filepath.Join(h.Roots[e.ManagedRoot], e.RelativePath)
+ f, err := hostbox.OpenInventoryFile(path)
+ if err != nil {
+ return err
+ }
+ if oldFound {
+ err = hostbox.VerifyInventoryFile(f, e)
+ } else {
+ e.Persistent, err = h.inventoryIdentity(f)
+ if err == nil && (e.Device != e.Persistent.Device || e.Inode != e.Persistent.Inode || e.Type != e.Persistent.Type) {
+ err = hostbox.ErrChanged
+ }
+ }
+ f.Close()
+ if err != nil {
+ return err
+ }
+ in.Entries[i] = e
+ }
+ return nil
+}
diff --git a/internal/host/rootinventory_state_linux.go b/internal/host/rootinventory_state_linux.go
index 9eaa954bb..4a1033656 100644
--- a/internal/host/rootinventory_state_linux.go
+++ b/internal/host/rootinventory_state_linux.go
@@ -106,7 +106,7 @@ func (a *ClaimRoleAssembly) prepareStateInventory(in ClaimLaunchInputs, inventor
return false, hostbox.ErrTypedInventory
}
e := inventory.Entries[index]
- if e.Materialization != "materialized" || stat.Mode&unix.S_IFMT != unix.S_IFDIR || uint64(stat.Dev) != e.Device || stat.Ino != e.Inode {
+ if e.Materialization != "materialized" || stat.Mode&unix.S_IFMT != unix.S_IFDIR || (e.Persistent.Boot != "" && hostbox.VerifyInventoryPath(filepath.Join(root, relative), e) != nil || e.Persistent.Boot == "" && (uint64(stat.Dev) != e.Device || stat.Ino != e.Inode)) {
return false, hostbox.ErrTypedInventory
}
return false, nil
diff --git a/internal/host/rootinventory_test.go b/internal/host/rootinventory_test.go
index e34af4113..f3e62622d 100644
--- a/internal/host/rootinventory_test.go
+++ b/internal/host/rootinventory_test.go
@@ -18,6 +18,7 @@ import (
"github.com/carlosframework/platform/internal/hostbox"
"github.com/carlosframework/platform/internal/hostguard"
"github.com/carlosframework/platform/internal/provision"
+ "github.com/carlosframework/platform/internal/rootstate"
)
func TestPlan14RootInventoryEstablishment(t *testing.T) {
@@ -91,6 +92,10 @@ func TestPlan14RootInventoryEstablishment(t *testing.T) {
}
func TestPlan14InventoryRegistrationCompletesWithoutAgentLock(t *testing.T) {
+ testInventoryRegistration(t, false)
+}
+func TestPlan14RootInventoryPersistentProducer(t *testing.T) { testInventoryRegistration(t, true) }
+func testInventoryRegistration(t *testing.T, persistent bool) {
for _, stale := range []bool{false, true} {
t.Run(fmt.Sprint(stale), func(t *testing.T) {
f := newRecoveryFixture(t)
@@ -109,9 +114,24 @@ func TestPlan14InventoryRegistrationCompletesWithoutAgentLock(t *testing.T) {
actor := hostbox.Actor{Box: "box-1", Enrollment: "en", Revision: 1, Region: "ie"}
census := &hostbox.EmptyInstallationCensus{Inventory: journals.Inventory, Registry: reg, Launches: f.journal, Box: actor.Box, Enrollment: actor.Enrollment, DirectoryRevision: "1", Roots: roots, SharedPaths: map[string][]string{"data": {"hostguard"}}}
root := ClaimRootHTTP{Journals: journals, Launches: f.journal, Roots: roots, InventoryActor: func(context.Context) (hostbox.Actor, error) { return actor, nil }, Reconcile: hostbox.ReconcileAdapter{Registry: reg, Inventory: journals.Inventory, Census: census, Box: actor.Box, Enrollment: actor.Enrollment}, Stop: ClaimStopHTTP{Coordinator: ClaimStopCoordinator{Guard: rootGuard, Evidence: f.claims}}}
+ if persistent {
+ root.inventoryIdentity = rootstate.Persistent
+ }
_, remote := hostbox.RemoteJournals(func(ctx context.Context, q hostbox.JournalRequest) (hostbox.JournalResponse, error) {
if q.Op == "inventory-write" {
+ if persistent {
+ for i, e := range q.Inventory.Entries {
+ if e.Kind == "path" {
+ q.Inventory.Entries[i].Persistent = rootstate.PersistentIdentity{Boot: "agent-forged", Filesystem: "fake", Handle: "fake"}
+ }
+ }
+ }
out, err := root.commitRootInventory(ctx, q)
+ if persistent && err == nil {
+ if _, e := root.commitRootInventory(ctx, q); e != nil {
+ t.Fatal("root identity replay", e)
+ }
+ }
if stale && q.Revision == 1 && err == nil {
rec.RecordSeq++
plan14PutRecord(t, f.claims, rec)
@@ -157,7 +177,14 @@ func TestPlan14InventoryRegistrationCompletesWithoutAgentLock(t *testing.T) {
if err := roles.prepareStateRemote(ctx, f.read(), work, ClaimLaunchInputs{DBPath: row.DBPath}, actor); err != nil {
t.Fatalf("state registration failed or blocked: %v", err)
}
- _, revision, err = journals.Inventory.Snapshot(t.Context(), rec.Host, hostguard.Captured{Incarnation: holder.Incarnation, Stamp: holder.Stamp})
+ saved, revision, err := journals.Inventory.Snapshot(t.Context(), rec.Host, hostguard.Captured{Incarnation: holder.Incarnation, Stamp: holder.Stamp})
+ if persistent && err == nil {
+ for _, e := range saved.Entries {
+ if e.Kind == "path" && (e.Persistent.Boot == "" || e.Persistent.Boot == "agent-forged") {
+ t.Fatal("agent minted root identity", e)
+ }
+ }
+ }
if err != nil || revision != 5 {
t.Fatalf("state phases missing: %d %v", revision, err)
}
diff --git a/internal/host/rootmigration_bootstrap_root_linux_test.go b/internal/host/rootmigration_bootstrap_root_linux_test.go
index afd2bb676..20f353d14 100644
--- a/internal/host/rootmigration_bootstrap_root_linux_test.go
+++ b/internal/host/rootmigration_bootstrap_root_linux_test.go
@@ -70,7 +70,14 @@ func testRootMigrationBootstrap(t *testing.T, historic, fresh bool) {
defer release()
// The existing generation census supports a controlled all-root namespace;
// E owns the wider running-tenant/foreign-namespace production integration.
- cmd := exec.CommandContext(t.Context(), "unshare", "--mount", "--pid", "--fork", "--mount-proc", os.Args[0], "-test.run=^"+t.Name()+"$", "-test.v")
+ name := "TestPlan14RootMigrationBootstrapRootRunner"
+ if historic {
+ name = "TestPlan14RootMigrationHistoricRootRunner"
+ }
+ if fresh {
+ name = "TestPlan14RootMigrationFreshStopRootRunner"
+ }
+ cmd := exec.CommandContext(t.Context(), "unshare", "--mount", "--pid", "--fork", "--mount-proc", os.Args[0], "-test.run=^"+name+"$", "-test.v")
cmd.Env = append(os.Environ(), "PLAN14_P3_BOOTSTRAP_CHILD=1")
if out, err := cmd.CombinedOutput(); err != nil {
t.Fatal(err, string(out))
diff --git a/internal/host/rootmigration_historic_linux_test.go b/internal/host/rootmigration_historic_linux_test.go
index e5b47a1e4..5ec7717b2 100644
--- a/internal/host/rootmigration_historic_linux_test.go
+++ b/internal/host/rootmigration_historic_linux_test.go
@@ -77,6 +77,7 @@ func migrationHistoricFixture(t *testing.T, store release.Store, r ClaimRuntimeR
t.Fatal(err)
}
in := hostbox.StopInventory{Complete: true, Host: rec.Host, Incarnation: inc, InstallationStamp: 1, Box: actor.Box, Enrollment: actor.Enrollment, DirectoryRevision: "1", Entries: []hostbox.StopInventoryEntry{{Kind: "path", ArtifactID: "historic-data", ManagedRoot: "data", RelativePath: "historic-data", Ownership: "historic-owner", Materialization: "materialized", Device: uint64(st.Dev), Inode: st.Ino, Type: st.Mode & unix.S_IFMT}, {Kind: "timer", ArtifactID: "timer", ManagedRoot: "timers", RelativePath: rec.Host + "/refresh", Ownership: "historic-owner", Materialization: "materialized"}}}
+ in.Entries[0].Persistent = testPersistentInventory(t, path)
inventory, err := openLegacyInventory(t, filepath.Join(legacy, "inventory.db"))
if err != nil {
t.Fatal(err)
diff --git a/internal/host/rootpersisted_identity_linux_test.go b/internal/host/rootpersisted_identity_linux_test.go
new file mode 100644
index 000000000..3e4a86b2e
--- /dev/null
+++ b/internal/host/rootpersisted_identity_linux_test.go
@@ -0,0 +1,44 @@
+//go:build linux
+
+package host
+
+import (
+ "github.com/carlosframework/platform/internal/hostbox"
+ "github.com/carlosframework/platform/internal/rootstate"
+ "os"
+ "testing"
+)
+
+func testPersistentInventory(t *testing.T, path string) rootstate.PersistentIdentity {
+ t.Helper()
+ f, err := hostbox.OpenInventoryFile(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer f.Close()
+ id, err := rootstate.Persistent(f)
+ if err != nil {
+ t.Fatal(err)
+ }
+ return id
+}
+func TestPlan14InventoryWithoutPersistentEvidenceRefuses(t *testing.T) {
+ path := t.TempDir()
+ f, err := os.Open(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer f.Close()
+ id, err := rootstate.Identity(f)
+ if err != nil {
+ t.Fatal(err)
+ }
+ e := hostbox.StopInventoryEntry{Device: id.Device, Inode: id.Inode, Type: 0040000}
+ if err := hostbox.VerifyInventoryFile(f, e); err == nil {
+ t.Fatal("old boot-unknown inventory admitted")
+ }
+ e.Persistent = testPersistentInventory(t, path)
+ if err := hostbox.VerifyInventoryFile(f, e); err != nil {
+ t.Fatal(err)
+ }
+}
diff --git a/internal/host/rootpersisted_reboot_root_linux_test.go b/internal/host/rootpersisted_reboot_root_linux_test.go
new file mode 100644
index 000000000..97b2fc0a9
--- /dev/null
+++ b/internal/host/rootpersisted_reboot_root_linux_test.go
@@ -0,0 +1,314 @@
+//go:build linux && rootrunner
+
+package host
+
+import (
+ "bytes"
+ "context"
+ "crypto/sha256"
+ "encoding/hex"
+ "encoding/json"
+ "os"
+ "path/filepath"
+ "strings"
+ "testing"
+
+ "github.com/carlosframework/platform/internal/hostbox"
+ "github.com/carlosframework/platform/internal/release"
+ "github.com/carlosframework/platform/internal/rootstate"
+ "golang.org/x/sys/unix"
+)
+
+const persistedRebootDir = "/var/lib/carlos-rootrunner-p3-persisted"
+
+type persistedReboot struct {
+ Entry hostbox.StopInventoryEntry
+ Artifact hostbox.Artifact
+ Unit proofUnitFile
+ Generation release.GenerationBinding
+ File hostbox.StopFileIdentity
+}
+
+func TestRootRebootPersistedFamiliesPhase1(t *testing.T) {
+ if os.Geteuid() != 0 {
+ t.Fatal("root required")
+ }
+ if err := os.Mkdir(persistedRebootDir, 0755); err != nil {
+ t.Fatal(err)
+ }
+ for _, name := range []string{"data", "opt", "units", "data/state"} {
+ if err := os.Mkdir(filepath.Join(persistedRebootDir, name), 0755); err != nil {
+ t.Fatal(err)
+ }
+ }
+ path := filepath.Join(persistedRebootDir, "data/state")
+ f, err := hostbox.OpenInventoryFile(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ stable, err := rootstate.Persistent(f)
+ f.Close()
+ if err != nil {
+ t.Fatal(err)
+ }
+ database := filepath.Join(path, "db.sqlite")
+ if err := os.WriteFile(database, []byte("db"), 0600); err != nil {
+ t.Fatal(err)
+ }
+ fileID, err := stopIdentity(database)
+ if err != nil {
+ t.Fatal(err)
+ }
+ e := hostbox.StopInventoryEntry{Kind: "path", ArtifactID: "state", ManagedRoot: "data", RelativePath: "state", Ownership: "owner", Materialization: "materialized", Device: stable.Device, Inode: stable.Inode, Type: stable.Type, Persistent: stable}
+ unitPath := filepath.Join(persistedRebootDir, "units/app.service")
+ if err := os.WriteFile(unitPath, []byte("[Service]\nExecStart=/bin/true\n"), 0644); err != nil {
+ t.Fatal(err)
+ }
+ source := proofBindingSource{openFile: rootstate.OpenTrustedFile, persistent: rootstate.Persistent}
+ _, unit, err := source.trustedBytes(unitPath)
+ if err != nil {
+ t.Fatal(err)
+ }
+ versionPath := release.VersionPath(filepath.Join(persistedRebootDir, "opt"), "bab", "v1", "km")
+ if err := os.MkdirAll(filepath.Dir(versionPath), 0755); err != nil {
+ t.Fatal(err)
+ }
+ if err := os.WriteFile(versionPath, []byte("executable"), 0555); err != nil {
+ t.Fatal(err)
+ }
+ g := release.GenerationBinding{Binding: release.HistoryBinding{Host: "h.example", Account: "bab", App: "km"}, Target: release.GenerationOwner{Host: "h.example", Incarnation: "inc", Stamp: 1, Session: 1, Box: "box", Enrollment: "en", BootID: stable.Boot, ControllerID: "controller"}, Installation: "install", Attempt: "main", Inputs: "inputs", Invocation: "invocation", Record: "record", RecordETag: "etag", ControllerPID: os.Getpid(), ControllerStart: "start", Version: "v1", Digest: strings.Repeat("a", 64), Path: versionPath, Tree: filepath.Dir(versionPath)}
+ for path, dst := range map[string]*rootstate.FileIdentity{g.Path: &g.Executable, g.Tree: &g.TreeIdentity} {
+ opened, err := hostbox.OpenInventoryFile(path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ *dst, err = rootstate.Identity(opened)
+ opened.Close()
+ if err != nil {
+ t.Fatal(err)
+ }
+ }
+ for _, name := range []string{"old-pins", "stable-pins"} {
+ state, err := rootstate.Open(filepath.Join(persistedRebootDir, name), true, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ ledger := &release.RootGenerations{Store: state}
+ binding := g
+ if name == "stable-pins" {
+ binding.ExecutablePersistent = testPersistentInventory(t, g.Path)
+ binding.TreePersistent = testPersistentInventory(t, g.Tree)
+ }
+ if _, err = ledger.Reserve(binding); err != nil {
+ t.Fatal(err)
+ }
+ pins := release.RootGenerationPins{Ledger: ledger, Verify: func(context.Context, []release.GenerationReservation) error { return nil }}
+ if _, err = pins.StagedPins(t.Context(), filepath.Join(persistedRebootDir, "opt")); err != nil {
+ t.Fatal("initial pins", err)
+ }
+ state.Close()
+ }
+ parker := hostbox.TypedParker{CapturePersistent: true, Roots: map[string]string{"data": filepath.Join(persistedRebootDir, "data")}, ParkedRoot: filepath.Join(persistedRebootDir, "data"), Incarnation: "inc", Host: "h.example", Retirement: "retired"}
+ a, err := parker.CaptureArtifact("data", "state", "owner", hostbox.ArtifactPath)
+ if err != nil {
+ t.Fatal(err)
+ }
+ s, err := rootstate.Open(filepath.Join(persistedRebootDir, "authority"), true, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer s.Close()
+ raw, _ := json.Marshal(persistedReboot{File: fileID, Entry: e, Artifact: a, Unit: unit, Generation: g})
+ if err = s.Write("fixture.json", raw); err != nil {
+ t.Fatal(err)
+ }
+ t.Logf("boot=%s device=%d mount=%d", stable.Boot, stable.Device, stable.MountID)
+}
+func TestRootRebootPersistedFamiliesPhase2(t *testing.T) {
+ defer os.RemoveAll(persistedRebootDir)
+ s, err := rootstate.Open(filepath.Join(persistedRebootDir, "authority"), false, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer s.Close()
+ raw, err := s.Read("fixture.json")
+ if err != nil {
+ t.Fatal(err)
+ }
+ var f persistedReboot
+ if err = json.Unmarshal(raw, &f); err != nil {
+ t.Fatal(err)
+ }
+ boot, err := os.ReadFile("/proc/sys/kernel/random/boot_id")
+ if err != nil || strings.TrimSpace(string(boot)) == f.Entry.Persistent.Boot {
+ t.Fatal("actual reboot required", err)
+ }
+ roots := map[string]string{"data": filepath.Join(persistedRebootDir, "data"), "opt": filepath.Join(persistedRebootDir, "opt"), "units": filepath.Join(persistedRebootDir, "units")}
+ in := hostbox.StopInventory{Complete: true, Host: "h.example", Incarnation: "inc", InstallationStamp: 1, Entries: []hostbox.StopInventoryEntry{f.Entry}}
+ t.Run("installation", func(t *testing.T) {
+ if err := (ClaimRootHTTP{Roots: roots}).verifyInventoryPath(f.Entry); err != nil {
+ t.Fatal(err)
+ }
+ })
+ t.Run("state-reuse", func(t *testing.T) {
+ retained := in
+ retained.Entries = append([]hostbox.StopInventoryEntry(nil), in.Entries...)
+ owner := sha256.Sum256([]byte("h.example\x00inc\x001\x00box"))
+ retained.Entries[0].Ownership = hex.EncodeToString(owner[:])
+ a := ClaimRoleAssembly{ManagedRoots: roots}
+ changed, err := a.prepareStateInventory(ClaimLaunchInputs{DBPath: filepath.Join(roots["data"], "state", "db.sqlite")}, &retained, hostbox.Actor{Box: "box"})
+ if err != nil || changed {
+ t.Fatal("retained state was not reused", changed, err)
+ }
+ })
+ t.Run("payload", func(t *testing.T) {
+ if err := generationPayloadFiles(t.Context(), roots["data"], []hostbox.GenerationPayload{{Inventory: in}}); err != nil {
+ t.Fatal(err)
+ }
+ })
+ t.Run("stopped-installation", func(t *testing.T) {
+ if _, _, err := installationCoverage(roots, in, true); err != nil {
+ t.Fatal(err)
+ }
+ })
+ t.Run("migration", func(t *testing.T) {
+ version, err := filepath.Rel(roots["opt"], f.Generation.Path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if err := hostbox.CheckMigrationRoots(t.Context(), roots, map[string][]string{"units": {"app.service"}, "opt": {version}}, []hostbox.StopInventory{in}); err != nil {
+ t.Fatal(err)
+ }
+ })
+ t.Run("named-unit", func(t *testing.T) {
+ source := proofBindingSource{openFile: rootstate.OpenTrustedFile, persistent: rootstate.Persistent}
+ _, now, err := source.trustedBytes(f.Unit.Path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !sameProofFiles([]proofUnitFile{f.Unit}, []proofUnitFile{now}) || !bytes.Equal(proofFileSource(f.Unit), proofFileSource(now)) {
+ t.Fatal("unit source changed across boot")
+ }
+ bad := f.Unit
+ bad.Persistent.Filesystem = "foreign"
+ if sameProofFiles([]proofUnitFile{bad}, []proofUnitFile{now}) {
+ t.Fatal("foreign unit accepted")
+ }
+ })
+ t.Run("old-generation", func(t *testing.T) {
+ if _, err := generationCurrentBinding(f.Generation, rootstate.OpenTrustedFile); err == nil {
+ t.Fatal("old record without persistent evidence crossed boot")
+ }
+ })
+ t.Run("release-pins", func(t *testing.T) {
+ for _, name := range []string{"old-pins", "stable-pins"} {
+ state, err := rootstate.Open(filepath.Join(persistedRebootDir, name), false, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ pins := release.RootGenerationPins{Ledger: &release.RootGenerations{Store: state}, Verify: func(context.Context, []release.GenerationReservation) error { return nil }}
+ _, err = pins.StagedPins(t.Context(), roots["opt"])
+ state.Close()
+ if (err != nil) != (name == "old-pins") {
+ t.Fatal(name, err)
+ }
+ }
+ })
+ t.Run("cgroup", func(t *testing.T) {
+ r := release.GenerationReservation{Binding: f.Generation}
+ r.Binding.Binding.Host = "h.example"
+ root := filepath.Join(persistedRebootDir, "cgroups")
+ group := filepath.Join(root, generationBindingGroup(r.Binding))
+ if err := os.MkdirAll(group, 0755); err != nil {
+ t.Fatal(err)
+ }
+ r.Process.Group = generationBindingGroup(r.Binding)
+ r.Process.PID = 42
+ if err := generationGroupGone(t.Context(), root, r); err == nil {
+ t.Fatal("reused cgroup from another boot accepted")
+ }
+ if err := os.Remove(group); err != nil {
+ t.Fatal(err)
+ }
+ if err := generationGroupGone(t.Context(), root, r); err != nil {
+ t.Fatal("absent old group refused", err)
+ }
+ })
+ t.Run("substitution", func(t *testing.T) {
+ changed := f.Entry
+ changed.Device++
+ changed.Persistent.Device++
+ changed.Persistent.MountID++
+ if err := hostbox.VerifyInventoryPath(filepath.Join(roots["data"], "state"), changed); err != nil {
+ t.Fatal("boot-local numbers used", err)
+ }
+ changed.Persistent.Filesystem = "foreign"
+ if err := hostbox.VerifyInventoryPath(filepath.Join(roots["data"], "state"), changed); err == nil {
+ t.Fatal("foreign filesystem accepted")
+ }
+ path := filepath.Join(roots["data"], "state")
+ if err := unix.Mount(path, path, "", unix.MS_BIND, ""); err != nil {
+ t.Fatal(err)
+ }
+ err := hostbox.VerifyInventoryPath(path, f.Entry)
+ if e := unix.Unmount(path, 0); e != nil {
+ t.Fatal(e)
+ }
+ if err == nil {
+ t.Fatal("substituted mount accepted")
+ }
+ })
+ t.Run("stop-descriptors", func(t *testing.T) {
+ k := LinuxStopKernel{ManagedRoots: roots}
+ files, err := k.rebootStopFiles(t.Context(), in, []hostbox.StopFileIdentity{f.File})
+ if err != nil {
+ t.Fatal(err)
+ }
+ database := filepath.Join(roots["data"], "state", "db.sqlite")
+ moved := filepath.Join(persistedRebootDir, "renamed.sqlite")
+ if err = os.Rename(database, moved); err != nil {
+ t.Fatal(err)
+ }
+ held, err := os.Open(moved)
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = scanStopDescriptors(t.Context(), "/proc", files, []string{database})
+ held.Close()
+ if err == nil {
+ t.Fatal("renamed descriptor escaped reboot deny set")
+ }
+ if err = scanStopDescriptors(t.Context(), "/proc", files, []string{database}); err != nil {
+ t.Fatal("closed descriptor refused", err)
+ }
+ if err = os.Rename(moved, database); err != nil {
+ t.Fatal(err)
+ }
+ bad := in
+ bad.Entries = append([]hostbox.StopInventoryEntry(nil), in.Entries...)
+ bad.Entries[0].Persistent.Filesystem = "foreign"
+ if _, err = k.rebootStopFiles(t.Context(), bad, []hostbox.StopFileIdentity{f.File}); err == nil {
+ t.Fatal("foreign filesystem rebased")
+ }
+ })
+ t.Run("retirement", func(t *testing.T) {
+ p := hostbox.TypedParker{Roots: roots, ParkedRoot: roots["data"], Incarnation: "inc", Host: "h.example", Retirement: "retired"}
+ if err := p.Park(t.Context(), "state", f.Artifact); err != nil {
+ t.Fatal(err)
+ }
+ if err := p.Park(t.Context(), "state", f.Artifact); err != nil {
+ t.Fatal("durable park replay", err)
+ }
+ entry := f.Entry
+ entry.RelativePath = filepath.Join(".parked", "inc", "h.example", "retired", "data", "state")
+ if err := generationPayloadFiles(t.Context(), roots["data"], []hostbox.GenerationPayload{{Inventory: hostbox.StopInventory{Entries: []hostbox.StopInventoryEntry{entry}}}}); err != nil {
+ t.Fatal("parked payload", err)
+ }
+ })
+ t.Run("historic-migration", TestPlan14RootMigrationHistoricRootRunner)
+ t.Run("retry-delivery", TestPlan14RootRetryProjectionDelivery)
+ after, err := s.Read("fixture.json")
+ if err != nil || !bytes.Equal(raw, after) {
+ t.Fatal("reboot rewrote authority", err)
+ }
+}
diff --git a/internal/host/rootstop_reboot_linux.go b/internal/host/rootstop_reboot_linux.go
new file mode 100644
index 000000000..d15677a72
--- /dev/null
+++ b/internal/host/rootstop_reboot_linux.go
@@ -0,0 +1,58 @@
+package host
+
+import (
+ "context"
+ "github.com/carlosframework/platform/internal/hostbox"
+ "github.com/carlosframework/platform/internal/rootstate"
+ "path/filepath"
+)
+
+// Rebase only the journal's deny-only descriptor set. The retained inventory
+// proves which filesystem its old device number named; the old file inode is
+// never an ownership grant. Unmapped or ambiguous filesystems refuse recovery.
+func (k LinuxStopKernel) rebootStopFiles(ctx context.Context, in StopInventory, files []hostbox.StopFileIdentity) ([]hostbox.StopFileIdentity, error) {
+ type filesystem struct {
+ id string
+ device uint64
+ }
+ devices := map[uint64]filesystem{}
+ for _, e := range in.Entries {
+ if e.Kind != "path" || e.Materialization != "materialized" {
+ continue
+ }
+ if err := ctx.Err(); err != nil {
+ return nil, err
+ }
+ root := k.ManagedRoots[e.ManagedRoot]
+ if !filepath.IsAbs(root) || !filepath.IsLocal(e.RelativePath) {
+ return nil, ErrClaimStopInventory
+ }
+ f, err := hostbox.OpenInventoryFile(filepath.Join(root, e.RelativePath))
+ if err != nil {
+ return nil, err
+ }
+ err = hostbox.VerifyInventoryFile(f, e)
+ now, captureErr := rootstate.Persistent(f)
+ f.Close()
+ if err != nil {
+ return nil, err
+ }
+ if captureErr != nil {
+ return nil, captureErr
+ }
+ next := filesystem{e.Persistent.Filesystem, now.Device}
+ if prior, ok := devices[e.Device]; ok && prior != next {
+ return nil, ErrClaimStopInventory
+ }
+ devices[e.Device] = next
+ }
+ out := make([]hostbox.StopFileIdentity, 0, len(files))
+ for _, f := range files {
+ current, ok := devices[f.Device]
+ if !ok || f.Inode == 0 {
+ return nil, ErrClaimStopInventory
+ }
+ out = append(out, hostbox.StopFileIdentity{Device: current.device, Inode: f.Inode})
+ }
+ return out, nil
+}
diff --git a/internal/host/rootstop_reboot_linux_test.go b/internal/host/rootstop_reboot_linux_test.go
new file mode 100644
index 000000000..4d610fdae
--- /dev/null
+++ b/internal/host/rootstop_reboot_linux_test.go
@@ -0,0 +1,36 @@
+package host
+
+import (
+ "github.com/carlosframework/platform/internal/hostbox"
+ "os"
+ "path/filepath"
+ "testing"
+)
+
+func TestPlan14RebootStopDescriptorIdentity(t *testing.T) {
+ root := t.TempDir()
+ path := filepath.Join(root, "state")
+ if err := os.Mkdir(path, 0700); err != nil {
+ t.Fatal(err)
+ }
+ persistent := testPersistentInventory(t, path)
+ oldDevice := persistent.Device + 1
+ persistent.Boot = "previous-boot"
+ persistent.Device = oldDevice
+ persistent.MountID++
+ entry := hostbox.StopInventoryEntry{Kind: "path", ManagedRoot: "data", RelativePath: "state", Materialization: "materialized", Device: oldDevice, Inode: persistent.Inode, Type: persistent.Type, Persistent: persistent}
+ in := StopInventory{Complete: true, Entries: []hostbox.StopInventoryEntry{entry}}
+ k := LinuxStopKernel{ManagedRoots: map[string]string{"data": root}}
+ files, err := k.rebootStopFiles(t.Context(), in, []hostbox.StopFileIdentity{{Device: oldDevice, Inode: 71}})
+ now := testPersistentInventory(t, path)
+ if err != nil || len(files) != 1 || files[0].Device != now.Device || files[0].Inode != 71 {
+ t.Fatal("old deny set not rebased", files, err)
+ }
+ if _, err = k.rebootStopFiles(t.Context(), in, []hostbox.StopFileIdentity{{Device: oldDevice + 1, Inode: 71}}); err == nil {
+ t.Fatal("unmapped filesystem accepted")
+ }
+ in.Entries[0].Persistent.Filesystem = "foreign"
+ if _, err = k.rebootStopFiles(t.Context(), in, []hostbox.StopFileIdentity{{Device: oldDevice, Inode: 71}}); err == nil {
+ t.Fatal("foreign filesystem accepted")
+ }
+}
diff --git a/internal/host/rootupdates.go b/internal/host/rootupdates.go
index 8a5d18ebd..ddef9c9a1 100644
--- a/internal/host/rootupdates.go
+++ b/internal/host/rootupdates.go
@@ -21,6 +21,7 @@ import (
)
type rootUpdateRecord struct {
+ RetryMirror *rootLegacyRetry `json:",omitempty"`
Schema int
Installation string
Route registry.Route
@@ -35,6 +36,9 @@ type rootServedBuild struct {
}
type rootUpdateSource struct {
+ legacy []byte
+ ready func(registry.Route) error
+ publish func(string, rootRetryStatusRecord) error
source rootRestartRequestSource
binding *proofBindingSource
state rootstate.Store
@@ -119,7 +123,7 @@ func productionRootUpdates(dd string, probes ...func() (rootparticipation.Ledger
binding.box = func(context.Context) (string, error) { return c.Box, nil }
observer := productionProofObserver(release.OptDir())
observer.resolve = binding.resolve
- p := rootUpdateSource{source: rootRestartRequestSource{state: fences, store: store, census: func() (rootparticipation.Census, error) { return c, nil }}, binding: binding, state: state, book: book, store: store, pub: pub, data: dd, observe: func(rt registry.Route) (liveBuild, error) { return observer.observe(rt, 0) }}
+ p := rootUpdateSource{legacy: legacy, ready: func(rt registry.Route) error { return rootUpdateReady(ctx, rt) }, publish: publishRootRetry, source: rootRestartRequestSource{state: fences, store: store, census: func() (rootparticipation.Census, error) { return c, nil }}, binding: binding, state: state, book: book, store: store, pub: pub, data: dd, observe: func(rt registry.Route) (liveBuild, error) { return observer.observe(rt, 0) }}
return &release.RootUpdateInputs{Resolve: p.resolve, Close: func() error { return errors.Join(fences.Close(), state.Close()) }}, nil
}
}
@@ -204,7 +208,17 @@ func (p rootUpdateSource) resolve(ctx context.Context, host string) (release.Roo
}
for _, r := range retries.Requests {
if r.Scope.Kind == release.RestartScopeRetry && r.Scope.Value == host {
- if _, e := release.VerifyHostRetry(p.pub, r.Scope.Signed, rec.Account, rec.App, host, time.Now()); e == nil {
+ if grant, e := release.VerifyHostRetry(p.pub, r.Scope.Signed, rec.Account, rec.App, host, time.Now()); e == nil {
+ exact := p.book.ID() == grant.Book && p.book.PublishedEpoch(rec.Account, rec.App, grant.Build, host) == grant.Epoch
+ if exact {
+ legacyBook, epoch := rollout.LegacyRetryIdentity(p.legacy, rec.Account, rec.App)
+ if legacyBook != "" && epoch != 0 {
+ saved.RetryMirror = &rootLegacyRetry{Build: grant.Build, Book: legacyBook, Epoch: epoch}
+ }
+ if err = save(); err != nil {
+ return out, err
+ }
+ }
if err = p.book.VerifiedRetry(p.pub, r.Scope.Signed, rec.Account, rec.App, host, time.Now()); err != nil {
return out, err
}
@@ -213,6 +227,13 @@ func (p rootUpdateSource) resolve(ctx context.Context, host string) (release.Roo
}
ptr, e := release.Channel(ctx, p.store, p.pub, rec.Account, rec.App, rec.Channel)
if e == nil {
+ if served, ok := saved.Served[ptr.Version]; ok && served.Digest != "" {
+ if m, e := release.AuthorizedManifest(ctx, p.store, p.pub, rec.Account, rec.App, ptr.Version); e == nil && m.Artifacts[release.AdoptPlatform()].SHA256 == served.Digest {
+ if _, err = p.book.ClearHoldRanOnPointer(host, rec.Account, rec.App, ptr.PromotedAt); err != nil {
+ return out, err
+ }
+ }
+ }
if _, err = p.book.ClearOnPointer(rec.Account, rec.App, ptr.Version, ptr.PromotedAt); err != nil {
return out, err
}
@@ -224,8 +245,21 @@ func (p rootUpdateSource) resolve(ctx context.Context, host string) (release.Roo
manifest, err := release.AuthorizedManifest(ctx, p.store, p.pub, rec.Account, rec.App, build)
ok = err == nil && manifest.Artifacts[release.AdoptPlatform()].SHA256 == served.Digest
}
+ if mark, held := p.book.HoldRanOn(host); held && mark.Account == rec.Account && mark.App == rec.App && mark.Build != build && saved.Build.State != nil && saved.Build.State.LastExecuted == build {
+ return true
+ }
return p.book.SaveOwed() || p.book.Blocks(rec.Account, rec.App, build, host, ok) || p.book.HeldDown(rec.Account, rec.App, build, host)
}, Save: func(c release.Consumed) error { saved.Consumed = &c; return save() }}
+ out.Begin = func(version, digest, attempt string) (func(string, error, func() error) error, error) {
+ return p.beginRuntime(&saved, save, version, digest, attempt)
+ }
+ projectedVersion := rec.Pin
+ if projectedVersion == "" && ptr != nil {
+ projectedVersion = ptr.Version
+ }
+ if err = p.publishRetry(saved, projectedVersion); err != nil {
+ return release.RootUpdateInput{}, err
+ }
if saved.Build.State != nil {
out.Installed = saved.Build.State.LastExecuted
}
diff --git a/internal/host/rootupdates_projection_root_linux_test.go b/internal/host/rootupdates_projection_root_linux_test.go
new file mode 100644
index 000000000..2097a662b
--- /dev/null
+++ b/internal/host/rootupdates_projection_root_linux_test.go
@@ -0,0 +1,152 @@
+//go:build linux && rootrunner
+
+package host
+
+import (
+ "encoding/json"
+ "github.com/carlosframework/platform/internal/registry"
+ "github.com/carlosframework/platform/internal/release"
+ "github.com/carlosframework/platform/internal/rollout"
+ "github.com/carlosframework/platform/internal/status"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "syscall"
+ "testing"
+ "time"
+)
+
+func TestPlan14RootRetryProjectionDelivery(t *testing.T) {
+ if os.Getenv("PLAN14_RETRY_READER") == "1" {
+ report := rootRetryStatus(&status.RolloutReport{Hosts: map[string]status.HostRollout{"h.example.com": {HeldBook: "forged", HeldEpoch: 999}}})
+ raw, _ := json.Marshal(report)
+ os.Stdout.Write(raw)
+ os.Exit(0)
+ }
+ if os.Geteuid() != 0 {
+ t.Fatal("root required")
+ }
+ if err := os.Mkdir(rootRetryProjection, 0755); err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(rootRetryProjection)
+ state := testRootFailureStore(t)
+ book, err := rollout.InitializeRootFailures(state, "box/en/1", nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ rt := registry.Route{Host: "h.example.com", Account: "bab", App: "km"}
+ if _, err = book.Record(rollout.FailureRecord{Account: rt.Account, App: rt.App, Host: rt.Host, Build: "v1", HeldDown: []string{rt.Host}}); err != nil {
+ t.Fatal(err)
+ }
+ p := rootUpdateSource{book: book, publish: publishRootRetry}
+ if err = p.publishRetry(rootUpdateRecord{Route: rt}, "v1"); err != nil {
+ t.Fatal(err)
+ }
+ exe, err := os.Executable()
+ if err != nil {
+ t.Fatal(err)
+ }
+ cmd := exec.Command(exe, "-test.run=^TestPlan14RootRetryProjectionDelivery$")
+ cmd.Env = append(os.Environ(), "PLAN14_RETRY_READER=1")
+ // /root is private on the runner: the child uses an executable descriptor
+ // opened before dropping credentials, without making the runner binary public.
+ binary, err := os.Open(exe)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer binary.Close()
+ cmd.Path = "/proc/self/fd/3"
+ cmd.Args[0] = cmd.Path
+ cmd.ExtraFiles = []*os.File{binary}
+ cmd.SysProcAttr = &syscall.SysProcAttr{Credential: &syscall.Credential{Uid: 65534, Gid: 65534}}
+ raw, err := cmd.Output()
+ if err != nil {
+ t.Fatal(err)
+ }
+ var report status.RolloutReport
+ if err = json.Unmarshal(raw, &report); err != nil {
+ t.Fatal(err, string(raw))
+ }
+ h := report.Hosts[rt.Host]
+ if h.HeldBook != book.ID() || h.HeldEpoch != book.PublishedEpoch(rt.Account, rt.App, "v1", rt.Host) {
+ t.Fatal("agent reported forged retry", h)
+ }
+ legacy, err := rollout.OpenFailureBook(t.TempDir())
+ if err != nil {
+ t.Fatal(err)
+ }
+ if _, err = legacy.Record(rollout.FailureRecord{Account: rt.Account, App: rt.App, Host: rt.Host, Build: "v1", HeldDown: []string{rt.Host}}); err != nil {
+ t.Fatal(err)
+ }
+ legacyEpoch := legacy.PublishedEpoch(rt.Account, rt.App, "v1", rt.Host)
+ rt.Kind, rt.Status, rt.Version, rt.Channel, rt.Hibernate = "instance", "ready", "v1", "canary/x", true
+ if !rollout.Restrictable(rt) {
+ t.Fatal("fixture route not restrictable")
+ }
+ hold := &failureHolds{book: legacy, get: func(string) (*registry.Route, error) { return &rt, nil }}
+ old := declinedHolds.Swap(hold)
+ defer declinedHolds.Store(old)
+ // A root retry has no effect on the separate local mirror until root's
+ // durable acknowledgement names the exact local snapshot it observed.
+
+ seed, public, _ := release.GenerateKey()
+ priv, _ := release.ParseSigningKey(seed, "test")
+ pub, _ := release.ParsePublicKey(public, "test")
+ wire, err := release.SignHostRetry(release.RootSigner(priv), rt.Account, rt.App, rt.Host, h.HeldBy, h.HeldBook, h.HeldEpoch, time.Now())
+ if err != nil {
+ t.Fatal(err)
+ }
+ data := t.TempDir()
+ t.Setenv("CARLOS_DATA_DIR", data)
+ request := release.RestartRequest{Scope: release.RestartScope{Kind: release.RestartScopeRetry, Value: rt.Host, Signed: wire}}
+ work := []scopedRestart{{app: [2]string{rt.Account, rt.App}, requests: []release.RestartRequest{request}}}
+ applyRetries([]registry.Route{rt}, work, &restartMemory{pub: pub})
+ marker := filepath.Join(data, stageRequestMarker)
+ if _, err := os.Stat(marker); err != nil {
+ t.Fatal("root retry was not relayed", err)
+ }
+ if !book.HeldDown(rt.Account, rt.App, "v1", rt.Host) {
+ t.Fatal("agent relay cleared root authority")
+ }
+ if err := os.Remove(marker); err != nil {
+ t.Fatal(err)
+ }
+ work[0].requests[0].Scope.Signed = "forged"
+ applyRetries([]registry.Route{rt}, work, &restartMemory{pub: pub})
+ if _, err := os.Stat(marker); !os.IsNotExist(err) {
+ t.Fatal("forged retry was relayed", err)
+ }
+ if err = book.VerifiedRetry(pub, wire, rt.Account, rt.App, rt.Host, time.Now()); err != nil {
+ t.Fatal(err)
+ }
+ if book.HeldDown(rt.Account, rt.App, "v1", rt.Host) {
+ t.Fatal("delivered retry did not clear root failure")
+ }
+ saved := rootUpdateRecord{Route: rt, RetryMirror: &rootLegacyRetry{Build: "v1", Book: legacy.ID(), Epoch: legacyEpoch}}
+ if err = p.publishRetry(saved, "v1"); err != nil {
+ t.Fatal(err)
+ }
+ local := &status.RolloutReport{Hosts: map[string]status.HostRollout{rt.Host: {Account: rt.Account, App: rt.App, HeldBy: "v1", HeldBook: legacy.ID(), HeldEpoch: legacyEpoch}}}
+ rootRetryStatus(local)
+ if legacy.HeldDown(rt.Account, rt.App, "v1", rt.Host) {
+ t.Fatal("agent mirror still blocks the root retry")
+ }
+ if _, err = legacy.Record(rollout.FailureRecord{Account: rt.Account, App: rt.App, Host: rt.Host, Build: "v1", HeldDown: []string{rt.Host}}); err != nil {
+ t.Fatal(err)
+ }
+ current := *local
+ current.Hosts = map[string]status.HostRollout{rt.Host: {HeldBy: "v1", HeldBook: legacy.ID(), HeldEpoch: legacy.PublishedEpoch(rt.Account, rt.App, "v1", rt.Host)}}
+ rootRetryStatus(&current)
+ if !legacy.HeldDown(rt.Account, rt.App, "v1", rt.Host) {
+ t.Fatal("old receipt erased a later local failure")
+ }
+ // A service-written projection cannot deliver a mirror clear.
+ if err = os.Chmod(filepath.Join(rootRetryProjection, rt.Host+".json"), 0666); err != nil {
+ t.Fatal(err)
+ }
+ if report := rootRetryStatus(local); report == nil || report.Unavailable != rolloutBookUnreadable {
+ t.Fatal("hostile retry projection accepted", report)
+ }
+
+}
diff --git a/internal/host/rootupdates_runtime.go b/internal/host/rootupdates_runtime.go
new file mode 100644
index 000000000..8afd0758c
--- /dev/null
+++ b/internal/host/rootupdates_runtime.go
@@ -0,0 +1,287 @@
+package host
+
+import (
+ "context"
+ "crypto/ed25519"
+ "encoding/json"
+ "errors"
+ "os"
+ "path/filepath"
+ "time"
+
+ "github.com/carlosframework/platform/internal/registry"
+ "github.com/carlosframework/platform/internal/release"
+ "github.com/carlosframework/platform/internal/rollout"
+ "github.com/carlosframework/platform/internal/rootparticipation"
+ "github.com/carlosframework/platform/internal/rootstate"
+ "github.com/carlosframework/platform/internal/status"
+)
+
+type rootLegacyRetry struct {
+ Build, Book string
+ Epoch uint64
+}
+type rootRetryStatusRecord struct {
+ status.HostRollout
+ Mirror *rootLegacyRetry `json:"root_retry,omitempty"`
+}
+
+const rootRetryProjection = "/var/lib/carlos-swap-status"
+
+func (p rootUpdateSource) beginRuntime(saved *rootUpdateRecord, save func() error, version, digest, attempt string) (func(string, error, func() error) error, error) {
+ rt := saved.Route
+ if version == "" || digest == "" || attempt == "" {
+ return nil, os.ErrPermission
+ }
+ start := time.Now().UTC()
+ snap := p.book.Snapshot()
+ // Claim launches currently use the serial, hold-mode path. Workers and
+ // overlapping generations remain refused by the existing launch boundary.
+ if err := p.book.Begin(rt.Host, rollout.Intent{Account: rt.Account, App: rt.App, Build: version, ID: attempt, Mode: "hold", Start: start}); err != nil {
+ return nil, err
+ }
+ return func(invocation string, failure error, verify func() error) error {
+ if failure == nil && invocation == "" {
+ return os.ErrPermission
+ }
+ var readinessErr error
+ if failure == nil && p.ready != nil {
+ readinessErr = p.ready(rt)
+ failure = readinessErr
+ }
+ if failure == nil && verify != nil {
+ readinessErr = verify()
+ failure = readinessErr
+ }
+ build := &release.BuildState{Schema: 1, Host: rt.Host}
+ if saved.Build.State != nil {
+ *build = *saved.Build.State
+ }
+ if failure != nil {
+ if _, err := p.book.Record(rollout.FailureRecord{Account: rt.Account, App: rt.App, Host: rt.Host, Build: version, Mode: "hold", At: start, HeldDown: []string{rt.Host}}); err != nil {
+ return err
+ }
+ if err := p.book.MarkHoldRan(rt.Host, rollout.HoldRan{Account: rt.Account, App: rt.App, Build: version, Exec: attempt, At: start}); err != nil {
+ return err
+ }
+ } else {
+ if _, err := p.book.ClearHoldRanBefore(rt.Host, snap); err != nil {
+ return err
+ }
+ if saved.Served == nil {
+ saved.Served = map[string]rootServedBuild{}
+ }
+ saved.Served[version] = rootServedBuild{Digest: digest, Invocation: invocation, Source: saved.Installation + "/" + attempt, Epoch: p.book.RestrictionEpoch(rt.Account, rt.App, version, rt.Host)}
+ build.LastExecuted = version
+ }
+ if saved.Consumed != nil && saved.Consumed.Resolved != nil && saved.Consumed.Resolved.Target == version {
+ build.Resolved = saved.Consumed.Resolved
+ build.Completed = build.Resolved.ID
+ build.CompletedFailed = failure != nil
+ }
+ saved.Build = release.BuildStateCopy{Known: true, State: build}
+ if err := save(); err != nil {
+ return err
+ }
+ if err := p.book.End(rt.Host, attempt); err != nil {
+ return err
+ }
+ return errors.Join(readinessErr, p.publishRetry(*saved, version))
+ }, nil
+}
+
+func (p rootUpdateSource) retryStatus(saved rootUpdateRecord, version string) status.HostRollout {
+ rt := saved.Route
+ out := status.HostRollout{Account: rt.Account, App: rt.App, Installed: version, RetryV: status.HostRetryV}
+ if saved.Build.State != nil {
+ out.Good = saved.Build.State.LastExecuted
+ }
+ held := version
+ if h, ok := p.book.HoldRanOn(rt.Host); ok && h.Account == rt.Account && h.App == rt.App {
+ held = h.Build
+ }
+ served, ok := saved.Served[held]
+ ok = ok && served.Epoch == p.book.RestrictionEpoch(rt.Account, rt.App, held, rt.Host)
+ if held != "" && (p.book.Blocks(rt.Account, rt.App, held, rt.Host, ok) || p.book.HeldDown(rt.Account, rt.App, held, rt.Host)) {
+ out.HeldBy, out.AttemptBuild = held, held
+ out.HeldBook = p.book.ID()
+ out.HeldEpoch = p.book.PublishedEpoch(rt.Account, rt.App, held, rt.Host)
+ out.Attempt = status.AttemptFailed
+ if p.book.HeldDown(rt.Account, rt.App, held, rt.Host) {
+ out.Attempt = status.AttemptDown
+ }
+ }
+ return out
+}
+
+func (p rootUpdateSource) publishRetry(saved rootUpdateRecord, version string) error {
+ if p.publish == nil {
+ return nil
+ }
+ record := rootRetryStatusRecord{HostRollout: p.retryStatus(saved, version)}
+ if ack := saved.RetryMirror; ack != nil && !p.book.SaveOwed() && !p.book.Blocks(saved.Route.Account, saved.Route.App, ack.Build, saved.Route.Host, false) && !p.book.HeldDown(saved.Route.Account, saved.Route.App, ack.Build, saved.Route.Host) {
+ record.Mirror = ack
+ }
+ return p.publish(saved.Route.Host, record)
+}
+
+func publishRootRetry(host string, report rootRetryStatusRecord) error {
+ s, err := rootstate.Open(rootRetryProjection, true, true)
+ if err != nil {
+ return err
+ }
+ defer s.Close()
+ raw, err := json.Marshal(report)
+ if err != nil {
+ return err
+ }
+ return s.Write(host+".json", raw)
+}
+
+func rootRetryStatus(legacy *status.RolloutReport) *status.RolloutReport {
+ if _, err := os.Lstat(rootRetryProjection); errors.Is(err, os.ErrNotExist) {
+ return legacy
+ }
+ s, err := rootstate.Open(rootRetryProjection, false, true)
+ if errors.Is(err, os.ErrNotExist) {
+ return legacy
+ }
+ if err != nil {
+ return &status.RolloutReport{Unavailable: rolloutBookUnreadable}
+ }
+ defer s.Close()
+ names, err := s.Names()
+ if err != nil {
+ return &status.RolloutReport{Unavailable: rolloutBookUnreadable}
+ }
+ if legacy == nil {
+ legacy = &status.RolloutReport{}
+ }
+ out := *legacy
+ out.Hosts = map[string]status.HostRollout{}
+ for h, r := range legacy.Hosts {
+ out.Hosts[h] = r
+ }
+ for _, name := range names {
+ raw, e := s.Read(name)
+ var r rootRetryStatusRecord
+ if e != nil || json.Unmarshal(raw, &r) != nil || len(name) < 6 || name[len(name)-5:] != ".json" {
+ return &status.RolloutReport{Unavailable: rolloutBookUnreadable}
+ }
+ host := name[:len(name)-5]
+ prior := out.Hosts[host]
+ if ack := r.Mirror; ack != nil && ack.Book != "" && ack.Epoch != 0 && prior.HeldBook == ack.Book && prior.HeldEpoch == ack.Epoch && prior.HeldBy == ack.Build {
+ if m := armedRollout(); m != nil {
+ m.RetryHost(host, ack.Build, ack.Book, ack.Epoch)
+ } else if h := heldHolds(); h != nil {
+ h.retryHost(host, ack.Build, ack.Book, ack.Epoch)
+ }
+ }
+ prior.Account, prior.App = r.Account, r.App
+ prior.HeldBy, prior.HeldBook, prior.HeldEpoch, prior.RetryV = r.HeldBy, r.HeldBook, r.HeldEpoch, r.RetryV
+ if r.HeldBy != "" {
+ prior.Attempt, prior.AttemptBuild = r.Attempt, r.AttemptBuild
+ }
+ out.Hosts[host] = prior
+ }
+ return &out
+}
+
+func beginRootGenerationUpdate(ctx context.Context, s *rootGenerationSource, b release.GenerationBinding) (func(string, error, func() error) error, func() error, error) {
+ pub, err := s.pub()
+ if err != nil {
+ return nil, nil, err
+ }
+ in, err := productionRootUpdates(dataDir())(ctx, s.store, pub)
+ if err != nil {
+ return nil, nil, err
+ }
+ if in == nil {
+ return nil, nil, os.ErrPermission
+ }
+ fail := func(err error) (func(string, error, func() error) error, func() error, error) {
+ in.Close()
+ return nil, nil, err
+ }
+ row, err := in.Resolve(ctx, b.Binding.Host)
+ if err != nil {
+ return fail(err)
+ }
+ if row.Begin == nil || row.Failed(b.Version) {
+ return fail(os.ErrPermission)
+ }
+ finish, err := row.Begin(b.Version, b.Digest, b.Attempt)
+ if err != nil {
+ return fail(err)
+ }
+ return finish, in.Close, nil
+}
+
+func rootUpdateReady(ctx context.Context, rt registry.Route) error {
+ probe := proofRouteReady(rt, time.Second)
+ if probe == nil {
+ return os.ErrPermission
+ }
+ deadline := time.NewTimer(5 * time.Second)
+ defer deadline.Stop()
+ for {
+ if err := probe(); err == nil {
+ return nil
+ }
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ case <-deadline.C:
+ return os.ErrPermission
+ case <-time.After(25 * time.Millisecond):
+ }
+ }
+}
+
+func relayRootRetry(pub ed25519.PublicKey, rq retryRequest) bool {
+ state, err := rootstate.Open(rootRetryProjection, false, true)
+ if err != nil {
+ return false
+ }
+ defer state.Close()
+ raw, err := state.Read(rq.host + ".json")
+ var report rootRetryStatusRecord
+ if err != nil || json.Unmarshal(raw, &report) != nil {
+ return false
+ }
+ grant, why := verifyRetry(pub, rq, time.Now())
+ if why != "" || report.Account != rq.acct || report.App != rq.app || report.HeldBy != grant.Build || report.HeldBook != grant.Book || report.HeldEpoch == 0 || report.HeldEpoch != grant.Epoch {
+ return false
+ }
+ return os.WriteFile(filepath.Join(dataDir(), stageRequestMarker), []byte(time.Now().UTC().Format(time.RFC3339)+"\n"), 0644) == nil
+}
+
+func prepareRootRetryUnitDirectory() (bool, error) {
+ if _, err := os.Lstat(filepath.Join(rootparticipation.Namespace, "census.json")); errors.Is(err, os.ErrNotExist) {
+ return false, nil
+ } else if err != nil {
+ return false, err
+ }
+ ledger, required, err := rootparticipation.OpenForUpdate()
+ if ledger.State != nil {
+ defer ledger.State.Close()
+ }
+ if err != nil {
+ return false, err
+ }
+ if !required {
+ return false, nil
+ }
+ census, err := ledger.Census()
+ if err != nil {
+ return false, err
+ }
+ if !census.Complete || census.NeverEnrolled {
+ return false, os.ErrPermission
+ }
+ state, err := rootstate.Open(rootRetryProjection, true, true)
+ if err != nil {
+ return false, err
+ }
+ return true, state.Close()
+}
diff --git a/internal/host/rootupdates_runtime_test.go b/internal/host/rootupdates_runtime_test.go
new file mode 100644
index 000000000..eaed57b0f
--- /dev/null
+++ b/internal/host/rootupdates_runtime_test.go
@@ -0,0 +1,109 @@
+package host
+
+import (
+ "errors"
+ "testing"
+ "time"
+
+ "github.com/carlosframework/platform/internal/registry"
+ "github.com/carlosframework/platform/internal/release"
+ "github.com/carlosframework/platform/internal/rollout"
+ "github.com/carlosframework/platform/internal/status"
+)
+
+func TestPlan14RootRuntimeFailureAndCompletion(t *testing.T) {
+ for _, outcome := range []string{"failed", "healthy", "crash", "not-ready", "replaced-after-ready"} {
+ t.Run(outcome, func(t *testing.T) {
+ state := testRootFailureStore(t)
+ book, err := rollout.InitializeRootFailures(state, "box/en/1", nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ rt := registry.Route{Host: "h.example.com", Account: "bab", App: "km"}
+ saved := rootUpdateRecord{Schema: 1, Installation: "install", Route: rt, Consumed: &release.Consumed{Resolved: &release.ResolvedRequest{ID: 7, Target: "v1"}}}
+ p := rootUpdateSource{state: state, book: book}
+ if outcome == "not-ready" {
+ p.ready = func(registry.Route) error { return errors.New("not ready") }
+ }
+ a, err := p.beginRuntime(&saved, func() error { return nil }, "v1", "digest", "attempt")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if outcome == "crash" {
+ book, err = rollout.OpenRootFailures(state, "box/en/1")
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !book.HeldDown("bab", "km", "v1", rt.Host) {
+ t.Fatal("crash erased root intent")
+ }
+ return
+ }
+ var failure error
+ if outcome == "failed" {
+ failure = errors.New("readiness failed")
+ }
+ var verify func() error
+ if outcome == "replaced-after-ready" {
+ verify = func() error { return errors.New("invocation replaced") }
+ }
+ if err = a("invocation", failure, verify); (err != nil) != (outcome == "not-ready" || outcome == "replaced-after-ready") {
+ t.Fatal(err)
+ }
+ if outcome == "failed" || outcome == "not-ready" || outcome == "replaced-after-ready" {
+ if !book.HeldDown("bab", "km", "v1", rt.Host) {
+ t.Fatal("root runtime failure lost")
+ }
+ if saved.Build.State == nil || saved.Build.State.Completed != 7 || !saved.Build.State.CompletedFailed {
+ t.Fatal("failed request not completed", saved.Build)
+ }
+ } else {
+ if saved.Build.State == nil || saved.Build.State.Completed != 7 || saved.Build.State.CompletedFailed || saved.Build.State.LastExecuted != "v1" {
+ t.Fatal("healthy request not completed", saved.Build)
+ }
+ if saved.Served["v1"].Invocation != "invocation" {
+ t.Fatal("served evidence missing")
+ }
+ }
+ })
+ }
+}
+
+func TestPlan14RootRetryProjection(t *testing.T) {
+ state := testRootFailureStore(t)
+ book, err := rollout.InitializeRootFailures(state, "box/en/1", nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ rt := registry.Route{Host: "h.example.com", Account: "bab", App: "km"}
+ if _, err = book.Record(rollout.FailureRecord{Account: rt.Account, App: rt.App, Host: rt.Host, Build: "v1", HeldDown: []string{rt.Host}, At: time.Now()}); err != nil {
+ t.Fatal(err)
+ }
+ p := rootUpdateSource{book: book}
+ projected := p.retryStatus(rootUpdateRecord{Route: rt}, "v1")
+ if projected.HeldBook != book.ID() || projected.HeldEpoch == 0 || projected.RetryV != status.HostRetryV {
+ t.Fatal("wrong retry authority", projected)
+ }
+ seed, public, _ := release.GenerateKey()
+ priv, _ := release.ParseSigningKey(seed, "test")
+ pub, _ := release.ParsePublicKey(public, "test")
+ wire, err := release.SignHostRetry(release.RootSigner(priv), rt.Account, rt.App, rt.Host, projected.HeldBy, projected.HeldBook, projected.HeldEpoch, time.Now())
+ if err != nil {
+ t.Fatal(err)
+ }
+ if err = book.VerifiedRetry(pub, wire, rt.Account, rt.App, rt.Host, time.Now()); err != nil {
+ t.Fatal(err)
+ }
+ if book.HeldDown(rt.Account, rt.App, "v1", rt.Host) {
+ t.Fatal("projected retry refused")
+ }
+ if _, err = book.Record(rollout.FailureRecord{Account: rt.Account, App: rt.App, Host: rt.Host, Build: "v1", HeldDown: []string{rt.Host}}); err != nil {
+ t.Fatal(err)
+ }
+ if err = book.VerifiedRetry(pub, wire, rt.Account, rt.App, rt.Host, time.Now()); err != nil {
+ t.Fatal(err)
+ }
+ if !book.HeldDown(rt.Account, rt.App, "v1", rt.Host) {
+ t.Fatal("stale projection cleared new failure")
+ }
+}
diff --git a/internal/hostbox/coldhandover.go b/internal/hostbox/coldhandover.go
index 9c023604e..c5b84b78f 100644
--- a/internal/hostbox/coldhandover.go
+++ b/internal/hostbox/coldhandover.go
@@ -241,7 +241,7 @@ func (h ColdHandover) Run(ctx context.Context, prior hostguard.FenceTarget, next
if entry.Kind == "timer" {
continue
}
- inventory.Artifacts = append(inventory.Artifacts, Artifact{Kind: ArtifactKind(entry.Kind), Root: entry.ManagedRoot, Name: entry.RelativePath, Owner: entry.Ownership, RowID: entry.RowIdentity, Dev: entry.Device, Ino: entry.Inode, Type: entry.Type})
+ inventory.Artifacts = append(inventory.Artifacts, Artifact{Kind: ArtifactKind(entry.Kind), Root: entry.ManagedRoot, Name: entry.RelativePath, Owner: entry.Ownership, RowID: entry.RowIdentity, Dev: entry.Device, Ino: entry.Inode, Type: entry.Type, Persistent: entry.Persistent})
}
for _, timer := range j.Before.Timers {
inventory.Artifacts = append(inventory.Artifacts, Artifact{Kind: ArtifactTimer, Root: "registry", Name: timer.Host + "/" + timer.Name, Owner: timer.ClaimOwner, RowID: timer.ClaimRowID + "~" + timer.Registration})
@@ -260,7 +260,7 @@ func (h ColdHandover) Run(ctx context.Context, prior hostguard.FenceTarget, next
if err = h.retireIntended(ctx, j, intended); err != nil {
return err
}
- retire := TypedRetirement{JournalDir: filepath.Join(h.JournalDir, "retired"), Authority: InstallationCleanup{Guard: h.Guard, Verify: h.VerifyReceipt}, Filesystem: TypedParker{Roots: h.Roots, ParkedRoots: h.Roots, Incarnation: prior.Incarnation, Host: prior.Host, Retirement: intent.ID}, Rows: RegistryRows{Registry: h.Registry, Inventory: inventory}, Ack: func(context.Context, RetirementJournal) error { return nil }}
+ retire := TypedRetirement{JournalDir: filepath.Join(h.JournalDir, "retired"), Authority: InstallationCleanup{Guard: h.Guard, Verify: h.VerifyReceipt}, Filesystem: TypedParker{CapturePersistent: h.Guard.Root != nil, Roots: h.Roots, ParkedRoots: h.Roots, Incarnation: prior.Incarnation, Host: prior.Host, Retirement: intent.ID}, Rows: RegistryRows{Registry: h.Registry, Inventory: inventory}, Ack: func(context.Context, RetirementJournal) error { return nil }}
if err = retire.Run(ctx, prior, intent); err != nil {
return err
}
@@ -389,7 +389,7 @@ func (h ColdHandover) retireIntended(ctx context.Context, j coldJournal, intende
}
id := j.ID + "-intended"
dir := filepath.Join(h.JournalDir, "retired")
- parker := TypedParker{Roots: h.Roots, ParkedRoots: h.Roots, Incarnation: j.Prior.Incarnation, Host: j.Prior.Host, Retirement: id}
+ parker := TypedParker{CapturePersistent: h.Guard.Root != nil, Roots: h.Roots, ParkedRoots: h.Roots, Incarnation: j.Prior.Incarnation, Host: j.Prior.Host, Retirement: id}
want := RetirementInventory{Host: j.Prior.Host, Captured: hostguard.Captured{Incarnation: j.Prior.Incarnation, Stamp: j.Prior.Stamp}, Ownership: j.Before.Route.ClaimOwner}
body, err := readTrustedJournal(filepath.Join(dir, id+".json"))
resumed := err == nil
diff --git a/internal/hostbox/coldhandover_test.go b/internal/hostbox/coldhandover_test.go
index 945a2ce93..2fa970869 100644
--- a/internal/hostbox/coldhandover_test.go
+++ b/internal/hostbox/coldhandover_test.go
@@ -76,12 +76,12 @@ func coldHandoverTimers(t *testing.T, abandoned bool) {
if err != nil {
t.Fatal(err)
}
- parker := TypedParker{Roots: map[string]string{"data": source.Guard.DataDir}, ParkedRoot: source.Guard.DataDir, Incarnation: prior.Incarnation, Host: prior.Host, Retirement: "capture"}
+ parker := TypedParker{CapturePersistent: true, Roots: map[string]string{"data": source.Guard.DataDir}, ParkedRoot: source.Guard.DataDir, Incarnation: prior.Incarnation, Host: prior.Host, Retirement: "capture"}
artifact, err := parker.CaptureArtifact("data", old.Host+".db", owner.ClaimOwner, ArtifactPath)
if err != nil {
t.Fatal(err)
}
- in := StopInventory{Complete: true, Host: old.Host, Incarnation: prior.Incarnation, InstallationStamp: prior.Stamp, Box: "box", Enrollment: "enrollment", DirectoryRevision: "1", Entries: []StopInventoryEntry{{Kind: "route", ArtifactID: owner.ClaimRowID, ManagedRoot: "registry", RelativePath: old.Host, RowIdentity: owner.ClaimRowID, Ownership: owner.ClaimOwner, Materialization: "materialized"}, {Kind: "path", ArtifactID: "database", ManagedRoot: "data", RelativePath: artifact.Name, Ownership: artifact.Owner, Materialization: "materialized", Device: artifact.Dev, Inode: artifact.Ino, Type: artifact.Type}}}
+ in := StopInventory{Complete: true, Host: old.Host, Incarnation: prior.Incarnation, InstallationStamp: prior.Stamp, Box: "box", Enrollment: "enrollment", DirectoryRevision: "1", Entries: []StopInventoryEntry{{Kind: "route", ArtifactID: owner.ClaimRowID, ManagedRoot: "registry", RelativePath: old.Host, RowIdentity: owner.ClaimRowID, Ownership: owner.ClaimOwner, Materialization: "materialized"}, {Kind: "path", ArtifactID: "database", ManagedRoot: "data", RelativePath: artifact.Name, Ownership: artifact.Owner, Materialization: "materialized", Device: artifact.Dev, Inode: artifact.Ino, Type: artifact.Type, Persistent: artifact.Persistent}}}
if abandoned {
for _, name := range []string{"abandoned", "withdrawn"} {
in.Entries = append(in.Entries, StopInventoryEntry{Kind: "timer", ArtifactID: name, ManagedRoot: "registry", RelativePath: old.Host + "/" + name, Ownership: owner.ClaimOwner, RowIdentity: name, Materialization: "intended", TimerRetired: name == "withdrawn"})
diff --git a/internal/hostbox/inventory_identity.go b/internal/hostbox/inventory_identity.go
new file mode 100644
index 000000000..35d737125
--- /dev/null
+++ b/internal/hostbox/inventory_identity.go
@@ -0,0 +1,48 @@
+package hostbox
+
+import (
+ "github.com/carlosframework/platform/internal/rootstate"
+ "github.com/carlosframework/platform/internal/safefile"
+ "os"
+)
+
+// VerifyInventoryFile is called only after the configured-root traversal.
+func VerifyInventoryFile(f *os.File, e StopInventoryEntry) error {
+
+ info, err := f.Stat()
+ if err != nil {
+ return err
+ }
+ if !info.IsDir() && !info.Mode().IsRegular() {
+ return ErrTypedInventory
+ }
+ if e.Persistent.Boot != "" {
+ if e.Device != e.Persistent.Device || e.Inode != e.Persistent.Inode || e.Type != e.Persistent.Type {
+ return ErrChanged
+ }
+ now, err := rootstate.Persistent(f)
+ if err != nil || !e.Persistent.Same(now) || e.Inode != now.Inode || e.Type != now.Type {
+ return ErrChanged
+ }
+ } else {
+ return ErrChanged
+ }
+ return nil
+}
+
+func OpenInventoryFile(path string) (*os.File, error) {
+ f, err := safefile.OpenDir(path)
+ if err != nil {
+ return safefile.OpenFile(path, os.O_RDONLY, 0)
+ }
+ return f, nil
+}
+
+func VerifyInventoryPath(path string, e StopInventoryEntry) error {
+ f, err := OpenInventoryFile(path)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ return VerifyInventoryFile(f, e)
+}
diff --git a/internal/hostbox/migration_census_linux.go b/internal/hostbox/migration_census_linux.go
index 682643309..2ae0310d2 100644
--- a/internal/hostbox/migration_census_linux.go
+++ b/internal/hostbox/migration_census_linux.go
@@ -5,8 +5,6 @@ import (
"io/fs"
"os"
"path/filepath"
-
- "golang.org/x/sys/unix"
)
// CheckMigrationRoots accounts for every managed entry under offline exclusion.
@@ -70,13 +68,10 @@ func CheckMigrationRoots(ctx context.Context, roots map[string]string, shared ma
return nil
}
if e, ok := entries[name][rel]; ok {
- var st unix.Stat_t
- if err := unix.Lstat(path, &st); err != nil {
+ if err := VerifyInventoryPath(path, e); err != nil {
return err
}
- if uint64(st.Dev) != e.Device || st.Ino != e.Inode || st.Mode&unix.S_IFMT != e.Type || d.Type()&os.ModeSymlink != 0 {
- return ErrTypedInventory
- }
+
delete(entries[name], rel)
if d.IsDir() {
return filepath.SkipDir
diff --git a/internal/hostbox/plan14_cold_process_test.go b/internal/hostbox/plan14_cold_process_test.go
index 97449ef05..720ea41ab 100644
--- a/internal/hostbox/plan14_cold_process_test.go
+++ b/internal/hostbox/plan14_cold_process_test.go
@@ -137,12 +137,12 @@ func plan14ColdSetup(t *testing.T) plan14ColdManifest {
if err != nil {
t.Fatal(err)
}
- parker := TypedParker{Roots: map[string]string{"data": source.Guard.DataDir}, ParkedRoot: source.Guard.DataDir, Incarnation: prior.Incarnation, Host: prior.Host, Retirement: "capture"}
+ parker := TypedParker{CapturePersistent: true, Roots: map[string]string{"data": source.Guard.DataDir}, ParkedRoot: source.Guard.DataDir, Incarnation: prior.Incarnation, Host: prior.Host, Retirement: "capture"}
artifact, err := parker.CaptureArtifact("data", old.Host+".db", owner.ClaimOwner, ArtifactPath)
if err != nil {
t.Fatal(err)
}
- in := StopInventory{Complete: true, Host: old.Host, Incarnation: prior.Incarnation, InstallationStamp: prior.Stamp, Box: "box", Enrollment: "enrollment", DirectoryRevision: "1", Entries: []StopInventoryEntry{{Kind: "route", ArtifactID: owner.ClaimRowID, ManagedRoot: "registry", RelativePath: old.Host, RowIdentity: owner.ClaimRowID, Ownership: owner.ClaimOwner, Materialization: "materialized"}, {Kind: "path", ArtifactID: "database", ManagedRoot: "data", RelativePath: artifact.Name, Ownership: artifact.Owner, Materialization: "materialized", Device: artifact.Dev, Inode: artifact.Ino, Type: artifact.Type}}}
+ in := StopInventory{Complete: true, Host: old.Host, Incarnation: prior.Incarnation, InstallationStamp: prior.Stamp, Box: "box", Enrollment: "enrollment", DirectoryRevision: "1", Entries: []StopInventoryEntry{{Kind: "route", ArtifactID: owner.ClaimRowID, ManagedRoot: "registry", RelativePath: old.Host, RowIdentity: owner.ClaimRowID, Ownership: owner.ClaimOwner, Materialization: "materialized"}, {Kind: "path", ArtifactID: "database", ManagedRoot: "data", RelativePath: artifact.Name, Ownership: artifact.Owner, Materialization: "materialized", Device: artifact.Dev, Inode: artifact.Ino, Type: artifact.Type, Persistent: artifact.Persistent}}}
if err = inventory.WriteStopInventory(ctx, in); err != nil {
t.Fatal(err)
}
diff --git a/internal/hostbox/reconcile_adapter.go b/internal/hostbox/reconcile_adapter.go
index 550cc9356..29f298f70 100644
--- a/internal/hostbox/reconcile_adapter.go
+++ b/internal/hostbox/reconcile_adapter.go
@@ -313,7 +313,7 @@ func (a ReconcileAdapter) Retire(ctx context.Context, row registry.Route) error
if e.Ownership != row.ClaimOwner || (e.Materialization != "materialized" && !(a.RequireTimerInventory && e.Kind == "timer" && e.Materialization == "intended")) {
return ErrTypedInventory
}
- inventory.Artifacts = append(inventory.Artifacts, Artifact{AllowAbsent: e.Kind == "timer" && (e.TimerRetired || e.Materialization == "intended"), Kind: ArtifactKind(e.Kind), Root: e.ManagedRoot, Name: e.RelativePath, Owner: e.Ownership, RowID: e.RowIdentity, Dev: e.Device, Ino: e.Inode, Type: e.Type})
+ inventory.Artifacts = append(inventory.Artifacts, Artifact{AllowAbsent: e.Kind == "timer" && (e.TimerRetired || e.Materialization == "intended"), Kind: ArtifactKind(e.Kind), Root: e.ManagedRoot, Name: e.RelativePath, Owner: e.Ownership, RowID: e.RowIdentity, Dev: e.Device, Ino: e.Inode, Type: e.Type, Persistent: e.Persistent})
}
if err = checkTrustedJournalDir(a.Retirement.JournalDir, true); err != nil {
return err
diff --git a/internal/hostbox/stopinventory.go b/internal/hostbox/stopinventory.go
index 0053eb898..9ffab9392 100644
--- a/internal/hostbox/stopinventory.go
+++ b/internal/hostbox/stopinventory.go
@@ -1,7 +1,10 @@
package hostbox
+import "github.com/carlosframework/platform/internal/rootstate"
+
type StopInventoryEntry struct {
- TimerRetired bool `json:",omitempty"`
+ Persistent rootstate.PersistentIdentity `json:",omitzero"`
+ TimerRetired bool `json:",omitempty"`
Device, Inode uint64
Type uint32
Kind string
diff --git a/internal/hostbox/typedpark_linux.go b/internal/hostbox/typedpark_linux.go
index 9878227f3..473f3d29f 100644
--- a/internal/hostbox/typedpark_linux.go
+++ b/internal/hostbox/typedpark_linux.go
@@ -11,6 +11,7 @@ import (
"path/filepath"
"strings"
+ "github.com/carlosframework/platform/internal/rootstate"
"golang.org/x/sys/unix"
)
@@ -19,6 +20,7 @@ var ErrTypedParkUnsupported = errors.New("hostbox: typed park unsupported")
// TypedParker resolves inventory root IDs only from trusted configuration.
// ParkedRoot is the provisioned filesystem root containing .parked.
type TypedParker struct {
+ CapturePersistent bool
Roots map[string]string
ParkedRoots map[string]string
ParkedRoot, Incarnation, Host, Retirement string
@@ -50,7 +52,20 @@ func (p TypedParker) CaptureArtifact(rootID, name, owner string, kind ArtifactKi
if err := unix.Fstatat(fd.dir, fd.base, &st, unix.AT_SYMLINK_NOFOLLOW); err != nil {
return Artifact{}, err
}
- return Artifact{Kind: kind, Root: rootID, Name: name, Owner: owner, Dev: uint64(st.Dev), Ino: st.Ino, Type: st.Mode & unix.S_IFMT}, nil
+ a := Artifact{Kind: kind, Root: rootID, Name: name, Owner: owner, Dev: uint64(st.Dev), Ino: st.Ino, Type: st.Mode & unix.S_IFMT}
+ if p.CapturePersistent {
+ file, err := unix.Openat(fd.dir, fd.base, unix.O_PATH|unix.O_NOFOLLOW|unix.O_CLOEXEC, 0)
+ if err != nil {
+ return Artifact{}, err
+ }
+ f := os.NewFile(uintptr(file), name)
+ a.Persistent, err = rootstate.Persistent(f)
+ f.Close()
+ if err != nil {
+ return Artifact{}, err
+ }
+ }
+ return a, nil
}
func (p TypedParker) Park(ctx context.Context, id string, a Artifact) error {
@@ -60,6 +75,9 @@ func (p TypedParker) Park(ctx context.Context, id string, a Artifact) error {
if err := p.validate(); err != nil {
return err
}
+ if p.CapturePersistent && a.Persistent.Boot == "" {
+ return ErrTypedInventory
+ }
if id == "" || !managedName(a.Name) || a.Dev == 0 || a.Ino == 0 || a.Type == 0 {
return ErrTypedInventory
}
@@ -79,7 +97,7 @@ func (p TypedParker) Park(ctx context.Context, id string, a Artifact) error {
}
return err
}
- if !sameArtifact(a, &st) {
+ if !sameArtifactAt(a, &st, src.dir, src.base) {
return ErrChanged
}
dstRel := filepath.Join(".parked", p.Incarnation, p.Host, p.Retirement, a.Root, a.Name)
@@ -132,7 +150,7 @@ func (p TypedParker) verifyDestination(a Artifact, srcParent int) error {
if err := unix.Fstatat(fd.dir, fd.base, &st, unix.AT_SYMLINK_NOFOLLOW); err != nil {
return err
}
- if !sameArtifact(a, &st) {
+ if !sameArtifactAt(a, &st, fd.dir, fd.base) {
return ErrChanged
}
return p.sync(srcParent, fd.dir)
@@ -188,6 +206,22 @@ func openParent(rootPath, name string, create bool) (parentFD, error) {
}
return parentFD{cur, parts[len(parts)-1]}, nil
}
+func sameArtifactAt(a Artifact, st *unix.Stat_t, dir int, name string) bool {
+ if a.Persistent.Boot == "" {
+ return sameArtifact(a, st)
+ }
+ if a.Dev != a.Persistent.Device || a.Ino != a.Persistent.Inode || a.Type != a.Persistent.Type {
+ return false
+ }
+ fd, err := unix.Openat(dir, name, unix.O_PATH|unix.O_NOFOLLOW|unix.O_CLOEXEC, 0)
+ if err != nil {
+ return false
+ }
+ f := os.NewFile(uintptr(fd), name)
+ defer f.Close()
+ now, err := rootstate.Persistent(f)
+ return err == nil && a.Ino == now.Inode && a.Type == now.Type && a.Persistent.Same(now)
+}
func sameArtifact(a Artifact, st *unix.Stat_t) bool {
return a.Dev == uint64(st.Dev) && a.Ino == st.Ino && a.Type == st.Mode&unix.S_IFMT
}
@@ -207,6 +241,9 @@ func (p TypedParker) VerifyEmptyDirectory(a Artifact) error {
if err := p.validate(); err != nil {
return err
}
+ if p.CapturePersistent && a.Persistent.Boot == "" {
+ return ErrTypedInventory
+ }
root, ok := p.Roots[a.Root]
if !ok || !managedName(a.Name) || a.Type != unix.S_IFDIR {
return ErrTypedInventory
@@ -226,7 +263,7 @@ func (p TypedParker) VerifyEmptyDirectory(a Artifact) error {
if err := unix.Fstat(fd, &st); err != nil {
return err
}
- if !sameArtifact(a, &st) {
+ if !sameArtifactAt(a, &st, parent.dir, parent.base) {
return ErrChanged
}
if names, err := f.Readdirnames(1); len(names) != 0 || !errors.Is(err, io.EOF) {
diff --git a/internal/hostbox/typedpark_other.go b/internal/hostbox/typedpark_other.go
index 2510cc996..5922dded4 100644
--- a/internal/hostbox/typedpark_other.go
+++ b/internal/hostbox/typedpark_other.go
@@ -7,6 +7,7 @@ import "context"
var ErrTypedParkUnsupported = ErrUnsupported
type TypedParker struct {
+ CapturePersistent bool
Roots map[string]string
ParkedRoots map[string]string
ParkedRoot, Incarnation, Host, Retirement string
diff --git a/internal/hostbox/typedretire.go b/internal/hostbox/typedretire.go
index 3397d8ba6..5b9d69bc7 100644
--- a/internal/hostbox/typedretire.go
+++ b/internal/hostbox/typedretire.go
@@ -13,6 +13,7 @@ import (
"strings"
"github.com/carlosframework/platform/internal/hostguard"
+ "github.com/carlosframework/platform/internal/rootstate"
)
var (
@@ -33,15 +34,16 @@ const (
// Artifact binds a managed name to the installation identity which created it.
// Root is a configured root identifier, never an arbitrary absolute pathname.
type Artifact struct {
- AllowAbsent bool `json:"allow_absent,omitempty"`
- Kind ArtifactKind `json:"kind"`
- Root string `json:"root"`
- Name string `json:"name"`
- Owner string `json:"owner"`
- RowID string `json:"row_id,omitempty"`
- Dev uint64 `json:"dev,omitempty"`
- Ino uint64 `json:"ino,omitempty"`
- Type uint32 `json:"type,omitempty"`
+ Persistent rootstate.PersistentIdentity `json:"persistent,omitzero"`
+ AllowAbsent bool `json:"allow_absent,omitempty"`
+ Kind ArtifactKind `json:"kind"`
+ Root string `json:"root"`
+ Name string `json:"name"`
+ Owner string `json:"owner"`
+ RowID string `json:"row_id,omitempty"`
+ Dev uint64 `json:"dev,omitempty"`
+ Ino uint64 `json:"ino,omitempty"`
+ Type uint32 `json:"type,omitempty"`
}
type RetirementInventory struct {
diff --git a/internal/provision/plan14_p3_census_test.go b/internal/provision/plan14_p3_census_test.go
index b45120b1b..55cd3bc40 100644
--- a/internal/provision/plan14_p3_census_test.go
+++ b/internal/provision/plan14_p3_census_test.go
@@ -29,11 +29,21 @@ func plan14P3WriteCensusInventory() []censusEntry {
if e.File == "internal/release/roothistory_delivery.go" && (e.Unit == "PublishHistoryReconstruction" || e.Unit == "PublishHistoryRecoveryRetirement") {
continue
}
+ if (e.File == "internal/host/proofbinding.go" && e.Unit == "proofBindingSource.binding") ||
+ (e.File == "internal/host/proofbinding.go" && e.Unit == "proofBindingSource.unitBinding") ||
+ (e.File == "internal/host/proofnamed.go" && e.Unit == "proofBindingSource.record") ||
+ (e.File == "internal/host/rootinventory.go" && e.Unit == "ClaimRootHTTP.commitRootInventoryPending") {
+ continue
+ }
kept = append(kept, e)
}
return append(kept,
+ censusEntry{"internal/host/proofbinding.go", "proofBindingSource.binding", "key-site", "key:RecordKey", "4a47da1beac6c8d56047d2a928f05005cb2a63be02478ec93260a390b6162ab0"},
+ censusEntry{"internal/host/proofbinding.go", "proofBindingSource.unitBinding", "key-site", "key:RecordKey", "82e214d1cf66d29d0900f5c1ce9cfe0a2f31c070da4bf1497ef3fd5273c09aad"},
+ censusEntry{"internal/host/proofnamed.go", "proofBindingSource.record", "key-site", "key:RecordKey", "97f1501b9543e36c6a231170425c5c79c7c22489500aadf119e064abc1abde93"},
+ censusEntry{"internal/host/rootinventory.go", "ClaimRootHTTP.commitRootInventoryPending", "key-site", "key:RecordKey", "b83ba979dde73b56fbf78b6200edbc5374a3df5bea8150ad26093e64611b69bd"},
censusEntry{"internal/host/rootgenerations_launch.go", "rootGenerationSource.resolve", "key-site", "key:RecordKey", "578d6a9c37683852391c7ddfc612bb7f7d750b9e4316707daac98dfc5dc2fb88"},
- censusEntry{"internal/host/rootupdates.go", "rootUpdateSource.resolve", "key-site", "key:RecordKey", "1d925c350f5a23c936c3571da58bbb6252f7c51fed2c43263364b77571fc638a"},
+ censusEntry{"internal/host/rootupdates.go", "rootUpdateSource.resolve", "key-site", "key:RecordKey", "ef717e41d930053e3eff1301d87335666589d38e420cf8075b91226123bd3ba7"},
censusEntry{"internal/host/rootmovesfloor.go", "rootMovesFloors.refresh", "key-site", "key:writeRecord", "cb70a1eefbb4f8f243090270f23141c9c9a773ee278af002c79a6c3ef6b7c3b7"},
censusEntry{"internal/host/rootmovesfloor.go", "rootMovesFloors.persist", "key-site", "key:writeRecord", "2c1e0843c5865a31c0fab011d7d4825963bbb5a301727f37f3b1b6c3519eba5e"},
censusEntry{"internal/host/rootmovesfloor.go", "rootMovesFloors.writeRecord", "key-site", "key:writeRecord", "a8a51bdd73f8ab1447edf2241d19a41ba1bcb0084ef045d370e5282aca7e9e66"},
diff --git a/internal/provision/testdata/plan14-root-reads-p3.tsv b/internal/provision/testdata/plan14-root-reads-p3.tsv
index ace730c70..a9b44adc2 100644
--- a/internal/provision/testdata/plan14-root-reads-p3.tsv
+++ b/internal/provision/testdata/plan14-root-reads-p3.tsv
@@ -94,7 +94,7 @@ internal/host/systemapply.go systemApplier.restoreVersion authority F,J4 rev3=PR
internal/host/systemapply.go systemApplier.verifyPointer authority F,J4 rev3=PROPOSED-p3;identity=carlos system apply/recover, root systemd units or offline root CLI, uid 0;basis=signed pointer verified and independently cached for census target execution before earlier history exists 50961a77b1c9b4e915302c6b95cd57d9f0bbc238e7bd00b94f06a5960ab541c1
internal/host/units/carlos-system-recover.service external authority F,J4 rev3=PROPOSED-p3;identity=systemd update/recover oneshot shell uid 0;basis=guard branch is conditional on executable presence; unarmed units retain main selector; installed guard selects from root local floor file:external@0 f16b260868c4b258c804b3a4720e17f02f6c020eda9dcc2a67d2ca032a077b45
internal/host/units/carlos-system-update.service external authority F,J4 rev3=PROPOSED-p3;identity=systemd update/recover oneshot shell uid 0;basis=guard branch is conditional on executable presence; unarmed units retain main selector; installed guard selects from root local floor file:external@0 cfcaeea6308021ce5a7cb088464e8df3abc6b03ffaa0c7a0153c6d91bf1e3fd6
-internal/hostbox/migration_census_linux.go CheckMigrationRoots authority G,J4 rev3=PROPOSED-p3;identity=carlos system journal-migrate, offline operator CLI, uid 0;basis=offline scan requires every managed payload to match independent retained inode/type inventory or explicit shared path rules file:Lstat@1678,file:Lstat@932,file:WalkDir@1202 3eb5e56f13b0932364b68c7d80ad18135b262614b105c41bfcc3477d6f558e79
+internal/hostbox/migration_census_linux.go CheckMigrationRoots authority G,J4 rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=checks retained materialized roots against persistent filesystem evidence before census migration accepts coverage file:Lstat@932,file:WalkDir@1202 47101ce0414949ddf165f33825d88e405be32bc4dc8042376c7d3398b038ac28
internal/hostguard/guard.go record.admits authority G,J4 rev3=PROPOSED-p3;identity=root claim controller construction uid 0;basis=root admission retains migration denial until the exact predecessor session has a completed retained receipt 5864d1fa79a66ca6f69057416079b46524ed4bfdf1ce1de88124b5a24a428418
internal/hostguard/root.go Guard.CommitRootInventoryArtifacts authority G,J4 rev3=PROPOSED-p3;identity=root claim controller construction uid 0;basis=root inventory commit admits a newer migration writer only after its exact predecessor completed; old sessions stay denied 08e42f8810e2645a875b5177fc9e104ed4b307c7d80dc77d204e2516b1bd66de
internal/hostguard/root.go RootAuthority.read authority C,G,J4 rev3=PROPOSED-p3;identity=carlos instance-control, root control service uid 0; denial views also consumed by carlos agent uid carlos;basis=strict checked root record decoding includes retained migration session denials file:Read@175 7ff862f573a05a17951546a56ff791d42962d693331a69e8338bd8eb4f283d6b
@@ -201,31 +201,31 @@ internal/hostguard/rootmigration.go RootAuthority.CompleteMigrationInventory aut
@coverage internal/activator 95ea5c811cee8a679170f708c30b4446021740977474551c1d22bf8afaacf9be
@coverage internal/console 6f4998c39e6d66cd73ea98500000cbecac251dd21dafd58f51a85c2291e0c533
@coverage internal/edgesfile 7b48368150a427e4620f1c9ded49942b688c9e6c9cd983b7da43d3f2c0810b72
-@coverage internal/host 8ccb2feb1e570d1581d67e9b8815802b52513378cccc71f48c42631483734821
+@coverage internal/host 280444e2c3174a0d9bb07499f47d79a590e5736cb54f7cc7aa7ba679d4af5855
@coverage internal/host/units bf6ae516012701e0ca41908167e4efd60dd3c2c24e9af1555dec077e8be44461
-@coverage internal/hostbox 37e91e5b73a48538a69e2a25286e76f740917b29c0fb5f26e32d5f59e3da6e1d
+@coverage internal/hostbox 1aeb3bed428b63552f65f92bd7fa40bfbd818e34ebd1abfa169f1ea79a7a5d81
@coverage internal/hostfloor 696e5ea4fa37b924b68e8e262235b99298ee19342d875213ba8209e5287dd3c6
@coverage internal/hostguard 9aa80c14419e017785500e225fef7746ed9af37936ced9c238b9dd3aa5d485c9
-@coverage internal/release e050a2550df4b95f8c8b45c50c900d3c7404b69a0f91a13bcfe859ba6fbc627b
+@coverage internal/release 0dee7731724f39f434c0a251aa244367ca4c2742f49849a8149d3a0cf06eadcf
@coverage internal/rootparticipation ffa18f535e706793976bb235426fa5852e65baba211be5077666c1dc738e7f0b
@coverage internal/rootstate 80d6c4dccc6cacd416a2b4c0d3b8efd375ea564488bab7c26cd2f010f4416890
@coverage internal/safefile 7030f312f7a60487381f0dbae2cdecaaa83625b639b6af15104f912592550816
-internal/host/rootgeneration_kernel_linux.go generationCurrentBinding authority E2 rev3=PROPOSED-p3;run=8;identity=root generation recovery uid 0;basis=reopens retained executable through checked ancestry and compares persistent filesystem, handle, ownership and mount attachment before adapting only the transient scanner device identities file:Open@290 c6f4a4c2ae23e2e8bed442ea2062213b4b8253703534d8777539a1c11a878a2a
+internal/host/rootgeneration_kernel_linux.go generationCurrentBinding authority E2 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=permits an old generation without persistent evidence only in its recorded boot; otherwise refuses instead of guessing identity file:Open@290,file:ReadFile@910 5ececcd92fcbe89f5940451a161173a0973d8740e89f8fb46f7d051eaa86fd08
internal/host/rootgeneration_kernel_linux.go generationKernel.absent authority E2 E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance.;rev3=PROPOSED-p3;run=8;identity=root generation kernel census uid 0;basis=uses current-boot scanner identities only after retained filesystem and handle verification; immutable reservations remain unchanged file:Readlink@312 a017307e56616756a885f7143aeaa8a718a0ea3f8cff2a5f757c9e0f06ec557c
internal/host/rootgeneration_kernel_linux.go generationRetainedFiles authority E2 E21: bounded kernel reader retains executable, sibling, descriptor, mapping and mount references; checks controller boot/start and cgroup emptiness. Unknown nonroot tasks, foreign namespaces, missing kernel state or renamed trees refuse. Fixtures: TestPlan14GenerationKernelReferences, TestPlan14GenerationKernelMappingIdentity, TestPlan14GenerationKernelControllerIdentity, TestPlan14GenerationKernelRunningExecutable, TestPlan14GenerationKernelCgroup, TestPlan14GenerationKernelRetainedFiles, TestPlan14GenerationKernelSiblingAlias. Real proc executable tests are not full privileged namespace acceptance.;rev3=PROPOSED-p3;run=8;identity=root generation recovery uid 0;basis=requires verified persistent executable and tree identity through generationCurrentBinding e3a390aa9b689fca331fb853f0f49c9f09dbb0793a8a3d93ff53f66fab5c8251
-internal/host/rootgenerations_launch.go productionRootGenerations authority E2 E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals.;rev3=PROPOSED-p3;run=8;identity=root claim launch uid 0;basis=installs mandatory persistent identity capture for root generation reservations file:Open@380 efb8b122b8c3f347d47b5423503bb6f56e3a215c710ff28045c828be2b524782
+internal/host/rootgenerations_launch.go productionRootGenerations authority E2,E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=connects the census root generation source to independent runtime failure and served settlement file:Open@420 eabdd14bc136006198ef8753bcb71e47487916d1faa9da9c01b8abd651aa387c
internal/host/rootgenerations_launch.go rootGenerationSource.resolve authority E2 E20: read the atomic root installation under the existing host exclusion without recursive lock acquisition; retain fresh claim, canonical record, signed artifact and final reservation checks. Fixtures: TestPlan14GenerationLaunchDoesNotReenterRootLock, TestPlan14GenerationLaunchRefusals, TestPlan14RootDispatchRejectsRegistryMutation. PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.;rev3=PROPOSED-p3;run=8;identity=root claim launch uid 0;basis=captures persistent executable and tree proofs only after canonical installation and signed artifact verification under exclusion file:Open@2501 578d6a9c37683852391c7ddfc612bb7f7d750b9e4316707daac98dfc5dc2fb88
-internal/host/rootgenerations_launch.go type rootGenerationSource authority E2 E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals.;rev3=PROPOSED-p3;run=8;identity=root claim launch assembly uid 0;basis=adds the root-owned persistent file capture capability to production generation binding 8fe347db33e65766fd2d8378becd1668eb60367d1d8710f4d7593facafa3ad6d
+internal/host/rootgenerations_launch.go type rootGenerationSource authority E2,E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=binds production runtime authority and persistent file capture to the root launch source ebe058661c48feb225bfb03a6d0b93f116639f06e50a81c51fded1da744043e4
internal/host/rootupdates.go initializeMigrationFailures authority G,E3 rev3=PROPOSED-p3;run=8;identity=offline journal-migrate uid 0;basis=requires complete root census before creating migration-bound root failure book; missing legacy history supplies no known refusal file:Open@254 5f7f652988f3def733e1b525260a52fac3568242960468e5457975ced1cd41d8
-internal/host/rootupdates.go productionRootUpdates authority E3 rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0;basis=checks census before opening any new authority; retains root failure book and installation store and installs canonical inputs;rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0;basis=checks census before opening any new authority; retains root failure book and installation store and installs canonical inputs file:Open@1243,file:Open@765,file:Read@1566,whole:Route@2083 1906f47f244cfdbe0f7ca58eeab9168e05856b517cfc28f9ad27b7c711ae03e9
+internal/host/rootupdates.go productionRootUpdates authority E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=opens only census-bound root failure state and imports negative legacy evidence; binds root readiness and retry projection producers file:Open@1243,file:Open@765,file:Read@1566,whole:Route@1879,whole:Route@2200 d56da3910afe6909f05c057267caa6b34217ed26d1d1a445d6d9ce72a429d53c
internal/host/rootupdates.go rootFailureLegacy authority E3 rev3=PROPOSED-p3;run=8;identity=carlos adopt and offline migration uid 0;basis=bounded legacy byte read feeds only failure tuples and unresolved intents to the root deny importer; no legacy book opener or retry grant file:Open@65,file:ReadAll@239 313d92c63ac120966bbe6ad50de446c7a92e2d69d5e18b1b300fd724b3098f78
-internal/host/rootupdates.go rootUpdateSource.resolve authority E3,J1,J3 rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0;basis=binds fresh record and policy to root installation and claim; reads root consumed and served evidence, verifies signed retry and pointer transitions, persists decisions before dispatch file:Read@1368,registry:Account@1543,registry:Account@2428,registry:App@1581,registry:App@2473,registry:BuildState@1210,registry:GoodDemand@1176,registry:GoodDigest@1161,registry:GoodVersion@1145,registry:Host@1515,registry:Host@2393,registry:ServingVersion@1191,registry:Unit@2124,whole:Route@1521,whole:Route@1549,whole:Route@1587,whole:Route@1756,whole:Route@1763,whole:Route@2183,whole:Route@2406,whole:Route@2441,whole:Route@2486,whole:Route@3254,whole:Route@3262,whole:Route@4066,whole:Route@4073 1d925c350f5a23c936c3571da58bbb6252f7c51fed2c43263364b77571fc638a
+internal/host/rootupdates.go rootUpdateSource.resolve authority E3,J1,J3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=resolves canonical settings and signed retries; saves exact old legacy-book acknowledgements only after durable independent root retry file:Read@1368,registry:Account@1543,registry:Account@2428,registry:App@1581,registry:App@2473,registry:BuildState@1210,registry:GoodDemand@1176,registry:GoodDigest@1161,registry:GoodVersion@1145,registry:Host@1515,registry:Host@2393,registry:ServingVersion@1191,registry:Unit@2124,whole:Route@1521,whole:Route@1549,whole:Route@1587,whole:Route@1756,whole:Route@1763,whole:Route@2183,whole:Route@2406,whole:Route@2441,whole:Route@2486,whole:Route@3254,whole:Route@3262,whole:Route@4890,whole:Route@4897 ef717e41d930053e3eff1301d87335666589d38e420cf8075b91226123bd3ba7
internal/host/updatesroot.go updatesPassOption authority E3 rev3=PROPOSED-p3;run=8;identity=root adopt uid 0; unchanged agent opener uid carlos;basis=installs census-only root input provider while preserving the legacy failure-book opener for nonparticipating passes 4f66774059952bda531435d68487fa032a95b8d1c8ca33ec8b71b6639fa117e3
internal/release/adopt.go PassFilter authority B3,E3,J1,E1,E2 Signed named-unit recovery is independent of release and health history. Root rechecks canonical source, unit, process, signed target and trusted live pointer; captures attempt authority before publication; verifies readiness and resumes without repeated effects. Fixtures: TestPlan14SignedActiveFixIgnoresHistory, TestPlan14SignedActiveFixAuthority, TestPlan14SignedFixSupersedesOlderAttempt, TestPlan14ActiveRecoveryProcessCrash, TestPlan14SignedRestartWithoutHealthHistory, TestPlan14CapturedRollbackWithoutHealthHistory, TestPlan14SignedRestartRequiresTrustedLiveLink. E7 applies merge ruling 4: unbound no-census routes use the legacy pass and restart; ordinary candidates make no binding store call. Fixtures: TestR2UnguardedERecoveryUpdate, TestR2UnguardedERecoveryIncidentRecipe, TestPlan14ERecoveryBindingRefusalKeepsPromotedFix. E19: both destructive readers use the root reservation snapshot under existing release exclusion. Exact artifact and containing-tree identities are retained; missing completeness refuses destruction. Production installation/launch/kernel completeness and verified retirement remain unfinished. Fixtures: TestPlan14GenerationDeletionCannotUnpin, TestPlan14GenerationSnapshotCompleteness, TestPlan14GenerationSnapshotPermitsUnreservedRestage, TestPlan14GenerationSnapshotPinsContainingTree, TestPlan14GenerationSnapshotEmptyIsUnknown, TestPlan14GenerationConsumerMode.;rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0; legacy agent pass uid carlos;basis=resolves protected route inputs before filters, recovery and dispatch on census boxes and bypasses service-owned failure opener only there registry:App@26795,registry:App@29252,registry:App@29744,registry:App@29981,registry:App@31388,registry:App@6590,registry:App@9615,registry:App@9756,registry:Hibernate@29627,registry:Host@1061,registry:Host@1426,registry:Host@29797,registry:Host@30713,registry:Host@31441,registry:Host@3263,registry:Host@3330,registry:Host@3426,registry:Host@3461,registry:UpdateSettings@9493,whole:Route@1046,whole:Route@1164,whole:Route@1188,whole:Route@1461,whole:Route@1622,whole:Route@26790,whole:Route@2726,whole:Route@2768,whole:Route@2877,whole:Route@2901,whole:Route@29247,whole:Route@2932,whole:Route@29505,whole:Route@29527,whole:Route@29574,whole:Route@29592,whole:Route@29602,whole:Route@29645,whole:Route@29666,whole:Route@29679,whole:Route@29739,whole:Route@29765,whole:Route@29839,whole:Route@29878,whole:Route@2989,whole:Route@29894,whole:Route@29922,whole:Route@29976,whole:Route@30002,whole:Route@3075,whole:Route@30755,whole:Route@30809,whole:Route@30825,whole:Route@3097,whole:Route@31332,whole:Route@31383,whole:Route@31409,whole:Route@31483,whole:Route@31518,whole:Route@31534,whole:Route@3197,whole:Route@4280,whole:Route@4927,whole:Route@6512,whole:Route@6534,whole:Route@6585,whole:Route@6611,whole:Route@761,whole:Route@803,whole:Route@9444,whole:Route@950,whole:Route@9558,whole:Route@9603,whole:Route@9751,whole:Route@988 270763804170539d06afd58252d86e1a8ff692ab4d9355be3a2127e9efc9d4a2
internal/release/adopt.go adoptHost authority B3,E1,E2,E3,E4,J1 E16: root first-registration creation evidence under release exclusion; exact installation identity is required for first-program adoption and is consumed before an attempt. Installed-program history comes from the verified claim launch. Fixtures: TestPlan14FreshInstallRegistration, TestPlan14FreshInstallProgramGate, TestPlan14FreshInstallCanonicalIdentity, TestPlan14FreshInstallLaunchObservation, TestPlan14InstalledLaunchProgramEvidence, TestPlan14FreshInstallProcessCrash, TestPlan14FreshInstallVisibleSync, TestClaimControlUnitInstallers. E22: root generation pins guard existing-tree artifact and manifest writes in adoption and moves-held staging/publication. Held snapshot is read under release exclusion before the leaf held-stage lock; failures remain restrictive for writes. Claims-off source returns no root pins. Fresh wholly absent version trees retain signed staging. Fixtures: TestPlan14GenerationSiblingWrites, TestPlan14GenerationVerifiedSiblingWrites, TestPlan14GenerationHeldStage (production source assembly, both flag values without census, lock order, pin/error/fresh cases). Production completeness remains unavailable; no new completeness grant.;rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0; legacy agent pass uid carlos;basis=applies root settings to canonically resolved routes including named units while legacy settings eligibility remains unchanged registry:App@10936,registry:App@11096,registry:App@12125,registry:App@13051,registry:App@14633,registry:App@19792,registry:App@25268,registry:App@3144,registry:App@33027,registry:App@6758,registry:App@8059,registry:App@8253,registry:Hibernate@33888,registry:Host@10816,registry:Host@10849,registry:Host@10949,registry:Host@11109,registry:Host@11211,registry:Host@11243,registry:Host@11308,registry:Host@11758,registry:Host@11891,registry:Host@12338,registry:Host@12447,registry:Host@12649,registry:Host@13141,registry:Host@13927,registry:Host@14405,registry:Host@14619,registry:Host@14961,registry:Host@15551,registry:Host@19282,registry:Host@19390,registry:Host@19760,registry:Host@20580,registry:Host@20738,registry:Host@2105,registry:Host@21200,registry:Host@21252,registry:Host@21399,registry:Host@21486,registry:Host@22592,registry:Host@22836,registry:Host@2294,registry:Host@23496,registry:Host@2375,registry:Host@23881,registry:Host@24022,registry:Host@25236,registry:Host@25363,registry:Host@26705,registry:Host@27355,registry:Host@30588,registry:Host@31206,registry:Host@31531,registry:Host@3157,registry:Host@31605,registry:Host@31852,registry:Host@32003,registry:Host@33199,registry:Host@33366,registry:Host@33473,registry:Host@33701,registry:Host@33844,registry:Host@34589,registry:Host@34715,registry:Host@34803,registry:Host@4469,registry:Host@4583,registry:Host@5546,registry:Host@5651,registry:Host@6870,registry:Host@6918,registry:Host@7035,registry:Host@7067,registry:Host@7945,registry:Host@8113,registry:Host@8239,registry:Host@8358,registry:Host@8836,registry:Host@9223,registry:Host@9449,registry:Host@9545,registry:Host@9636,registry:Kind@554,registry:Unit@31751,registry:Unit@579,whole:Route@10073,whole:Route@10931,whole:Route@11091,whole:Route@12115,whole:Route@13041,whole:Route@14601,whole:Route@15166,whole:Route@15527,whole:Route@16750,whole:Route@17053,whole:Route@17209,whole:Route@19539,whole:Route@19683,whole:Route@19782,whole:Route@2206,whole:Route@22321,whole:Route@22720,whole:Route@25258,whole:Route@30159,whole:Route@3139,whole:Route@33175,whole:Route@3595,whole:Route@4347,whole:Route@6753 a9672d71a3d70ab0bcc2b257daebb974da0f0bf67731303f51221b216f06eff6
internal/release/adopt.go settingsTarget authority E3 Settings target rejects foreign consumed decisions and forces root-owned settings rebind to the canonical tenant.;rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0; legacy agent pass uid carlos;basis=census branch delegates target selection to root inputs before any legacy consumed, good-version or build-state read registry:App@2977,registry:App@3077,registry:App@3362,registry:BuildState@2680,registry:GoodVersion@3387,registry:Host@1313,registry:Host@1723,registry:Host@2241,registry:Host@2488,registry:Host@2777,registry:Host@3373,registry:Host@3785,registry:Host@429,registry:Host@4440,registry:Host@4628,registry:Host@702,registry:UpdateSettings@556,whole:Route@1187,whole:Route@2277,whole:Route@2284,whole:Route@2842,whole:Route@2849,whole:Route@301,whole:Route@495,whole:Route@513,whole:Route@658 420982c2cbde642ae3008b61f93dc514defb527c05b20203864de8d052621599
internal/release/adopt.go type passConfig authority E2,E3 E19: both destructive readers use the root reservation snapshot under existing release exclusion. Exact artifact and containing-tree identities are retained; missing completeness refuses destruction. Production installation/launch/kernel completeness and verified retirement remain unfinished. Fixtures: TestPlan14GenerationDeletionCannotUnpin, TestPlan14GenerationSnapshotCompleteness, TestPlan14GenerationSnapshotPermitsUnreservedRestage, TestPlan14GenerationSnapshotPinsContainingTree, TestPlan14GenerationSnapshotEmptyIsUnknown, TestPlan14GenerationConsumerMode, TestPlan14GenerationProductionModeGate, TestPlan14GenerationSnapshotPermitsFreshTree.;rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0; legacy agent pass uid carlos;basis=stores the typed census-only root update provider and per-pass resolved input authority 7a405d8b9a24ccb4c9f09f91ca468f74a1e9b4a8b960b430dc3a6290a6b310cd
-internal/release/rootgenerationpins.go RootGenerationPins.StagedPins authority E2 E23: versioned generation completeness binds exact reservations to independently supplied installation, launch and kernel evidence. Reservation mutations invalidate before commit; every destructive read reconciles again and retries sync. Production reconciliation remains unavailable. Fixtures: TestPlan14GenerationCompleteness, TestPlan14GenerationCompletenessInvalidation, TestPlan14GenerationCompletenessDurability, TestPlan14GenerationCompletenessCertificateSyncFailure, TestPlan14GenerationCompletenessPinConsumer, TestPlan14GenerationCompletenessProcessCrash; TestPlan14GenerationCompletenessCheckedRootStore passed on the E25 root runner.;rev3=PROPOSED-p3;run=8;identity=root release retention uid 0;basis=verifies persistent executable and tree proofs before retaining staged pins across reboot ef00e1932f03df622e7a6af4195f93da772982539eec4a88beb2056b685c2da9
+internal/release/rootgenerationpins.go RootGenerationPins.StagedPins authority E2 rev3=PROPOSED-p3;identity=root release retention and adoption uid 0;basis=checks the recorded boot before any legacy file identity comparison; cross-boot release pins require persistent executable and tree evidence file:ReadFile@605 84deb98d0e27873f79549d604547c07d27e850e1b2966b41c63b14f885bcb2c1
internal/release/rootgenerationpins.go generationFileIdentity authority E2 E19: both destructive readers use the root reservation snapshot under existing release exclusion. Exact artifact and containing-tree identities are retained; missing completeness refuses destruction. Production installation/launch/kernel completeness and verified retirement remain unfinished. Fixtures: TestPlan14GenerationDeletionCannotUnpin, TestPlan14GenerationSnapshotCompleteness, TestPlan14GenerationSnapshotPermitsUnreservedRestage, TestPlan14GenerationSnapshotPinsContainingTree, TestPlan14GenerationSnapshotEmptyIsUnknown, TestPlan14GenerationConsumerMode, TestPlan14GenerationProductionModeGate, TestPlan14GenerationSnapshotPermitsFreshTree.;rev3=PROPOSED-p3;run=8;identity=root release retention uid 0;basis=persistent filesystem and handle evidence supersedes boot-local device equality for new root generation records;rev3=PROPOSED-p3;run=8;identity=root release retention uid 0;basis=persistent filesystem and handle evidence supersedes boot-local device equality for new root generation records file:Lstat@316,file:Open@198,file:Open@442 ae15d4811588e28de96750de2ff27144096543d0cf51b5f5ef44b9b7762d6833
internal/release/rootgenerations.go type GenerationBinding authority E2 E18: claims-on launch records the canonical installation, deployment revision, signed build, executable and containing tree before start under release exclusion; both final spawn checks reread the same reservation and identities. Root process evidence never retires the reservation. This is the launch prerequisite only; complete pins and retirement remain pending. Fixtures: TestPlan14GenerationReservedBeforeClaimSpawn, TestPlan14GenerationLaunchRefusals, TestPlan14GenerationStartedSyncFailureRetainsPin, TestPlan14GenerationReservationProcessCrash, TestPlan14GenerationProductionWiring, TestPlan14GenerationReservationDurability, TestPlan14GenerationReservationConflicts, TestPlan14GenerationObservationKeepsReservation, TestPlan14GenerationRecordRefusals. PROPOSED E47: root-owned immutable unit/shape binding, reserved launch placement and exact invocation stop; retained generation binding carries the canonical unit. Default unit paths remain unchanged. Production named-route wiring and unit/env/timer retirement are not complete.;rev3=PROPOSED-p3;run=8;identity=root generation journal uid 0;basis=additive persistent executable and tree fields preserve historical device and inode records 24c31b4dc084ee2ea86b9ddf70842b795d3242f761529c2d1b07acd84fb4582e
internal/release/rootupdates.go RootUpdateInputs.routes authority E3,J1 rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0;basis=uses registry hostname only as selector and replaces protected dispatch fields with independently resolved root inputs registry:Host@308,registry:Host@365,registry:Host@382,registry:Host@481,whole:Route@244,whole:Route@273,whole:Route@368,whole:Route@499,whole:Route@512,whole:Route@520,whole:Route@538 c75f2735786a9185baf8c54ea14a6c2adbe387a84cfec92585faba2163d95a67
@@ -238,6 +238,56 @@ internal/rollout/rootfailures.go RootFailures.VerifiedRetry authority E3 rev3=PR
internal/rollout/rootfailures.go rootFailureWriter authority E3 rev3=PROPOSED-p3;run=8;identity=root adoption and migration uid 0;basis=writes migration identity, failure epochs and import fingerprints atomically through checked private root store e32ffb3459fe2b13e0ecbe7b364bd405ef25325ed8cbd685b9ac1e076a8c197a
internal/rootstate/persistent.go PersistentIdentity.Same authority A,E2 rev3=PROPOSED-p3;run=8;identity=root generation verification uid 0;basis=device and mount numbers are exact only within one boot; cross-boot equality requires persistent evidence and unchanged attachment topology;rev3=PROPOSED-p3;run=8;identity=root generation verification uid 0;basis=device and mount numbers are exact only within one boot; cross-boot equality requires persistent evidence and unchanged attachment topology 05794ea9031ebd75241e294c4a7acc0cd0c1ca390f52983556f951d696762254
internal/rootstate/persistent_linux.go Persistent authority A,E2 rev3=PROPOSED-p3;run=8;identity=root generation capture and verification uid 0;basis=captures filesystem ID, export handle, boot, inode, ownership and stable mount attachment from caller-checked descriptor;rev3=PROPOSED-p3;run=8;identity=root generation capture and verification uid 0;basis=captures filesystem ID, export handle, boot, inode, ownership and stable mount attachment from caller-checked descriptor file:Fstat@117,file:Fstatfs@214,file:ReadFile@412,file:ReadFile@510 d505ef9740195ea550eb40c98964d33a41fbe42229ee0dbd183e5075be90fd64
-@coverage internal/rollout 2eb6f16155889a1f30595f8f197d4155b0211320dae8eee317898895c937c462
+@coverage internal/rollout 56efcb8c1d7231a7f43d0464d97345930c83c2baf864762c1faa7a004286e984
internal/host/agent.go runAdoptUnderRootRelease authority B3,E1,E2,E3 E13: signed recovery allows unknown history but preserves usable refusals, including retained originals; verified later promotion clears only D1. Health recording is independent of program recording; minting requires a census. Fixtures: TestPlan14RecoveryUnknownHistory, TestPlan14RecoveryKnownRefusal, TestPlan14RecoveryOriginalRefusalWithUnknownHistory, TestPlan14RootHistoryVerifiedRetryBeforeAttempt, TestPlan14ProgramFailureStillRecordsHealth, TestPlan14RootHistoryMintCensus. E15: census-only root unit-restart consumption uses retained installations, canonical records, exact requests, invocation evidence and admission after durable intent under release exclusion. No-census effects use the original consumer. Fixtures: TestPlan14RootRestartProductionConsumption, TestPlan14RootRestartProductionHeldRollover, TestPlan14RootRestartProductionAdmissionAfterIntent, TestPlan14RootRestartProductionUnknown, TestPlan14RootRestartProductionSyncFailure, TestPlan14RootRestartProductionCrash, TestPlan14RootRestartRequestCensusGate. E19: both destructive readers use the root reservation snapshot under existing release exclusion. Exact artifact and containing-tree identities are retained; missing completeness refuses destruction. Production installation/launch/kernel completeness and verified retirement remain unfinished. Fixtures: TestPlan14GenerationDeletionCannotUnpin, TestPlan14GenerationSnapshotCompleteness, TestPlan14GenerationSnapshotPermitsUnreservedRestage, TestPlan14GenerationSnapshotPinsContainingTree, TestPlan14GenerationSnapshotEmptyIsUnknown, TestPlan14GenerationConsumerMode.;rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0;basis=wires the census-specific update authority under existing root release exclusion whole:Route@10811,whole:Route@18259,whole:Route@18295,whole:Route@8113 08246cfeb979e625154867453493dfe25195477f63adfe5cb2eb610ea69f136f
internal/host/agent.go runAdoptWithEnsureSystemUnits authority B3,C,D,E1,E2,E3,E4,F,J1 PROPOSED E45 / R-E45-3: root checks census presence before opening release exclusion; absent census uses main adoption with no release directory or lock. Retained census remains protected with either flag value. PROPOSED E45: root enforces census-gated release ordering, bounded acquisition and scoped recovery; registry timer primitives preserve supplied identity but producer integration remains pending.;rev3=PROPOSED-p3;run=8;identity=carlos adopt uid 0;basis=passes the same census source to release exclusion and root settings to preserve the no-census branch file:Open@176 24e2e1caa9ee1d2d1c681cb6d78bebc10e5772fdb1e7a193cd4d77ffb5a0f672
+internal/host/claimassembly.go NewProductionRootClaimStop authority C,E2 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=installs root filesystem identity capture in the production inventory handler bdf3e36e492b3fbac734569828bf023316f5a509cee228b1643c170f6d5a145f
+internal/host/claimlaunch_root.go ClaimLaunchRoot.startRecorded authority E1,E2,E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=persists the root failure intent before launch and independently revalidates readiness and the exact unit invocation before served/request completion file:Read@4073 0359474d6f665204e175c15d761e073e02d61e677e70bdfbc8ab29e4decb2cd0
+internal/host/claimretire_transport.go ClaimRootHTTP.retire authority C,G,J1 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=requires persistent root-captured artifact evidence when constructing the protected retirement parker registry:ClaimOwnership@1081,registry:Host@1062,registry:Host@792,whole:ClaimOwnership@1085,whole:ClaimOwnership@894,whole:Route@1877,whole:Route@854 57b5e1d2780a568d3564e58e40464f44d16c9d82f462e807c02188e0e862fb75
+internal/host/claimretire_transport.go type ClaimRootHTTP authority E1 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=binds the production inventory identity capturer to the root request handler; the agent cannot choose the capture implementation 2b20c3f65153b346dc3e2b2f75944c6e687cf95d79ea36187dd9a8743f790195
+internal/host/claimroleassembly_linux.go ClaimRoleAssembly.Launch authority C,J1 rev3=PROPOSED-p3;identity=carlos agent claim lifecycle uid carlos; final authorization remains in root;basis=checks retained state directory identity using persistent root evidence across boots before preparing the claimed launch file:Command@5995,file:EvalSymlinks@5544,file:Fstat@3627,file:Lstat@2269,file:OpenFile@3217,file:OpenFile@3404,file:Read@711 cb4182435d10da54b2d311503079c47a9c6b65ce5d1be863bafa495e1410bd66
+internal/host/claimroleassembly_linux.go ClaimRoleAssembly.PrepareState authority C,J1 rev3=PROPOSED-p3;identity=carlos agent claim lifecycle uid carlos; final authorization remains in root;basis=reuses state directories using root-captured persistent identity when present; legacy local inventories retain the prior same-device comparison file:Fstatat@2113,file:Fstatat@3330,file:Open@1597,file:Openat@1884 9566846a9949accd3d08a0ed09d9b3f3ec111ecd9d871cfa52292965a58a7673
+internal/host/claimstop_writers_linux.go installationCoverage authority C,G,J4 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=validates stopped-installation data roots against persistent filesystem identity before treating descriptors as covered file:Lstat@820,file:ReadDir@1167 326e99fd57e1b1ad8112c896b35b763f385468af25a078f640f4d38f7048b771
+internal/host/proofbinding.go productionProofBindingSource authority B3 rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=enables persistent unit-file identity only for the census-required root proof path file:Open@209,file:Open@379,file:Read@1068 84f8f9ea9bb39f0a6ca193692b3103b4eca1db396f533445c19acead61b30054
+internal/host/proofbinding.go proofBindingSource.binding authority B3,J1 rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=compares retained rollback files by persistent evidence rather than old-boot device numbers file:EvalSymlinks@1220,file:EvalSymlinks@1529,file:EvalSymlinks@562,file:EvalSymlinks@801,registry:Unit@3205,whole:Route@265,whole:Route@3702,whole:Route@3709 4a47da1beac6c8d56047d2a928f05005cb2a63be02478ec93260a390b6162ab0
+internal/host/proofbinding.go proofBindingSource.unitBinding authority B3,J1,E1 rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=hashes persistent file identity into the canonical unit binding while preserving exact legacy source hashes without census registry:Unit@508,registry:Unit@609,registry:Unit@800,whole:Route@2878,whole:Route@2885 82e214d1cf66d29d0900f5c1ce9cfe0a2f31c070da4bf1497ef3fd5273c09aad
+internal/host/prooffile.go proofFileSource authority B3 rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=excludes only boot-local numbers from persistent proof hashes; filesystem, handle, ownership and mount attachment remain bound e208b5c45a2c2d7a39204e5c4bebfff34b3bcad6bab9c9859375934bbe86cc8b
+internal/host/prooffile.go sameProofFiles authority B3 rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=compares retained and current proof files using persistent evidence, refusing an implicit upgrade of old unproven files e531e1eac189f957d9cc0151319093e0b2ab0fcd80412abc0d2f3fefcfc3421a
+internal/host/proofnamed.go proofBindingSource.record authority B3 rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=binds named-unit provenance to boot-stable file evidence and preserves the original no-census hash shape 97f1501b9543e36c6a231170425c5c79c7c22489500aadf119e064abc1abde93
+internal/host/proofnamed.go proofBindingSource.trustedBytes authority B3,J1 rev3=PROPOSED-p3;identity=root adoption and rollback proof binder uid 0;basis=captures persistent evidence from the checked root-owned unit file descriptor alongside its bytes file:ReadAll@422 aa6e98efc7a57b01ed38cd051642d8d2f0b6abf2d527d5f70533e7365746096e
+internal/host/rootgeneration_kernel_linux.go generationGroupGone authority E2 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=refuses a present cgroup placement from another boot; an absent old placement carries no process identity to compare file:Lstat@194,file:ReadFile@310 23b1abfe67d99241596e408fe4617be4a35a6ef4fe2ef3bcc256a5e18c5bd264
+internal/host/rootgeneration_parked.go generationRetirements authority E2 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=carries root-captured persistent artifact identity through generation retirement inventory a71e6fc0bbdbc5bfea9e653ad22aa974f0aa33d5b652d3771370293e1614ef2e
+internal/host/rootgeneration_payload_linux.go generationPayloadFiles authority E2 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=verifies materialized payload entries by persistent filesystem evidence before admitting their files into the absence scan file:Openat2@1120,file:Openat2@917 ab178c00d6000277fb95506043d00b4c080d08989e6db78429b4fde92a7a7bc5
+internal/host/rootgenerations_launch.go rootGenerationSource.reserve authority E2,E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=writes root runtime intent after the generation reservation and before launch under release and host exclusion b09d7390279bcb302d83c282a517680f43c44013e07fc490f37bc798fd1703ba
+internal/host/rootgenerations_launch.go type generationLaunchPermit authority E2,E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=retains the root runtime completion and close callbacks for the reserved launch 964b8f1ea86c1a85f8a60d5d87168d71375e9c835e2c64859267dc822265c135
+internal/host/rootinventory.go ClaimRootHTTP.commitRootInventoryPending authority E2 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=canonicalizes persistent evidence under root exclusion while preserving the original request digest and durable replay file:Read@1454,file:Read@3494,registry:Account@4858,registry:Account@4873,registry:App@4894,registry:App@4905,registry:ClaimIncarnation@4364,registry:ClaimOwner@4414,registry:ClaimOwner@5544,registry:ClaimOwnership@4956,registry:ClaimOwnership@4978,registry:ClaimOwnership@5860,registry:ClaimOwnership@7956,registry:ClaimRowID@4578,registry:ClaimRowID@4655,registry:ClaimStamp@4392,registry:DBPath@4922,registry:DBPath@4936,registry:Host@4828,registry:Host@4840,registry:Host@8432,registry:Name@8455,whole:ClaimOwnership@4960,whole:ClaimOwnership@4988,whole:ClaimOwnership@5870,whole:ClaimOwnership@7967,whole:Route@10226,whole:Route@3686,whole:Route@4069,whole:Route@4085,whole:Route@4140,whole:Route@4791,whole:Route@4804,whole:Route@4813,whole:Route@5051,whole:Route@5283,whole:Route@6117,whole:Route@6253,whole:Route@6477,whole:Route@7800,whole:Route@9491,whole:Route@9552,whole:Timer@8440,whole:Timer@8463 b83ba979dde73b56fbf78b6200edbc5374a3df5bea8150ad26093e64611b69bd
+internal/host/rootinventory.go ClaimRootHTTP.verifyInventoryPath authority C,J1 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=uses checked persistent evidence for protected installation entries; explicit legacy fixtures preserve their same-boot check file:Lstat@315,file:Stat@738 e6a68c1976cd2709949da2a5a9b8941ce9785de779a3747a3f8be3f14dfe9198
+internal/host/rootinventory_identity.go ClaimRootHTTP.bindInventoryPaths authority C,E2,J1 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=discards all caller-supplied persistent evidence and captures or revalidates it independently against the retained root inventory 601e3f268104235d4f25c7bb4ea262a2e790b3b892bb2950adf665136a5bd3af
+internal/host/rootinventory_state_linux.go ClaimRoleAssembly.prepareStateInventory authority C,J1 rev3=PROPOSED-p3;identity=carlos agent claim lifecycle uid carlos; final authorization remains in root;basis=uses root-supplied persistent state identity for remote inventory reuse while keeping agent proposals non-authoritative file:Fstatat@1313,file:Fstatat@2438,file:Open@799,file:Openat@1086 eda2afa82f7fde14fa0cd3626d4cb0484eb072b7c512c6df0850734c07108fc6
+internal/host/rootupdates_runtime.go beginRootGenerationUpdate authority E2,E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=opens census-only root update authority, resolves the canonical host and refuses a known failure before runtime intent b060f3f53e87b9ea7bc78a6cd5d3435db63b07a83c3b0a38618d2481b000605e
+internal/host/rootupdates_runtime.go publishRootRetry authority E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=writes root-owned public retry status only from the independently verified root book file:Open@84 e3c680d5a7d3c423dc183319bb3d0518bbea6cdc752c7bd6b540d57f884b414e
+internal/host/rootupdates_runtime.go rootRetryStatus hint E3 rev3=PROPOSED-p3;identity=carlos agent status probe uid carlos;basis=agent reads root-owned public retry status; an exact legacy-book acknowledgement may clear only the corresponding local mirror, never root authority file:Lstat@89,file:Open@183,file:Read@721 7db6b16062bd095634a03c58cfdcd3dde2d49c990a34fe37d260d0908a16aa5f
+internal/host/rootupdates_runtime.go rootUpdateReady authority E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=probes the canonical deployment endpoint before root records runtime served/request success whole:Route@95 fe93218ee43c1346b148e4c9f6f55731d8865acde4f72ec85f60c5732a6a7d76
+internal/host/rootupdates_runtime.go rootUpdateSource.beginRuntime authority E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=persists a root intent before effects; independently records failures or readiness plus exact process revalidation and request completion file:Exec@1480,registry:Account@1228,registry:Account@1439,registry:Account@1882,registry:Account@533,registry:App@1245,registry:App@1456,registry:App@1894,registry:App@550,registry:Host@1069,registry:Host@1259,registry:Host@1328,registry:Host@1405,registry:Host@1594,registry:Host@1911,registry:Host@2334,registry:Host@500,whole:Route@180,whole:Route@891 aca5ab8b339bfd54edb2a27d0dc058cc696ff74e669bb17376d426eea0e63eb4
+internal/host/rootupdates_runtime.go rootUpdateSource.publishRetry authority E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=projects the root book identity and epoch and includes a mirror acknowledgement only after the root denial is durably cleared registry:Account@284,registry:Account@378,registry:App@305,registry:App@399,registry:Host@333,registry:Host@427,registry:Host@490,whole:Route@290,whole:Route@311,whole:Route@339,whole:Route@384,whole:Route@405,whole:Route@433,whole:Route@496 d18d5c78c905754df748c0bf887a7170f6378a6da76df196af7508f28372be28
+internal/host/rootupdates_runtime.go rootUpdateSource.retryStatus authority E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=derives retry identity and restrictions from root-held failures and epoch-bound served observations registry:Account@154,registry:Account@380,registry:Account@518,registry:Account@586,registry:Account@644,registry:Account@795,registry:Account@888,registry:App@171,registry:App@403,registry:App@530,registry:App@598,registry:App@656,registry:App@807,registry:App@900,registry:Host@351,registry:Host@544,registry:Host@612,registry:Host@670,registry:Host@821,registry:Host@914,whole:Route@112 a3eafae0a95559cfb0c7677215d89dbf353e44150453f252fed0e56b575e1f11
+internal/hostbox/coldhandover.go ColdHandover.Run authority C,J2,J4 rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=carries persistent identity into root-guarded cold retirement without treating old device numbers as filesystem identity file:Exec@938,file:Lstat@10711,file:OpenRoot@10633,file:Read@1290,registry:Addr@3565,registry:Addrs@3583,registry:Backing@3602,registry:Canary@3659,registry:ClaimIncarnation@3443,registry:ClaimIncarnation@3945,registry:ClaimOwner@11461,registry:ClaimOwner@4027,registry:ClaimOwner@4047,registry:ClaimOwner@5922,registry:ClaimOwner@7014,registry:ClaimOwner@8272,registry:ClaimOwnership@11053,registry:ClaimOwnership@3413,registry:ClaimOwnership@4391,registry:ClaimOwnership@4609,registry:ClaimOwnership@4642,registry:ClaimRowID@11351,registry:ClaimRowID@11432,registry:ClaimRowID@4065,registry:ClaimRowID@4673,registry:ClaimRowID@6973,registry:ClaimRowID@8297,registry:ClaimStamp@3488,registry:ClaimStamp@3992,registry:Host@6850,registry:Host@8234,registry:Kind@3521,registry:Name@4727,registry:Name@6865,registry:Name@8253,registry:Platform@3643,registry:Registration@4091,registry:Registration@6930,registry:Registration@8322,registry:Replica@3673,registry:Route@11053,registry:Route@4391,registry:Route@4642,registry:Route@5173,registry:Route@5922,registry:Timers@4590,registry:Timers@4609,registry:Timers@4673,registry:Timers@4727,registry:Timers@6802,registry:Timers@8109,registry:Tunnel@3623,registry:Unit@3547,whole:ClaimOwnership@11067,whole:ClaimOwnership@3417,whole:ClaimOwnership@4403,whole:ClaimOwnership@4625,whole:ClaimOwnership@4654,whole:ColdRows@11055,whole:ColdRows@12167,whole:ColdRows@12177,whole:ColdRows@4888,whole:ColdRows@4896,whole:ColdRows@4904,whole:ColdRows@4911,whole:ColdRows@5175,whole:ColdRows@5924,whole:ColdRows@6804,whole:ColdRows@8111,whole:Route@11061,whole:Route@3398,whole:Route@3758,whole:Route@4190,whole:Route@4198,whole:Route@4249,whole:Route@4257,whole:Route@4397,whole:Route@4648,whole:Route@5182,whole:Route@5931,whole:Timer@3929,whole:Timer@4203,whole:Timer@4211,whole:Timer@4262,whole:Timer@4300,whole:Timer@4596,whole:Timer@4615,whole:Timer@4679,whole:Timer@4733,whole:Timer@6811,whole:Timer@8118 57685ec5d96946512cbf1382e247e8881c564351db594d24d005264eccb03b6b
+internal/hostbox/coldhandover.go ColdHandover.retireIntended authority C,J2,J4 rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=captures persistent identity for root-guarded empty directories before identity-conditional retirement file:Lstat@2251,registry:ClaimOwner@840,registry:Route@840,whole:ColdRows@842,whole:Route@849 85c7d0d2933bbd80f10690cddca7efa8920e789e35daeaa7e950dc78a352d71a
+internal/hostbox/inventory_identity.go OpenInventoryFile authority C,E2,G rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=opens inventory paths through no-follow checked directory and file descriptors for persistent identity verification file:OpenFile@116 07d0ccdc38099b5aec202a1e69332820897442ed8a803a8af679d4fb2e4d9e49
+internal/hostbox/inventory_identity.go VerifyInventoryFile authority C,E2,G rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=requires persistent root evidence and compares filesystem handle, ownership and stable mount attachment across boots file:Stat@82 540cbe21f56e58a5dc7c7ebd1cae0b7bfdf07f9a63e02d512bc07912cf8f7b0b
+internal/hostbox/inventory_identity.go VerifyInventoryPath authority C,E2,G rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=opens the checked inventory path and delegates strict retained persistent identity verification 2b4177d714a1f60980030a5bd0df9a46a926dfad8d1240b4b8897f6472e87663
+internal/hostbox/reconcile_adapter.go ReconcileAdapter.Retire authority C,E2 rev3=PROPOSED-p3;identity=carlos agent claim lifecycle uid carlos; final authorization remains in root;basis=preserves persistent root inventory evidence in exact retirement artifact requests registry:ClaimIncarnation@1309,registry:ClaimIncarnation@322,registry:ClaimIncarnation@3618,registry:ClaimIncarnation@3640,registry:ClaimOwner@1366,registry:ClaimOwner@1434,registry:ClaimOwner@2391,registry:ClaimOwner@2797,registry:ClaimOwner@3698,registry:ClaimOwner@3714,registry:ClaimOwner@3952,registry:ClaimOwnership@147,registry:ClaimRowID@3732,registry:ClaimRowID@3975,registry:ClaimStamp@1338,registry:ClaimStamp@362,registry:ClaimStamp@3664,registry:ClaimStamp@3680,registry:Host@1257,registry:Host@2296,registry:Host@2842,registry:Host@288,registry:Host@2899,registry:Host@3537,registry:Host@3920,registry:Name@3937,registry:Registration@3754,registry:Registration@3996,whole:ClaimOwnership@151,whole:Route@1069,whole:Route@1152,whole:Route@231,whole:Timer@3603 bcfa3350b1f4c778892fa0e6137bca4aa4f6757828019c1d8122e24e708806de
+internal/hostbox/typedpark_linux.go TypedParker.CaptureArtifact authority C,J2,J4 rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=captures filesystem handle, ownership and stable mount attachment when the root caller requests protected artifact capture file:Fstatat@440,file:Openat@714 07bdef2fe35bcb10dac89dbc150d78ddb9c250e742e2e41f4cc8346479295011
+internal/hostbox/typedpark_linux.go TypedParker.Park authority C,J2,J4 rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=requires persistent evidence for root-protected retirement and verifies source or replay destination before rename file:Fstat@1219,file:Fstat@1288,file:Fstatat@589 d69df17ed4506b5097e2003132c00e8435c12e1b79f7435a0633e27903ec7320
+internal/hostbox/typedpark_linux.go TypedParker.VerifyEmptyDirectory authority C,J2,J4 rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=requires protected persistent identity before using emptiness to retire an intended directory file:Fstat@663,file:Openat@441,file:Readdirnames@809 cf8d19a4f1ce597cbae1951341123576bc529c4646535cf7429509bb2563cb71
+internal/hostbox/typedpark_linux.go TypedParker.verifyDestination authority C,J2,J4 rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=checks parked artifact replay using persistent evidence under descriptor-held ancestry file:Fstatat@441 6fdfc6ad35510d48a8d0557ca3a4deb232d3a3208e6e9086de8090cd0bbf4fd2
+internal/hostbox/typedpark_linux.go sameArtifactAt authority C,E2,G rev3=PROPOSED-p3;identity=root claim retirement or offline migration uid 0; shared helpers also run for legacy agent requests without root authority;basis=verifies retained typed artifacts through descriptor-relative opens and persistent identity before any retirement effect file:Openat@267 ff2160537c636a66f6eb31c13c05ce4749e6c5c0b9d04ce4e54cc3f2cf69a88f
+internal/rollout/rootfailures.go LegacyRetryIdentity hint E3 rev3=PROPOSED-p3;identity=root adoption retry verifier uid 0, reading service-owned deny-only bytes;basis=extracts only the old service book identity and epoch for a local mirror acknowledgement; it cannot grant a root retry c3a6b3d17bbab8b0070ebf317fc54c96f6e781aba9eba97c38c81d06c6f9430d
+internal/host/claimstop_kernel_linux.go LinuxStopKernel.recoverAfterReboot authority C,J4 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=rechecks the persisted inventory filesystem before rebasing deny-only descriptor identities into the current boot; old process and cgroup identities remain boot-scoped file:ReadFile@833 57ca5033f471f8390813576f7159f5b5188c613d4df91fb1779322710f1832e7
+internal/host/rootstop_reboot_linux.go LinuxStopKernel.rebootStopFiles authority C,J4 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=maps old journal descriptor devices only through root-retained filesystem and directory-handle evidence; ambiguous or unknown filesystems refuse, and the resulting inode set only adds denies 5aa50c4df11b38dab56679ac01f33acdf59ac6d1065053b4c64fb4d4ff93d527
+internal/host/restartscope.go applyRetries authority E1,E3,J1,J4 rev3=PROPOSED-p3;identity=carlos agent retry consumer uid carlos;basis=preserves legacy local retry behavior and relays independently verified root-book retry requests to the existing root adoption marker whole:Route@121 9d3c9301860d8ae533066f05d943b86cd30571482999c120053283db6dec7497
+internal/host/rootupdates_runtime.go relayRootRetry hint E3 rev3=PROPOSED-p3;identity=carlos agent retry consumer uid carlos;basis=agent checks the root-owned public projection and signature before requesting root adoption; it neither changes root failure state nor reports a clear file:Open@82,file:Read@200 9ab15e088beaca6ead893b4e83d1671ea0c72bc5a3714a5518900a26dee7dd7c
+internal/host/claimstop_writers_linux.go rootInstallationCoverage authority C,G,J4 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=captures current checked descriptor identity for the extra state directory root derives from the canonical host; this ephemeral directory only expands the stop scan denial set file:Lstat@545 944fb88dc274d3f65358bb9492de46caa034168e7e0f1361ff0727c29ba5ca3f
+internal/host/claimunit.go claimUnitContent authority E1,E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=adds write permission for exactly the public retry directory only when the root settings reader has verified a complete census and prepared that directory 3082c34490fbf6f95ebace69d97161993635c9cc1fee346641fdc61cb1f2e43f
+internal/host/claimunit.go readClaimUnitSettings authority C,E3,G,J4 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=retains exact no-census unit settings; a claims-enabled complete census prepares the root-owned retry directory before the hardened controller starts data-literal@123,data-literal@1708,data-literal@1793 bb6950ff1fff6355dde999d17330e9cd29b49ce051b66bfe2c8d5bc05424d6a5
+internal/host/rootupdates_runtime.go prepareRootRetryUnitDirectory authority E3 rev3=PROPOSED-p3;identity=root claim/adoption controller uid 0;basis=root unit installer requires an independently opened complete census before creating the public retry directory or enabling its controller write path file:Lstat@67,file:Open@603 3be70325e77de790f369531610c5889da7af25a185fdde6062c49356ca1a9335
diff --git a/internal/release/plan14_generation_pins_test.go b/internal/release/plan14_generation_pins_test.go
index 85ee9c0e6..8c6d925e4 100644
--- a/internal/release/plan14_generation_pins_test.go
+++ b/internal/release/plan14_generation_pins_test.go
@@ -4,6 +4,7 @@ import (
"context"
"os"
"path/filepath"
+ "strings"
"testing"
"github.com/carlosframework/platform/internal/rootstate"
@@ -24,6 +25,11 @@ func generationPinFixture(t *testing.T, opt, account, app, version string) (*Roo
t.Helper()
g, s, b := generationFixture(t)
g.Store = generationListingStore{s}
+ boot, err := os.ReadFile("/proc/sys/kernel/random/boot_id")
+ if err != nil {
+ t.Fatal(err)
+ }
+ b.Target.BootID = strings.TrimSpace(string(boot))
b.Binding.Account, b.Binding.App, b.Version = account, app, version
b.Path = VersionPath(opt, account, version, app)
b.Tree = filepath.Dir(b.Path)
@@ -210,3 +216,20 @@ func TestPlan14GenerationSnapshotPermitsFreshTree(t *testing.T) {
t.Fatalf("fresh signed build blocked: %q reads=%d", got, reads)
}
}
+
+func TestPlan14GenerationLegacyPinBootBoundary(t *testing.T) {
+ f := newReuseFixture(t)
+ g, r := generationPinFixture(t, f.opt, "bab", "myapp", "v2")
+ source := RootGenerationPins{Ledger: g, Verify: func(context.Context, []GenerationReservation) error { return nil }}
+ if _, err := source.StagedPins(t.Context(), f.opt); err != nil {
+ t.Fatal("same boot pin refused", err)
+ }
+ r.Binding.Target.BootID = "previous-boot"
+ g.Store = generationListingStore{&healthyRetryStore{dir: t.TempDir()}}
+ if _, err := g.Reserve(r.Binding); err != nil {
+ t.Fatal(err)
+ }
+ if _, err := source.StagedPins(t.Context(), f.opt); err == nil {
+ t.Fatal("old boot pin guessed from device number")
+ }
+}
diff --git a/internal/release/rootgenerationpins.go b/internal/release/rootgenerationpins.go
index b516748be..f23665946 100644
--- a/internal/release/rootgenerationpins.go
+++ b/internal/release/rootgenerationpins.go
@@ -37,6 +37,12 @@ func (s RootGenerationPins) StagedPins(ctx context.Context, optDir string) (Stag
if r.Retirement != "" {
continue
}
+ if b.ExecutablePersistent.Boot == "" || b.TreePersistent.Boot == "" {
+ boot, err := os.ReadFile("/proc/sys/kernel/random/boot_id")
+ if err != nil || strings.TrimSpace(string(boot)) != b.Target.BootID {
+ return nil, os.ErrPermission
+ }
+ }
for path, expected := range map[string]rootstate.FileIdentity{b.Path: b.Executable, b.Tree: b.TreeIdentity} {
if err := generationFileIdentity(path, expected, map[string]rootstate.PersistentIdentity{b.Path: b.ExecutablePersistent, b.Tree: b.TreePersistent}[path]); err != nil {
return nil, err
diff --git a/internal/release/rootupdates.go b/internal/release/rootupdates.go
index edd15713d..c289138b9 100644
--- a/internal/release/rootupdates.go
+++ b/internal/release/rootupdates.go
@@ -10,6 +10,7 @@ import (
)
type RootUpdateInput struct {
+ Begin func(version, digest, attempt string) (func(invocation string, failure error, verify func() error) error, error)
Route registry.Route
Build BuildStateCopy
Consumed *Consumed
diff --git a/internal/rollout/rootfailures.go b/internal/rollout/rootfailures.go
index 72ab8c9bb..2b86cd9af 100644
--- a/internal/rollout/rootfailures.go
+++ b/internal/rollout/rootfailures.go
@@ -154,3 +154,13 @@ func (b *RootFailures) VerifiedRetry(pub ed25519.PublicKey, wire, acct, app, hos
_, _, _, err = b.RetryHostAt(acct, app, g.Build, host, g.Book, g.Epoch)
return err
}
+
+// LegacyRetryIdentity identifies only the agent mirror root has already read.
+// It cannot clear a root restriction or name a later agent failure.
+func LegacyRetryIdentity(raw []byte, acct, app string) (string, uint64) {
+ var f failureFile
+ if len(raw) > rootstate.MaxRecord || json.Unmarshal(raw, &f) != nil || f.Schema != failureSchema || !f.Durable || f.Book == "" {
+ return "", 0
+ }
+ return f.Book, f.Gens[genKey(acct, app)]
+}