← board

Track guessed as B from the FAILING STEP — line 1 of 2, stable_linux_amd64/default/pinned --mimic-fpc -Fuexternal/synapse -Fulib/rtl -Fulib/rtl/platform/posix test/lib_synapse., which names test/lib_synapse.pas. Not from the job's name or its src: those describe what the job is ABOUT, and this job's recipe spans 2 source file(s). The ranker reads frontmatter, so this line — not the body — decides who works it; correct it if the guess is wrong.

This commit CANNOT be the cause. The job builds only with $(PXX_STABLE), and this commit moved no stable_linux_amd64/** — so the bytes that compiled it are unchanged. Look at flakiness or box load, not at the named sha; the bisect is unsound here and has been skipped.

origin/master has advanced 7 commit(s) since this sha. Re-verify at current HEAD before acting — the callback is tagged to the sha that was tested, which may no longer be the state of the tree.

regression: lib-test#src:test/lib_synapse.pas at fca28056d8ec in step 1/2, stable_linux_amd64/default/pinned --mimic-fpc -Fuexternal/synapse -Fulib/rtl -Fulib/rtl/platform/posix test/lib_synapse… (auto-filed by twatch)

Repro

tools/testmgr.py --tier full --job 'lib-test#src:test/lib_synapse.pas' at fca28056d8ec2483d3a9a1b0f064842164f92b46

Range

The named sha fca28056d8ec CANNOT be the cause — it touches no buildable file (docs / tickets / tstate only). It is the sha that was TESTED, i.e. the upper bound of an untested range; the cause is somewhere below it.

bad fca28056d8ec, last good 0e3ba86d5208, 4 observable commit(s) in range (it builds with $(PXX_STABLE), so compiler/ commits cannot have caused it and are dropped; pin moves, lib/ and test/ are kept) — the watcher narrows this by idle bisect.

Log tail

pascal26:2039: error: undefined variable (SetString)
pascal26:2077: error: undefined variable (SetString)
pascal26:2178: error: undefined variable (SetString)
(tail)
pascal26:2039: error: undefined variable (SetString)
  in: external/synapse/synautil.pas
  near: ( var APtr : PANSIChar ; >>> AEtx : PANSIChar 
pascal26:2077: error: undefined variable (SetString)
  in: external/synapse/synautil.pas
  near: do begin SearchForLineBreak ( APtr , >>> AEtx , bol 
pascal26:2178: error: undefined variable (SetString)
  in: external/synapse/synautil.pas
  near: <= AEtx ) and ( SynaFpc >>> . strlcomp ( 

Stub ticket: signal only. Track T agent (face 2) enriches or a dev track takes it from the repro line.

2026-09-11 (frankS) — real, mine, fixed at 8887170da

CAUSE. 0ffe185bb moved six System names out of lib/rtl/sysutils.pas into compiler/builtin/builtin.pas. This job builds with $(PXX_STABLE) — the PINNED compiler plus a FROZEN copy of compiler/builtin/ that predates the move — so the name is gone from the only two places such a build can look. For lib_synapse the names are SetString, in external/synapse/synautil.pas.

FIX. All six restored in lib/rtl/sysutils.pas as a deliberate duplicate of builtin's copies, with a retirement test written on the sLineBreak note (grep the name in stable_linux_amd64/default/builtin/builtin.pas; delete the sysutils copy when it is there). Verified positive-control first, in place: revert sysutils.pas to origin/master and this job's own recipe reproduces the error in the log tail above; apply the fix and it prints its eight expected rows (b64=SGVsbG8sIFdvcmxkIQ== through cli-got=pong).

THE BANNER AT THE TOP OF THIS TICKET SAID THE OPPOSITE, AND IT IS WORTH A SENTENCE. "This commit CANNOT be the cause ... Look at flakiness or box load" is TRUE about the named sha fca28056d8ec (a tstate publish, docs only) and WRONG as advice, because this job reads live lib/** and the untested range below the named sha held four observable commits — one of which is the cause. The ticket's own Range section said so correctly thirty lines further down ("the cause is somewhere below it", "4 observable commit(s)"), so the ticket contradicted itself and the contradiction was in the half a reader sees first. Reworded in tools/twatch.py at HEAD to stop at the exculpation and hand the residual question to the Range section, which already carries the range_non_causal case for when the answer genuinely is the box.