Repository navigation
chore(objectui): move the console pin to 9646e2ed2bf3 (objectui#12185, objectui#12183) (#15204 C9) - #23018
Conversation
…#12183) (#15204) Co-authored-by: Claude <[email protected]> Claude-Session: https://claude.ai/code/session_018yfmohHttjK9aTbKnZLuDr
…e2ed2 (#15204) Co-authored-by: Claude <[email protected]> Claude-Session: https://claude.ai/code/session_018yfmohHttjK9aTbKnZLuDr
…the pin-citations changeset (#15204) Co-authored-by: Claude <[email protected]> Claude-Session: https://claude.ai/code/session_018yfmohHttjK9aTbKnZLuDr
Co-authored-by: Claude <[email protected]> Claude-Session: https://claude.ai/code/session_018yfmohHttjK9aTbKnZLuDr
… at the 9646e2ed2 pin (#15204) Co-authored-by: Claude <[email protected]> Claude-Session: https://claude.ai/code/session_018yfmohHttjK9aTbKnZLuDr
📓 Docs Drift CheckThis PR changes 2 package(s): 2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 6 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 140 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 367b1a38d516f1d2d610ce5abc8c9a44e322d233 && git checkout 367b1a38d516f1d2d610ce5abc8c9a44e322d233
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 111ffff55603f0f9994f6d6a4a43cb1f60580f3d 724aeda4e3bf2ea117880eede95757c910d18616 && git checkout -B drift-repro 111ffff55603f0f9994f6d6a4a43cb1f60580f3d && git merge --no-ff 724aeda4e3bf2ea117880eede95757c910d18616
node scripts/docs-audit/affected-docs.mjs --json 111ffff55603f0f9994f6d6a4a43cb1f60580f3d
|
Contract reviewServed-tier: PR #23018 (card #15204 C9: the console pin hop objectui ① Derived judgments1. The pin and its gate — hold. 2. The SDUI artefacts — hold; no parser port is owed. 3. The spec source edits — comments and strings only; no accept-set change. A mechanical filter over the diff (every 4. The citations — the precedent's failure class does not recur.
5. The three edited tests — comment-only, no assertion moved. The non-comment filter in 3 finds no changed line in 6. CI on the head — no red; four runs still in progress at render time (10:33Z), named. 34 check-runs: 29 7. The base. The merge base is ② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Seat ACCEPT: #23018 (the console pin hop objectui
|
Part of #15204
Clause-②: no
The console pin hop
088e0f705520→9646e2ed2bf3(objectuimain,9646e2ed2bf315a6ae99b2a1633bc7c7d162f7b9, exactly that commit). This hop exists for objectui#12185 (d928c8394, objectui#12183). Under a wall (isolated/group), Setup's security catalog pages (position, permission set, capability) are read-only for a tenant and say why, while the platform operator keeps write. The server already refuses those writes (#22895, #22935).Tier: no governed surface (
GOVERNED_SURFACESinscripts/pm/check-governed-merges.mjs). 20 files.The hop: 9 objectui commits, all on objectui
maind928c8394, objectui#12185 (objectui#12183): under a wall, the catalog pages are read-only for a tenant and say why;9646e2ed2, objectui#12193: the fallback email-template form stops offering the retiredcategory/isSystemkeys;5dd583f5e, objectui#12199: a gallery card whose title field is a lookup draws the referenced name;26b0bd2d1, objectui#12189, and35a2b59a5, objectui#12180: objectui#6349 batches 12 and 11 (one authority each for the FilterBuilder types,DataSource,DomProps,SchemaNode);5b20aed39, objectui#12181: a hatch-elevated type's packaged item opens read-only;b0c5f9ddf, objectui#12177: Studio names an environment overlay, not an org overlay;0f31c3a03, objectui#12186 (CLI test) and7e30d0b6e, objectui#12182 (docs deploy CI): ship no console code.The pin round, as #22967's
Console Pin Gate steps, run locally (each exited 0):
turbo run build --filter=@objectstack/client....scripts/build-console.shat the pin.check:console-sha: "Console dist matches the objectui pin (objectui@9646e2ed2bf3)".check:console-injection --require-stamp.Artefacts that travel with the pin:
scripts/bump-objectui.shgenerated.changeset/console-9646e2ed2bf3.md:@objectstack/consoleminor, the level chore(objectui): move the console pin to 088e0f705520 (objectui#12175 PR-5, #12174 Q3b) (#15204 B2) #22967 used (also the level the script derived from objectui's own changesets). It has 13 releasing entries and 0 breaking, so there is no ADR-0087 placeholder. One commit carries no changeset and is listed by subject.Clause-②: nowas added by hand, as in chore(objectui): move the console pin to 088e0f705520 (objectui#12175 PR-5, #12174 Q3b) (#15204 B2) #22967.check:objectui-changesetpasses.node scripts/gen-sdui-manifest-node.mjs:sdui.manifest.jsonis byte-identical across the hop (107 components), andscripts/sdui-manifest.record.jsonis re-recorded at the pin.check-sdui-manifestpasses.pnpm gen:sdui-lockstepre-recordspackages/sdui-parser/objectui-lockstep.jsonat9646e2ed2bf3. objectui'ssdui-parserchanged on this hop (objectui#12180's type renames), andcheck:sdui-lockstepstill passes: 214 grammar lines are byte-identical, all 25 diagnostic codes agree, and thenot-a-containerpredicate agrees. No parser port is owed.plugin-list/src/ListView.tsx(+9/-9, objectui#12189, the FilterBuilder group type's rename). All nine lines were replaced in place (:13,:324,:326,:332,:399,:756,:774,:777,:1558), so no line in the file moved and no cited range contains a changed line. Itscase 'kanban'/'calendar'/'timeline'/'gantt'/'map'/'tree'arms held at3762/3813/3902/3959/4079/4120-4144.resolveListMapConfig:209-214andresolveTimelineDateBinding:695-699held too, each ending before the next changed line below it;calendar,gantt,timeline,map), plus theobject-ganttand flat-TreeConfigrecords incomponent.zod.ts. Thekanbanrow-cap record namesListView.tsx/ObjectView.tsxonly as an earlier re-read's record, and its sentence says so;git diff --quiet 088e0f705520 9646e2ed2bf3 -- <path>, one file at a time; bare names (index.tsx,types.ts,button.tsx) were resolved by their record's context. That coversform.tsx,autoLayout.ts,field-type-alias.ts,ObjectCalendar.tsx, theen/zh/depacks,data-objectstack/src/index.tsand the action renderers, so theFormField.spandescribe's claim holds (pin re-stamped,content/docs/references/ui/view.mdxregenerated bycheck:generated --fix, the only stale artifact);git grep -o -F, which reproduces every088e0f705520figure exactly. The corpus is 8540 files, and every retired name each entry counts still reads 0. A superset was counted to be safe: every current export ofplugin-lifecycle-advanced.zod.ts,metrics.zod.tsandtracing.zod.ts, plus every key each entry names. Every term is 0 except the unrelatedSpan519 /SpanSchema57, which the tracing entry already explains and which are unchanged. The lit controls moved with the corpus, e.g.objectstack18400 → 18438,tenant1365 → 1393;check:objectui-pin-citations --verify-anchors: 55 asserting citations match9646e2ed2, and the 13 quoted anchors verify against objectui at the pin.gen:migration-registryregenerates the six generated-registry rows;.changeset/objectui-pin-citations-9646e2ed2bf3.md:@objectstack/specpatch,Clause-②: no.Browser check, against this branch's built console
examples/app-showcasewas booted--freshon this branch's console dist (Playwright, Chromium), once per posture. Harness note: as committed, the showcase cannot boot walled. It does not declare@objectstack/organizations, and the CLI refuses a walled posture without it (ADR-0093 D5). A walled boot also needsOS_PLATFORM_OWNER_EMAILand a declaredOS_AUTH_MEMBERSHIP_POLICY. For theisolatedandgroupruns I added the dependency to the showcase'spackage.jsonlocally and uncommitted, set[email protected]andOS_AUTH_MEMBERSHIP_POLICY=invite-only, and reverted both files afterwards./auth/configservedtenancyPosture: isolated/groupwithdegradedTenancy: false.Tenant fixture (each walled run):
[email protected]owns organization "Tenant A". The operator authored a runtime permission setw_meta_author(manage_metadata) and a runtime positionwall_demo_pos, and grantedw_meta_authorto the tenant inside Tenant A. The tenant's/auth/me/permissionscarriesmanage_metadata, and its session readsisPlatformAdmin: false. The server refuses the tenant'sPUT /meta/position/wall_probewith403 FORBIDDENnaming the posture.isolated, tenantcatalog-readonly-reason; editorwalled-catalog-readonly-banner, no Design / Save / Delete, Delegatable switch disabledperm-walled-readonly, badge "Read-only (the platform operator defines this catalog)", no Save / Clone[email protected]"), the type's own tier, as objectui#12185 specifies for a stock capabilityisolated, operatorallowRuntimeCreate=false)group, tenantisolatedisolatedisolatedgroup, operatorisolated; a label edit auto-saved:PUT /meta/position/wall_demo_pos?mode=draft→ 200isolatedisolatedsingle, non-operatormanage_metadataholder ([email protected],isPlatformAdmin: false)PUT …?mode=draft→ 200The one enabled switch on the tenant's permission-set editor is the matrix's "Only granted" view filter, not a write.
User page grant pickers (
single, as the operator, on[email protected]'s record): the Positions tab's New opens the grant form, andregistry-ref-positionlists 17 positions (16 stock pluswall_demo_pos). The Permission Sets tab's New opensregistry-ref-permission, which lists 18 permission sets. Pickingauditorandshowcase_auditorand pressing Create wrote both rows (POST /data/sys_user_position→ 201,POST /data/sys_user_permission_set→ 201), confirmed through the data API.everyoneis still listed among the positions: the open objectui finding #22967 carried, unchanged by this hop.Also seen, not this hop's: a fresh workspace opens the "Set the workspace timezone" dialog over Setup until it is dismissed.
Verification (local)
turbo run buildgreen (74/74, none cached);check:generated: 14/14 current after theview.mdxregeneration;dispatch-gates --ran: 125 derived families. The sweep was running when this draft opened, and its verdict follows in a comment.🤖 Generated with Claude Code
https://claude.ai/code/session_018yfmohHttjK9aTbKnZLuDr