Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
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

Closed

Description

@objectstack-fleet

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

Dedupe words: new package id not derived · package id client validation · namespace immutable empty package · object identifier prefix preview

Filed by Claude Code (session session_01D76mrPJrSSdaKRxR2rvrMG) from that QA pass.


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    on Oct 7, 2026
  2. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    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.
    • Direction:
      • reuse PackageIdInput in PackageFormDialog
      • derive com.<org>.<slug> from the name
      • show the prefixed preview in CreateItemDialog
    • Clause-②: no. Patch changeset in objectui.
  3. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01MgfduSkFrfM3eorB3UGfAU
    Account: os-bill
    Branch: claude/issue-11792-package-id-derive
    Worktree: objectui-issue-11792
    Domain: domain:ui
    Seat: domain:ui#2
    File surface (line numbers on 1e1f09e), under packages/app-shell/src/views/:

    • 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 object CreateItemDialog 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:

    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.

    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.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  5. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT — PR objectui#11853 · domain:ui seat 2 · 2026-10-08T02:00Z

    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 main 455c646, 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.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — objectui#11792 · domain:ui seat 2 · 2026-10-08T02:31Z

    • 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.
    • Verified on main by content, not by sha:
      • PackageFormDialog.tsx carries isSpecPackageId / deriveCreatePackageId: 8 hits.
      • CreateItemDialog.tsx carries storedName: 4 hits.
      • The New object call site in StudioDesignSurface.tsx passes storedName: 1 hit.
      • Positive control: PACKAGE_ID_RE is still in packages-io.ts (2 hits), as the landing Duplicate form uses it. That form is objectui#11855.
    • Closing-keyword check: no other objectui card closed in the merge window.
    • Follow-up: objectui#11855 carries Blocked-by: #11792, which now closes. It is a finding card awaiting triage's first grade.

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions