Repository navigation
Acceptance Criteria Test Inventory
QBrain is authoritative. Rules v2.8, dated 31 October 2026, and the current completion plan amend new room/match capacities to every integer 2 through 10. Use valid boundaries 2/8/10 and reject 1/11/15/25, fractional and nonnumeric creation inputs. Preserve the separate 25-observer limit and test a 35-person new-release audience. The service/UI range is 9 eight-round games, 54 player participations and 432 accepted round solves.
Current AC-01/02/24 cases verify that all admission paths share the amended limit; AC-04 uses random anchor endpoints 1 and N for allowed rosters. FR-ROOMACCESS-001#CAP15-LEGACY additionally requires preserved larger running matches and results, readable legacy waiting/countdown rooms, an explicit compatibility notice, Leave, and no oversized new start/admission or forced eviction. The linked current UI cases and new frozen evidence must cover those outcomes before any changed criterion is satisfied. Earlier pass counts below establish only their historical snapshots.
Requirements baseline: word_association_game_requirements.md v2.6
Status: Phase 6 formally approved at 99/99: 45 active ACs / 67 primary cases / 27 supplemental cases map to actual product or local process evidence in evidence/phase6/acceptance-mapping.json. Its final regression had 494 passing tests and 26 Chromium journeys. Original oracle sensitivity controls remain unchanged. Human feedback is optional; see Phase 6 execution. Later administration and multiplayer checks supplement this historical source-bound inventory; their current commands and results are in testing.
This inventory decomposes the 45 active acceptance criteria into 67 case IDs with primary oracle scenarios; 27 supplemental scenarios cover sub-assertions identified in hostile review. Six retired IDs remain reserved: AC-34, AC-35, AC-36, AC-40, AC-48, and AC-49 are technical-requirement checks, not acceptance criteria. Requirements v2.6 fixes expected results for all active ACs. The executable oracle suite uses independently authored expectations, scripted raw observations, a construction-time snapshotted/frozen strict request driver, and 112 named semantic violations; its passing results validate mock assertion sensitivity only. The exact-commit review of b9e7dee8b93a9639c56fe3348595bfa7e38f4d86 scored 99% accuracy and 100% completeness. AC-38 requires passing mock records; the global gate preceded all implementation. Run the same reusable assertions against real application behavior as each increment is implemented. Phase 0 was approved on 26 October 2026. Database/provider checks are separate TR evidence, and deployment checks are not AC-bound or substitutes for AC coverage.
| AC | Criterion | Planned test ID | Assertion focus | Verification boundary | Test seam / fixture | Evidence status |
|---|---|---|---|---|---|
| AC-01 | Room joining | AC-01-T01 | Valid room joins by code, browse, quick match, or deep link use the same slot authority. | Room use case | Fake RoomRepository, actor, invite/code lookup, transaction result | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-02 | Player limit | AC-02-T01 | Capacity policy accepts 2, 8, and 25 boundaries and rejects a join when full, without changing aggregate state. | Mock-validated domain/use-case contract | Capacity fixtures; fake transactional RoomRepository records command and state | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-02 | Player limit | AC-02-T02 | When two concurrent final-seat commands are evaluated, a repository conflict is returned as a canonical no-slot result and the use case does not assign two memberships. | Mock-validated application contract | Repository fake returns one success and one conflict under deterministic command interleaving | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-03 | Profile icon | AC-03-T01 | Chosen icon persists and appears consistently in room, scorecard, summary, standings. | Profile use case + UI projection | Fake profile store and deterministic profile/score projections | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-04 | First category | AC-04-T01 | Request a uniform integer from 1..N inclusive and verify every returned boundary/index maps to its matching player in the frozen roster. | Domain unit + RandomSource contract | Injected deterministic RandomSource spy and N-player roster fixture | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-04 | First category | AC-04-T02 | Only the assigned anchor can choose the first category; reject a non-anchor choice without changing match state. | Gameplay use case + authorization policy | Anchor/non-anchor actor fixtures and fake MatchRepository | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-05 | Category art | AC-05-T01 | Every pair maps to its category's exact assigned asset, controls remain readable, and missing assets use an accessible fallback. | Browser visual/UI | Pair/category/asset mapping, fixed viewport, swapped/missing/duplicate pair controls, and fallback fixture | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-06 | No-hint solve | AC-06-T01 | Correct answer at no-hint stage awards 5 once; incorrect answer awards nothing. | Gameplay domain unit | Fake MatchRepository, fixed stage, answer policy | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-07 | Hint scoring | AC-07-T01 | Correct answers after Hint 1/2/3 award 3/2/1 respectively. | Scoring policy unit | Table-driven stage fixtures | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-08 | Unsolved result | AC-08-T01 | Unsolved after Hint 3 receives zero and round reveal exposes target. | Gameplay domain + projection | Fixed match fixture and reveal projection mapper | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-09 | Hint progression | AC-09-T01 | Stage advances only after all unsolved players submit; next hint goes only to remaining unsolved players. | Gameplay use case + projection | Fake submissions/event port and per-player projection fixtures | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-10 | Live scorecard | AC-10-T01 | Accepted server time determines elapsed duration; the live row shows selected icon and current-round points separately from cumulative points; client time cannot change it. | Gameplay use case | Fixed Clock, prior/current score fixtures, fake repository, and skewed client timestamp | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-11 | Category choice | AC-11-T01 | Earliest accepted correct solver is chooser; same-time submissions use deterministic tie order. | Gameplay domain + transaction | Injected clock/sequence and competing submission fixtures | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-12 | Round summary | AC-12-T01 | Round summary ranks all players by cumulative score and includes round points and elapsed time. | Query projection | Match fixture with tie and unsolved result rows | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-13 | Final standings | AC-13-T01 | Final standings sort by total score after the configured final round. | Standing policy | Configured match-length and score fixtures | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-14 | Time tiebreak | AC-14-T01 | Equal scores sort by summed accepted solve duration plus 80 seconds per unsolved round; exact remaining ties share rank. | Standing policy unit | Table-driven elapsed/unsolved fixtures | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-15 | Orientation | AC-15-T01 | Portrait and landscape phone view keeps answer controls, hints, and scorecard visible without horizontal overflow. | Browser viewport acceptance | Fixed viewport sizes; keyboard/touch interaction | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-16 | Content validation | AC-16-T01 | A complete approved/enabled record is playable; separate records missing prompt, target, ordered hints, accepted-answer policy, category, or background, plus disabled/unapproved records, are excluded. | Catalog domain + repository contract | Concrete complete and field-by-field incomplete catalog records | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-17 | Nomination eligibility | AC-17-T01 | Only a no-hint solver can nominate; a post-hint solver is denied. | Gameplay/content use case | Solved-stage fixtures and fake nomination repository | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-18 | Nomination threshold and moderation | AC-18-T01 | Below threshold or unmoderated candidate is ineligible; threshold plus approval still requires full curation before play. | Moderation/catalog use case | Nomination counts/status fixtures and catalog validation fake | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-18 | Nomination threshold and moderation | AC-18-T02 | After rejection, only the proposer may submit one appeal; a distinct Senior Moderator records a reasoned uphold/overturn; uphold remains rejected, overturn permits curation only, and neither outcome activates content. Duplicate command retries are idempotent; stale versions fail without mutation. | Mock-validated appeal command contract | Proposer/moderator role fixtures, original reviewer ID, rejected case version, command IDs, audit capture | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-19 | Category suggestion unlock | AC-19-T01 | Fewer than 10 wins blocks suggestion; exactly 10 permits one category with three pairs; a second open suggestion and approved-but-incomplete catalog entry remain blocked. | Content use case | Concrete three-pair suggestion plus complete and two-pair approved catalog records | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-20 | OpenAI OIDC profile | AC-20-T01 | Verified OpenAI OIDC identity loads/creates one profile; token-invalid paths fail closed. | OIDC adapter contract + profile use case | Mock discovery/JWKS/token responses; provider entitlement is a later external integration check, not an AC test dependency | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-21 | Guest play | AC-21-T01 | Guest path creates guest identity, supports icon selection, and can create/join by code. | Identity and room use cases | Fake GuestIdentityStore and RoomRepository | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-22 | Browse open lobbies | AC-22-T01 | Only discoverable, waiting lobbies with player_count below configured_capacity appear joinable. | Lobby query projection | Room fixtures for discoverable/hidden/full/started | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-23 | Quick match | AC-23-T01 | Quick match selects the oldest eligible lobby, tie-broken by stable room ID, or offers browse/create when none is available; all joins use the capacity-checked contract. | Mock-validated application contract | Fake LobbyRepository with eligible, empty, stale/full, and failed-join results | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-23 | Quick match | AC-23-T02 | When two quick-match selections target a room whose last seat is concurrently claimed, the losing conflict is handled without exceeding capacity or duplicating membership. | Mock-validated application contract | Fake room repository returns version conflict and updated full room | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-24 | Configured capacity | AC-24-T01 | Accept capacity 2 and 25; reject 1 and 26. | Room domain unit | Boundary-value inputs and fake repository | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-25 | Room invitations | AC-25-T01 | Shared room code/deep link resolves to intended active room and admits invite while slot remains. | Room invitation use case | Fake room-code resolver and invite context | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-26 | Deep-link join and full room | AC-26-T01 | Deep link bypasses browse; open seat joins, full room offers observer path. | Routing + room use case | Fake router, room states, observer invitation context | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-27 | Full-room observer | AC-27-T01 | Observer consumes no seat and is bound to inviting player. | Room domain/use case | Fake RoomRepository and invitation claims | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-28 | Observer perspective and permissions | AC-28-T01 | Observer projection follows inviter; answer/category/state mutations are rejected and no score is created. | Authorization and projection acceptance | Fake actor/permission policy and allowlisted view fixtures | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-29 | In-round emoji reaction | AC-29-T01 | The exact menu 👍 ❤️ 😂 🎉 👀 permits an allowed emoji broadcast to players/observers, rejects an invalid emoji, and does not change score, answer, or round state. Duration and rate are separate TR-19 evidence. | Reaction use case + event contract | Complete emoji allowlist, invalid emoji, fake EventOutbox, before/after aggregate snapshot | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-30 | Pre-countdown observer promotion | AC-30-T01 | Before countdown, a leave promotes the earliest observer into the vacated final position, compacts remaining players without reordering them, and leaves other observers queued. | Mock-validated room aggregate/use-case contract | Ordered roster/observer fixtures and fake transactional repository | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-30 | Pre-countdown observer promotion | AC-30-T03 | Concurrent leave and observer-join commands receive deterministic conflict results; application policy recomputes promotion from the latest roster. | Mock-validated room command contract | Repository fake returns version conflict and refreshed room state | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-30 | Pre-countdown observer promotion | AC-30-T04 | When eligible observers have equal arrival sequence/time, promote the one with the lowest stable profile ID. | Mock-validated room aggregate/use-case contract | Equal-arrival observer fixture with reverse input ordering | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-30 | Pre-countdown observer promotion | AC-30-T02 | No-waiting-observer departure leaves one open slot without changing remaining player order. | Room domain unit | Room fixture with empty observer queue | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-31 | Ready countdown and roster lock | AC-31-T01 | Final ready command starts the 10-second countdown and locks the current roster as one observable aggregate transition. | Mock-validated room aggregate/use-case contract | Fake versioned RoomRepository; before/after roster snapshot | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-31 | Ready countdown and roster lock | AC-31-T02 | Once locked, leave creates a vacancy and does not promote or substitute an observer/player. | Mock-validated room aggregate/use-case contract | Locked roster and attempted join/promotion command fixtures | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-31 | Ready countdown and roster lock | AC-31-T03 | Concurrent leave/promotion requests after lock return a canonical locked-roster result without substitution. | Mock-validated room command contract | Fake repository returns locked state under command race | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-31 | Ready countdown and roster lock | AC-31-T04 | If fewer than two original roster members remain when countdown expires, abort start, close the room, and do not promote or substitute another player. | Mock-validated room aggregate/use-case contract | Two-player room; one departure after lock; fake countdown expiry; assert close/no promotion | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-32 | Holdout warning and removal | AC-32-T01 | Holdout warning appears at five seconds; ready-before-expiry starts countdown. | Room domain + fake scheduler | Fixed Clock, fake DeadlineScheduler, aggregate version fixture | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-32 | Holdout warning and removal | AC-32-T02 | If the five-second deadline expires while the holdout remains unready in a room with more than two players, remove that player and immediately start and lock countdown with the remaining roster. | Mock-validated room aggregate/use-case contract | Fixed clock/scheduler; ready-before-deadline and expiry command race fixtures | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-32 | Holdout warning and removal | AC-32-T03 | Concurrent ready/deadline commands apply one valid aggregate transition; stale deadline version is a no-op. | Mock-validated room command contract | Fixed clock, same-version ready/expiry command race fixtures | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-32 | Holdout warning and removal | AC-32-T04 | If a five-second warning expires in an exactly two-player room while one player is unready, retain the holdout and wait without countdown until both players are ready. | Mock-validated room aggregate/use-case contract | Two-player fixture; fixed clock/scheduler; roster and countdown before/after snapshots | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-33 | Idle lobby readiness prompt | AC-33-T01 | Thirty seconds without change prompts all current players once; readiness, player join/leave, and observer join/leave each reset the clock; every old deadline is silent, every new deadline targets the current player roster, and countdown suppresses stale callbacks. | Room domain + fake scheduler | Concrete event/clock table, fixed Clock, versioned DeadlineScheduler | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-37 | Free-tier quota handling | AC-37-T01 | Quota rejection returns SERVICE_LIMIT, preserves last committed state, permits retry with the same command ID, and never uses paid fallback. | Application service-limit use case | Fake quota port returning threshold/exhaustion states | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-38 | Mock-first acceptance coverage | AC-38-T01 | A concrete traceability manifest maps every active AC to existing tests with passing mock-validation records; planned-only records, an empty active set, missing AC, nonexistent test, missing record, and incomplete record are rejected by the same parser. No build/deployment artifact is required. | Traceability/process contract | Structured complete/malformed manifests with passing/planned record statuses | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-39 | Dependency attribution | AC-39-T01 | Direct dependencies/assets have purpose, license, upstream source, and locked resolved versions. | Supply-chain document/build check | Fixture package manifest/lockfile and attribution inventory | Mock oracle validated; installed direct deps checked |
| AC-41 | SWBOM release archive | AC-41-T01 | An actual temporary ZIP contains every prepared source path at its independent SHA-256, root license/notices, and a schema-valid CycloneDX 1.6 report at sbom/<expected-commit>.cdx.json; malformed schema, altered/missing source, wrong path/commit, empty, and truncated archives are rejected. | Source archive contract | Filesystem ZIP round-trip, full prepared-source hash manifest, official bundled CycloneDX 1.6 validator | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-42 | GPL-2.0-only release | AC-42-T01 | The ZIP contains the complete pinned GPL-2.0-only text, attribution index, and pinned Recursive-bearing SVG with full embedded copyright/OFL notice; omitted or altered notice text and truncated license are rejected. | Source archive contract | Actual ZIP, independently pinned hashes, embedded copyright/OFL controls | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-43 | Public game landing page | AC-43-T01 | Unauthenticated landing loads approved leaderboard, public joinable lobby summaries, and concise versioned rules without sign-in, with the rules version and updated date visible; empty/unavailable data render safe states. | Browser + public query acceptance | Anonymous session and fake public projections, empty/error fixtures | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-43 | Public game landing page | AC-43-T02 | Leaderboard applies lifetime wins, total points, earliest win, stable profile ID; includes guest profiles only after opt-in, uses generated aliases, honors opt-out, and refreshes leaderboard data every five minutes. | Mock-validated public projection contract | Ranked authenticated and guest profiles including ties and opted-out profiles; fixed clock verifies five-minute refresh | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-43 | Public game landing page | AC-43-T03 | Lobby cards show exact player count/capacity, waiting state and room age, refresh every 15 seconds, and never expose room code or player names. | Mock-validated landing-page view contract | Fixed clock, public room fixtures and rules-version fixture | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-44 | Accessible game controls | AC-44-T01 | Touch/keyboard actions work; focus, contrast, labels/non-color status pass accessibility checks in phone orientations. | Browser accessibility/UI | Keyboard/touch scripts, contrast fixtures, portrait/landscape viewports | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-45 | Authoritative answer handling | AC-45-T01 | Independent unsolved canonical and approved-alternative answers both earn the nonzero stage score; NFKC, trim, whitespace collapse, and case-folding apply while punctuation is preserved, fuzzy/unapproved alternatives fail, and retries cannot score twice. | Gameplay domain unit | Independent player cases plus retry fixture and explicit matching policy | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-45 | Authoritative answer handling | AC-45-T02 | Incorrect answer leaves score unchanged and is not broadcast. | Gameplay use case + event projection | Fake outbox and before/after score snapshots | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-45 | Authoritative answer handling | AC-45-T03 | Target answer is absent from player/observer payload until reveal. | Projection privacy contract | Allowlisted player/observer DTO fixtures and reveal state | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-46 | OIDC token validation | AC-46-T01 | Bad signature, issuer, audience, state, nonce, or expiry rejects callback and creates no profile association. | OIDC adapter contract | Mock keyset/token/callback variants and profile-store spy | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-47 | Moderation and catalog boundary | AC-47-T01 | Unauthorized moderation and catalog activation are both rejected with unchanged case version, catalog entries, and audit count. | Moderation authorization use case | Role/actor fixtures and before/after repository state | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-47 | Moderation and catalog boundary | AC-47-T02 | Nomination count/status/eligibility changes are auditable; incomplete or unapproved records cannot enter play. | Moderation/catalog contract | Fake audit store and playable-catalog query fixtures | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-47 | Moderation and catalog boundary | AC-47-T03 | Appeal and distinct-Senior resolution commit their audit rows atomically; original-reviewer resolution and second appeal fail; a later failed transaction rolls back only its own changes while preserving committed version/audit rows and never publishes content. | Moderation authorization/audit contract | Explicit committed snapshot, rejected actions, and later transaction rollback | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-50 | Landing-page public data | AC-50-T01 | Public response contains allowlisted leaderboard/lobby fields and excludes room codes, answers, guesses, private views, moderation, secrets. | Public projection security contract | Fake public query and adversarial hidden-field fixtures | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-51 | Testable, concurrency-safe domain boundary | AC-51-T01 | Pure domain/use-case suite runs without Next.js/Supabase production runtime imports. | Domain unit + architecture guard | Injected port fakes and import-boundary checker | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-51 | Testable, concurrency-safe domain boundary | AC-51-T02 | Application policy issues a conditional capacity-checked assignment and handles a conflict result without over-assigning in its domain response. This validates application behavior only, not database serialization. | Mock-validated application contract | Repository fake returns success/conflict; assert command and response policy | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-51 | Testable, concurrency-safe domain boundary | AC-51-T03 | Application idempotency handling returns canonical prior result for repeated command ID without issuing a second domain side effect. This does not prove persistence uniqueness. | Mock-validated application contract | Idempotency port fake with existing/new keys; side-effect spy | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
| AC-51 | Testable, concurrency-safe domain boundary | AC-51-T04 | Application transaction contract stages one outbox intent per committed transition and none when unit-of-work reports rollback. This does not prove database atomicity. | Mock-validated application contract | Unit-of-work fake with commit/rollback outcomes and captured intents | Original oracle preserved; product counterpart/source/observations mapped in Phase 6 manifest |
These mockable reaction-policy contracts are technical evidence only. They remain separate from AC-29 and do not increase the 67-case AC coverage count.
| TR | Test ID | Assertion | Evidence tier | Fixture/seam | Status |
|---|---|---|---|---|---|
| TR-19 | TR-19-T01 |
Only the complete approved menu 👍 ❤️ 😂 🎉 👀 is accepted. |
Mock-validated reaction-policy contract | Exact allowlist plus invalid emoji | Original oracle preserved; real policy/application/browser and separate TR transport checks pass |
| TR-19 | TR-19-T02 |
A reaction remains visible for exactly five seconds. | Mock-validated reaction-policy contract | Fixed timestamps at 4,999, 5,000, and 5,001 milliseconds | Original oracle preserved; real policy/application/browser and separate TR transport checks pass |
| TR-19 | TR-19-T03 |
A player may submit at most one reaction in each two-second window; exactly 2,000 milliseconds is accepted. | Mock-validated reaction-policy contract | Per-player accepted/rejected timestamp sequence | Original oracle preserved; real policy/application/browser and separate TR transport checks pass |
| TR-19 | TR-19-T04 |
Reactions are delivered to current players and observers without changing score, answer, submission, or round state. | Mock-validated event/projection contract | Audience list and before/after aggregate snapshots | Original oracle preserved; real policy/application/browser and separate TR transport checks pass |
These mockable TR contracts verify public-query resource bounds and cache policy. They are operational/technical requirement evidence and do not add AC coverage.
| TR | Test ID | Assertion | Evidence tier | Fixture/seam | Status |
|---|---|---|---|---|---|
| TR-30 | TR-30-T01 |
Anonymous leaderboard/lobby queries enforce bounded page size and stable continuation without exposing unauthorized fields. | Mock-validated public-query contract | Page-size boundary, cursor and allowlist fixtures | Implemented and passing; see phase6_execution.md for separate TR run |
| TR-30 | TR-30-T02 |
Public projection cache policy applies the five-minute leaderboard and 15-second lobby refresh intervals and safely invalidates unavailable/stale data. | Mock-validated public-query/cache contract | Fixed clock, cache fake, stale/empty/service-error responses | Implemented and passing; see phase6_execution.md for separate TR run |
These post-adapter checks validate actual persistence guarantees against a local/disposable database. They do not count toward active AC coverage or substitute for the mock-validated AC suite.
| TR | Test ID | Assertion | Evidence tier | Fixture/seam | Status |
|---|---|---|---|---|---|
| TR-31 | TR-31-T01 |
Concurrent final-seat writes never exceed capacity under database locking/constraints. | Local database integration | Independent DB sessions and controlled join barrier | Implemented and passing; see phase6_execution.md for separate TR run |
| TR-31 | TR-31-T02 |
Repeated persisted command ID returns canonical result without duplicate membership. | Local database integration | Idempotency uniqueness/RPC and disposable DB fixture | Implemented and passing; see phase6_execution.md for separate TR run |
| TR-31 | TR-31-T03 |
Each committed transition has one durable outbox event; rollback has none. | Local database integration | Transaction fault injection and outbox row counts | Implemented and passing; see phase6_execution.md for separate TR run |
| TR-31 | TR-31-T04 |
Concurrent leave/observer joins preserve promotion order and stable profile-ID tie-breaking. | Local database integration | Competing commands and equal-arrival observer fixture | Implemented and passing; see phase6_execution.md for separate TR run |
| TR-31 | TR-31-T05 |
Countdown lock and ready/deadline race remain serialized in persisted room state. | Local database integration | Competing commands against disposable database | Implemented and passing; see phase6_execution.md for separate TR run |
| TR-31 | TR-31-T06 |
Concurrent quick-match selections cannot overfill a room or duplicate membership. | Local database integration | Concurrent join requests against disposable database | Implemented and passing; see phase6_execution.md for separate TR run |
No active AC test case remains decision-gated in requirements v2.6. Product behavior and test expectations are fixed in the v2.6 decision register. The OpenAI client entitlement and current Supabase Free-plan feature availability are external TR integration checks; they do not change mock AC assertions or permit deployed artifacts to count as AC coverage. Deployment and release execution occur after coding Phases 1–6, in Phase 7.
tests/ac-contracts/oracle-scenarios.ts records one primary contract observation for each of the 67 planned AC test IDs. Twenty-seven supplemental scenarios cover additional clauses within those same IDs. The tests require each exact ordered request to produce a conforming raw observation and require all 112 named AC semantic controls to be rejected. AC-38 rejects planned-only mock records and empty gates. AC-41/42 construct an actual temporary ZIP, reopen and inspect it, validate a full prepared-source hash manifest, apply the official CycloneDX 1.6 validator, and pin complete license and embedded font-notice bytes. The separate TR-19 suite does not add AC coverage. These original tests established mock-oracle sensitivity before production code. Current product evidence is identified separately in the Phase 6 manifest. Keep application conformance status separate and rerun the same assertions against the real system as implementations are added.
For every mock-gate contract test ID, record its test file/name, mock-validation command and result before the first implementation commit, then record production commit and full-suite regression result. For every post-implementation integration evidence ID, record its actual database/provider/browser command and result when the required system exists; deployment/account checks are recorded against TRs only. These IDs are not represented as mock proof. A fake may validate the application contract at its port but must not be cited as proof that the underlying database serializes concurrent writes or commits an outbox atomically.
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