@@ -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