fix: the catalog tells the installed truth — licence, state, Wardrobe (v3.1.1) - #376
Merged
Conversation
…Wardrobe rename (v3.1.1 font half) Dean's T204 demo feedback. (1) The pre-install trust surface now shows the licence: CatalogEntryResponse projects FontLicense/Version/Subset via the hardened serializer (all six font args passed BY NAME — the null-soup guard), FontDetailPanel renders the same 'licence · version · subset' line the Wardrobe page uses. (2) Installed-state truth: /api/fonts rides the page load (fail-closed to [] — documented direction: a stale 'Install' costs an idempotent re-install; a false 'Installed' costs an operator a missing font), Installed chip + Re-install label, the specimen caption is state-neutral in both states, and a successful install flips state locally (failure flips nothing). (3) /library -> /wardrobe: nav 'Wardrobe', WardrobeClient/WardrobePage/WardrobeIcon, media-Libraries docstring disambiguated; backend route + DTO names stay (wire contracts don't chase UI labels).
…1.1 theme half) Mirrors the font half (d82f870) for themes: the detail panel shows an Installed chip + 'Imported · <source> · <date>' provenance (catalog slug or 'file'; NULL provenance — the future authored case — renders nothing, never 'Imported · null'), the button reads Re-install when installed, and a successful install flips state locally (2xx only; failed installs flip nothing — spec-pinned on BOTH kinds, closing the font-half N3 gap). Installed source = the existing /api/settings Station:Theme choices (importedFrom/importedAt already ride that wire — no new route), projected to three fields before the RSC payload, fail-closed to [] with the documented degrade direction. Inherited obligations closed: CatalogEntryResponse.UnreachableCatalog() factory kills the 16-null literal (CS0102 forced the name); shared <Chip> extracted and adopted at all five duplicated sites (PersonasClient's ml-2 equivalence verified). ThemeImportResponse carries ImportedAt via a store READ-BACK after upsert — never a fabricated UtcNow; the spec pins response == stored row == settings choice, the whole gh-#375 contract in one walk.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Dean's T204 demo feedback + gh-#375, both halves review-gated and browser-smoked (both kinds re-encountered against the live catalog):
d82f870fonts — the licence trio (OFL-1.1 · v2.000 · latin) joins the pre-install detail panel; installed-state awareness (Installed chip, Re-install, state-neutral specimen caption, local flip on success only); /library → /wardrobe rename (nav 'Wardrobe', the media-Libraries docstring disambiguated;/api/fonts+ wire DTO names deliberately stay).6dbb8ebthemes (gh-Theme catalog detail: no installed-state or provenance (parity with the font-pack polish) #375) — same truth-telling for themes: Installed chip + 'Imported · ⟨source⟩ · ⟨date⟩' + Re-install; installed source = the existing Station:Theme settings choices (no new route);ThemeImportResponse.ImportedAtvia a store read-back (never a fabricated UtcNow — spec pins response == stored row == settings choice). Inherited debt paid:CatalogEntryResponse.UnreachableCatalog()kills the 16-null literal; the shared<Chip>replaces five duplicated chip sites.Gates: dotnet 2,284 passed / 0 failed; jest 90 suites / 861 passed; tsc clean; failed installs flip nothing on either kind (spec-pinned both).
Closes #375. Tag v3.1.1 after merge — pin-bump PR follows the images.