# Verification of the export/upload fixes ## Panorama contributions (October 5, 2026) Maps now retain up to 24 captures. Server exports pick random safe positions, and games retain five distinct random rounds. Owners opt into contributions by map ID; non-owners have a cumulative 12-panorama quota. Contributions need owner acceptance and a subsequent moderator review of the combined map/update. Verification against disposable fixtures in the configured Supabase project passed: - Opt-in enforcement, non-owner approval denial, direct child-publication denial, the 24-map limit including reserved uploads, and the cumulative 12-player limit. Two concurrent seven-point uploads allowed only one when that contributor had already added one point. - Withdrawal released pending quota while accepted points continued to count. A one-point contribution completed the private processing/selection workflow. - Acceptance and draft edits left the published metadata/revision unchanged; rejected updates preserved it too. Approval created a new revision, and a pre-existing game retained its old revision. Repeated games selected five distinct locations in varying orders. - The shared Java client uploaded a one-point Fabric fixture through the real signed TUS/Storage flow. The worker generated its cubemap/preview, and retrying the completed upload reused its dataset. An initial undersized 128-pixel fixture was correctly rejected; the valid 256-pixel fixture passed. - Codex's built-in Browser verified owner submission previews, accepting into a published-map draft, submitting the update, moderator inspection of the added location, approval, the updated public count, and the permanent map ID. It caught an inbox-route prefix bug; the route was constrained and its list/cubemap responses rechecked. - A hidden, temporary Paper 1.21.11 server exported 24 random safe locations, a second export changed the positions, and `/minegeo contribute` sent 12 and retried without duplication. Interrupted normal uploads still resumed byte-for-byte. The server stopped automatically. - Both Minecraft tools compiled and the downloadable JARs were rebuilt. Fabric's live in-game capture panel was not launched in this pass; its shared upload protocol was exercised through Java and the real worker. - All 36 unit tests, TypeScript checking and the final Next.js production build passed. The temporary Paper server, website, worker, auth bridge and Browser tabs were stopped. Test media, maps, revisions, sessions, server entry and the newly created contributor account were removed; the user's published map was retained. The new migrations are applied to MineGeo. All new workflow functions deny execution to anon/authenticated and run with invoker security through the website's service role. No existing capture exceeded the new 24-point limit. The revision immutability trigger remains enabled. The security advisor returned the previously documented authentication-setting warning and informational notices for deliberately server-only RLS tables. Reports and screenshots are in `.cache/contribution-verification`, with the Paper regression report in `artifacts-plugin-regression.json`. Deployment requires the updated website/worker and replacing the installed Minecraft JARs; see [panorama contributions](panorama-contributions.md). --- ## First beta texture and usability fixes (October 4, 2026) The renderer previously treated `waterlogged=false` on leaf blocks as water and tinted trees blue. Tint selection now uses the block identifier and exported biome. Animated vanilla sprite sheets use a single frame, grass overlays avoid depth flickering, partial block models use their derived face UVs, and element rotations also rotate lighting normals. Verification completed against the configured MineGeo project: - All 31 unit tests and TypeScript checking passed, including blue-leaf tint, sprite frame selection, restoring excluded locations after reload, and invalid selections. - The Next.js 16.3.8 production build passed. - Both the small renderer fixture and cached real Paper export passed, with no unsupported models. - The user's 2,651,888-block private export rendered 8,838,392 faces and all ten selected panoramas with no unsupported models; its corrected map/previews were uploaded to Supabase. Windows/AMD geometry construction took about 8.8 seconds; the whole render took about 23.7 seconds, excluding download/upload. These measurements do not establish macOS performance. - A temporary fixture verified private-draft denial, draft selection persistence/restoration, interactive 360 previews, moderator review and approval, report resolution, and a guest game through all five rounds to results with real Supabase timers/scores. A different browser could not read the guest session. No uncaught browser errors were observed. The fixture was unpublished, media removed, and database rows cleaned up afterward. - After the user's browser preference was updated, remaining UI checks used Codex's built-in Browser. The earlier standalone test browser and its terminal window were closed. Local screenshots and the regression report are retained in `.cache/beta-verification`. The repaired export's report and images are retained in `.cache/panorama-repair/00ff0076-cae1-4a0d-ab81-9014833309f4`. The user's map remains a private draft pending their moderator workflow. The website UI changes need deployment; no new database migration is required. The Supabase security advisor reported no application schema warnings; tables without client policies are intentionally server-only. Its separate leaked-password-protection warning concerns the project's authentication setting; see [Supabase's password protection guidance](https://supabase.com/docs/guides/auth/password-security#password-strength-and-leaked-password-protection). The site uses magic-link sign-in; the beta test used an existing password-based fixture account. --- The following checks passed on Windows with Java 21 and Minecraft/Paper 1.21.11: - A temporary Paper server with no connected player exported 16 chunks / 10,112 retained blocks and five valid surface viewpoints. - Upload without an export produced instructions instead of a missing-file exception. - An ungenerated area failed clearly, and a later export succeeded. - A simulated mid-transfer interruption resumed from the server's byte offset and reproduced the original SHA-256 checksum. - Retrying a completed upload did not create or finalize a duplicate dataset. - Cancellation preserved the pointer to the previous complete export. - The final Java uploader uploaded a real terrain file to the configured Supabase Storage project through the production Next.js API, then queued processing. - An unrendered draft could be opened without trying to sign nonexistent preview images. - Guests could not read that private draft. - Both an unfinished upload and queued processing could be cancelled. - Production homepage, catalog, downloads, local pixel font, example map, and both JAR URLs returned HTTP 200. - Both Gradle projects built; TypeScript, 14 Node tests, and the Next.js production build passed. The real Storage test caught two additional issues that a mock endpoint did not: Java's cleartext HTTP/2 upgrade was incompatible with the website, and signed TUS transfers require `/storage/v1/upload/resumable/sign` plus the public API key and scoped signature. Both were corrected and the real upload passed afterward. Reports: `artifacts-plugin-regression.json` and `artifacts-api-smoke.json`. Temporary test datasets were deleted and the temporary servers stopped. This pass did not launch a Minecraft client, use Playwright, or use the Computer plugin. The browser appearance, an actual Fabric capture session, Spigot loading, and a fresh plugin panorama rendering run on macOS still need runtime verification. The existing renderer has not been replaced; earlier renderer proof is recorded separately in `artifacts-renderer-proof.json`. ## Large-export optimization The subsequent renderer changes replace per-block model transformation and texture loading with cached state templates, numeric section bitsets, bounded typed geometry buffers and spatial meshes. WebP output avoids an intermediate PNG encode, and processed-image uploads run in a four-request pool. GPU selection is automatic with software fallback on initialization failure. No tests, browsers or benchmarks were run for this change at the user's request. Its speedup and image fidelity on the 2,651,888-block Mac export are unverified. The new per-stage timings, blocks-per-second logs and geometry counts provide measurements for the next real run. ## Empty-render recovery The subsequent Mac report showed 2,651,888 input blocks but zero meshes, emitted faces and geometry bytes. Ordinary vanilla block models and fluid textures were all unavailable. The worker previously skipped those failures and completed sky-only previews. The fix prepares missing/incomplete assets before rendering, checks extraction completion, and rejects zero geometry or sky-only downward/map output. After the user authorized tests again, the following checks passed on Windows using the pinned Playwright 1.56.1 / Chromium 1194 product renderer: - All 27 unit tests, including missing/interrupted asset caches, missing textures, corrupted client checksums, negative-coordinate occupancy, geometry-buffer growth, sky-only WebP rejection, and reprocessing safety/rollback. - TypeScript checking with incremental caching disabled. - A 4,913-block grass/water/tree/building fixture: 29 meshes, 6,521 emitted faces, no unsupported states, valid WebP faces and visible downward terrain at all five viewpoints. - The cached real Paper export: 17,738 blocks, 31 states, 71 meshes, 62,727 emitted faces, no unsupported states, valid map/cubemap images and visible downward terrain at all 12 viewpoints. - A nonexistent block model failed with an explicit missing-assets error instead of completing an empty draft. Both worker renders closed their Chromium processes automatically. No Minecraft server/client or website UI automation was started. Outputs and reports are under `.cache/renderer-regression`; `npm run test:renderer` reproduces the fixture, and a cached export folder can be supplied as an argument. The full 2,651,888-block dataset and Intel Metal/macOS behavior still require regeneration on the Mac. No speedup claim is inferred from the small Windows fixtures. ## Contribution server check (October 5, 2026) The map's expected connection address is separate from its permanent map ID and catalog server name. Owner settings can override it or explicitly clear it. Fabric records its connected server; the plugin has a public `server-address` configuration and `/minegeo server` command. Both use the shared uploader check, including cached retries. The website enforces the check at upload creation/signing/finalization, submission and acceptance. Verification: - All 39 Node tests, TypeScript checking and the final Next.js production build passed. Both Java projects built; both downloadable JARs were replaced. The shared Java address smoke check passed for matching, missing, mismatching, invalid, default-port, override and disabled-check cases. - A disposable hidden Paper server exported its configured address, rejected a mismatching map before creating an upload, accepted a normalized address, rechecked a cached retry and allowed an idempotent retry after clearing. Its previous export/resume/randomness/cancellation checks still passed; the server stopped automatically. - `tests/sql/contribution-server.sql` passed against the configured Supabase project and rolled back all fixture rows. It verified owner-only settings, default address initialization, mismatching/missing captures, changed settings during retries, submission and acceptance guards, clearing, and private RPC permissions. - The normal application API was tested with the existing fixture contributor token and a disposable private map. Override, normalization, invalid-input rejection, contribution-toggle preservation and clearing passed. No new account or credentials were created. - Codex's built-in Browser tested the actual settings component in a local mock-data preview: override/save, clear/warning, invalid address and restore. It observed no browser errors. Screenshot: `.cache/server-check-verification/settings.png`. Automatic approval review rejected a temporary credential-backed browser sign-in bridge. It was not started. Browser verification therefore used mock data; authenticated dashboard integration was verified through the normal API and database checks, not through a signed-in browser session. A live in-game Fabric capture session was not launched. Address checks prevent accidental wrong-server submissions, but client-supplied addresses do not prove server membership against a modified client. Owner inspection and moderator review are retained. The migration is applied to MineGeo; the website and installed Minecraft JARs still need deployment/replacement. The disposable private map was deleted and its absence verified. The user's published map retains its original contribution opt-in state; its older plugin export has no captured address, so the owner must enter one to enable checking. No test storage objects or new authentication accounts were created. Temporary website/preview processes and Browser tabs were stopped; the Paper test shut itself down. ## Account settings and panorama preview (October 5, 2026) Panorama previews now use a centered, responsive modal with expand/restore controls, location navigation, keyboard dismissal and focus restoration. Login and account settings have responsive layouts. The header checks the current session and shows Log in to guests. Profiles support display names; Supabase Auth handles password signup, login, password changes and recovery. - All 43 Node tests, TypeScript checking and the final Next.js production build passed, including account validation, redirect restrictions and recovery-grant tampering/expiry checks. The build caught and resolved a server/client import boundary in the game's shared logo. - Real Supabase API checks passed for login, private profile access/editing, metadata/role injection rejection, missing/wrong current passwords, successful password replacement and old/new password login behavior. The disposable test account and its sessions were removed. - Browser-free HTTP checks passed for guest homepage/login headers, the password form, protected settings redirects, expired recovery and invalid callbacks. No browser was opened for this pass, as requested. Visual behavior and email confirmation/recovery delivery remain unverified. Deployment setup is documented in `docs/account-settings.md`; no account schema migration was needed.