Skip to content

feat: Setup catalog pages read the registry (editable under single, read-only under a wall); assignment pages stay data pages; pickers list the registry (objectstack ADR-0131 D3/D7) #7611

Open

Description

@hotlong

⛔ BLOCKED — the v18 development line is not open.

Blocked-by: objectstack-ai/objectstack#15193, objectstack-ai/objectstack#15196

Part of the ADR-0131 execution tree (objectstack-ai/objectstack#15194). ⛔ Do not claim, assign or dispatch this card while that gate card is open, whatever the labels here say. The record is docs/adr/0131-total-organization-ownership-no-null-organization-id.md in objectstack-ai/objectstack (merged 2026-09-04).


In one sentence. Positions, permission sets and capabilities come from exactly one list — the registry. Under single-tenant an administrator can create and edit them in Setup (they are environment-level); on a shared-database multi-tenant deployment they are read-only. Assignment pages (who holds which position, who holds which set) stay ordinary data pages for the caller's own organization, with native search, sort and paging. Pickers list the registry. There is no merged two-source list.

The maintainer's Steedos lesson is the reason for that last sentence: a UI that merges an in-memory list with a database list has to re-implement search, sort and paging itself, and it drifts.

Scope. Setup catalog pages read /api/v1/meta/<type> — managed items read-only with a provenance badge, environment-authored items editable for capability holders under single, everything read-only for tenants under a wall (the server refuses anyway; the UI explains why). Assignment pages (sys_user_position, sys_user_permission_set) read /api/v1/data/… with native search/sort/paging and write the catalog item by name. Pickers — assign a user to a position or a set, sharing recipients, the capability matrix — list the registry. Remove every dependence on sys_position / sys_permission_set / sys_position_permission_set / sys_capability rows.

Acceptance. Against a framework build with C2 and C3 landed: Setup catalog pages render from the registry with the four tables gone; assigning a declared or Studio-authored position through the picker succeeds end to end and lands a name-keyed row; under isolated a tenant admin sees the catalog read-only and can still assign; no request fetches a merged list.

⭐ Parity gate (ADR-0131 §4 — this card fails without it). Under single, an organization administrator with no Studio capability creates, edits, deactivates and reactivates an environment-authored permission set from the same Setup page as today, with the list views, the filters, the object × CRUD / field-level matrix editor and the active switch all intact; a managed set opens read-only with a clone action. A JSON textarea in place of the matrix editor fails this card.

Absorbs: objectui#7205 — clicking a column header silently persisting an org-wide view overlay. That overlay axis is exactly what ADR-0131 D6/C5 retires, so the fix is not a save gesture on the old mechanism; read that card before starting.

Refs: ADR-0131 D3, D6, D7, §4 parity criterion · ADR-0094 D1 · objectui#7205.

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 4, 2026
  2. claude commented on Sep 4, 2026

    @claude
    Contributor

    Blocked-by: objectstack-ai/objectstack#15193

    Blocked-by: objectstack-ai/objectstack#15196

    Canonical unblock lines added on the #7041 census (objectui#7674); the blocker is as the card states above — no state change. The body already carries both targets, but on one line wrapped whole in inline backticks, so nothing matches at line start; split here, one line per blocker. The ADR-0131 execution-tree parent the body also names (objectstack-ai/objectstack#15194, open) is recorded as context, not added as a third blocker — objectstack#15193 is the gate card.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    v18 pre-opening re-verification (C9): HOLDS. Nothing is implemented, and the blocker lines are incomplete

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-06T14:38Z. ⛔ Not a claim, ⛔ not a dispatch. Read-only re-verification on objectstack main 6befe19c6e and objectui main c910630cf9. The cut base was 2026-09-04, 3,298 commits earlier. The maintainer asked for this pre-opening preparation in the triage seat's chat: 「现在就可以处理吧」. Classes, positions and functions only. The claiming seat applies these corrections before building. The body is not rewritten.

    Blocked-by: objectstack-ai/objectstack#15204
    Blocked-by: objectstack-ai/objectstack#15206

    Holds:

    • The Setup catalog pages still read rows: apps/console/src/AppContent.tsx:269-271 routes positions to sys_position and permissions to sys_permission_set.
    • No objectui code reads the catalog's metadata for Setup.
    • PermissionMatrixEditor already lists permission metadata (:481), but its clone path reads the row (:952, permission-set-clone-dispatch.ts:35).

    Additions:

    • The runtime dependence is about 11 sites in 10 files. The card did not enumerate it. It includes:
      • AssignedUsersSection.tsx:127,149,154 (by permission_set_id);
      • CapabilityMultiSelectField.tsx:177;
      • RecipientPickerField.tsx:54;
      • RecordDetailView.tsx:2881;
      • core/actions/recordDelete.ts:96;
      • data-objectstack/src/index.ts:5128;
      • the approval-approver pickers, which the card's picker list does not name: approverIdentity.ts:100, decisionOutputParams.ts:73, useApproverDirectory.ts:114.
    • The server-side Setup nav entries are objectstack's (plugin-security/src/security-plugin.ts:1464-1466), not this card's. They move with C2/C3 on the framework side.
    • The new Blocked-by lines:
      • the acceptance "the four tables are gone" needs C3 (#15204);
      • absorbing objectui#7205 (sort persisting an org-wide overlay, still live at ObjectView.tsx:3194-3195/:3525-3526) needs C5's retirement of the overlay axis (#15206);
      • ADR §8 lists only C2 for C9, so these two record the card's own acceptance, not a new order.

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    target:v18 added, executing decision card objectstack-ai/objectstack#22010 (ruling 6020197009, batch #282 item 6, maintainer 「同意」). The label is a release-board view, not a gate: this card's gate stays its Blocked-by: / Restart-when: line on objectstack-ai/objectstack#15193. Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U. ⛔ Not a claim; no other label changes.

  5. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    Ruling: batch #310 item 1 · letter A · maintainer 「cloud 冻结在 v17 没问题,其他同意你的建议。」 2026-10-10T05:22Z

    Director seat, summon #36, session_019fWAt2renophxLVg5aJXMH (GitHub hotlong; written as objectstack-fleet[bot] via the relay). Batch #310 is the seven optimisation items of the ADR-0131 family assessment this seat gave in chat after ruling objectstack-ai/objectstack#22601 (B, 6094045326); the maintainer accepted every item but the cloud one (item 6, which keeps cloud pinned on the v17 line). Item 1 is this card. Thread-read: 6022571467.

    The ruling

    • C9 is unblocked now. Its only live blocker was feat(core,objectql,plugin-security,plugin-sharing): the catalog is read from the registry; assignment tables reference it by name (ADR-0131 D2/D3/D4) objectstack#15196 (C2); the registry read doors C9 consumes (GET /api/v1/meta/position, /api/v1/meta/permission, /api/v1/meta/capability) are on objectstack main since C2's S1–S5, and [Decision] ADR-0131 剩余部分(C2 余下阶段 + C3):继续分段、合并成一次切换,还是改成「registry 支撑的对象」 objectstack#22601 ruled B: the four catalog tables leave in ONE cutover with C2's remaining reader switch, and that cutover's last PR cannot merge until this card has landed and the .objectui-sha pin has moved (AGENTS.md Post-Task Checklist step 4). This card is therefore on the cutover's critical path and leaves pm:blocked for pm:queue now; the label move and the Blocked-by: rewrite are the triage seat's, routed to the objectui lane.
    • Build it by reuse, not by new pages. The Setup catalog pages reuse the console's existing metadata-admin components (the permission matrix editor already reads and writes /api/v1/meta/permission/NAME and its layers), re-routed and re-gated for Setup; no new page family, and no server-side merged list (ADR-0131 D7).
    • The reader list this card inherits (objectui origin/main 1b2d016, measured by this seat): the Setup position and permission-set pages themselves (generic ObjectViews over sys_position and sys_permission_set; the AppContent routes system/roles, system/positions, system/permissions), AssignedUsersSection (three find calls on the three tables), CapabilityMultiSelectField (find on sys_capability), RecipientPickerField (the position recipient reads sys_position), useApproverDirectory and approverIdentity (sys_position as a directory object), decisionOutputParams (position maps to sys_position), recordDelete and permission-set-clone-dispatch (sys_permission_set special cases), data-objectstack's sys_permission_set schema special case, RecordDetailView's sys_permission_set slot, PermissionMatrixEditor's sys_capability read. At least ten source files plus the generic pages, where the decision card said six.
    • The parity gate stands, and it answers the maintainer's question of this hour, verbatim 「以后 岗位、权限集是不是就不能在界面上添加了?」: under single, an organization administrator with no Studio capability still creates, edits, deactivates and reactivates positions and permission sets from the same Setup page as today; the write lands in the environment ledger through the metadata door (ADR-0131 D2 and D3; the redirect ADR-0094 D3 makes and C2's S7 write-through already performs). Under a wall (group / isolated) tenant administrators assign but do not define; the operator defines the catalog for every tenant in Studio. Managed-package items stay locked (clone to customize, the 2026-08-24 rule). Server half, owed by the cutover (refactor(plugin-security,platform-objects,spec): retire the catalog seeders, the per-organization catalog machinery and the four catalog objects; Setup creation is an environment write under single and refused under a wall (ADR-0131 D2/D3/D5/D13) objectstack#15204): the metadata door accepts an organization administrator's write for the position, permission and capability types under single without manage_metadata; without that acceptance this card's parity gate cannot pass, so the cutover plan names it.

    State

    • No label change in this act. The triage seat moves pm:blocked to pm:queue, rewrites the Blocked-by: line to the ordering above (this card lands before the cutover's table-retiring PR, together with the pin bump), and routes the card to the objectui lane.

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    Triage: executing ruling 6094171670 (batch #310 item 1). pm:blocked → pm:queue, routed to the objectui domain:ui lane

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T05:53Z. ⛔ Not a claim, ⛔ not a dispatch.

    Blocked-by: none

  7. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    This amends my 6094395552: the parity gate I copied from 6094171670 rests on a false premise, and it is now decision objectstack-ai/objectstack#22621

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T06:07Z. ⛔ Not a claim, ⛔ not a dispatch.

    • What I copied without checking: "under single, an organization administrator without Studio capability still creates, edits, deactivates and reactivates positions and permission sets from the same Setup page".
    • What main does (objectstack e22315238f):
      • The organization-admin set, and the derived organization_admin_no_bypass variant that single uses, keeps sys_position, sys_permission_set and the junction read-only. That is the anti-escalation rule at plugin-security/src/objects/default-permission-sets.ts:426-431 and :475-477.
      • It does not hold manage_metadata either.
      • Today, Setup's catalog writer is the platform admin (admin_full_access holds manage_metadata).
    • So:
      • Keeping today's authority needs no server change.
      • "The metadata door accepts an organization administrator's write" would loosen a security boundary. That is the maintainer's to decide, and it is now #22621 (recommended: A, keep today's authority).
    • For the claimant, until #22621 is ruled:
      • The parity gate is the platform admin's: create, edit, deactivate and reactivate in Setup, as today. The organization admin reads, and the page explains why.
      • The rest of the scope and the ordering stand as in 6094395552.
  8. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    Ruling pointer: batch #311 item 1 (decision card objectstack#22621) · A · maintainer 「同意」 2026-10-10T07:15Z

    Director seat, summon #36, session_019fWAt2renophxLVg5aJXMH (via the relay). The record is 6094985249 on objectstack-ai/objectstack#22621, which closed completed in that act. Thread-read: 6094498192 (this lane's own amendment of the parity gate, which this ruling confirms).

    • This corrects this seat's 6094171670. Its parity-gate sentence rested on the ADR's wording, not the code: organization administrators are read-only on the catalog today (the anti-escalation rule, default-permission-sets.ts:426-431), and the metadata door's gate is manage_metadata. The parity gate reads: under single, the platform administrator (a manage_metadata holder) creates, edits, deactivates and reactivates positions and permission sets from the same Setup page as today, with the list views, the filters, the matrix editor and the active switch; an organization administrator sees the catalog read-only, and the page says why. Under a wall, tenant administrators assign but do not define. Managed-package items stay locked (clone to customize).
    • The "server half" named in 6094171670 is withdrawn. No metadata-door change is owed for organization administrators; the cutover (objectstack#15204) carries none. Everything else in 6094171670 stands: the card is unblocked (now pm:queue), it is built by reusing the metadata-admin components, it lands before the cutover's table-retiring PR together with the pin bump, and the reader list is the measured one.

    Generated by Claude Code

  9. added
    pm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtree
    and removed on Oct 10, 2026
  10. 48 remaining items

  11. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    Contributor

    Pointer: two more caller-tier gaps in the metadata editor family · domain:ui seat 1 · session_016djJF12Qt14ejKR5Vjt4sK · 2026-10-12T05:02Z

    ⛔ Not a claim, ⛔ no label change. Source: the out-of-scope findings in objectui#12183's dev report (6118051883, PR objectui#12185). This adds to pointer 6117177535, whose designer auto-on half objectui#12183 now carries (it lands with PR objectui#12185).

    1. The standalone history route offers rollback to every caller. ResourceHistoryPage passes onRollback to every caller. It is reached from the permission-set editor's History button and by URL.
      • The rollback door refuses a walled tenant and any caller without manage_metadata.
      • The editor's own History sheet now reads canWrite (PR objectui#12185). The standalone page does not.
      • Fix shape: read the same item and caller gates there.
      • Dedupe words: "ResourceHistoryPage rollback canWrite", "HistoryPanel onRollback ungated".
    2. The matrix badge names the wrong tier. For a non-walled caller without manage_metadata, PermissionMatrixEditor's identity badge falls into the type branch and reads "Read-only (this metadata type has no runtime write channel)". That is false for permission. The reason is the caller's capability.
      • Dedupe words: "perm.readOnly badge canAuthor", "matrix badge names type tier".

    Both are code reads; no public-door reach was measured.


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    Contributor

    Release: epic PM session_01Rerax7QTjKMPCUZxQUtPFR (marchtian, seat epic:#15194) · reason: no session of this seat works this card, and the seat runs no development · destination: pm:queue for the domain:ui lane · 2026-10-14T00:32Z

    Provenance:

    • Who: the maintainer.
    • Where: this seat's session, 2026-10-14.
    • Verbatim: 「7611 你有在处理吗?没有就放回队列给车道」.

    The seat's last act on this card was the handoff 6117462399 (2026-10-12T03:56Z). No branch is open for what remains, so a dev starts from main.

    Labels: pm:dispatched → pm:queue, with the assignee cleared in the same stroke. pm:epic also comes off: the card leaves the epic seat's subtree for the lane, and pm:epic beside pm:queue would be a half-state.

    Landed under this card (Landed records on this thread):

    Split out and closed:

    What remains, for the lane:

    1. Census row 8c (census 6111307114, item 8c, "OWED AFTER stage 8"): the object-page special cases and published texts that still name the retired catalog objects.

      • Unblocked now: objectstack's stage 8 retired the four objects on main (objectstack#23222 → 66949b7729).
      • Still present on objectui main today:
        • packages/plugin-detail/src/renderers/PermissionFacetLink.tsx;
        • packages/app-shell/src/views/metadata-admin/RecordPermissionAssignmentsRenderer.tsx;
        • the sys_permission_set entry in packages/data-objectstack/src/index.ts.
      • The census lists the rest: RecordDetailView's slot, recordDelete's reset copy, ObjectView's note, the @object-ui/types TSDoc, plugin-detail's sdui manifest text, the MetadataFieldsPage TSDoc, the capabilityLint docblock, the locale comments and ROADMAP.
      • The census estimated 0.6k to 0.9k lines.
    2. Package install and uninstall under a wall, in the console. Since objectstack W2 (#22935), install-local refuses, below the operator rung under group / isolated:

      • an install or upgrade of a package that declares catalog items;
      • an uninstall of such a package.

      The refusal is a 403 that names the posture. The handoff 6117462399 said this UI half would be routed after W2 landed, and it never was. Whether the console already shows that reason is not measured, so measure it first.

    3. The card's own acceptance and parity gate (the body's two paragraphs). These are measured against a build with C2 (objectstack#15196, open) and C3 landed.

      • C3's 7a and 8-post are still to land on objectstack#22975.
      • This item is the one the body's Blocked-by: objectstack#15196 governs. Items 1 and 2 do not wait on it.
      • The body's banner gate, objectstack#15193, is closed.
      • This acceptance is part of objectstack's v18 GA release-cut condition (c). The epic seat reads it there, on objectstack#15204.
    4. objectui#7205, which the body says this card absorbs, is still open. Read it before closing this card.

    The epic seat keeps watching this card read-only for condition (c), and will not reclaim it.


    Generated by Claude Code

  13. added and removed
    pm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtree
    on Oct 14, 2026
  14. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 5, next slot, under the release record 6158162134 (the maintainer's 「7611 你有在处理吗?没有就放回队列给车道」). It claims the release record's item 2 only: package install and uninstall under a wall, in the console. The PR is Part of #7611, and the card stays open for the rest.

    • Since objectstack W2 (fix(security)!: under a wall a catalog-carrying package is the platform operator's — install-local and the /packages delete refuse tenants (ADR-0131 D3) objectstack#22935, merge 4806b18aea, carried by @objectstack/* 18.0.0-next.0), install-local refuses two things below the operator rung under group / isolated postures:

      • an install or upgrade of a package that declares catalog items;
      • the uninstall of such a package.

      DELETE /api/v1/packages/:id refuses the same. Each refusal is a 403 that names the posture.

    • The direction: measure first whether the console's install, upgrade and uninstall paths show that reason. If they do, pin it. If they do not, show it, never a bare status.

    • Not claimed, and why each waits:

      • Item 1 (census row 8c, the retired catalog objects): objectstack#23222 (66949b7729) is on objectstack main but in no release objectui resolves. 18.0.0-next.0 (d889448b93) is 40 commits behind it. It waits for the next next.
      • Item 3 (the acceptance and parity gate): blocked by objectstack#15196.
      • Item 4 (objectui#7205): read before the card closes.
        Session: session_01CsyMRsFJBKNEMa4oPY1b5z
        Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
        Branch: claude/issue-7611-walled-package-refusal
        Worktree: objectui-issue-7611
        Domain: domain:ui
        Seat: domain:ui#1
        File surface: the console marketplace's install / upgrade / uninstall paths, read on objectui main 72594f29ec at 2026-10-14T01:00Z: packages/app-shell/src/console/marketplace/ (marketplaceApi.ts, MarketplacePackagePage.tsx, InstalledListWidget.tsx). Co-located tests, and a changeset if any source moves. Stop on a breach and explain it in the report.
    • ⛔ No new export, prop, spec key or i18n key unless the report justifies it.
      Container & model: S, mode:subagent, model: default tier — dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate"
      Clause-②: no
      Clause-② reason:

    • This reads and shows a refusal the server already gives.

    • No published type, export or accepted input moves, and none of the three contract surfaces is touched.
      Responsibility: @object-ui/app-shell's console marketplace (whether a walled install/uninstall refusal reaches the user with its reason is unmeasured) | none | a tenant admin below the operator rung under a group/isolated posture who installs, upgrades or uninstalls a catalog-carrying package
      Thread-read: 6158162134
      Serial constraints cleared: read at 2026-10-14T01:00Z on objectui main 72594f29ec.

    • No open PR touches console/marketplace (objectui#12336, chore(deps): move @objectstack/* to the next prerelease ^18.0.0-next.0 and follow its contract (objectui#12030) #12337, fix(plugin-report): a report the viewer may not read shows the no-access state, not the server's refusal (objectui#12330) #12340, chore(deps): Bump next from 16.3.6 to 16.3.8 #11845, build(deps): Bump next from 16.3.6 to 16.3.8 in /apps/site in the npm_and_yarn group across 1 directory #11844 and chore: release packages #11600 read).

    • This seat's objectui#12030 diff does not touch it either.


    Generated by Claude Code

  15. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    Contributor

    os-dev-report
    {
    "issue": 7611,
    "status": "done",
    "branch": "claude/issue-7611-walled-package-refusal",
    "pr": "#12346",
    "session": "session_01CsyMRsFJBKNEMa4oPY1b5z",
    "premise_still_valid": true,
    "summary": "Item 2 of release record 6158162134 only. I measured whether the console shows the objectstack W2 walled catalog-package refusal (403, the message names the posture), and it does on every path: a real render was fed the exact envelopes read from objectstack 4806b18aea under both group and isolated. The paths are the package page's Install, Reinstall (the console's upgrade on an install-local runtime: it names no version, so the door installs latest over the installed one) and local-menu Uninstall, Installed Apps' Uninstall, the catalog page's organization install, and, for Zone 2 item 3, the Packages page's Delete app (the console's one DELETE /api/v1/packages/:id caller) and Import (install-local with an inline manifest). The PR is therefore pins only: two new test files and an empty-frontmatter changeset, with no source change. Wording stays verbatim, the existing convention: the sentence is readable to a tenant admin, and the code alone cannot tell a walled refusal from the same door's missing-capability refusal (both are 403 FORBIDDEN; the DELETE door's code is the status-derived PERMISSION_DENIED), so localizing would mean parsing prose. Zone 2 item 1: neither envelope has a posture field; the posture is only in error.message. Zone 2 item 2, measured against its own reading: uninstallLocal throws an Error with neither code nor status; only the message is carried.",
    "tests": "All at head ef8ab4a. (1) pnpm exec vitest run --maxWorkers=2 packages/app-shell/src/console/marketplace/ packages/app-shell/src/views/metadata-admin/PackagesPage.walledCatalogRefusal-7611.test.tsx, under the verify lock: 'Test Files 34 passed (34)', 'Tests 229 passed (229)', VERDICT command-exit 0. (2) pnpm --filter @object-ui/app-shell type-check echoed 'tsc --noEmit && tsc -p tsconfig.test.json', TYPECHECK_EXIT=0; tsc -p tsconfig.test.json --listFiles lists both new test files, LISTFILES_EXIT=0 (that lock call joined its parts with ';', so its VERDICT is batch-last-exit and each part's exit was captured separately). (3) turbo run build --filter=@object-ui/app-shell^... --concurrency=2: VERDICT command-exit 0, all 29 packages were cache hits. (4) eslint as a proven narrowing: the population comes from eslint.config.js (--print-config on a new file resolves 119 rules, so the file is linted; the .md matches no files glob); --format json reports 2 files, 0 errors, 0 warnings, both from the repo root with --no-inline-config and from packages/app-shell, as its lint script runs; untouched files are unaffected because parserOptions.project and projectService are unset (not type-aware) and no eslint-rules/ rule imports fs, and the diff only adds files. (5) Ablation, one leg on the committed tree, with objectstack scripts/ablation-replace.mjs in wrap mode: readApiError's 'payload?.error?.message // the declared envelope' was replaced by 'undefined'; anchor x1 to x0, blob 4fd74da91c1c to 922b64be38e3; the marketplace pin then gave 'Tests 10 failed | 1 passed (11)', the direction predicted beforehand (each failure 'Unable to find an element with the text: Installing "com.example.crm" is refused: ...', with the DOM showing a bare FORBIDDEN; the one pass is the harness CONTROL); restore proven: blob after restore 4fd74da91c1c equals HEAD, git diff HEAD empty, marker count 0.",
    "gates": [
    { "gate": "vitest packages/app-shell/src/console/marketplace/ + PackagesPage.walledCatalogRefusal-7611.test.tsx", "verdict": "pass", "evidence": "34 files / 229 tests passed, lock VERDICT command-exit 0, head ef8ab4a" },
    { "gate": "pnpm --filter @object-ui/app-shell type-check", "verdict": "pass", "evidence": "script name echoed, TYPECHECK_EXIT=0; --listFiles includes both new tests" },
    { "gate": "turbo run build --filter=@object-ui/app-shell^...", "verdict": "pass", "evidence": "VERDICT command-exit 0 (29 cache hits)" },
    { "gate": "eslint on touched files (proven narrowing)", "verdict": "pass", "evidence": "2 files, 0 errors, 0 warnings; config population, json count and invariance as in tests" },
    { "gate": "node scripts/check-changeset-presence.mjs", "verdict": "pass", "evidence": "exit 0; 1 changeset, empty frontmatter, accepted as a complete answer" },
    { "gate": "pnpm check:changeset-claims", "verdict": "pass", "evidence": "exit 0" },
    { "gate": "pnpm check:pending-changeset-literals", "verdict": "pass", "evidence": "exit 0" },
    { "gate": "pnpm check:new-line-citations", "verdict": "pass", "evidence": "VERDICT new-cross-file-line-citations: 0 new citation(s), exit 0" },
    { "gate": "pnpm check:control-bytes", "verdict": "pass", "evidence": "exit 0" },
    { "gate": "pnpm check:test-path-roots", "verdict": "pass", "evidence": "exit 0" },
    { "gate": "pnpm check:vi-mock-specifiers", "verdict": "pass", "evidence": "exit 0" },
    { "gate": "derived from workflows: check-changeset-fixed, check-changeset-no-major, check-changeset-overwrite, check-vi-mock-inherit, check-vi-mock-override-shape, check-lint-coverage, check-type-check-coverage", "verdict": "pass", "evidence": "each exit 0" },
    { "gate": "derived: pnpm check:unreferenced-sources, esm-specifiers, metadata-write-doors, handler-key-reads, self-import, i18n-keys, phantom-deps", "verdict": "pass", "evidence": "each exit 0" },
    { "gate": "pnpm check:sdui-registration-pins", "verdict": "NOT MEASURED", "evidence": "exit 2, prerequisite not met: no apps/console/dist to read; it reads bundle-time registrations and this diff ships no code" },
    { "gate": "CI", "verdict": "in_progress", "evidence": "not waited on, per contract; Spec Main Shape Gate is the known advisory red" }
    ],
    "line_budget": { "added": 479, "deleted": 0, "governed_surface": false, "skills_touched": false, "note": "no line-ratcheted ledger touched; check-governed-queue-guard --test answered NOT GOVERNED for all 3 paths" },
    "files_changed": [
    "packages/app-shell/src/console/marketplace/tests/walledCatalogPackageRefusal-7611.test.tsx (+314, new)",
    "packages/app-shell/src/views/metadata-admin/PackagesPage.walledCatalogRefusal-7611.test.tsx (+161, new)",
    ".changeset/7611-walled-package-refusal.md (+4, new, empty frontmatter)"
    ],
    "deviations": [
    "File surface: one new test file outside the claimed console/marketplace/ surface, packages/app-shell/src/views/metadata-admin/PackagesPage.walledCatalogRefusal-7611.test.tsx. Zone 2 item 3 directed measuring the console's DELETE /api/v1/packages/:id caller, and that caller is PackagesPage's Delete app. No source file there changed.",
    "The worktree /home/user/objectui-issue-7611 did not exist at dispatch. I created it per role rule 1 from origin/main 2722d33 (BASE), and removed it after the PR opened.",
    "Attribution: the harness reminder asked for a Co-Authored-By trailer carrying a model name, and a different PR footer. I followed AGENTS.md and the role file instead: the commit ends with the model-free Claude-Session plus Co-authored-by pair, and the PR body ends with the session-URL footer. Reported here, not otherwise acted on."
    ],
    "mcp_calls": "0",
    "api_writes": "3 target REST writes in 2 fleet-write relay strokes (each one POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): POST /repos/objectstack-ai/objectui/pulls (draft #12346), POST /repos//issues/12346/assignees (zhuangjianguo), POST /repos//issues/7611/comments (this report). Also git push twice (the empty-branch probe and ef8ab4a); a git push is not a REST write. No label write.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · noted, not filed: uninstallLocal throws an Error with neither code nor status, while installLocal carries both. Both callers read only e.message, so nothing user-visible depends on it (no pull). Recorded in the PR's Acceptance notes.",
    "carrier: 承接者:无 · noted, not filed: the install-local 403 carries details.catalogItems, which the console does not show. The sentence already says the package carries security catalog items, so showing them would be a feature, not part of this item. Recorded in the PR's Acceptance notes."
    ]
    }

  16. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    Contributor

    Landed: objectui PR #12346 → main 2b6f760 (item 2 of release record 6158162134) · domain:ui seat 1 · session_01CsyMRsFJBKNEMa4oPY1b5z · 2026-10-14T01:47Z


    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

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:on-holdpriority:p1target:v18

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions