Record SUMMARY, advance STATE/ROADMAP to 4/4 plans executed, and
mark Phase 16.3 ready for verify-work after the gate passed.
Co-authored-by: Cursor <cursoragent@cursor.com>
Fill every 16.3-VALIDATION.md row from plan 04 results, tick Wave 0,
and set nyquist_compliant true after the phase gate passed.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add scripts/check-phase16.3.sh with fail-closed go/admin/docs/postgres
stages, detector self-tests and NOT RUN postgres without Docker.
Co-authored-by: Cursor <cursoragent@cursor.com>
Pin list states, row anatomy, revoke paths and create-dialog step 1/2
behaviours from the UI-SPEC, including plaintext lifetime backstops.
Co-authored-by: Cursor <cursoragent@cursor.com>
Account token create/revoke added two state-changing mounts; update the
Phase 10 CSRF walk count so the release gate inventory stays green.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Add compiled ResolveBackend example with acme.blog cover
- Include src= fence in authentication docs (Bearer-only)
Co-authored-by: Cursor <cursoragent@cursor.com>
Tag the 17 open todos with their g15office task IDs, close 7 todos that
are already done or promoted to Phase 16.3, and record the sync rules
and the phase-to-task map in .planning/G15OFFICE.md.
16.2-VERIFICATION.md passed 14/14: the five human items are resolved by the
16.2-07 gate log and the UAT re-run on v0.1.20 (16.2-UAT.md 5/5). covered_files
adds 16.2-07 PLAN/SUMMARY and openapi_conformance_test.go; digest recomputed
with verification.fingerprint. Re-verified by hand because msd-core 1.14.0
re-stales a report after gap closure and its verifier ignores passed UAT.
STATE points at 16.3 (phase.complete picked 11, an executed phase that is
only stale).
Purge token set on UAT, restart at 2026-10-10T17:57:57Z, smoke, token-match
and purge-ok pass. posts-unchanged, translations-unchanged, category-purged
and category-fresh pass after the human re-saves. Debug sessions for
G-16.2-1 and G-16.2-2 resolved.
- PATTERNS: one conformCase per new admin route, enforced by
TestPhase10ConformanceInventory without Docker (G-16.2-1)
- VALIDATION: 16.2-07-T1 to T6 rows; the Docker-host suites now run in the
gate's postgres stage instead of the Manual-Only table
- go stage: TestPhase10ConformanceInventory (Docker-free), and the Journal
TestSiteCachePurgeConfig and TestSiteCachePurgeRequest by name
- postgres stage: TestPhase10OpenAPIConformance and the Journal
TestCategoriesAdminPurgesSiteCache and TestPostsAdminPurgesSiteCache
- layer stage: the four site cache purge tests by name
- new cache stage: playground build, purge-check, then the acme SSR smoke
on the same route-cached build
- conformCases() lists every case at package level; checkConformInventory
reports every missing, extra or duplicate key in one sorted failure
- TestPhase10ConformanceInventory runs it without a database, and
TestPhase10OpenAPIConformance runs it before the testcontainers setup
- GET /field-types decodes into cabana.FieldTypesResponse and serves the
fixture type's script; POST .../fields/{field}/upload answers 201
cabana.Envelope[cabana.FieldUploadResponse] for a multipart part file
- the fixture plugin registers conformnote and the gadget form uses it,
so create, update and show run its Decode and Load (G-16.2-1, D-13, D-18)
liftMLValues validated only object-shaped submissions, so a scalar
submitted for a translatable plugin field reached Decode as nil, a
float64 or a bool although pact promises a string; a type that asserts
a string panicked into an opaque 500. decodePluginFields now passes a
string through, turns null into the empty string and refuses any other
value with a 422 on the field before Decode runs.
The route called the type's Upload on the streamed part and only then
checked that no second part followed, so a refused request left a
public, unreferenced object in the bucket. It now reads the multipart
body whole (ReadForm, spooling past 8 MiB to a temporary file), checks
it holds exactly one file part named file, and only then calls Upload.
The remaining window (a failed record transaction after Upload, an
element that stopped waiting) is documented.