Commit Graph

803 Commits

Author SHA1 Message Date
Jakub Zych
bbc3e13d56 docs(13-06): record plan completion in state and roadmap 2026-10-03 11:45:26 +02:00
Jakub Zych
bcd099566b docs(13-06): complete the Phase 13 unit tests, gate and sign-off plan 2026-10-03 11:45:03 +02:00
Jakub Zych
931c02db31 docs(13-06): sign off the Phase 13 security review and validation
- 13-SECURITY-REVIEW.md: every T-13 threat with its strictest severity and
  disposition, protecting code, named tests and the 31 removal checks,
  all failing as required; the CSV export logging fix and the Phase 9
  route inventory update
- 13-VALIDATION.md: per-task map 13-01-T1 to 13-06-T3 all green, the gate
  command, coverage per package, Wave 0 ticked, status validated
- REQUIREMENTS.md: API-03, API-04, API-06 and API-07 complete
- deferred-items.md: 13-06 findings (process-wide job dispatcher, scalar
  mapping body, tmpfs quota)
2026-10-03 11:43:39 +02:00
Jakub Zych
ad79b3cca9 test(13-06): run TestOverlapConstraintFallsThrough in the gate's named stage
- The evidence stage refused T-13-23's review row because the named stage
  did not run the test its removal check RC-01 relies on
2026-10-03 11:32:35 +02:00
Jakub Zych
12b961b1c0 test(13-06): add the fail-closed Phase 13 gate
- scripts/check-phase13.sh with --self-test, --go, --parity, --named,
  --removal, --coverage, --evidence and --all, modelled on check-phase12
- Parity reads the replay's own coverage line: 157 ported and passing,
  0 failing, 14 recorded and not ported; every TestFonotekaNuxtFlows
  subtest, the three wishlist goldens, docs checks and the corpus scan
- Coverage floors of 80% for surf, conga, lagoon, tide and the four
  application packages, the user plugin's classes and every function of
  controllers/registration.go, and the controllers package's pre-phase value
- 31 anchor-exact removal checks with cmp restore, dirty-file refusal and
  a signal-safe restore; FORCE_COLOR unset by the gate itself
2026-10-03 11:27:44 +02:00
Jakub Zych
22a5ebdeda test(13-06): pin that a family falls through a member whose constraint fails
- TestOverlapConstraintFallsThrough: an earlier member that matches the
  literals but not its Where constraint must let a later member answer;
  the routes.php pairs cannot show this, since each member's own handler
  re-checks its constraints and the pairs differ in their literals (T-13-23)
2026-10-03 11:27:44 +02:00
Jakub Zych
4ed45c1b03 test(13-06): cover the Phase 13 framework edges in surf, conga, lagoon and tide
- surf: a transitive three-route family, HEAD and sorted Allow on family
  paths, a family across two plugins with per-member middleware, refused
  trailing-slash and multi-segment shapes
- conga: refusal messages name kind and queue, a configured queue counts
  as served, a delayed unregistered dispatch waits scheduled
- lagoon: prohibited under a wildcard, on a dotted path and after bail
- tide: quoted, RFC 5987 and multi-date download names; a captured id
  beside a masked notification id
2026-10-03 11:01:58 +02:00
Jakub Zych
5d0ce7f5bb docs(13-05): record plan completion in state and roadmap 2026-10-03 10:30:46 +02:00
Jakub Zych
80c6d5f5d0 docs(13-05): complete public share routes plan 2026-10-03 10:30:18 +02:00
Jakub Zych
ca7a6630cd docs(13-04): record plan completion in state and roadmap 2026-10-03 09:52:43 +02:00
Jakub Zych
47168ed909 docs(13-04): complete CSV export and import plan 2026-10-03 09:52:22 +02:00
Jakub Zych
3c43c4dc19 docs(13-03): record plan completion in state and roadmap 2026-10-03 08:24:57 +02:00
Jakub Zych
d1d5ee2012 docs(13-03): complete wishlist plan 2026-10-03 08:24:27 +02:00
Jakub Zych
7ccabf5394 docs(13-02): record plan completion in state and roadmap 2026-10-03 07:30:05 +02:00
Jakub Zych
69019c33d0 docs(13-02): complete notifications, credentials and onboarding plan 2026-10-03 07:29:37 +02:00
Jakub Zych
ac54df6c0e docs(13-01): record plan completion in state and roadmap 2026-10-03 06:42:26 +02:00
Jakub Zych
1c303f1511 docs(13-01): complete framework gaps, job contract and parity scaffolding plan 2026-10-03 06:41:58 +02:00
Jakub Zych
aa2786470a docs(13-01): reword Phase 13 and 14 criteria for the locked boundary
- Phase 13 repos name sm-user-plugin and summercms.go
- wishlist match/apply-release, the credential /test routes and the CSV
  Discogs pick move to Phase 14 (D-01, D-02); notifications drop prune,
  a Phase 14 console command (D-06); CSV and digest job bodies are Phase 14
