Commit Graph

470 Commits

Author SHA1 Message Date
Jakub Zych
02712ad651 docs(phase-10.2): add validation strategy 2026-09-28 13:38:09 +02:00
Jakub Zych
961bfd2749 docs(10.2): record code review disposition 2026-09-28 13:35:33 +02:00
Jakub Zych
38f087deb3 fix(10.2): exclude planning artifacts from import gate
- Align Git-backed source enumeration with the fallback scan
- Prove tracked historical imports are ignored in self-test
2026-09-28 13:35:11 +02:00
Jakub Zych
c56561374c docs(10.2): add code review report 2026-09-28 13:31:19 +02:00
Jakub Zych
957625e00e docs(10.2-02): complete framework onboarding plan 2026-09-28 13:23:50 +02:00
Jakub Zych
4c7d4cc4b9 test(10.2-02): add nested-layout hygiene gate
- Refuse root package directories, old imports, missing READMEs, and stale status text\n- Validate Go vet and tests across framework and Fonoteka
2026-09-28 13:18:08 +02:00
Jakub Zych
aca670b5ab docs(10.2-02): onboard framework developers
- Explain the framework and Fonoteka application split\n- Document the verified admin-login path and guarded Phase 15 cutover
2026-09-28 13:12:57 +02:00
Jakub Zych
680a61cde2 docs(10.2-02): document framework modules
- Add concise code-derived onboarding for all nested modules\n- Name a real entry point and current consumers per package
2026-09-28 13:07:52 +02:00
Jakub Zych
3035ea1749 docs(10.2): record wave 1 completion 2026-09-28 13:05:09 +02:00
Jakub Zych
1c2f44ae83 docs(10.2-01): summarize modules migration 2026-09-28 13:03:41 +02:00
Jakub Zych
57e7b56983 test(10.2-01): retarget moved package fixtures
- Resolve CLI and module-local fixtures from modules/ paths
- Keep root admin assets reachable from nested package tests
2026-09-28 12:56:15 +02:00
Jakub Zych
5e50b166ef refactor(10.2-01): nest framework packages under modules
- Move remaining beach packages and embedded admin assets\n- Rewrite framework, example, build, and gate paths
2026-09-28 02:21:02 +02:00
Jakub Zych
ac1f6d14f4 refactor(10.2-01): nest festival module
- Move festival under modules\n- Update framework and example importers
2026-09-28 02:16:36 +02:00
Jakub Zych
a9a7bbef73 fix(10.2): revise plans based on checker feedback 2026-09-28 01:56:53 +02:00
Jakub Zych
039cfeddfd docs(10.2): create phase plan 2026-09-28 01:46:23 +02:00
Jakub Zych
195bf2ce75 docs(state): record phase 12 context session 2026-09-28 01:28:26 +02:00
Jakub Zych
4f2358e26c docs(12): capture phase context 2026-09-28 01:28:25 +02:00
Jakub Zych
a64d5aaaa7 docs: capture exploration — backend-deployment 2026-09-28 01:27:19 +02:00
Jakub Zych
cbb5a516ef docs(state): record phase 10.1 context session 2026-09-28 00:55:00 +02:00
Jakub Zych
17250cfbd6 docs(10.1): capture phase context 2026-09-28 00:54:55 +02:00
Jakub Zych
547bd0fc17 docs(state): record phase 11 context session 2026-09-28 00:54:38 +02:00
Jakub Zych
be8bfccf98 docs(11): capture phase context 2026-09-28 00:54:36 +02:00
Jakub Zych
df45520dd8 docs: capture exploration — apparatus dissolved into framework 2026-09-28 00:39:43 +02:00
Jakub Zych
7ac75b918d test(09): persist human verification items as UAT 2026-09-28 00:03:21 +02:00
Jakub Zych
2ad19bda21 docs(09): record code review disposition 2026-09-27 23:52:18 +02:00
Jakub Zych
ee79c7f2c9 docs(09): add code review report 2026-09-27 23:51:58 +02:00
Jakub Zych
57f2204ece docs(phase-10): complete phase execution 2026-09-27 20:45:17 +02:00
Jakub Zych
35f55c733d docs(10): re-verify phase after CR-01 fix 2026-09-27 20:45:11 +02:00
Jakub Zych
c7487f6799 docs(10): re-review CR-01 fix and record approved UAT 2026-09-27 20:38:18 +02:00
Jakub Zych
7e015638f7 docs: log full-width admin forms fast task 2026-09-27 20:32:03 +02:00
Jakub Zych
25856710c7 fix(admin): render record and settings forms full width 2026-09-27 20:32:02 +02:00
Jakub Zych
a405b1b7ff docs(quick-260927-q23): fix CR-01: /auth/refresh must enforce tokens_valid_after and is_activated 2026-09-27 19:12:05 +02:00
Jakub Zych
a13a1214cb test(bouncer,cabana): cover admin refresh subject checks without a database
Quick 260927-q23 (CR-01), unit coverage that runs under -short.

