Repository navigation
Technical Requirements
Server-authoritative ACL transactions — Enforce permissions in authenticated HTTP/application code and privileged SQL functions, with shared ACL locking for content writes and exclusive locking for role mutations. Validate identity/origin, strict allowlists, expected revision, digest/retry semantics and bounded private projections. Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-CANDIDATEHOLD-028, FR-CATEGORYSUGGESTIONS-017, FR-NAVIGATIONDRAFTS-029, FR-NOMINATIONS-016, FR-REVIEWCHANGES-027, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-CANDIDATEHOLD-141, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-NAVIGATIONDRAFTS-142, TEST-REVIEWCHANGES-140 Status: completed Scope: layer-1+ Acceptance Criteria:
- Forged actor IDs, browser roles, missing sessions and cross-origin writes are rejected; browser database roles have no direct ACL table/function privilege. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- Serialize concurrent role changes and final-admin checks. A content writer blocked behind revocation must reload roles after the lock and deny a new revoked write. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- Audit insertion failure rolls back role/revision/idempotency mutations; stale revisions and changed command digests fail without side effects; permitted exact replays do not reapply grants. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Anchor assignment — At game start, the service snapshots and indexes the active roster from 1 through N, where N is 2-10. It draws a random integer uniformly from 1 through N, inclusive, and assigns the matching player as anchor for the match. The index remains stable for the match. The service accepts the first category selection only from the anchor and synchronizes the assignment and selected category to all room clients. Covered by: FR: FR-ANCHORSELECTION-007, FR-CATEGORIES-005; TEST: TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-ARCHIVESWBOM-128, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROOMJOINING-001, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ADMINUI-136, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-CONTENTVALIDATION-016, TEST-NOMINATIONTHRESHOLDANDMODERATION-018 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- At game start, the service snapshots and indexes the active roster from 1 through N, where N is 2-10. It draws a random integer uniformly from 1 through N, inclusive, and assigns the matching player as anchor for the match. The index remains stable for the match. The service accepts the first category selection only from the anchor and synchronizes the assignment and selected category to all room clients. (evidence: Changed current scope31October2026 to cap10; pending fresh exact-source validation and independent Cline Beam High review. Prior full criterion/evidence preserved in docs/evidence/release10/qbrain-before.json.)
Answer confidentiality — The target answer remains unavailable to clients until round reveal. A hint is sent only to clients that remain unsolved. Solved players receive no later hints or answer controls for that round. Covered by: FR: FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-LIVESCORECARD-011, FR-OBSERVERS-020, FR-PUBLICLANDING-022, FR-SCORELOCK-010; TEST: TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-ARCHIVESWBOM-128, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LANDINGPAGEPUBLICDATA-050, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROOMJOINING-001, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ANSWERORDER-103, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043 Status: completed Scope: layer-1+ Acceptance Criteria:
- The target answer remains unavailable to clients until round reveal. A hint is sent only to clients that remain unsolved. Solved players receive no later hints or answer controls for that round. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Submission ordering — The service records an authoritative acceptance time for each submission. The first correct accepted answer determines the next-category chooser. If submissions arrive at effectively the same time, the service applies a deterministic ordering rule. Covered by: FR: FR-ANCHORSELECTION-007, FR-ANSWERSTAGES-008, FR-FINALSTANDINGS-014, FR-SCORELOCK-010, FR-SCORING-009; TEST: TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-ARCHIVESWBOM-128, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROOMJOINING-001, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-ROOMINVITATIONS-025 Status: completed Scope: layer-1+ Acceptance Criteria:
- The service records an authoritative acceptance time for each submission. The first correct accepted answer determines the next-category chooser. If submissions arrive at effectively the same time, the service applies a deterministic ordering rule. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Answer validation — The service validates each submission against the pair’s target and its approved accepted-answer list. Capitalization, whitespace, punctuation, and synonym handling follow an approved answer-matching policy. Covered by: FR: FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-SCORELOCK-010, FR-SCORING-009; TEST: TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-ARCHIVESWBOM-128, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LANDINGPAGEPUBLICDATA-050, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROOMJOINING-001, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ANSWERORDER-103, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025 Status: completed Scope: layer-1+ Acceptance Criteria:
- The service validates each submission against the pair’s target and its approved accepted-answer list. Capitalization, whitespace, punctuation, and synonym handling follow an approved answer-matching policy. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- Answer normalization: Apply Unicode NFKC, trim outer whitespace, collapse internal whitespace, and compare case-insensitively. Preserve punctuation. Only the canonical answer or an explicitly listed accepted alternative matches; no fuzzy matching. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
SWBOM in release archive — Every release must include a downloadable archive containing the release contents and the SWBOM generated for the exact release commit and published build. Place the report at sbom/<git-commit-sha>.cdx.json inside the archive. The release packaging step must verify that the SWBOM exists and that its commit SHA matches the release before publication. Do not depend on GitHub Actions for packaging or publication.
Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145
Status: in_progress
Scope: layer-1+
Acceptance Criteria:
- Every release must include a downloadable archive containing the release contents and the SWBOM generated for the exact release commit and published build. Place the report at
sbom/<git-commit-sha>.cdx.jsoninside the archive. The release packaging step must verify that the SWBOM exists and that its commit SHA matches the release before publication. Do not depend on GitHub Actions for packaging or publication. (evidence: Local implementation/fixtures may cover part of this obligation; Phase7 operational completion is not claimed.) - Source archive: Use
.tar.gzcontaining the complete tracked source at the release commit, root GPL-2.0-onlyLICENSE, attribution/notices, andsbom/<commit-sha>.cdx.json; exclude secrets and generated dependencies. Include a SHA-256 sidecar. AC-41/42 validate temporary fixtures; live deployment inventory remains TR-only. (evidence: Requirement imported; operational portions remain unverified until the documented Phase7 check.)
Background rendering — Category backgrounds load on supported phone screens. An overlay or equivalent treatment preserves text contrast. A missing asset must not make round controls unreadable. Covered by: FR: FR-CATEGORIES-005, FR-CATEGORYART-006, FR-RESPONSIVEUI-015; TEST: TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-CONTENTVALIDATION-016, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-ACCESSIBILITYDETAILS-144, TEST-CONTESTREADINESS-147, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145 Status: completed Scope: layer-1+ Acceptance Criteria:
- Category backgrounds load on supported phone screens. An overlay or equivalent treatment preserves text contrast. A missing asset must not make round controls unreadable. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Curated content integrity — Every playable pair has a category identifier, prompt, target answer, three ordered hints, accepted answers, and a category-background reference. A category cannot be enabled unless its required content and background are present. Covered by: FR: FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-NOMINATIONS-016, FR-WORDHINTEDITOR-025; TEST: TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-CONTENTVALIDATION-016, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-ACLAUTHORIZATION-132, TEST-NOMINATIONMODERATION-114, TEST-SUGGESTIONREVIEW-115, TEST-NOMINATIONELIGIBILITY-017 Status: completed Scope: layer-1+ Acceptance Criteria:
- Every playable pair has a category identifier, prompt, target answer, three ordered hints, accepted answers, and a category-background reference. A category cannot be enabled unless its required content and background are present. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Immutable and bounded catalog publication — Route editorial and community publication through the serialized moderation transaction and catalog projection, preserving exact version lookup, audit/outbox atomicity and the historical version ceiling. Covered by: FR: FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-NOMINATIONS-016, FR-WORDHINTEDITOR-025; TEST: TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-CONTENTVALIDATION-016, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-ACLAUTHORIZATION-132, TEST-NOMINATIONMODERATION-114, TEST-SUGGESTIONREVIEW-115, TEST-NOMINATIONELIGIBILITY-017 Status: completed Scope: layer-1+ Acceptance Criteria:
- Save v0 then v1, exclude latest, then save v2: old lookups remain exact and future pools use the current selectable highest version. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- Reject reused/cross-category IDs and nonzero community activation versions, invalid hints and category/background mismatches. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- At4096 approved historical versions, another save or activation returns SERVICE_LIMIT without catalog, state, audit, revision or idempotency writes. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Clock consistency — Elapsed answer time uses a consistent server-controlled round start time and accepted submission time. Client clocks may animate locally, but scorecard and tiebreak values use authoritative times. Covered by: FR: FR-ANSWERSTAGES-008, FR-FINALSTANDINGS-014, FR-LIVESCORECARD-011, FR-SCORELOCK-010; TEST: TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERORDER-103, TEST-ANSWERVALIDATION-104, TEST-ARCHIVESWBOM-128, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CLOCKCONSISTENCY-108, TEST-CONFIGUREDCAPACITY-024, TEST-CONNECTIONRECOVERY-109, TEST-DDDTRANSACTIONS-131, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LANDINGPAGEPUBLICDATA-050, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROOMINVITATIONS-025, TEST-ROOMJOINING-001, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102 Status: completed Scope: layer-1+ Acceptance Criteria:
- Elapsed answer time uses a consistent server-controlled round start time and accepted submission time. Client clocks may animate locally, but scorecard and tiebreak values use authoritative times. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Connection handling — A disconnect must not corrupt accepted scores or duplicate a submission. Reconnecting players retain membership for a two-minute grace interval; after it expires the room applies the normal departure rules. Client retries reuse the original command ID. Covered by: FR: FR-ANSWERSTAGES-008, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-OBSERVERS-020, FR-REQUESTFEEDBACK-030, FR-ROOMACCESS-001; TEST: TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERORDER-103, TEST-ANSWERVALIDATION-104, TEST-ARCHIVESWBOM-128, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CLOCKCONSISTENCY-108, TEST-CONFIGUREDCAPACITY-024, TEST-CONNECTIONRECOVERY-109, TEST-DDDTRANSACTIONS-131, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LANDINGPAGEPUBLICDATA-050, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROOMINVITATIONS-025, TEST-ROOMJOINING-001, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ADMINUI-136, TEST-GITHUBADMIN-149, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PROFILEICON-003, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-REQUESTFEEDBACK-143 Status: completed Scope: layer-1+ Acceptance Criteria:
- A disconnect must not corrupt accepted scores or duplicate a submission. Reconnecting players retain membership for a two-minute grace interval; after it expires the room applies the normal departure rules. Client retries reuse the original command ID. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- Room code, reconnect, creator departure: Use an eight-character Crockford Base32 code. Codes remain valid while the room is active and expire on close; empty rooms close after 30 minutes. Reconnect retains membership for a two-minute grace interval. Creator departure grants no special authority; remaining players retain control. Invalid/expired codes return the same generic not-found response; limit code attempts to 10 per minute per session. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Contest submission and evidence readiness — Release Word Pairs as a verified guest multiplayer contest project with accurate provenance, retained review evidence and an entrant-controlled submission. Covered by: FR: FR-LOBBYDISCOVERY-019, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001; TEST: TEST-ARCHIVESWBOM-128, TEST-BROWSEOPENLOBBIES-022, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-CONNECTIONRECOVERY-109, TEST-CONTESTREADINESS-147, TEST-DDDTRANSACTIONS-131, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-FULLROOMOBSERVER-027, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-INROUNDEMOJIREACTION-029, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-LOBBYMATCHING-117, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-QUICKMATCH-023, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-REALTIMESYNC-102, TEST-ROOMCODES-110, TEST-ROOMINVITATIONS-025, TEST-ROOMJOINING-001, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ACCESSIBILITYDETAILS-144, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-CATEGORYART-005, TEST-MOBILEINPUT-111, TEST-ORIENTATION-015, TEST-RESPONSIVEMATRIX-145, TEST-UIACCESSIBILITY-112 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Before release, retain exact official-rule source/hash, resolve mission/conduct requirements and entrant eligibility, and use the earlier documented cutoff; do not assert unknown compliance.
- At the final stable public HTTPS URL, clean guests on phone/laptop can join by code without required sign-in or install, complete synchronized games and replay; fulfill existing TEST-ROOMSYNC-139 rather than substituting fixture evidence.
- Retain accurate ChatGPT Work design/build provenance and authenticated mission completion evidence; Codex-only activity does not establish the named workflow.
- Prepare title, licensed cover, accurate description and playable URL; the eligible entrant manually submits through the actual Handshake mission before the cutoff, with no automated entry or unapproved agreement acceptance.
- Retain every available hostile-validation receipt including rejected/superseded rounds, labeled reconstructions, corrections, candidate hashes and evidence limits; bind final approval and release/source/SWBOM evidence to the submitted candidate without exposing secrets.
Testable domain and concurrency boundaries — Organize application behavior as a modular monolith with explicit domain boundaries and application use cases. Keep game policies independent of Next.js and Supabase frameworks; route persistence, identity, time, randomness, and realtime effects through injected ports/adapters. Keep each business rule in one canonical domain policy, with database constraints as invariant backstops rather than competing rule implementations. As a TR integration requirement, the persistence adapter serializes conflicting room mutations in one database transaction, enforces durable idempotency for retried commands, and commits the event/outbox record atomically before realtime delivery. These database guarantees are verified as TR integration evidence and do not count toward AC coverage. Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145 Status: completed Scope: layer-1+ Acceptance Criteria:
- Organize application behavior as a modular monolith with explicit domain boundaries and application use cases. Keep game policies independent of Next.js and Supabase frameworks; route persistence, identity, time, randomness, and realtime effects through injected ports/adapters. Keep each business rule in one canonical domain policy, with database constraints as invariant backstops rather than competing rule implementations. As a TR integration requirement, the persistence adapter serializes conflicting room mutations in one database transaction, enforces durable idempotency for retried commands, and commits the event/outbox record atomically before realtime delivery. These database guarantees are verified as TR integration evidence and do not count toward AC coverage. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Direct dependencies and attribution — Declare the approved runtime and test packages as direct dependencies in package.json; pin compatible resolved versions through the package manager lockfile. Maintain docs/ATTRIBUTIONS.md with each direct package’s purpose, license, and upstream source, plus attribution for any externally sourced visual, audio, or content assets. Update it when dependencies or assets change.
Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145
Status: completed
Scope: layer-1+
Acceptance Criteria:
- Declare the approved runtime and test packages as direct dependencies in
package.json; pin compatible resolved versions through the package manager lockfile. Maintaindocs/ATTRIBUTIONS.mdwith each direct package’s purpose, license, and upstream source, plus attribution for any externally sourced visual, audio, or content assets. Update it when dependencies or assets change. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md) - Toolchain and test stack: Next.js with TypeScript, npm with committed lockfile, Vitest for domain/use-case tests, MSW/fakes for ports, Testing Library for UI, and Playwright for browser acceptance. Pin compatible versions after the Phase 0 license/version review and before setup. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
GitHub Actions availability — Build and deployment automation must not depend on GitHub Actions. Use Vercel’s Git integration for automatic branch Preview and main Production deployments. Run infrastructure provisioning scripts manually from an authenticated developer workstation.
Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145
Status: pending
Scope: layer-1+
Acceptance Criteria:
- Build and deployment automation must not depend on GitHub Actions. Use Vercel’s Git integration for automatic branch Preview and
mainProduction deployments. Run infrastructure provisioning scripts manually from an authenticated developer workstation. (evidence: Local implementation/fixtures may cover part of this obligation; Phase7 operational completion is not claimed.)
Design documentation and independent hostile validation — Update design documentation for requested behavior and obtain independent hostile validation with exact source identity, evidence boundaries, findings/corrections and final disposition. Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Architecture, moderation, deployment and administration design agree with the implemented role matrix, bootstrap, transaction ordering, retry semantics and immutable content behavior. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- Independent hostile validation uses the reviewer tool, model and effort selected by the latest explicit operator direction. The current selection is Cline with Beam and High effort until Monday, 2 November 2026; no cutoff hour is specified and no later reviewer is inferred. Before accepting a tracked completion claim, OverallVerdict is AGREE with accuracy at least 98/100, completeness at least 98/100, and no unresolved material findings. Retain the full request and response JSONL, complete verdict and findings in the reviewer's own durable MCP session turn with readback, and the reviewed source manifest with exact revision/worktree/source and evidence identity. Supply all applicable unit and scoped integration TRX evidence under the operator review policy; the reviewer does not build code or run tests. Runtime model and effort selection receipts must support the selected reviewer without implying unverifiable provider-internal reasoning.
- Distinguish agent visual inspection, automated fixtures, real database evidence and hosted operations. Human feedback is optional; do not invent personal sign-off gates or claim unperformed human testing. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Publish synchronized requirements wiki — Each repository refresh-docs run publishes the validated authoritative GitHub wiki export with preserved review evidence and verified remote identity. Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CANDIDATEHOLD-028, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NAVIGATIONDRAFTS-029, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PHONEINSTALL-026, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-REQUESTFEEDBACK-030, FR-RESPONSIVEUI-015, FR-REVIEWCHANGES-027, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CANDIDATEHOLD-141, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-NAVIGATIONDRAFTS-142, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-REQUESTFEEDBACK-143, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145, TEST-REVIEWCHANGES-140 Status: completed Scope: layer-1+ Acceptance Criteria:
- Each refresh-docs reconciles authoritative QBrain records and mappings, verifies readback, exports the supported wiki and validates every configured page and scoped requirement ID before publication. (evidence: Verified wiki commit 45a8e4339746871defa307b0d78e5c9301f006fc; complete remote Git tree readback 270files. Canonical export b6a44c6cc43dddcb473af18d504c64026ef75599f78c04863e4913afe1d0505c; docs/submission/wiki-publication.json; hostile publication approval99/99 and all retained prior rounds in docs/evidence/ui-gaps/hostile-validation.jsonl.)
- Publish the GitHub export to https://github.com/sharpninja/wordpairs.wiki.git, preserve unrelated pages, disclose publication-only link/asset transforms, and verify pushed commit and file hashes by remote Git readback. (evidence: Verified wiki commit 45a8e4339746871defa307b0d78e5c9301f006fc; complete remote Git tree readback 270files. Canonical export b6a44c6cc43dddcb473af18d504c64026ef75599f78c04863e4913afe1d0505c; docs/submission/wiki-publication.json; hostile publication approval99/99 and all retained prior rounds in docs/evidence/ui-gaps/hostile-validation.jsonl.)
- Preserve all available hostile-validation receipts including rejected/superseded rounds and labeled reconstructions, bind approvals to source/evidence inventories, and exclude private runtime credentials/session files from the published evidence. (evidence: Verified wiki commit 45a8e4339746871defa307b0d78e5c9301f006fc; complete remote Git tree readback 270files. Canonical export b6a44c6cc43dddcb473af18d504c64026ef75599f78c04863e4913afe1d0505c; docs/submission/wiki-publication.json; hostile publication approval99/99 and all retained prior rounds in docs/evidence/ui-gaps/hostile-validation.jsonl.)
Free-tier operation — The deployment must remain on free tiers: Vercel Hobby and Supabase Free. Do not enable paid add-ons, metered upgrades, or paid external services. The product is personal and non-commercial while using Vercel Hobby. Current Supabase Free constraints include a 500 MB database, 200 concurrent Realtime connections, 100 Realtime messages per second, 2 million Realtime messages per month, and automatic pause after one week of inactivity. Treat these as capacity limits and provide graceful handling when service quotas are reached. Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- The deployment must remain on free tiers: Vercel Hobby and Supabase Free. Do not enable paid add-ons, metered upgrades, or paid external services. The product is personal and non-commercial while using Vercel Hobby. Current Supabase Free constraints include a 500 MB database, 200 concurrent Realtime connections, 100 Realtime messages per second, 2 million Realtime messages per month, and automatic pause after one week of inactivity. Treat these as capacity limits and provide graceful handling when service quotas are reached. (evidence: Local implementation/fixtures may cover part of this obligation; Phase7 operational completion is not claimed.)
- Quota behavior and initial load target: Initial supported target is one full 10-player room plus up to 25 observers. Quota rejection returns a recoverable
SERVICE_LIMIT, preserves the last committed state, and allows retry with the same command ID; no paid fallback or non-idempotent automatic retry. (evidence: Changed current scope31October2026 to cap10; pending fresh exact-source validation and independent Cline Beam High review. Prior full criterion/evidence preserved in docs/evidence/release10/qbrain-before.json.)
Fixed GitHub owner and separate admin authentication realm — Authenticate only verified GitHub numeric ID16146732 and login sharpninja using Authorization Code/S256PKCE and one-time browser-bound challenges. Use wp_admin/wp_admin_login and purpose-separated persisted digests; preserve guest sessions and never persist provider access/refresh tokens. Covered by: FR: FR-ADMINPAGES-023, FR-GUESTADMIN-031, FR-IDENTITY-018, FR-PHONEINSTALL-026, FR-PLAYERPROFILE-002; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GITHUBADMIN-149, TEST-GPL20ONLYRELEASE-042, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SUGGESTIONREVIEW-115, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PROFILEICON-003, TEST-ROOMINVITATIONS-025, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Only GitHub numeric account16146732 with login sharpninja can establish an admin identity. Authorization Code uses exact registered callbacks, S256PKCE, cryptographic state and a one-time expiring browser-bound challenge; wrong users, duplicate parameters, replay and provider failures issue no admin session. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- Guest/admin cookies and stored challenge/session digests use separate namespaces. Copying a token into the other cookie cannot authenticate. GitHub login/logout preserves the guest session. Admin API responses are private/no-store and logout requires same origin and revokes the stored admin session. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- Navigation/private content require the verified admin session; ordinary guest grants cannot authorize admin pages. Callback failure gives safe visible feedback; logout/failure removes links, stale requests cannot restore private state, and active content edits retain audit/version/retry rules. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- All account/member profiles, including the GitHub administrator and retired OpenAI profiles, are excluded server-side from public leaderboard/landing projections even when their saved public flag is true. New member profiles default private. Guest opt-in, ordering, bounded paging and revision conflict behavior remain unchanged. (evidence: User confirmed 28 October 2026: Hide all old member profiles. Recovery slice tests and migration pending; no completion claimed.)
Identity and authentication — Public sessions support guests only and ignore stored/bootstrap roles. Separate fixed-owner GitHub admin authentication uses isolated cookies/digests, secure Authorization Code/S256PKCE/state, expiry and one-time consumption. OpenAI authentication is inactive in this release. Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-GUESTADMIN-031, FR-IDENTITY-018, FR-PHONEINSTALL-026, FR-PLAYERPROFILE-002; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Public gameplay offers guest entry only. Public OpenAI routes return404, member-shaped public sessions fail closed, and public session permissions are empty regardless of stored grants or bootstrap configuration. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- Only GitHub numeric account16146732 with login sharpninja can establish an admin identity. Authorization Code uses exact registered callbacks, S256PKCE, cryptographic state and a one-time expiring browser-bound challenge; wrong users, duplicate parameters, replay and provider failures issue no admin session. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- Guest/admin cookies and stored challenge/session digests use separate namespaces. Copying a token into the other cookie cannot authenticate. GitHub login/logout preserves the guest session. Admin API responses are private/no-store and logout requires same origin and revokes the stored admin session. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
Public landing data boundary — Serve the landing page and its gameplay rules without requiring authentication. Retrieve leaderboard and lobby display data through a read-only, server-controlled public projection that returns only approved fields. Restrict lobby results to discoverable, joinable rooms; exclude room codes, non-public profile fields and identifiers, observer perspective data, guesses, targets, moderation records, and secrets. Use bounded pagination, a documented refresh/cache policy, and recoverable empty/unavailable states. Do not expose service-role credentials or allow the public query to mutate game state. Covered by: FR: FR-PUBLICLANDING-022; TEST: TEST-ANSWERCONFIDENTIALITY-105, TEST-ARCHIVESWBOM-128, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-LANDINGPAGEPUBLICDATA-050, TEST-LANDINGPRIVACY-130, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PUBLICGAMELANDINGPAGE-043, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148 Status: completed Scope: layer-1+ Acceptance Criteria:
- Serve the landing page and its gameplay rules without requiring authentication. Retrieve leaderboard and lobby display data through a read-only, server-controlled public projection that returns only approved fields. Restrict lobby results to discoverable, joinable rooms; exclude room codes, non-public profile fields and identifiers, observer perspective data, guesses, targets, moderation records, and secrets. Use bounded pagination, a documented refresh/cache policy, and recoverable empty/unavailable states. Do not expose service-role credentials or allow the public query to mutate game state. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- Public landing contract: Leaderboard is lifetime wins, then total points, earliest win, and stable profile ID. Show public alias only, include opt-in guests, honor profile opt-out. Lobby card shows exact player count/capacity, waiting state and room age, never room code/player names. Refresh lobby data every 15 seconds and leaderboard every five minutes. Rules are a concise versioned summary with an updated date. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Project license — License Wordpairs source and the game under GNU GPL version 2 only (GPL-2.0-only). Include the complete license text in the root LICENSE file and include that file in each source release archive. Preserve independent third-party license notices and check compatibility before redistributing any third-party code or asset as part of the game.
Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145
Status: completed
Scope: layer-1+
Acceptance Criteria:
- License Wordpairs source and the game under GNU GPL version 2 only (
GPL-2.0-only). Include the complete license text in the rootLICENSEfile and include that file in each source release archive. Preserve independent third-party license notices and check compatibility before redistributing any third-party code or asset as part of the game. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Lobby discovery and matching — The service lists only discoverable lobbies with available player slots under their configured capacity. Rooms are private by default. Quick match selects the oldest eligible room, then stable room ID; all player-seat assignments use the same atomic capacity check. Deep links containing a valid room code route directly to that room without lobby browsing, then use the same authoritative open-slot check. A valid invite to a full room may establish an observer session without reserving a player slot. Lobby discovery responses expose only approved lobby metadata, not private room state. Covered by: FR: FR-LOBBYDISCOVERY-019, FR-ROOMACCESS-001; TEST: TEST-ARCHIVESWBOM-128, TEST-BROWSEOPENLOBBIES-022, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-CONNECTIONRECOVERY-109, TEST-CONTESTREADINESS-147, TEST-DDDTRANSACTIONS-131, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-FULLROOMOBSERVER-027, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-INROUNDEMOJIREACTION-029, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-LOBBYMATCHING-117, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-QUICKMATCH-023, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-REALTIMESYNC-102, TEST-ROOMCODES-110, TEST-ROOMINVITATIONS-025, TEST-ROOMJOINING-001, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148 Status: completed Scope: layer-1+ Acceptance Criteria:
- The service lists only discoverable lobbies with available player slots under their configured capacity. Rooms are private by default. Quick match selects the oldest eligible room, then stable room ID; all player-seat assignments use the same atomic capacity check. Deep links containing a valid room code route directly to that room without lobby browsing, then use the same authoritative open-slot check. A valid invite to a full room may establish an observer session without reserving a player slot. Lobby discovery responses expose only approved lobby metadata, not private room state. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Mobile input — Primary actions work with touch and keyboard input. Category art does not obstruct text entry, hints, score status, or buttons in either phone orientation. Covered by: FR: FR-NAVIGATIONDRAFTS-029, FR-RESPONSIVEUI-015; TEST: TEST-NAVIGATIONDRAFTS-142, TEST-WIKIPUBLISH-148, TEST-ACCESSIBILITYDETAILS-144, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARCHIVESWBOM-128, TEST-ARTRENDER-107, TEST-CATEGORYART-005, TEST-CONTESTREADINESS-147, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-LICENSEGPL-129, TEST-MOBILEINPUT-111, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-ORIENTATION-015, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-RESPONSIVEMATRIX-145, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-UIACCESSIBILITY-112, TEST-VERCELDEPLOYMENT-120 Status: completed Scope: layer-1+ Acceptance Criteria:
- Primary actions work with touch and keyboard input. Category art does not obstruct text entry, hints, score status, or buttons in either phone orientation. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Integration games for every supported player count — Exercise the real identity/room/lobby/match/PostgreSQL services in complete eight-round games for every integer player count2..10, using disposable infrastructure. Covered by: FR: FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-FINALSTANDINGS-014, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009; TEST: TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-ARCHIVESWBOM-128, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROOMJOINING-001, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Run9 complete games with54 player participations and432 accepted round solves; every game reaches shared final standings. (evidence: Changed current scope31October2026 to cap10; pending fresh exact-source validation and independent Cline Beam High review. Prior full criterion/evidence preserved in docs/evidence/release10/qbrain-before.json.)
- Exercise all hint/scoring stages, simultaneous conflicts/retries, roster/anchor transitions and exactly-once profile awards. Keep deterministic clocks/randomness; preserve all assertions under bounded fixture wall-clock timeouts. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- Use a disposable loopback-only database, apply every migration and remove owned containers/fixtures in finally without touching the running game database. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Candidate nomination and moderation — The service permits nomination submission only for a player who solved the current round before any hint. It stores each nomination against a normalized candidate word and records its nominating player and timestamp. Candidate eligibility requires both at least 10 nominations and an approved moderation status. Moderation status, nomination count, and eligibility state must be auditable. An eligible candidate cannot be played until a complete curated word-pair record exists. Covered by: FR: FR-ADMINPAGES-023, FR-CANDIDATEHOLD-028, FR-CATEGORYSUGGESTIONS-017, FR-NOMINATIONS-016; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GITHUBADMIN-149, TEST-GPL20ONLYRELEASE-042, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SUGGESTIONREVIEW-115, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CANDIDATEHOLD-141, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016 Status: completed Scope: layer-1+ Acceptance Criteria:
- The service permits nomination submission only for a player who solved the current round before any hint. It stores each nomination against a normalized candidate word and records its nominating player and timestamp. Candidate eligibility requires both at least 10 nominations and an approved moderation status. Moderation status, nomination count, and eligibility state must be auditable. An eligible candidate cannot be played until a complete curated word-pair record exists. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- Nomination counting: Count unique player profiles per normalized candidate. A profile may nominate a candidate once and submit at most one candidate per eligible no-hint solve. Moderation begins at 10 unique nominations. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- Moderation workflow: Roles are Content Moderator and Senior Moderator. At threshold, content enters Pending Review. A moderator other than the proposer approves or rejects with a reason. The proposer may appeal once to a Senior Moderator. Approval alone does not make content playable; the complete curated record must pass validation. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Observer perspective and permissions — An observer session is read-only, limited to 25 observers per room, and is bound to the player who invited the observer. Signed links carry inviter context; a manual room-code observer selects an active inviter from the roster. Observer queue order is transactional, with stable profile ID as tie-break. The service streams the same player-authorized game view that the inviter’s client receives, including updates as the inviter’s view changes, while rejecting guesses, category choices, and other game-affecting commands from the observer. Observers do not count toward player capacity or scoring. Covered by: FR: FR-LOBBYLIFECYCLE-003, FR-OBSERVERS-020; TEST: TEST-ARCHIVESWBOM-128, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-CONNECTIONRECOVERY-109, TEST-DDDTRANSACTIONS-131, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-FULLROOMOBSERVER-027, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-INROUNDEMOJIREACTION-029, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-REALTIMESYNC-102, TEST-ROOMCODES-110, TEST-ROOMINVITATIONS-025, TEST-ROOMJOINING-001, TEST-ROOMSYNC-139, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ANSWERCONFIDENTIALITY-105, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERMISSIONS-118 Status: completed Scope: layer-1+ Acceptance Criteria:
- An observer session is read-only, limited to 25 observers per room, and is bound to the player who invited the observer. Signed links carry inviter context; a manual room-code observer selects an active inviter from the roster. Observer queue order is transactional, with stable profile ID as tie-break. The service streams the same player-authorized game view that the inviter’s client receives, including updates as the inviter’s view changes, while rejecting guesses, category choices, and other game-affecting commands from the observer. Observers do not count toward player capacity or scoring. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Persistence and real-time room state — Use Supabase Postgres as the durable source of truth for profiles, curated pairs, nominations, moderation records, completed matches, and scores. Use Supabase Realtime for active-room presence and event delivery within its free-tier limits. Do not rely on a Vercel Function’s process memory as shared or durable room state. Keep category background assets in the repository unless a future requirement needs uploaded files. Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Use Supabase Postgres as the durable source of truth for profiles, curated pairs, nominations, moderation records, completed matches, and scores. Use Supabase Realtime for active-room presence and event delivery within its free-tier limits. Do not rely on a Vercel Function’s process memory as shared or durable room state. Keep category background assets in the repository unless a future requirement needs uploaded files. (evidence: Local implementation/fixtures may cover part of this obligation; Phase7 operational completion is not claimed.)
- Persistence/security model: All writes and private reads go through server application commands; browser receives no service-role credential and no direct table grants. RLS remains enabled, with narrow public and actor-authorized views/functions. Moderator roles are server-managed. Raw incorrect guesses are not persisted. Audit events retain one year; published outbox rows seven days; idempotency results until 30 days after room close. (evidence: Requirement imported; operational portions remain unverified until the documented Phase7 check.)
Private-data-safe PWA offline and updates — Keep private data out of admin worker caches, provide static offline admin recovery, and retire the former public worker/cache without touching other apps. Covered by: FR: FR-ADMINPAGES-023, FR-GUESTADMIN-031, FR-IDENTITY-018, FR-PHONEINSTALL-026; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GITHUBADMIN-149, TEST-GPL20ONLYRELEASE-042, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SUGGESTIONREVIEW-115, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PROFILEICON-003, TEST-ROOMINVITATIONS-025 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Network-failed admin document navigation returns a generic static reconnect/sign-in screen without private content; online recovery requires a current admin session. Public/API/auth navigations receive no admin offline fallback. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- API/auth/realtime/private navigation and mutations are never stored in worker caches; offline API/mutation requests fail without receiving offline HTML. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- Admin updates remove only older wordpairs-admin-pwa-* caches and wait for active clients. Legacy public retirement removes only wordpairs-pwa-* and root /sw.js registration, preserving admin and other apps. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- The former root worker retires itself and only wordpairs-pwa-* caches. Admin/unrelated registrations and caches survive. Existing OS-installed icons cannot be removed by website code and are not claimed removed. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- The former root worker retires itself and only wordpairs-pwa-* caches. Admin/unrelated registrations and caches survive. Existing OS-installed icons cannot be removed by website code and are not claimed removed. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- Admin worker handles only same-origin GET admin document navigations, preserves HTTP errors and provides a generic offline screen only for network failure. It caches only public offline HTML/icons; no private HTML, sessions, APIs, credentials, RSC, mutations or background actions. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
Phone manifest and install lifecycle — Serve the explicit admin manifest route and admin-only metadata/install lifecycle while public pages expose none. Covered by: FR: FR-ADMINPAGES-023, FR-GUESTADMIN-031, FR-IDENTITY-018, FR-PHONEINSTALL-026; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GITHUBADMIN-149, TEST-GPL20ONLYRELEASE-042, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SUGGESTIONREVIEW-115, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PROFILEICON-003, TEST-ROOMINVITATIONS-025 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Only admin HTML links a manifest with stable id /admin, start_url /admin, scope /admin, Wordpairs Admin names, standalone display, same-origin192/512 PNGs and separate maskable icon. Public HTML has no manifest. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- Referenced PNGs have declared dimensions, opaque brand background and safe-zone maskable artwork; Apple metadata and touch icon exist. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- Authenticated admin UI registers /admin-sw.js with scope /admin and updateViaCache none in secure contexts, handles failures and uses fresh worker script headers. Public game has no installation UI or active worker registration. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- A captured install event prompts once after a click; dismissal/rejection preserves guidance; installed/standalone state hides install UI and listeners clean up. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- Admin-only phone guidance covers iPhone Share/Android menus and HTTPS, with accessible narrow-screen layout. No physical installation or standalone GitHub cookie-context continuity is claimed by emulation. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
- Only admin pages link the admin manifest with identity/start/scope /admin and standalone presentation. Only authenticated admin UI offers installation. Public / and /play expose no manifest or install controls. No GitHub secret or provider token is returned to a browser response or client bundle. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
Emoji reaction delivery — The service accepts only 👍, ❤️, 😂, 🎉, and 👀; each player may send one reaction every two seconds. It broadcasts reactions to connected players and observers in real time; reactions disappear after five seconds. Reactions are informational events and cannot mutate scores, answer submissions, hint state, category selection, or match state. Covered by: FR: FR-REACTIONS-021; TEST: TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-FULLROOMOBSERVER-027, TEST-GPL20ONLYRELEASE-042, TEST-INROUNDEMOJIREACTION-029, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-REACTIONDELIVERY-119, TEST-REALTIMESYNC-102, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148 Status: completed Scope: layer-1+ Acceptance Criteria:
- The service accepts only 👍, ❤️, 😂, 🎉, and 👀; each player may send one reaction every two seconds. It broadcasts reactions to connected players and observers in real time; reactions disappear after five seconds. Reactions are informational events and cannot mutate scores, answer submissions, hint state, category selection, or match state. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- Reactions: Menu: 👍, ❤️, 😂, 🎉, 👀. A reaction is visible for five seconds; one reaction per player per two seconds. It cannot change game state or score. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Real-time synchronization — The service synchronizes room membership and round updates to all connected players. A confirmed correct answer updates the live scorecard, and all clients progress through the same hint stage. Covered by: FR: FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-OBSERVERS-020, FR-REACTIONS-021, FR-ROOMACCESS-001; TEST: TEST-ANSWERCONFIDENTIALITY-105, TEST-ARCHIVESWBOM-128, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-CONNECTIONRECOVERY-109, TEST-DDDTRANSACTIONS-131, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-FULLROOMOBSERVER-027, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-INROUNDEMOJIREACTION-029, TEST-LANDINGPAGEPUBLICDATA-050, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-REALTIMESYNC-102, TEST-ROOMINVITATIONS-025, TEST-ROOMJOINING-001, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-REACTIONDELIVERY-119 Status: completed Scope: layer-1+ Acceptance Criteria:
- The service synchronizes room membership and round updates to all connected players. A confirmed correct answer updates the live scorecard, and all clients progress through the same hint stage. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Room code handling — Room codes identify the intended active room and reject invalid or expired codes. Each room stores a configured capacity from 2 through 10. Room-code joins and deep-link joins use the same authoritative slot check as lobby browsing and quick match. When full, a valid invite permits the player to request observer mode instead of a player slot. Before countdown, promote the oldest observer into the last player position when a player leaves a full room; break equal observer-arrival times by stable profile ID. Use an eight-character Crockford Base32 code, valid while the room is active and expired on close; close empty rooms after 30 minutes and limit invalid-code attempts to 10 per minute per session. Covered by: FR: FR-ANSWERSTAGES-008, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-OBSERVERS-020, FR-ROOMACCESS-001; TEST: TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERORDER-103, TEST-ANSWERVALIDATION-104, TEST-ARCHIVESWBOM-128, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CLOCKCONSISTENCY-108, TEST-CONFIGUREDCAPACITY-024, TEST-CONNECTIONRECOVERY-109, TEST-DDDTRANSACTIONS-131, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LANDINGPAGEPUBLICDATA-050, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROOMINVITATIONS-025, TEST-ROOMJOINING-001, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ADMINUI-136, TEST-GITHUBADMIN-149, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PROFILEICON-003, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Room codes identify the intended active room and reject invalid or expired codes. Each room stores a configured capacity from 2 through 10. Room-code joins and deep-link joins use the same authoritative slot check as lobby browsing and quick match. When full, a valid invite permits the player to request observer mode instead of a player slot. Before countdown, promote the oldest observer into the last player position when a player leaves a full room; break equal observer-arrival times by stable profile ID. Use an eight-character Crockford Base32 code, valid while the room is active and expired on close; close empty rooms after 30 minutes and limit invalid-code attempts to 10 per minute per session. (evidence: Changed current scope31October2026 to cap10; pending fresh exact-source validation and independent Cline Beam High review. Prior full criterion/evidence preserved in docs/evidence/release10/qbrain-before.json.)
- Room code, reconnect, creator departure: Use an eight-character Crockford Base32 code. Codes remain valid while the room is active and expire on close; empty rooms close after 30 minutes. Reconnect retains membership for a two-minute grace interval. Creator departure grants no special authority; remaining players retain control. Invalid/expired codes return the same generic not-found response; limit code attempts to 10 per minute per session. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- New rooms and new matches allow at most10 players. Existing running matches, including historical larger rosters, remain readable, replayable and finishable; existing members can leave. Oversized legacy waiting/countdown rooms admit no additional player above10 and cannot start a new oversized match. They show a clear10-player compatibility notice and retain Leave. No existing room, player, match or historical result is deleted, and membership/readiness deadlines never forcibly evict members merely to fit the new cap. Legacy rooms with at most10 players may start an allowed match using safe effective capacity. (evidence: Changed current scope31October2026 to cap10; pending fresh exact-source validation and independent Cline Beam High review. Prior full criterion/evidence preserved in docs/evidence/release10/qbrain-before.json.)
Private live multiplayer delivery and autonomous progression — Configure authenticated Realtime and an independent durable deadline/outbox worker. Game state must propagate end to end to players and bound observers without relying on periodic browser reads. Preserve authority, privacy, idempotency and owned temporary-runtime cleanup. Covered by: FR: FR-LOBBYLIFECYCLE-003, FR-REQUESTFEEDBACK-030; TEST: TEST-ARCHIVESWBOM-128, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-CONNECTIONRECOVERY-109, TEST-DDDTRANSACTIONS-131, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-FULLROOMOBSERVER-027, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-INROUNDEMOJIREACTION-029, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-REALTIMESYNC-102, TEST-ROOMCODES-110, TEST-ROOMINVITATIONS-025, TEST-ROOMJOINING-001, TEST-ROOMSYNC-139, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-REQUESTFEEDBACK-143 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Actual private WebSocket subscriptions deliver only event/aggregate/version metadata to authenticated per-profile audiences; anonymous, cross-profile subscriptions and client publication are denied. (evidence: docs/evidence/room-sync/live-ui-final.log; docs/evidence/room-sync/live-ui-observations.json; docs/evidence/room-sync/runtime-health.json; docs/evidence/room-sync/auth-callback-green.log; docs/evidence/room-sync/lease-contract.log; docs/evidence/room-sync/unit-regression-final.log; tests/browser/live-player-counts.integration.spec.ts (matrix pending))
- Repeatable browser integration creates real guests and room membership, enters a code, readies players, plays eight UI rounds, and verifies remote category, solve, hints, scores, reveal, reactions and final standings through actual private notifications and authorized reads while periodic UI polling is suppressed. (evidence: docs/evidence/room-sync/live-ui-final.log; docs/evidence/room-sync/live-ui-observations.json; docs/evidence/room-sync/runtime-health.json; docs/evidence/room-sync/auth-callback-green.log; docs/evidence/room-sync/lease-contract.log; docs/evidence/room-sync/unit-regression-final.log; tests/browser/live-player-counts.integration.spec.ts (matrix pending))
- An authenticated server worker advances countdown and hint deadlines with all browsers offline, drains bounded durable outbox batches, reports deadline and publication failures separately, and preserves failed events for retry. Foreground requests never wait for an active worker batch. (evidence: docs/evidence/room-sync/live-ui-final.log; docs/evidence/room-sync/live-ui-observations.json; docs/evidence/room-sync/runtime-health.json; docs/evidence/room-sync/auth-callback-green.log; docs/evidence/room-sync/lease-contract.log; docs/evidence/room-sync/unit-regression-final.log; tests/browser/live-player-counts.integration.spec.ts (matrix pending))
- The temporary HTTPS gateway serves app and Realtime paths while rejecting tenant management paths; private credentials and internal ports remain private. Cleanup acts only on its captured lease generation and owned resource identities. A separate-broker harness must own a separate strict-TLS game database/outbox; partial startup or unconfirmed cleanup preserves recovery identities and blocks replacement. (evidence: docs/evidence/room-sync/live-ui-final.log; docs/evidence/room-sync/live-ui-observations.json; docs/evidence/room-sync/runtime-health.json; docs/evidence/room-sync/auth-callback-green.log; docs/evidence/room-sync/lease-contract.log; docs/evidence/room-sync/unit-regression-final.log; tests/browser/live-player-counts.integration.spec.ts (matrix pending))
- Focus, visibility and online recovery trigger authorized reads; concurrent reads coalesce one follow-up, older responses cannot lose newer notifications, and unmount/account changes prevent obsolete subscriptions after deferred authentication. Connected game/social safety reads use15seconds and disconnected recovery uses1second; cadence changes preserve in-flight/coalesced reads and independent display clocks. Presence responses are fully consumed before clearing canonical retries and refreshing; a body-read failure retains the exact retry command. (evidence: docs/evidence/room-sync/live-ui-final.log; docs/evidence/room-sync/live-ui-observations.json; docs/evidence/room-sync/runtime-health.json; docs/evidence/room-sync/auth-callback-green.log; docs/evidence/room-sync/lease-contract.log; docs/evidence/room-sync/unit-regression-final.log; tests/browser/live-player-counts.integration.spec.ts (matrix pending))
- Real UI integration proves token renewal beyond the original120-second expiry and actual WebSocket close/reconnect followed by another push-driven game transition. (evidence: docs/evidence/room-sync/live-ui-final.log; docs/evidence/room-sync/live-ui-observations.json; docs/evidence/room-sync/runtime-health.json; docs/evidence/room-sync/auth-callback-green.log; docs/evidence/room-sync/lease-contract.log; docs/evidence/room-sync/unit-regression-final.log; tests/browser/live-player-counts.integration.spec.ts (matrix pending))
- Repeatable browser integration plays real eight-round games at every player count2 through10, with UI readiness/categories/every answer and identical final rankings, using a separately owned TLS game database and private Realtime outbox. At most two UI answers are submitted simultaneously; local results do not establish public-tunnel capacity. Cleanup is truthful and bounded. (evidence: Changed current scope31October2026 to cap10; pending fresh exact-source validation and independent Cline Beam High review. Prior full criterion/evidence preserved in docs/evidence/release10/qbrain-before.json.)
Provisioning and schema changes — Provide a manually invoked, repeatable provisioning script using the Supabase and Vercel CLIs. It must create or link the projects, apply version-controlled database migrations, and set required Vercel environment variables for wordpairs logical staging and wordpairs-j9jf production, each on its own isolated Vercel production target with unsafe feature previews disabled until separately and safely bound to non-production resources. The script must accept authenticated credentials from the operator’s environment, never commit or print secret values, and avoid configuring paid resources. Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Provide a manually invoked, repeatable provisioning script using the Supabase and Vercel CLIs. It must create or link the projects, apply version-controlled database migrations, and set required Vercel environment variables for wordpairs logical staging and wordpairs-j9jf production, each on its own isolated Vercel production target with unsafe feature previews disabled until separately and safely bound to non-production resources. The script must accept authenticated credentials from the operator’s environment, never commit or print secret values, and avoid configuring paid resources. (evidence: Local implementation/fixtures may cover part of this obligation; Phase7 operational completion is not claimed.)
- Deadline scheduler: Store versioned deadline jobs in Postgres and process due jobs using Supabase Cron/
pg_cronat one-second cadence; each job calls a transactional database function, with stale-version and duplicate delivery as no-ops. This is a TR technical choice; verify current Free-plan capability at Phase 7 deployment entry after coding. (evidence: Requirement imported; operational portions remain unverified until the documented Phase7 check.) - Given the planner is supplied recorded hosted history of core 001 through 011 followed by the hosted scheduler and private realtime migrations, it proposes later core extensions in order; changed, out-of-order, or unknown longer history is rejected before applying any migration.
Authoritative room state — A server-side game service owns room membership, round state, accepted answers, hint stage, scoring, solve timestamps, category choice, and match completion. Clients cannot award points or change a target answer. Covered by: FR: FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-FINALSTANDINGS-014, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-OBSERVERS-020, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009; TEST: TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-ARCHIVESWBOM-128, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LICENSEGPL-129, TEST-LIVESCORECARD-010, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROOMJOINING-001, TEST-ROUNDSUMMARY-012, TEST-SCHEMAPROVISIONING-123, TEST-STATEAUTHORITY-101, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118 Status: completed Scope: layer-1+ Acceptance Criteria:
- A server-side game service owns room membership, round state, accepted answers, hint stage, scoring, solve timestamps, category choice, and match completion. Clients cannot award points or change a target answer. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Category suggestion eligibility and review — The service tracks game wins for each player and unlocks category-and-pair suggestions when the player reaches 10 wins. It stores the proposed category and its three proposed word pairs as one submission, tracks its review status, and prevents unapproved or incomplete content from entering the playable catalog. Win counts use a stable player profile and are cumulative for that profile’s lifetime. Covered by: FR: FR-ADMINPAGES-023, FR-CATEGORYSUGGESTIONS-017, FR-NOMINATIONS-016, FR-REVIEWCHANGES-027; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GITHUBADMIN-149, TEST-GPL20ONLYRELEASE-042, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SUGGESTIONREVIEW-115, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-REVIEWCHANGES-140 Status: completed Scope: layer-1+ Acceptance Criteria:
- The service tracks game wins for each player and unlocks category-and-pair suggestions when the player reaches 10 wins. It stores the proposed category and its three proposed word pairs as one submission, tracks its review status, and prevents unapproved or incomplete content from entering the playable catalog. Win counts use a stable player profile and are cumulative for that profile’s lifetime. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
- Moderation workflow: Roles are Content Moderator and Senior Moderator. At threshold, content enters Pending Review. A moderator other than the proposer approves or rejects with a reason. The proposer may appeal once to a Senior Moderator. Approval alone does not make content playable; the complete curated record must pass validation. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Per-build software bill of materials — Generate one CycloneDX JSON 1.6 software bill of materials (SWBOM) from the exact npm lockfile for every Vercel Preview or Production deployment. Include direct and transitive runtime and development components, declared licenses, package URLs, dependency relationships, build timestamp, Git commit SHA, deployment environment, and Vercel deployment URL. Generate it after the mock-first test gate and before the application build, then bundle it into that same immutable deployment at public/sbom/<git-commit-sha>.cdx.json. Never include secrets or environment-variable values. Document the artifact contract in docs/SWBOM.md.
Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145
Status: in_progress
Scope: layer-1+
Acceptance Criteria:
- Generate one CycloneDX JSON 1.6 software bill of materials (SWBOM) from the exact npm lockfile for every Vercel Preview or Production deployment. Include direct and transitive runtime and development components, declared licenses, package URLs, dependency relationships, build timestamp, Git commit SHA, deployment environment, and Vercel deployment URL. Generate it after the mock-first test gate and before the application build, then bundle it into that same immutable deployment at
public/sbom/<git-commit-sha>.cdx.json. Never include secrets or environment-variable values. Document the artifact contract indocs/SWBOM.md. (evidence: Local implementation/fixtures may cover part of this obligation; Phase7 operational completion is not claimed.)
Mock-first test gate — Before writing implementation code for an increment, define tests for every applicable acceptance criterion, validate the tests against mocks, and then implement the smallest behavior that makes them pass. The Vercel build must run the test suite before the production build. No GitHub Actions workflow is assumed or required. Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Before writing implementation code for an increment, define tests for every applicable acceptance criterion, validate the tests against mocks, and then implement the smallest behavior that makes them pass. The Vercel build must run the test suite before the production build. No GitHub Actions workflow is assumed or required. (evidence: Local implementation/fixtures may cover part of this obligation; Phase7 operational completion is not claimed.)
Accessibility and readability — Text and controls maintain clear contrast over every category background. Focus, selected icons, solved status, and score changes use labels or shapes as well as color. Covered by: FR: FR-CATEGORYART-006, FR-PLAYERPROFILE-002, FR-RESPONSIVEUI-015; TEST: TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-ARTRENDER-107, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-CONTENTVALIDATION-016, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-ORIENTATION-015, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-UIACCESSIBILITY-112, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-GITHUBADMIN-149, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PROFILEICON-003, TEST-ACCESSIBILITYDETAILS-144, TEST-CONTESTREADINESS-147, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145 Status: completed Scope: layer-1+ Acceptance Criteria:
- Text and controls maintain clear contrast over every category background. Focus, selected icons, solved status, and score changes use labels or shapes as well as color. (evidence: docs/phase6_execution.md; docs/admin_acl_review_receipt.json; docs/testing.md)
Measurable accessible game controls — Apply explicit contrast, focus, announcement and touch-target requirements to UI controls and feedback. Covered by: FR: FR-RESPONSIVEUI-015; TEST: TEST-ACCESSIBILITYDETAILS-144, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARCHIVESWBOM-128, TEST-ARTRENDER-107, TEST-CATEGORYART-005, TEST-CONTESTREADINESS-147, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-LICENSEGPL-129, TEST-MOBILEINPUT-111, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-ORIENTATION-015, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-RESPONSIVEMATRIX-145, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-UIACCESSIBILITY-112, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148 Status: completed Scope: layer-1+ Acceptance Criteria:
- Normal text contrast is at least4.5:1, large text3:1 and essential control/state indicators3:1 against adjacent colors under the W3C definitions and applicable exceptions. (evidence: docs/testing/ui/implementation-receipt.json; matching criterion procedure in docs/testing/ui/cases/; exact snapshot docs/testing/ui/implementation-manifest.json. DOM/Chromium evidence; no physical assistive technology certification.)
- All primary actions support keyboard navigation with visible ordered focus, meaningful accessible names and labels/shapes for non-color state. (evidence: docs/testing/ui/implementation-receipt.json; matching criterion procedure in docs/testing/ui/cases/; exact snapshot docs/testing/ui/implementation-manifest.json. DOM/Chromium evidence; no physical assistive technology certification.)
- Accepted score/stage changes and errors are announced to assistive technology without unexpectedly moving focus. (evidence: docs/testing/ui/implementation-receipt.json; matching criterion procedure in docs/testing/ui/cases/; exact snapshot docs/testing/ui/implementation-manifest.json. DOM/Chromium evidence; no physical assistive technology certification.)
- Primary touch actions have at least44x44CSS-pixel targets as the project usability requirement; this is not a formal WCAG conformance claim. (evidence: docs/testing/ui/implementation-receipt.json; matching criterion procedure in docs/testing/ui/cases/; exact snapshot docs/testing/ui/implementation-manifest.json. DOM/Chromium evidence; no physical assistive technology certification.)
Responsive viewport and zoom matrix — Define repeatable minimum-width, orientation and enlargement configurations for all game and staff UI. Covered by: FR: FR-GUESTADMIN-031, FR-IDENTITY-018, FR-PLAYERPROFILE-002, FR-RESPONSIVEUI-015; TEST: TEST-ADMINUI-136, TEST-GITHUBADMIN-149, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-ARCHIVESWBOM-128, TEST-CONNECTIONRECOVERY-109, TEST-DDDTRANSACTIONS-131, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMINVITATIONS-025, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-ACCESSIBILITYDETAILS-144, TEST-ARTRENDER-107, TEST-CATEGORYART-005, TEST-CONTESTREADINESS-147, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- At320x568,390x844 and844x390CSS-pixel layouts, game/form text, hints, score fields and controls remain reachable without horizontal page scrolling or clipping. (evidence: docs/testing/ui/implementation-receipt.json; matching criterion procedure in docs/testing/ui/cases/; exact snapshot docs/testing/ui/implementation-manifest.json. 320CSS-pixel zoom equivalent and200%text fixture.)
- At1280px width with400%zoom (320CSS-pixel equivalent) and with200%text enlargement, content reflows without losing required information/actions; browser zoom remains enabled. (evidence: docs/testing/ui/implementation-receipt.json; matching criterion procedure in docs/testing/ui/cases/; exact snapshot docs/testing/ui/implementation-manifest.json. 320CSS-pixel zoom equivalent and200%text fixture.)
- Orientation changes preserve the authorized room and safe draft state; stacked score layouts retain all fields and touch/keyboard actions remain operable. (evidence: docs/testing/ui/implementation-receipt.json; matching criterion procedure in docs/testing/ui/cases/; exact snapshot docs/testing/ui/implementation-manifest.json. 320CSS-pixel zoom equivalent and200%text fixture.)
- The welcome/profile card has responsive internal whitespace of at least20CSSpixels on phone and32CSSpixels on desktop, with readable controls and no horizontal overflow. (evidence: Unverified changed-release obligation; prior evidence retained in notes. Specification: docs/admin_pwa_release.md.)
Vercel deployment target — Deploy the web application from the sharpninja/wordpairs GitHub repository to the existing Vercel projects wordpairs (logical staging) and wordpairs-j9jf (production), each using its production target and isolated matching Supabase project. Deploy the exact reviewed source commit to staging first and verify it before deploying the identical commit to production. Retain Git integration for source identity; prevent automatic builds from bypassing this order and keep feature previews disabled until safely isolated. Select the approved framework, project root, build command and output configuration. Covered by: FR: FR-ACCESSCONTROL-024, FR-ADMINPAGES-023, FR-ANCHORSELECTION-007, FR-ANSWERREVEAL-012, FR-ANSWERSTAGES-008, FR-CATEGORIES-005, FR-CATEGORYART-006, FR-CATEGORYSUGGESTIONS-017, FR-CURATEDPAIRS-004, FR-FINALSTANDINGS-014, FR-IDENTITY-018, FR-LIVESCORECARD-011, FR-LOBBYDISCOVERY-019, FR-LOBBYLIFECYCLE-003, FR-NOMINATIONS-016, FR-OBSERVERS-020, FR-PLAYERPROFILE-002, FR-PUBLICLANDING-022, FR-REACTIONS-021, FR-RESPONSIVEUI-015, FR-ROOMACCESS-001, FR-ROUNDSUMMARY-013, FR-SCORELOCK-010, FR-SCORING-009, FR-WORDHINTEDITOR-025; TEST: TEST-ACLAUTHORIZATION-132, TEST-ADMINUI-136, TEST-ARCHIVESWBOM-128, TEST-DDDTRANSACTIONS-131, TEST-DEPENDENCYATTRIBUTION-039, TEST-DEPENDENCYATTRIBUTION-125, TEST-DEPLOYMENTNOACTIONS-124, TEST-DESIGNHOSTILEREVIEW-135, TEST-FREETIEROPERATION-121, TEST-FREETIERQUOTAHANDLING-037, TEST-GPL20ONLYRELEASE-042, TEST-GUESTPLAY-021, TEST-IDENTITYAUTHENTICATION-116, TEST-LICENSEGPL-129, TEST-MOCKFIRSTACCEPTANCECOVERAGE-038, TEST-MODERATIONANDCATALOGBOUNDARY-047, TEST-OIDCTOKENVALIDATION-046, TEST-OPENAIOIDCPROFILE-020, TEST-PLAYERLIMIT-002, TEST-POSTGRESPERSISTENCE-122, TEST-PROFILEICON-003, TEST-ROOMJOINING-001, TEST-SCHEMAPROVISIONING-123, TEST-SWBOMGENERATION-127, TEST-SWBOMRELEASEARCHIVE-041, TEST-TDDACCEPTANCE-126, TEST-TESTABLECONCURRENCYSAFEDOMAINBOUNDARY-051, TEST-VERCELDEPLOYMENT-120, TEST-WIKIPUBLISH-148, TEST-CATEGORYSUGGESTIONUNLOCK-019, TEST-GITHUBADMIN-149, TEST-NOMINATIONELIGIBILITY-017, TEST-NOMINATIONMODERATION-114, TEST-NOMINATIONTHRESHOLDANDMODERATION-018, TEST-PWAINSTALL-137, TEST-PWAPRIVACY-138, TEST-SUGGESTIONREVIEW-115, TEST-ANCHORRANDOMNESS-113, TEST-ANSWERORDER-103, TEST-AUTHORITATIVEANSWERHANDLING-045, TEST-CATEGORYCHOICE-011, TEST-CONFIGUREDCAPACITY-024, TEST-FINALSTANDINGS-013, TEST-FIRSTCATEGORY-004, TEST-HINTPROGRESSION-009, TEST-HINTSCORING-007, TEST-HOLDOUTWARNINGANDREMOVAL-032, TEST-IDLELOBBYREADINESSPROMPT-033, TEST-LIVESCORECARD-010, TEST-MULTIPLAYERINTEGRATION-134, TEST-NOHINTSOLVE-006, TEST-NOSOLVERFALLBACK-146, TEST-PRECOUNTDOWNOBSERVERPROMOTION-030, TEST-READYCOUNTDOWNANDROSTERLOCK-031, TEST-ROUNDSUMMARY-012, TEST-STATEAUTHORITY-101, TEST-TIMETIEBREAK-014, TEST-UNSOLVEDRESULT-008, TEST-ANSWERCONFIDENTIALITY-105, TEST-ANSWERVALIDATION-104, TEST-LANDINGPAGEPUBLICDATA-050, TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028, TEST-CLOCKCONSISTENCY-108, TEST-CONNECTIONRECOVERY-109, TEST-DEEPLINKJOINANDFULLROOM-026, TEST-ROOMINVITATIONS-025, TEST-CATALOGINTEGRITY-106, TEST-CATALOGVERSIONING-133, TEST-CATEGORYART-005, TEST-CONTENTVALIDATION-016, TEST-ACCESSIBLEGAMECONTROLS-044, TEST-ARTRENDER-107, TEST-ORIENTATION-015, TEST-UIACCESSIBILITY-112, TEST-FULLROOMOBSERVER-027, TEST-INROUNDEMOJIREACTION-029, TEST-REALTIMESYNC-102, TEST-BROWSEOPENLOBBIES-022, TEST-CONTESTREADINESS-147, TEST-LOBBYMATCHING-117, TEST-QUICKMATCH-023, TEST-ROOMCODES-110, TEST-ROOMSYNC-139, TEST-OBSERVERPERMISSIONS-118, TEST-LANDINGPRIVACY-130, TEST-PUBLICGAMELANDINGPAGE-043, TEST-REACTIONDELIVERY-119, TEST-ACCESSIBILITYDETAILS-144, TEST-MOBILEINPUT-111, TEST-RESPONSIVEMATRIX-145 Status: in_progress Scope: layer-1+ Acceptance Criteria:
- Deploy the web application from the sharpninja/wordpairs GitHub repository to the existing Vercel projects wordpairs (logical staging) and wordpairs-j9jf (production), each using its production target and isolated matching Supabase project. Deploy the exact reviewed source commit to staging first and verify it before deploying the identical commit to production. Retain Git integration for source identity; prevent automatic builds from bypassing this order and keep feature previews disabled until safely isolated. Select the approved framework, project root, build command and output configuration. (evidence: Local implementation/fixtures may cover part of this obligation; Phase7 operational completion is not claimed.)
Generated from MCP requirements wiki export.
- Home
- Guest Game and GitHub Admin PWA
- Functional Requirements
- Technical Requirements
- Testing Requirements
- TR per FR Mapping
- Requirements Matrix
- Wordpairs
- Local Development
- Testing and Evidence
- Administration and Access Control
- Requirements Baseline v2.8
- Architecture Decision Record
- Architecture Design
- Architecture Patterns
- Content Moderation
- Deployment and Release Plan
- Acceptance Criteria Gap Analysis
- Acceptance Criteria Test Inventory
- Implementation Plan
- Phase 0 Execution
- Phase 0 Interface and Data Contracts
- Phase 1A Execution
- Phase 1 Execution
- Phase 2 Execution
- Phase 3 Execution
- Phase 4 Execution
- Phase 5 Execution
- Phase 6 Execution
- Optional Phase 6 Human Feedback
- Historical Chromium Crash Diagnosis
- Completed Coding Goal and Review Agreement
- Third Party Attributions
- Software Bill of Materials Contract
- Phone Installation and PWA
- Live Multiplayer Runtime and UI Integration
- UI Test Case Index
- UI Design Coverage
- UI Criterion Gaps
- UI Design Questions
- UI Test Persistence
- TEST-ACCESSIBLEGAMECONTROLS-044 UI Case
- TEST-ACLAUTHORIZATION-132 UI Case
- TEST-ADMINUI-136 UI Case
- TEST-AUTHORITATIVEANSWERHANDLING-045 UI Case
- TEST-BROWSEOPENLOBBIES-022 UI Case
- TEST-CATALOGVERSIONING-133 UI Case
- TEST-CATEGORYART-005 UI Case
- TEST-CATEGORYCHOICE-011 UI Case
- TEST-CATEGORYSUGGESTIONUNLOCK-019 UI Case
- TEST-CONFIGUREDCAPACITY-024 UI Case
- TEST-CONNECTIONRECOVERY-109 UI Case
- TEST-CONTENTVALIDATION-016 UI Case
- TEST-DEEPLINKJOINANDFULLROOM-026 UI Case
- TEST-FINALSTANDINGS-013 UI Case
- TEST-FIRSTCATEGORY-004 UI Case
- TEST-FREETIERQUOTAHANDLING-037 UI Case
- TEST-FULLROOMOBSERVER-027 UI Case
- TEST-GUESTPLAY-021 UI Case
- TEST-HINTPROGRESSION-009 UI Case
- TEST-HINTSCORING-007 UI Case
- TEST-HOLDOUTWARNINGANDREMOVAL-032 UI Case
- TEST-IDLELOBBYREADINESSPROMPT-033 UI Case
- TEST-INROUNDEMOJIREACTION-029 UI Case
- TEST-LANDINGPAGEPUBLICDATA-050 UI Case
- TEST-LIVESCORECARD-010 UI Case
- TEST-MODERATIONANDCATALOGBOUNDARY-047 UI Case
- TEST-NOHINTSOLVE-006 UI Case
- TEST-NOMINATIONELIGIBILITY-017 UI Case
- TEST-NOMINATIONMODERATION-114 UI Case
- TEST-NOMINATIONTHRESHOLDANDMODERATION-018 UI Case
- TEST-OBSERVERPERSPECTIVEANDPERMISSIONS-028 UI Case
- TEST-OIDCTOKENVALIDATION-046 UI Case
- TEST-OPENAIOIDCPROFILE-020 UI Case
- TEST-ORIENTATION-015 UI Case
- TEST-PLAYERLIMIT-002 UI Case
- TEST-PRECOUNTDOWNOBSERVERPROMOTION-030 UI Case
- TEST-PROFILEICON-003 UI Case
- TEST-PUBLICGAMELANDINGPAGE-043 UI Case
- TEST-PWAINSTALL-137 UI Case
- TEST-PWAPRIVACY-138 UI Case
- TEST-QUICKMATCH-023 UI Case
- TEST-READYCOUNTDOWNANDROSTERLOCK-031 UI Case
- TEST-ROOMINVITATIONS-025 UI Case
- TEST-ROOMJOINING-001 UI Case
- TEST-ROOMSYNC-139 UI Case
- TEST-ROUNDSUMMARY-012 UI Case
- TEST-SUGGESTIONREVIEW-115 UI Case
- TEST-TIMETIEBREAK-014 UI Case
- TEST-UNSOLVEDRESULT-008 UI Case
- UI Gap Decisions and Synchronization
- TEST-ACCESSIBILITYDETAILS-144 UI Case
- TEST-CANDIDATEHOLD-141 UI Case
- TEST-LOBBYMATCHING-117 UI Case
- TEST-NAVIGATIONDRAFTS-142 UI Case
- TEST-NOSOLVERFALLBACK-146 UI Case
- TEST-REQUESTFEEDBACK-143 UI Case
- TEST-RESPONSIVEMATRIX-145 UI Case
- TEST-REVIEWCHANGES-140 UI Case
- TEST-ROOMCODES-110 UI Case
- UI Gap Implementation Plan
- UI Gap Implementation and Evidence
- Contest Readiness
- Hostile Validation Evidence
- Category Artwork
- 10-Player Release Completion Plan
- Deadline Report and Token Accounting
- Deadline Report Supporting Evidence
- Deadline Timeline and Review Finding Analysis
- Stopped Wordpairs Release Handoff