Filing gate ① — product defect with a named location and a reproduction. reach: POST /api/v1/packages/com.example.repairs/revert → 404 RESOURCE_NOT_FOUND "No metadata items found for package 'com.example.repairs'" on a Studio package holding 4 published items and 1 draft; the Studio package sheet's Revert button sends exactly this.
Who acts on it: objectstack triage (metadata service owner); objectui follows for the button wording. ⛔ Not a claim. Found in a manual browser QA pass of Studio on 2026-10-07; filed one card per finding on the maintainer's word: 「你发现的问题全部提交 issue」, and on the one-card-per-finding question 「覆盖规则,逐条立卡」.
What happens
In Studio → package switcher → Package info & settings, Revert on a Studio-created writable package fails with the 404 above and leaves the draft in place. Right next to it, Discard changes (1) does discard the draft ("All pending changes discarded — back to the published version."), so the author sees two near-identical verbs, one of which never works on the packages Studio creates.
Reproduction
- Studio: create package
com.example.repairs, an object, an app, a flow, a permission set; publish; make one more draft edit.
- Package sheet → Revert → 404 above.
GET /api/v1/meta/_drafts?packageId=com.example.repairs still lists the draft.
Where it comes from (read in source — mechanism inferred, not single-stepped)
revertPackage in packages/metadata/src/metadata-manager.ts collects items from the in-memory registry whose meta.packageId or meta.package equals the id, and throws the 404 when that list is empty. Studio-authored rows live in sys_metadata and are served with a _packageId decoration, so the collection is plausibly always empty for them.
Suggested direction (triage to rule)
Make revertPackage resolve package membership the way the protocol does for sys_metadata rows; if a package has no snapshot to revert to, answer that in words the UI can show. The objectui half (rename or merge Revert with Discard changes, or disable it with a reason) can follow once the server semantics are settled.
Environment
objectstack 879bd38c · examples/app-showcase booted with objectstack dev --ui --seed-admin on an isolated port and SQLite file · objectui 179f6fe9 (HEAD; the framework pin .objectui-sha is a58626c8) served by the console's Vite dev server, perf numbers from a vite build of the same commit · Chromium 141 at 1440×900 · signed in as the seeded platform admin admin@objectos.ai unless stated.
Duplicate check
Dedupe words: package revert 404 · No metadata items found for package · revertPackage _packageId · Revert vs Discard changes
Filed by Claude Code (session session_01D76mrPJrSSdaKRxR2rvrMG) from that QA pass.
Generated by Claude Code
Filing gate ① — product defect with a named location and a reproduction. reach:
POST /api/v1/packages/com.example.repairs/revert→ 404RESOURCE_NOT_FOUND"No metadata items found for package 'com.example.repairs'" on a Studio package holding 4 published items and 1 draft; the Studio package sheet's Revert button sends exactly this.Who acts on it: objectstack triage (metadata service owner); objectui follows for the button wording. ⛔ Not a claim. Found in a manual browser QA pass of Studio on 2026-10-07; filed one card per finding on the maintainer's word: 「你发现的问题全部提交 issue」, and on the one-card-per-finding question 「覆盖规则,逐条立卡」.
What happens
In Studio → package switcher → Package info & settings, Revert on a Studio-created writable package fails with the 404 above and leaves the draft in place. Right next to it, Discard changes (1) does discard the draft ("All pending changes discarded — back to the published version."), so the author sees two near-identical verbs, one of which never works on the packages Studio creates.
Reproduction
com.example.repairs, an object, an app, a flow, a permission set; publish; make one more draft edit.GET /api/v1/meta/_drafts?packageId=com.example.repairsstill lists the draft.Where it comes from (read in source — mechanism inferred, not single-stepped)
revertPackageinpackages/metadata/src/metadata-manager.tscollects items from the in-memory registry whosemeta.packageIdormeta.packageequals the id, and throws the 404 when that list is empty. Studio-authored rows live insys_metadataand are served with a_packageIddecoration, so the collection is plausibly always empty for them.Suggested direction (triage to rule)
Make
revertPackageresolve package membership the way the protocol does forsys_metadatarows; if a package has no snapshot to revert to, answer that in words the UI can show. The objectui half (rename or merge Revert with Discard changes, or disable it with a reason) can follow once the server semantics are settled.Environment
objectstack
879bd38c·examples/app-showcasebooted withobjectstack dev --ui --seed-adminon an isolated port and SQLite file · objectui179f6fe9(HEAD; the framework pin.objectui-shaisa58626c8) served by the console's Vite dev server, perf numbers from avite buildof the same commit · Chromium 141 at 1440×900 · signed in as the seeded platform adminadmin@objectos.aiunless stated.Duplicate check
VERSION_NOT_FOUND: No history row at version 2while/historyshows exactly that row — the revert's lookup key disagrees with the history writer (and the package-level revert route 500s) #7559 (closed) — prior fix of the same route (PR fix(metadata-protocol,metadata): revert reads the history row under the key the writer stored it with (#7559) #7619 turned the 500 into the 404 'No metadata items found'); this card is that 404 firing for a package that HAS published itemspackage_id IS NULL#6215 (closed) — revert-family package scoping bug; different route/stageDedupe words: package revert 404 · No metadata items found for package · revertPackage _packageId · Revert vs Discard changes
Filed by Claude Code (session
session_01D76mrPJrSSdaKRxR2rvrMG) from that QA pass.Generated by Claude Code