docs(scripting): T starts at the run's start but is wall clock from there; document the late-notice, ceiling and counter rules (#827 review F4)

The proto comment, VirtualTags.md and CLAUDE.md said the soft deadline
measures the script's own execution and that starvation never counts. Only
the time before the run STARTS is excluded; from the start it is wall-clock
time, as in process, so a GC pause or a starved / suspended worker during
the run still counts. A mid-run freeze test is not added: it races the
script's own return against the watchdog's notice; documented as not covered.
Also documents F2 (late notice cancels and counts), F3 (progress ceiling,
killed_unresponsive) and F5 (answer = stalled | retrigger).
This commit is contained in:
Joseph Doherty
2026-11-11 02:26:28 -05:00
parent f50209082e
commit 5962cc3d41
5 changed files with 40 additions and 26 deletions
@@ -204,8 +204,9 @@ internal sealed class WorkerConnection : IAsyncDisposable
/// <summary>
/// lmxopcua#827: the worker runs each evaluation's soft clock from the moment an evaluation thread starts it and
/// reports the crossing, so the soft deadline measures the script's own execution — not the pipe, not the time
/// a starved worker takes to be scheduled. The host keeps a transport deadline of its own instead (see
/// reports the crossing, so the soft deadline no longer counts the pipe or the time a starved worker takes to
/// START the run. From the start it is wall-clock time, as in process: a pause during the run still counts. The
/// host keeps a transport deadline of its own instead (see
/// <see cref="PendingEval"/>). Negotiated: asked for in <c>Hello</c>, true only when the worker echoed it in
/// <c>Ready</c>; otherwise the host's clock, started at submit, is the soft deadline (the pre-#827 contract).
/// </summary>