- API-03, API-04, API-06, INTG-01 and INTG-02 follow; statuses untouched
2026-10-03 06:37:11 +02:00
Jakub Zych
2b94dfd2d2 feat(13-01): add the prohibited rule and dated-download and notification masks
- lagoon.ValidateRequest supports Laravel 9 prohibited (!required, not
  implicit); with no catalog line its message is validation.prohibited
- tide compares Content-Disposition with real calendar dates masked on both
  sides; a different name, an invalid date or a one-sided date still diffs
- tide.NormalizePublications masks a Carbon +00:00 $.data.payload.created_at
  and an uncaptured positive integer $.data.payload.id as {{id}}
- the album-date test's outside-album sibling moves off payload.created_at,
  which now has its own mask
- READMEs and docs describe the rule and both masks
2026-10-03 06:32:46 +02:00
Jakub Zych
55a4092019 feat(13-01): queue jobs whose worker ships later while a worker runs
- a kind no plugin registered always inserts through the insert-only River
  client, so Dispatch and Enqueue no longer fail River's unknown-kind check
  while the in-process worker runs
- while a worker runs, such a kind must name a queue no worker serves;
  an empty queue, default, scheduled, a configured queue or a registered
  job's queue is ErrUnregisteredKindQueue and nothing is written
- README and docs/services/jobs.md describe jobs whose worker ships later
2026-10-03 06:28:40 +02:00
Jakub Zych
fbdeb20126 feat(13-01): register overlapping constrained routes in surf
- compile groups routes ServeMux refuses side by side into overlap families
  and registers each under one generated method-less pattern
- the family handler tries members in registration order on literals and
  Where constraints, sets their path values and runs their own wrapped chain
- no match answers the bare 404; a method mismatch answers ServeMux's 405
  and Allow for the same table without the overlap
- unsupported shapes (same shape, {name...}, shadowing route) fail at boot
- README and docs/services/routing.md describe the behaviour
2026-10-03 06:22:20 +02:00
Jakub Zych
6525d967c5 docs(12.2): record BM UAT approval after v0.1.2 fixes
Browser checks on sm-bm-app passed: datetime popover time, discard confirm, and list date formatting. Phase 12.2 UAT is complete.

Co-authored-by: Cursor <cursoragent@cursor.com>
v0.1.2
2026-10-03 05:59:06 +02:00
Jakub Zych
55314e41f8 fix(admin): datetime popover clock, unsaved confirm, inferred list dates
BM UAT on v0.1.1 showed a date-only calendar for datetime fields, a stuck discard dialog, and raw ISO timestamps when columns.yaml omitted type. The picker now edits time in the popover, confirm sits above the calendar, and omitted time.Time / Date / TimeOfDay columns compile as datetime / date / time.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 05:58:24 +02:00
Jakub Zych
8031fd1c16 docs(12.2): record v0.1.1 tag and defer UAT to BM
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 23:27:52 +02:00
Jakub Zych
5c38d96f8b docs(12.2): record review fixes and persist human UAT
Close the seven code-review findings in disposition and leave the phase pending on browser checks plus the v0.1.1 tag.

Co-authored-by: Cursor <cursoragent@cursor.com>
v0.1.1
2026-10-02 23:13:49 +02:00
Jakub Zych
516f9c9025 fix(12.2): close code-review blockers on uploads, JSON caps, and pivot fill
Keep form save behind in-flight uploads, make retries idempotent via X-Upload-Id, cap remaining JSON bodies, and surface pending pivot type errors instead of zeroing them.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-02 23:10:48 +02:00
Jakub Zych
6bfc0faa8a docs(phase-12.2): add/update security threat verification 2026-10-02 22:35:37 +02:00
Jakub Zych
ce7003bcf6 docs(phase-12.2): add/update validation strategy 2026-10-02 22:25:47 +02:00
Jakub Zych
39332b7750 docs(12.2): record code review disposition 2026-10-02 21:21:04 +02:00
Jakub Zych
ac94cdcce9 docs(12.2): add code review report 2026-10-02 21:20:05 +02:00
Jakub Zych
1757545ecb docs(12.2-05): summary of the phase 12.2 test and gate plan (awaiting the v0.1.1 checkpoint) 2026-10-02 20:55:29 +02:00
Jakub Zych
912a46603f docs(12.2-05): security review and validation map for phase 12.2
- 12.2-SECURITY-REVIEW.md maps T-12.2-01 to T-12.2-36 and the supply
  chain rows to the controls as built and their passing tests, with the
  parent-predicate removal check and the residual risks
