Skip to content

meta overlays: a deleted overlay stays in the /meta listing though dispatch correctly 404s (#4432 residual) #5079

Description

@baozhoutao

Follow-up to #4432, verified on main @ a1a855a28 (the rc.3 train tip) as part of the #3909 G1 regression pass.

The two headline harms of #4432 are fixed. Both type spellings now address one namespace (/meta/actions/x and /meta/action/x both report type=action), an overlay no longer shadows the code-authored listing (13 items before and after a PUT), and a saved overlay is dispatchable immediately (#4521). Confirmed by re-running the original repro.

One branch of the original report survives: after DELETE, the listing still returns the deleted overlay while dispatch correctly refuses it.

Repro (clean cycle, fresh name)

PUT    /api/v1/meta/action/rg_clean            → 200
  GET  /api/v1/meta/action  → rg_clean listed (1)
  POST /api/v1/actions/showcase_task/rg_clean  → 200   ✅ dispatchable

DELETE /api/v1/meta/action/rg_clean
  → 200 {"success":true,"reset":true,"seq":4,
         "message":"Customization overlay deleted — action/rg_clean reset to artifact default. [seq=4]"}

  GET  /api/v1/meta/action  → rg_clean STILL listed (1)   ❌
  POST /api/v1/actions/showcase_task/rg_clean  → 404      ✅ correctly gone

The delete is real — it reports reset: true with a sequence number, and the dispatch path honours it one request later. Only the listing disagrees.

It is not storage: sys_metadata holds no rg_* row, and rg_clean does not appear in dist/objectstack.json. So the listing is serving a cached/registry view that the delete path updates for dispatch but not for enumeration — the mirror image of #4521, which fixed the same seam in the write direction (saved overlays became immediately dispatchable).

Why it still matters

An admin who removes a customization sees it still listed and reasonably concludes the delete failed — the exact confusion #4432 was filed about, just moved from the write side to the read side. Anything that enumerates metadata to decide what exists (Studio's authoring surfaces, a sync/export, a reconciliation job) reads a surface that includes a deleted item.

Expected

DELETE invalidates the enumeration view in the same step it invalidates the dispatch view, so list / get / dispatch agree immediately — the "every surface in agreement" clause of #4432.

Found during the #3909 rc.3 regression pass (G1).

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions