smodusermc/offline-games / _tools /publish_next_batch.py
smodusermc's picture
download
raw
16 kB
"""Publish the eight-game batch, cumulative inventory, and independent asset-validation evidence."""
import os,json,collections
from pathlib import Path
from huggingface_hub import HfApi
H=Path('/home/user/game-archive');R=H/'reports';B='smodusermc/offline-games';api=HfApi(token=os.environ['HF_TOKEN']);ids=[182,183,359,373,374,376,575,582]
reviews={182:('Level scenes observed; advanced probe errors','Entered the first level through the declared play/ entry. Middle/end map data loaded via existing engine state API and rendered; direct-transition probes also emitted null/add errors. Not normal progression or a full playthrough. The outer landing page has three source-missing navigation/button assets.'),183:('Level scenes observed; advanced probe errors','Entered the first level. Middle/end map data loaded via existing engine state API and rendered; direct-transition probes also emitted null/add errors. Not normal progression or a full playthrough.'),359:('Input smoke passed','Started n-gon; simulation cycles advanced and D moved the player from x=460 to about 868 with external browser requests blocked.'),373:('Audio restored; runtime memory-limited','All 94 declared audio files decode independently. The full restored game hit the test host memory guard; no post-repair gameplay pass claimed. Online tips/telemetry requests remain external.'),374:('Intro scene observed; controls unverified','The introductory scene renders, with no missing local requests or page errors. Controls were exercised, but movement/progression was not established. The export declares no audio files.'),376:('Input smoke passed','The source site’s JS Pacman implementation started, and arrow-key movement increased the score from 00 to 190 in the assertion. Not an original arcade-ROM archive or full playthrough.'),575:('Gameplay scene observed','Reached the playable level hub; right/jump keys exercised. No page errors. Source-missing global wrapper and branding configuration requests remain; no all-acts playthrough claimed.'),582:('Mode menu observed','Reached the 1-player/2-player mode menu with no missing local requests or page errors. Mode-selection/control attempts did not establish a match start; no match-play pass claimed.')}
for i,(outcome,note) in reviews.items():
p=R/f'verification-{i:04d}.json';j=json.loads(p.read_text());j.update(reviewed_outcome=outcome,review_note=note,full_playthrough_verified=False,asset_validation_report='_verification/next-batch-payload-validation.json');p.write_text(json.dumps(j,indent=2))
for i in [180,181]:
p=R/f'verification-{i:04d}.json';j=json.loads(p.read_text());j['later_asset_repair_note']='All declared temple maps and audio-name families audited; payload SHA, JSON, audio and image checks passed. Existing runtime result is historical; no new full playthrough.';j['asset_validation_report']='_verification/next-batch-payload-validation.json';p.write_text(json.dumps(j,indent=2))
m=json.loads((R/'game-182.json').read_text());m['runtime_entry']='https://garbsoftball.com/games/watergirl-3/play/index.html';m['entry_note']='The catalog landing page has missing original navigation/button assets; its declared local play/ target is the actual game.';(R/'game-182.json').write_text(json.dumps(m,indent=2))
# Old OvO screenshots predate audio restoration; do not pass them off as current proof.
for p in (R/'evidence').glob('0373-*.jpg'):p.unlink()
validation=json.loads((R/'next-batch-payload-validation.json').read_text());audits=json.loads((R/'next-batch-declared-assets.json').read_text());upstream=json.loads((R/'next-batch-upstream-restorations.json').read_text());vmap={x['id']:x for x in validation}
assert all(not x['sha256_mismatches'] and not x['size_mismatches'] and not x['json_errors'] and not x['media_decode_failures'] and not x['missing_declared_paths'] for x in validation)
levelcounts={x['game_id']:sum('temple-level-manifest' in f['reasons'] for f in x['explicit_expected_paths']) for x in audits if x['game_id'] in [180,181,182,183]}
results=[json.loads(p.read_text()) for p in sorted(R.glob('verification-*.json')) if p.stem!='verification-summary'];by={x['id']:x for x in results}
api.download_bucket_files(B,[('_reports/inventory.json',R/'inventory.json')],raise_on_missing_files=True);inventory=json.loads((R/'inventory.json').read_text())
for row in inventory:
i=row['id']
if i in by:row['verification_outcome']=by[i].get('reviewed_outcome',by[i].get('status'));row['verification_report']=f'_verification/games/{i:04d}.json'
if i in vmap:
m=json.loads((R/f'game-{i}.json').read_text());row['captured_files']=len(m['files']);row['captured_bytes']=sum(x['bytes'] for x in m['files']);row['asset_validation_report']='_verification/next-batch-payload-validation.json';row['asset_validation_scope']='Recorded SHA-256, explicit declared inventories, JSON and media decoding; not universal completeness or full gameplay.'
(R/'inventory.json').write_text(json.dumps(inventory,indent=2));pending=sum(x['status']=='pending_not_captured' for x in inventory);info=api.bucket_info(B)
summary={'entries_with_verification_reports':len(results),'latest_batch_ids':ids,'earlier_entries_with_asset_repairs':[180,181],'pending_catalog_candidates':pending,'deferred_large_entry_pages':2,'outcomes':dict(collections.Counter(x.get('reviewed_outcome',x.get('status')) for x in results)),'bucket_bytes_before_report_upload':info.size,'full_playthroughs_verified':0,'payload_audit':{'per_game_recorded_sha256_comparisons':sum(x['recorded_sha256_comparisons'] for x in validation),'audio_decode_checks':sum(x['audio_files'] for x in validation),'image_decode_checks':sum(x['image_files'] for x in validation),'declared_path_checks':sum(x['declared_paths'] for x in validation),'temple_maps_by_game':levelcounts,'upstream_replacements':len([x for x in upstream if 'sha256' in x]),'failures':0,'scope':'Ten entries: eight new captures and two earlier Fireboy/Watergirl repairs. Counts are per-entry checks; shared files can occur in multiple manifests.'}}
(R/'verification-summary.json').write_text(json.dumps(summary,indent=2));q=summary['payload_audit']
text=f'''# New-game batch and declared-asset audit
[Public bucket](https://huggingface.co/buckets/{B})
## Added eight source-site games
| Game | Verified scope / remaining caveat |
|---|---|
'''
for i in ids:text+=f"| {by[i]['name']} | {reviews[i][1]} |\n"
text+=f'''
## Asset checks, not just title screens
The audit covered the eight new entries **plus the earlier Fireboy and Watergirl 1–2 captures**.
- **{q['per_game_recorded_sha256_comparisons']:,} SHA-256 comparisons passed** after downloading stored files back from the bucket. No mismatches.
- **{q['audio_decode_checks']} audio decode checks** and **{q['image_decode_checks']} image decode checks** passed in Chromium, using a local fixture and blocking external browser requests.
- **{q['declared_path_checks']} explicit declared-path checks passed**, with no absent declared objects. Every stored JSON file in the ten audited manifests parsed successfully.
- The four Fireboy/Watergirl inventories list **{sum(levelcounts.values())} map paths**: Forest {levelcounts[180]}, Light {levelcounts[181]}, Ice {levelcounts[182]}, Crystal {levelcounts[183]}. **All are present**, along with their referenced tileset JSON files. The final count is 149, correcting the earlier progress-message count of 148.
- **94 OvO audio files** were missing from the mirror. All were restored from the named **1.4.4 upstream release**, saved in the bucket, and decoded individually. This includes codec alternatives and music, not only effects heard on the menu.
- **113 source-missing map files** were restored from the GameDistribution build IDs identified in the respective loaders. Other missing maps were recovered directly from the source mirror. Original folders are retained.
There are **207 documented upstream replacements** this batch: 94 audio files and 113 maps. Exact byte equivalence with unavailable mirror copies is **not asserted**. Replacement URLs, hashes, and original failures are recorded. No substitute gameplay, fabricated SDK responses, or license responses were created.
The collector now understands local `play/` entry links, ES-module-relative imports, older Construct audio lists, Fireboy/Watergirl temple inventories, and their dynamically named audio families.
## Coverage limits
- The counts above are **per-entry checks**; some shared supporting files appear in multiple manifests.
- Declared-file coverage and valid media do not establish that every undiscoverable resource, online feature, or every level works. No full playthroughs are claimed.
- Tests use a **local HTTP mirror with external browser requests blocked**. The test server applies documented routing to supporting libraries. This is not a test of untouched `file://` execution or a promise of self-contained HTML files.
- Fireboy 3's actual game entry is **`site/games/watergirl-3/play/index.html`**; its outer catalog landing page has missing source navigation/button assets.
- The later-level probes used the existing engine state API. Map data loaded and scenes rendered, but transient null/add errors occurred during direct transitions; those probes are not promoted to normal-progression passes.
- OvO's restored library passed file/audio validation, but the full game exceeded the small test host's safe memory budget. OvO 2 and Volley Random are likewise **not marked gameplay-passed** merely from their scenes/menus.
- Ads, telemetry, online tips and some source-missing wrapper/branding requests remain documented separately from stored core asset inventories.
## Progress and evidence
**{len(results)} entries have verification reports; {pending} catalog candidates remain queued**, plus two oversized entry pages deferred. Two report entries are historical external-build exclusions, not archived local games. Bucket size is approximately **{info.size/1e9:.2f} GB** before the final report upload. Geometry Dash's separate dataset is untouched.
- `_verification/next-batch-declared-assets.json`: manifest inputs, explicit paths, recoveries and original-source failures.
- `_verification/next-batch-upstream-restorations.json`: source provenance and hashes.
- `_verification/next-batch-payload-validation.json`: download-back hashes, media decoding, JSON parsing and tileset references.
- `_verification/games/`: input checks, scene observations and runtime caveats.
- `_verification/storage-audit.json`: **89 manifests, zero missing recorded objects, zero size mismatches** (presence/size audit, not a full historical SHA audit).
- `_verification/evidence/`: screenshots; `_tools/`: credential-free scripts.
Temporary game assets, downloaded source-inspection files, local screenshots and bulky caches are removed after publication. Small tools, manifests, and reports remain locally, below the 128 MB limit.
'''
(H/'NEW-GAMES.md').write_text(text)
old=H/'VERIFICATION.md';history=R/'verification-summary-before-next-batch.md'
if not history.exists():history.write_text(old.read_text())
full=text+'\n## Cumulative verification outcomes\n\n| Game | Outcome | Scope / caveat |\n|---|---|---|\n'
for j in results:full+='| '+j.get('name','').replace('|','/')+' | '+j.get('reviewed_outcome',j.get('status',''))+' | '+j.get('review_note','See individual JSON report.').replace('|','/')+' |\n'
(H/'VERIFICATION.md').write_text(full)
readme=f'''# Public original-file game archive
Source catalog: https://garbsoftball.com/g. Created as a public Storage Bucket at the account owner's request; original game rights remain with their owners.
## Latest batch
Added Fireboy and Watergirl 3–4, n-gon, OvO, OvO 2, Pacman (the source site's JS implementation), Vex 3, and Volley Random. Also repaired the earlier Fireboy/Watergirl 1–2 map inventories.
**1,213 recorded SHA-256 comparisons, 287 audio decodes, and 587 image decodes passed** across those ten audited entries. All **149 declared temple-map paths** are present. OvO's 94 source-missing audio files were recovered from its named upstream release. **207 upstream replacements** have explicit provenance.
See `_verification/next-batch-update.md` for exact coverage and limitations. OvO is runtime memory-limited; OvO 2 progression and Volley Random match play remain unverified. Scene rendering is not a full-playthrough pass.
## Previous audio repairs
Thirty Dollar Website: 191 selectable sounds + 3 intros stored and decoded; preview and sampled sequence generated nonzero audio. Cookie Clicker: 46 effects added; 75 declared sounds decode. Basket Random: all 16 WebM sounds decode. Details: `_verification/lazy-assets-update.md`.
## Progress and usage
**{len(results)} entries have verification reports; {pending} candidates remain pending**, plus two oversized entry pages deferred. Historical external exclusions remain labeled. No full playthroughs are claimed.
- `site/`: original server-relative files and documented repairs.
- `_vendor/`: supporting library/runtime copies.
- `_originals/`: backups of deliberately patched originals.
- `_reports/`: catalog and captured-file inventories.
- `_verification/`: audits, caveats and screenshots.
- `_tools/`: credential-free scripts.
Download site files with `hf buckets sync hf://buckets/smodusermc/offline-games/site ./game-files`.
This is several GB. Some games also need `_vendor/` and local HTTP hosting/routing; downloading just index.html is insufficient. **These are not automatically standalone HTML or untouched file:// releases.** No fake SDK/license responses are supplied. Ads, telemetry and some live features remain external. Game 182 uses `site/games/watergirl-3/play/index.html`; its catalog landing page is partly broken at source.
Geometry Dash's separate dataset is untouched. Revoke shared access tokens when finished authorizing uploads.
'''
(H/'BUCKET-README.md').write_text(readme)
with (H/'WORKLOG.md').open('a') as f:f.write('\n\n## Next eight entries and full declared-map/media audit\n\nAdded IDs '+','.join(map(str,ids))+'. Also audited/repaired 180 and 181. All 149 declared temple-map paths are present. Recovered 94 OvO audio files and 113 maps from identified upstream releases/builds. 1,213 recorded SHA comparisons, 287 audio decodes, 587 image decodes, and 704 declared-path checks passed. No JSON parse failures or missing tileset JSON references. Cumulative presence/size audit: 89 manifests, zero missing recorded objects and zero mismatches. Not a full playthrough or proof of undiscoverable assets. See NEW-GAMES.md for runtime limitations and exact provenance.\n')
adds=[(H/'BUCKET-README.md','README.md'),(H/'NEW-GAMES.md','_verification/next-batch-update.md'),(H/'VERIFICATION.md','_verification/verification-summary.md'),(H/'VERIFICATION.md','_reports/status.md'),(H/'WORKLOG.md','_reports/worklog.md'),(R/'inventory.json','_reports/inventory.json'),(R/'verification-summary.json','_verification/verification-summary.json'),(R/'verification-summary.json','_reports/summary.json')]
for i in [180,181]+ids:
adds.extend([(R/f'game-{i}.json',f'_reports/games/{i:04d}.json'),(R/f'verification-{i:04d}.json',f'_verification/games/{i:04d}.json')])
for name in ['next-batch-declared-assets.json','next-batch-upstream-restorations.json','next-batch-payload-validation.json','storage-audit.json','manifest-reconciliation.json']:adds.append((R/name,'_verification/'+name))
for p in (R/'evidence').glob('*.jpg'):adds.append((p,'_verification/evidence/'+p.name))
for p in (H/'tools').glob('*.py'):adds.append((p,'_tools/'+p.name))
adds.append((H/'tools/collect_next.py','_tools/resume-collector.py'))
for start in range(0,len(adds),25):api.batch_bucket_files(B,add=adds[start:start+25])
remote={x.path:x for x in api.get_bucket_paths_info(B,[dest for _,dest in adds])}
for local,dest in adds:assert remote[dest].size==local.stat().st_size
print(json.dumps(summary,indent=2));print('Published and size-checked',len(adds),'objects')

Xet Storage Details

Size:
16 kB
·
Xet hash:
b2def8635c1f5c6ece4fc8395bd5c26d404a93e8c6572ffbf11daafa4cba8413

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.