- bouncer: TestRefreshAudienceForSubject covers active, pre/post cutoff,
  missing, nil provider, non-numeric sub, provider error, and proves
  token-only refusals never reach the provider
- bouncer: TestJWTGuardTokensValidAfter pins the unchanged "User not found"
  message and errors.Is(err, ErrSubjectRejected)
- cabana: TestPhase10Coverage subtest pins cookie expiry on subject
  refusals, no cookies over Bearer or on a provider error, and the
  post-cutoff success path
2026-09-27 19:00:12 +02:00
Jakub Zych
be4a923f36 fix(cabana): enforce tokens_valid_after and is_activated on admin refresh
Fixes review finding CR-01 (quick 260927-q23): POST {prefix}/api/v1/auth/refresh
minted a new token without loading the admin, so a session kept alive by the
SPA's refresh-on-401 survived admin:reset-password, deactivation and deletion.
This broke Phase 9 truth T-09-04.

- bouncer: extract the JWT guard's subject lookup into subjectPrincipal and
  issuedBeforeCutoff (same order and messages), add ErrSubjectRejected
- bouncer: add RefreshAudienceFor, which runs the guard's subject checks
  after the token-only checks and before minting; Refresh and
  RefreshAudience are unchanged (nil hook)
- cabana: share one lazyBackendUsers provider between the backend guard and
  refresh; a cookie refresh refused for its subject expires summer_admin
- test: TestAdminRefreshRevocation (Postgres, real admin:reset-password)
2026-09-27 18:58:15 +02:00
Jakub Zych
815cb903c6 test(10): persist human verification items as UAT 2026-09-27 18:44:38 +02:00
Jakub Zych
f47a560cc8 docs(10): add phase verification report 2026-09-27 18:44:23 +02:00
Jakub Zych
6918ec5998 docs(10): add code review report and disposition 2026-09-27 18:36:06 +02:00
Jakub Zych
473a454c29 docs(10-05): record plan 05 progress, decisions and ADMIN-06 in state, roadmap and requirements 2026-09-27 18:24:07 +02:00
Jakub Zych
3bdf6c9301 docs(10-05): complete unit tests, assembled acceptance and phase gate plan 2026-09-27 18:23:44 +02:00
Jakub Zych
074fc52e5e docs(10-05): Phase 10 security review and final validation map
- 10-SECURITY-REVIEW.md: T-10-01..T-10-25 and T-10-SC with mitigation,
  test or gate stage, observed result, residual risk and the removal
  (mutation) checks behind every high threat
- 10-VALIDATION.md: executed task commands, gate statuses, Wave 0 done,
  nyquist_compliant after scripts/check-phase10.sh --all passed
2026-09-27 18:22:01 +02:00
Jakub Zych
fbef773a24 test(10-05): hygiene confines browser storage and self-tests each rule
- --hygiene refuses localStorage, sessionStorage, indexedDB or document.cookie
  outside admin/src/state/useSidebar.ts (T-10-22)
- --self-test plants each violation with a scratch test import, so the
  refusal must come from that rule and not from the untested-module check
2026-09-27 18:15:05 +02:00
Jakub Zych
07edc6ca29 test(10-05): fail-closed Phase 10 gate script
- scripts/check-phase10.sh with --self-test, --go, --security, --postgres,
  --spa, --openapi, --dist, --hygiene, --evidence and --all
- phase10_detect refuses failed, skipped, zero-test, non-JSON and build-failed
  go test runs and named tests that did not pass
- the two known fonoteka parity failures are the only allow-listed ones and
  refuse the gate once they pass again
- hygiene enforces the framework/app boundary, SC-4 alias-only API types,
  typed-client-only HTTP, no raw HTML, same-origin dist, named lucide imports,
  no retired admin prefix routes and a test import for every SPA module
2026-09-27 18:10:59 +02:00
Jakub Zych
ef448da1cc test(10-05): cover every Phase 10 Go change with branch-level tests
- bouncer TestPhase10CookieGuard: cookie read without Bearer, Bearer wins,
  empty cookie, frontend audience and blacklisted jti rejected
- boardwalk TestPhase10BoardwalkServing: HEAD, query strings, encoded
  traversal, index by name, nested prefix, MIME fallback, constructor errors
- cabana TestPhase10Coverage: mounted unsafe routes vs the CSRF walk, option
  and filter edges, read-only labels, relation message defaults, bundle
  fallback locale, cookie refresh of an expired token in the refresh window
