Track ARM64 Steam client manifests

This commit is contained in:
seanbetts committed 2026-05-23 18:17:18 +01:00
1 parent a1fee7a4df
commit ba84464c5c
11 files changed
+617 -12

No files matched your search

+13
View File
@@ -223,8 +223,21 @@ Look for:
- pairing flow strings
- device type names or codenames
- reservation flow allowlists and package IDs
- Steam client ARM64 beta/publicbeta manifest movement, especially `steam_client_beta_linuxarm64`
- support or OOBE changes
Client manifest focus:
- Treat `steam_client_beta_linuxarm64` as a high-signal Steam Machine / Fremont watch target.
- Track `steam_client_publicbeta_linuxarm64` beside it so beta-to-publicbeta movement is visible.
- Watch ARM64 hardware/runtime blocks, especially:
- `bins_hardware_linuxarm64`
- `bins_linuxarm64`
- `steam_linuxarm64`
- `runtime_steamrt_linuxarm64`
- `bins_steamrt_linuxarm64`
- Manifest movement is a readiness heuristic only. It does not confirm product identity, preorder timing, or launch readiness without SteamKit/PICS or Valve public API movement.
Known reservation-package code baseline:
- Machine package IDs `1629446`, `1629447`, `1629458`, `1629460` and Frame package IDs `1629484`, `1629486` first appear in SteamTracking bundle snapshots at commit `334bd31a28a0` on `2026-04-28T23:46:34Z`
+11
View File
@@ -130,6 +130,17 @@ High-yield files from the seeded baseline:
- `Protobufs/steammessages_clientsettings.proto`
- `steamcommunity.com/public/javascript/webui/friends.js`
- `Strings/steamclient.txt`
- `ClientManifest/steam_client_beta_linuxarm64`
- `ClientManifest/steam_client_publicbeta_linuxarm64`
- `ClientManifest/steamdeck_publicbeta`
Steam client manifest blocks to watch:
- `bins_hardware_linuxarm64`
- `bins_linuxarm64`
- `steam_linuxarm64`
- `runtime_steamrt_linuxarm64`
- `bins_steamrt_linuxarm64`
Useful search terms:
+7 -1
View File
@@ -9,6 +9,7 @@ fi
RUN_DIR="$1"
TRACKING_DIR="${2:-/tmp/SteamTracking-master}"
OUT_DIR="$RUN_DIR/reports"
SCRIPT_DIR="$(CDPATH= cd -- "$(dirname "$0")" && pwd)"
mkdir -p "$OUT_DIR"
if [ ! -d "$TRACKING_DIR" ]; then
@@ -24,6 +25,11 @@ rg -n -i "ShouldTritonPairInOobe|PairDongleTriton|UnpairedTriton|ibex_internal|i
"$TRACKING_DIR" \
> "$OUT_DIR/steamtracking-pairing-focus.txt" || true
python3 "$SCRIPT_DIR/parse_steamtracking_client_manifests.py" \
--run-dir "$RUN_DIR" \
--tracking-dir "$TRACKING_DIR"
printf '%s\n' \
"Saved SteamTracking grep output to $OUT_DIR/steamtracking-hits.txt" \
"Saved pairing-focused grep output to $OUT_DIR/steamtracking-pairing-focus.txt"
"Saved pairing-focused grep output to $OUT_DIR/steamtracking-pairing-focus.txt" \
"Saved client manifest report to $OUT_DIR/steamtracking-client-manifests.md"
+1
View File
@@ -124,6 +124,7 @@ def build_summary(prev_dir: Path, curr_dir: Path):
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, "SteamKit/PICS", "steamkit-pics-key-lines.txt"))
deltas.extend(compare_text_lines(prev_dir, curr_dir, "SteamDB", "steamdb-key-lines.txt"))
deltas.extend(compare_text_lines(prev_dir, curr_dir, "Steam client manifests", "steamtracking-client-manifests-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"))
+6
View File
@@ -50,6 +50,9 @@ 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)
client_manifest_lines = first_n_nonempty(
reports / "steamtracking-client-manifests-key-lines.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)
customs_key_lines_path = reports / "customs-shipments-key-lines.txt"
@@ -127,6 +130,9 @@ def build_draft(run_dir: Path):
lines.extend([f"- `{line}`" for line in tracking_lines])
else:
lines.append("- No focused SteamTracking report found.")
if client_manifest_lines:
lines.extend(["", "Steam client manifest focus:"])
lines.extend([f"- `{line}`" for line in client_manifest_lines])
lines.extend(["", "#### SteamVR Depots"])
if steamvr_blocked:
@@ -0,0 +1,261 @@
#!/usr/bin/env python3
import argparse
import csv
import re
import shutil
from pathlib import Path
WATCHED_MANIFESTS = (
"steam_client_beta_linuxarm64",
"steam_client_publicbeta_linuxarm64",
"steam_client_publicbeta_ubuntu12",
"steam_client_publicbeta_win64",
"steam_client_publicbeta_osx",
"steamdeck_publicbeta",
"steam_client_win64",
"steam_client_ubuntu12",
"steam_client_osx",
"steamdeck_stable",
)
FOCUS_BLOCKS = (
"bins_hardware_linuxarm64",
"bins_linuxarm64",
"steam_linuxarm64",
"runtime_steamrt_linuxarm64",
"bins_steamrt_linuxarm64",
"bins_codecs_linuxarm64",
"bins_misc_linuxarm64",
"webkit_linuxarm64",
"sdl3_linuxarm64",
"bins_hardware_all",
)
OUTPUT_FIELDS = (
"manifest",
"arch",
"version",
"block",
"file",
"size",
"sha2",
"changed_since_previous",
"previous_version",
"previous_file",
"previous_size",
"previous_sha2",
)
def parse_manifest(path: Path):
text = path.read_text(encoding="utf-8", errors="ignore")
arch_match = re.match(r'\s*"([^"]+)"', text)
version_match = re.search(r'"version"\s+"([^"]+)"', text)
blocks = {}
current = None
for line in text.splitlines():
block_match = re.match(r'\s*"([^"]+)"\s*$', line)
if block_match:
current = block_match.group(1)
blocks[current] = {}
continue
if current:
field_match = re.match(r'\s*"([^"]+)"\s+"([^"]*)"', line)
if field_match:
blocks[current][field_match.group(1)] = field_match.group(2)
return {
"arch": arch_match.group(1) if arch_match else "",
"version": version_match.group(1) if version_match else "",
"blocks": blocks,
}
def find_previous_report(run_dir: Path):
parent = run_dir.parent
if not parent.exists():
return None
previous = None
for candidate in sorted(parent.glob("????-??-??")):
if candidate == run_dir:
continue
if candidate.name < run_dir.name:
previous = candidate
if not previous:
return None
path = previous / "reports" / "steamtracking-client-manifests.tsv"
return path if path.exists() else None
def load_previous(path: Path | None):
if not path or not path.exists():
return {}
with path.open(encoding="utf-8", newline="") as handle:
reader = csv.DictReader(handle, delimiter="\t")
return {(row["manifest"], row["block"]): row for row in reader}
def changed(row, previous):
prior = previous.get((row["manifest"], row["block"]))
if not prior:
return "new"
if row["block"] == "__manifest__":
return "yes" if row["version"] != prior.get("version", "") else "no"
for field in ("file", "size", "sha2"):
if row[field] != prior.get(field, ""):
return "yes"
return "no"
def build_rows(tracking_dir: Path, previous):
manifest_dir = tracking_dir / "ClientManifest"
rows = []
for manifest in WATCHED_MANIFESTS:
path = manifest_dir / manifest
if not path.exists():
continue
parsed = parse_manifest(path)
manifest_row = {
"manifest": manifest,
"arch": parsed["arch"],
"version": parsed["version"],
"block": "__manifest__",
"file": "",
"size": "",
"sha2": "",
"changed_since_previous": "",
"previous_version": "",
"previous_file": "",
"previous_size": "",
"previous_sha2": "",
}
prior = previous.get((manifest, "__manifest__"), {})
manifest_row["previous_version"] = prior.get("version", "")
manifest_row["changed_since_previous"] = changed(manifest_row, previous)
rows.append(manifest_row)
for block in FOCUS_BLOCKS:
values = parsed["blocks"].get(block)
if not values:
continue
row = {
"manifest": manifest,
"arch": parsed["arch"],
"version": parsed["version"],
"block": block,
"file": values.get("file", ""),
"size": values.get("size", ""),
"sha2": values.get("sha2", ""),
"changed_since_previous": "",
"previous_version": "",
"previous_file": "",
"previous_size": "",
"previous_sha2": "",
}
prior = previous.get((manifest, block), {})
row["previous_version"] = prior.get("version", "")
row["previous_file"] = prior.get("file", "")
row["previous_size"] = prior.get("size", "")
row["previous_sha2"] = prior.get("sha2", "")
row["changed_since_previous"] = changed(row, previous)
rows.append(row)
return rows
def write_tsv(rows, path: Path):
path.parent.mkdir(parents=True, exist_ok=True)
with path.open("w", encoding="utf-8", newline="") as handle:
writer = csv.DictWriter(handle, fieldnames=OUTPUT_FIELDS, delimiter="\t")
writer.writeheader()
writer.writerows(rows)
def write_key_lines(rows, path: Path):
focus_manifests = {"steam_client_beta_linuxarm64", "steam_client_publicbeta_linuxarm64"}
focus_blocks = {"__manifest__", "bins_hardware_linuxarm64", "bins_linuxarm64", "steam_linuxarm64", "runtime_steamrt_linuxarm64"}
lines = []
for row in rows:
if row["manifest"] not in focus_manifests or row["block"] not in focus_blocks:
continue
if row["block"] == "__manifest__":
lines.append(
f"{row['manifest']} version={row['version']} arch={row['arch']} changed={row['changed_since_previous']} previous={row['previous_version']}"
)
else:
lines.append(
f"{row['manifest']} block={row['block']} version={row['version']} file={row['file']} size={row['size']} changed={row['changed_since_previous']} previous_file={row['previous_file']}"
)
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text("\n".join(lines) + ("\n" if lines else ""), encoding="utf-8")
def write_markdown(rows, path: Path):
lines = [
"# SteamTracking Client Manifests",
"",
"Focused Steam client channel manifest snapshot for ARM64 and hardware package movement.",
"",
"| Manifest | Arch | Version | Block | File | Size | Changed |",
"| --- | --- | --- | --- | --- | ---: | --- |",
]
for row in rows:
if row["manifest"] not in ("steam_client_beta_linuxarm64", "steam_client_publicbeta_linuxarm64"):
continue
lines.append(
"| "
+ " | ".join(
(
row["manifest"],
row["arch"],
row["version"],
row["block"],
row["file"],
row["size"],
row["changed_since_previous"],
)
)
+ " |"
)
lines.extend(
[
"",
"## Interpretation",
"",
"- `steam_client_beta_linuxarm64` is high signal for possible ARM64 Steam hardware monitoring.",
"- `bins_hardware_linuxarm64`, `steam_linuxarm64`, and Steam Runtime ARM64 blocks are the highest-value fields.",
"- Manifest movement is not launch confirmation without Valve store/package readiness.",
"",
]
)
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text("\n".join(lines), encoding="utf-8")
def copy_raw_manifests(tracking_dir: Path, output_dir: Path):
source_dir = tracking_dir / "ClientManifest"
output_dir.mkdir(parents=True, exist_ok=True)
for manifest in WATCHED_MANIFESTS:
source = source_dir / manifest
if source.exists():
shutil.copyfile(source, output_dir / manifest)
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--run-dir", required=True, type=Path)
parser.add_argument("--tracking-dir", required=True, type=Path)
parser.add_argument("--previous-report", type=Path)
args = parser.parse_args()
reports = args.run_dir / "reports"
raw_dir = args.run_dir / "api" / "steamtracking" / "client-manifests"
previous = load_previous(args.previous_report or find_previous_report(args.run_dir))
rows = build_rows(args.tracking_dir, previous)
copy_raw_manifests(args.tracking_dir, raw_dir)
write_tsv(rows, reports / "steamtracking-client-manifests.tsv")
write_key_lines(rows, reports / "steamtracking-client-manifests-key-lines.txt")
write_markdown(rows, reports / "steamtracking-client-manifests.md")
if __name__ == "__main__":
main()
+1
View File
@@ -153,6 +153,7 @@ def build(run_dir: Path):
notable.extend([f"- SteamKit/PICS: `{line}`" for line in filtered_first(reports / "steamkit-pics-key-lines.txt", 8)])
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"- Steam client manifests: `{line}`" for line in filtered_first(reports / "steamtracking-client-manifests-key-lines.txt", 8)])
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)])
+17 -11
View File
@@ -1,6 +1,6 @@
# Steam Hardware Watch Status
Last updated: `2026-05-22`
Last updated: `2026-05-23`
## Best Current Answer
@@ -12,8 +12,8 @@ Last updated: `2026-05-22`
### Komodo
- Komodo was available again on `2026-05-22` through the dedicated browser fallback after the `2026-05-19` waiting-room block.
- Product modified timestamps captured in this run:
- Komodo was available again on `2026-05-23` through the dedicated browser fallback after the automated path initially blocked.
- Product modified timestamps captured in this run remain unchanged versus `2026-05-22`:
- Controller: `2026-05-22T15:28:27`
- Machine: `2026-04-24T14:32:54`
- Frame: `2026-04-24T14:33:36`
@@ -24,7 +24,7 @@ Last updated: `2026-05-22`
### SteamKit / PICS
- SteamKit/PICS is the primary direct Steam metadata source for watched app and package movement.
- Current changenumbers from the `2026-05-22` run:
- Current changenumbers from the `2026-05-23` run:
- Controller app `4165870`: `35731145`
- Frame app `4165890`: `35675573`
- Machine app `4165910`: `35675573`
@@ -34,30 +34,35 @@ Last updated: `2026-05-22`
- Machine package `1629458`: `35842860`
- Machine package `1629460`: `35842863`
- Frame packages `1629484`, `1629486`: `35672606`
- No watched SteamKit/PICS changenumbers moved on `2026-05-22`.
- No watched SteamKit/PICS changenumbers moved on `2026-05-23`.
- The latest Controller package signal remains the `2026-05-17` private PICS change on package `1558609`, where `ignorereservationifstockavailable=1` was removed from the package `extended` fields. Public Valve `appdetails` / `packagedetails` still did not change.
- The latest material Machine signal remains the `2026-05-14` follow-up bump across all four watched Steam Machine package IDs, especially because the two watched Steam Frame package IDs did not move.
- Manual package-history context remains important: Steam Controller package `1558609` reportedly had a clustered change pattern plus one later follow-up change roughly two days before Valve's public purchase-timing update appeared. The Machine set now has both the initial multi-package cluster and the later follow-up bump. Treat this as a stronger imminent-preorder heuristic, not confirmation.
- Machine and Frame apps/packages currently require private PICS metadata tokens, but changenumbers are visible and suitable for movement monitoring.
- Raw snapshot: `/Users/sean/Coding/steam-hardware-watch/runs/2026-05-22/api/steamkit/pics-product-info.json`
- Human-readable detail: `/Users/sean/Coding/steam-hardware-watch/runs/2026-05-22/reports/steamkit-pics-detail.md`
- Raw snapshot: `/Users/sean/Coding/steam-hardware-watch/runs/2026-05-23/api/steamkit/pics-product-info.json`
- Human-readable detail: `/Users/sean/Coding/steam-hardware-watch/runs/2026-05-23/reports/steamkit-pics-detail.md`
### SteamDB
- Automated SteamDB access remained blocked on `2026-05-22`.
- Automated SteamDB access remained blocked on `2026-05-23`.
- The package report is still a structural baseline, not a content baseline: all watched SteamDB package rows are `missing_or_blocked`.
- SteamDB remains useful as corroborating/human-readable metadata once a trusted browser session can pass the challenge, but SteamKit/PICS now covers primary package movement.
### SteamTracking / GameTracking
- Fresh SteamTracking content at commit `28f5287` (`2026-05-22T04:56:58Z`) still contains the known Triton/Ibex controller pairing surface:
- Fresh SteamTracking content at commit `5f58a47` (`2026-05-23T04:32:36Z`) still contains the known Triton/Ibex controller pairing surface:
- `ibex_internal`
- `ibex_external`
- `PairDongleTritonConnected`
- `PairDongleTritonDocked`
- `ShouldTritonPairInOobe`
- Known reservation package-code baseline remains: Machine package IDs `1629446`, `1629447`, `1629458`, `1629460` and Frame package IDs `1629484`, `1629486` first appeared in SteamTracking commit `334bd31a28a0` at `2026-04-28T23:46:34Z`.
- No new price or exact availability signal was found in this run.
- New high-signal client manifest watch target: `steam_client_beta_linuxarm64` first appeared in the local SteamTracking baseline at commit `28f5287` (`2026-05-22T04:56:58Z`) with version `1779139477`.
- Track `steam_client_beta_linuxarm64` and `steam_client_publicbeta_linuxarm64` every run, especially `bins_hardware_linuxarm64`, `bins_linuxarm64`, `steam_linuxarm64`, `runtime_steamrt_linuxarm64`, and `bins_steamrt_linuxarm64`.
- Current ARM64 client manifest baseline in the `2026-05-23` report:
- `steam_client_beta_linuxarm64`: version `1779139477`; `bins_hardware_linuxarm64.zip.cc71be587407299a6125bfa9e889b97bf8df7591`; size `7590487`.
- `steam_client_publicbeta_linuxarm64`: version `1779479049`; `bins_hardware_linuxarm64.zip.da8814f3cc3788fd3789ce233dd86f107b2b244a`; size `10039405`.
- The updated SteamTracking checkout did not add a new Machine/Frame reservation package, price, exact availability, or product-publication signal.
### SteamVR Depots
@@ -84,8 +89,9 @@ Last updated: `2026-05-22`
### Customs / Regulatory
- Customs status on `2026-05-22`: partial. ImportInfo automated fetches were blocked, but the ImportGenius importer page fetched and parsed successfully.
- Customs status on `2026-05-23`: partial. ImportInfo automated fetches were blocked, but the ImportGenius importer page fetched and parsed successfully.
- ImportGenius now lists `10` relevant `GAME CONSOLE` rows for `INGRAM MICRO C/O VALVE CORPORATION` from `2026-03-27` through `2026-05-18`.
- No newer customs rows appeared versus the `2026-05-22` ImportGenius baseline.
- Newer rows since the old `2026-04-23` baseline include:
- `SNHBSHACHI265020`, arrived `2026-05-18`, `42 PKG`, `14353 Kgs`.
- `SNHBSHACHI264140`, arrived `2026-05-18`, `42 PKG`, `14533 Kgs`.
+1
View File
@@ -43,3 +43,4 @@
{"date_checked": "2026-05-14", "source": "steamkit-pics", "entity": "steam-machine", "claim": "SteamKit/PICS shows a second follow-up changenumber bump across all four watched Steam Machine reservation package IDs.", "evidence_type": "steam_product_info_followup_changenumber_delta", "confidence": "high", "ref": "/Users/sean/Coding/steam-hardware-watch/runs/2026-05-14/reports/steamkit-pics-detail.md", "notes": "Machine packages 1629446, 1629447, 1629458, and 1629460 moved from 35819604/35819607/35819602/35819593 on 2026-05-12 to 35842876/35842851/35842860/35842863 on 2026-05-14. Frame packages 1629484 and 1629486 stayed at 35672606, and public Valve appdetails/packagedetails still expose no Machine packages, package groups, price, or exact timing."}
{"date_checked": "2026-05-17", "source": "steamkit-pics", "entity": "steam-controller", "claim": "SteamKit/PICS shows Steam Controller package 1558609 moved and removed an ignore-reservation-if-stock-available flag.", "evidence_type": "steam_product_info_package_field_delta", "confidence": "high", "ref": "/Users/sean/Coding/steam-hardware-watch/runs/2026-05-17/reports/steamkit-pics-detail.md", "notes": "Controller package 1558609 moved from changenumber 35745078 to 35893035 and changed SHA from 02235CA28137E71E7AFA02A0F45743DBEBA925EF to CE75692F2679EF8A91C3C9CBB58D09456350EC64. The available PICS KeyValues diff shows extended field ignorereservationifstockavailable=1 was removed. Public Valve appdetails/packagedetails were unchanged, and watched Machine and Frame package changenumbers did not move."}
{"date_checked": "2026-05-22", "source": "importgenius-customs", "entity": "steam-machine,steam-frame", "claim": "ImportGenius shows continued US-bound GAME CONSOLE shipments to Ingram Micro C/O Valve Corporation through May 18, 2026.", "evidence_type": "customs_import_record", "confidence": "medium", "ref": "/Users/sean/Coding/steam-hardware-watch/runs/2026-05-22/reports/customs-shipments.md", "notes": "Parsed 10 relevant ImportGenius rows for INGRAM MICRO C/O VALVE CORPORATION / TECH-FRONT (CHONGQING) COMPUTER CO. Newer rows since the April 23 baseline include May 18 BOLs SNHBSHACHI265020 and SNHBSHACHI264140 plus May 8 BOL SNHBSHACHI264031. Customs rows say GAME CONSOLE but do not identify the specific Valve hardware SKU."}
{"date_checked": "2026-05-23", "source": "steamtracking-client-manifest", "entity": "steam-machine", "claim": "SteamTracking now exposes a dedicated steam_client_beta_linuxarm64 client manifest suitable for ARM64 Steam hardware monitoring.", "evidence_type": "client_manifest_baseline", "confidence": "medium", "ref": "/Users/sean/Coding/steam-hardware-watch/runs/2026-05-23/reports/steamtracking-client-manifests.md", "notes": "Manifest steam_client_beta_linuxarm64 first appears in the local SteamTracking history at commit 28f5287 on 2026-05-22T04:56:58Z with version 1779139477. The watcher now tracks beta/publicbeta linuxarm64 manifests and key blocks including bins_hardware_linuxarm64, bins_linuxarm64, steam_linuxarm64, runtime_steamrt_linuxarm64, and bins_steamrt_linuxarm64. This is a high-signal ARM64/Fremont readiness heuristic, not product identity or launch confirmation."}
+102
View File
@@ -0,0 +1,102 @@
# Run Note: 2026-05-23
## Summary
- Full skill run completed with artifacts under `/Users/sean/Coding/steam-hardware-watch/runs/2026-05-23`.
- No watched SteamKit/PICS changenumbers moved versus the `2026-05-22` report.
- Valve public APIs still do not expose Steam Machine or Steam Frame package groups, public package details, price, exact release timing, or purchase/reservation readiness.
- Komodo initially blocked on the automated path, then recovered through the dedicated browser fallback. Product timestamps and section baselines are unchanged versus `2026-05-22`.
- SteamTracking was updated to commit `5f58a47` (`2026-05-23T04:32:36Z`). Known Triton/Ibex pairing strings remain present, but no new Machine/Frame launch signal was found.
- Customs remains a partial source: ImportInfo blocked, ImportGenius fetched successfully, and the latest relevant `GAME CONSOLE` rows remain the `2026-05-18` shipments.
## Source Checks
### Komodo
- Dedicated browser fallback recovered Controller, Machine, and Frame product/section data.
- Product modified timestamps:
- Controller: `2026-05-22T15:28:27`
- Machine: `2026-04-24T14:32:54`
- Frame: `2026-04-24T14:33:36`
- No new Machine or Frame sections appeared. Machine and Frame still expose the old wishlist section baseline.
- Visual assets: `141` discovered, `136` retrieved, `5` blocked known Komodo URLs.
### SteamKit / PICS
- SteamKit/PICS completed successfully.
- No watched app or package changenumbers moved versus `2026-05-22`.
- Controller package `1558609` stayed at `35893035`.
- Machine packages stayed unchanged:
- `1629446`: `35842876`
- `1629447`: `35842851`
- `1629458`: `35842860`
- `1629460`: `35842863`
- Frame packages stayed unchanged:
- `1629484`: `35672606`
- `1629486`: `35672606`
- Interpretation: today's run does not add a new Controller, Machine, or Frame PICS signal. The latest material Machine signal remains the `2026-05-14` follow-up bump across all four watched Machine package IDs.
### SteamDB
- Automated SteamDB access remained blocked.
- Reservation package rows remain `missing_or_blocked`, so SteamDB is still not a human-readable corroborating baseline for recent package-history movement.
### SteamTracking / GameTracking
- Updated `/tmp/SteamTracking-master` from `28f5287` to `5f58a47`.
- The latest commit summary is `8 files | steam_client_osx, steam_client_ubuntu12, steam_client_win64, steam_cmd_linux, steam_cmd_osx, steam_cmd_win64, steamchina_win64, steamdeck_stable`.
- Known Triton/Ibex pairing surfaces remain present.
- Added focused Steam client manifest monitoring to the normal watcher.
- `steam_client_beta_linuxarm64` is now tracked as a high-signal ARM64/Fremont watch target. Baseline:
- version `1779139477`
- `bins_hardware_linuxarm64.zip.cc71be587407299a6125bfa9e889b97bf8df7591`
- `bins_linuxarm64.zip.37968ebfba6404c03b92ebe8a4c6083bff4b6ff0`
- `steam_linuxarm64.zip.406e533ed3218787b6d548ecf9e316bca01494ce`
- `runtime_steamrt_linuxarm64.zip.b41880f37f2c30fe064f21db62a0c7985964fc3c`
- `steam_client_publicbeta_linuxarm64` is tracked beside it for beta-to-publicbeta promotion context. Baseline version is `1779479049`.
- Diff checks did not find a new watched package ID, Machine/Frame price, reservation, or release-date signal.
### SteamVR Depots
- SteamVR news metadata was saved.
- SteamDB SteamVR depot metadata remained blocked.
- No fresh depot manifest/build comparison was collected.
### SteamOS Package Mirror
- Public mirror remained reachable.
- `fremont-hw-support 20260506.1-1` remains visible in `holo-3.8` and `holo-main`.
- No direct Steam Machine, Steam Frame, Deckard, Roy, ARM/Snapdragon, or new product-specific namespace surfaced in this pass.
### Valve Support / CDN
- Valve public endpoints were reachable.
- Controller remains public with package `1558609`, package group present, and `$99.00`.
- Frame app `4165890` remains `Coming soon`, with no public packages, no package groups, and no price.
- Machine app `4165910` remains `Coming soon`, with no public packages, no package groups, and no price.
- Machine packages `1629446`, `1629447`, `1629458`, `1629460` still return `packagedetails success:false`.
- Frame packages `1629484`, `1629486` still return `packagedetails success:false`.
- The comparison report's Valve endpoint add/remove lines are path/line-number noise from regenerated artifacts; the normalized reservation package API table is unchanged versus `2026-05-22`.
### Customs / Regulatory
- ImportInfo automated customs fetches were blocked.
- ImportGenius fetched successfully and still parsed `10` relevant `GAME CONSOLE` rows for `INGRAM MICRO C/O VALVE CORPORATION` / `TECH-FRONT (CHONGQING) COMPUTER CO`.
- No newer row appeared beyond the two `2026-05-18` shipments:
- `SNHBSHACHI265020`, `42 PKG`, `14353 Kgs`.
- `SNHBSHACHI264140`, `42 PKG`, `14533 Kgs`.
- Interpretation: customs remains meaningful logistics corroboration, but it does not identify whether the goods are Steam Machine, Steam Frame, or another Valve hardware SKU.
## Effect On Key Questions
- Price: unchanged. Only Steam Controller has a confirmed price.
- Release date: unchanged. Only Steam Controller has a confirmed exact date.
- Same-time launch: unchanged. Full same-day launch remains ruled out.
- Product furthest along: Steam Controller is already public/purchasable. Among unreleased hardware, Steam Machine still has the strongest recent backend-prep signal because of the `2026-05-12` and `2026-05-14` package movement, plus continued May `GAME CONSOLE` logistics corroboration. There was no additional Machine or Frame PICS or public API movement today.
## Next Checks
- Continue focused SteamKit/PICS checks for watched package IDs.
- Watch Valve public `appdetails` / `packagedetails` for Machine package exposure, package groups, price, reservation text, or purchase eligibility.
- Complete a trusted-browser SteamDB package-history pass for Machine packages `1629446`, `1629447`, `1629458`, and `1629460`.
- Keep ImportGenius in the normal customs monitor and treat ImportInfo as best-effort while it blocks.
@@ -0,0 +1,197 @@
import csv
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)
def manifest(version, hardware_file="bins_hardware_linuxarm64.zip.old", steam_file="steam_linuxarm64.zip.old"):
return textwrap.dedent(
f"""
"linuxarm64"
{{
"version" "{version}"
"bins_hardware_linuxarm64"
{{
"file" "{hardware_file}"
"size" "7590487"
"sha2" "hardware-sha"
}}
"steam_linuxarm64"
{{
"file" "{steam_file}"
"size" "4345869"
"sha2" "steam-sha"
}}
"runtime_steamrt_linuxarm64"
{{
"file" "runtime_steamrt_linuxarm64.zip.same"
"size" "123973554"
"sha2" "runtime-sha"
}}
}}
"""
).lstrip()
def read_rows(path):
return list(csv.DictReader(path.read_text(encoding="utf-8").splitlines(), delimiter="\t"))
class SteamTrackingClientManifestTests(unittest.TestCase):
def test_manifest_report_flags_linuxarm64_beta_version_and_block_changes(self):
with TemporaryDirectory() as tmp:
tmp_path = Path(tmp)
tracking = tmp_path / "tracking"
manifests = tracking / "ClientManifest"
manifests.mkdir(parents=True)
(manifests / "steam_client_beta_linuxarm64").write_text(
manifest(
"1779139477",
hardware_file="bins_hardware_linuxarm64.zip.new",
steam_file="steam_linuxarm64.zip.new",
),
encoding="utf-8",
)
run_dir = tmp_path / "runs" / "2026-05-23"
previous_reports = tmp_path / "runs" / "2026-05-22" / "reports"
previous_reports.mkdir(parents=True)
previous_reports.joinpath("steamtracking-client-manifests.tsv").write_text(
"\n".join(
[
"manifest\tarch\tversion\tblock\tfile\tsize\tsha2\tchanged_since_previous\tprevious_version\tprevious_file\tprevious_size\tprevious_sha2",
"steam_client_beta_linuxarm64\tlinuxarm64\t1779000000\t__manifest__\t\t\t\tno\t\t\t\t",
"steam_client_beta_linuxarm64\tlinuxarm64\t1779000000\tbins_hardware_linuxarm64\tbins_hardware_linuxarm64.zip.old\t7590487\thardware-sha\tno\t\t\t\t",
"steam_client_beta_linuxarm64\tlinuxarm64\t1779000000\tsteam_linuxarm64\tsteam_linuxarm64.zip.old\t4345869\tsteam-sha\tno\t\t\t\t",
]
)
+ "\n",
encoding="utf-8",
)
result = subprocess.run(
[
"python3",
str(ROOT / "scripts" / "parse_steamtracking_client_manifests.py"),
"--run-dir",
str(run_dir),
"--tracking-dir",
str(tracking),
],
cwd=ROOT,
text=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=False,
)
self.assertEqual("", result.stderr)
self.assertEqual(0, result.returncode)
rows = read_rows(run_dir / "reports" / "steamtracking-client-manifests.tsv")
manifest_row = next(
row for row in rows if row["manifest"] == "steam_client_beta_linuxarm64" and row["block"] == "__manifest__"
)
hardware_row = next(
row for row in rows if row["manifest"] == "steam_client_beta_linuxarm64" and row["block"] == "bins_hardware_linuxarm64"
)
self.assertEqual("1779139477", manifest_row["version"])
self.assertEqual("yes", manifest_row["changed_since_previous"])
self.assertEqual("yes", hardware_row["changed_since_previous"])
self.assertEqual("bins_hardware_linuxarm64.zip.old", hardware_row["previous_file"])
key_lines = (run_dir / "reports" / "steamtracking-client-manifests-key-lines.txt").read_text(
encoding="utf-8"
)
self.assertIn("steam_client_beta_linuxarm64", key_lines)
self.assertIn("bins_hardware_linuxarm64", key_lines)
self.assertIn("changed=yes", key_lines)
def test_check_steamtracking_writes_client_manifest_report(self):
with TemporaryDirectory() as tmp:
tmp_path = Path(tmp)
tracking = tmp_path / "tracking"
manifests = tracking / "ClientManifest"
manifests.mkdir(parents=True)
(manifests / "steam_client_beta_linuxarm64").write_text(
manifest("1779139477", hardware_file="bins_hardware_linuxarm64.zip.new"),
encoding="utf-8",
)
(tracking / "ProtobufsWebui").mkdir()
(tracking / "ProtobufsWebui" / "service_steaminputmanager.proto").write_text(
"message CSteamInputService_ShouldTritonPairInOobe_Request {}\n",
encoding="utf-8",
)
run_dir = tmp_path / "runs" / "2026-05-23"
result = subprocess.run(
[str(ROOT / "scripts" / "check_steamtracking.sh"), str(run_dir), str(tracking)],
cwd=ROOT,
text=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=False,
)
self.assertEqual("", result.stderr)
self.assertEqual(0, result.returncode)
self.assertTrue((run_dir / "reports" / "steamtracking-client-manifests.tsv").exists())
key_lines = (run_dir / "reports" / "steamtracking-client-manifests-key-lines.txt").read_text(
encoding="utf-8"
)
self.assertIn("steam_client_beta_linuxarm64", key_lines)
def test_compare_runs_includes_client_manifest_key_line_deltas(self):
with TemporaryDirectory() as tmp:
tmp_path = Path(tmp)
previous = tmp_path / "2026-05-22"
current = tmp_path / "2026-05-23"
(previous / "reports").mkdir(parents=True)
(current / "reports").mkdir(parents=True)
(previous / "reports" / "steamtracking-client-manifests-key-lines.txt").write_text(
"steam_client_beta_linuxarm64 version=1779000000 arch=linuxarm64 changed=no previous=\n",
encoding="utf-8",
)
(current / "reports" / "steamtracking-client-manifests-key-lines.txt").write_text(
"steam_client_beta_linuxarm64 version=1779139477 arch=linuxarm64 changed=yes previous=1779000000\n",
encoding="utf-8",
)
output = tmp_path / "compare.md"
result = subprocess.run(
[
"python3",
str(ROOT / "scripts" / "compare_runs.py"),
"--previous",
str(previous),
"--current",
str(current),
"--output",
str(output),
],
cwd=ROOT,
text=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=False,
)
self.assertEqual("", result.stderr)
self.assertEqual(0, result.returncode)
compare = output.read_text(encoding="utf-8")
self.assertIn("Steam client manifests added line", compare)
self.assertIn("1779139477", compare)
if __name__ == "__main__":
unittest.main()