Fix: fix-1b4c53acf2f4c38be2da.
What the agent did
Build the orange3-nnviewer wheel with uv build, install it into the Orange Python 3.12 venv, and open the NN Viewer widget standalone (python -m orangecontrib.nnviewer.widgets.ow_nn_viewer) with trained housing MLP model.
cd <guest-path> && ls -la && id -u && cat README.md && git status 2>&1 | head -3; python3 --version; echo CDP=$CDP_URL $<env-var>
cd <guest-path> && cat pyproject.toml; ls tests orangecontrib orangecontrib/* .coldpass; cat tests/*.py | head -80; which uv pip3 node npm; python3 -m venv --help >/dev/null && echo venv_ok; dpkg -l | grep -i -E "libgl|xcb" | head -3
cd <guest-path> && git init -q && git remote add origin https://github.com/tcorbettclark/orange3-nnviewer && git fetch --depth 1 origin f3363285b6694b6d4949d915b8b52d06409a7c45 2>&1 | tail -2 && git reset --mixed FETCH_HEAD 2>&1 && git log --oneline -1 && git status --short | head; cd /tmp && uv venv -p 3.12 <guest-path> 2>&1 | tail -2 && uv pip install --python <guest-path> -e <guest-path> 2>&1 | tail -5
cd <guest-path> && uv pip install --python <guest-path> pytest 2>&1 | tail -1; QT_QPA_PLATFORM=offscreen timeout 600 <guest-path> -m pytest -q 2>&1 | tail -8
cd <guest-path> && uv pip install --python <guest-path> PyQt6 2>&1 | tail -1; QT_QPA_PLATFORM=offscreen timeout 900 <guest-path> -m pytest -q 2>&1 | tail -8
sudo -n apt-get -o DPkg::Lock::Timeout=300 update -qq 2>&1 | tail -2; sudo -n apt-get -o DPkg::Lock::Timeout=300 install -y -qq libgl1 libegl1 libxkbcommon0 libdbus-1-3 libfontconfig1 2>&1 | tail -3; cd <guest-path> && QT_QPA_PLATFORM=offscreen timeout 900 <guest-path> -m pytest -q 2>&1 | tail -8
cd <guest-path> && QT_QPA_PLATFORM=offscreen timeout 900 <guest-path> -m pytest -q tests/test_render.py::test_boxes_render_white_over_lines 2>&1 | grep -v Warning | head -60
cd <guest-path> && grep -n "__main__" -A25 orangecontrib/nnviewer/widgets/ow_nn_viewer.py | head -50; grep -n "def \|print" orangecontrib/nnviewer/widgets/ow_nn_viewer.py | head -60
cd <guest-path> && cat .gitignore; QT_QPA_PLATFORM=offscreen timeout 25 <guest-path> -m orangecontrib.nnviewer.widgets.ow_nn_viewer > <guest-path> 2>&1; echo rc=$?; head -c 800 <guest-path>; echo; timeout 300 uv build 2>&1 | tail -4; ls dist
cd <guest-path> && uv pip install --python <guest-path> --no-deps --reinstall dist/orange3_nnviewer-0.1.0-py3-none-any.whl 2>&1 | tail -2; <guest-path> -c "import importlib.metadata as m;print(m.version('orange3-nnviewer'))" ; timeout 300 uv build ><guest-path> 2><guest-path>; echo rc=$?; echo OUT:; cat <guest-path>; echo ERR:; grep Successfully <guest-path>
cd <guest-path> && mkdir -p .coldpass && PY=<guest-path> && cat > .coldpass/probe.json <<EOF
{"kind":"cli","argv":["$PY","-m","orangecontrib.nnviewer.widgets.ow_nn_viewer"],"cwd":"<guest-path>","stays_running":true,"env":{"QT_QPA_PLATFORM":"offscreen"},"expected_text":"propagateSizeHints"}
EOF
cat > .coldpass/claims.json <<EOF
[
{"kind":"claim","claim":"The add-on builds a wheel with uv build","source":"Build a wheel (a single self-contained plugin file):","input":"uv build","expected":"Successfully built dist/orange3_nnviewer-0.1.0-py3-none-any.whl","probe_kind":"cli","argv":["uv","build"],"cwd":"<guest-path>","expected_text":"Successfully built dist/orange3_nnviewer-0.1.0-py3-none-any.whl"},
{"kind":"claim","claim":"Running the module trains an MLP on housing and opens the widget alone","source":"Trains an MLP on the bundled housing dataset and opens the widget alone:","input":"python -m orangecontrib.nnviewer.widgets.ow_nn_viewer","expected":"widget window loads offscreen","probe_kind":"cli","argv":["$PY","-m","orangecontrib.nnviewer.widgets.ow_nn_viewer"],"stays_running":true,"stdin":"","env":{"QT_QPA_PLATFORM":"offscreen"},"cwd":"<guest-path>","expected_text":"propagateSizeHints"}
]
EOF
cat > .coldpass/examples.json <<EOF
[
{"kind":"example","claim":"Unit tests run with the Python that runs Orange (Qt renders offscreen)","source":"README.md ## Tests","input":"python -m pytest -q","expected":"all tests pass; one render test currently fails in this VM","argv":["$PY","-m","pytest","-q"],"cwd":"<guest-path>","env":{"QT_QPA_PLATFORM":"offscreen"},"expected_text":"1 failed, 13 passed"}
]
EOF
cat > .coldpass/cycles.json <<'EOF'
{"detected":false,"reason":"Entry points inspected (ow_nn_viewer.py __main__ block, orangecontrib/nnviewer/__init__.py, pyproject.toml, README). The widget is a one-shot Orange Canvas widget driven by user interaction; there is no scheduler, cron, loop, webhook, or --once/--now flag in the product.","checks":[]}
EOF
<env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | tail -40
cd <guest-path> && QT_QPA_PLATFORM=offscreen <guest-path> -m pytest -q tests/test_tooltip.py tests/test_hover.py 2>&1 | tail -1; QT_QPA_PLATFORM=offscreen <guest-path> -m pytest -q tests/test_render.py 2>&1 | tail -1
cd <guest-path> && PY=<guest-path> && cat > .coldpass/claims.json <<EOF
[
{"kind":"claim","claim":"The add-on builds a wheel with uv build","source":"Build a wheel (a single self-contained plugin file):","input":"uv build","expected":"Successfully built dist/orange3_nnviewer-0.1.0-py3-none-any.whl","probe_kind":"cli","argv":["uv","build"],"cwd":"<guest-path>","expected_text":"Successfully built dist/orange3_nnviewer-0.1.0-py3-none-any.whl"}
]
EOF
cat > .coldpass/examples.json <<EOF
[
{"kind":"example","claim":"Documented full test suite","source":"README.md","reason":"README '## Tests' command 'python -m pytest -q' was run in the VM with QT_QPA_PLATFORM=offscreen: 13 passed, 1 failed. The failure is tests/test_render.py::test_boxes_render_white_over_lines (box pixel #fceded is not white, a red edge shows through a label box). Not a harness issue; README documents no nonzero result, so the failing full run is not replayed as an example."},
{"kind":"example","claim":"Hover and tooltip tests run with the Python that runs Orange","source":"README.md ## Tests","input":"python -m pytest -q tests/test_tooltip.py tests/test_hover.py","expected":"4 passed","argv":["$PY","-m","pytest","-q","tests/test_tooltip.py","tests/test_hover.py"],"cwd":"<guest-path>","env":{"QT_QPA_PLATFORM":"offscreen"},"expected_text":"4 passed"}
]
EOF
<env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | head -c 3000
cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | python3 -c "import sys,json;d=json.loads(sys.stdin.read());print(d['valid'],d['problems'],d['replay']['status'],d['replay']['details'].get('working'),d['replay']['details'].get('evidence_strength'));[print(e['verdict'],e['outcome'][:150]) for e in d['replay']['details'].get('example_checks',[])]"
cd <guest-path> && cat > .coldpass/report.json <<'EOF'
{
"outcome": "working",
"fault_owner": "repo",
"operation": "Build the orange3-nnviewer wheel with uv build, install it into the Orange Python 3.12 venv, and open the NN Viewer widget standalone (python -m orangecontrib.nnviewer.widgets.ow_nn_viewer) with trained housing MLP model.",
"operation_scope": "Linux guest (Ubuntu, non-root with sudo), Python 3.12.3, uv, Orange3 installed from the package dependencies, PyQt6 added, offscreen Qt. Pinned commit f3363285b6694b6d4949d915b8b52d06409a7c45. Canvas (python -m Orange.canvas) not exercised because it is a GUI with no CLI readback.",
"steps": [
"git init; git remote add origin https://github.com/tcorbettclark/orange3-nnviewer; git fetch --depth 1 origin f3363285b6694b6d4949d915b8b52d06409a7c45; git reset --mixed FETCH_HEAD",
"uv venv -p 3.12 <guest-path>",
"uv pip install --python <guest-path> -e <guest-path>",
"uv build",
"uv pip install --python <guest-path> --no-deps dist/orange3_nnviewer-0.1.0-py3-none-any.whl",
"python -m orangecontrib.nnviewer.widgets.ow_nn_viewer (QT_QPA_PLATFORM=offscreen)",
"python -m pytest -q (README ## Tests)"
],
"deviations": [
"The workspace was not a git repo; ran git init and the pinned fetch/reset from the task.",
"README tests failed on import: no Qt binding. Installed PyQt6 with uv pip install --python <guest-path> PyQt6 (test comments say PyQt6).",
"PyQt6 import then failed: libGL.so.1 missing. Ran sudo -n apt-get -o DPkg::Lock::Timeout=300 update and install -y libgl1 libegl1 libxkbcommon0 libdbus-1-3 libfontconfig1.",
"python -m pytest -q: 13 passed, 1 failed. Failing test tests/test_render.py::test_boxes_render_white_over_lines: box pixel #fceded is not white, so a red edge shows through a label box. This is an assertion in the repo, not a harness error. Not edited (no source edits allowed). Because the README documents no nonzero result, this full run is recorded as a reason-based example, not a replayed nonzero example.",
"Claim with stays_running for the widget timed out at the 120 s claim window; moved the widget check into probe.json (stays_running) and kept the uv build README claim as the replayed claim.",
"Widget stays open, so it is kind cli with stays_running; expected_text 'propagateSizeHints' is the plugin load message on stderr.",
"Used the wheel install (README) which replaced the earlier editable install in the same venv; the version reports 0.1.0 from the wheel.",
"No product cycle: the widget is one-shot and interactive, so cycles.json has detected false."
],
"stuck_step": null,
"main_blocker": null,
"plain_failure": null,
"suggested_fix": "Fix the failing render test in the repo: test_boxes_render_white_over_lines expects label boxes to mask edge lines, but a red line shows through in this environment. Either the label box background is not drawn over the lines in the scene z-order, or the test threshold/rendering is font- or Qt-version dependent. Also add PyQt6 and libGL to the README's install steps, since the tests cannot import without them."
}
EOF
python3 -c "import json;json.load(open('<guest-path>'));print('ok')"; <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | head -c 200