Did you know? An agent can stop gracefully while an email or public post it requested is still being processed. Process shutdown and verified external results are different states.
Quick answer: stop new admissions, bound draining by a real deadline, checkpoint each task, verify outside effects, respect queue and lease ownership, then let a successor reconcile all unknown outcomes.
This article continues How Super Intelligence Works. Counts and incident examples are fictional teaching exercises, not evidence of deployed artificial superintelligence.
Contents and reading route
- 1. The practical answer: stopping is a workflow, not a switch
- 2. The difference between a stop request and a stopped effect
- 3. What SIGTERM and SIGKILL mean in this discussion
- 4. Kubernetes gives a termination grace period
- 5. Readiness and liveness have different responsibilities
- 6. A shutdown state machine that humans can audit
- 7. Stop accepting new work before draining old work
- 8. Queue acknowledgements must follow verified outcomes
- 9. Leases expire even if the old worker is still alive
- 10. Process termination does not erase database transactions
- 11. An invented 48-task draining ledger
- 12. A grace-period budget with real arithmetic
- 13. Python asynchronous tasks need cancellation discipline
- 14. Node.js handlers must actually complete shutdown
- 15. Containers, PID 1 and child processes
- 16. PreStop hooks and draining should not fight
- 17. A graceful exit needs an ungraceful failure test
- 18. Readiness, shutdown and user-facing promises
- 19. What to do with a partly generated article
- 20. When forceful termination is the safer choice
- 21. Monitoring that distinguishes safe from unsafe shutdowns
- 22. A changed-context assignment-upload exercise
- 23. Ten questions that reveal an unsafe design
- 24. Short assessment and worked answers
- 25. Frequently asked questions
- 26. Sources and next chapters
1. The practical answer: stopping is a workflow, not a switch
Did you know? An AI agent can produce an entirely correct report and still damage its workflow when a deployment shuts down its process in the middle of publication. The worker may have sent a request that the publishing service accepted, but if the worker dies before receiving the reply, the next worker could publish the same article again. “Process terminated” is not the same fact as “external operation cancelled.” Reliable automation protects that distinction.
A graceful shutdown gives a running service a controlled opportunity to stop accepting new work, finish or checkpoint permitted tasks, reconcile acknowledgements, release resources and exit before its environment forces termination. The process may not receive the opportunity at all during a power failure, crash or immediate kill. Therefore the durable safety design must also tolerate an abrupt stop at any point, not simply rely on cleanup handlers running.
The short method is to move from accepting to draining, stop new claims, bound the remaining work by a real deadline, checkpoint outcome and ownership, avoid duplicate side effects, and verify the destination before announcing completion. This chapter uses invented cases of school reports and content publication. It is educational, not evidence that a particular live eduKate system uses these procedures. Artificial superintelligence remains hypothetical; present software already needs shutdown discipline.
2. The difference between a stop request and a stopped effect
An operating system can ask a process to terminate, and an orchestrator can mark a container for replacement, but neither action automatically stops work that has already reached another service. A completed database transaction stays committed after the caller exits. An email may be queued by its provider even if the client process disappears. A blog page may be public before the publishing agent’s network call returns.
This is why a shutdown handler that sets a Boolean called cancelled is not enough. The Boolean may describe local intent, not the external result. For a consequential action, the agent needs a durable operation ID and a readback method that can establish whether the destination accepted it. When the result is uncertain, the proper state is ‘submitted, outcome unknown’ rather than ‘aborted’ or ‘complete’.
Imagine a parent newsletter worker exiting at 17:00. Its last network request left at 16:59:59, and no response was recorded. The next worker must not infer that the request was never delivered. It should inspect the provider’s supported status using the original operation identity, apply the approved duplicate-safe policy, and only then decide whether a resend is appropriate.
3. What SIGTERM and SIGKILL mean in this discussion
On Unix-like systems, SIGTERM conventionally requests termination and may be handled so an application can clean up. SIGINT commonly corresponds to an interactive interruption. SIGKILL forcibly terminates a process and cannot be caught by a user-space handler. Language runtimes vary in how they expose these signals; do not assume the same semantics on all operating systems or execution environments.
The official Node.js process documentation describes handlers for signals and explains that adding a SIGTERM or SIGINT listener can replace the default exit behavior on supported platforms. Consequently, a handler that logs ‘received SIGTERM’ but never exits can leave the process running until a supervisor kills it. Graceful shutdown needs bounded progress and an intentional termination path.
The critical rule is to treat signal handling as an opportunity, not as the sole recovery mechanism. A crash, out-of-memory termination or machine failure may bypass application cleanup. Design queue visibility, durable checkpoints, idempotent destinations and safe resume so that unfinished work can be diagnosed even when the agent never executed its shutdown callback.
4. Kubernetes gives a termination grace period
Kubernetes describes a Pod termination flow in which termination is initiated, optional preStop handling occurs, a TERM signal reaches container processes according to documented rules, and remaining processes may be forcibly stopped when their grace period expires. The official Pod lifecycle documentation notes a default termination grace period of thirty seconds for the illustrated normal case, while operators can configure a different value.
A common mistake is to treat the preStop hook and the application cleanup handler as two independent thirty-second windows. The countdown includes preStop activity under the documented lifecycle. If a preStop hook consumes most of the available grace, the main process may have little time to drain its tasks. Some platform behaviors can add a small extension under specific conditions, but applications should not rely on an extension as their safety budget.
Choose a grace period based on actual work and the deployment platform, and still impose a strict local deadline for accepting new tasks. A thirty-second example is not a universal best value. When tasks are longer than the allowable drain, use durable handoff or safe abandonment rather than extending a shutdown indefinitely and holding a deployment hostage.
5. Readiness and liveness have different responsibilities
Readiness expresses whether a service should receive new ordinary traffic through a supported routing system. Liveness helps a supervisor decide whether a process needs restarting. During shutdown, an agent service should normally stop advertising readiness for new requests before attempting to finish its in-flight work. Killing itself immediately on a readiness failure confuses traffic management with process health.
In Kubernetes, terminating endpoints can remain represented during draining with readiness-related information. Changes across the control plane and external load balancers are not necessarily instantaneous. Some requests may still reach a worker after it begins draining, so the application needs its own admission gate and a policy for rejecting or redirecting late work without corrupting state.
An AI service that has set readiness to false must not announce that all active work is finished. Traffic routing and task completion are separate dimensions. Keep metrics for currently admitted operations, accepted queue leases, unsettled external writes and reconciliation backlog. Those numbers tell operators whether a graceful exit is safe more accurately than one green-or-red health signal.
6. A shutdown state machine that humans can audit
A simple state model has ACCEPTING, DRAINING, STOPPING and EXITED. While accepting, the service may take new work under normal authorization. On a stop request, it enters draining: it refuses or redirects new long-running tasks and allows approved in-flight work to finish within policy. When its remaining budget is too small, it checkpoints or relinquishes unfinished operations as safely as the backing system permits.
The transition to stopping means the process no longer starts consequential work and is closing resources and recording its final local state. EXITED describes the process, not the downstream outcomes. Some operations may remain ‘pending’ at external providers after the process exits, and the new worker must reconcile them. A separate job-state ledger should preserve that distinction.
Keep transitions monotonic within one process generation. A delayed callback should not switch a draining service back into accepting because an old health check returned success. The scheduler or load balancer may start a replacement instance while the old one is still draining, so both generations need durable ownership and resource-version checks if they share a queue or target.
7. Stop accepting new work before draining old work
At the start of termination, turn off admission for new requests or queue claims, using the mechanism appropriate to the service. Then establish a snapshot of in-flight tasks and their current ownership. If the agent continues claiming new messages while waiting for old ones to finish, the queue may never empty and the grace period will expire without a clear handoff.
Not every task should finish locally. A short in-memory formatting step might complete safely, while a ten-minute export should be checkpointed and resumed by another worker. The choice depends on the action’s semantics, deadline and the cost of interruption. The shutdown handler must not simply pick the longest task first because it feels important; it should obey the user’s business priorities and the known remaining time.
An operation already submitted externally may require reconciliation rather than termination-time cancellation. If a provider supports explicit cancellation and the user has authorized it, invoke that contract and verify its outcome. If not, record the unknown in durable state. Do not invent a cancellation receipt or represent local abandonment as successful withdrawal of the external action.
8. Queue acknowledgements must follow verified outcomes
Many message queues let workers claim a message for a period and acknowledge it after processing. If a worker acknowledges a message before its durable result is recorded, a crash may cause work to disappear from the queue without a corresponding business effect. If a worker finishes the effect but crashes before acknowledgement, the queue may deliver the message again. The consumer therefore needs a replay-safe effect contract.
Suppose an agent claims message 542 to generate a parent summary. It creates a unique approved output and records the destination document ID, then acknowledges the queue message. This sequence is safer than acknowledging on receipt. But if the acknowledgement itself returns an ambiguous error, the next consumer can still see 542 again. A durable output identity and idempotent handler allow the repeat to be recognized rather than creating a second summary.
Different queues have different visibility, receipt and lease semantics. A consumer should follow the actual provider documentation and never rely on a generic notion that ‘acknowledged’ means an email was delivered. Acknowledgement usually describes the queue’s handling of a message; the human-facing effect must be verified separately at the relevant destination.
9. Leases expire even if the old worker is still alive
A queue visibility timeout or distributed lease can temporarily designate a worker as owner. If the worker is paused during shutdown, it may lose the lease while another process acquires the same task. When the first worker wakes, it might still hold old in-memory state and attempt to write. Without a destination-enforced fencing or version check, two workers can both modify the same record.
Use source-supported lease renewal and expected-version tokens, but do not extend leases indefinitely while an instance is draining. The goal is to complete short safe work and hand off anything too long. A replacement worker should verify the current authority, not assume the old worker is dead simply because the scheduler marked the Pod terminating.
The Agent Clock Skew chapter explains why time display and lease authority differ. During shutdown, the more important question is whether the destination will reject a stale write, not whether the retiring worker’s log still says it owns the task.
10. Process termination does not erase database transactions
An agent may stop while a database statement is running or after a commit but before its client records success. The database decides which transactions committed. The caller’s exit code cannot be used to reconstruct that outcome reliably. Some requests can be rolled back if the connection closes before commit, while others may already be durable. The exact result requires authoritative database inspection.
If a task increments a counter on every attempt, an uncertain commit is dangerous to retry. A safer design uses an operation record or a unique business key inside an appropriate transaction to make repeated attempts idempotent. The database can then answer whether the intended action was applied, rather than the model guessing from the moment the process received SIGTERM.
Do not place lengthy external requests inside a database transaction merely to make the workflow look atomic. The external system is usually outside that transaction, and holding locks while waiting for network calls can create other failures. Design clear boundaries with an outbox, workflow journal or reconciliation mechanism as appropriate to the existing architecture.
11. An invented 48-task draining ledger
Picture a fictional agent worker with 48 accepted tasks when shutdown begins. It has 26 receipt-backed completions, eight short tasks still running and eligible to finish within the bounded grace period, six long tasks safely checkpointed for transfer, five external submissions with unknown replies, and three tasks rejected because their current authorization or business deadline expired. The categories total 26 + 8 + 6 + 5 + 3 = 48.
At the beginning of draining, only the 26 are verified complete. The eight short tasks may finish later and receive receipts, but counting them immediately would overstate completion. The six transferred tasks are not finished; they are waiting for a successor. The five uncertain submissions require destination reconciliation before a retry. The three rejected tasks should be recorded as such, not silently queued for unauthorized continuation.
If all eight short tasks subsequently finish with confirmed receipts, the completion count becomes 34. That is 34/48, or about 70.83 percent, verified complete at that checkpoint. The remaining fourteen retain their specific states. A correct report contains a denominator and a category breakdown; an AI agent should not turn ‘we handled shutdown’ into ‘all tasks succeeded’.
12. A grace-period budget with real arithmetic
Assume a deliberately fictional service has a thirty-second shutdown grace period. Its preStop activity uses five seconds, admission and inventory take three, and closing ordinary resources requires an expected four-second reserve. That leaves 30 − 5 − 3 − 4 = 18 seconds as a planned in-flight work window. This is budgeting, not a guarantee that cleanup will always take precisely four seconds.
An eight-second task may be eligible to finish, while a ninety-second task should be handed off under the documented recovery mechanism. However, task-time estimates are uncertain and network calls can stall, so the drain loop needs its own deadline and cancellation or checkpoint behavior. A process that starts a new twenty-second operation with only eighteen seconds remaining is ignoring its own budget.
Use a monotonic elapsed-time source for local shutdown countdowns where suitable. Do not equate the orchestrator’s grace deadline with every external provider’s authorization deadline. A task might have local execution time left but lose its permission at the destination. The agent should stop or reconcile when external authority is absent, even if a few seconds remain before SIGKILL.
13. Python asynchronous tasks need cancellation discipline
In Python asyncio, cancelling a Task requests cancellation and normally results in a CancelledError being raised when the coroutine reaches an opportunity to respond. The official asyncio task documentation recommends robust cleanup with try/finally and generally propagating cancellation after cleanup. Swallowing cancellation without care can break structured-concurrency expectations and cause shutdown to hang.
An agent service might have one task fetching records, another formatting an article and a third awaiting a network publication response. Cancelling all three identically may be wrong. The fetch can often stop; formatting may safely be recomputed; publication must preserve operation identity and reconcile the destination. Cancellation signaling is a language-runtime mechanism, not a business-domain verdict.
Write shutdown tests that interrupt coroutines before an await, during I/O and after a remote request but before local acknowledgement. Verify cleanup under the correct async lifecycle rather than assuming a finally block runs in every crash scenario. Hard termination can bypass normal Python cleanup altogether, making durable task state essential.
14. Node.js handlers must actually complete shutdown
Node.js applications can listen for signals such as SIGTERM where the platform supports them. As its documentation notes, adding certain signal listeners can remove the runtime’s default behavior. A callback that logs the signal and leaves an HTTP server or timer active may cause the process to remain alive. The shutdown handler should begin orderly closure and establish a definite exit policy rather than assuming the operating system will handle every resource automatically.
For an HTTP agent API, stop new admissions and close or drain open connections using the server’s documented methods. For a queue consumer, stop polling and renew only the leases needed to complete or hand off accepted tasks safely. For a database pool, finish necessary transactions before closing connections, but do not hold them indefinitely waiting for an external website to respond.
The same general plan applies beyond Node.js: understand the runtime’s signal and thread model, its resource handles and the supervisor that ultimately controls termination. A handler written for Unix development may behave differently inside a container or on Windows. Document tested behavior for the actual deployment environment.
15. Containers, PID 1 and child processes
In containers, the application is often run as process 1 or through an entrypoint wrapper. If signals reach only an intermediate shell that does not forward them correctly, the real worker may not receive its expected shutdown request. Conversely, a child process spawned to render a document may continue after the parent begins draining unless the program has explicit lifecycle management.
Test that the process manager forwards the intended termination signal, handles child exits and waits appropriately. A command that works interactively on a developer laptop is not proof that the deployed container receives the same signals. Use supported entrypoint practices for the language and image rather than blindly inserting shell layers that change process identity.
Do not assume child cleanup is always possible. A forced termination can interrupt both parent and subprocesses. Temporary output files should be written and promoted with version or atomic-handoff semantics suitable for their storage. When a replacement worker starts, it must distinguish complete artifacts from abandoned partial files before it uses them.
16. PreStop hooks and draining should not fight
A preStop hook may be used to coordinate shutdown, but it consumes time inside the termination process and has its own failure modes. A hook that sleeps for a fixed thirty seconds in a thirty-second grace period leaves little opportunity for the application to flush durable state. A hook that depends on a service already terminating may block until forced shutdown.
Choose a sequence appropriate to the platform: remove or reduce ordinary traffic, stop accepting new work, let the main process drain with bounded deadlines, and clean up external resources only as permitted. In Kubernetes, consult the actual Pod lifecycle and sidecar semantics, which can affect termination ordering. Do not transfer a tutorial written for an old platform version into production without checking current behavior.
For longer jobs, a clean queue handoff is generally more reliable than waiting in a preStop script. A successful hook result should be recorded as local coordination, not proof that every external side effect completed. Keep the domain outcome ledger authoritative regardless of how many hooks reported success.
17. A graceful exit needs an ungraceful failure test
The correct shutdown design should pass a test where the process is killed before any cleanup handler runs. That may seem unfair, but real machines fail without notice. If an interrupted task can lose an accepted payment, send duplicate parent emails or publish duplicate pages, adding another SIGTERM handler will not fix the underlying absence of durable operation identity.
Test injection points immediately before a destination call, immediately after the call is submitted, after a success is returned but before the checkpoint is stored, and during queue acknowledgement. The next worker should detect previously committed results or safely retry under the destination’s documented contract. Where exact reconciliation is impossible, it should stop and surface an unresolved outcome.
A test’s verdict should specify what was observed: for example, ‘one destination post ID confirmed after replay’ or ‘uncertain provider outcome held for review.’ Avoid a single label called crash-safe when the test covered only one convenient interruption point. Reliability increases when the team names the boundaries it has actually tested.
18. Readiness, shutdown and user-facing promises
A parent using an online learning portal does not care whether a particular worker pod was terminated cleanly. They care whether their submission was saved, whether the timetable remains correct and whether an email was sent to the intended recipient. Operational reports should therefore connect process state to verified user-visible outcomes rather than celebrating a graceful exit in isolation.
During rolling deployment, a response may be handled by a newly started worker while an older one is draining. If the user submits the same request again because the first response was lost, the two attempts must still respect the same business operation key. Otherwise, an infrastructure change can turn a routine button press into a duplicate registration, invoice or publication.
Give users clear status when work is pending: received, processing, verified complete, rejected or under reconciliation. Do not tell them ‘nothing happened’ solely because one process exited. A truthful visible state reduces unnecessary manual retries and helps the human decide when to ask for support.
19. What to do with a partly generated article
An AI writing pipeline may generate an article in stages: research notes, a draft, an editor’s approval, a CMS submission and a published link. If shutdown happens after drafting but before approval, the successor should recover the exact approved state and not treat the existence of text as permission to publish. If shutdown follows CMS submission, the successor should check for the intended slug and post ID before creating anything new.
Keep draft fingerprints, title and slug ownership, editorial approval scope, and CMS receipt in durable state. These help prevent a second worker from racing to publish the same article while the first worker is draining. New research or a changed source can make a draft stale; the successor should revalidate high-risk facts rather than assuming saved text remains current indefinitely.
The Git Merge Safety and Context Compaction articles cover adjacent problems of version and instruction continuity. Graceful shutdown adds the operational question: which transitions were actually committed before the worker stopped?
20. When forceful termination is the safer choice
Graceful waiting is not always appropriate. A compromised process, a workload that is exfiltrating data, or a worker acting beyond revoked permission may need immediate isolation. The security owner may choose service interruption to prevent further harmful actions. A generic shutdown runbook should not insist on finishing all current tasks when continuing them would violate the user’s authorization or a safety boundary.
Likewise, an unresponsive program that cannot reach a safe checkpoint may need to be killed after a finite grace period so replacement capacity can recover. The resulting unknown side effects must be reconciled afterward. A forced kill can be operationally necessary without proving that all outstanding business actions were cancelled.
Document emergency stop authority separately from normal rolling-deployment behavior. A model must not extend its own permission to disable important services because it predicts a hypothetical threat. Follow approved incident procedures and make the remaining uncertainty visible to the responsible people.
21. Monitoring that distinguishes safe from unsafe shutdowns
Useful metrics include current accepting/draining state, admitted in-flight tasks, queue claims not yet acknowledged, durable checkpoints, unresolved external submissions, verified result receipts and age of pending handoffs. These describe work safety more directly than the total number of processes that exited with code zero. A worker can exit cleanly while leaving important submissions in an unknown state.
Watch for shutdown time exceeding the expected budget, repeated forced kills, rising queue redelivery, version conflicts from stale workers and a backlog of unreconciled publication requests. Such patterns can reveal a design problem that is invisible in ordinary success-rate charts. A run of successful deployments is not reassuring if every deployment leaves a few orphaned operations.
Alert messages should contain safe identifiers and the next investigation step. For example, ‘five publisher operation IDs remain unverified after worker generation 12 exited’ is better than ‘deployment problem’. Limit logs to the necessary technical evidence and protect student and family data. Avoid storing full documents or authentication tokens simply to make shutdown debugging more convenient.
22. A changed-context assignment-upload exercise
Imagine a fictional school accepts assignment files through an agent-assisted portal. An upload begins on worker A and reaches object storage, but A receives SIGTERM before it can confirm completion to the student. Worker B starts receiving new requests. The student’s browser retries because the initial response vanished.
A safe service ties both attempts to the same assignment submission ID and checks the object store’s authoritative version or checksum. If the upload already completed under the accepted identity, B returns the recorded result without creating a second conflicting submission. If a multipart upload is incomplete, it follows the provider’s documented resume or abort contract. It must not call a partially uploaded file a complete assignment.
Now suppose the student’s upload deadline has passed. The server still needs to distinguish a submission accepted before the deadline from a new unauthorized late submission. The worker’s shutdown time is not enough to decide. Use the authoritative recorded upload or submission state and the school’s stated policy. This is an example of how reliable process lifecycle management protects fairness, not just server uptime.
23. Ten questions that reveal an unsafe design
Can the service stop taking new work while keeping admitted work accountable? Does each task have a durable operation ID? Is its current source revision recorded? Can the successor identify whether the side effect committed? Does a queue acknowledgement follow the right durable boundary? Can an old worker write after losing its lease? Does the system know what to do when SIGKILL bypasses cleanup?
Does the shutdown grace include hooks and resource closure? Has the team tested the real container entrypoint? Are child processes accounted for? Can a worker restart without duplicating a public post? Can a security owner force-stop an unauthorized task? Are unresolved outcomes reported as unknown rather than converted to failures or successes? These questions should be answered with test evidence and documented provider contracts.
An AI agent can turn this checklist into a review worksheet, but checking boxes is not the same as establishing runtime behavior. Require an executable interruption test for important transitions and read back the final destination state. The workflow is reliable when it produces correct outcomes despite process loss, not merely when its shutdown handler looks thoughtful.
24. Short assessment and worked answers
Question one: Kubernetes reports a Pod terminating. Is every database transaction done? No. Question two: a worker received SIGTERM after sending a post-creation request, then died without a response. Should the next worker blindly create another post? No; reconcile the CMS state. Question three: can code reliably trap SIGKILL to finish cleanup? No. Question four: is a queue message acknowledged proof that an email was delivered? No.
Question five: a fictional 30-second grace spends five seconds in preStop and three in admission checks. Is thirty seconds still fully available to the application? No; remaining time is already reduced, with further time needed for cleanup. Question six: a replacement worker has a newer fencing generation than the old worker. Can the old worker safely write because it remembers having a lease? Not if the destination enforces the newer generation.
Advanced exercise: choose one consequential operation—publish a parent update, accept a school submission or generate an invoice—and name the exact acknowledgment that proves completion. Then inject a crash at every boundary. A useful design can distinguish work never attempted, submitted with unknown result, verified successful, explicitly rejected and safely rescheduled. If all outcomes collapse to one Boolean, redesign the ledger before increasing automation.
25. Frequently asked questions
What is graceful shutdown? It is a bounded process of stopping new work, accounting for active work, preserving recoverable state and exiting under a supervisor’s termination rules.
Is SIGTERM guaranteed to arrive? No. Some failures and forceful terminations bypass handlers. Recovery must tolerate abrupt disappearance.
Does Kubernetes always provide thirty seconds? Thirty seconds is the documented default for normal Pod termination, but configuration and circumstances can differ; hooks consume the shared grace budget.
What should happen to long-running jobs? Follow a durable checkpoint and safe handoff or reconciliation procedure rather than relying on the retiring process to stay alive indefinitely.
Can SIGKILL be handled by my application? No. A normal user-space process cannot catch or defer it for cleanup.
Why do queues redeliver during deployment? Ownership or acknowledgement may be uncertain when a worker exits. Design handlers and side effects to tolerate valid redelivery under the queue’s contract.
Does a zero exit code prove publication succeeded? No. Verify the destination record and status, not just the process result.
Is shutdown the same as permanent service retirement? No. Shutdown may be routine and temporary. Retirement additionally includes decommissioning tools, permissions, data and operational ownership under a different plan.
26. Sources and next chapters
Read the official Kubernetes Pod Lifecycle documentation for normal termination, preStop hooks, grace periods, endpoint behavior and forced termination. Consult Node.js process signal documentation and Python asyncio task cancellation documentation for runtime-specific handler behavior. Different versions and operating systems have details that must be checked in the deployed environment.
Continue through eduKateSG’s Long-Running Operations, Dead-Letter Queues, and Service Retirement articles. The series hub is How Super Intelligence Works.
The lasting principle is that a worker may stop but the consequences it initiated can continue. Safe shutdown means preserving enough authority, identity, version and outcome evidence that the next worker can finish only what still needs and is permitted to be done. Verified outcomes—not graceful-sounding logs—are the standard.