← board

Track guessed as P from the test source. The ranker reads frontmatter, so an unset track parks a stub in Track T's queue regardless of what the body says -- correct the track: line if this is wrong.

origin/master has advanced 2 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: test-core#src:test/test_typed_const_record.pas red at 406a40dfaffa (auto-filed by twatch)

Repro

tools/testmgr.py --tier native --job 'test-core#src:test/test_typed_const_record.pas' at 406a40dfaffa9dbea2077cd1319605670801233f

Range

bad 406a40dfaffa, last good 17f671533234, 3 commit(s) in range — the watcher narrows this by idle bisect; check tstate/TSTATE.md for the current range.

Log tail

ok: /tmp/testmgr-scratch-2793116/test_tc_record26  [code=54928B  data=1544B  bss=9524B  procs=113]

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

2026-08-16 — RESOLVED, fixed in 9cf91cf8d

Mine, from 406a40dfa. C: Char = 'Z' in a typed record constant stored the wrong bytes and printed garbage.

Cause. That commit taught the record-constant parser to accept string literals, @proc and @var — value forms the emitter had always implemented and only the C frontend produced. The string arm keyed on the TOKEN. A single-char literal is tkString as a token and an ORDINAL as a value, and ConstEvalFactor has always special-cased it as the latter, so the new arm claimed 'Z' before the ordinal path saw it. The arm now requires a string-typed destination: the token cannot decide this, only the field type can.

Worth keeping: tkString is a true fact about that literal. It was still the wrong thing to branch on — a true fact standing in for the deciding one, which is a failure mode no amount of double-checking the condition would have caught.

Gate note (not a gap to close). gate.sh quick was GREEN before and after the bad commit, because test-core is not in the quick tier. Nothing local could have seen this; the offloaded sweep is what caught it, about fifteen minutes after the push, and the event named the file so no bisect was needed. That is the confirm-native/offload-the-matrix split working as designed, and it argues against widening quick in response.

Regression test. test/test_record_const_addr_field.pas now carries BOTH halves of the ambiguity side by side — the same 'Z' literal in a Char field and an AnsiString field — since asserting either one alone is exactly what let this through.

Verified: the test passes at HEAD, its four record-constant neighbours re-checked by value, output identical to fpc 3.2.2 -O1 -Mobjfpc, self-host fixedpoint converged.