mirror of
https://github.com/seanbetts/steam-hardware-watch.git
synced 2026-10-06 01:00:18 +02:00
Add SteamVR and SteamOS mirror checks
This commit is contained in:
1 parent
b43753f4df
commit
f917cc3052
13 files changed
+660
-44
No files matched your search
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Executable
+111
@@ -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"
|
||||
Executable
+119
@@ -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"
|
||||
@@ -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:
|
||||
|
||||
@@ -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`.")
|
||||
|
||||
@@ -37,6 +37,14 @@ if [ ! -f "$RUN_NOTE" ]; then
|
||||
|
||||
-
|
||||
|
||||
### SteamVR Depots
|
||||
|
||||
-
|
||||
|
||||
### SteamOS Package Mirror
|
||||
|
||||
-
|
||||
|
||||
### Valve Support / CDN
|
||||
|
||||
-
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
@@ -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.
|
||||
@@ -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."}
|
||||
@@ -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()
|
||||
Reference in new issue
Block a user