Add SteamVR and SteamOS mirror checks

This commit is contained in:
seanbetts committed 2026-05-04 19:40:28 +01:00
1 parent b43753f4df
commit f917cc3052
13 files changed
+660 -44

No files matched your search

+27 -4
View File
@@ -9,6 +9,7 @@ Agent-oriented monitoring workflow for rumored or upcoming Valve hardware, focus
It is designed to be run by a coding agent through the included `SKILL.md`, with scripts that:
- check `Komodo`, `SteamDB`, `SteamTracking`, and Valve endpoints
- check `SteamVR` depot metadata and the public SteamOS package mirror
- save raw artifacts for each run
- compare against the previous run
- draft a human-readable status update
@@ -127,10 +128,12 @@ Each run writes:
- `run-summary.md`
- `status-draft.md`
- visual asset ledgers:
- `discovered-visual-assets.tsv`
- `retrieved-visual-assets.tsv`
- `blocked-visual-assets.tsv`
- `manual-asset-urls.txt`
- `discovered-visual-assets.tsv`
- `retrieved-visual-assets.tsv`
- `blocked-visual-assets.tsv`
- `manual-asset-urls.txt`
- `steamvr-depots-key-lines.txt`
- `steamos-mirror-key-lines.txt`
The main human-readable file is:
@@ -348,10 +351,30 @@ STEAMDB_CDP_ENDPOINT=http://127.0.0.1:PORT
STEAMDB_BROWSER_CHANNEL=chrome
```
## SteamVR And SteamOS Datamining
The wrapper also checks two lower-level sources:
- `scripts/check_steamvr_depots.sh` saves SteamVR app `250820` metadata and scans local SteamVR install/depot snapshots when available.
- `scripts/check_steamos_mirror.sh` saves public SteamOS package mirror metadata and extracts package names from selected `holo` and `jupiter` repos by default.
Useful knobs:
```sh
STEAMVR_SCAN_DIRS="/path/to/SteamVR /path/to/depot_snapshot"
STEAMOS_MIRROR_REPOS="holo-3.8 holo-main jupiter-3.8 jupiter-main"
```
Set `STEAMOS_MIRROR_REPOS` to include `core`, `extra`, or `multilib` repos when you want a broader but noisier package pass.
SteamVR content is distributed through SteamPipe depots rather than the SteamOS package mirror. Use the generated `steamvr-depot-download-candidates.txt` as a reminder of the high-yield depot IDs, then fill in manifest IDs from SteamDB before downloading old snapshots with Steam's depot tools.
## Current Known Limits
- `Komodo` can block both `curl` and fresh browser automation.
- `SteamDB` can return a Cloudflare browser challenge to curl and fresh automated browser contexts.
- `SteamVR` depot contents require a Steam install, Steam console, SteamCMD, or another depot downloader; the helper does not download large depots by default.
- The SteamOS mirror is public, but package names are not proof of product launch state without corroborating evidence.
- We can currently discover and report blocked media URLs even when we cannot download them automatically.
- Exported storage state may still be insufficient for Cloudflare-protected Komodo assets.
- Live trusted browser attach is currently the strongest repeatable fallback for protected Komodo media.
+38 -5
View File
@@ -49,6 +49,8 @@ Use the source helpers when available:
- [scripts/check_komodo.sh](scripts/check_komodo.sh)
- [scripts/check_steamdb.sh](scripts/check_steamdb.sh)
- [scripts/check_steamtracking.sh](scripts/check_steamtracking.sh)
- [scripts/check_steamvr_depots.sh](scripts/check_steamvr_depots.sh)
- [scripts/check_steamos_mirror.sh](scripts/check_steamos_mirror.sh)
- [scripts/check_valve_endpoints.sh](scripts/check_valve_endpoints.sh)
- [scripts/compare_runs.py](scripts/compare_runs.py)
- [scripts/save_visual_assets.py](scripts/save_visual_assets.py)
@@ -75,8 +77,10 @@ Default source order:
1. `Komodo`
2. `SteamDB`
3. `SteamTracking / GameTracking`
4. `Valve support / store / CDN`
5. `customs / regulatory`
4. `SteamVR depots`
5. `SteamOS package mirror`
6. `Valve support / store / CDN`
7. `customs / regulatory`
Treat price and exact release date as unconfirmed unless directly exposed by a primary source.
@@ -158,7 +162,36 @@ Look for:
Only summarize findings that materially affect launch-readiness or architecture inference.
### 4. Valve Support / Store / CDN
### 4. SteamVR Depots
Check SteamVR app `250820` metadata and any local SteamVR install or downloaded depot snapshots.
Watch for:
- branch/build movement on `public`, `beta`, and `previous`
- new or changed SteamVR Linux/content depots
- dashboard, settings, driver, render model, localization, and web UI strings
- `Steam Frame`, `Frame`, `Deckard`, `Roy`, `XR`, `VR`, `Steam Link VR`, `dongle`, and controller ecosystem terms
Use [scripts/check_steamvr_depots.sh](scripts/check_steamvr_depots.sh). By default it saves public metadata and scans a local SteamVR install if one exists. Set `STEAMVR_SCAN_DIRS` to one or more local install/depot snapshot directories when deeper datamining is needed.
Treat SteamVR depot content as especially high-signal for `Steam Frame` and VR controller clues.
### 5. SteamOS Package Mirror
Check Valve's public SteamOS Arch package mirror.
Watch for:
- new top-level repo namespaces, especially product-specific repos beyond `holo` and `jupiter`
- `holo-main` versus versioned `holo-*` changes
- `jupiter-main` versus versioned `jupiter-*` changes
- source package movement under `sources/`
- `Fremont`, `Deckard`, `Steam Frame`, `Roy`, `Ibex`, `Triton`, `Lilac`, `XR`, `VR`, `dongle`, firmware, ARM, Snapdragon, or controller terms
Use [scripts/check_steamos_mirror.sh](scripts/check_steamos_mirror.sh). Treat `jupiter` as Steam Deck-specific unless a file or package explicitly mentions another codename. Treat the mirror as stronger evidence for OS/platform integration than for product naming.
### 6. Valve Support / Store / CDN
Run these every time if quick:
@@ -172,7 +205,7 @@ Save any newly exposed files.
The helper script is intentionally conservative. Add extra URLs when new official pages appear.
Do not treat generic Steam Deck site media as relevant unless it is directly tied to controller, machine, or frame evidence.
### 5. Customs / Regulatory
### 7. Customs / Regulatory
Run when:
@@ -249,7 +282,7 @@ Use [scripts/run_watch.sh](scripts/run_watch.sh) for the normal path.
It will:
1. initialize the run folder
2. run the Komodo, SteamDB, SteamTracking, and Valve endpoint checks
2. run the Komodo, SteamDB, SteamTracking, SteamVR depot, SteamOS mirror, and Valve endpoint checks
3. auto-detect the previous run folder when possible
4. write a comparison report into the current run folder
5. save discovered visual assets into the current run folder
+69
View File
@@ -58,6 +58,72 @@ Useful search terms:
- `pair`
- `firmware`
## SteamVR Depots
SteamVR is Steam app `250820`.
- SteamDB depots page: `https://steamdb.info/app/250820/depots/`
- official news API: `https://api.steampowered.com/ISteamNews/GetNewsForApp/v2/?appid=250820&count=40&maxlength=12000&format=json`
High-yield depots:
- `250821`: Windows OpenVR Win32
- `250823`: Linux OpenVR Linux
- `250824`: Windows/Linux OpenVR Content
- `250827`: Windows/Linux OpenVR Content 2
- `250830`: SteamVR Environments Content
- `250831`: SteamVR Environments Windows
- `250832`: SteamVR Environments Linux
Useful search terms:
- `Steam Frame`
- `Frame`
- `Deckard`
- `Roy`
- `Triton`
- `Ibex`
- `Puck`
- `Steam Link VR`
- `dongle`
- `activeFrame`
- `summonOverlayKey`
- `XR`
- `VR`
## SteamOS Package Mirror
- root mirror: `https://steamdeck-packages.steamos.cloud/archlinux-mirror/`
- source mirror: `https://steamdeck-packages.steamos.cloud/archlinux-mirror/sources/`
High-yield repos:
- `holo-main`
- `holo-3.8`
- `jupiter-main`
- `jupiter-3.8`
- `core-main`
- `extra-main`
- `multilib-main`
Useful search terms:
- `Fremont`
- `Deckard`
- `Steam Frame`
- `Roy`
- `Ibex`
- `Triton`
- `Lilac`
- `XR`
- `VR`
- `dongle`
- `firmware`
- `aarch64`
- `arm64`
- `qcom`
- `snapdragon`
## Valve Endpoints
Check for newly exposed assets or support flows:
@@ -75,6 +141,9 @@ Check for newly exposed assets or support flows:
Use as confirmation when primary signals move:
- customs and import records
- NBD Valve Corporation public company page: `https://en.nbd.ltd/trader/info/NBDD3Y527621220`
- NBD buyer search for Valve Corporation: `https://en.nbd.ltd/customs-data?t=2&v=Valve%20Corporation`
- ImportGenius Ingram Micro C/O Valve Corporation page: `https://www.importgenius.cn/importers/ingram-micro-c-o-valve-corporation`
- FCC
- Bluetooth SIG
- Wi-Fi Alliance
+111
View File
@@ -0,0 +1,111 @@
#!/bin/sh
set -eu
if [ "$#" -lt 1 ]; then
echo "usage: $0 RUN_DIR" >&2
exit 1
fi
RUN_DIR="$1"
BASE_URL="${STEAMOS_MIRROR_BASE_URL:-https://steamdeck-packages.steamos.cloud/archlinux-mirror}"
REPOS="${STEAMOS_MIRROR_REPOS:-holo-3.8 holo-main jupiter-3.8 jupiter-main}"
TERMS="${STEAMOS_MIRROR_TERMS:-fremont|deckard|steam frame|frame|roy|triton|ibex|puck|lilac|xr|qcom|snapdragon|aarch64|arm64|controller|dongle|firmware|foxnet}"
OUT_DIR="$RUN_DIR/api/steamos-mirror"
REPORT_DIR="$RUN_DIR/reports"
EXTRACT_DIR="$RUN_DIR/extracted/steamos-mirror"
mkdir -p "$OUT_DIR" "$REPORT_DIR" "$EXTRACT_DIR"
ERROR_FILE="$REPORT_DIR/steamos-mirror-errors.txt"
ALL_REPOS="$REPORT_DIR/steamos-mirror-repos.txt"
INTERESTING_REPOS="$REPORT_DIR/steamos-mirror-interesting-repos.txt"
PACKAGES="$REPORT_DIR/steamos-mirror-packages.tsv"
KEY_LINES="$REPORT_DIR/steamos-mirror-key-lines.txt"
: > "$ERROR_FILE"
: > "$ALL_REPOS"
: > "$INTERESTING_REPOS"
: > "$PACKAGES"
: > "$KEY_LINES"
fetch() {
name="$1"
url="$2"
out="$OUT_DIR/$name"
if ! curl -A 'Mozilla/5.0' --retry 2 --retry-delay 2 --max-time 45 -fsSL "$url" > "$out" 2>/dev/null; then
printf '%s\n' "failed to fetch $url" >> "$ERROR_FILE"
rm -f "$out"
return 1
fi
}
extract_repo_links() {
path="$1"
if [ ! -f "$path" ]; then
return 0
fi
rg -o 'href="[^"]+/"' "$path" \
| sed 's/^href="//; s|/"$||; s|/$||' \
| awk '$0 != ".." && $0 != "Parent directory" { print }' || true
}
parse_desc_files() {
repo="$1"
dir="$2"
find "$dir" -name desc -print | while IFS= read -r desc; do
awk -v repo="$repo" '
/^%NAME%$/ { getline name }
/^%VERSION%$/ { getline version }
END {
if (name != "" && version != "") {
print repo "\t" name "\t" version
}
}
' "$desc"
done
}
fetch "root.html" "$BASE_URL/" || true
fetch "sources-root.html" "$BASE_URL/sources/" || true
{
extract_repo_links "$OUT_DIR/root.html"
extract_repo_links "$OUT_DIR/sources-root.html" | sed 's|^|sources/|'
} | sort -u > "$ALL_REPOS"
rg -i "$TERMS" "$ALL_REPOS" > "$INTERESTING_REPOS" || true
for repo in $REPOS; do
db_name="$repo.db"
if ! fetch "$db_name" "$BASE_URL/$repo/os/x86_64/$db_name"; then
continue
fi
repo_extract="$EXTRACT_DIR/$repo"
rm -rf "$repo_extract"
mkdir -p "$repo_extract"
if command -v bsdtar >/dev/null 2>&1; then
if bsdtar -xf "$OUT_DIR/$db_name" -C "$repo_extract" 2>>"$ERROR_FILE"; then
parse_desc_files "$repo" "$repo_extract" >> "$PACKAGES"
else
printf '%s\n' "failed to extract package database for $repo" >> "$ERROR_FILE"
fi
else
printf '%s\n' "missing bsdtar; cannot extract package database for $repo" >> "$ERROR_FILE"
fi
done
sort -u "$PACKAGES" -o "$PACKAGES"
{
rg -i "$TERMS" "$PACKAGES" || true
rg -i "$TERMS" "$INTERESTING_REPOS" || true
} > "$KEY_LINES"
printf '%s\n' \
"Saved SteamOS mirror metadata to $OUT_DIR" \
"Saved repository list to $ALL_REPOS" \
"Saved package list to $PACKAGES" \
"Saved matching lines to $KEY_LINES"
+119
View File
@@ -0,0 +1,119 @@
#!/bin/sh
set -eu
if [ "$#" -lt 1 ]; then
echo "usage: $0 RUN_DIR" >&2
exit 1
fi
RUN_DIR="$1"
OUT_DIR="$RUN_DIR/api/steamvr-depots"
REPORT_DIR="$RUN_DIR/reports"
mkdir -p "$OUT_DIR" "$REPORT_DIR"
ERROR_FILE="$REPORT_DIR/steamvr-depots-errors.txt"
KEY_LINES="$REPORT_DIR/steamvr-depots-key-lines.txt"
LOCAL_HITS="$REPORT_DIR/steamvr-local-hits.txt"
NEWS_REPORT="$REPORT_DIR/steamvr-news.tsv"
COMMANDS="$REPORT_DIR/steamvr-depot-download-candidates.txt"
TERMS="${STEAMVR_TERMS:-fremont|deckard|steam frame|frame|roy|triton|ibex|puck|lilac|xr|qcom|snapdragon|aarch64|arm64|controller|dongle|firmware|foxnet|activeFrame|summonOverlayKey}"
: > "$ERROR_FILE"
: > "$KEY_LINES"
: > "$LOCAL_HITS"
: > "$NEWS_REPORT"
is_challenge_page() {
path="$1"
rg -qi "Checking your browser|Just a moment|Cloudflare|cf-chl|cf-browser-verification" "$path"
}
fetch_html() {
name="$1"
url="$2"
tmp="$OUT_DIR/$name.tmp"
out="$OUT_DIR/$name"
if curl -A 'Mozilla/5.0' --retry 2 --retry-delay 2 --max-time 45 -fsSL "$url" > "$tmp" 2>/dev/null \
&& ! is_challenge_page "$tmp"; then
mv "$tmp" "$out"
return 0
fi
rm -f "$tmp" "$out"
printf '%s\n' "failed to fetch $url: blocked or challenge page" >> "$ERROR_FILE"
return 1
}
fetch_json() {
name="$1"
url="$2"
out="$OUT_DIR/$name"
if ! curl -A 'Mozilla/5.0' --retry 2 --retry-delay 2 --max-time 45 -fsSL "$url" > "$out" 2>/dev/null; then
printf '%s\n' "failed to fetch $url" >> "$ERROR_FILE"
rm -f "$out"
return 1
fi
}
fetch_html "steamdb-depots.html" "https://steamdb.info/app/250820/depots/" || true
fetch_json "steamvr-news.json" "https://api.steampowered.com/ISteamNews/GetNewsForApp/v2/?appid=250820&count=40&maxlength=12000&format=json" || true
if [ -f "$OUT_DIR/steamvr-news.json" ] && command -v jq >/dev/null 2>&1; then
jq -r '
.appnews.newsitems[]
| [
(try (.date | todate) catch (.date | tostring)),
.title,
((.contents // "") | gsub("[\r\n\t]+"; " ") | .[0:360])
]
| @tsv
' "$OUT_DIR/steamvr-news.json" > "$NEWS_REPORT" 2>>"$ERROR_FILE" || true
fi
cat > "$COMMANDS" <<'EOF'
# SteamVR AppID: 250820
# Fill in manifest IDs from SteamDB before running Steam's console download_depot command.
download_depot 250820 250821 <manifest_id> # Windows OpenVR Win32
download_depot 250820 250823 <manifest_id> # Linux OpenVR Linux
download_depot 250820 250824 <manifest_id> # Windows/Linux OpenVR Content
download_depot 250820 250827 <manifest_id> # Windows/Linux OpenVR Content 2
download_depot 250820 250830 <manifest_id> # SteamVR Environments Content
download_depot 250820 250831 <manifest_id> # SteamVR Environments Windows
download_depot 250820 250832 <manifest_id> # SteamVR Environments Linux
EOF
SCAN_DIRS="${STEAMVR_SCAN_DIRS:-}"
DEFAULT_STEAMVR_DIR="$HOME/Library/Application Support/Steam/steamapps/common/SteamVR"
if [ -z "$SCAN_DIRS" ] && [ -d "$DEFAULT_STEAMVR_DIR" ]; then
SCAN_DIRS="$DEFAULT_STEAMVR_DIR"
fi
if [ -n "$SCAN_DIRS" ]; then
for scan_dir in $SCAN_DIRS; do
if [ -d "$scan_dir" ]; then
rg -n -i "$TERMS" "$scan_dir" >> "$LOCAL_HITS" || true
else
printf '%s\n' "missing SteamVR scan dir: $scan_dir" >> "$ERROR_FILE"
fi
done
fi
{
if [ -f "$OUT_DIR/steamdb-depots.html" ]; then
rg -n -i "$TERMS|Build ID|Time Updated|250821|250823|250824|250827|250830|public|beta|previous" "$OUT_DIR/steamdb-depots.html" || true
fi
if [ -s "$NEWS_REPORT" ]; then
rg -n -i "$TERMS|OpenXR|dashboard|overlay|firmware" "$NEWS_REPORT" || true
fi
if [ -s "$LOCAL_HITS" ]; then
cat "$LOCAL_HITS"
fi
} > "$KEY_LINES"
printf '%s\n' \
"Saved SteamVR depot metadata to $OUT_DIR" \
"Saved local SteamVR hits to $LOCAL_HITS" \
"Saved matching lines to $KEY_LINES" \
"Saved candidate download commands to $COMMANDS"
+2
View File
@@ -123,6 +123,8 @@ def build_summary(prev_dir: Path, curr_dir: Path):
deltas.extend(compare_report_sets(prev_dir, curr_dir, "Komodo machine media", "komodo-machine-media.tsv"))
deltas.extend(compare_report_sets(prev_dir, curr_dir, "Komodo frame media", "komodo-frame-media.tsv"))
deltas.extend(compare_text_lines(prev_dir, curr_dir, "SteamDB", "steamdb-key-lines.txt"))
deltas.extend(compare_text_lines(prev_dir, curr_dir, "SteamVR depots", "steamvr-depots-key-lines.txt"))
deltas.extend(compare_text_lines(prev_dir, curr_dir, "SteamOS mirror", "steamos-mirror-key-lines.txt"))
deltas.extend(compare_text_lines(prev_dir, curr_dir, "Valve endpoint", "valve-key-lines.txt"))
if deltas:
+20
View File
@@ -49,12 +49,16 @@ def build_draft(run_dir: Path):
steamdb_lines = first_n_nonempty(reports / "steamdb-key-lines.txt", 8)
valve_lines = first_n_nonempty(reports / "valve-key-lines.txt", 8)
tracking_lines = first_n_nonempty(reports / "steamtracking-pairing-focus.txt", 8)
steamvr_lines = first_n_nonempty(reports / "steamvr-depots-key-lines.txt", 8)
steamos_lines = first_n_nonempty(reports / "steamos-mirror-key-lines.txt", 8)
discovered_count = count_lines(reports / "discovered-visual-assets.tsv")
retrieved_count = count_lines(reports / "retrieved-visual-assets.tsv")
blocked_count = count_lines(reports / "blocked-visual-assets.tsv")
manual_urls = blocked_asset_urls(reports / "blocked-visual-assets.tsv", 10)
komodo_blocked = has_nonempty(reports / "komodo-errors.txt")
steamdb_blocked = has_nonempty(reports / "steamdb-errors.txt")
steamvr_blocked = has_nonempty(reports / "steamvr-depots-errors.txt")
steamos_blocked = has_nonempty(reports / "steamos-mirror-errors.txt")
valve_blocked = has_nonempty(reports / "valve-errors.txt")
lines = [
@@ -105,6 +109,22 @@ def build_draft(run_dir: Path):
else:
lines.append("- No focused SteamTracking report found.")
lines.extend(["", "#### SteamVR Depots"])
if steamvr_blocked:
lines.append("- SteamVR depot metadata was blocked or partially unavailable in this run. See `steamvr-depots-errors.txt`.")
if steamvr_lines:
lines.extend([f"- `{line}`" for line in steamvr_lines])
elif not steamvr_blocked:
lines.append("- No SteamVR depot key-line report found.")
lines.extend(["", "#### SteamOS Package Mirror"])
if steamos_blocked:
lines.append("- SteamOS package mirror metadata was blocked or partially unavailable in this run. See `steamos-mirror-errors.txt`.")
if steamos_lines:
lines.extend([f"- `{line}`" for line in steamos_lines])
elif not steamos_blocked:
lines.append("- No SteamOS mirror key-line report found.")
lines.extend(["", "#### Valve Support / CDN"])
if valve_blocked:
lines.append("- Some Valve endpoint fetches failed in this run. See `valve-errors.txt`.")
+8
View File
@@ -37,6 +37,14 @@ if [ ! -f "$RUN_NOTE" ]; then
-
### SteamVR Depots
-
### SteamOS Package Mirror
-
### Valve Support / CDN
-
+2
View File
@@ -46,6 +46,8 @@ printf '%s\n' "Run note: $RUN_NOTE"
"$SCRIPT_DIR/check_komodo.sh" "$RUN_DIR"
"$SCRIPT_DIR/check_steamdb.sh" "$RUN_DIR"
"$SCRIPT_DIR/check_steamtracking.sh" "$RUN_DIR" "$TRACKING_DIR"
"$SCRIPT_DIR/check_steamvr_depots.sh" "$RUN_DIR"
"$SCRIPT_DIR/check_steamos_mirror.sh" "$RUN_DIR"
"$SCRIPT_DIR/check_valve_endpoints.sh" "$RUN_DIR"
python3 "$SCRIPT_DIR/save_visual_assets.py" --run-dir "$RUN_DIR" --base-dir "$BASE_DIR"
+11
View File
@@ -15,6 +15,13 @@ FILTER_TERMS = (
"2026",
"pair",
"firmware",
"fremont",
"deckard",
"roy",
"lilac",
"xr",
"vr",
"dongle",
)
REJECT_TERMS = (
"application_config",
@@ -102,6 +109,8 @@ def build(run_dir: Path):
"",
f"- Komodo blocked: `{'yes' if count(reports / 'komodo-errors.txt') else 'no'}`",
f"- SteamDB blocked: `{'yes' if count(reports / 'steamdb-errors.txt') else 'no'}`",
f"- SteamVR depot metadata blocked: `{'yes' if count(reports / 'steamvr-depots-errors.txt') else 'no'}`",
f"- SteamOS mirror metadata blocked: `{'yes' if count(reports / 'steamos-mirror-errors.txt') else 'no'}`",
f"- Valve blocked: `{'yes' if count(reports / 'valve-errors.txt') else 'no'}`",
f"- Discovered visual assets: `{discovered}`",
f"- Retrieved visual assets: `{retrieved}`",
@@ -125,6 +134,8 @@ def build(run_dir: Path):
notable = []
notable.extend([f"- SteamDB: `{line}`" for line in filtered_first(reports / "steamdb-key-lines.txt", 5)])
notable.extend([f"- SteamTracking: `{line}`" for line in filtered_first(reports / "steamtracking-pairing-focus.txt", 5)])
notable.extend([f"- SteamVR depots: `{line}`" for line in filtered_first(reports / "steamvr-depots-key-lines.txt", 5)])
notable.extend([f"- SteamOS mirror: `{line}`" for line in filtered_first(reports / "steamos-mirror-key-lines.txt", 5)])
notable.extend([f"- Valve: `{line}`" for line in filtered_first(reports / "valve-key-lines.txt", 5)])
notable.extend([f"- Asset blocked: `{line}`" for line in filtered_first(reports / "blocked-visual-assets.tsv", 5)])
+53 -35
View File
@@ -1,65 +1,83 @@
# Steam Hardware Watch Status
Last updated: `2026-04-28`
Last updated: `2026-05-04`
## Best Current Answer
- `Price`: no confirmed public price leak for the new Steam Controller, Steam Machine, or Steam Frame.
- `Release date`: official Valve store pages still support a broad `early 2026` / `coming in 2026` window, but no exact preorder, ship, or launch date was found.
- `Same-time launch`: stronger than the seeded baseline for a shared public rollout window because Valve's official Steam Hardware page groups Controller, Machine, and Frame together. Exact same-day availability is still unconfirmed, and the controller remains furthest along because the fresh Komodo movement is still controller-only.
- `Price`: Steam Controller remains confirmed by official Valve store APIs at `$99.00` in the US. Steam Machine and Steam Frame still have no confirmed public price.
- `Release date`: Steam Controller remains confirmed with release date `May 4, 2026` and package `1558609`. Steam Machine and Steam Frame still only have broad `2026` timing.
- `Same-time launch`: exact same-day availability is effectively ruled out for the full trio. Steam Controller has a purchase package and exact date; Machine and Frame still do not.
## Source Snapshot
### Komodo
- Automated Komodo API access is working again after replacing the helper's rejected generic `Mozilla/5.0` user agent with a realistic browser user agent.
- `Steam Controller`, `Steam Machine`, and `Steam Frame` are all real published WooCommerce products in a held state:
- `publish`
- `product-type-simple`
- `outofstock`
- `wishlist-only`
- On `2026-04-24`, Komodo bulk-updated product records for all three hardware lines across currencies.
- Also on `2026-04-24`, Komodo exposed a fresh controller-only section and media rollout with banner, videos, feature art, controls imagery, and a spec image.
- Rechecked on `2026-04-28`: the Controller product modified timestamp moved to `2026-04-28T18:32:11`; Machine and Frame remain at `2026-04-24T14:32:54` and `2026-04-24T14:33:36`.
- No comparable fresh Machine or Frame section and media rollout was found. Machine and Frame still only show older wishlist sections in the current Komodo search output.
- Komodo added a new Controller section, `Steam Controller - 10 Specs`, modified `2026-04-27T09:41:01`.
- Komodo updated the Controller `09 Spec image` section on `2026-04-28T19:05:51`, adding two new AVIF media records plus their generated sizes.
- Visual asset retrieval is now complete for the current Komodo set: `130` discovered and `130` retrieved. The browsable library contains `11` videos, `11` images, `3` logos, `3` poster frames, `42` thumbnails, and `60` variants.
- Automated Komodo API access was blocked on `2026-05-04`; do not treat the comparison report's Komodo section removals as real content removals.
- Automated Komodo API access worked on `2026-05-02` with the realistic browser user agent.
- `Steam Controller`, `Steam Machine`, and `Steam Frame` remain real published WooCommerce products.
- Controller product metadata moved again: modified timestamp is now `2026-04-30T19:14:10`.
- Controller remains in the sale-adjacent state seen in the prior run:
- `product_tag-wishlist-only` is absent.
- `purchasable` is present.
- `outofstock` remains.
- `product_tag` is `[112]`; tag `113` is `wishlist-only`.
- Machine and Frame remain dormant by comparison: both still carry `product_tag-wishlist-only`, remain `outofstock`, and do not have the `purchasable` class.
- Machine and Frame product modified timestamps are unchanged at `2026-04-24T14:32:54` and `2026-04-24T14:33:36`.
- Current Komodo section coverage shows Controller-only launch-page depth, with older wishlist-only sections for Machine and Frame.
- Visual asset retrieval is complete for the current Komodo set: `141` discovered and `141` retrieved, with `0` blocked. The browsable library contains `11` videos, `12` images, `3` logos, `3` poster frames, `44` thumbnails, and `68` variants.
### SteamDB
- Browser-verified SteamDB state on `2026-04-26`:
- `Steam Controller` app `4165870` remains `prerelease` with store release date `Coming soon`.
- `steam_controller_unboxing_2026` app `4653940` remains a released free video app, first seen on `2026-04-20`, with package `1620489` available as free on demand and showing `No Price`.
- The standard curl helper was still blocked by SteamDB on `2026-04-28`, so browser-style verification remains the current usable path.
- The standard SteamDB helper was still blocked by challenge pages on `2026-05-04` for app `4165870`, app history, app `4653940`, and package `1620489`.
- Browser-verified SteamDB state from `2026-04-26` is now superseded for price and date by official Valve store APIs, but remains useful for historical app/package tracking.
### SteamTracking / GameTracking
- A fresh SteamTracking checkout on `2026-04-28` still includes controller onboarding, firmware update flow, puck handling, and pairing logic for the new controller ecosystem.
- A fresh SteamTracking checkout on `2026-05-04` still includes controller onboarding, firmware update flow, puck handling, and pairing logic for the new controller ecosystem.
- Pairing-focused hits include `ibex_internal`, `ibex_external`, `PairDongleTritonConnected`, `PairDongleTritonDocked`, and `ShouldTritonPairInOobe`.
- The same Triton/Ibex pairing surface now also appears in `Random/SteamApkStrings.txt`, indicating the Steam Android APK string dump includes the controller pairing API names. This broadens the client-surface evidence, but does not introduce a new price or launch-date signal.
### SteamVR Depots
- SteamVR app `250820` news metadata was saved on `2026-05-04`.
- The SteamDB depot page for SteamVR was blocked by challenge pages, so no fresh manifest/build comparison was collected.
- The first SteamVR helper baseline found public news references to SteamVR/OpenXR/Steam Link VR, but no direct `Deckard`, `Roy`, or `Steam Frame` depot-content hit because no local SteamVR depot snapshot was available to scan.
### SteamOS Package Mirror
- Valve's public SteamOS package mirror was reachable on `2026-05-04`.
- The default `holo-3.8`, `holo-main`, `jupiter-3.8`, and `jupiter-main` package database pass produced `758` package rows and no fetch errors.
- No high-signal `Fremont`, `Deckard`, `Roy`, `Steam Frame`, `Steam Machine`, ARM/Snapdragon, or product-specific top-level repo namespace appeared in the default mirror pass.
- The notable mirror hits were Deck/Jupiter-adjacent, including `foxnet`, `foxnetstatsd`, `linux-firmware-neptune-*`, and `plasma-remotecontrollers`.
### Valve Support / CDN
- Official Valve store pages were reachable and saved on `2026-04-28`:
- `/sale/hardware` still says the Steam Hardware family expands in early 2026, lists Steam Controller, Steam Machine, and Steam Frame, and its embedded event metadata now shows `rtime32_last_modified` `2026-04-28T10:09:22Z`.
- `/sale/steamcontroller` has a dedicated Steam Controller page and its embedded event metadata now shows `rtime32_last_modified` `2026-04-28T18:31:12Z`.
- The embedded Steam Hardware submenu now points to cleaner `/hardware`, `/hardware/steamcontroller`, `/hardware/steammachine`, and `/hardware/steamframe` paths instead of the older `/sale/...` paths.
- No official Valve price, exact release date, or preorder date was found.
- Official Valve store pages were reachable and saved on `2026-05-04`.
- Official appdetails for app `4165870` still show hardware type, package `1558609`, `price_overview.final_formatted` `$99.00`, and release date `May 4, 2026`.
- Official packagedetails for package `1558609` still show USD final price `9900` cents, release date `May 4, 2026`, and page content for the Steam Controller puck, 35+ hour battery, TMR thumbsticks, haptics, and inputs.
- Steam Controller store event metadata moved again to `rtime32_last_modified` `2026-05-04T18:27:52Z`; the Steam Hardware root event moved to `2026-05-04T18:27:56Z`. The announcement body hash was unchanged, so this is metadata/json movement rather than a clear text-body change.
- Steam Machine and Steam Frame still do not have comparable official price or exact purchase timing in the checked Valve artifacts.
### Customs / Regulatory
- A quick `2026-04-26` web check did not find a new relevant Valve regulatory filing for the 2026 controller, Machine, or Frame. Results were dominated by old Steam Controller and Steam Deck records or unrelated products.
- No new customs or regulatory pass was run on `2026-05-02`; the latest saved customs evidence remains from `2026-05-01`.
- NBD's public Valve Corporation page showed latest Valve trade data dated `2026-04-04`, including a `WIRELESS PC CONTROLLER` row from `HONG KONG (CHINA)`.
- ImportGenius showed an April 23, 2026 `GAME CONSOLE .` shipment for `INGRAM MICRO C/O VALVE CORPORATION`, but that record does not identify which Valve hardware product.
- These customs records support active Valve hardware logistics, but do not prove price, exact launch date, or device-specific timing for Machine or Frame.
## Open Questions
- When will Valve publish price?
- Will preorder and ship dates differ?
- Will Steam Machine and Steam Frame share announcement timing with the controller, or trail it?
- When do comparable fresh media sets appear for Machine and Frame, if at all?
- When will Valve publish Steam Machine and Steam Frame prices?
- Will Steam Controller ship dates or purchase-state details differ by region after the `May 4, 2026` release date?
- When will Steam Machine and Steam Frame receive exact availability timing?
- When do comparable fresh media and purchasable-state changes appear for Machine and Frame, if at all?
## Next Checks
- Recheck Komodo `sections` and `media` for Machine and Frame.
- Recheck SteamDB controller app, package, and hidden media activity.
- Recheck Valve support or CDN assets for manuals, safety docs, and store-adjacent media.
- Recheck Komodo product classes/tags for Machine and Frame with browser-style fallback if normal API access remains blocked.
- Recheck SteamDB via browser-style access after the official appdetails movement.
- Watch Valve store metadata and `/hardware/...` paths for Machine and Frame price or availability fields.
- Download or point `STEAMVR_SCAN_DIRS` at SteamVR beta depot snapshots for a real depot-content diff.
- Monitor the SteamOS mirror root for new product-specific repos such as possible Machine/Frame namespaces.
- Track NBD and other customs aggregators for follow-on controller shipments and any Machine or Frame descriptions.
- Run customs or regulatory checks if a new primary-source signal appears.
+19
View File
@@ -16,3 +16,22 @@
{"date_checked":"2026-04-28","source":"komodo","entity":"steam-controller","claim":"Komodo added a new Controller specs section and updated the Controller spec-image section with two new AVIF media records.","evidence_type":"sections_media_rollout","confidence":"high","ref":"/Users/sean/steam_hardware_watch/2026-04-28/reports/komodo-controller-sections.tsv","notes":"New section 433617 / 433487 modified 2026-04-27T09:41:01; section 433484 / 433473 modified 2026-04-28T19:05:51 with new media 433664 and 433679."}
{"date_checked":"2026-04-28","source":"komodo","entity":"steam-controller","claim":"The current Komodo visual asset set is fully retrieved and organized into the media-style library.","evidence_type":"asset_retrieval","confidence":"high","ref":"/Users/sean/steam_hardware_watch/2026-04-28/assets/manifests/asset-library.json","notes":"130 discovered and 130 retrieved; library has 11 videos, 11 images, 3 logos, 3 poster frames, 42 thumbnails, and 60 variants, all classified as steam-controller."}
{"date_checked":"2026-04-28","source":"valve-store","entity":"steam-controller,steam-machine,steam-frame","claim":"Official Valve store metadata changed again, including cleaner Steam Hardware submenu URLs under /hardware while still showing only broad 2026 timing.","evidence_type":"official_store_metadata","confidence":"high","ref":"/Users/sean/steam_hardware_watch/2026-04-28/api/valve/steam-hardware-root.html","notes":"Steam Hardware event modified 2026-04-28T10:09:22Z; Controller event modified 2026-04-28T18:31:12Z; no price, preorder date, or exact launch date found."}
{"date_checked":"2026-04-30","source":"komodo","entity":"steam-controller","claim":"Komodo moved the Steam Controller product closer to a sale state by removing the wishlist-only tag and adding the purchasable class while keeping it out of stock.","evidence_type":"product_metadata_delta","confidence":"high","ref":"/Users/sean/steam_hardware_watch/2026-04-30/api/komodo/product-controller-jpy.json","notes":"Controller modified 2026-04-29T12:04:19; class_list removed product_tag-wishlist-only, added purchasable, and retained outofstock; product_tag changed from 112,113 to 112."}
{"date_checked":"2026-04-30","source":"komodo","entity":"steam-machine,steam-frame","claim":"Komodo Machine and Frame products did not receive the Controller sale-state change in this run.","evidence_type":"comparative_absence","confidence":"high","ref":"/Users/sean/steam_hardware_watch/2026-04-30/reports/komodo-product-modified.tsv","notes":"Machine and Frame remain modified 2026-04-24, still carry product_tag-wishlist-only and outofstock, and do not have purchasable."}
{"date_checked":"2026-04-30","source":"komodo","entity":"steam-controller","claim":"Komodo changed the Steam Controller featured media to a newly saved ControllerFront.webp image.","evidence_type":"featured_media_delta","confidence":"high","ref":"/Users/sean/steam_hardware_watch/2026-04-30/api/komodo/media-featured-controller-433684.json","notes":"Featured media changed from 413713 to 433684; media 433684 is ControllerFront.webp, modified 2026-04-28T19:15:27; asset library now includes the original plus generated sizes."}
{"date_checked":"2026-04-30","source":"komodo","entity":"steam-controller","claim":"Komodo updated two Controller sections, but their attached media records did not change.","evidence_type":"section_metadata_delta","confidence":"high","ref":"/Users/sean/steam_hardware_watch/2026-04-30/reports/komodo-controller-sections.tsv","notes":"Section 433356 steam-controller-04-features modified 2026-04-29T11:51:27; section 433484/433473 modified 2026-04-29T10:26:38; associated media timestamps and IDs were unchanged."}
{"date_checked":"2026-04-30","source":"valve-store","entity":"steam-controller,steam-machine,steam-frame","claim":"Official Valve store metadata moved again while still exposing no public price or exact launch date.","evidence_type":"official_store_metadata","confidence":"high","ref":"/Users/sean/steam_hardware_watch/2026-04-30/api/valve/steam-controller-store.html","notes":"Steam Hardware event modified 2026-04-30T05:57:08Z; Steam Controller event modified 2026-04-30T05:57:04Z; controller announcement updated 2026-04-29T20:58:49Z and contains sections including Availability Callout, Purchase Section, Notify me, Komodo, and Tech Specs."}
{"date_checked":"2026-04-30","source":"steamdb","entity":"steam-controller","claim":"SteamDB helper access remained blocked by challenge pages, so no fresh SteamDB metadata was collected in this automated run.","evidence_type":"blocked_fetch","confidence":"high","ref":"/Users/sean/steam_hardware_watch/2026-04-30/reports/steamdb-errors.txt","notes":"Blocked for app 4165870, app 4165870 history, app 4653940, and package 1620489; blocked-page detection prevented challenge HTML from being treated as evidence."}
{"date_checked": "2026-05-01", "source": "valve-store", "entity": "steam-controller", "claim": "Official Valve appdetails now confirm Steam Controller price and package.", "evidence_type": "official_store_api", "confidence": "high", "ref": "/Users/sean/steam_hardware_watch/2026-05-01/api/valve/appdetails-4165870-us.json", "notes": "App 4165870 type hardware; price_overview final_formatted $99.00; package 1558609; package group option text Steam Controller - $99.00."}
{"date_checked": "2026-05-01", "source": "valve-store", "entity": "steam-controller", "claim": "Official Valve store metadata confirms Steam Controller purchase availability on May 4, 2026 at 10AM Pacific.", "evidence_type": "official_store_metadata", "confidence": "high", "ref": "/Users/sean/steam_hardware_watch/2026-05-01/api/valve/steam-controller-store.html", "notes": "Availability Callout says Available for purchase May 4th, 10AM Pacific; purchase section points to reservation package 1558609; controller event modified 2026-05-01T01:16:01Z."}
{"date_checked": "2026-05-01", "source": "valve-store", "entity": "steam-controller", "claim": "Official Valve package details confirm Steam Controller package 1558609 at USD 99.00 with release date May 4, 2026.", "evidence_type": "official_store_api", "confidence": "high", "ref": "/Users/sean/steam_hardware_watch/2026-05-01/api/valve/packagedetails-1558609-us.json", "notes": "Package price final 9900 cents USD; release_date coming_soon false, date May 4, 2026."}
{"date_checked": "2026-05-01", "source": "nbd-customs", "entity": "steam-controller", "claim": "NBD public customs data shows a Valve import row dated 2026-04-04 for WIRELESS PC CONTROLLER from Hong Kong.", "evidence_type": "customs_import_record", "confidence": "medium", "ref": "/Users/sean/steam_hardware_watch/2026-05-01/api/nbd/valve-corporation.html", "notes": "NBD Company Number NBDD3Y527621220; latest trade data 2026-04-04; public row country HONG KONG (CHINA), masked counterparty C***D.; embedded payload reports April 2026 import weight 12970; free view masks detailed shipment fields."}
{"date_checked": "2026-05-01", "source": "importgenius-customs", "entity": "steam-controller,steam-machine,steam-frame", "claim": "ImportGenius lists an April 23, 2026 Ingram Micro C/O Valve Corporation shipment from Tech-Front Chongqing described as GAME CONSOLE.", "evidence_type": "customs_import_record", "confidence": "medium", "ref": "/Users/sean/steam_hardware_watch/2026-05-01/api/importgenius/ingram-micro-c-o-valve-corporation-reader.md", "notes": "Arrival 2026-04-23; BOL SNHBSHACHI264010; importer INGRAM MICRO C/O VALVE CORPORATION; supplier TECH-FRONT (CHONGQING) COMPUTER CO; product GAME CONSOLE .; 42 PKG; 12608 Kgs; container GAOU6922627; package marks include VALVE USA P/NO. references; does not identify which Valve hardware product."}
{"date_checked": "2026-05-01", "source": "nbd-customs", "entity": "steam-controller,steam-machine,steam-frame", "claim": "NBD rendered buyer searches for Valve Corporation and Ingram Micro include a masked April 23, 2026 GAME CONSOLE row.", "evidence_type": "customs_search_result", "confidence": "low", "ref": "/Users/sean/steam_hardware_watch/2026-05-01/api/nbd/search-buyers-valve-corporation-rendered.txt", "notes": "Corroborates the April 23 row at a masked search-result level; NBD buyer search also returns unrelated valve-parts rows, so use this as corroboration only."}
{"date_checked": "2026-05-02", "source": "valve-store", "entity": "steam-controller", "claim": "Official Valve APIs still confirm Steam Controller package 1558609 at USD 99.00 with release date May 4, 2026.", "evidence_type": "official_store_api_recheck", "confidence": "high", "ref": "/Users/sean/steam_hardware_watch/2026-05-02/api/valve/appdetails-4165870-us.json", "notes": "Appdetails price_overview.final_formatted remains $99.00 and package list remains 1558609; packagedetails final price remains 9900 cents USD with release_date date May 4, 2026."}
{"date_checked": "2026-05-02", "source": "valve-store", "entity": "steam-controller,steam-machine,steam-frame", "claim": "Official Valve store metadata moved again, but only Steam Controller has exact purchase timing and a purchase package.", "evidence_type": "official_store_metadata_delta", "confidence": "high", "ref": "/Users/sean/steam_hardware_watch/2026-05-02/api/valve/steam-controller-store.html", "notes": "Controller page still contains Available for purchase May 4th, 10AM Pacific and package 1558609; Controller event modified 2026-05-01T23:18:58Z; Steam Hardware root event modified 2026-05-01T22:43:47Z; no comparable Machine or Frame price/timing found."}
{"date_checked": "2026-05-02", "source": "komodo", "entity": "steam-controller,steam-machine,steam-frame", "claim": "Komodo still separates Controller readiness from Machine and Frame dormancy.", "evidence_type": "product_metadata_recheck", "confidence": "high", "ref": "/Users/sean/steam_hardware_watch/2026-05-02/reports/komodo-product-modified.tsv", "notes": "Controller modified 2026-04-30T19:14:10 and remains purchasable/outofstock without product_tag-wishlist-only; Machine and Frame remain modified 2026-04-24, outofstock, product_tag-wishlist-only, and not purchasable."}
{"date_checked": "2026-05-02", "source": "steamdb", "entity": "steam-controller", "claim": "SteamDB helper access remained blocked by challenge pages in the automated May 2 run.", "evidence_type": "blocked_fetch", "confidence": "high", "ref": "/Users/sean/steam_hardware_watch/2026-05-02/reports/steamdb-errors.txt", "notes": "Blocked for app 4165870, app 4165870 history, app 4653940, and package 1620489; no fresh SteamDB metadata was collected."}
{"date_checked": "2026-05-04", "source": "valve-store", "entity": "steam-controller,steam-machine,steam-frame", "claim": "Official Valve metadata moved on launch day while only Steam Controller still has a confirmed purchase package, price, and release date.", "evidence_type": "official_store_metadata_delta", "confidence": "high", "ref": "/Users/sean/steam_hardware_watch/2026-05-04/api/valve/steam-controller-store.html", "notes": "Steam Controller event modified 2026-05-04T18:27:52Z; Steam Hardware root modified 2026-05-04T18:27:56Z; appdetails and packagedetails still confirm package 1558609, USD $99.00, release date May 4, 2026; Machine and Frame still lack comparable price or exact timing."}
{"date_checked": "2026-05-04", "source": "steamtracking", "entity": "steam-controller", "claim": "Fresh SteamTracking checkout shows the Triton/Ibex pairing API surface in the Steam Android APK string dump as well as existing proto and web UI surfaces.", "evidence_type": "client_strings", "confidence": "medium", "ref": "/Users/sean/steam_hardware_watch/2026-05-04/reports/steamtracking-pairing-focus.txt", "notes": "Random/SteamApkStrings.txt now includes CSteamInputService_PairDongleTritonConnected, PairDongleTritonDocked, ShouldTritonPairInOobe, UnpairedTritonDocked, UnpairedTritonPluggedIn, ibex_internal, and ibex_external. This broadens client-surface evidence but does not change price or release-date confidence."}
{"date_checked": "2026-05-04", "source": "steamos-mirror", "entity": "steam-machine,steam-frame", "claim": "First default SteamOS package mirror pass did not expose direct Machine or Frame codename/package evidence.", "evidence_type": "package_mirror_baseline", "confidence": "medium", "ref": "/Users/sean/steam_hardware_watch/2026-05-04/reports/steamos-mirror-packages.tsv", "notes": "Default holo-3.8, holo-main, jupiter-3.8, and jupiter-main pass produced 758 package rows with no errors. No Fremont, Deckard, Roy, Steam Frame, Steam Machine, ARM/Snapdragon, or new product-specific top-level repo namespace appeared; notable hits were Deck/Jupiter-adjacent foxnet, linux-firmware-neptune, and plasma-remotecontrollers."}
+181
View File
@@ -0,0 +1,181 @@
import os
import stat
import subprocess
import textwrap
import unittest
from pathlib import Path
from tempfile import TemporaryDirectory
ROOT = Path(__file__).resolve().parents[1]
def write_executable(path, content):
path.write_text(textwrap.dedent(content).lstrip(), encoding="utf-8")
path.chmod(path.stat().st_mode | stat.S_IXUSR)
class CheckSteamOSMirrorTests(unittest.TestCase):
def test_fetches_repo_metadata_and_extracts_interesting_packages(self):
tmp = TemporaryDirectory()
self.addCleanup(tmp.cleanup)
tmp_path = Path(tmp.name)
run_dir = tmp_path / "run"
fake_bin = tmp_path / "bin"
fake_bin.mkdir()
write_executable(
fake_bin / "curl",
"""
#!/bin/sh
for arg in "$@"; do
url="$arg"
done
case "$url" in
*/archlinux-mirror/)
printf '%s\\n' '<a href="jupiter-main/">jupiter-main/</a><a href="holo-main/">holo-main/</a><a href="fremont-main/">fremont-main/</a>'
;;
*/archlinux-mirror/sources/)
printf '%s\\n' '<a href="jupiter-main/">jupiter-main/</a><a href="deckard-main/">deckard-main/</a>'
;;
*/jupiter-main.db|*/holo-main.db)
printf '%s\\n' 'fake db'
;;
*)
echo "unexpected url: $url" >&2
exit 22
;;
esac
""",
)
write_executable(
fake_bin / "bsdtar",
"""
#!/bin/sh
out=""
while [ "$#" -gt 0 ]; do
if [ "$1" = "-C" ]; then
shift
out="$1"
fi
shift || true
done
mkdir -p "$out/jupiter-hw-support-20260413.1-1" "$out/steam-frame-config-1-1"
cat > "$out/jupiter-hw-support-20260413.1-1/desc" <<'EOF'
%NAME%
jupiter-hw-support
%VERSION%
20260413.1-1
EOF
cat > "$out/steam-frame-config-1-1/desc" <<'EOF'
%NAME%
steam-frame-config
%VERSION%
1-1
EOF
""",
)
env = os.environ.copy()
env.update(
{
"PATH": f"{fake_bin}:{env['PATH']}",
"STEAMOS_MIRROR_REPOS": "jupiter-main holo-main",
}
)
result = subprocess.run(
[str(ROOT / "scripts" / "check_steamos_mirror.sh"), str(run_dir)],
cwd=ROOT,
env=env,
text=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=False,
)
self.assertEqual("", result.stderr)
self.assertEqual(0, result.returncode)
key_lines = (run_dir / "reports" / "steamos-mirror-key-lines.txt").read_text(
encoding="utf-8"
)
repos = (run_dir / "reports" / "steamos-mirror-interesting-repos.txt").read_text(
encoding="utf-8"
)
self.assertIn("steam-frame-config", key_lines)
self.assertIn("fremont-main", repos)
self.assertIn("deckard-main", repos)
class CheckSteamVRDepotsTests(unittest.TestCase):
def test_rejects_challenge_pages_and_scans_local_snapshots(self):
tmp = TemporaryDirectory()
self.addCleanup(tmp.cleanup)
tmp_path = Path(tmp.name)
run_dir = tmp_path / "run"
snapshot_dir = tmp_path / "steamvr"
dashboard_dir = snapshot_dir / "resources" / "webinterface"
dashboard_dir.mkdir(parents=True)
(dashboard_dir / "dashboard.js").write_text(
"const activeFrame = 'Steam Frame'; const codename = 'Deckard';",
encoding="utf-8",
)
fake_bin = tmp_path / "bin"
fake_bin.mkdir()
write_executable(
fake_bin / "curl",
"""
#!/bin/sh
for arg in "$@"; do
url="$arg"
done
case "$url" in
*steamdb.info*)
printf '%s\\n' '<html><title>Just a moment...</title><body>Checking your browser Cloudflare</body></html>'
;;
*ISteamNews*)
printf '%s\\n' '{"appnews":{"appid":250820,"newsitems":[{"title":"SteamVR Beta Updated - 2.13.1","contents":"Frame dashboard update"}]}}'
;;
*)
echo "unexpected url: $url" >&2
exit 22
;;
esac
""",
)
env = os.environ.copy()
env.update(
{
"PATH": f"{fake_bin}:{env['PATH']}",
"STEAMVR_SCAN_DIRS": str(snapshot_dir),
}
)
result = subprocess.run(
[str(ROOT / "scripts" / "check_steamvr_depots.sh"), str(run_dir)],
cwd=ROOT,
env=env,
text=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=False,
)
self.assertEqual("", result.stderr)
self.assertEqual(0, result.returncode)
self.assertFalse((run_dir / "api" / "steamvr-depots" / "steamdb-depots.html").exists())
errors = (run_dir / "reports" / "steamvr-depots-errors.txt").read_text(
encoding="utf-8"
)
key_lines = (run_dir / "reports" / "steamvr-depots-key-lines.txt").read_text(
encoding="utf-8"
)
self.assertIn("blocked or challenge page", errors)
self.assertIn("Steam Frame", key_lines)
self.assertIn("Deckard", key_lines)
if __name__ == "__main__":
unittest.main()