- 12.2-VALIDATION.md: per-task map with real task ids, all green,
  nyquist_compliant and wave_0_complete set
- deferred-items.md: out-of-scope findings for follow-up
2026-10-02 20:54:14 +02:00
Jakub Zych
d5494faa81 test(12.2-05): SPA unit tests for the phase and the check-phase12.2 gate
- sessionKey, dateFormat, FileuploadField (protected thumbnails and
  keyboard reorder backstops), RelationChildModal, RelationPivotModal,
  RelationManager row actions and create-screen deferral, date and time
  list cells; typed deferred relation-schema and file-list fixtures
- scripts/check-phase12.2.sh: go, security (named tests, refuses missing
  or skipped), spa, openapi, dist, docs, hygiene and app stages, a
  detector self-test, one PASS or FAIL line per stage under --all
2026-10-02 20:51:36 +02:00
Jakub Zych
5b06b20ac3 fix(12.2-05): mark a partly filled time-mode datepicker invalid
The partial-segment check read only DateField segments, so a time-mode
field (Reka TimeField, data-reka-time-field-segment) with some segments
typed was never flagged. Read both segment attributes. DatepickerField
tests cover both UI-SPEC backstops (Escape focus and disabled days, the
fixed-zone datetime round trip) and the partly filled time case.
2026-10-02 20:37:38 +02:00
Jakub Zych
c8d41a68c6 test(12.2-05): cover every Go behaviour of phase 12.2
- lagoon: Date and TimeOfDay through JSON, text and real DATE/TIME
  columns; Fill text fallback without changing earlier conversions;
  required on zero dates; deferred_bindings shape, store isolation and
  envelope; PurgeDeferred cut-off, after-commit blobs, SKIP LOCKED,
  skipped types and the deferred:purge command
- attach: Store limits, extensions, MIME patterns, default lists, key
  shape and blob cleanup; IsAllowedImage formats, polyglots, ceiling
- conga and pact: framework purge schedule entry and forged jobs; the
  six relation child hook interfaces
- cabana: fileupload and datepicker compile, upload, remove, caption,
  reorder and bounds; deferred commit order, rollback, applied-only and
  concurrent saves; relation contracts, forms, CRUD, deferral, schema
2026-10-02 20:34:23 +02:00
Jakub Zych
9c87a59532 docs(13): create phase plan
Six sequential plans: framework gaps, notifications/credentials/onboarding, wishlist, CSV, public views, unit tests and gate. Research open questions marked resolved per the plan-count checkpoint.
2026-10-02 20:12:35 +02:00
Jakub Zych
9d2b1c1848 test(12.2-05): prove relation child and protected file scoping through the router
- acme.deferred fixture plugin over testdata/deferred (test-only), two
  controllers, recording Form and Relation hooks, two admins
- TestRelationChildScope*: every child route answers 404 for another
  parent, a hidden parent and another admin's pending child, changes
  nothing; undeclared toolbar buttons 403 before SQL; pivot whitelist
- TestProtectedFile*: foreign, pending and public files 404; only jpeg,
  png, gif and webp inline; nosniff, no-store and sandbox CSP everywhere
2026-10-02 20:10:10 +02:00
Jakub Zych
162a8ec5a1 docs(12.2-04): update state and roadmap progress after plan 12.2-04 2026-10-02 19:58:42 +02:00
Jakub Zych
92d665f1b2 docs(12.2-04): complete the admin SPA dates, uploads and relation modals plan summary 2026-10-02 19:58:19 +02:00
Jakub Zych
69a37456f6 feat(12.2-04): edit related records in modals and defer relation work on new records
- RelationManager renders create/link/delete/unlink in declared order with
  one primary, opens the child modal (update or view form) or the pivot
  modal on row click, and deletes selected children behind a busy confirm
