Repository navigation
feat(app-shell): metadata-admin reads /meta/types allowEnvironmentOverlay; the read-only banners name OS_METADATA_WRITABLE (objectui#12141) - #12168
Conversation
…Overlay`; the read-only banner names `OS_METADATA_WRITABLE` and no registry flip (objectui#12141) The server renames the type entry's overlay flag (objectstack-ai/objectstack#22340 S2). Every reader in the metadata-admin designer and Studio now reads the new name, with no fallback to the old one, and `RichMetadataTypeEntry` and `resolveResourceConfig` carry the renamed member. The read-only type banner named an env var the server does not read and offered a registry flip nobody can perform; it now names `OS_METADATA_WRITABLE` with the hatch's reach (ADR-0131 D6). The permission matrix's artifact hint no longer offers the hatch for a packaged set, which the hatch does not open. Claude-Session: https://claude.ai/code/session_016djJF12Qt14ejKR5Vjt4sK Co-authored-by: Claude <noreply@anthropic.com>
…owEnvironmentOverlay`, with the hatch tooltip naming `OS_METADATA_WRITABLE` (objectui#12141) Claude-Session: https://claude.ai/code/session_016djJF12Qt14ejKR5Vjt4sK Co-authored-by: Claude <noreply@anthropic.com>
…to `allowEnvironmentOverlay` (objectui#12141) Claude-Session: https://claude.ai/code/session_016djJF12Qt14ejKR5Vjt4sK Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contract reviewServed-tier: Read: card objectui#12141 (body and all four comments: triage ① Derived judgmentsThe diff: 74 files, +634 / -181. Eleven non-test readers (ten under
Check-runs on the head, as read in this act (second reading, later than the first): 42 runs. 30 ② Semver level
③ Boundary flagsDev report Deviations
Out-of-scope findings
Flags this review adds
Implemented-by: VERDICT: PASS |
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
…, carries objectui#12141); re-measure the spec's pin citations `.objectui-sha` 4997995022f8 -> e5311165a8d6, the merge of objectstack-ai/objectui#12168: objectui main from that commit on reads the `GET /meta/types` field under its new name, `allowEnvironmentOverlay`. The 55 asserting pin citations in packages/spec/src (49 hand-written, 6 in the generated migrations registry) are re-measured over the objectui diff 4997995022f8..e5311165a8d6 (287 paths, 24 commits): five cited files changed (ObjectGrid.tsx, data-table.tsx, form.tsx, record-related-list.tsx, data-objectstack/src/index.ts) and every cited line in them moved or held byte-identical; each record carries a hop sentence, and the anchors that moved are re-pointed in the records' at-this-pin text. The six migration entries' corpus counts are re-taken with git grep -o -F (8506 tracked files). check:objectui-pin-citations --verify-anchors: 55 asserting citations match, 13 anchor content assertions verified at e5311165a. Claude-Session: https://claude.ai/code/session_01KNKBCRDJCu5tGy3TEbvtrF Co-authored-by: Claude <noreply@anthropic.com>
Fixes #12141
Clause-②: yes
Landing order
This pull request merges first. objectstack-ai/objectstack#22340 S2 (PR objectstack-ai/objectstack#22874, held as a draft for the pin round) then bumps
.objectui-shato this merge. That is ruling Q1 A / Q2 A (6073921182): one landing for the server rename, this companion and the pin, and the order the S2 seat review restates (6112246741).mainreads a field the server does not write yet. The bundled console is unaffected, because its pin stays where it is until S2.6109764647records the pin-pair rule on objectstack-ai/cloud#2709. Cloud's.objectui-shamay pass this merge only in the same commit that moves its framework pin to a commit carrying S2.What changes
The rename.
RichMetadataTypeEntry.allowOrgOverrideis nowallowEnvironmentOverlay, and so is the memberresolveResourceConfigtakes and returns. Both are exported from the package entry, so the published type surface moves; henceClause-②: yesand aminorchangeset with the breaking semantics stated (this repo's release model, nomajor). Every reader now reads the new name:canWriteByTypeand the designer auto-on effect inResourceEditPage;PermissionMatrixEditor(only its overlay-flag reads and the comments beside them; the cross-lane declaration is on [epic] ADR-0131 — total organization ownership: no NULL organization_id (v18 line) objectstack#15194,6115259878);ResourceListPage), the embedded item editor's read-only gate, the directory's writable count, its "Writable only" filter and its tile badge (DirectoryPage), and the page header badge (PageShell'sWritabilityBadge);BuilderLanding,PicklistPreview,useMetadataandregistry, andcontent/docs/guide/console.md.The renamed member carries a doc comment that names the wire field, its meaning under ADR-0131 D6, and that no other name is read.
The carried banner remedy (triage
6109764647).engine.edit.readOnlyTypeBannertold an admin to setOBJECTSTACK_METADATA_WRITABLEand to "flip {override} in the registry". The server reads onlyOS_METADATA_WRITABLE: objectstackmainreads it inenvWritableMetadataTypes, with an empty legacy list. The registry is a TypeScript literal in@objectstack/specthat no deployment edits.OS_METADATA_WRITABLEas its code token. It says what the hatch opens: the type's items that no package ships, never an item a package ships.{override}placeholder and the registry flip are gone, in English and Chinese.DirectoryPage's tile andPageShell's header badge) nameOS_METADATA_WRITABLEwith the same reach. They no longer name the legacy env var.mainapplies the hatch to the runtime-only intent only (ADR-0131 D6). Its own refusal sentence names the hatch to say it does not open a managed item. A banner that offered the hatch unqualified on a packaged item would send the operator to a door the server keeps shut.Same defect class, fixed in place: the permission matrix hints. This diff edits the two
perm.readOnly*hints anyway, to rename the key inside them.perm.readOnly.artifact.hintis shown only for a set a code package ships. It offered "ask an operator for the documented OS_METADATA_WRITABLE escape hatch" as a route, and that route does not open such a set (above). It now says the hatch does not open a set a package ships. Cloning, redeploying the source and a new runtime set are unchanged.perm.readOnly.hint(a type with no runtime write channel) keeps the hatch as a remedy and states its reach.PermissionMatrixEditor.artifactTierandPermissionMatrixEditor.cloneToCustomize). The second also asserts that the old route wording is absent.Not changed, as this seat ruled: the artifact-tier gate's logic. It still reads the flag alone; see the finding below.
Premise checks (measured on
d2500d8)views/metadata-admin/plusstudio-design/BuilderLanding.tsx), 49 hits. The field was also named in 59 test files (114 hits).StudioHomePage.tsxis gone. The rename touched exactly 71 files: those, plus the docs page.dist/index.d.tsre-exportsRichMetadataTypeEntryandresolveResourceConfig. After the build,useMetadata.d.tsandregistry.d.tscarryallowEnvironmentOverlayand noallowOrgOverride.views/metadata-admin/i18n.ts, en and zh) and in the two tooltips.packages/i18nhas none of them.Verification (final head
2c38817)turbo run build --filter='@object-ui/app-shell^...' --concurrency=2, 28 of 28 tasks successful.pnpm --filter @object-ui/app-shell buildpassed, with dist completeness 1062 files verified.pnpm --filter @object-ui/app-shell type-check(it echoestsc --noEmit && tsc -p tsconfig.test.json; the second project includes everysrc/**/*.test.tsx): exit 0.2c38817: 6 files, 70 tests passed.ResourceEditPage.environmentOverlay-12141: for each ofview,dashboard,report,translationandemail_template, a packaged item is editable when served the field (both flags true, as S2's registry declares them), and the same item without the field stays locked. Negative control:api, without overlay or runtime create, stays read-only. Its banner namesOS_METADATA_WRITABLEand no registry flip, in en and zh.DirectoryPage.environmentOverlay-12141: the tiles and the header badge for the five types; a hatch-elevatedagent, whose only open door is the overlay flag, is badged writable and counted;apiand the field-lessagentare read-only and not counted.ablation-replace(literal anchors, the landing checked on disk, a trap that restores, and a restore proven by HEAD blob hash withgit diff HEADempty):canWriteByTypereading the old name: 5 failed of 12, the five positive cases;WritabilityBadgereading the old name: 6 failed of 10;All four turned red in the expected direction, and each restore was blob-equal.
2c38817:check-changeset-presence,check-changeset-no-major,check:changeset-claims,check:pending-changeset-literals,check:control-bytes,check:new-line-citations(0 new),check:phantom-deps,check:i18n-keys,check:i18n-drift(3 designer en values changed, 3 zh followed),check:i18n-designer-parity,docs:check-links,check:doc-fences,check:test-path-roots, andcheck:vi-mock-specifiers/-inherit/-override-shape.eslint .runs (no type-aware linting is configured, and no custom rule reads another file, so the verdict on an untouched file cannot move): 72 files, 0 errors, 176 warnings. All of the warnings were already there, and the two new test files have none.check:eager-closure, because it needs the full console build, which CI's performance-budget job owns. The diff adds 328 net bytes, uncompressed, of shipped strings to the designer table (en and zh together).Acceptance notes (observed; not filed)
agententry the hatch elevates (allowEnvironmentOverlay: true,overrideSource: 'env', no runtime create) and a packaged item. The editor offers Edit.mainrefuses that save: the hatch admits the runtime-only intent only, and ADR-0131 D6 seals managed content. That is read from the server source, not measured live.overrideSourceis this lane's call. It is reported to the seat.engine.studio.landing.*) and some comments still say "org overlay" after ADR-0131 D6 retired the per-org axis. That is wording only.PermissionMatrixEditor's type-gate comment carries three stale cross-file line addresses. They were left alone because this diff touches only that file's overlay-flag reads, as the cross-lane declaration states.PermissionMatrixEditor.cloneToCustomize's refused-save fixture quotes a pre-D6 server sentence (an escape-hatch remedy the server no longer prints). It is a fixture of the client showing the server's words, so it was left as is.Generated by Claude Code