- phrasebook override precedence, new locale, Bundle merge order, Forms shapes
- surf prefix collision for deeper paths and the default /backend prefix
- swagger2openapi TestUnionRewrite and converter branch tests
- framework tests no longer name the application (acme fixtures instead)
2026-09-27 18:05:28 +02:00
Jakub Zych
1c2a66df45 test(10-05): bring every SPA module, composable and component under Vitest
- 41 unit and component suites under admin/tests/{app,state,shell,list,form,relation,views,ui}
  covering states and a11y roles; every src module is imported by a test
- typed fixture helper assigns each JSON fixture to its generated OpenAPI type
- fix: iconFor ignores inherited object members such as "constructor"
- fix: field controls import ./control instead of the registry (import cycle
  left a renderer unregistered depending on module load order)
- fix: dropdown shows the placeholder for an unknown stored value next to an emptyOption
- fix: list announces a failed schema load even when the rows arrive after it
- tailwind no longer scans admin/tests; boardwalk/dist rebuilt
2026-09-27 17:53:57 +02:00
Jakub Zych
8259a456bb docs(10-04): complete relation manager and shell polish plan 2026-09-27 17:29:15 +02:00
Jakub Zych
445404e394 feat(10-04): collapsible panel with flyout, user menu with logout, breadcrumbs and dark mode
- useSidebar: collapsed below 1100px (matchMedia) or by the admin's choice,
  persisted as a boolean under summer-admin.sidebar; the viewport never
  overwrites the stored choice
- SectionPanel collapse and rail expand buttons; SectionFlyout (role menu)
  opens on hover, focus, Enter or ArrowDown on a rail item, closes on Esc or
  about 200 ms after leaving and returns focus to the rail item
- Breadcrumbs with plugin, controller and record crumbs; UserMenu (Reka
  DropdownMenu) with initials, name, role and Wyloguj
- useAuth.logout POSTs /auth/logout, clears user, navigation and settings
  and routes to login even when the call fails
- applyColorScheme toggles .dark from prefers-color-scheme (no toggle, A6)
- newest toast first, 200 ms fade and scale for dialogs and toasts
- one relation-manager type constant in the registry
- shell smoke tests; tests default to a desktop, light matchMedia
2026-09-27 17:26:44 +02:00
Jakub Zych
f4e97cccad feat(10-04): search, link and unlink related records through the relation manager
- relation-manager registered in the field registry; renders only on an
  existing record, never on create, and is never part of the save body
- RelationManager: relation schema label and comment, debounced search,
  selectable linked list (DataTable relation variant), toolbar buttons in
  declared order, confirmed unlink with plural messages and toasts
- RelationPickerModal: Reka Dialog (aria-modal, focus trap, Esc) over the
  candidates endpoint five per page, selection kept across pages, Dodaj (N)
  POSTs link, focus returns to the opener
- admin OpenAPI documents search, sort, dir, page and per_page on the linked
  and candidate relation routes so the SPA sends them typed
- neutral acme.demo.widgets members fixtures and relation smoke tests
2026-09-27 17:18:14 +02:00
Jakub Zych
6e1b6dd5bf docs(10-03): record plan 03 progress in state and roadmap 2026-09-27 17:02:50 +02:00
Jakub Zych
1964844eb9 docs(10-03): complete admin lists, forms, filters and settings plan 2026-09-27 17:02:31 +02:00
Jakub Zych
8f32416f4f feat(10-03): tabs, toggles, relation fields, form lifecycle and settings pages
- FormTabs groups fields by tab (untabbed fields in the default tab) as a
  segmented tablist; a tab holding invalid fields after a 422 shows a
  count badge and the form switches to the first invalid field
- switch, checkbox and relation join the renderer registry: toggle cards
  (role=switch, 20px checkbox) keep a numeric value numeric; relation
  fields are read-only labels from meta.labels, a searchable single
  select over fields/{field}/options with emptyOption first, or ordered
  removable chips with an appending search (300 ms debounce, 20 per
  page, more on scroll or the more action)
- FormView gets the back button, record title and update subtitle, a
  sticky footer (Usuń with deleteConfirm then DELETE, Anuluj, Zapisz i
  zamknij to the mapped redirectClose, Zapisz), and asks before leaving a
  dirty form on any route change plus a beforeunload guard
- Settings: the rail pins Ustawienia to the bottom when /settings is
  non-empty; /settings lists pages by category; /settings/:code renders
  the settings schema through FormGrid and the registry, PUTs the values
  and maps a 422 like the record form
- New backend::lang keys (form.more_options, tab_default, discard,
  settings.back); form and settings smoke tests; boardwalk/dist rebuilt
2026-09-27 17:00:18 +02:00