Skip to content

test: trial of the 8-share lifecycle-model job on #324 (do not merge) - #329

Closed
ThomasK33 wants to merge 31 commits into
mainfrom
tmp/trial-324-328
Closed

ThomasK33 wants to merge 31 commits into
mainfrom
tmp/trial-324-328

Conversation

@ThomasK33

Copy link
Copy Markdown
Member

Trial only, do not merge: it measures the 8-share lifecycle-model job of #328 on the model of #324 (600068767c merged with a3e6590f). I will close it after CI reports the share times.


Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: xhigh

A marker that appears while the creator runs stops a serving host. One
that appears after the creator has exited does not: the watch has
stopped. Each case fails without the code that it covers.
…t serving

The new give-up case fails its first marker write with EIO. create then
sees no program in the manifest, sends nothing, and the host that starts
late finds no marker and serves. The unit cases ask create to retry the
write, to stop the host once the manifest names the program, and to stop
retrying after 50 writes or once the host has exited.
… the program record lands

A create that gives up on Windows sends no SIGTERM while the manifest
names no program, so only the marker can stop a host that starts late.
When the marker write fails, create now writes it again every 100 ms,
up to 50 times, and reads the manifest after each write. It stops when
the marker lands, stops the host once the manifest names the program,
and stops retrying once the host has exited.

The unit case for the stop now finds the program by the number of
marker writes, because the readiness loop also reads the manifest.
On Windows the marker write in CreateGivesUp can now fail. With the new
guard CreateRetriesMarker, which facts.mjs reads from the give-up catch,
CreateStopsHostOnWindows goes on to "retry", and CreateRewritesMarker
writes and reads again until the marker lands, the read names the
program, or the host is gone. A create whose last write failed ends as
"exhausted", which R17 does not cover. New runs: the win32 mutant breaks
R17, and a win32 witness reaches the retry. Docs: SKILL.md, USAGE and
the commands README.
With the host's watch, a marker that always landed off Windows made the
SIGTERM redundant, so mutant-CreateStopsOnGiveUp passed. The write can
fail on any platform, and off Windows the SIGTERM is then what stops the
host: the mutant breaks R17 again.
The host resolves its Home to the real path and derives the socket path
from it. On macOS tmpdir() is a symlink, so the tests looked for the
socket at another path, and the two cases that need a serving host
failed there. A TMPDIR that is a symlink reproduces it on Linux.
When a process of another user takes the creator's pid, the liveness
probe of the marker watch throws EPERM inside its timer. In the host
that is an uncaught exception, and here vitest reports it as unhandled
errors, so the run fails.
The marker watch probes the creator's pid inside its timer. A process of
another user that took that pid answers EPERM, isProcessAlive throws it,
and the uncaught error ended the host. The watch now counts any probe
error as an exited creator, checks for the marker once more and stops.
facts.mjs reads the new watch, and the docs say how it treats the error.
On Windows, a process of another user that took the host's pid makes
isProcessAlive throw EPERM in the marker retries. The error then left
the catch, and create reported it as INTERNAL_ERROR without the
session id.
…ker retries

A process of another user that took the host's pid makes isProcessAlive
throw EPERM. In the retry loop that error left the give-up catch, so
create reported INTERNAL_ERROR without the session id. The new hostRuns
counts any probe error as an exited host, and facts.mjs reads it.
The two cases where the watch must not stop the host waited 300 ms and
500 ms. They now spy on the timers, wait until clearInterval runs on the
host's 100 ms watch, write the marker and check at once that the host
still serves: a stopped watch never checks again. With a watch that
never stops, or a probe error that leaves the timer, they fail.
# Conflicts:
#	.agents/skills/verify-session-lifecycle/SKILL.md
#	.agents/skills/verify-session-lifecycle/coverage.json
#	.agents/skills/verify-session-lifecycle/scripts/check.sh
# Conflicts:
#	.agents/skills/verify-session-lifecycle/SKILL.md
#	.agents/skills/verify-session-lifecycle/coverage.json
#	.agents/skills/verify-session-lifecycle/scripts/check.sh
…ir comment

recordDestroyed writes it for a terminal manifest too, where destroy
stops no host, so the host can still be in its shutdown tail. It is
ending either way, so the repair needs no liveness check.
… zombie creator

A creator that writes the marker and exits between the watch's probe and
its check must still stop the host: with the check before the probe, the
watch stops without the marker. A zombie creator has exited, but
kill(pid, 0) still finds it, so the watch ticks for as long as its
parent does not reap it. The zombie case fails on the head.
kill(pid, 0) finds a zombie until its parent reaps it, so the watch
ticked at 10 Hz for as long as a parent that never waits lived. The
watch now also counts a creator that readProcStat shows as Z as exited.
facts.mjs reads the new probe, and the docs name it.
The model of #324 has about twice the states of main's. On its head the
four shares took 38, 40, 46 and 48 min of the 50 min timeout, and a share
cannot be shorter than its longest run.
…runs at once

A timeout raise alone leaves #324's 48 min share at the merge queue's
60 min limit. check.sh waits for each batch of CHECK_JOBS runs, so a
share took the sum of its longest runs. With 8 shares and CHECK_JOBS 12,
every share starts all its runs at once and takes about as long as its
longest run. The job timeout goes to 45 min.
@ThomasK33

Copy link
Copy Markdown
Member Author

Trial done: the 8 shares took 15 to 43 min on the model of #324. The numbers are in #328.

@ThomasK33 ThomasK33 closed this Nov 4, 2026
@ThomasK33
ThomasK33 deleted the tmp/trial-324-328 branch November 4, 2026 14:29
ThomasK33 added a commit that referenced this pull request Nov 4, 2026
On #330, where the runs that expect pass get the 4 vCPUs as TLC workers,
the 8 shares took 11 to 33 min. With 1 worker per run they took 15 to
43 min (#329).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant