diff --git a/.github/workflows/engine-ci.yml b/.github/workflows/engine-ci.yml index d0296260..f713fe44 100644 --- a/.github/workflows/engine-ci.yml +++ b/.github/workflows/engine-ci.yml @@ -266,7 +266,7 @@ jobs: - name: C frame AEAD (RFC 8439 + Monocypher differential, AVX2 and portable paths) run: scripts/ava1-aead-test.sh - - name: No FTX2 or ports 9113/9114 outside the payload + - name: No FTX2 or ports 9113/9114 in the repository run: make check-no-ftx2 - name: Fuzz C decoders + data-plane parsers (60 s each) diff --git a/.gitignore b/.gitignore index c89eea2d..9a31b087 100644 --- a/.gitignore +++ b/.gitignore @@ -73,7 +73,6 @@ tests/lab/elev_probe/*.elf # ─── Bench artefacts (generated on demand) ─────────────────────────────── bench/fixtures/ bench/reports/ -bench/baselines/*.tmp # ─── Logs / debug dumps ────────────────────────────────────────────────── # Anchor `logs/` and `debug/` to the repo root so the patterns don't @@ -160,7 +159,7 @@ test-results/ # # So ignore image/video files AT THE ROOT by default and name the # exceptions. Anchored with a leading slash, so real assets under -# client/icons/, client/public/ and client/src-tauri/icons/ are untouched. +# client/public/ and client/src-tauri/icons/ are untouched. /*.png /*.jpg /*.jpeg diff --git a/bench/baselines/.gitkeep b/bench/baselines/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/bench/baselines/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/client/icons/bundles/linux/hicolor/128x128/apps/ps5upload.png b/client/icons/bundles/linux/hicolor/128x128/apps/ps5upload.png deleted file mode 100644 index faa53534..00000000 Binary files a/client/icons/bundles/linux/hicolor/128x128/apps/ps5upload.png and /dev/null differ diff --git a/client/icons/bundles/linux/hicolor/16x16/apps/ps5upload.png b/client/icons/bundles/linux/hicolor/16x16/apps/ps5upload.png deleted file mode 100644 index ff40ce7c..00000000 Binary files a/client/icons/bundles/linux/hicolor/16x16/apps/ps5upload.png and /dev/null differ diff --git a/client/icons/bundles/linux/hicolor/256x256/apps/ps5upload.png b/client/icons/bundles/linux/hicolor/256x256/apps/ps5upload.png deleted file mode 100644 index 147604e5..00000000 Binary files a/client/icons/bundles/linux/hicolor/256x256/apps/ps5upload.png and /dev/null differ diff --git a/client/icons/bundles/linux/hicolor/32x32/apps/ps5upload.png b/client/icons/bundles/linux/hicolor/32x32/apps/ps5upload.png deleted file mode 100644 index ffe62941..00000000 Binary files a/client/icons/bundles/linux/hicolor/32x32/apps/ps5upload.png and /dev/null differ diff --git a/client/icons/bundles/linux/hicolor/48x48/apps/ps5upload.png b/client/icons/bundles/linux/hicolor/48x48/apps/ps5upload.png deleted file mode 100644 index 1f8e00f3..00000000 Binary files a/client/icons/bundles/linux/hicolor/48x48/apps/ps5upload.png and /dev/null differ diff --git a/client/icons/bundles/linux/hicolor/512x512/apps/ps5upload.png b/client/icons/bundles/linux/hicolor/512x512/apps/ps5upload.png deleted file mode 100644 index 93b85a4d..00000000 Binary files a/client/icons/bundles/linux/hicolor/512x512/apps/ps5upload.png and /dev/null differ diff --git a/client/icons/bundles/linux/hicolor/64x64/apps/ps5upload.png b/client/icons/bundles/linux/hicolor/64x64/apps/ps5upload.png deleted file mode 100644 index 93e9e428..00000000 Binary files a/client/icons/bundles/linux/hicolor/64x64/apps/ps5upload.png and /dev/null differ diff --git a/client/icons/bundles/macos/icon.icns b/client/icons/bundles/macos/icon.icns deleted file mode 100644 index 333bec5b..00000000 Binary files a/client/icons/bundles/macos/icon.icns and /dev/null differ diff --git a/client/icons/bundles/windows/icon.ico b/client/icons/bundles/windows/icon.ico deleted file mode 100644 index 9ca149df..00000000 Binary files a/client/icons/bundles/windows/icon.ico and /dev/null differ diff --git a/client/icons/linux/icon_128x128.png b/client/icons/linux/icon_128x128.png deleted file mode 100644 index ffb8e407..00000000 Binary files a/client/icons/linux/icon_128x128.png and /dev/null differ diff --git a/client/icons/linux/icon_16x16.png b/client/icons/linux/icon_16x16.png deleted file mode 100644 index 3b072a50..00000000 Binary files a/client/icons/linux/icon_16x16.png and /dev/null differ diff --git a/client/icons/linux/icon_256x256.png b/client/icons/linux/icon_256x256.png deleted file mode 100644 index 04097fa0..00000000 Binary files a/client/icons/linux/icon_256x256.png and /dev/null differ diff --git a/client/icons/linux/icon_32x32.png b/client/icons/linux/icon_32x32.png deleted file mode 100644 index 80f49542..00000000 Binary files a/client/icons/linux/icon_32x32.png and /dev/null differ diff --git a/client/icons/linux/icon_48x48.png b/client/icons/linux/icon_48x48.png deleted file mode 100644 index 89084896..00000000 Binary files a/client/icons/linux/icon_48x48.png and /dev/null differ diff --git a/client/icons/linux/icon_512x512.png b/client/icons/linux/icon_512x512.png deleted file mode 100644 index f6ad071f..00000000 Binary files a/client/icons/linux/icon_512x512.png and /dev/null differ diff --git a/client/icons/linux/icon_64x64.png b/client/icons/linux/icon_64x64.png deleted file mode 100644 index 7fcc7ae6..00000000 Binary files a/client/icons/linux/icon_64x64.png and /dev/null differ diff --git a/client/icons/macos/icon_1024x1024.png b/client/icons/macos/icon_1024x1024.png deleted file mode 100644 index 885df873..00000000 Binary files a/client/icons/macos/icon_1024x1024.png and /dev/null differ diff --git a/client/icons/macos/icon_128x128.png b/client/icons/macos/icon_128x128.png deleted file mode 100644 index ffb8e407..00000000 Binary files a/client/icons/macos/icon_128x128.png and /dev/null differ diff --git a/client/icons/macos/icon_16x16.png b/client/icons/macos/icon_16x16.png deleted file mode 100644 index 3b072a50..00000000 Binary files a/client/icons/macos/icon_16x16.png and /dev/null differ diff --git a/client/icons/macos/icon_256x256.png b/client/icons/macos/icon_256x256.png deleted file mode 100644 index 04097fa0..00000000 Binary files a/client/icons/macos/icon_256x256.png and /dev/null differ diff --git a/client/icons/macos/icon_32x32.png b/client/icons/macos/icon_32x32.png deleted file mode 100644 index 80f49542..00000000 Binary files a/client/icons/macos/icon_32x32.png and /dev/null differ diff --git a/client/icons/macos/icon_512x512.png b/client/icons/macos/icon_512x512.png deleted file mode 100644 index f6ad071f..00000000 Binary files a/client/icons/macos/icon_512x512.png and /dev/null differ diff --git a/client/icons/macos/icon_64x64.png b/client/icons/macos/icon_64x64.png deleted file mode 100644 index 7fcc7ae6..00000000 Binary files a/client/icons/macos/icon_64x64.png and /dev/null differ diff --git a/client/icons/windows/icon_128x128.png b/client/icons/windows/icon_128x128.png deleted file mode 100644 index ffb8e407..00000000 Binary files a/client/icons/windows/icon_128x128.png and /dev/null differ diff --git a/client/icons/windows/icon_16x16.png b/client/icons/windows/icon_16x16.png deleted file mode 100644 index 3b072a50..00000000 Binary files a/client/icons/windows/icon_16x16.png and /dev/null differ diff --git a/client/icons/windows/icon_256x256.png b/client/icons/windows/icon_256x256.png deleted file mode 100644 index 04097fa0..00000000 Binary files a/client/icons/windows/icon_256x256.png and /dev/null differ diff --git a/client/icons/windows/icon_32x32.png b/client/icons/windows/icon_32x32.png deleted file mode 100644 index 80f49542..00000000 Binary files a/client/icons/windows/icon_32x32.png and /dev/null differ diff --git a/client/icons/windows/icon_48x48.png b/client/icons/windows/icon_48x48.png deleted file mode 100644 index 89084896..00000000 Binary files a/client/icons/windows/icon_48x48.png and /dev/null differ diff --git a/client/icons/windows/icon_64x64.png b/client/icons/windows/icon_64x64.png deleted file mode 100644 index 7fcc7ae6..00000000 Binary files a/client/icons/windows/icon_64x64.png and /dev/null differ diff --git a/engine/crates/ps5upload-ava1/src/mgmt_convert.rs b/engine/crates/ps5upload-ava1/src/mgmt_convert.rs index aa208bec..17338f70 100644 --- a/engine/crates/ps5upload-ava1/src/mgmt_convert.rs +++ b/engine/crates/ps5upload-ava1/src/mgmt_convert.rs @@ -404,8 +404,8 @@ mod tests { } /// `/api/ps5/status` is the legacy JSON rebuilt from `NodeStatus`: the keys that scripts and - /// the client read are all there (`bench/resume-test.mjs` and `tests/install-fallback-hw.mjs` - /// read `version` and `command_count`), and the six old transaction fields are not. + /// the client read are all there (`bench/resume-test.mjs` reads `version` and + /// `command_count`), and the six old transaction fields are not. #[test] fn the_status_json_keeps_the_keys_callers_read_and_drops_the_transaction_ones() { let v = node_status_json(&NodeStatus::default()); diff --git a/protocol/ava1/SPEC.md b/protocol/ava1/SPEC.md index 6dcf613e..b600f4ad 100644 --- a/protocol/ava1/SPEC.md +++ b/protocol/ava1/SPEC.md @@ -374,7 +374,7 @@ normative table; the second column names the constant in the generated code. | 19 | `ERR_PAIRING_CODE` | a client-side refusal of the pairing: the console refused the typed code, or could not prove it knows it (§5.5) | 7.3 Management methods (the console operations FTX2 carried on :9114). Numbers are assigned by -block; the tracked list, one row per FTX2 frame with its payload handler and engine caller, is +block; the tracked list, one row per method with its payload handler and engine caller, is `MGMT_METHODS.md`. The generated constants `METHOD_*` in `schema/ava1.toml` are normative. | numbers | block | bodies | @@ -605,11 +605,6 @@ Not in version 1, each with its reason: - Engine ↔ engine sharing: `host::FolderHost` exists as the receiving half, the sharing policy and the feature are deferred. - Zstd bundles and small-file deduplication: ruled out of project 2. -- Zip entries larger than 256 MiB (`ZIP_MAX_ENTRY`) as AVA1 sources: entries are inflated - on demand and there is no streaming entry reader yet, so an archive with a larger entry stays - on FTX2. -- 7z and RAR sources: their decoders are forward-only, so there is no random-access `Source` - for them; they stay on FTX2 until project 3. - Full re-verification of durable groups on resume: §13.4 re-hashes only the last durable batch of each partial file and trusts older groups to the journal. - Sources of unknown length: every file's size must be known when the manifest is built. @@ -1177,9 +1172,8 @@ non-Unix hosts carry none). 0 means the archive has none. Directory mtimes are 0 and `0755` for directories: archives' Unix permission bits are not carried (zip's `unix_mode` excepted). 17.6 Refusals. A duplicate name, a path that is both a file and a directory (and, for RAR, two names that differ -only in case) fail the job terminally (`ava1_7z_unsupported`, `ava1_rar_unsupported`); only an unsupported 7z -coder method falls back to FTX2, since FTX2 has the same problem with the others (it writes both duplicates, or -hits the same decoder memory limit). A RAR's listing order is compared with its extraction order only when a +only in case) fail the job terminally (`ava1_7z_unsupported`, `ava1_rar_unsupported`), and so does an +unsupported 7z coder method (`7z_unsupported`). A RAR's listing order is compared with its extraction order only when a non-solid resume skips entries by position; any other pass binds entries by path. ## 18. Console to console diff --git a/scripts/audit-scripts.mjs b/scripts/audit-scripts.mjs index 593078f6..027a5c1d 100755 --- a/scripts/audit-scripts.mjs +++ b/scripts/audit-scripts.mjs @@ -9,6 +9,8 @@ const strict = process.argv.includes("--strict"); const manualEntrypoints = new Set([ "scripts/bundle-fonts.py", "scripts/find-orphan-i18n.mjs", + // Research tool for comparing a built package against a reference one by hand. + "scripts/fpkg-diff.py", "scripts/hw-test-loop.sh", "scripts/i18n-fill-missing.mjs", "scripts/i18n-prune-unused.mjs", @@ -30,7 +32,8 @@ function countRefs(needle, haystackFiles) { const base = path.basename(needle); let refs = 0; for (const file of haystackFiles) { - if (file === "scripts/audit-scripts.mjs") continue; + // A script naming itself (usage text, a docstring) is not a reference. + if (file === "scripts/audit-scripts.mjs" || file === needle) continue; try { const text = fs.readFileSync(path.join(repoRoot, file), "utf8"); if (text.includes(base)) refs += 1; diff --git a/scripts/mobile-audit-allowlist.json b/scripts/mobile-audit-allowlist.json deleted file mode 100644 index 18140ade..00000000 --- a/scripts/mobile-audit-allowlist.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "_comment": "Accepted exceptions for scripts/mobile-audit-probe.mjs, keyed by route then element key. Mirrors scripts/i18n-known-missing.json. Every entry needs a reason in _reasons — an unexplained allowlist entry is how a real defect gets buried.", - "routes": {}, - "_reasons": {} -} diff --git a/scripts/mobile-audit-probe.mjs b/scripts/mobile-audit-probe.mjs deleted file mode 100644 index d6307557..00000000 --- a/scripts/mobile-audit-probe.mjs +++ /dev/null @@ -1,266 +0,0 @@ -#!/usr/bin/env node -/* - * Mobile sizing audit — measurement logic. - * - * Walks the app at Android's viewport and reports layout defects that - * are invisible in code review but obvious on a phone: - * - * 1. Interactive elements below the 44x44px touch floor - * (docs/v5-mobile-design.md §4.1). - * 2. Nested scroll containers — a scrollable element inside another. - * This is the defect class that made the old More sheet unusable. - * 3. Horizontal overflow of the document. - * - * DRIVER-AGNOSTIC BY DESIGN. This module holds the probe and the report - * formatting; it does NOT depend on Playwright, because the repo's root - * package.json deliberately carries zero devDependencies and a browser - * driver would add a ~500MB download to every dev machine and CI runner. - * - * Two ways to run it: - * - * a) Inject `PROBE_SOURCE` into any browser automation you already - * have (the probe is self-contained — no closures, no imports) and - * feed the results to `summarize()`. - * - * b) Install Playwright and run this file directly: - * npm i -D playwright && npx playwright install chromium - * node scripts/mobile-audit-probe.mjs - * It exits 0 when clean, 1 when there are findings. - * - * LIMITATION: this measures the BROWSER build at Android's viewport. It - * catches layout, sizing and overflow. It does NOT catch WebView-specific - * rendering, real touch behaviour, or device-reported safe-area insets. - * Confirm on hardware with `adb exec-out screencap -p`. - */ -import { readFileSync } from "node:fs"; - -/** Pixel 9 Pro XL: 1344x2992 physical at density 480 → 448x997 CSS px. */ -export const VIEWPORT = { width: 448, height: 997 }; - -/** WCAG 2.5.5 / mobile-design §4.1. */ -export const MIN_TARGET = 44; - -/** Every route reachable from the nav catalogue, plus the tab roots. */ -export const ROUTES = [ - "/home", "/connection", "/whats-new", "/dashboard", "/more", "/payloads", - "/upload", "/install-package", "/saves", "/screenshots", "/videos", - "/games", "/installed", "/files", "/search", "/volumes", "/disk-usage", - "/console", "/processes", "/profile", "/fan-curve", "/remote-play", - "/notifications", "/cheats", "/game-activity", "/sdk-changer", "/tmdb", - "/fw-spoof", "/ftp-server", "/smb-browser", "/backup", "/nanodns", - "/shell", "/tasks", "/stats", "/logs", "/audit-log", "/bug-report", - "/faq", "/settings", "/about", -]; - -/** - * Runs INSIDE the page. Self-contained on purpose so it can be injected - * as a string by any driver — do not reference module scope from here. - * - * Scoped to
so the persistent chrome (bottom nav, top bar) is - * measured once on its own rather than re-reported on all 41 routes. - */ -export function probe(minTarget) { - const SEL = - 'a, button, [role="button"], input, select, textarea, [tabindex]:not([tabindex="-1"])'; - - const isVisible = (el) => { - const r = el.getBoundingClientRect(); - if (r.width === 0 || r.height === 0) return false; - const s = getComputedStyle(el); - return ( - s.display !== "none" && s.visibility !== "hidden" && s.opacity !== "0" - ); - }; - - const labelOf = (el) => - ( - el.getAttribute("aria-label") || - el.textContent || - el.getAttribute("placeholder") || - "" - ) - .trim() - .replace(/\s+/g, " ") - .slice(0, 40); - - /** Short, reasonably stable key for allowlisting. */ - const keyOf = (el) => { - const cls = (el.getAttribute("class") || "") - .split(/\s+/) - .filter(Boolean) - .slice(0, 2) - .join("."); - return el.tagName.toLowerCase() + (cls ? "." + cls : ""); - }; - - /** - * Effective tap rect. - * - * A checkbox or radio is drawn at ~20px on purpose — drawing it at - * 44px looks wrong. What the user actually taps is the control PLUS - * its associated