Quarterly cold-eyes review, 2026-09-03 (#25, standards S1/S4/S6). Read-only inspection by a repo-inspector agent from a fresh clone in a scratch directory; every claim below carries the command or URL that produced it. Filed by Arthur. Nothing here was changed by the review itself.
S6 — the org front door walked as a stranger: portal, GitHub org page, and the three Tier-2 landing pages (palettes, pdwidgets, pygraphics), every link curled. The generated pages come from data/repos_db.json and assets/chrome/site-chrome.js; per the org README, fix the data and regenerate, not the output.
Findings (7)
[MEDIUM] Portal pygraphics page's only code example fails with ImportError on the pure-Python package it tells you to install
https://pydevices.github.io/pygraphics/ 'API Code Example' line 1: from pygraphics import Area, FrameBuffer, RGB565, framebuf_backend with the comment '# Verify active backend (native C usermod or pure-Python fallback)'. Ran it verbatim against lib/pygraphics from the v-main tarball (PYTHONPATH=.../pygraphics/lib, cwd=/tmp): ImportError: cannot import name 'framebuf_backend' from 'pygraphics'. lib/pygraphics/init.py exports implementation() only; its PEP-562 __getattr__ lazy table (lines 74-82) has no framebuf_backend; the name exists only in the C module (src/gfx_bindings_mp.c:2012, src/gfx_module_cpy.c:1270). So the example fails in exactly the 'pure-Python fallback' case it claims to detect, i.e. after the MIP install the sibling pages recommend. The rest of the example is correct: with implementation() substituted it prints pygraphics_python and Area(34, 34, 60, 60), matching the page's comment. README's own quick start uses pygraphics.implementation() and works.
Suggested fix: Change the portal example (dotgithub repos_db.json / generated page) to print(pygraphics.implementation()), or add a framebuf_backend() that returns a Python-side value to lib/pygraphics/init.py so the documented call exists on both builds.
[MEDIUM] pdwidgets and pygraphics READMEs say 'TestPyPI only ... deliberate' but real PyPI carries released versions
README.md (main) pdwidgets 'Support and platforms': 'Publication to TestPyPI only (rather than PyPI) is deliberate.' pygraphics 'Support and platforms': 'Native wheels are published to TestPyPI only (pydevices-pygraphics); this is also deliberate, not a placeholder'. Yet: curl https://pypi.org/pypi/pydevices-pdwidgets/json -> 200, version 0.0.22, 2 files; https://pypi.org/pypi/pydevices-pygraphics/json -> 200, version 0.0.37, 16 files (full wheel set); https://pypi.org/pypi/pydevices-palettes/json -> 200, version 0.0.12. Each is exactly one version behind TestPyPI (0.0.23 / 0.0.38 / 0.0.13, matching the latest GitHub release tags of 2026-08-29) and carries the full README as its description, so a stranger sees a real project, not a park. Plain pip install pydevices-pygraphics (no -i) therefore succeeds and installs 0.0.37, contradicting the README text.
Suggested fix: Rewrite the two 'TestPyPI only' sentences to describe the actual state (PyPI mirrors lag one release, or PyPI is the parked/mirror channel), and decide whether the PyPI copies should be brought up to the current tags so the two indexes stop disagreeing.
[MEDIUM] Portal cards for pygraphics and palettes advertise features the repos do not contain (anti-aliased fonts; HSL; gradient generators)
Card text (identical on https://pydevices.github.io/ front page, the per-repo page , and the org profile README Tier 2, all generated from dotgithub data/repos_db.json). pygraphics: 'Pure-Python 2D graphics library with drawing primitives, anti-aliased font rendering, paletted surface blitting, and area-dirtying pipelines.' -> grep -rniE 'anti.?alias' pygraphics/ over lib/, src/, docs/, README of the main tarball returns nothing; the font engine is 8x8/8x14/8x16 bitmap fonts (README 'Multi-Font Engine'). The card also says 'Pure-Python' while the README's first line is 'Native and pure-Python pygraphics' and the TestPyPI product is a native C extension. palettes: 'Color management library with RGB565 / RGB888 conversion, HSL / HSV color spaces, palette swatches, and smooth gradient generators.' -> public API is __all__ = ['WIN16','get_palette','Palette','MappedPalette']; grep -rniE '\bhsl\b' palettes/ hits only docs/index.md:177 ('Color Math & Formats — ... HSL/HSV math'), and docs/color-math.md itself has only '## 3. HSV to RGB Interpolation'; no gradient function/class exists ([n for n in dir(palettes) if 'grad' in n.lower()] -> []). The sidebar nav (site-chrome.js:161) repeats 'Color quantization, HSL & RGB565 format conversion' (no quantize API either). Verified as delivered and NOT findings: pdwidgets card items (button.py, slider.py, progress_bar.py, label.py, add_event_cb); pygraphics palette blit (blit(..., palette=)) and Area returns; palettes RGB565/RGB888 (color_depth 16/24), HSV wheel, and every code line on the palettes portal page (palette.RED, RED_S900, default-palette RED/BLUE/GREEN/CYAN) runs.
Suggested fix: Edit the three descriptions in dotgithub data/repos_db.json (the org README says edit the DB, not the generated text) and regenerate: drop 'anti-aliased', say 'native C + pure-Python' for pygraphics, replace 'HSL / HSV color spaces ... gradient generators' with what ships (HSV colour wheel, RGB cube, Material swatches, Win16 names, RGB565/RGB888 output); fix site-chrome.js:161 and docs/index.md:177 in palettes to match.
[LOW] Sidebar nav describes android-template as a Kivy template; its README says 'no Kivy'
assets/chrome/site-chrome.js line 229 (rendered in the 'ECOSYSTEM' sidebar on every portal page): desc 'Kivy / python-for-android packaging template'. android-template README.md line 10: 'PyDevices applications run under CPython in a python-for-android APK using the SDL2 bootstrap (no Kivy).' The front-page card ('python-for-android build recipes and Buildozer project template') is correct; only the sidebar string is wrong.
Suggested fix: Change site-chrome.js:229 to 'python-for-android / Buildozer APK template' (generate it from repos_db.json if the sidebar is hand-maintained).
[LOW] GitHub org page: android-runner's website field 404s and contradicts the org README
api.github.com/orgs/PyDevices/repos -> android-runner homepage='https://pydevices.github.io/android-runner/'; curl -sSL -o /dev/null -w '%{http_code}' https://pydevices.github.io/android-runner/ -> 404. The org profile README (rendered on https://github.com/PyDevices) says under 'Deliberately absent from this map': 'android-runner ... the runner publishes no site.' Related inconsistencies in the same repo-metadata pass: micropython-vst3 has homepage=None although https://pydevices.github.io/micropython-vst3/ exists (200); cmods homepage='https://pydevices.github.io/' although https://pydevices.github.io/cmods/ exists (200).
Suggested fix: Clear android-runner's homepage field (or point it at https://pydevices.github.io/pydevices/), set micropython-vst3's to its portal page, and set cmods' to https://pydevices.github.io/cmods/.
[LOW] site-chrome.js documents an embed snippet whose two script URLs are 404
https://pydevices.github.io/assets/chrome/site-chrome.js lines 8-9 (header usage comment): '<script src="https://pydevices.github.io/assets/js/site-chrome.js"></script>' and '<script src="https://pydevices.github.io/assets/js/theme-toggle.js"></script>'. curl -> 404 https://pydevices.github.io/assets/js/site-chrome.js and 404 https://pydevices.github.io/assets/js/theme-toggle.js; the real path is /assets/chrome/site-chrome.js (200) with the theme toggle built in. No live page loads the 404 paths: /, /mip/, /pydevices/, /palettes/, /pdwidgets/, /pygraphics/, /pydevices-examples/ all load /assets/chrome/site-chrome.js, and the Gallery/PyScript pages load a local copy ../pyscript/site-chrome.js + theme-toggle.js (both 200). Only bites a repo that copies the documented snippet.
Suggested fix: Fix the comment to /assets/chrome/site-chrome.js and drop the theme-toggle line.
[LOW] Portal pygraphics page has no install line while its two sibling pages do
https://pydevices.github.io/palettes/ has 'Installation & API Usage' (mip.install line identical to README); https://pydevices.github.io/pdwidgets/ has 'Installation & Minimal Button Loop' (4-line mip block identical to README, including the 'does not pull its dependencies' comment). https://pydevices.github.io/pygraphics/ has only 'API Code Example' -- no pip or mip line -- although the README's Install section gives both (pip install -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ pydevices-pygraphics and mip.install("pygraphics", index="https://PyDevices.github.io/mip")). Front-page cards show no install lines (consistent, not a finding). Names and one-line descriptions on cards match the org README and per-page meta exactly; they differ from the GitHub 'About' descriptions only in wording except for the items in the pygraphics/palettes finding above.
Suggested fix: Add the README's two install lines to the pygraphics portal page (repos_db.json entry) so the three Tier-2 pages match.
S6 — the org front door walked as a stranger: portal, GitHub org page, and the three Tier-2 landing pages (palettes, pdwidgets, pygraphics), every link curled. The generated pages come from
data/repos_db.jsonandassets/chrome/site-chrome.js; per the org README, fix the data and regenerate, not the output.Findings (7)
[MEDIUM] Portal pygraphics page's only code example fails with ImportError on the pure-Python package it tells you to install
https://pydevices.github.io/pygraphics/ 'API Code Example' line 1:
from pygraphics import Area, FrameBuffer, RGB565, framebuf_backendwith the comment '# Verify active backend (native C usermod or pure-Python fallback)'. Ran it verbatim against lib/pygraphics from the v-main tarball (PYTHONPATH=.../pygraphics/lib, cwd=/tmp):ImportError: cannot import name 'framebuf_backend' from 'pygraphics'. lib/pygraphics/init.py exportsimplementation()only; its PEP-562__getattr__lazy table (lines 74-82) has no framebuf_backend; the name exists only in the C module (src/gfx_bindings_mp.c:2012, src/gfx_module_cpy.c:1270). So the example fails in exactly the 'pure-Python fallback' case it claims to detect, i.e. after the MIP install the sibling pages recommend. The rest of the example is correct: withimplementation()substituted it printspygraphics_pythonandArea(34, 34, 60, 60), matching the page's comment. README's own quick start usespygraphics.implementation()and works.Suggested fix: Change the portal example (dotgithub repos_db.json / generated page) to
print(pygraphics.implementation()), or add aframebuf_backend()that returns a Python-side value to lib/pygraphics/init.py so the documented call exists on both builds.[MEDIUM] pdwidgets and pygraphics READMEs say 'TestPyPI only ... deliberate' but real PyPI carries released versions
README.md (main) pdwidgets 'Support and platforms': 'Publication to TestPyPI only (rather than PyPI) is deliberate.' pygraphics 'Support and platforms': 'Native wheels are published to TestPyPI only (
pydevices-pygraphics); this is also deliberate, not a placeholder'. Yet: curl https://pypi.org/pypi/pydevices-pdwidgets/json -> 200, version 0.0.22, 2 files; https://pypi.org/pypi/pydevices-pygraphics/json -> 200, version 0.0.37, 16 files (full wheel set); https://pypi.org/pypi/pydevices-palettes/json -> 200, version 0.0.12. Each is exactly one version behind TestPyPI (0.0.23 / 0.0.38 / 0.0.13, matching the latest GitHub release tags of 2026-08-29) and carries the full README as its description, so a stranger sees a real project, not a park. Plainpip install pydevices-pygraphics(no -i) therefore succeeds and installs 0.0.37, contradicting the README text.Suggested fix: Rewrite the two 'TestPyPI only' sentences to describe the actual state (PyPI mirrors lag one release, or PyPI is the parked/mirror channel), and decide whether the PyPI copies should be brought up to the current tags so the two indexes stop disagreeing.
[MEDIUM] Portal cards for pygraphics and palettes advertise features the repos do not contain (anti-aliased fonts; HSL; gradient generators)
Card text (identical on https://pydevices.github.io/ front page, the per-repo page , and the org profile README Tier 2, all generated from dotgithub data/repos_db.json). pygraphics: 'Pure-Python 2D graphics library with drawing primitives, anti-aliased font rendering, paletted surface blitting, and area-dirtying pipelines.' ->
grep -rniE 'anti.?alias' pygraphics/over lib/, src/, docs/, README of the main tarball returns nothing; the font engine is 8x8/8x14/8x16 bitmap fonts (README 'Multi-Font Engine'). The card also says 'Pure-Python' while the README's first line is 'Native and pure-Python pygraphics' and the TestPyPI product is a native C extension. palettes: 'Color management library with RGB565 / RGB888 conversion, HSL / HSV color spaces, palette swatches, and smooth gradient generators.' -> public API is__all__ = ['WIN16','get_palette','Palette','MappedPalette'];grep -rniE '\bhsl\b' palettes/hits only docs/index.md:177 ('Color Math & Formats — ... HSL/HSV math'), and docs/color-math.md itself has only '## 3. HSV to RGB Interpolation'; no gradient function/class exists ([n for n in dir(palettes) if 'grad' in n.lower()]-> []). The sidebar nav (site-chrome.js:161) repeats 'Color quantization, HSL & RGB565 format conversion' (no quantize API either). Verified as delivered and NOT findings: pdwidgets card items (button.py, slider.py, progress_bar.py, label.py, add_event_cb); pygraphics palette blit (blit(..., palette=)) and Area returns; palettes RGB565/RGB888 (color_depth 16/24), HSV wheel, and every code line on the palettes portal page (palette.RED,RED_S900, default-paletteRED/BLUE/GREEN/CYAN) runs.Suggested fix: Edit the three descriptions in dotgithub data/repos_db.json (the org README says edit the DB, not the generated text) and regenerate: drop 'anti-aliased', say 'native C + pure-Python' for pygraphics, replace 'HSL / HSV color spaces ... gradient generators' with what ships (HSV colour wheel, RGB cube, Material swatches, Win16 names, RGB565/RGB888 output); fix site-chrome.js:161 and docs/index.md:177 in palettes to match.
[LOW] Sidebar nav describes android-template as a Kivy template; its README says 'no Kivy'
assets/chrome/site-chrome.js line 229 (rendered in the 'ECOSYSTEM' sidebar on every portal page): desc 'Kivy / python-for-android packaging template'. android-template README.md line 10: 'PyDevices applications run under CPython in a python-for-android APK using the SDL2 bootstrap (no Kivy).' The front-page card ('python-for-android build recipes and Buildozer project template') is correct; only the sidebar string is wrong.
Suggested fix: Change site-chrome.js:229 to 'python-for-android / Buildozer APK template' (generate it from repos_db.json if the sidebar is hand-maintained).
[LOW] GitHub org page: android-runner's website field 404s and contradicts the org README
api.github.com/orgs/PyDevices/repos -> android-runner homepage='https://pydevices.github.io/android-runner/'; curl -sSL -o /dev/null -w '%{http_code}' https://pydevices.github.io/android-runner/ -> 404. The org profile README (rendered on https://github.com/PyDevices) says under 'Deliberately absent from this map': 'android-runner ... the runner publishes no site.' Related inconsistencies in the same repo-metadata pass: micropython-vst3 has homepage=None although https://pydevices.github.io/micropython-vst3/ exists (200); cmods homepage='https://pydevices.github.io/' although https://pydevices.github.io/cmods/ exists (200).
Suggested fix: Clear android-runner's homepage field (or point it at https://pydevices.github.io/pydevices/), set micropython-vst3's to its portal page, and set cmods' to https://pydevices.github.io/cmods/.
[LOW] site-chrome.js documents an embed snippet whose two script URLs are 404
https://pydevices.github.io/assets/chrome/site-chrome.js lines 8-9 (header usage comment): '<script src="https://pydevices.github.io/assets/js/site-chrome.js"></script>' and '<script src="https://pydevices.github.io/assets/js/theme-toggle.js"></script>'. curl -> 404 https://pydevices.github.io/assets/js/site-chrome.js and 404 https://pydevices.github.io/assets/js/theme-toggle.js; the real path is /assets/chrome/site-chrome.js (200) with the theme toggle built in. No live page loads the 404 paths: /, /mip/, /pydevices/, /palettes/, /pdwidgets/, /pygraphics/, /pydevices-examples/ all load /assets/chrome/site-chrome.js, and the Gallery/PyScript pages load a local copy ../pyscript/site-chrome.js + theme-toggle.js (both 200). Only bites a repo that copies the documented snippet.
Suggested fix: Fix the comment to /assets/chrome/site-chrome.js and drop the theme-toggle line.
[LOW] Portal pygraphics page has no install line while its two sibling pages do
https://pydevices.github.io/palettes/ has 'Installation & API Usage' (mip.install line identical to README); https://pydevices.github.io/pdwidgets/ has 'Installation & Minimal Button Loop' (4-line mip block identical to README, including the 'does not pull its dependencies' comment). https://pydevices.github.io/pygraphics/ has only 'API Code Example' -- no pip or mip line -- although the README's Install section gives both (
pip install -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ pydevices-pygraphicsandmip.install("pygraphics", index="https://PyDevices.github.io/mip")). Front-page cards show no install lines (consistent, not a finding). Names and one-line descriptions on cards match the org README and per-page meta exactly; they differ from the GitHub 'About' descriptions only in wording except for the items in the pygraphics/palettes finding above.Suggested fix: Add the README's two install lines to the pygraphics portal page (repos_db.json entry) so the three Tier-2 pages match.