VOIDERATION STAGE 0: IMPLEMENTATION PREFLIGHT
Date: 2026-10-30
Scope: Read-only source/research review. No dashboard or production access was
used; no code, settings or services changed. V22 is the proposed baseline, not
deployed. Do not send secret values; record only names/status and redacted IDs.
STATUS KEY
Known = established from reviewed source/shared records. Unverified = requires
owner dashboard inspection or staging test. “Blocks Stage 1” means do not ship
that implementation until resolved; optional items are identified.
1. PLAYFAB
Moderator UserData permissions
- Known: Unity `Oculus_Login.CreateKeyIfNot()` reads/writes ordinary UserData
key `Moderator`; client sets missing key to FALSE and locally trusts TRUE.
V08 draft has ReadOnlyData helper but does not consistently use it in
`ReportPlayer`. No verified server-owned moderator source found.
- Unverified: current Title API policy, deployed role source, deployed CloudScript
revision, external operator checks.
- Inspect: Game Manager > Title Settings > API Features/Policies (client
`UpdateUserData` access); Player Data/UserData permissions; Automation > Cloud
Script (deployed revision and registered handlers); any Azure Functions and
role data access.
- Secure target: no client-writable role authority. Use server-only InternalData
or role store; ReadOnlyData only for display. Every privileged handler derives
caller identity server-side and checks role. Never trust ReporterId/client role.
- Blocks Stage 1 moderator migration/actions: yes. Do not bulk-promote based on
current writable Moderator values.
CloudScript deployment
- Known: checked-in `revisions/SCREECHVR_PLAYFAB_REVISION_V08_2026-10-29.js`
says DRAFT - NOT DEPLOYED. It contains client-supplied ReportPlayer identity,
ServerGrantCurrency without role auth, and OnPurchaseItem using client Price.
- Unverified: whether another revision/function is live and callable; PlayStream
event rules.
- Inspect: Automation > Cloud Script > revisions/deployments/registered
functions; Azure Functions registrations/auth; PlayStream > Rules/event
triggers; Title API Policies for ExecuteCloudScript/function access.
- Secure target: inventory every deployed handler and caller; server-check caller,
validate inputs, idempotency, audit; staged revision and rollback plan.
- Blocks Stage 1 backend changes: yes.
Currency APIs
- Known: Unity has multiple direct client `AddUserVirtualCurrency` callers via
`Oculus_Login.AddCurrency` (ore, daily reward, Meta IAP/ATM, bundle); V08
`ServerGrantCurrency` has no role check. Source proves calls, not live policy.
- Unverified: client API restrictions, currency/catalog settings, other live
grants, deployed server enforcement.
- Inspect: Game Manager > Title Settings > API Features/Policies for Client
`AddUserVirtualCurrency`/economy access; Economy > Currencies; CloudScript/
Functions deployment and access policy.
- Secure target: migrate legitimate rewards first; backend derives player and
eligibility, bounds amount, unique request/idempotency key, server grant and
audit. Restrict direct client grants only after staged compatibility tests.
- Blocks Stage 1 economy migration: yes.
Purchases and validation
- Known: PlayFab client `PurchaseItem` is used for catalog cosmetics/bundles;
its Legacy API checks submitted expected price against catalog/store price.
V08 custom OnPurchaseItem does not call that API and accepts `args.Price`.
Meta IAP callbacks grant in Unity without source-found server verification;
`OWNED_IAP` is ordinary client UserData.
- Unverified: deployed handlers, catalog/store/currency configuration, Meta
product/SKU mappings and any external receipt-validation service.
- Inspect: Economy > Catalog/Stores/Virtual Currencies and purchase rules; Meta
IAP setup separately. In PlayFab inspect deployed receipt-validation callers
and API policies.
- Secure target: PlayFab catalog price on server; Meta S2S entitlement check,
server SKU/reward map, durable idempotency ledger, consumable consumed after
fulfillment, durable restore idempotently. Preserve every SKU/item/entitlement.
- Blocks Stage 1 purchase migration: yes; do not disable current paths first.
2. PHOTON
- Known: Unity obtains PlayFab Photon token and passes PlayFab ID as username,
token as Photon `token`; this is distinct from PlayFab SessionTicket.
`PhotonVRManager` falls back after 20 seconds by clearing AuthValues and
connecting unauthenticated. No dashboard read was performed.
- Unverified: Custom Server provider/URL, anonymous-client admission, failure
policy, Realtime/Voice app ID mapping, current PUN/Voice versions, reconnect
behavior and any targeted disconnect capability.
- Inspect: Photon Dashboard > Realtime App > Manage/Authentication (Custom
Server URL/provider, “Allow anonymous clients…” and failure behavior); confirm
PlayFab Photon add-on association and app ID. Inspect Voice app/auth separately.
In Unity project settings/package list, record the configured app IDs and PUN/
Voice versions without publishing full IDs.
- Secure target: supported PlayFab custom auth, anonymous clients disabled,
auth failure never downgraded; Unity retries without anonymous fallback.
Restriction enforcement needs a staging-proven Worker adapter that validates
Photon’s token contract and checks D1. Never send a Photon token to
AuthenticateSessionTicket. Exact Worker-to-PlayFab proxy request/response
contract is unverified and must not be guessed.
- Blocks Stage 1 auth/rejoin enforcement: yes. Capture settings first; staging
proof of provider contract and Voice/reconnect required before release.
3. META
User Verification
- Known: current client reads Meta user ID and uses it as PlayFab Custom ID;
no server-side proof validation in inspected flow. V15 docs describe one-use
GetUserProof nonce verified by trusted server-to-server call.
- Unverified: app eligibility, User ID DUC permission, API credentials access,
Unity Platform SDK method availability/build compatibility with Unity 2021.3.32f1,
account-link migration choice.
- Inspect: Meta Developer Dashboard > app > Requirements/Data Use Checkup (User
ID permission/status); API/app settings and product/platform eligibility. Do
not copy app secret into report or client.
- Secure target: backend validates proof nonce/user ID via Meta S2S, replay-safe,
binds verified identity to existing PlayFab account. Proof does not attest
hardware and does not replace entitlement check.
- Blocks: blocks using Meta proof as Stage 1 identity factor; does not block
staging other auth tests if the fallback is not represented as verified.
App Attestation
- Known: no source implementation found; V22 makes it optional.
- Unverified: app/product eligibility, signing/package setup, SDK/API/build
support and server verification access.
- Inspect: Meta Developer Dashboard > app integrity/attestation features and
Unity Platform SDK package/API reference.
- Secure target: optional integrity signal, backend-verifiable fresh challenge;
service outage = unknown, never automatic ban.
- Blocks Stage 1: no, unless owner explicitly makes it a release requirement.
4. CLOUDFLARE
- Known: local Worker has `/redeem`, `/motd`, Photon webhook, Discord interaction,
export/setup/health routes; `/updateplayers` is a no-op. `/redeem` validates
PlayFab tickets for linking only. No D1 binding, heartbeat or incident routes
found in reviewed Worker. Secrets are environment-bound in source conventions;
actual deployed values were not read.
- Unverified: deployed Worker/version, routes/hostnames, bindings, secret names
and rotation status, account plan and aggregate requests/rows, D1 existence,
quota headroom. Query-string keys are present in some routes in source.
- Inspect: Cloudflare Dashboard > Workers & Pages > Worker > Deployments, Routes,
Settings/Bindings (names only); Workers & Pages > D1 databases/bindings; account
plan and Analytics/Metrics > Workers and D1 row metrics. Inspect secrets without
revealing or copying values. Verify domains/route consumers.
- Secure target: server secrets only in Worker secret bindings, never Unity/source;
avoid URL secrets; D1-backed incidents/restrictions/audit with conditional
atomic updates; no KV writes per heartbeat; per-route auth and redacted logs.
- Capacity: V19 model at 100 players/5-minute heartbeat is 28,800 Worker requests
and about 28,800 D1 row updates/day before other traffic. Free quotas are shared;
measure current account headroom. €0 recurring is plausible, not guaranteed.
- Blocks Stage 1 incident/rejoin enforcement: yes, until deployed bindings,
capacity and exact Photon adapter are validated in staging.
5. DISCORD
- Known: shared records name `admin-logs` as current admin log channel. Prior
audit (2026-10-20/21) noted `#mod-logs` Staff-view/send and `#audit-logs`
staff-view-only with a Dyno webhook; status may be stale. No verified private
Voideration alert destination or delivery test.
- Unverified: current channel existence/effective permissions, bot/webhook path,
secret owner, who can view incident evidence, rate/alert behavior.
- Inspect: Discord channel/category permission overwrites for @everyone, member,
staff and bot roles; channel View/Send/History/Embed permissions; Integrations
> Webhooks (names/owner/destination, never reveal URL/token); bot role/channel
permissions. Check moderation/AutoMod alert destinations only if reused.
- Secure target: dedicated owner/staff-only channel; narrow bot identity with
send/view/history/embed only; webhook/bot credentials server-side; redacted,
deduplicated alerts after incident persistence. Confirm access with effective
permissions and a staging test.
- Blocks Stage 1 alert delivery: yes until private destination and posting
mechanism are verified. Do not create/change it during preflight.
6. VOIDERATION OWNER REVIEW / LOCAL DASHBOARD
- Known: no dashboard, incident store, owner approval API, restriction store or
D1 implementation found. V22 is a design only. Existing Worker Discord
interactions have signature validation and OWNER_ID checks for commands.
- Unverified: owner identity binding, local host/device, authentication and
recovery, browser security, review SLA, expiry/appeal/retention policy.
- Inspect/decide: owner-controlled account/identity source; machine/OS where
dashboard will run; loopback bind/firewall; secret storage. No cloud dashboard
settings exist to verify today.
- Secure target: dashboard binds 127.0.0.1 only; owner-authenticated, CSRF-safe
actions call Worker APIs, never direct browser-to-D1; server verifies owner on
every transition. Every attempt/action audited. Incident review state is
separate from player restriction; only owner clears/restricts/bans.
- Blocks Stage 1 incident/review deployment: yes. Decide account method, review
policy, evidence access/retention and restriction expiry before implementation.
STAGE 1 ENTRY: DECISIONS / APPROVALS REQUIRED FROM OWNER
1. Approve the V22 architecture for staging only; production remains unchanged.
2. Authorize read-only inspection of the listed PlayFab, Photon, Meta, Cloudflare
and Discord dashboard settings; provide access through the relevant dashboard,
never by sending secrets in chat. Approve redacted settings inventory.
3. Choose whether Meta User Verification is mandatory, optional, or deferred;
approve identity migration/linking policy that preserves current PlayFab IDs.
4. Approve a staging Photon Realtime/Voice app and test accounts. Decide whether
to investigate the Worker custom-auth proxy contract; no adapter implementation
until the official wire contract is proven.
5. Approve disabling the anonymous fallback only after staging confirms normal
login, room join, reconnect, server switch and Voice; production change requires
separate explicit approval.
6. Approve secure migration of Moderator roles, currency grants, PlayFab purchases
and Meta IAP; confirm product/entitlement preservation and staging test scope.
7. Decide incident severity/rules that may trigger temporary rejoin restriction;
approve PendingReview/Approved/Rejected semantics, confirmed restriction,
expiry/release, separate ban authority, appeals and review SLA. Weak movement,
latency or tracking signals do not auto-restrict or auto-ban.
8. Approve private Discord alert channel/identity after reviewing its effective
permissions. Approve local dashboard device, owner auth, recovery and retention.
9. Confirm €0 additional recurring target is a constraint, and authorize checking
aggregate Cloudflare Workers/D1 quotas; acknowledge a paid tier or authoritative
game server may be needed if quotas/security requirements exceed Free/PUN.
10. Approve Stage 1 scope and release gates; implementation and any production
deployment/settings change require separate explicit approval.
No secret values requested or exposed. No dashboard setting was changed or
verified in this preflight. V22 remains a proposed baseline.
END OF REPORT