Files
rea/src/process/ProcessLifecycle.ts
T
gensokyo-dev 6d5610fe5f fix(process): preserve exit scope and share native wait budgets
Retain the original bracketed ownership snapshot before applying later exit observations, so an exiting verified parent cannot erase a still-live child’s scope. Own one lazily started native-exit waiting budget per cleanup attempt and pass it through discovery, validation, revalidation and final verification.

Assisted-by: Reimu (gensokyo-skills:reimu-incident-triage)

Assisted-by: Kogasa (gensokyo-skills:kogasa-surprise-testing)
2026-10-19 18:12:05 +00:00

33 lines
1.2 KiB
TypeScript

import type { ProcessIdentityObservation } from "./ProcessOwnership.js";
/** Native lifecycle is independent of ownership, token readability and ps text. */
export type ProcessLifecycle = "non-zombie" | "exiting" | "zombie" | "dead";
export type ProcessLifecycleObservation =
| { readonly state: "observed"; readonly lifecycle: ProcessLifecycle }
| { readonly state: "unavailable"; readonly reason: string };
export const PROCESS_CLEANUP_VERIFICATION_GRACE_MS = 1_000;
export const PROCESS_CLEANUP_VERIFICATION_INTERVAL_MS = 25;
/** One operation owns a lazily started native-exit waiting window. */
export interface ProcessExitSettlementBudget {
deadline: number | undefined;
}
export const processIdentityHasExited = (
identity: ProcessIdentityObservation | undefined,
): boolean =>
identity?.state === "absent" ||
(identity?.state === "readable" &&
identity.lifecycle?.state === "observed" &&
(identity.lifecycle.lifecycle === "zombie" ||
identity.lifecycle.lifecycle === "dead"));
export const processIdentityIsExiting = (
identity: ProcessIdentityObservation | undefined,
): boolean =>
identity?.state === "readable" &&
identity.lifecycle?.state === "observed" &&
identity.lifecycle.lifecycle === "exiting";