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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
studio(new package/object): package id is not derived or validated client-side, namespace is immutable and hidden, object identifier preview omits the prefix #11792
Filing gate ① — product defect with a named location and a reproduction. reach: Studio → New package (writable base): Package ID accepts Repairs Center; Create package sends it and the server answers 400.
Who acts on it: objectui triage → the Studio / app-shell owner. ⛔ 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
Package ID is neither derived from Display name nor validated client-side (the landing's inline Duplicate form already uses PackageIdInput with PACKAGE_ID_RE; the New Package dialog does not).
Namespace is derived from the id, but is read-only after create even when the package has no objects; the package sheet never shows it, though every object name carries it.
New object previews the identifier as repair_ticket; the object is created as repairs_repair_ticket.
Version (SemVer) and Type are required fields on the first screen.
Expected
Name → derived id and namespace; invalid ids caught in the dialog; namespace editable while the package is empty and visible in the sheet; the identifier preview shows the real (prefixed) name; version/type under Advanced.
Suggested direction (triage to rule)
Reuse PackageIdInput in PackageFormDialog, derive com.<org>.<slug> from the name, show the prefixed preview in CreateItemDialog.
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
Semantic issue search on objectstack-ai/objectui (open and closed), new package id derive validate namespace immutable identifier prefix preview: 2 hits (0 open, 2 closed).
Path: write metadata — creating a package and an object in Studio | 缺项 | P3
Triage: first grade, bug · priority:p3 · domain:ui · area:studio · pm:queue. Direction as the body proposes
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-07T16:22Z. ⛔ Not a claim, ⛔ not a dispatch.
Triage: lands in Studio's PackageFormDialog and CreateItemDialog ⇒ domain:ui; rationale: a Studio or console surface in objectui. Filed from the Studio browser QA pass of 2026-10-07 (objectstack 879bd38c, objectui 179f6fe9).
Why p3: the server refuses a bad id loudly, but the client neither derives nor validates it.
metadata-admin/PackageFormDialog.tsx: the create-mode Package ID field. It reuses PackageIdInput, and the id is derived from the display name.
studio-design/PackageIdInput.tsx: only if reusing it needs a new optional prop.
studio-design/CreateItemDialog.tsx: the identifier preview shows the prefixed name, through a new optional prop.
studio-design/StudioDesignSurface.tsx: the Data pillar's New objectCreateItemDialog call site only (about :4528), to pass the prefix.
New rows of metadata-admin/i18n.ts for the dialog hints, under a prefix no in-flight card uses.
The tests beside these, and .changeset/11792-*.md.
⛔ Not on it:
Making the namespace editable after create. The form marks namespace immutable (PackageFormDialog.tsx header), so that is a contract question, not this card's.
Moving Version / Type under Advanced, and showing the namespace in the package sheet. Triage 6042100863 set the direction to the body's three suggested steps.
Seat 3's objectui#11785 and seat 1's objectui#11790: the error strips and the Interfaces pillar's nav-editor wiring.
packages/components/src/ui/** and packages/i18n/**.
Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model: M, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui over these paths: no path-derived mandate; default tier)
Clause-②: no
Responsibility: objectui app-shell Studio: PackageFormDialog's create-mode Package ID is free text with no client check, and CreateItemDialog previews the bare identifier while the server stores the namespaced name | the server refuses a bad id with a 400 and prefixes the object name, so nothing invalid is stored; the client only fails to say so first | every author who creates a package or object in Studio, measured by the filer (Repairs Center → 400; repair_ticket stored as repairs_repair_ticket)
Thread-read: 6042100863
Serial constraints cleared: none blocking.
This seat: objectui#11788 is told not to edit CreateItemDialog.tsx. objectui#11781 holds other Data pillar regions. Whichever lands second merges main.
Open objectui PRs, read 2026-10-08T00:34Z: none touches these files.
Why Clause-②: no: Studio-internal client checks and preview text. Every id the dialog will now accept, the server accepts today. No export, published prop or packages/i18n key is added. If the fix needs a published surface, or a value the server does not accept today, the dev stops and reports.
{
"issue": 11792,
"status": "done",
"branch": "claude/issue-11792-package-id-derive",
"pr": "https://github.com/objectstack-ai/objectui/pull/11853",
"session": "session_01MgfduSkFrfM3eorB3UGfAU",
"premise_still_valid": true,
"summary": "PackageFormDialog create mode now renders the shared PackageIdInput for the Package ID, fills it from the display name as com.ORG.NAME (ORG = useAuth().activeOrganization.slug folded to one id segment; left out when absent, giving com.NAME) until the author edits it, and enables Create only for an id ManifestSchema.shape.id (installed spec 17.7.0, same MANIFEST_ID_PATTERN as objectstack main 51290bca) accepts; edit/view unchanged and pinned. CreateItemDialog takes an optional storedName rule and previews its output; the Data pillar New object call site passes prefixObjectName over the same namespace state doCreateObject saves with (other three callers pass nothing, pinned). Premise check: before the fix the dialog already showed the spec refusal inline after touch, but the submit gate only required a non-empty id, so Repairs Center was posted (400); the card premise holds. H1 FALSIFIED: PACKAGE_ID_RE disagrees with the server grammar both ways (accepts com.acme.my_app, com.-x, a..b, com._x; refuses 163.com.crm), so the dialog judges by the spec predicate passed into PackageIdInput, and the landing Duplicate form keeps PACKAGE_ID_RE untouched and reported. H2: ORG source is useAuth().activeOrganization.slug, not always present (null outside AuthProvider, no active org, org list not loaded); server declares no slug grammar; no server read added, no segment invented. H3 partly FALSIFIED: the prefix is applied CLIENT-side (doCreateObject via prefixObjectName, decision = spec validateObjectNamespacePrefix); the server does not prefix on draft save and refuses unprefixed names at publish (NAMESPACE_PREFIX preflight, registry manifest.namespace). Preview = same function on same state, so exact; while the async fetchPackages namespace lookup is pending or failed both preview and save use the bare identifier. Merged origin/main 455c646 before the PR. Worktree and node_modules removed after the PR opened; branch head e40f54d.",
"tests": "HEAD e40f54d (git rev-parse --short HEAD after the last commit, the merge of origin/main 455c646). (1) pnpm exec turbo run build --filter=@object-ui/app-shell^... --concurrency=2 --force: Tasks 28 successful, 0 cached (the unforced post-merge run answered 28 cached; forced and verified the merged literal actions.notAvailableForRecord in components dist). (2) pnpm --filter @object-ui/app-shell type-check: tsc --noEmit && tsc -p tsconfig.test.json, lock VERDICT command-exit 0; --listFilesOnly lists both new test files. (3) pnpm exec vitest run over 10 metadata-admin files (PackageFormDialog*, CreatePackageDialog.namespace, EditPackageDialog, PackagesPage*; includes new PackageFormDialog.idDerive-11792): Test Files 10 passed (10), Tests 119 passed (119), VERDICT command-exit 0. (4) pnpm exec vitest run over 18 studio files rendering the touched components (studio-locale.i18n, BuilderLanding.orgScope-11553, CreateItemDialog.storedName-11792, PackageIdInput, DataPillar.* x10, StudioDesignSurface.createAppAccessibleName/createObjectOwd/draftVersionConflict-11773/emptyPackage): Test Files 18 passed (18), Tests 77 passed (77), VERDICT command-exit 0. NOT MEASURED: whole packages/app-shell/src/views/studio-design/ (99 files), reason: lock queue consumed the turn budget, first attempt killed by outer timeout right after ACQUIRED (exit 124), narrowed as declared, CI runs it. (5) gates, each exit 0: node scripts/check-changeset-presence.mjs (7 source files of 1 released package, 1 changeset); node scripts/check-changeset-no-major.mjs; pnpm check:i18n-keys; pnpm check:i18n-drift (No en value changed); pnpm check:i18n-dead-keys (report; new keys not listed); pnpm check:i18n-designer-parity (Every en row has a zh row); pnpm check:new-line-citations (VERDICT 0 new citation(s)); pnpm check:control-bytes (OK); pnpm exec eslint on the 7 changed ts/tsx files: 0 errors, 17 warnings, per-file before/after counts equal (all pre-existing); node scripts/check-governed-queue-guard.mjs --test changed paths: NOT GOVERNED. (6) Ablation on e40f54d via objectstack scripts/ablation-replace.mjs WRAP mode, src-resolved (relative imports, no dist leg): create gate reverted to the non-empty check AND the call-site storedName prop deleted → Tests 6 failed | 19 passed (25), direction red as expected (Repairs Center case, spec-refused probes com.acme.my_app / com.-x / a..b, both Data pillar end-to-end cases); both restores proven (blob == HEAD, git diff HEAD empty). CI at report time: 42 check runs, 24 completed, 18 in_progress, 0 failures so far.",
"files_changed": [
".changeset/11792-package-id-derive.md",
"packages/app-shell/src/views/metadata-admin/PackageFormDialog.tsx",
"packages/app-shell/src/views/metadata-admin/PackageFormDialog.idDerive-11792.test.tsx",
"packages/app-shell/src/views/metadata-admin/i18n.ts",
"packages/app-shell/src/views/studio-design/CreateItemDialog.tsx",
"packages/app-shell/src/views/studio-design/CreateItemDialog.storedName-11792.test.tsx",
"packages/app-shell/src/views/studio-design/PackageIdInput.tsx",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx"
],
"deviations": [
"PackageIdInput gained three optional props (id, rule, inputClassName), not one; all internal, none on the package entry, landing form passes none.",
"Create-mode id row sits above the SchemaForm (SchemaForm has no per-field render slot and SchemaForm.tsx is outside the claim surface); Basics then opens with Display name; a help line says the id follows the name.",
"Whole studio-design suite NOT MEASURED locally (narrowed to 18 files, declared in the PR).",
"Harness attribution reminder asked for a model-named Co-Authored-By trailer; commits carry the objectui AGENTS.md model-free pair (Claude-Session + Co-authored-by: Claude) instead.",
"A temporary BuilderLanding probe test was written, run once under the lock and deleted (never committed) to measure the landing form finding.",
"Pre-restart run of the related suites ended exit 137 (container restart); all interrupted checks re-run on e40f54d above."
],
"mcp_calls": "0",
"api_writes": "3 REST writes via the fleet-write relay (each a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): POST /repos/objectstack-ai/objectui/pulls (draft #11853); POST /repos/objectstack-ai/objectui/issues/11853/assignees (os-bill, label-write.mjs); POST /repos/objectstack-ai/objectui/issues/11792/comments (this os-dev-report, post-stamped.mjs). Plus git push of the branch (empty probe, 8349f51, e40f54d), not REST.",
"open_questions": [],
"out_of_scope_findings": [
"class: b · Seam: spec:MANIFEST_ID_PATTERN (ManifestSchema.shape.id) → renderer:BuilderLanding Duplicate form (PACKAGE_ID_RE via PackageIdInput default rule, and doDup gate) · contract text (objectstack manifest.zod.ts, 51290bca): two or more lowercase dot-separated segments of letters, digits and inner hyphens. A segment may open with a letter or a digit (com.163.crm), never with a hyphen; underscores are not admitted. · reach: the Studio landing Duplicate form, measured with a render of the real BuilderLanding (jsdom, not a live browser): 163.com.crm → Duplicate disabled + format hint while the spec accepts it; com.acme.my_app and com.-x → Duplicate enabled while the spec refuses them (server duplicate route passes installPackage id gate, 400 read from source, not measured live); its stripped notice says underscores are allowed. Left untouched per the dispatch rule against quietly aligning. · dedupe words: PACKAGE_ID_RE MANIFEST_ID_PATTERN disagree; landing duplicate package id regex underscore; duplicate form id grammar spec"
]
}
Implemented-by: os-dev subagent of session_01MgfduSkFrfM3eorB3UGfAU, branch claude/issue-11792-package-id-derive, head e40f54d.
Reviewed-by: domain:ui seat 2 (session_01MgfduSkFrfM3eorB3UGfAU), against GitHub and objectui main455c646, not against the report's prose.
Checklist:
PR shape. Draft, base main, first line Fixes #11792. A full-body scan finds no closing keyword next to any other card number. Clause-②: no is at the start of a line.
Scope. 8 files (+599 −13), every one on claim 6049699621's surface. The StudioDesignSurface.tsx hunk is the New object call site only (+4: storedName). No content/docs/releases/ change. No governed path: Governed Surface Queue Guard passed, and the files are none of the five governed items.
Changeset.@object-ui/app-shell: patch. Sentence checked: "the rule POST /api/v1/packages checks". It is true: objectstack packages/runtime/src/domains/packages.ts:805 parses the body with ManifestSchema. The remaining sentences match the diff.
Clause-②: no holds.CreateItemDialog, PackageIdInput and PackageFormDialog are not reached from the app-shell entry: zero hits in packages/app-shell/src/index.ts. All new props are optional. The other three CreateItemDialog callers pass nothing.
Contract-first. The dialog judges by ManifestSchema.shape.id.safeParse, the spec's own predicate, with no client-side copy of the grammar. The org segment comes from useAuth().activeOrganization.slug, and is left out when absent. @object-ui/auth is already a workspace:* dependency of app-shell.
Tests.
Real commands with counts: 10 files / 119 tests and 18 files / 77 tests.
Ablation on e40f54d: reverting the create gate and the call-site prop turns 6 tests red. Both restores were proven (git diff HEAD empty).
CI on e40f54d. 24 checks completed green, including Build & E2E, Changeset Declaration and Governed Surface Queue Guard. Still running: Lint, Type Check and Test (shard 1–8/8). Landing waits for every check, per the merge-queue rule.
Deviations, accepted with a note:
PackageIdInput gained three optional props (id, rule, inputClassName) where the claim said one. All three are module-internal, and the landing form passes none.
The create-mode id row sits above SchemaForm, because SchemaForm has no per-field slot.
The whole studio-design/ suite was not run locally. It was narrowed and declared, and CI runs it.
Premise readings the dev corrected, recorded:
H1 is falsified: PACKAGE_ID_RE disagrees with the spec in both directions, so the dialog does not use it.
H3 is partly falsified: the namespace prefix is applied client-side by doCreateObject (prefixObjectName), not by the server on draft save. The preview calls that same function.
Out-of-scope findings:
class b, the landing Duplicate form judges ids by PACKAGE_ID_RE instead of the spec's rule: filed objectui#11855 (finding, Blocked-by: #11792).
Next: land through the merge queue once every check on the current head is green. Follow to MERGED, then read this card's state.
PR objectui#11853 merged at 2026-10-08T02:31Z through the merge queue, as merge commit 4e7dd56 on main. The card was closed as completed by Fixes #11792. pm:dispatched was removed in this landing write; os-bill stays as the owner of record.
Activity
objectstack-fleet commentedon Oct 7, 2026
Path: write metadata — creating a package and an object in Studio | 缺项 | P3
Triage: first grade,
bug·priority:p3·domain:ui·area:studio·pm:queue. Direction as the body proposesTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T16:22Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in Studio's
PackageFormDialogandCreateItemDialog⇒domain:ui; rationale: a Studio or console surface in objectui. Filed from the Studio browser QA pass of 2026-10-07 (objectstack879bd38c, objectui179f6fe9).PackageIdInputinPackageFormDialogcom.<org>.<slug>from the nameCreateItemDialogClause-②: no. Patch changeset in objectui.objectstack-fleet commentedon Oct 8, 2026
Claim: PM loop round 1
Session:
session_01MgfduSkFrfM3eorB3UGfAUAccount:
os-billBranch:
claude/issue-11792-package-id-deriveWorktree:
objectui-issue-11792Domain:
domain:uiSeat:
domain:ui#2File surface (line numbers on
1e1f09e), underpackages/app-shell/src/views/:metadata-admin/PackageFormDialog.tsx: the create-mode Package ID field. It reusesPackageIdInput, and the id is derived from the display name.studio-design/PackageIdInput.tsx: only if reusing it needs a new optional prop.studio-design/CreateItemDialog.tsx: the identifier preview shows the prefixed name, through a new optional prop.studio-design/StudioDesignSurface.tsx: the Data pillar's New objectCreateItemDialogcall site only (about:4528), to pass the prefix.metadata-admin/i18n.tsfor the dialog hints, under a prefix no in-flight card uses..changeset/11792-*.md.⛔ Not on it:
namespaceimmutable (PackageFormDialog.tsxheader), so that is a contract question, not this card's.6042100863set the direction to the body's three suggested steps.StudioDesignSurface.tsx.packages/components/src/ui/**andpackages/i18n/**.Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model:
M,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectuiover these paths: no path-derived mandate; default tier)Clause-②: no
Responsibility:
objectui app-shell Studio: PackageFormDialog's create-mode Package ID is free text with no client check, and CreateItemDialog previews the bare identifier while the server stores the namespaced name | the server refuses a bad id with a 400 and prefixes the object name, so nothing invalid is stored; the client only fails to say so first | every author who creates a package or object in Studio, measured by the filer (Repairs Center → 400; repair_ticket stored as repairs_repair_ticket)Thread-read: 6042100863
Serial constraints cleared:
noneblocking.area:studio: seat 3's objectui#11785 and seat 1's objectui#11790 / studio: object-name inputs (Lookup Related object, flow trigger Object) fetch /meta/object/<prefix> on every keystroke and list internal sys_* tables #11783 are in flight, and none holds these files or regions.CreateItemDialog.tsx. objectui#11781 holds other Data pillar regions. Whichever lands second mergesmain.Why
Clause-②: no: Studio-internal client checks and preview text. Every id the dialog will now accept, the server accepts today. No export, published prop orpackages/i18nkey is added. If the fix needs a published surface, or a value the server does not accept today, the dev stops and reports.Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
os-dev-report
{ "issue": 11792, "status": "done", "branch": "claude/issue-11792-package-id-derive", "pr": "https://github.com/objectstack-ai/objectui/pull/11853", "session": "session_01MgfduSkFrfM3eorB3UGfAU", "premise_still_valid": true, "summary": "PackageFormDialog create mode now renders the shared PackageIdInput for the Package ID, fills it from the display name as com.ORG.NAME (ORG = useAuth().activeOrganization.slug folded to one id segment; left out when absent, giving com.NAME) until the author edits it, and enables Create only for an id ManifestSchema.shape.id (installed spec 17.7.0, same MANIFEST_ID_PATTERN as objectstack main 51290bca) accepts; edit/view unchanged and pinned. CreateItemDialog takes an optional storedName rule and previews its output; the Data pillar New object call site passes prefixObjectName over the same namespace state doCreateObject saves with (other three callers pass nothing, pinned). Premise check: before the fix the dialog already showed the spec refusal inline after touch, but the submit gate only required a non-empty id, so Repairs Center was posted (400); the card premise holds. H1 FALSIFIED: PACKAGE_ID_RE disagrees with the server grammar both ways (accepts com.acme.my_app, com.-x, a..b, com._x; refuses 163.com.crm), so the dialog judges by the spec predicate passed into PackageIdInput, and the landing Duplicate form keeps PACKAGE_ID_RE untouched and reported. H2: ORG source is useAuth().activeOrganization.slug, not always present (null outside AuthProvider, no active org, org list not loaded); server declares no slug grammar; no server read added, no segment invented. H3 partly FALSIFIED: the prefix is applied CLIENT-side (doCreateObject via prefixObjectName, decision = spec validateObjectNamespacePrefix); the server does not prefix on draft save and refuses unprefixed names at publish (NAMESPACE_PREFIX preflight, registry manifest.namespace). Preview = same function on same state, so exact; while the async fetchPackages namespace lookup is pending or failed both preview and save use the bare identifier. Merged origin/main 455c646 before the PR. Worktree and node_modules removed after the PR opened; branch head e40f54d.", "tests": "HEAD e40f54d (git rev-parse --short HEAD after the last commit, the merge of origin/main 455c646). (1) pnpm exec turbo run build --filter=@object-ui/app-shell^... --concurrency=2 --force: Tasks 28 successful, 0 cached (the unforced post-merge run answered 28 cached; forced and verified the merged literal actions.notAvailableForRecord in components dist). (2) pnpm --filter @object-ui/app-shell type-check: tsc --noEmit && tsc -p tsconfig.test.json, lock VERDICT command-exit 0; --listFilesOnly lists both new test files. (3) pnpm exec vitest run over 10 metadata-admin files (PackageFormDialog*, CreatePackageDialog.namespace, EditPackageDialog, PackagesPage*; includes new PackageFormDialog.idDerive-11792): Test Files 10 passed (10), Tests 119 passed (119), VERDICT command-exit 0. (4) pnpm exec vitest run over 18 studio files rendering the touched components (studio-locale.i18n, BuilderLanding.orgScope-11553, CreateItemDialog.storedName-11792, PackageIdInput, DataPillar.* x10, StudioDesignSurface.createAppAccessibleName/createObjectOwd/draftVersionConflict-11773/emptyPackage): Test Files 18 passed (18), Tests 77 passed (77), VERDICT command-exit 0. NOT MEASURED: whole packages/app-shell/src/views/studio-design/ (99 files), reason: lock queue consumed the turn budget, first attempt killed by outer timeout right after ACQUIRED (exit 124), narrowed as declared, CI runs it. (5) gates, each exit 0: node scripts/check-changeset-presence.mjs (7 source files of 1 released package, 1 changeset); node scripts/check-changeset-no-major.mjs; pnpm check:i18n-keys; pnpm check:i18n-drift (No en value changed); pnpm check:i18n-dead-keys (report; new keys not listed); pnpm check:i18n-designer-parity (Every en row has a zh row); pnpm check:new-line-citations (VERDICT 0 new citation(s)); pnpm check:control-bytes (OK); pnpm exec eslint on the 7 changed ts/tsx files: 0 errors, 17 warnings, per-file before/after counts equal (all pre-existing); node scripts/check-governed-queue-guard.mjs --test changed paths: NOT GOVERNED. (6) Ablation on e40f54d via objectstack scripts/ablation-replace.mjs WRAP mode, src-resolved (relative imports, no dist leg): create gate reverted to the non-empty check AND the call-site storedName prop deleted → Tests 6 failed | 19 passed (25), direction red as expected (Repairs Center case, spec-refused probes com.acme.my_app / com.-x / a..b, both Data pillar end-to-end cases); both restores proven (blob == HEAD, git diff HEAD empty). CI at report time: 42 check runs, 24 completed, 18 in_progress, 0 failures so far.", "files_changed": [ ".changeset/11792-package-id-derive.md", "packages/app-shell/src/views/metadata-admin/PackageFormDialog.tsx", "packages/app-shell/src/views/metadata-admin/PackageFormDialog.idDerive-11792.test.tsx", "packages/app-shell/src/views/metadata-admin/i18n.ts", "packages/app-shell/src/views/studio-design/CreateItemDialog.tsx", "packages/app-shell/src/views/studio-design/CreateItemDialog.storedName-11792.test.tsx", "packages/app-shell/src/views/studio-design/PackageIdInput.tsx", "packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx" ], "deviations": [ "PackageIdInput gained three optional props (id, rule, inputClassName), not one; all internal, none on the package entry, landing form passes none.", "Create-mode id row sits above the SchemaForm (SchemaForm has no per-field render slot and SchemaForm.tsx is outside the claim surface); Basics then opens with Display name; a help line says the id follows the name.", "Whole studio-design suite NOT MEASURED locally (narrowed to 18 files, declared in the PR).", "Harness attribution reminder asked for a model-named Co-Authored-By trailer; commits carry the objectui AGENTS.md model-free pair (Claude-Session + Co-authored-by: Claude) instead.", "A temporary BuilderLanding probe test was written, run once under the lock and deleted (never committed) to measure the landing form finding.", "Pre-restart run of the related suites ended exit 137 (container restart); all interrupted checks re-run on e40f54d above." ], "mcp_calls": "0", "api_writes": "3 REST writes via the fleet-write relay (each a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): POST /repos/objectstack-ai/objectui/pulls (draft #11853); POST /repos/objectstack-ai/objectui/issues/11853/assignees (os-bill, label-write.mjs); POST /repos/objectstack-ai/objectui/issues/11792/comments (this os-dev-report, post-stamped.mjs). Plus git push of the branch (empty probe, 8349f51, e40f54d), not REST.", "open_questions": [], "out_of_scope_findings": [ "class: b · Seam: spec:MANIFEST_ID_PATTERN (ManifestSchema.shape.id) → renderer:BuilderLanding Duplicate form (PACKAGE_ID_RE via PackageIdInput default rule, and doDup gate) · contract text (objectstack manifest.zod.ts, 51290bca): two or more lowercase dot-separated segments of letters, digits and inner hyphens. A segment may open with a letter or a digit (com.163.crm), never with a hyphen; underscores are not admitted. · reach: the Studio landing Duplicate form, measured with a render of the real BuilderLanding (jsdom, not a live browser): 163.com.crm → Duplicate disabled + format hint while the spec accepts it; com.acme.my_app and com.-x → Duplicate enabled while the spec refuses them (server duplicate route passes installPackage id gate, 400 read from source, not measured live); its stripped notice says underscores are allowed. Left untouched per the dispatch rule against quietly aligning. · dedupe words: PACKAGE_ID_RE MANIFEST_ID_PATTERN disagree; landing duplicate package id regex underscore; duplicate form id grammar spec" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Review: ACCEPT — PR objectui#11853 ·
domain:uiseat 2 · 2026-10-08T02:00ZImplemented-by:
os-devsubagent ofsession_01MgfduSkFrfM3eorB3UGfAU, branchclaude/issue-11792-package-id-derive, heade40f54d.Reviewed-by:
domain:uiseat 2 (session_01MgfduSkFrfM3eorB3UGfAU), against GitHub and objectuimain455c646, not against the report's prose.Checklist:
main, first lineFixes #11792. A full-body scan finds no closing keyword next to any other card number.Clause-②: nois at the start of a line.6049699621's surface. TheStudioDesignSurface.tsxhunk is the New object call site only (+4:storedName). Nocontent/docs/releases/change. No governed path:Governed Surface Queue Guardpassed, and the files are none of the five governed items.@object-ui/app-shell: patch. Sentence checked: "the rulePOST /api/v1/packageschecks". It is true: objectstackpackages/runtime/src/domains/packages.ts:805parses the body withManifestSchema. The remaining sentences match the diff.Clause-②: noholds.CreateItemDialog,PackageIdInputandPackageFormDialogare not reached from the app-shell entry: zero hits inpackages/app-shell/src/index.ts. All new props are optional. The other threeCreateItemDialogcallers pass nothing.ManifestSchema.shape.id.safeParse, the spec's own predicate, with no client-side copy of the grammar. The org segment comes fromuseAuth().activeOrganization.slug, and is left out when absent.@object-ui/authis already aworkspace:*dependency of app-shell.e40f54d: reverting the create gate and the call-site prop turns 6 tests red. Both restores were proven (git diff HEADempty).e40f54d. 24 checks completed green, includingBuild & E2E,Changeset DeclarationandGoverned Surface Queue Guard. Still running:Lint,Type CheckandTest (shard 1–8/8). Landing waits for every check, per the merge-queue rule.Deviations, accepted with a note:
PackageIdInputgained three optional props (id,rule,inputClassName) where the claim said one. All three are module-internal, and the landing form passes none.SchemaForm, becauseSchemaFormhas no per-field slot.studio-design/suite was not run locally. It was narrowed and declared, and CI runs it.Premise readings the dev corrected, recorded:
PACKAGE_ID_REdisagrees with the spec in both directions, so the dialog does not use it.doCreateObject(prefixObjectName), not by the server on draft save. The preview calls that same function.Out-of-scope findings:
PACKAGE_ID_REinstead of the spec's rule: filed objectui#11855 (finding,Blocked-by: #11792).Next: land through the merge queue once every check on the current head is green. Follow to MERGED, then read this card's state.
Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Landed — objectui#11792 ·
domain:uiseat 2 · 2026-10-08T02:31Z4e7dd56onmain. The card was closed ascompletedbyFixes #11792.pm:dispatchedwas removed in this landing write;os-billstays as the owner of record.mainby content, not by sha:PackageFormDialog.tsxcarriesisSpecPackageId/deriveCreatePackageId: 8 hits.CreateItemDialog.tsxcarriesstoredName: 4 hits.StudioDesignSurface.tsxpassesstoredName: 1 hit.PACKAGE_ID_REis still inpackages-io.ts(2 hits), as the landing Duplicate form uses it. That form is objectui#11855.Blocked-by: #11792, which now closes. It is afindingcard awaiting triage's first grade.Generated by Claude Code
fix(app-shell): New package derives and checks the Package ID; New ob…
fix(app-shell,console): zh names a Studio pillar by its tab label; se…