| 12.2-admin-form-fields-date-file-upload-relation-editing-with-def |
01 |
database |
| lagoon |
| attach |
| conga |
| pact |
| deferred-binding |
| uploads |
| gormigrate |
| river |
| postgres |
|
| phase |
provides |
| 11 |
conga scheduler (pact.HasSchedule entries, compiled entry table, schedule:run --once) |
|
| phase |
provides |
| 12 |
attach webp decoding (D-24), system_files storage layout, two-phase blob delete |
|
|
| deferred_bindings table (D-01) under history id summercms.deferred, with backend_user_id |
| lagoon deferred-binding store ops scoped by DeferredKey (DeferredBind, DeferredUnbind, DeferredBindings, DeferredForget, DeferredSlaves, MorphType, DeferredEnvelope) |
| lagoon.PurgeDeferred (SKIP LOCKED batches, after-commit blob deletes) and the deferred:purge command |
| attach.Store with the ported image guard (IsAllowedImage), extension, MIME and size limits |
| attach.Relation and attach.HasRelations; attach.BlobKeys and File.ThumbKey |
| lagoon.Date and lagoon.TimeOfDay; Fill text fallback; required treats zero dates as empty |
| lagoon.FrameworkSchedule entry summercms.lagoon[0]:deferred:purge prepended by conga |
| pact.Relation{Before,After}{Create,Update,Delete} optional controller hooks |
|
| 12.2-02 cabana datepicker/fileupload commit |
| 12.2-03 relation child CRUD |
| 12.2-05 unit and security tests |
|
| tokens |
tasks |
commits |
| 31400 |
3 |
3 |
|
79e2a43095 |
8818d7b023 |
| added |
patterns |
|
|
| Framework migration sets get their own history id (summercms.deferred), never appended to an existing set |
| Every deferred-binding read or write is scoped by (session_key, backend_user_id, master_type) |
| Blob deletes collected inside a transaction and run in lagoon.AfterCommit via attach.DeleteKeys |
| Framework-owned schedule entries come from lagoon.FrameworkSchedule and join conga's compiled entry table |
|
|
| created |
modified |
| modules/lagoon/deferred_migrations.go |
| modules/lagoon/deferred.go |
| modules/lagoon/purge.go |
| modules/lagoon/date.go |
| modules/lagoon/schedule.go |
| modules/lagoon/attach/store.go |
| modules/lagoon/attach/guard.go |
| modules/lagoon/attach/relation.go |
| modules/lagoon/deferred_test.go |
| modules/lagoon/date_test.go |
| modules/lagoon/attach/store_test.go |
|
| modules/lagoon/migrations.go |
| modules/lagoon/fill.go |
| modules/lagoon/validate.go |
| modules/lagoon/commands.go |
| modules/lagoon/migrations_test.go |
| modules/lagoon/attach/file.go |
| modules/lagoon/attach/file_test.go |
| modules/lagoon/attach/thumb.go |
| modules/conga/scheduler.go |
| modules/conga/schedule_test.go |
| modules/pact/capabilities.go |
| modules/lagoon/README.md |
| modules/conga/README.md |
| modules/pact/README.md |
| docs/database/attachments.md |
| docs/database/models.md |
| docs/database/casts-and-validation.md |
| docs/plugins/scheduling.md |
| docs/console/setup-and-maintenance.md |
| ../fonoteka.go/parity/schema_diff_test.go |
| ../fonoteka.go/parity/migrate_test.go |
|
|
| 12.2-01: Fill's TextUnmarshaler fallback skips types that also implement sql.Scanner (except lagoon.Date and lagoon.TimeOfDay), so every value that filled through Scan before still fills through Scan |
| 12.2-01: empty text fills a zero lagoon.Date or lagoon.TimeOfDay (stored as NULL), so a cleared datepicker stores NULL and required rejects it |
| 12.2-01: attach.Store keeps only the client file's base name in file_name and refuses a body over MaxBytes from the 1 MiB read-ahead before any blob is written |
| 12.2-01: PurgeDeferred keeps a created-child binding whose slave type no plugin model resolves (counted as Skipped, warned once per type) instead of deleting it blind |
| 12.2-01: deferred:purge with no bucket configured runs and fails only when an expired binding points at a file |
|
| DeferredKey scoping: no deferred-binding API accepts a session key without the admin id and master type |
| MorphType: attach.Owner MorphName when implemented, else the GORM table name; files use DeferredFileType (system_files) |
|
|
| id |
description |
requirement |
verification |
human_judgment |
| D1 |
deferred_bindings migrates under summercms.deferred; bind/unbind dedupe and cancel; foreign admin sees nothing; expired file binding purged with its row and, after commit, its blob |
SC-4 |
| kind |
ref |
status |
| integration |
modules/lagoon/deferred_test.go#TestDeferredUploadPurgeTracer |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D2 |
attach.Store stores a guarded PNG with sort_order = id; SVG refused in image mode; MaxBytes+1 refused with no blob left; exactly MaxBytes stored |
SC-2 |
| kind |
ref |
status |
| integration |
modules/lagoon/attach/store_test.go#TestStoreSmoke |
pass |
|
| kind |
ref |
status |
| unit |
modules/lagoon/attach/store_test.go#TestStoreSmokeRefusals |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D3 |
lagoon.Date and lagoon.TimeOfDay round-trip; Fill fills time.Time, Date, TimeOfDay and pointers from JSON strings; required fails on a zero date |
SC-1 |
| kind |
ref |
status |
| unit |
modules/lagoon/date_test.go#TestDateSmoke|TestTimeOfDaySmoke|TestFillTextSmoke|TestValidateRequiredZeroDateSmoke |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D4 |
deferred:purge registered; framework schedule entry summercms.lagoon[0]:deferred:purge first, movable and removable by purge_at, malformed value fails boot |
SC-4 |
| kind |
ref |
status |
| unit |
modules/conga/schedule_test.go#TestFrameworkScheduleSmoke |
pass |
|
| kind |
ref |
status |
| unit |
modules/lagoon/migrations_test.go#TestRuntimeCommandsRegisterBareAndColonNames |
pass |
|
|
false |
|
| id |
description |
verification |
human_judgment |
| D5 |
fonoteka.go parity suite accepts the new framework table and history table |
| kind |
ref |
status |
| integration |
go -C ../fonoteka.go test ./parity -run '^(TestSchemaMatchesPHPSnapshot|TestMigrateSeedsCanonicalGenres)$' |
pass |
|
|
false |
|
| id |
description |
verification |
human_judgment |
| D6 |
Docs and READMEs name only existing identifiers and commands |
| kind |
ref |
status |
| other |
go test ./cmd/summer -run '^(TestDocsTree|TestDocsCommandsMirrorGeneratedMain)$' && go run ./cmd/summer docs:build --check |
pass |
|
|
false |
|
|
20min |
2026-10-02 |
complete |