- RelationChildModal creates and edits children with its own session key
  (X-Child-Session-Key) so uploads and dates work inside it
- RelationPivotModal edits link details; the picker links one record with
  its pivot values when the relation has a pivot form
- deferrable managers render on the create screen with owner id 0, the
  form's X-Session-Key and the pending note, and mark the form dirty
- the registry resolves RelationManager lazily (child forms close an
  import cycle); DataTable gains openable rows and a trailing cell
- relation lang keys in en and pl; rebuilt boardwalk dist
2026-10-02 19:56:10 +02:00
Jakub Zych
a0c182745e feat(12.2-04): add the datepicker field and stored date and time list cells
- pin @internationalized/date 3.12.4 as a direct admin dependency (approved)
- dateFormat.ts parses and emits date, datetime (local display, UTC emit,
  ignoreTimezone wall clock) and time values without the global Date
- DatepickerField on Reka DatePicker and TimeField with locale segments,
  calendar popover, clear button, min/max and yearRange bounds
- list cells of type date and time render the stored string
- datepicker lang keys in en and pl; rebuilt boardwalk dist
2026-10-02 19:45:43 +02:00
Jakub Zych
d66812caef docs(13): map phase patterns 2026-10-02 19:39:34 +02:00
Jakub Zych
ea33296799 feat(12.2-04): add the fileupload field with deferred uploads on the form session key
- sessionKey.ts: one 32-byte base64url key per form mount, sent only in headers
- api/files.ts: FileRoutes over the record and child file routes, XHR upload with progress, 401 refresh and retry
- FileuploadField and FileCaptionModal per UI-SPEC section 3: dropzone, image grid, rows, per-item states, client pre-checks, reorder, protected previews
- FormView provides FORM_SESSION, counts pending changes as dirty and sends X-Session-Key on create and update
- fileupload lang keys in en and pl, admin-spa docs note, deferred smoke test, rebuilt dist
2026-10-02 19:22:22 +02:00
Jakub Zych
1ebfe691a2 docs(13): research phase domain 2026-10-02 19:21:38 +02:00
Jakub Zych
cb653711f0 docs(12.2-03): update state and roadmap progress after plan 12.2-03 2026-10-02 19:09:54 +02:00
Jakub Zych
6cdfbd49d0 docs(12.2-03): complete the relation child CRUD and deferral plan summary 2026-10-02 19:09:26 +02:00
Jakub Zych
fe9e8baaf1 feat(12.2-03): defer relation work on unsaved records and add child file routes
- record id 0 with X-Session-Key manages deferrable relations: create, link, unlink, delete and pivot edits are held in deferred_bindings
- the record's create save applies relation bindings with the file bindings; an ineligible link is a 422 on the relation-manager field
- child forms upload files through .../records/{child}/files/{field} keyed by X-Child-Session-Key; the child save commits them
- boot refuses a deferrable relation with create whose related model no plugin lists in Models()
2026-10-02 19:08:16 +02:00
Jakub Zych
afb05b6ee4 feat(12.2-03): add parent-scoped child show, update, delete and pivot routes
- loadChild finds a child with one query carrying the parent predicate; a foreign child is 404
- GET/PUT .../records/{child} and POST .../delete (all or nothing) per relation kind
- hasMany link adopts NULL-key rows and unlink clears the key; pending created children are never candidates
- link accepts pivot values for one id through the pivot.form whitelist; GET/PUT .../pivot/{child}
- Link and Unlink share linkRelated/unlinkRelated for the deferred commit
2026-10-02 18:44:34 +02:00
Jakub Zych
48a5b8045a feat(12.2-03): add hasMany relation contracts, relation forms and child create
- RelationContract gains Kind (empty is belongsToMany) and ForeignKey, with kind-aware boot checks
- manage.form, view.form and pivot.form compile against the related or pivot model; $/ paths resolve inside the plugin
- view toolbarButtons accept create|update|delete|link|unlink, each the capability of its routes
- POST .../relations/{name}/records creates a child through the manage form; the server sets the hasMany key
- relation schema carries kind, deferrable and the localized forms; 17 new relation message keys in en and pl
2026-10-02 18:37:13 +02:00
Jakub Zych
0b4ef9c311 docs(12.2-02): update state and roadmap progress after plan 12.2-02 2026-10-02 18:21:05 +02:00