16 KiB
phase, plan, subsystem, tags, requires, provides, affects, actuals, tech-stack, key-files, key-decisions, patterns-established, requirements-completed, coverage, duration, completed, status, plan_head_before, plan_head_after, fonoteka_plan_head_before, fonoteka_plan_head_after
| phase | plan | subsystem | tags | requires | provides | affects | actuals | tech-stack | key-files | key-decisions | patterns-established | requirements-completed | coverage | duration | completed | status | plan_head_before | plan_head_after | fonoteka_plan_head_before | fonoteka_plan_head_after | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 13-p-ytarium-api-wishlist-notifications-csv-credentials-public | 01 | api |
|
|
|
|
|
|
|
|
|
|
|
29min | 2026-10-03 | complete | 6525d967c5 |
aa2786470a |
1cfe5016d25bfec6f832e865c12e8a9d41a8fbd8 | 75b89dd24255fa5aa227fc30552ebba4a40992f5 |
Phase 13 Plan 01: Framework gaps, job contract and parity scaffolding Summary
surf now boots PHP's constraint-separated overlapping routes as registration-order families, conga queues worker-less job kinds on unserved queues while the worker runs, lagoon speaks prohibited, tide masks dated downloads and notification publications, and the Phase 13 job contract plus parity tooling are in place for plans 13-02 to 13-05.
Performance
- Duration: 29 min
- Started: 2026-10-03T04:12:00Z
- Completed: 2026-10-03T04:41:00Z
- Tasks: 4 of 4
- Files modified: 31 (21 in summercms.go, 10 in fonoteka.go)
Accomplishments
- surf overlap families (
modules/surf/overlap.go): conflicts are found with ServeMux itself as the oracle (an incremental probe mux plus pairwise checks only when a registration panics), closed transitively, and folded with any route or family whose generated method-less pattern would conflict. The family handler tries members in registration order on literals andWhereconstraints, sets their path values andRequest.Pattern, and runs their own wrapped chain. No match is the bare 404; a method miss computesAllowby asking the mux per method, matching what ServeMux answers for the table without the overlap. A boot-time probe refuses a more general route that would steal a member's requests.Routes()androute:listare unchanged. - The four routes.php wishlist pairs plus
albums/similardispatch exactly as Laravel does on one router (TestWishlistOverlapPatternsDispatch), including the 404s forwishlist/albums/subscribeandwishlist/0x1/albums. - conga (
ErrUnregisteredKindQueue): unregistered kinds always go through the insert-only client; while a worker runs they need a queue outside default, scheduled, configured and registered queues. Nothing is written on refusal;CancelJobworks on waiting jobs. - Job contract (
classes/job_contract.go): kindsgolem15.fonoteka.{csv_import,csv_match,wishlist_digest,wishlist_purchased_mail}, labelsfonoteka.csv.import,fonoteka.csv.match,wishlist_digest, queuesfonoteka_csv_import,fonoteka_csv_match,fonoteka_wishlist_digest,mail, digest delay 1800 s, args JSON pinned byte for byte. - lagoon
prohibited:!validateRequired, not implicit; 0, false and non-empty arrays fail; messagevalidation.prohibitedin pl and en. - tide:
Content-Dispositioncompared with real calendar dates masked;$.data.payload.created_at(Carbon+00:00) and an uncaptured positive integer$.data.payload.idmasked in publications. - Parity tooling:
QUEUE_CONNECTIONoverride,php_parity.sh rows "<SELECT>"(read-only,-safe, single SELECT),share:wishlistcapture on GET/PUT share and regenerate, ported case-status check incheck_corpus.go, D-15 manifest fix, Phase 13 recording README section. - Planning docs: ROADMAP Phase 13 repos and criteria 1-4, Phase 14 criteria 4-5, REQUIREMENTS API-03/04/06 and INTG-01/02.
Task Commits
summercms.go:
- Task 1: surf overlap families -
fbdeb20(feat) - Task 2: conga workerless kinds -
55a4092(feat) - Task 3: prohibited and tide masks -
2b94dfd(feat) - Task 4: planning docs -
aa27864(docs)
fonoteka.go:
- Task 1: wishlist overlap dispatch test -
f5f59ce(test) - Task 2: job contract -
9bac9d1(feat) - Task 4: parity tooling -
75b89dd(feat)
Decisions Made
See key-decisions above. The queue-name change is the one the user should confirm before 13-03/13-04 dispatch jobs: the D-03 dotted names cannot be River queues, so they stay the summer_jobs labels (PHP parity) and the queues use underscores.
Deviations from Plan
Auto-fixed Issues
1. [Rule 3 - Blocking] D-03 queue names are invalid River queue names
- Found during: Task 2
- Issue: River validates
InsertOpts.Queueon every insert against^[a-z0-9]+([_|-]?[a-z0-9]+)*$;fonoteka.csv.import,fonoteka.csv.matchandfonoteka.wishlist.digestwould fail every Dispatch. - Fix:
CsvImportQueue = "fonoteka_csv_import",CsvMatchQueue = "fonoteka_csv_match",WishlistDigestJobQueue = "fonoteka_wishlist_digest"; kinds and labels unchanged.TestJobContractasserts every queue matches River's rule. The acceptance grep'"fonoteka.wishlist.digest"'still prints 1 only because.is a regex wildcard. - Files modified: classes/job_contract.go, classes/job_contract_test.go, job_contract_worker_test.go, parity/README.md
- Commit: 9bac9d1
2. [Rule 1 - Bug avoided] conga refusal scoped to a running worker
- Found during: Task 2
- Issue: plugin jobs are registered only when a worker starts, so refusing unregistered kinds in a worker-less process would reject every plugin job enqueued by a
work_in_serve: falseserve process. - Fix: the queue checks apply while a worker runs;
TestUnregisteredKindWithoutWorkerpins the unchanged worker-less behaviour. - Commit:
55a4092
3. [Rule 1 - Test conflict] Existing album-date test asserted $.data.payload.created_at stays unmasked
- Found during: Task 3
- Fix:
TestNormalizePublicationAlbumDateskeeps its intent (dates outside the album subtree stay) on apublished_atsibling. - Commit:
2b94dfd
4. [Rule 3 - Blocking] Two ported oauth manifest cases disagreed with their fixtures
- Found during: Task 4 (the new case-status check failed the corpus)
- Issue:
POST oauth/consentmanifest 200 vs recorded 500,POST oauth/deny200 vs recorded 404. Replay already asserts the fixture status. - Fix: manifest statuses set to the fixtures, as D-15 does for the invitation case. The check matches a case against every step whose
route_idnames the route, since fixtures carry setup steps. - Commit: 75b89dd
5. [Rule 2 - Hardening] rows runs sqlite3 with -readonly -safe
-safeblocksload_extension()and ATTACH, so a SELECT cannot load code (T-13-26).
Total deviations: 5 auto-fixed (2 blocking, 2 bug/test conflicts, 1 hardening). Impact: the job contract's queue strings differ from the plan text; everything else is as planned.
Issues Encountered
TestPhase09SecurityRoutesin fonoteka.go fails on the current framework because of cabana routes added by Phase 12.2; pre-existing and logged indeferred-items.md.- The agent shell sets
FORCE_COLOR=3, which fails two bonfire colour tests; suites were run with it unset.
Known Stubs
None. The CSV import, CSV match and digest kinds have no worker by design (D-04); they are a documented contract, not stubs.
Threat Flags
None beyond the plan's register. T-13-22, T-13-23, T-13-24, T-13-25 and T-13-26 are mitigated as planned.
Next Phase Readiness
- 13-03 can mount the real wishlist routes; use
classes.WishlistDigest*andclasses.WishlistPurchasedMail*fromjob_contract.go. RecordGET wishlist/sharefrom a state with sharing enabled: a null token fails theshare:wishlistcapture. - 13-04 dispatches
classes.CsvImportArgs/CsvMatchArgswithCsvImportQueue/CsvMatchQueueand the dotted labels. - 23 pending case-status mismatches remain in the manifest; they are fixed as each route is re-recorded and ported.
Self-Check: PASSED
- Created files exist: overlap.go, overlap_test.go, unregistered_kind_test.go, normalize_phase13_test.go, job_contract.go, job_contract_test.go, job_contract_worker_test.go, routes_overlap_test.go.
- Commits exist:
fbdeb20,55a4092,2b94dfd,aa27864(summercms.go); f5f59ce, 9bac9d1, 75b89dd (fonoteka.go). - summercms.go
go vet ./...andgo test ./...green (FORCE_COLOR unset); docs checks green. fonoteka.go root, fonoteka plugin and user plugin suites green except the pre-existingTestPhase09SecurityRoutes.