Skip to content

Commit 38d818d

Browse files
docs: document idx=1/archive-URL and future Puzzles Server architecture context
Documents, source-grounded from the AmuseLabs integration doc and product/design lead guidance: - idx=1 (used by all 5 AmuseLabs entries today) is a "today only" hack confirmed against native app behaviour, archive URLs need the stable id instead, not idx=1. Flags this as a hard blocker for future calendar/archive work, and notes the current gap that instance.puzzleDate does not actually change which puzzle instance the iframe shows. - Today's hardcoded PuzzleConfig URLs are a deliberate V0-only stopgap, expected to be superseded by a future "Puzzles Server"/API layer (Archive API, phased Progress API) described in the shared "Puzzles hub 3P API requirements" architecture document. Explicitly notes this is documentation only, not something to build against now. Docs-only change, no code touched. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent 6f4ebbb commit 38d818d

1 file changed

Lines changed: 53 additions & 8 deletions

File tree

dotcom-rendering/docs/puzzle-page.md

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -410,14 +410,59 @@ darkMode: boolean, puzzleDate: string | null } }` and the
410410
for a puzzle's in-progress state to be saved against a Guardian account
411411
and restored later (e.g. via `postMessage` round-tripping progress data).
412412
This has been deliberately deferred until such an API exists.
413-
- **The real AmuseLabs archive URL is still unknown.** `PuzzleConfig.hasArchive`
414-
exists on every registry entry (currently always `true`) but is **not
415-
consumed anywhere in rendering.** There is no archive-link UI, and no
416-
archive URL field exists in the registry at all. A URL seen during the
417-
original proof-of-concept was only there as an illustrative example, not
418-
a verified production AmuseLabs archive URL. The correct URL needs to be
419-
sourced from the team before an archive feature can be built on top of
420-
`hasArchive`; do not guess or reuse the POC URL as-is.
413+
- **The real AmuseLabs archive URL is still unknown, and today's `idx=1`
414+
is a "today only" hack that cannot show a specific past puzzle.**
415+
`PuzzleConfig.hasArchive` exists on every registry entry (currently
416+
always `true`) but is **not consumed anywhere in rendering.** There is
417+
no archive-link UI, and no archive URL field exists in the registry at
418+
all. A URL seen during the original proof-of-concept was only there as
419+
an illustrative example, not a verified production AmuseLabs archive
420+
URL. Per the AmuseLabs integration doc shared by the product team
421+
(confirmed against native app behaviour): "The apps currently use
422+
`idx=1` for the latest puzzle. Archive URLs should use the stable `id`
423+
instead... Do not add `idx=1`, as that selects the latest puzzle instead
424+
of the archived one." All 5 of our AmuseLabs entries hardcode `&idx=1`
425+
in their `iframe.url`, which is correct only for "today's puzzle" (V0's
426+
only real use case), it is **not** valid for showing a specific past
427+
date's puzzle. Building calendar/archive functionality (V1) will require
428+
each AmuseLabs entry to swap `idx=1` for `id={realProviderPuzzleId}`,
429+
where that real per-puzzle id must come from a not-yet-built archive
430+
API, it cannot be derived or guessed from a date locally. Treat sourcing
431+
that real archive URL/id mechanism from the team as a hard blocker for
432+
calendar/archive work, not a nice-to-have. **A related, current gap
433+
worth being explicit about**: `instance.puzzleDate` is accepted,
434+
displayed next to the title, and passed through to the iframe context
435+
(see above), but it does **not** actually change which puzzle instance
436+
the iframe shows. The iframe always shows the provider's own "latest"
437+
puzzle via `idx=1`, regardless of `puzzleDate`'s value, so the date
438+
shown on the page and the puzzle actually embedded can silently diverge
439+
once `puzzleDate` ever points anywhere other than today.
440+
- **Today's hardcoded `PuzzleConfig` URLs are a deliberate V0-only
441+
stopgap, expected to be superseded by a future "Puzzles Server".** Per
442+
direct guidance from the product/design lead, the long-term architecture
443+
intends for puzzle URLs (and progress data) to come from a server-side
444+
"Puzzles Server"/API layer (not yet built), which `frontend` would call
445+
to get puzzle metadata including URLs, rather than DCR statically
446+
hardcoding them in a registry file. A shared internal architecture
447+
document ("Puzzles hub 3P API requirements") describes this in more
448+
detail: a future Archive API (returning puzzle date/URL/id/title per
449+
puzzle), a future Progress API (tracking user completion/score/state per
450+
puzzle, phased: local-device-only first, then a thin API wrapper, then a
451+
backing database), and confirms the exact real AmuseLabs URL parameter
452+
conventions already implemented here (`set`, `id` vs `idx=1`, `embed=1`,
453+
`uid`, `darkMode=0|1`), plus MovieGrid/sportsreveal's simpler convention
454+
(base URL plus a client-added `darkMode` param only, no confirmed `uid`
455+
support for those two providers). `puzzleConfigs.ts`'s current registry,
456+
with its hardcoded, explicit-per-entry URLs, is a deliberate,
457+
correct-for-now V0 solution, not the intended final architecture. When
458+
the Puzzles Server/Archive API materialises, this registry's static
459+
URLs are expected to be replaced or supplemented by dynamically-fetched
460+
values, at minimum for archive/calendar navigation, likely eventually
461+
for the "today" URL too. This is a known, anticipated future refactor,
462+
not a surprise to discover later. **Do not attempt to build against this
463+
future API now, it does not exist yet**, this bullet exists purely so a
464+
future reader/maintainer has this context without needing it
465+
rediscovered from scratch.
421466
- **Dark mode: the page chrome supports it, and a dark-mode signal is now
422467
sent to the puzzle iframe, but whether the provider actually honours it is
423468
unverified.** DCR has genuine, pre-existing dark mode support

0 commit comments

Comments
 (0)