diff --git a/.agents/phases/todo/02_simulate_fetch_commands/00_phase.md b/.agents/phases/complete/02_simulate_fetch_commands/00_phase.md similarity index 100% rename from .agents/phases/todo/02_simulate_fetch_commands/00_phase.md rename to .agents/phases/complete/02_simulate_fetch_commands/00_phase.md diff --git a/.agents/phases/todo/02_simulate_fetch_commands/01_simulate_fetch_output.md b/.agents/phases/complete/02_simulate_fetch_commands/01_simulate_fetch_output.md similarity index 100% rename from .agents/phases/todo/02_simulate_fetch_commands/01_simulate_fetch_output.md rename to .agents/phases/complete/02_simulate_fetch_commands/01_simulate_fetch_output.md diff --git a/.agents/phases/todo/02_simulate_fetch_commands/02_fetch_regression_test.md b/.agents/phases/complete/02_simulate_fetch_commands/02_fetch_regression_test.md similarity index 100% rename from .agents/phases/todo/02_simulate_fetch_commands/02_fetch_regression_test.md rename to .agents/phases/complete/02_simulate_fetch_commands/02_fetch_regression_test.md diff --git a/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__00_phase.a1.err b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__00_phase.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__00_phase.a1.md b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__00_phase.a1.md new file mode 100644 index 0000000..71bc1af --- /dev/null +++ b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__00_phase.a1.md @@ -0,0 +1,12 @@ +All green. Final report: + +**Phase 02 — final verification pass** (both tasks already in `.agents/phases/complete/02_simulate_fetch_commands/`) +- Verified: no `fetch(` remains in `src/` (grep exit 1) or in built `dist/*.js` +- Verified: `simulatedCurlOutput()` / `simulatedWgetOutput()` in `src/terminal-commands.js` (lines 63/73), wired into `src/terminal.js` curl/wget branches +- Verified: regression test `curl/wget are simulated — no real network request leaves the origin` in `tests/e2e/02-terminal.spec.js` — asserts simulated bodies, `web_navigator` toast + localStorage persistence, and zero non-`baseURL` requests +- Tests: `./build.sh` → OK; `npm test` → **46 passed, 0 failed** (≥46 required); `bash .agents/validate.sh` → **exit 0** (E2E + repo-hygiene gates) +- No linter configured beyond validate.sh (vanilla JS, LOCKED no-toolchain) +- Completion criteria: ①no `fetch(` ✅ ②simulators present ✅ ③regression tests present & passing ✅ ④build+test 46 green ✅ ⑤no behavior change (page/terminal/vim/achievements/menu suites all green) ✅ +- Documentation: full README/AGENTS.md review — both already updated in working tree and consistent with the project (simulated curl/wget, validate.sh gate, Podman build flow vs Dockerfile, Node ≥20 matches `@playwright/test` engines, M-4 header gap correctly documented as pending Phase 03) — **verified consistent, no changes needed** +- Note: `PLAN.md` still says "44 tests" (now 46) but PLAN is locked — flagged for the harness/user, not edited +- Next pending phase: `03_nginx_security_headers` diff --git a/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__00_phase.a1.md.status b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__00_phase.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__00_phase.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__00_phase.a1.validate b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__00_phase.a1.validate new file mode 100644 index 0000000..7b2d625 --- /dev/null +++ b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__00_phase.a1.validate @@ -0,0 +1,428 @@ +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:18] "GET /index.html HTTP/1.1" 200 - + +Running 46 tests using 1 worker + +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:19] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:19] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:19] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:19] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:19] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:19] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:19] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:19] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 1 [chromium] › tests/e2e/01-page.spec.js:9:5 › Page structure › loads with correct title and lang (858ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 2 [chromium] › tests/e2e/01-page.spec.js:14:5 › Page structure › nav has all seven section links pointing at existing targets (480ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:20] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 3 [chromium] › tests/e2e/01-page.spec.js:24:5 › Page structure › all major sections exist and are in the DOM (472ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 4 [chromium] › tests/e2e/01-page.spec.js:30:5 › Page structure › profile image loads (454ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 5 [chromium] › tests/e2e/01-page.spec.js:38:5 › Page structure › server rack background is generated with a terminal unit (451ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:21] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 6 [chromium] › tests/e2e/01-page.spec.js:45:5 › Page structure › GPG section shows both fingerprints and key blocks (491ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 7 [chromium] › tests/e2e/01-page.spec.js:59:5 › Page structure › external links all carry rel="noopener" (474ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - + ✓ 8 [chromium] › tests/e2e/01-page.spec.js:68:5 › Page structure › hashed assets are referenced and served (465ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 9 [chromium] › tests/e2e/02-terminal.spec.js:11:5 › Fake terminal — basic commands › hero click expands the terminal and shifts the hero (504ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:23] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 10 [chromium] › tests/e2e/02-terminal.spec.js:17:5 › Fake terminal — basic commands › initial boot lines are rendered (509ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:24] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:24] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:24] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:24] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:24] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:24] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:24] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:24] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 11 [chromium] › tests/e2e/02-terminal.spec.js:23:5 › Fake terminal — basic commands › uptime shows the load-average line (542ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 12 [chromium] › tests/e2e/02-terminal.spec.js:28:5 › Fake terminal — basic commands › ls lists the portfolio files (521ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:25] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 13 [chromium] › tests/e2e/02-terminal.spec.js:36:5 › Fake terminal — basic commands › pwd / whoami / hostname / id (579ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 14 [chromium] › tests/e2e/02-terminal.spec.js:47:5 › Fake terminal — basic commands › date shows a plausible current date (519ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:26] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 15 [chromium] › tests/e2e/02-terminal.spec.js:53:5 › Fake terminal — basic commands › uname and cat /etc/os-release (552ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 16 [chromium] › tests/e2e/02-terminal.spec.js:62:5 › Fake terminal — basic commands › echo prints its argument as plain text (516ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:27] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 17 [chromium] › tests/e2e/02-terminal.spec.js:67:5 › Fake terminal — basic commands › ss shows listening ports (515ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 18 [chromium] › tests/e2e/02-terminal.spec.js:74:5 › Fake terminal — basic commands › docker ps and podman ps (535ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:28] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 19 [chromium] › tests/e2e/02-terminal.spec.js:85:5 › Fake terminal — basic commands › ps aux and df -h and free -h (594ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 20 [chromium] › tests/e2e/02-terminal.spec.js:94:5 › Fake terminal — basic commands › neofetch renders the ASCII logo and colored blocks (535ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:29] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 21 [chromium] › tests/e2e/02-terminal.spec.js:102:5 › Fake terminal — basic commands › sl prints the locomotive (521ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 22 [chromium] › tests/e2e/02-terminal.spec.js:107:5 › Fake terminal — basic commands › help lists the available commands (513ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:30] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:31] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 23 [chromium] › tests/e2e/02-terminal.spec.js:115:5 › Fake terminal — basic commands › systemctl, ip addr, cat ssh key (606ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:31] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:31] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:31] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:31] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:31] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:31] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:31] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:31] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 24 [chromium] › tests/e2e/02-terminal.spec.js:124:5 › Fake terminal — basic commands › unknown command produces no output and a fresh prompt (521ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 25 [chromium] › tests/e2e/02-terminal.spec.js:139:5 › Fake terminal — state and special commands › history: ArrowUp/ArrowDown recall previous commands (556ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:32] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 26 [chromium] › tests/e2e/02-terminal.spec.js:156:5 › Fake terminal — state and special commands › history recall renders markup payloads as literal text (no DOM injection) (871ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:33] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:33] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:33] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:33] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:33] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:33] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:33] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:33] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 27 [chromium] › tests/e2e/02-terminal.spec.js:195:5 › Fake terminal — state and special commands › Tab completes a command (573ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 28 [chromium] › tests/e2e/02-terminal.spec.js:203:5 › Fake terminal — state and special commands › Tab cycles between multiple matches (555ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:34] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 29 [chromium] › tests/e2e/02-terminal.spec.js:218:5 › Fake terminal — state and special commands › clear empties the terminal and leaves one prompt line (546ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 30 [chromium] › tests/e2e/02-terminal.spec.js:226:5 › Fake terminal — state and special commands › sudo su - switches the prompt to root (#) (538ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:35] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 31 [chromium] › tests/e2e/02-terminal.spec.js:239:5 › Fake terminal — state and special commands › rm -rf / as a normal user is refused (541ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:36] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:36] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:36] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:36] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:36] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:36] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:36] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:36] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 32 [chromium] › tests/e2e/02-terminal.spec.js:247:5 › Fake terminal — state and special commands › rm -rf / as root triggers the destruction easter egg (1.3s) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:37] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:37] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:37] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:37] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:37] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:37] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:37] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:37] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 33 [chromium] › tests/e2e/02-terminal.spec.js:257:5 › Fake terminal — state and special commands › exit as a normal user swaps the page for a login screen (532ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:38] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:38] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:38] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:38] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:38] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:38] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:38] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:38] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 34 [chromium] › tests/e2e/02-terminal.spec.js:273:5 › Fake terminal — state and special commands › curl/wget are simulated — no real network request leaves the origin (3.0s) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 35 [chromium] › tests/e2e/02-terminal.spec.js:303:5 › Fake terminal — state and special commands › backspace edits the current command (516ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:41] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 36 [chromium] › tests/e2e/03-vim.spec.js:15:5 › Fake terminal — vim simulator › vim with no filename shows the splash and q exits (539ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 37 [chromium] › tests/e2e/03-vim.spec.js:26:5 › Fake terminal — vim simulator › vim with a filename opens a buffer; insert, save & quit (592ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:42] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 38 [chromium] › tests/e2e/03-vim.spec.js:48:5 › Fake terminal — vim simulator › vim normal-mode navigation and line deletion (601ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 39 [chromium] › tests/e2e/04-achievements.spec.js:8:5 › Achievements system › starts hidden until the first unlock (440ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:43] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 40 [chromium] › tests/e2e/04-achievements.spec.js:14:5 › Achievements system › uptime unlock shows a toast, persists to localStorage, reveals the section (561ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:44] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:44] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:44] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:44] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:44] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:44] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:44] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:44] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:44] "GET / HTTP/1.1" 304 - + ✓ 41 [chromium] › tests/e2e/04-achievements.spec.js:43:5 › Achievements system › unlocks survive a page reload (localStorage restore) (575ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET / HTTP/1.1" 304 - + ✓ 42 [chromium] › tests/e2e/04-achievements.spec.js:55:5 › Achievements system › special achievements: sudo, nice-try rm, vim splash (660ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:45] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 43 [chromium] › tests/e2e/04-achievements.spec.js:80:5 › Achievements system › multiple unlocks stack toasts and increment the counter (543ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 44 [chromium] › tests/e2e/05-menu.spec.js:5:5 › Navigation menu › desktop: inline nav visible, hamburger hidden (472ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:46] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 45 [chromium] › tests/e2e/05-menu.spec.js:12:5 › Navigation menu › mobile: hamburger opens and closes the menu (1.8s) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:48] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:48] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:48] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:48] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:48] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:48] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:48] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:14:48] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 46 [chromium] › tests/e2e/05-menu.spec.js:30:5 › Navigation menu › clicking outside closes an open mobile menu (534ms) + + 46 passed (30.3s) + +To open last HTML report run: + + npx playwright show-report + diff --git a/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__01_simulate_fetch_output.a1.err b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__01_simulate_fetch_output.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__01_simulate_fetch_output.a1.md b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__01_simulate_fetch_output.a1.md new file mode 100644 index 0000000..0c058d0 --- /dev/null +++ b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__01_simulate_fetch_output.a1.md @@ -0,0 +1,22 @@ +**Implemented** +- `src/terminal-commands.js`: added pure string builders `_simulatedBody()`, `simulatedCurlOutput(url)`, `simulatedWgetOutput(url)` (deterministic, echoes the URL, explicitly labelled simulated). +- `src/terminal.js`: deleted both `fetch(url).then().catch()` chains in the `curl ` / `wget ` branches; they now render the simulated output after a 400 ms `setTimeout` (url regexes, `Downloading...` line, `whiteSpace`/`color` styling and the `web_navigator` achievement path untouched). +- Rebuilt `dist/` — built artifact contains no `fetch(` and ships the new functions. + +**Tests / lint / coverage** +- `node --check` both files: OK. `node -e` sanity check (task's suggested form) prints both curl and wget blocks. +- `./build.sh && npm test` → **45 passed, 0 failed** (31.9s). +- `bash .agents/validate.sh` → **exit 0** (full E2E suite + repo-hygiene gates). +- Criteria greps: `grep -n "fetch(" src/terminal.js` → no matches; no `fetch(` anywhere in `src/`; both functions present in `src/terminal-commands.js`. +- Coverage of the new code / both branches is asserted by the task-02 regression tests; per this task's mandate I verified them with a throwaway Playwright script (curl + wget, `-s`/`-O` stripping, request listener saw **zero** non-origin requests, `web_navigator` toast + localStorage unlock) and deleted it so task 02 owns the committed tests. + +**Docs** +- `README.md`: new note that the fake terminal does no real network I/O and points at the two simulators. +- `AGENTS.md`: convention added under Conventions (canned curl/wget output, keep fetch out of `src/`). + +**Notes / deviations** +- Left `help` copy ("curl Fetch a webpage") unchanged — out of scope, still reads correctly for the simulated behavior. +- Untracked `TODO.md` (stub `# TODO`) appeared in the repo root during the run; not created by me and harmless to the gate — left in place, uncommitted. +- Pre-existing uncommitted edits (`.agents/PLAN.md`, `package.json`, `package-lock.json`, `.agents/validate.sh`) from the Playwright 1.63.0 re-pin were left untouched for the harness commit. + +**Next pending task:** `.agents/phases/todo/02_simulate_fetch_commands/02_fetch_regression_test.md` diff --git a/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__01_simulate_fetch_output.a1.md.status b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__01_simulate_fetch_output.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__01_simulate_fetch_output.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__01_simulate_fetch_output.a1.validate b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__01_simulate_fetch_output.a1.validate new file mode 100644 index 0000000..8270e58 --- /dev/null +++ b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__01_simulate_fetch_output.a1.validate @@ -0,0 +1,419 @@ +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:41] "GET /index.html HTTP/1.1" 200 - + +Running 45 tests using 1 worker + +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:41] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:41] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:41] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:41] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:41] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:41] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:41] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:41] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 1 [chromium] › tests/e2e/01-page.spec.js:9:5 › Page structure › loads with correct title and lang (1.2s) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:42] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:42] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:42] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:42] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:42] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:42] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:42] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:42] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 2 [chromium] › tests/e2e/01-page.spec.js:14:5 › Page structure › nav has all seven section links pointing at existing targets (580ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:43] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:43] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:43] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:43] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:43] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:43] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:43] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:43] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 3 [chromium] › tests/e2e/01-page.spec.js:24:5 › Page structure › all major sections exist and are in the DOM (561ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 4 [chromium] › tests/e2e/01-page.spec.js:30:5 › Page structure › profile image loads (628ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:44] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 5 [chromium] › tests/e2e/01-page.spec.js:38:5 › Page structure › server rack background is generated with a terminal unit (603ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 6 [chromium] › tests/e2e/01-page.spec.js:45:5 › Page structure › GPG section shows both fingerprints and key blocks (600ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:45] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 7 [chromium] › tests/e2e/01-page.spec.js:59:5 › Page structure › external links all carry rel="noopener" (517ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:46] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:46] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:46] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:46] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:46] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:46] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:46] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:46] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:46] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - + ✓ 8 [chromium] › tests/e2e/01-page.spec.js:68:5 › Page structure › hashed assets are referenced and served (514ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:46] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 9 [chromium] › tests/e2e/02-terminal.spec.js:11:5 › Fake terminal — basic commands › hero click expands the terminal and shifts the hero (596ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:47] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 10 [chromium] › tests/e2e/02-terminal.spec.js:17:5 › Fake terminal — basic commands › initial boot lines are rendered (654ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 11 [chromium] › tests/e2e/02-terminal.spec.js:23:5 › Fake terminal — basic commands › uptime shows the load-average line (642ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:48] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 12 [chromium] › tests/e2e/02-terminal.spec.js:28:5 › Fake terminal — basic commands › ls lists the portfolio files (605ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:49] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:49] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:49] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:49] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:49] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:49] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:49] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:49] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 13 [chromium] › tests/e2e/02-terminal.spec.js:36:5 › Fake terminal — basic commands › pwd / whoami / hostname / id (692ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 14 [chromium] › tests/e2e/02-terminal.spec.js:47:5 › Fake terminal — basic commands › date shows a plausible current date (580ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:50] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 15 [chromium] › tests/e2e/02-terminal.spec.js:53:5 › Fake terminal — basic commands › uname and cat /etc/os-release (631ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:51] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:51] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:51] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:51] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:51] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:51] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:51] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:51] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 16 [chromium] › tests/e2e/02-terminal.spec.js:62:5 › Fake terminal — basic commands › echo prints its argument as plain text (626ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 17 [chromium] › tests/e2e/02-terminal.spec.js:67:5 › Fake terminal — basic commands › ss shows listening ports (565ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:52] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 18 [chromium] › tests/e2e/02-terminal.spec.js:74:5 › Fake terminal — basic commands › docker ps and podman ps (598ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 19 [chromium] › tests/e2e/02-terminal.spec.js:85:5 › Fake terminal — basic commands › ps aux and df -h and free -h (616ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:53] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 20 [chromium] › tests/e2e/02-terminal.spec.js:94:5 › Fake terminal — basic commands › neofetch renders the ASCII logo and colored blocks (570ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:54] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:54] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:54] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:54] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:54] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:54] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:54] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:54] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 21 [chromium] › tests/e2e/02-terminal.spec.js:102:5 › Fake terminal — basic commands › sl prints the locomotive (582ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 22 [chromium] › tests/e2e/02-terminal.spec.js:107:5 › Fake terminal — basic commands › help lists the available commands (614ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:55] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 23 [chromium] › tests/e2e/02-terminal.spec.js:115:5 › Fake terminal — basic commands › systemctl, ip addr, cat ssh key (743ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:56] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:56] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:56] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:56] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:56] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:56] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:56] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:56] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 24 [chromium] › tests/e2e/02-terminal.spec.js:124:5 › Fake terminal — basic commands › unknown command produces no output and a fresh prompt (640ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 25 [chromium] › tests/e2e/02-terminal.spec.js:139:5 › Fake terminal — state and special commands › history: ArrowUp/ArrowDown recall previous commands (680ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:57] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 26 [chromium] › tests/e2e/02-terminal.spec.js:156:5 › Fake terminal — state and special commands › history recall renders markup payloads as literal text (no DOM injection) (1.0s) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:58] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:58] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:58] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:58] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:58] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:58] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:58] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:58] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 27 [chromium] › tests/e2e/02-terminal.spec.js:195:5 › Fake terminal — state and special commands › Tab completes a command (608ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:59] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:59] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:59] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:59] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:59] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:59] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:59] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:52:59] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 28 [chromium] › tests/e2e/02-terminal.spec.js:203:5 › Fake terminal — state and special commands › Tab cycles between multiple matches (630ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 29 [chromium] › tests/e2e/02-terminal.spec.js:218:5 › Fake terminal — state and special commands › clear empties the terminal and leaves one prompt line (630ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:00] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 30 [chromium] › tests/e2e/02-terminal.spec.js:226:5 › Fake terminal — state and special commands › sudo su - switches the prompt to root (#) (691ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 31 [chromium] › tests/e2e/02-terminal.spec.js:239:5 › Fake terminal — state and special commands › rm -rf / as a normal user is refused (628ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:01] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 32 [chromium] › tests/e2e/02-terminal.spec.js:247:5 › Fake terminal — state and special commands › rm -rf / as root triggers the destruction easter egg (1.3s) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 33 [chromium] › tests/e2e/02-terminal.spec.js:257:5 › Fake terminal — state and special commands › exit as a normal user swaps the page for a login screen (634ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:03] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 34 [chromium] › tests/e2e/02-terminal.spec.js:270:5 › Fake terminal — state and special commands › backspace edits the current command (566ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:04] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:04] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:04] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:04] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:04] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:04] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:04] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:04] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 35 [chromium] › tests/e2e/03-vim.spec.js:15:5 › Fake terminal — vim simulator › vim with no filename shows the splash and q exits (654ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 36 [chromium] › tests/e2e/03-vim.spec.js:26:5 › Fake terminal — vim simulator › vim with a filename opens a buffer; insert, save & quit (725ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:05] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 37 [chromium] › tests/e2e/03-vim.spec.js:48:5 › Fake terminal — vim simulator › vim normal-mode navigation and line deletion (673ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:06] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:06] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:06] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:06] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:06] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:06] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:06] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:06] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 38 [chromium] › tests/e2e/04-achievements.spec.js:8:5 › Achievements system › starts hidden until the first unlock (521ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 39 [chromium] › tests/e2e/04-achievements.spec.js:14:5 › Achievements system › uptime unlock shows a toast, persists to localStorage, reveals the section (607ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:07] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:08] "GET / HTTP/1.1" 304 - + ✓ 40 [chromium] › tests/e2e/04-achievements.spec.js:43:5 › Achievements system › unlocks survive a page reload (localStorage restore) (617ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:08] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:08] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:08] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:08] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:08] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:08] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:08] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:08] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:08] "GET / HTTP/1.1" 304 - + ✓ 41 [chromium] › tests/e2e/04-achievements.spec.js:55:5 › Achievements system › special achievements: sudo, nice-try rm, vim splash (739ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 42 [chromium] › tests/e2e/04-achievements.spec.js:80:5 › Achievements system › multiple unlocks stack toasts and increment the counter (657ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:09] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 43 [chromium] › tests/e2e/05-menu.spec.js:5:5 › Navigation menu › desktop: inline nav visible, hamburger hidden (544ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:10] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:10] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:10] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:10] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:10] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:10] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:10] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:10] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 44 [chromium] › tests/e2e/05-menu.spec.js:12:5 › Navigation menu › mobile: hamburger opens and closes the menu (1.9s) +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:12] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:12] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:12] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:12] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:12] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:12] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:12] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 22:53:12] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - + ✓ 45 [chromium] › tests/e2e/05-menu.spec.js:30:5 › Navigation menu › clicking outside closes an open mobile menu (517ms) + + 45 passed (31.6s) + +To open last HTML report run: + + npx playwright show-report + diff --git a/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__02_fetch_regression_test.a1.err b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__02_fetch_regression_test.a1.err new file mode 100644 index 0000000..e69de29 diff --git a/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__02_fetch_regression_test.a1.md b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__02_fetch_regression_test.a1.md new file mode 100644 index 0000000..01a0f57 --- /dev/null +++ b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__02_fetch_regression_test.a1.md @@ -0,0 +1,22 @@ +**Implemented** +- `tests/e2e/02-terminal.spec.js`: new test in *Fake terminal — state and special commands* — `curl https://example.com/hello` + `wget https://example.org/file.txt` render the simulated bodies (URL echoed, "No real network request was made"), `web_navigator` toast **and** localStorage unlock are asserted, and a `page.on('request')` listener asserts zero non-origin requests (800 ms settle window; failure message prints captured URLs). +- Origin is derived from `testInfo.project.use.baseURL` (verified resolves to `http://127.0.0.1:8123`) instead of a hardcoded constant, so it can't drift from `playwright.config.js`. +- Task 01's code was already in place; verified `grep -n "fetch(" src/terminal.js` → no matches, both simulators present. + +**Tests / gate** +- `./build.sh && npm test` → **46 passed** (was 45; +1 new). +- `bash .agents/validate.sh` → **exit 0** (46 passed + repo-hygiene gates clean). +- New test run 3× back-to-back → 3 passed (no network noise in `external`; strict `toEqual([])` kept, no tightening needed). +- Sanity (task checkbox): reverted curl/wget to a real `fetch()` in a throwaway `/tmp` copy of the repo → this test **failed** (`"curl: fetch failed"` instead of the simulated body), and a scratch listener test confirmed the non-origin `fetch` to example.com *is* captured. Real repo untouched; re-verified green after. +- `node --check` on the spec: ok. No JS linter is configured (no eslint config / `lint` script) — `validate.sh` is the whole gate. Coverage: no JS coverage tooling (adding one would break the locked toolchain); both new functions and both modified branches are exercised (E2E test + a `node -e` eval check of both builders, determinism confirmed). + +**Docs** +- `AGENTS.md`: zero-network convention now names the guarding test. +- `README.md`: Development section notes the E2E guard and that it derives the allowed origin from `baseURL`. + +**Notes / deviations** +- Assertion order follows the task snippet, plus the settle wait and a localStorage check (toast alone is time-sensitive). +- `playwright.config.js` was modified **outside my session** (22:57:47, after I started): `webServer --bind 127.0.0.1` → `0.0.0.0`. Not my change and tests pass either way, so I left it — but it loosens the local test-server binding; review before the phase commit. +- `PLAN.md` §3/§5 still say "44 tests" (now 46) — PLAN is off-limits to me; flagging for the final pass. + +**Next pending task:** `.agents/phases/todo/03_nginx_security_headers/01_extract_header_snippet.md` diff --git a/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__02_fetch_regression_test.a1.md.status b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__02_fetch_regression_test.a1.md.status new file mode 100644 index 0000000..9766475 --- /dev/null +++ b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__02_fetch_regression_test.a1.md.status @@ -0,0 +1 @@ +ok diff --git a/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__02_fetch_regression_test.a1.validate b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__02_fetch_regression_test.a1.validate new file mode 100644 index 0000000..36785a4 --- /dev/null +++ b/.agents/reports/02_simulate_fetch_commands/02_simulate_fetch_commands__02_fetch_regression_test.a1.validate @@ -0,0 +1,428 @@ +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:13] "GET /index.html HTTP/1.1" 200 - + +Running 46 tests using 1 worker + +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:13] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:13] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:13] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:13] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:13] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:13] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:13] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:13] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 1 [chromium] › tests/e2e/01-page.spec.js:9:5 › Page structure › loads with correct title and lang (755ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 2 [chromium] › tests/e2e/01-page.spec.js:14:5 › Page structure › nav has all seven section links pointing at existing targets (577ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:14] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 3 [chromium] › tests/e2e/01-page.spec.js:24:5 › Page structure › all major sections exist and are in the DOM (529ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 4 [chromium] › tests/e2e/01-page.spec.js:30:5 › Page structure › profile image loads (503ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:15] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 5 [chromium] › tests/e2e/01-page.spec.js:38:5 › Page structure › server rack background is generated with a terminal unit (509ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:16] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:16] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:16] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:16] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:16] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:16] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:16] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:16] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 6 [chromium] › tests/e2e/01-page.spec.js:45:5 › Page structure › GPG section shows both fingerprints and key blocks (537ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 7 [chromium] › tests/e2e/01-page.spec.js:59:5 › Page structure › external links all carry rel="noopener" (531ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:17] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - + ✓ 8 [chromium] › tests/e2e/01-page.spec.js:68:5 › Page structure › hashed assets are referenced and served (522ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 9 [chromium] › tests/e2e/02-terminal.spec.js:11:5 › Fake terminal — basic commands › hero click expands the terminal and shifts the hero (564ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:18] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 10 [chromium] › tests/e2e/02-terminal.spec.js:17:5 › Fake terminal — basic commands › initial boot lines are rendered (564ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 11 [chromium] › tests/e2e/02-terminal.spec.js:23:5 › Fake terminal — basic commands › uptime shows the load-average line (570ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:19] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 12 [chromium] › tests/e2e/02-terminal.spec.js:28:5 › Fake terminal — basic commands › ls lists the portfolio files (590ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:20] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:20] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:20] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:20] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:20] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:20] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:20] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:20] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 13 [chromium] › tests/e2e/02-terminal.spec.js:36:5 › Fake terminal — basic commands › pwd / whoami / hostname / id (670ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 14 [chromium] › tests/e2e/02-terminal.spec.js:47:5 › Fake terminal — basic commands › date shows a plausible current date (584ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:21] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 15 [chromium] › tests/e2e/02-terminal.spec.js:53:5 › Fake terminal — basic commands › uname and cat /etc/os-release (567ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 16 [chromium] › tests/e2e/02-terminal.spec.js:62:5 › Fake terminal — basic commands › echo prints its argument as plain text (598ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:22] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 17 [chromium] › tests/e2e/02-terminal.spec.js:67:5 › Fake terminal — basic commands › ss shows listening ports (574ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:23] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:23] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:23] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:23] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:23] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:23] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:23] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:23] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 18 [chromium] › tests/e2e/02-terminal.spec.js:74:5 › Fake terminal — basic commands › docker ps and podman ps (622ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 19 [chromium] › tests/e2e/02-terminal.spec.js:85:5 › Fake terminal — basic commands › ps aux and df -h and free -h (611ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:24] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 20 [chromium] › tests/e2e/02-terminal.spec.js:94:5 › Fake terminal — basic commands › neofetch renders the ASCII logo and colored blocks (573ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 21 [chromium] › tests/e2e/02-terminal.spec.js:102:5 › Fake terminal — basic commands › sl prints the locomotive (528ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:25] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 22 [chromium] › tests/e2e/02-terminal.spec.js:107:5 › Fake terminal — basic commands › help lists the available commands (510ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 23 [chromium] › tests/e2e/02-terminal.spec.js:115:5 › Fake terminal — basic commands › systemctl, ip addr, cat ssh key (620ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:26] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 24 [chromium] › tests/e2e/02-terminal.spec.js:124:5 › Fake terminal — basic commands › unknown command produces no output and a fresh prompt (549ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:27] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:27] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:27] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:27] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:27] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:27] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:27] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:27] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 25 [chromium] › tests/e2e/02-terminal.spec.js:139:5 › Fake terminal — state and special commands › history: ArrowUp/ArrowDown recall previous commands (564ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 26 [chromium] › tests/e2e/02-terminal.spec.js:156:5 › Fake terminal — state and special commands › history recall renders markup payloads as literal text (no DOM injection) (847ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:28] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 27 [chromium] › tests/e2e/02-terminal.spec.js:195:5 › Fake terminal — state and special commands › Tab completes a command (614ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:29] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:29] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:29] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:29] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:29] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:29] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:29] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:29] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 28 [chromium] › tests/e2e/02-terminal.spec.js:203:5 › Fake terminal — state and special commands › Tab cycles between multiple matches (607ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 29 [chromium] › tests/e2e/02-terminal.spec.js:218:5 › Fake terminal — state and special commands › clear empties the terminal and leaves one prompt line (628ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:30] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 30 [chromium] › tests/e2e/02-terminal.spec.js:226:5 › Fake terminal — state and special commands › sudo su - switches the prompt to root (#) (635ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:31] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:31] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:31] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:31] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:31] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:31] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:31] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:31] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 31 [chromium] › tests/e2e/02-terminal.spec.js:239:5 › Fake terminal — state and special commands › rm -rf / as a normal user is refused (572ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:32] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:32] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:32] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:32] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:32] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:32] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:32] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:32] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 32 [chromium] › tests/e2e/02-terminal.spec.js:247:5 › Fake terminal — state and special commands › rm -rf / as root triggers the destruction easter egg (1.3s) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 33 [chromium] › tests/e2e/02-terminal.spec.js:257:5 › Fake terminal — state and special commands › exit as a normal user swaps the page for a login screen (532ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:33] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 34 [chromium] › tests/e2e/02-terminal.spec.js:273:5 › Fake terminal — state and special commands › curl/wget are simulated — no real network request leaves the origin (3.0s) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:36] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:36] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:36] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:36] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:36] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:36] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:36] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:36] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 35 [chromium] › tests/e2e/02-terminal.spec.js:303:5 › Fake terminal — state and special commands › backspace edits the current command (556ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:37] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:37] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:37] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:37] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:37] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:37] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:37] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:37] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 36 [chromium] › tests/e2e/03-vim.spec.js:15:5 › Fake terminal — vim simulator › vim with no filename shows the splash and q exits (571ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 37 [chromium] › tests/e2e/03-vim.spec.js:26:5 › Fake terminal — vim simulator › vim with a filename opens a buffer; insert, save & quit (589ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:38] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 38 [chromium] › tests/e2e/03-vim.spec.js:48:5 › Fake terminal — vim simulator › vim normal-mode navigation and line deletion (593ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 39 [chromium] › tests/e2e/04-achievements.spec.js:8:5 › Achievements system › starts hidden until the first unlock (449ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:39] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 40 [chromium] › tests/e2e/04-achievements.spec.js:14:5 › Achievements system › uptime unlock shows a toast, persists to localStorage, reveals the section (554ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET / HTTP/1.1" 304 - + ✓ 41 [chromium] › tests/e2e/04-achievements.spec.js:43:5 › Achievements system › unlocks survive a page reload (localStorage restore) (589ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:40] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:41] "GET / HTTP/1.1" 304 - + ✓ 42 [chromium] › tests/e2e/04-achievements.spec.js:55:5 › Achievements system › special achievements: sudo, nice-try rm, vim splash (734ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:41] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:41] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:41] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:41] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:41] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:41] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:41] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:41] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 43 [chromium] › tests/e2e/04-achievements.spec.js:80:5 › Achievements system › multiple unlocks stack toasts and increment the counter (615ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 44 [chromium] › tests/e2e/05-menu.spec.js:5:5 › Navigation menu › desktop: inline nav visible, hamburger hidden (516ms) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:42] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 45 [chromium] › tests/e2e/05-menu.spec.js:12:5 › Navigation menu › mobile: hamburger opens and closes the menu (1.8s) +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:44] "GET / HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:44] "GET /terminal.ec0e2ff734985cc54efeb2a46a3f262b.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:44] "GET /terminal-achievements.824b6020d4572150826e354689be158a.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:44] "GET /terminal-commands.b11ee656c4a1c395dae70c8ccde84707.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:44] "GET /terminal-vim.9b342a7c8be670e9a96e8813c43d8edf.js HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:44] "GET /profile.fda2296cc373e01300dce68bdaf0991b.jpeg HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:44] "GET /style.342793b0a19255e7ce615729a45053fe.css HTTP/1.1" 200 - +[WebServer] 127.0.0.1 - - [22/Oct/2026 23:10:44] "GET /script.5596b80e3eb6d4ebf507689493b9c66a.js HTTP/1.1" 200 - + ✓ 46 [chromium] › tests/e2e/05-menu.spec.js:30:5 › Navigation menu › clicking outside closes an open mobile menu (523ms) + + 46 passed (32.0s) + +To open last HTML report run: + + npx playwright show-report + diff --git a/README.md b/README.md index bf2a0f6..80f26c4 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,16 @@ npm install # installs the pinned @playwright/test dev dependency npm test # Playwright E2E suite against dist/ on 127.0.0.1:8123 ``` +The fake terminal performs **no real network I/O**. `curl` and `wget` render +deterministic simulated output built by `simulatedCurlOutput()` / +`simulatedWgetOutput()` in `src/terminal-commands.js`, which echo the requested +URL and say they are simulated (audit finding M-2, Phase 02) — add new command +output the same canned way. The E2E suite guards this: one test records every +request outside the test origin while running `curl` and `wget`, so a real +network call reintroduced into `src/` fails the suite. That test derives the +allowed origin from `baseURL` in `playwright.config.js`, so changing the port +there needs no test edit. + Always build before testing: the suite exercises the built artifact in `dist/`, never `src/`. `npm test` starts (or reuses) its own static server, so no manual server is needed. Rebuild the image (`podman build`) after changing `src/`. diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..4640904 --- /dev/null +++ b/TODO.md @@ -0,0 +1 @@ +# TODO diff --git a/playwright.config.js b/playwright.config.js index a633d39..b2db24d 100644 --- a/playwright.config.js +++ b/playwright.config.js @@ -17,7 +17,7 @@ module.exports = defineConfig({ viewport: { width: 1440, height: 900 }, }, webServer: { - command: 'python3 -m http.server 8123 --bind 127.0.0.1 --directory dist', + command: 'python3 -m http.server 8123 --bind 0.0.0.0 --directory dist', url: 'http://127.0.0.1:8123/index.html', reuseExistingServer: !process.env.CI, timeout: 15000, diff --git a/src/terminal-commands.js b/src/terminal-commands.js index 21054b9..3400a9d 100644 --- a/src/terminal-commands.js +++ b/src/terminal-commands.js @@ -51,3 +51,37 @@ function getCommandOutput(cmdText) { if (value === undefined) return undefined; return typeof value === 'function' ? value() : value; } + +// Simulated fetch output. The fake terminal performs NO real network I/O by +// design — these produce a deterministic, clearly-simulated response that +// echoes the requested URL (audit finding M-2: curl/wget used to fetch the +// unvalidated URL straight from the visitor's keyboard). +function _simulatedBody(url) { + return 'simulated body for ' + url; +} + +function simulatedCurlOutput(url) { + const body = _simulatedBody(url); + return [ + ' % Total % Received % Xferd Average Speed Time Time Time Current', + ' Dload Upload Total Spent Left Speed', + '100 ' + body.length + ' 100 ' + body.length + ' 0 0 ' + (body.length * 40) + ' 0 --:--:-- --:--:-- --:--:--', + body, + ].join('\n'); +} + +function simulatedWgetOutput(url) { + const body = _simulatedBody(url); + return [ + '-- ' + new Date().toISOString().replace('T', ' ').slice(0, 19) + '-- ' + url, + 'Resolving host... (simulated)', + 'Connecting... connected (simulated).', + 'HTTP request sent, awaiting response... 200 OK', + 'Length: ' + body.length + ' [text/plain]', + "Saving to: 'index.html'", + '', + body, + '', + 'Finished (simulated). No real network request was made.', + ].join('\n'); +} diff --git a/src/terminal.js b/src/terminal.js index 4251c08..dfbef20 100644 --- a/src/terminal.js +++ b/src/terminal.js @@ -379,16 +379,11 @@ function createTerminal(face) { outLine.style.color = '#ccc'; outLine.textContent = 'Downloading...'; content.appendChild(outLine); - fetch(url) - .then(r => r.text()) - .then(data => { - outLine.textContent = data; - content.scrollTop = content.scrollHeight; - }) - .catch(err => { - outLine.textContent = 'curl: error fetching ' + url + ': ' + err.message; - content.scrollTop = content.scrollHeight; - }); + // Simulated output — the fake terminal never performs real network I/O. + setTimeout(() => { + outLine.textContent = simulatedCurlOutput(url); + content.scrollTop = content.scrollHeight; + }, 400); } else if (cmdText.startsWith('wget ')) { const url = cmdText.replace(/^wget\s+(?:-O\s+\S+\s+)?/, ''); const outLine = document.createElement('div'); @@ -396,16 +391,11 @@ function createTerminal(face) { outLine.style.color = '#ccc'; outLine.textContent = 'Downloading...'; content.appendChild(outLine); - fetch(url) - .then(r => r.text()) - .then(data => { - outLine.textContent = data; - content.scrollTop = content.scrollHeight; - }) - .catch(err => { - outLine.textContent = 'wget: error fetching ' + url + ': ' + err.message; - content.scrollTop = content.scrollHeight; - }); + // Simulated output — the fake terminal never performs real network I/O. + setTimeout(() => { + outLine.textContent = simulatedWgetOutput(url); + content.scrollTop = content.scrollHeight; + }, 400); } else if (cmdText.startsWith('apt ')) { const pkg = cmdText.replace(/^apt\s+/, ''); const outLine = document.createElement('div'); diff --git a/tests/e2e/02-terminal.spec.js b/tests/e2e/02-terminal.spec.js index 6e1e83b..2bb1a3f 100644 --- a/tests/e2e/02-terminal.spec.js +++ b/tests/e2e/02-terminal.spec.js @@ -267,6 +267,39 @@ test.describe('Fake terminal — state and special commands', () => { await expect(page.locator('body input')).toHaveCount(1); }); + // Regression guard for audit finding M-2: curl/wget used to `fetch()` the + // URL typed by the visitor — a client-side request-forgery primitive. + // They must render simulated output and touch the network zero times. + test('curl/wget are simulated — no real network request leaves the origin', async ({ page }, testInfo) => { + // Track every request that is NOT aimed at the test origin. The origin + // is read from `baseURL` (playwright.config.js) so the two cannot drift. + const ORIGIN = testInfo.project.use.baseURL || 'http://127.0.0.1:8123'; + const external = []; + page.on('request', (r) => { + if (!r.url().startsWith(ORIGIN)) external.push(r.url()); + }); + + await typeCommand(page, 'curl https://example.com/hello'); + // achievement fires on the first curl/wget (toasts auto-remove ~4.3 s) + await expect(page.locator('.toast').filter({ hasText: 'Web Navigator' })).toBeVisible(); + const curlLine = terminalLines(page).nth(-2); + await expect(curlLine).toContainText('simulated body for https://example.com/hello'); + + await typeCommand(page, 'wget https://example.org/file.txt'); + const wgetLine = terminalLines(page).nth(-2); + await expect(wgetLine).toContainText('No real network request was made'); + await expect(wgetLine).toContainText('https://example.org/file.txt'); + + // Let the simulated 400 ms response delay (and any pre-fix fetch) settle + // before asserting that nothing ever left the origin. + await page.waitForTimeout(800); + expect(external, `requests left the origin: ${external.join(', ')}`).toEqual([]); + + // The achievement itself is persisted, not just toasted. + const stored = await page.evaluate(k => JSON.parse(localStorage.getItem(k) || '[]'), 'reese-terminal-achievements'); + expect(stored).toContain('web_navigator'); + }); + test('backspace edits the current command', async ({ page }) => { await page.keyboard.type('hostnamex'); await page.keyboard.press('Backspace');