9.0 KiB
Housekeeping functional parity audit
Baseline: 8e54cdbc. CI aggregate success verified remotely. This is an open-work inventory, not a completion report.
Delivery checkpoints
- Task 1 room/room-furniture legacy convergence: implemented in
184052fbandd0190bc1, independently reviewed, pushed; CI passed. Post-commit refresh warnings are truthful response metadata, but shared UI display remains open. - Task 4 moderation authority and guarded legacy entrypoints: implemented in 8a894617; pool-starvation review finding fixed in
54f0345awith 112 focused tests passing. Independent scoped re-review clean. No live DB/RCON contention or emulator acknowledgment evidence. - Task 2 radio settings/cache: implemented in
f24adfcfand compatibility fix36ac116d. Legacy Promise forms delegate to transactional Hotel operations, support all 102 curated keys within a 500-entry bound, redact values, display sanitized success/partial/error notices, and invalidate the shared cache only after commit. Independent fix re-review clean; cross-process instant freshness is not claimed. - origin/main through
775d14f8integrated by merge9b83cdc3. Upstream Catalog Studio Git export, inspection/review, advisory source preflight, streamed errors, asset validation, ID reservation/remapping and conversion recovery were preserved alongside HK cancellation/completion/reset behavior. The cancellation-during-ID-queue defect found in integration review was fixed ine7549bbband re-reviewed clean. No live import, browser or database acceptance was performed. - All other findings below remain open until their implementation, tests and review are recorded. A baseline finding is retained here for traceability even after its corresponding checkpoint is delivered.
Hotel / Studio / Operations
| Priority | Confirmed gap | Evidence | Execution |
|---|---|---|---|
| P1 | Legacy radio editor can write unrelated site setting keys | src/actions/admin-radio-extra.ts saveRadioSetting | Functional parity Task 2 |
| P1 | Legacy room items allow arbitrary fields and wrong-room update/delete | src/actions/rooms.ts | Task 1 |
| P1 | Studio final persistence/readback failure reclassifies successful runner as failed | hotel/commands/studio-commands.ts createStudioOperationService | Task 3 |
| P1 | Hotel radio writes omit runtime cache invalidation | hotel/services/mutations-production.ts | Task 2 |
| P1 | Studio furniture import omits selected source and finalization | studio-commands.ts furni branch vs src/app/api/admin/import/furni/route.ts | Open orchestration task |
| P2 | Studio command reason is discarded | studio-commands.ts / hotel/queries/studio.ts | Task 3 |
| P2 | Production Studio get/list only reads process memory | hotel/queries/studio.ts | Open durable repository task |
| P2 | Clone ignores false catalog/items refresh delivery | studio-commands.ts consolidate | Task 3 |
| P2 | Repair ignores nested Nitro failure and error events | studio-commands.ts repair-icons branch | Task 3 |
| P2 | Hotel HAVING filters only final UNION branch | hotel/queries/hotel-production.ts | Open query task |
Also requiring explicit parity review: one-time radio API-key delivery; catalog audit/repair bridge versus a history-only screen; radio CRUD legacy convergence.
Radio follow-up confirmed: admin-radio-api-keys.ts, admin-radio-autodj.ts and admin-radio-moderation.ts still write directly and can audit absent targets or swallow failures. Canonical radio runtime checks existence but does not lock those rows before mutations. radio.api-key.create returns metadata without the generated key; the legacy API-key page only renders a masked prefix. Functional parity Task16 covers guarded convergence and a creation-only secret result separated from audit/list output.
Controller confirmed shared site-settings freshness defect: an expired memory cache is returned before attempting a database refresh whenever Redis has no value. Cache invalidation also resets inFlight without protecting against stale in-flight work repopulating the cache. Include regression coverage in the settings task.
Operations replacing legacy dashboard metrics is intentional in migration/operations.ts, not itself missing parity.
Audit coverage: Hotel mutations, Studio service/runner/repository, Hotel query/search/inbox/widgets, legacy room/radio actions, furniture import API; Operations composition and migration contract. Auditors performed read-only code comparison, not service-backed acceptance.
Other domains
| Domain | Gap | Execution |
|---|---|---|
| People | Ban/moderation/CFH bypass target hierarchy or existence; CFH accepts unrelated user | Task 4 |
| People | Alert/trade-lock bypass established target guard | Task 4 |
| People | Commands lose audit reason | Task 5 |
| People | Missing IP/word-filter delete reports success | Task 5 |
| People | Missing canonical user creation and individual badge grant/removal | Task 7 |
| People | User detail omits legacy account/relations/investigation fields | Task 12 |
| System | Privileged configuration/external operations lack canonical audit | Task 6 |
| System | Multi-key settings/maintenance writes are non-atomic | Task 6 |
| System | Unknown permission slugs silently revoke grants; audit outside transaction | Task 6 |
| System | Canonical ACL changes omit the permissions cache invalidation used by legacy actions | Task 6 |
| System | Rank update accepts missing target and empty/unknown fields | Task 6 |
| System | Logs fixed to flattened latest 50, no investigation filters/details | Task 12 |
| System | Command-center query omits declared recent emulator-error/staff-activity feeds | Task 12 |
| Content | Theme Builder operations absent despite verified migration row | Task 9 |
| Content | CRUD synthetic snapshots/false success for absent records | Task 8 |
| Content | Prefix settings silently skip invalid keys | Task 8 |
| Content | Edit query payloads incomplete across banners/prefixes/help/writeables/email | Task 8 |
| Economy | Missing file-upload soundtrack responsibility | Task 11 |
| Economy | Catalog bulk-create catches row failures and audits success | Task 10 |
| Economy | Badge grant race and inconsistent code bounds | Task 7 |
| Economy | Voucher update omits editable code | Task 10 |
| Economy | Marketplace/transactions filtering and user identity projections incomplete | Task 12 |
| Economy | Expired active subscriptions included | Task 12 |
| Economy | Calendar/rare-values editable/grouped projections incomplete | Task 12 |
Read-only audit coverage included all declared commands and production query routing for Content/Economy, and People/System commands, services, query models and affected legacy entrypoints. Findings are mapped to implementation work; each needs focused regression evidence. Proposed badge slot uniqueness is NOT accepted without model verification: slot semantics may allow multiple unequipped badges.
No domain is declared complete by this document. UI-only omissions remain separately open even when their backend operation already exists.
Support follow-up confirmed in people/services/support-mutations.ts: ticket, Help Center, template and CFH reads lack FOR UPDATE; ticket-template delete audits success for a missing row; ticket.assign writes a supplied assignee without a user/eligibility lookup. Legacy CFH assign/state/close still write directly in actions/moderation.ts. Functional parity Task17 covers state integrity and active staff-action convergence, preserving separately scoped public ticket flows.
Acceptance infrastructure check: current e2e/smoke.spec.ts only checks health and homepage rendering; it does not exercise authenticated administration workflows. The supplied docker-compose.yml assumes existing host MariaDB/Redis/emulator services rather than provisioning an isolated test stack. No Docker/MySQL/MariaDB executable was found on the current PATH. These are live-acceptance limitations, not reasons to defer locally testable implementation or to use production data as fixtures.
Confirmed presentation gaps for the post-backend pass
- Content Brand currently exposes theme values as raw JSON and requires manually entered theme IDs (content/pages/brand.tsx). The approved operator product requires the retained visual Theme Builder/preset workflow, not JSON fields as its replacement.
- Content, Economy and Hotel generic page frames render raw error message keys and simple title/status lists without visible pagination/filter controls, although query parsing accepts pagination/search. Typed read models alone will not repair these workflows.
- Shared Content command parsing silently clamps numbers and truncates text/JSON before submission. Workflow forms must preserve entered values and present validation instead of silently saving a changed input.
- Backend-delivered partial outcomes must be presented in the relevant operator forms, including the deferred room refresh warning. The current source checks are not visual or browser acceptance evidence.
The detailed UI task sequence must use the completed backend contracts and compare each active legacy workflow. This section deliberately does not mark UI parity complete.