← board

origin/master has advanced 3 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:examples/tk/tkinter_facade.npy red at f8b8a7eb5ed2 (auto-filed by twatch)

Repro

tools/testmgr.py --tier native --job 'test-core#src:examples/tk/tkinter_facade.npy' at f8b8a7eb5ed266fce811c26e44fbe82d1a56faf3

Range

bad f8b8a7eb5ed2, last good 6bff7ae1b4de, 4 commit(s) in range — the watcher narrows this by idle bisect; check tstate/TSTATE.md for the current range.

Log tail

pascal26:8: error: undefined variable (Tk_)
(tail)
pascal26:8: error: undefined variable (Tk_)
  near:  StringVar  root  Tk_ >>>    

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

TRIAGED AND FIXED 2026-08-16 — both were mine, both from the same commit pair

undefined variable (Tk_) was the qualified-only import rule (e94b8cda3) applied too widely. examples/tk/hello.npy, widgets.npy and tkinter_facade.npy all write import tk (or import tkinter as tk) and then call a bare TkInit() / Tk_() — code CPython would reject with a NameError, and NilPy accepting what CPython rejects is a documented FEATURE of this dialect, not a defect. Hiding every routine of an imported unit made that laxness a hard error.

The rule is now narrowed to the AMBUSH alone: a qualified-only unit's routine is dropped only when the Python side (pylib/pyeval, or a compiler-minted proc) declares the same name. abs/min/max/round are exactly that set; TkInit, Tk_ and Trim collide with nothing and still resolve. All ten examples/tk/*.npy compile again, and the abs/min/max oracles stay green. Pinned by a new section of test/test_nilpy_import_does_not_publish_names.npy.