- templates/bot_runner.py (new, no Qt): runs the bot as a child process
(unbuffered, UTF-8), tails its output, keeps raw lines in bot_raw.log,
and turns lines into step/log/status events. Step markers and friendly
rules use specific substrings, first match wins; unmatched error lines
are always shown, other unmatched lines hidden. Dry run:
python dashboard/bot_runner.py prints the events the page would get.
- bridge.py: delegates to bot_runner, one run at a time, restores the
saved dark mode on every page load (fixes sample-data mode in PyQt),
adds load_latest_report / download_report slots the page calls.
- SKILL.md: skip the stack question for a PyQt project; desktop wiring
steps from the bot's real output; verify steps for the host.
- tests: assert-based self-check for the line logic and run loop; Seam 1
run replay (status dot, Run button, steps, log) and wired-page mode;
fixture b-pyqt-bot and its Seam 2 eval (all 14 checks pass).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- templates/detect_frontend.py: finds plain HTML, React/Vue/Angular/Svelte apps
and PyQt web views; prints location, stack, main colours, font and every
token block (CSS custom properties, <style> tags, Tailwind config).
- templates/frontend.md: shared report / keep / restyle procedure, written
so rpa-dashboard-ai can point to it.
- SKILL.md steps 1, 2 and 6 point to it.
- tests: detection self-check; fixture c-web-existing-frontend; eval entries
c-keep and c-restyle (new pages only, per-question grading, checks on what
changed in the existing files), both passing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On Windows a multi-line argv prompt is cut at its first newline, which
also dropped the permission flags. The a-empty eval now passes every
check, including the page check on the page the skill built.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>