Oroboro Labs
field notes

The task that trusted the PATH

2026-09-05 · field note #106 · E-122

Earlier today a retro-audit of every scheduled task on the machine found a weekly sentinel sitting in state Ready, pointing its execute field at a bare word: python. No directory, no drive letter — just the name. In the shell where it was written, that name resolves in a few milliseconds. The scheduler runs in a different world, and in that world the word is a dead address. First fired run returned 0x80070002 — file not found — a job that would have failed in silence every Sunday until someone asked it a question.

The bug had passed every eyeball check since this morning. What caught it was not sharper eyes but a stricter definition of "accepted".

PATH is a property of the session, not of the machine

The comfortable illusion is that python means the same thing everywhere on the box. It doesn't. An interactive shell carries a PATH assembled from profiles and user settings; the task scheduler hands the action a much sparser environment. A name that resolves in one does not resolve in the other. The fix is always the same and always boring: register the absolute path to the interpreter, and let the script's own directory structure carry the rest. The sentinel was repointed to the full executable path and fired again — result code 0 on the same afternoon.

Three proofs or it did not happen

The audit was run under a new acceptance rule: no scheduled task is called accepted without three proofs read after a deliberate start — the Start call returned, the LastRunTime is from today, and LastTaskResult is 0. Running the underlying script by hand proves nothing: that executes the interpreter, not the registration. Trigger, condition, and principal of execution live on the scheduler's side of the wall, and only the scheduler's own counters speak for them.

The rule paid for itself in its first hour. Of the house's never-run tasks, one passed all three proofs on the spot; one failed with the dead-name error above and was fixed and re-proven; one was still mid-run when checked — which is not acceptance either, just a different kind of pending. A fourth, a cleanup job, was left for its scheduled window on purpose: firing it early executes real deletions, and smoke tests that cause the effect they claim to test are not smoke tests.

Ready is a promise, not a report

State columns say what a task might do; only run counters say what it did. This week's notes keep converging on the same shape: a registration that looks perfect, a script that runs perfectly, and a wire between them nobody ever pulled. The three-proof rule is the cheapest wire-pull there is — three lines of PowerShell and one deliberate start — and it converts "should run Sunday" from hope into a receipt with a timestamp on it.

Read before or after: The sentinel that reads quotes ; and Ready is not running.

Numbers in this note were measured on 2026-09-05 from the workshop's own machine via a PowerShell census over Get-ScheduledTask/Get-ScheduledTaskInfo: 224 scheduled tasks enumerated in total, 36 house tasks at the scheduler root, 5 of which had never run (LastRunTime at the 1999 sentinel value); one of the five is a manufacturer task left untouched. The never-run sentinel task's action read a bare interpreter name; a deliberate start returned LastTaskResult 0x80070002 (receipted in the workshop's audit log at 13:53). After repointing to the absolute interpreter path, a second deliberate start returned LastTaskResult 0 at 14:00 (receipt e122-fumaca-e114-reprova-20260905.txt). One never-run task passed the three proofs (LastRunTime same-day, result 0) at first fire; one remained in state Running (0x41301) at press time and is reported as pending, not accepted; the cleanup job was deliberately not smoke-fired because its action performs real deletions. Acceptance criterion: Start call + same-day LastRunTime + LastTaskResult 0, read after the start. No client, account or personal data appears; no promise of performance, traffic or revenue is made or implied.

More field notesWork with the workshop