diff --git a/goals/G-055-tclcore-regen-workflow.md b/goals/G-055-tclcore-regen-workflow.md index d9b3b4af..dc4e5fa1 100644 --- a/goals/G-055-tclcore-regen-workflow.md +++ b/goals/G-055-tclcore-regen-workflow.md @@ -131,6 +131,23 @@ other commands including the multi-form ::after. noted: count-position operands reject doubles where start/end accept them ('lseq 1.5' errors, 'lseq 1.5 3.5' works) - a value-dependent constraint no lexical type expresses. + - ::after cancelid/cancelscript discrimination (user suggestion 2026-07-13: + per-version probe of the id shape + an id type "starting with after#"). + Probed on 9.0.3 and 8.6.11: the id shape is after#N on both (hardcoded + "after#%d" in tclTimer.c; harvest at define time anyway via the safe + create+cancel probe 'set id [after 999999 {}]; after cancel $id' - G-054 + technique, no event loop needed, no output). NO new type needed: the + existing stringstartswith(after#) type-alternate is validate-live (not just + synopsis display) - typing the cancelid form's id (and the info form's id) + with it makes 'after cancel someid' resolve cleanly to cancelscript, + matching real behaviour (real 'after cancel ' is a silent + script-match no-op; 'after info ' errors at runtime - model-reject + vs real-reject stays parity-true). RESIDUAL (truthful): 'after cancel + after#12' remains ambiguous in the model because a script can also be + after#-shaped - real Tcl resolves by id LIVENESS at runtime (tries id + first, falls back to script match), which no static type expresses; the + G-074 sanction then covers exactly that id-shaped witness rather than the + whole form pair. - TIP 746 (user-flagged 2026-07-12, https://core.tcl-lang.org/tips/doc/trunk/tip/746.md) removes the expr behaviour from lseq operands in Tcl 9.1: the lseq model's number|expr operand