| 10.1-runtime-admin-extension-point |
03 |
admin |
| go |
| fonoteka |
| cabana |
| custom-elements |
| html-template |
| lagoon |
| admin |
| discogs-stub |
|
| phase |
provides |
| 10.1-runtime-admin-extension-point |
10.1-01 pact AdminClientAssets/HasAdminActions/AdminPartialData, widget/toolbar/partial routes, plugin asset route; 10.1-02 SPA widget host, header partial host, toolbar actions, partial style kit |
|
|
| Albums statistics strip (headerPartial stats, controllers/albums/_stats.htm) scoped by scopeAlbums |
| albumsAdminController.PartialData, AdminJS, AdminCSS, AdminActions with albumsStatsView/albumsStatItem view models |
| Albums form year field and discogs widget field (golem15-fonoteka-discogs-lookup, action discogsLookup, fill [year, format]) |
| discogsLookup and discogsSync stub actions gated by golem15.fonoteka.access_albums |
| plain-JS custom element assets/js/discogs-lookup.js and assets/css/albums.css embedded in the plugin AdminFS |
| en and pl copy for item.year, stats.*, discogs.lookup_*, discogs.sync_button, discogs.stub_* |
| TestPhase101AlbumsSmoke (stats, widget, assets, toolbar) |
| lagoon.Fill converts json.Number into integer, unsigned and float fields |
|
| 10.1-04 unit tests and gate |
| 14 Discogs client |
|
| tokens |
tasks |
commits |
| 15900 |
3 |
4 |
|
720ee5796b |
c3efbc3428 |
be3fbf4d23315e10abe37ef405400e7907ae33fa |
9868a0a26957d4657e7084755655dd3a6f6c8f11 |
| added |
patterns |
|
|
| A header partial's view model is a curated struct of labels and integers; each count query is built fresh from db.WithContext(ctx).Model(...) and passed through the controller's scope |
| Application widget elements are plain JS custom elements with one light-DOM button; text comes only from the SPA's label and busy-label attributes and the element only dispatches summer-action |
| Discogs actions reuse the existing Winter permission instead of adding permission codes |
|
|
| created |
modified |
| ../fonoteka.go/plugins/golem15/fonoteka/controllers/albums/_stats.htm |
| ../fonoteka.go/plugins/golem15/fonoteka/assets/js/discogs-lookup.js |
| ../fonoteka.go/plugins/golem15/fonoteka/assets/css/albums.css |
| ../fonoteka.go/plugins/golem15/fonoteka/admin_phase101_smoke_test.go |
|
| ../fonoteka.go/plugins/golem15/fonoteka/controllers/albums_admin_controller.go |
| ../fonoteka.go/plugins/golem15/fonoteka/controllers/albums/config_list.yaml |
| ../fonoteka.go/plugins/golem15/fonoteka/models/album/fields.yaml |
| ../fonoteka.go/plugins/golem15/fonoteka/admin.go |
| ../fonoteka.go/plugins/golem15/fonoteka/lang/en/lang.yaml |
| ../fonoteka.go/plugins/golem15/fonoteka/lang/pl/lang.yaml |
| ../fonoteka.go/plugins/golem15/fonoteka/admin_albums_test.go |
| ../fonoteka.go/plugins/golem15/fonoteka/admin_phase10_controllers_test.go |
| ../fonoteka.go/plugins/golem15/fonoteka/admin_phase10_copy_test.go |
| modules/lagoon/fill.go |
| modules/lagoon/fill_test.go |
| modules/lagoon/README.md |
|
|
| lagoon.Fill converts json.Number into numeric fields; a fraction or an overflow into an integer field is an error, not a silent truncation |
| The stats template trims whitespace between items with {{- -}}, so the node tree carries no whitespace-only text nodes between stats |
| The discogs widget sends only its fill keys; the stub ignores them and the record, so the create form (record-id empty) gets the same answer |
|
| Application extension surfaces get a smoke test through the assembled router at the admin prefix with a real cookie admin and a collection binding |
|
|
| id |
description |
requirement |
verification |
human_judgment |
| D1 |
Albums list header partial: a statistics strip with the total, per-format counts in getFormatOptions order and No shelf, counted only inside the admin's collection |
ADMIN-07 |
| kind |
ref |
status |
| integration |
../fonoteka.go/plugins/golem15/fonoteka/admin_phase101_smoke_test.go#TestPhase101AlbumsSmoke/stats |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D2 |
Albums form year field and Load from Discogs widget whose stub action fills year 1977 and format LP without saving; a save persists both |
ADMIN-07 |
| kind |
ref |
status |
| integration |
../fonoteka.go/plugins/golem15/fonoteka/admin_phase101_smoke_test.go#TestPhase101AlbumsSmoke/widget |
pass |
|
| kind |
ref |
status |
| unit |
modules/lagoon/fill_test.go#TestFillJSONNumber |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D3 |
Controller JS and CSS served from the embedded AdminFS with JS/CSS content types, nosniff and an ETag; undeclared plugin files are 404 |
ADMIN-07 |
| kind |
ref |
status |
| integration |
../fonoteka.go/plugins/golem15/fonoteka/admin_phase101_smoke_test.go#TestPhase101AlbumsSmoke/assets |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D4 |
Sync with Discogs toolbar action: localized label, stub message with an empty fill, CSRF header required, Genres-only admin gets 403 on toolbar, widget and partial |
ADMIN-07 |
| kind |
ref |
status |
| integration |
../fonoteka.go/plugins/golem15/fonoteka/admin_phase101_smoke_test.go#TestPhase101AlbumsSmoke/toolbar |
pass |
|
| kind |
ref |
status |
| integration |
../fonoteka.go/plugins/golem15/fonoteka/admin_phase10_copy_test.go#TestPhase10ControllerCopy |
pass |
|
|
false |
|
| id |
description |
verification |
human_judgment |
rationale |
| D5 |
In a real browser: plugin module script loads under CSP, the element upgrades, the widget turns busy and fills the form, the strip and buttons wrap at 768px with pl labels, and the Albums stylesheet is off on other controllers |
|
true |
CSP enforcement, module loading, custom-element upgrade and the 768px layout backstops need a real browser (plan Task 3 human-check, UI-SPEC backstop rows); collected at /gsd-verify-work |
|
|
11min |
2026-09-29 |
complete |