v0.7.4: the dash unit walked into the selectors.py trap

socialmag-dash crash-looped on a real box. WorkingDirectory was the repo and
ExecStart was `python -m http.server`, so socketserver's `import selectors`
found the repo's selectors.py and the unit died with "module 'selectors' has no
attribute 'SelectSelector'" every 5 seconds. :8321 never bound.

This is the SAME root cause already fixed twice this evening — once for
`-m socialmag` (console scripts, cli.py) and once for `-m venv` (run python
from /). Both fixes were about keeping the repo off sys.path, and then the unit
file put it right back on. A `-m` anywhere near this directory is the hazard,
not any particular entry point.

The dash now serves with --directory and sits in / instead of standing in the
tree it serves. The by-hand fallback instructions carried the identical bug and
now do the same, with a line saying why.

openbridge and refresh were never affected: they exec console scripts, which do
not put the working directory on sys.path. That is exactly why cli.py exists.

The real fix is renaming selectors.py and queue.py. Until then this trap keeps
finding new ways in, and that is not a prediction — it is three for three.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-13 02:46:06 +08:00
co-authored by Claude Opus 5
parent 9dfee100d2
commit 9968ba040f
2 changed files with 14 additions and 7 deletions
+3 -2
View File
@@ -120,10 +120,11 @@ if [[ -z "$USER_BUS" ]]; then
warn " systemctl status user@$(id -u).service # start here"
fi
fi
warn "until then, run the three by hand from $REPO:"
warn "until then, run the three by hand (from anywhere EXCEPT $REPO):"
warn " $VENV/bin/socialmag-openbridge &"
warn " $VENV/bin/python -m http.server 8321 &"
warn " $VENV/bin/python -m http.server 8321 --directory $REPO &"
warn " $VENV/bin/socialmag-refresh # one pass, whenever you want it"
warn " (-m from inside the repo imports its selectors.py over the stdlib's)"
else
mkdir -p "$UNIT_DIR"
for src in "$REPO"/deploy/user/*.in; do