package host import ( "context" "github.com/carlosframework/platform/internal/hostguard" "github.com/carlosframework/platform/internal/stopevidence" ) // Preserve root's optional observation contracts when isolated launch wraps // the stop kernel. Unit absence is checked before and after the inner kernel scan. func (k claimUnitStopKernel) VerifyWritersStopped(ctx context.Context, t hostguard.FenceTarget, inv StopInventory, peer StopPeer, hints []stopevidence.DescriptorHint) (WritersKernelEvidence, error) { inner, ok := k.Inner.(stopWritersKernel) if !ok || k.Journal == nil || k.Units == nil { return WritersKernelEvidence{}, ErrClaimStopUnavailable } in, err := k.Journal.Read(ctx, t) if err != nil { return WritersKernelEvidence{}, err } if !in.WritersClosed { return WritersKernelEvidence{}, ErrClaimStopInventory } if err := k.Units.Gone(ctx, t.Host, ""); err != nil { return WritersKernelEvidence{}, err } if _, err := k.settleUnits(ctx, t); err != nil { return WritersKernelEvidence{}, err } seen, err := inner.VerifyWritersStopped(ctx, t, inv, peer, hints) if err != nil { return WritersKernelEvidence{}, err } if err := k.Units.Gone(ctx, t.Host, ""); err != nil { return WritersKernelEvidence{}, err } return seen, nil } func (k claimUnitStopKernel) VerifyNoProcess(ctx context.Context, t hostguard.FenceTarget, inv StopInventory) (StopKernelEvidence, error) { inner, ok := k.Inner.(stopNoProcessKernel) if !ok || k.Units == nil || t.Session != 0 { return StopKernelEvidence{}, ErrClaimStopUnavailable } if err := k.Units.Gone(ctx, t.Host, ""); err != nil { return StopKernelEvidence{}, err } return inner.VerifyNoProcess(ctx, t, inv) }