You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
meta overlays: a deleted overlay stays in the /meta listing though dispatch correctly 404s (#4432 residual) #5079
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.
Claim: PM loop round 1+ (domain:metadata seat, sticker #6367; batch raised to 5 by maintainer instruction 2026-08-08 「并发加到5」)
Session: session_01W6bLax4KMrSfnE1ydFU8Dw
Branch: claude/issue-5079-delete-overlay-listing
Worktree: objectstack-issue-5079
Domain: domain:metadata
File surface: packages/metadata-protocol/src/protocol.tsgetMetaItems / deleteMetaItem regions only (~:3284, ~:10514) + (if the seam proves to live there) packages/metadata* registry/cache invalidation files + tests + one .changeset/*.md
Serial constraints cleared: the two serial gates recorded on this thread are both landed — #5086/#5251 (2026-08-04) and #5259 closed completed 2026-08-04T15:11:08Z (the unregister() re-cache window). Per the standing note, step one of this dispatch is re-running the repro on today's origin/main; if the residual is gone, the card closes by verification (premise_still_valid: false). Same-file note: #6479 in flight on updateData (:5743), #6285 dispatched this round on assertRuntimeAuthoringRules (:2405) — maintainer explicitly authorized region-disjoint parallel authorship on this hot file (2026-08-08); landings stay serial through the merge queue. Region confinement is a stop-on-breach term for all three. ⚠️#6602 (untriaged finding) names the same getMetaItems org-hydration loop — if this fix and that finding turn out to be one seam, report it; do not absorb #6602 silently.
PR #6687. What shipped, and what the dev's measurement corrected:
The issue's premise held, and was wider than reported: on today's main, after DELETE the single-item GET also served the deleted body, and the "dispatch correctly 404s" in the issue title was a coincidence — the declaration was still resolved from the stale registry entry (ADR-0066 D4 judged against a nonexistent declaration); only the handler registry had been correctly dropped. Both corrections are recorded in the PR body per the corrected-premise discipline.
Root cause at the producer: meta overlay: a just-saved overlay is listed but not dispatchable for a short window — a cache between saveMeta and resolveRouteActionDeclaration lags the write #4521's write-through parks runtime-created items under SchemaRegistry's plain key; removeRuntimeShadow deliberately declines when no packaged artifact remains, so nothing ever removed the entry — one seed, three stale surfaces (LIST / GET / declaration gate). Fix: restoreArtifactRegistryView walks artifact → MetadataService baseline (via the diagnosed read, ADR-0110 D3: an outage stops the walk) → retires the plain-key entry via the new SchemaRegistry.removeOverlayEntry, which refuses genuine artifacts by getArtifactItem's own predicate.
Reverse verification red in the predicted direction (3 protocol-level + 5 registry-level), boundary pins green on both sides; real-machine verification on a fresh showcase boot twice, including the artifact-backed reset non-regression.
Cross-domain surface (packages/objectql/src/registry.ts + its pin suite; test-only mirror block in packages/runtime) is accounted file-by-file in the PR body; a cross-seat notice with a veto window goes to the domain:engine-core seat before landing.
Landing confirmed — PR #6687 merged as 114e72795 (verified on origin/main). Deleting a runtime-created overlay now retires its registry entry, so list / get / dispatch answer identically immediately after DELETE, and the declaration gate no longer resolves deleted declarations. — domain:metadata PM, session session_01W6bLax4KMrSfnE1ydFU8Dw
Activity
baozhoutao commentedon Aug 4, 2026
Found during the v17 verification tracked in #3909 (section G1 regression).
baozhoutao commentedon Aug 4, 2026
Rolled up in #5145 (the rc.2/rc.3 verification rollup — supersedes the closed #4482).
os-zhuang commentedon Aug 4, 2026
串行注记(PM 循环第 4 轮,会话
session_01Pbu27iNUfQCHeuS551Rqo7):本轮不派,两个原因:(1) 与 #5086(同批候选)疑似同触 protocol/meta 写删路径,串行;(2) 「删除更新了 dispatch 视图却没更新枚举视图」的形状高度疑似listCache/registry 失效家族(#5109/#5218/#5251 三单刚清账的同一字段),而 #5251(降级缓存策略)正在合并队列 —— 本单必须基于其合并后的readCachedList()/degraded形状工作。#5086 落地 + #5251 合入后即派;届时给 dev 的线索:对照applyRepoEvent/invalidateForForeignWrite检查 overlay DELETE 路径是否漏调失效,并留意 #4521 修写方向时的对称缝。Generated by Claude Code
os-zhuang commentedon Aug 4, 2026
串行注记更新(PM 循环第 4 轮,会话
session_01Pbu27iNUfQCHeuS551Rqo7):#5086/#5251 均已合入,但本单继续排 #5259 之后 —— 新发现的 #5259(unregister()先失效后删库,窗口内并发list()把已删项按完整读重新缓存 30s)与本单现象(DELETE 后枚举视图仍列出、dispatch 已 404)高度疑似同根或强相关,#5259 的 dev 正在飞。届时派发本单时第一步是:在 #5259 修复后的 main 上重跑本单复现 —— 若已消失则本单以验证收尾关闭;若仍在,排查 overlay DELETE 路径(deleteMetaItem)是否漏删 registry 条目 / 漏调失效(#4521 写方向修复的镜像缝)。Generated by Claude Code
hotlong commentedon Aug 7, 2026
迁移:
domain:engine-core→domain:metadata(维护者 2026-08-07 批准拆分;座位贴 #6367,SKILL PR #6370)。落点证据:DELETE /meta/action 后 overlay 仍留在 GET /meta 列表而 dispatch 正确 404 —— 元数据枚举/注册表失效接缝(#4432 残留)。全量分类审计 49 卡三判,本卡 MOVE/high。分诊会话:session_01BickTBKm2JYSNnrtPT8ysa。Generated by Claude Code
os-zhuang commentedon Aug 8, 2026
Claim: PM loop round 1+ (⚠️ #6602 (untriaged finding) names the same
domain:metadataseat, sticker #6367; batch raised to 5 by maintainer instruction 2026-08-08 「并发加到5」)Session:
session_01W6bLax4KMrSfnE1ydFU8DwBranch:
claude/issue-5079-delete-overlay-listingWorktree:
objectstack-issue-5079Domain:
domain:metadataFile surface:
packages/metadata-protocol/src/protocol.tsgetMetaItems/deleteMetaItemregions only (~:3284, ~:10514) + (if the seam proves to live there)packages/metadata*registry/cache invalidation files + tests + one.changeset/*.mdSerial constraints cleared: the two serial gates recorded on this thread are both landed — #5086/#5251 (2026-08-04) and #5259 closed completed 2026-08-04T15:11:08Z (the unregister() re-cache window). Per the standing note, step one of this dispatch is re-running the repro on today's
origin/main; if the residual is gone, the card closes by verification (premise_still_valid: false). Same-file note: #6479 in flight onupdateData(:5743), #6285 dispatched this round onassertRuntimeAuthoringRules(:2405) — maintainer explicitly authorized region-disjoint parallel authorship on this hot file (2026-08-08); landings stay serial through the merge queue. Region confinement is a stop-on-breach term for all three.getMetaItemsorg-hydration loop — if this fix and that finding turn out to be one seam, report it; do not absorb #6602 silently.Generated by Claude Code
os-zhuang commentedon Aug 8, 2026
Review verdict: ACCEPT — PM
domain:metadataseat, sessionsession_01W6bLax4KMrSfnE1ydFU8Dw.PR #6687. What shipped, and what the dev's measurement corrected:
GETalso served the deleted body, and the "dispatch correctly 404s" in the issue title was a coincidence — the declaration was still resolved from the stale registry entry (ADR-0066 D4 judged against a nonexistent declaration); only the handler registry had been correctly dropped. Both corrections are recorded in the PR body per the corrected-premise discipline.SchemaRegistry's plain key;removeRuntimeShadowdeliberately declines when no packaged artifact remains, so nothing ever removed the entry — one seed, three stale surfaces (LIST / GET / declaration gate). Fix:restoreArtifactRegistryViewwalks artifact → MetadataService baseline (via the diagnosed read, ADR-0110 D3: an outage stops the walk) → retires the plain-key entry via the newSchemaRegistry.removeOverlayEntry, which refuses genuine artifacts bygetArtifactItem's own predicate.packages/objectql/src/registry.ts+ its pin suite; test-only mirror block inpackages/runtime) is accounted file-by-file in the PR body; a cross-seat notice with a veto window goes to thedomain:engine-coreseat before landing.environmentId, never on org #6602 (no duplicate card), the plugin-security consumer-side workaround is left in place with its dual role explained.Next: CI convergence check, then ready + merge queue.
Generated by Claude Code
os-zhuang commentedon Aug 8, 2026
Landing confirmed — PR #6687 merged as
114e72795(verified onorigin/main). Deleting a runtime-created overlay now retires its registry entry, so list / get / dispatch answer identically immediately after DELETE, and the declaration gate no longer resolves deleted declarations. —domain:metadataPM, sessionsession_01W6bLax4KMrSfnE1ydFU8DwGenerated by Claude Code
test(runtime): main 新增的 #5079 ARTIFACT-backed 用例改走 OS_METADATA_WRITAB…