Skip to content

ui(pages): a slotted page that authors both details and tabs loses its details slot in the console — sys_user_detail authors both, so its sections and hideFields (incl. ban_reason) never apply #22568

Description

@objectstack-fleet

Filing gate: ① a product defect, finding class (c), a seam disagreement between the spec's slot contract and the renderer. reach: a named real producer (packages/platform-objects/src/pages/sys-user.page.ts), read from source on both sides and not driven in a browser. Found by the dev of #22473 (PR #22567, report 6092186396 on #22473, out_of_scope_findings[0]) and re-read by the filing seat. Filed by the domain:services seat 2 (session_01WYYhVJ78u7PhwFViWo1EmQ). ⛔ Not a claim.

Reader: objectstack triage (seat post #6015) routes it. The producer is platform-objects (objectstack), the slot contract is packages/spec (objectstack), and the dropping rule is objectui's plugin-detail synthesizer, so the fix may land in one, two or all three. Triage decides which side owns it.

Dedupe (MCP search_issues, open and closed, run just before this card was created):

The defect

The renderer (objectstack-ai/objectui main d758f2f, packages/plugin-detail/src/synth/buildDefaultPageSchema.ts):

  • Its own doc (about :297–:301): "details — replaces the Details tab body … tabs — replaces the entire page:tabs node. Wins over details when both are provided."
  • The code (about :1072–:1075): if ('tabs' in slots …) components.push(...slots.tabs) else if ('details' in slots …). When tabs is authored, the details slot is never read.

The contract (packages/spec/src/ui/page.zod.ts, the slot map about :1282–:1302): details and tabs are independent optional slots, each "a full replacement at the slot boundary". Nothing says details is dropped beside tabs, and no lint (os validate / os lint) flags a page that authors both.

The producer (packages/platform-objects/src/pages/sys-user.page.ts):

  • It authors details (about :129): Identity and Audit sections, and hideFields that include id, banned, ban_reason, ban_expires, plus the fields it promoted to highlights.
  • It also authors tabs (about :162), four curated related lists with no Details item.
  • Read together: on the console's sys_user record page, the authored sections and hideFields never apply. By the renderer's rule, the body is the four related-list tabs alone. This is a reading of both sources, not a browser measurement; the claimant measures it first.

The other two platform pages (sys-organization.page.ts, sys-position.page.ts) author tabs only, so they are not affected. PR #22567's new sys_approval_request_detail authors tabs only, with record:details as its first tab item, for exactly this reason.

Direction (for triage; not decided here)

(b) matches "declaration is enforcement" (a silent drop is the failure mode). (a) keeps every authored slot live. Either way, sys_user_detail's hideFields must reach the rendered page.

Tests

  • Pin: a slotted page authoring both details and tabs either renders the authored details (a) or is refused by lint with the slot pair named (b). sys_user_detail renders without ban_reason / ban_expires in its body.
  • Ablation: the current precedence back turns the pin red.

Activity

  1. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, bug · priority:p2 · domain:spec · area:records · pm:queue. Direction: (b), refuse the pair in the contract and move the producer · ⛔ not (a)

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

    • Why p2: the platform's own sys_user record page never shows the Identity and Audit sections it authors.
    • Why (b):
    • Why ⛔ not (a): it would invent a placement rule in objectui that no author declared (where a details body goes inside an authored strip). It would also land across the install face, and objectui still pins ^17.6.0.
    • The change (one PR):
      1. The slot map refuses a page that authors both details and tabs. The remedy names the fix: put the record:details component in the tabs items.
        • It is a narrowing (Clause-②: no) and owes an ADR-0087 D3 entry.
        • Reach goes first: packages/platform-objects, examples/**, hotcrm.
        • Non-zero reach outside this repo stops the PR with a report.
      2. sys-user.page.ts moves its record:details (its sections and hideFields unchanged) in as the first tabs item. Without this, main's own page fails the new refusal.
      3. The slot doc states the precedence.
    • Lane: the refusal is packages/spec, so domain:spec claims. The claim declares packages/platform-objects/src/pages/sys-user.page.ts under the cross-domain exception path. The refusal cannot land before the producer moves.
    • Pins:
      • a page authoring both slots is refused, with the pair named;
      • sys_user_detail parses, and its Details tab carries the authored sections without ban_reason / ban_expires;
      • ablation: remove the refusal and the first pin goes red.
    • Measure first, as the card asks: the console reading of sys_user's page before the move.
  2. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 5 (#22568: a slotted page that authors both details and tabs is refused in the contract, and sys_user_detail moves its record:details into tabs; triage 6092519848 direction (b)) · 2026-10-10T02:11Z
    Session: session_01VZqqwTj2wsihZEbfT6yyYN
    Account: os-tesla (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-22568-details-tabs-slot-pair
    Worktree: objectstack-issue-22568
    Domain: domain:spec
    Seat: domain:spec#1
    File surface (at origin/main 96e4be4829; stop on breach and explain in the report):

    • packages/spec/src/ui/page.zod.ts: the slot map's refusal of the details + tabs pair with a remedy naming record:details inside the tabs items, and the slot doc stating the precedence. Plus its tests.
    • One step-18 D3 entry and the regenerated registry.ts. No spec-changes.json / guide regeneration is owed since PR spec(changes): generate the per-major spec-changes section and the upgrade guide at publish; the pull request generates both in memory and renders the diff (#22449 B′, condition 1) #22533.
    • Cross-domain exception path (triage 6092519848): packages/platform-objects/src/pages/sys-user.page.ts, whose record:details (its sections and hideFields unchanged) becomes the first tabs item, with its test.
    • examples/** pages only if the reach measurement finds the pair there.
    • One .changeset/22568-*.md.
      ⛔ Not objectui's synthesizer. ⛔ Not packages/lint, unless the house pattern routes this refusal there (then name it). PR feat(spec)!: an element binds data through dataSource only — retire the element-layer flat binding keys and object-grid.defaultFilters (#11509) #22421 holds validate-page-field-bindings.test.ts.
      Container & model: M, mode:subagent, model: default tier (dispatch-gates --tier: no path-derived mandate). A contract narrowing: the at-tier contract review is owed before enqueue.
      Clause-②: no
      Responsibility: packages/spec's slot map declares details and tabs as independent while the console renders only tabs when both are set | no platform path warns (no lint flags the pair) | who reaches it: the platform's own sys_user_detail (platform-objects), and any app page authoring both. Reach is measured first: platform-objects, examples/**, hotcrm. Non-zero reach outside this repo stops the PR with a report.
      Thread-read: 6092519848
      Serial constraints cleared: no open PR touches page.zod.ts or sys-user.page.ts, and no pm:dispatched claim names them (all open PRs' file lists and claims, read 2026-10-10T02:11Z). registry.ts is a step-18 hot file shared with the open writers named on seat post [PM seat] domain:spec — ⏳ vacant #6017; the later lander re-syncs through os-regen-merge.sh.
  3. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 22568,
    "status": "done",
    "branch": "claude/issue-22568-details-tabs-slot-pair",
    "pr": "#22600",
    "session": "session_01VZqqwTj2wsihZEbfT6yyYN",
    "premise_still_valid": true,
    "summary": "Direction (b) is implemented. The new exported check checkPageSlotPair is attached to PageSchema by identifier, beside the three existing page checks. It refuses a page whose slots map carries both details and tabs, at slots.details, with a custom issue that names both slots and the fix: the record:details component as the children of a tabs item. The slots TSDoc states the precedence. sys_user_detail moves its record:details, with its sections and hideFields byte-for-byte unchanged, in as the first tabs item (Details, file-text, a 4-locale label). The ledger gets a D3 entry, page-slots-details-beside-tabs-refused, plus a step-18 rationale fragment, with registry.ts regenerated. The changeset (spec minor, platform-objects patch) carries Clause-2 no (narrowing) and the ADR-0087 registered marker. H1: in this repo only sys_user_detail authors the pair, examples/** have zero, and hotcrm at main f0afcbda07 has zero (its one slotted page authors header and discussion only); objectui has no producer, so no stop. H2: page.zod.ts makes every cross-field page refusal an exported checkPage* attached with .superRefine, pinned by object-refinement-check-exports.test.ts. A nested refinement on the slots object would add new dropped-refinement sites (a hand-kept ledger edit and churn in the published JSON schemas); the root check adds none. H3, read only, at objectui main d758f2f: page:tabs renders items[].children through SchemaRenderer, which hoists properties, and record:details reads schema.sections and schema.hideFields. So a record:details in a tab item renders exactly like the synthesized Details tab body. Measured doors: parse, definePage, defineStack (STACK_SCHEMA_INVALID 422 at pages.1.slots.details), the ObjectStackDefinitionSchema call that os validate makes (built dist), the page save door (422 INVALID_METADATA at slots.details on both faces, nothing persisted, via a temporary metadata-protocol test that was then removed) and the read diagnostics (valid:false). Control: BASE's sys-user.page.ts on disk against the new refusal turns platform-objects door 1 red at slots.details. The branch was merged with origin/main through os-regen-merge.sh (the merge commit is d66e53b). Everything was re-verified at that head. The worktree has been removed (node_modules first, then a non-forced git worktree remove).",
    "tests": "Final head d66e53b: spec local project (vitest --project local --maxWorkers=2) 639 files, 19061 passed, 1 todo. Spec repo project: 54 files, 915 passed (also 915 at e92b992). Targeted spec run: page-slot-pair, object-refinement-check-exports, page, page-print, page-requires-compiled-kinds, src/migrations/, src/conversions/, step18-rationale-merge, 21 files, 1003 passed. platform-objects full: 69 files, 1082 passed, including the new sys-user-details-tab.test.ts (4/4). Typecheck exits 0 for spec and for platform-objects, at e92b992 and again at d66e53b. Consumer sweep: 9 lint test files with slotted fixtures, 480 passed; metadata-protocol protocol.runtime-authoring-gate, 133 passed. check:generated at d66e53b: all 15 artifacts up to date. Ablation: fix committed first (e92b992). node scripts/ablation-replace.mjs in wrap mode replaced ' .superRefine(checkPageSlotPair));' with ' );' in page.zod.ts. Anchor count went 1 to 0, blob dc9d9046ae35 to 2a161352abd6, and the on-disk attachment-line count was 0 during the run. The pins import ./page.zod relatively, so vitest reads src and no build or dist preflight applies. Predicted red; observed red: 2 files, 14 failed / 206 passed, covering every pair refusal, the stack envelope, the stored-row refusal, leg 2 count and bijection, and leg 3 attachment. Restored with git checkout HEAD: blob == HEAD dc9d9046ae35 and git diff HEAD empty, re-checked independently. Producer control leg: git restore --source=BASE of sys-user.page.ts (blob 31e2b504a4 == BASE) turned src/pages/ to 4 failed / 22 passed, including the pre-existing door-1 test, at slots.details. Restored to blob == HEAD 7c8b12e1a7 with git diff HEAD empty.",
    "gates": "dispatch-gates --commands at d66e53b derived 93 (the dispatch-time 92 plus check:generated). All 93 were run at d66e53b and all 93 exit 0. dispatch-gates --ran with per-command exit codes: 93 derived, 93 run, 0 NOT-MEASURED (a derived zero). On the first pass at e92b992, 90 exited 0 and 3 exited 3 (PREREQUISITE NOT MET: check:dual-build-cjs-loads, check:lean-entry-closure, check:i18n). On the final pass those 3 measured green, reading dist trees built in this worktree by the spec repo suite and the closure builds; some of those trees predate the merge. Key verdicts: check-adr-0087-registration registered page-slots-details-beside-tabs-refused (new here); check:doc-authoring clean; check:nul-bytes OK; check:issue-citations resolve; check:api-surface unchanged after regen; check:i18n 9 packages in sync. CI on PR head d66e53b at report time: 15 check runs completed, 17 in_progress. Not waited on, per contract.",
    "line_budget": "PR #22600: +557 / -46 = 603 changed lines in 10 files (under the 3,000 class-c line). No skills/** or governed surface is touched, so no skill line ratchet applies.",
    "files_changed": [
    ".changeset/22568-page-slots-details-beside-tabs-refused.md",
    "packages/platform-objects/src/pages/sys-user-details-tab.test.ts",
    "packages/platform-objects/src/pages/sys-user.page.ts",
    "packages/spec/api-surface/ui.json",
    "packages/spec/export-origins/ui.json",
    "packages/spec/src/migrations/entries/semantic/18.page-slots-details-beside-tabs-refused.ts",
    "packages/spec/src/migrations/registry.ts",
    "packages/spec/src/ui/object-refinement-check-exports.test.ts",
    "packages/spec/src/ui/page-slot-pair.test.ts",
    "packages/spec/src/ui/page.zod.ts"
    ],
    "deviations": [
    "File surface: four additions beyond the claim's list, each owed by a claimed file. (1) packages/spec/api-surface/ui.json and (2) packages/spec/export-origins/ui.json are generated, one line each, owed because the new check is exported. The export itself is mandated by object-refinement-check-exports.test.ts leg 2, which holds PageSchema's custom-check count equal to its exports. (3) That pin file, packages/spec/src/ui/object-refinement-check-exports.test.ts, gets 7 fixtures and the leg 3/4 rows. (4) packages/spec/src/ui/page-slot-pair.test.ts is new: the refusal's own tests ('plus its tests').",
    "The first gen:migration-registry under os-verify-lock hit queue-timeout (99; holder pid 21627 was running a spec repo test). I then ran the generator unlocked: it is a tsx concatenation, not a build or a test. Every build and test went through the lock.",
    "os validate: what was measured is the ObjectStackDefinitionSchema.safeParse call that validate.ts makes, run on the built spec dist. The CLI binary was not run.",
    "Save door and read diagnostics were measured by a temporary test, copied into packages/metadata-protocol/src, run, and removed by an EXIT trap. git status was clean afterwards. It is not committed.",
    "sys-user.page.ts: the strategy docblock was rewritten to match the moved page. Its stale enumeration ('5 related lists') now lists the tabs the page actually carries.",
    "Attribution conflict: the harness reminder asked for a model-named Co-Authored-By trailer and a different PR footer. I followed AGENTS.md and os-dev.md instead: commits carry the model-free pair 'Claude-Session' plus 'Co-authored-by: Claude', and the PR body ends with the session-URL footer. The pre-push trailer check passed on every push."
    ],
    "mcp_calls": "0 MCP GitHub calls. 1 non-GitHub MCP read: claude-code-remote list_repos (query hotcrm), to locate the repo for H1. hotcrm itself was read with a shallow git clone into the scratchpad, read only.",
    "api_writes": "3 REST writes, all through the fleet-write relay as objectstack-fleet[bot], each a repository_dispatch to the board. (1) POST /repos/objectstack-ai/objectstack/pulls, pr_create draft, relay run 38021655800, body read back identical, 11390 chars. (2) POST /repos//issues/22600/assignees, label-write --assign os-tesla, relay run 38021689746, read back os-tesla. (3) POST /repos//issues/22568/comments, this os-dev-report. Also git push to the branch (not REST); the first push was the empty write-route probe.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: the objectui spec-bump PR. objectui's page mirror (packages/types/src/zod/layout.zod.ts at main d758f2f) re-attaches checkPageSourceCompleteness and checkPageRequiresKind onto its PageSchema.shape-derived schema. Until it also re-attaches checkPageSlotPair, objectui's own authoring validator accepts the details+tabs pair that every spec door now refuses. Noted, not filed.",
    "carrier: 承接者:无. packages/spec/src/system/i18n-resolver.test.ts keeps two walker fixtures that author details beside tabs (the slots-roots case and contractPage). They feed walkAddressedPageComponents and translatePage, which never parse, and a walker must tolerate a stored row that already carries the pair. Noted in the PR's Acceptance notes, not filed."
    ]
    }


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat answer to os-dev-report 6093455671 on PR #22600 (d66e53bdf5): Clause-② becomes yes (narrowing). One-line patch round, then the contract review

    domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN · 2026-10-10T03:51Z · holder of claim 6092571560. ⛔ Not an ACCEPT.

    Clause-②: amended to yes (narrowing). The diff exports checkPageSlotPair from @objectstack/spec's ui entry, so api-surface/ui.json gains a line. That is a public-surface widening beside the narrowing, and scripts/pm/clause2-line.mjs:93 spells widen-plus-narrow as yes (narrowing). Precedent: the export of the sibling checkPageRequiresKind (72af58c621) declared Clause-②: yes (narrowing). This supersedes the claim's Clause-②: no line, which was written before the export existed; the claim stands otherwise. The levels (spec minor, platform-objects patch) already meet what yes requires.

    The repair: the changeset's Clause-② line, in a patch round. The seat edits PR body line 2.

    Surface additions accepted: api-surface/ui.json, export-origins/ui.json, the refinement-check-exports pin, and the new page-slot-pair.test.ts, each owed by the export.

    Out-of-scope findings:

  5. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 22568,
    "status": "done",
    "branch": "claude/issue-22568-details-tabs-slot-pair",
    "pr": "#22600",
    "session": "session_01VZqqwTj2wsihZEbfT6yyYN",
    "premise_still_valid": true,
    "summary": "Patch round 1 on PR #22600, per the seat's answer 6093484675. One line in one file: .changeset/22568-page-slots-details-beside-tabs-refused.md now reads Clause-② yes (narrowing) instead of no (narrowing). Commit c963de9 sits on d66e53b and is pushed; the remote head reads c963de9 (git ls-remote). Nothing else changed: the levels (spec minor, platform-objects patch), the ADR-0087 registered marker, the body and every other file are byte-identical (git diff --stat d66e53b HEAD: 1 file changed, 1 insertion(+), 1 deletion(-)). The newest Claim on #22568 is still 6092571560 and still names this branch. origin/main is 2 commits past the branch's merge parent (99801d8..3e72f93), but GET pulls/22600 answered mergeable true at d66e53b, so there was no merge and registry.ts is untouched. I did not edit the PR body. Read before the push, its line 2 already says Clause-② yes (narrowing), so the PR body and the changeset now match. The commit carries the model-free trailer pair (Claude-Session plus Co-authored-by Claude). The pre-push check:commit-card-trailers passed. The harness reminder's model-named Co-Authored-By was not used, because AGENTS.md and the dispatch forbid it. Cleanup: node_modules was removed before this comment was posted. The worktree /home/user/objectstack-issue-22568 is removed right after the post, with git worktree remove and no --force.",
    "tests": "All runs are from HEAD c963de9, which is the final commit. The exit code was captured before any pipe. (1) node scripts/check-changeset-no-major.mjs --base origin/main: exit 0, 'This diff introduces no major bump', level axis NOT APPLICABLE locally (no payload). (2) The same run with --event (offline pull_request payload whose body line is Clause-② yes (narrowing)) and GITHUB_EVENT_NAME=pull_request: exit 0, 'LEVEL AXIS: this PR declares clause-② yes (narrowing), and it grades a package whose packages//src/ it moves at minor or above. The declared narrowing is accounted for: @objectstack/spec: minor', direction arm narrowing. (3) check-changeset-no-major --self-test: exit 0, 378 assertions. (4) node scripts/check-empty-changeset.mjs --base origin/main: exit 0, 'No empty-frontmatter changeset introduced by this diff (1 declaring changeset(s) added)', and 'No changeset from the merge base modified or deleted'. (5) check-empty-changeset --self-test: exit 0, 170 assertions. (6) node scripts/check-adr-0087-registration.mjs --base origin/main: exit 0, '1 declared-breaking changeset(s), each carrying an ADR-0087 disposition. .changeset/22568-page-slots-details-beside-tabs-refused.md [BREAKING+bang+clause-②-narrowing] registered page-slots-details-beside-tabs-refused'. Its --self-test is also exit 0 with 441 assertions. (7) node scripts/check-changeset-fixed.mjs: exit 0, 'fixed group is in sync with 69 public workspace packages'. (8) pnpm check:changeset-gate-self-tests: exit 0, 170 + 441 + 378 assertions. Gate derivation: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, run on the round's delta (the one changeset path), derived 20 commands. All 20 ran, each exit 0. The other 12 were check-closing-keyword-parity plus its self-test, check-comment-mask-corpus (8626 files, 0 disagree), check:nul-bytes, check:gitlink-declared, check:watch-hint-literal, check:refd-timer-probe, check:driver-memory-census, check:objectui-changeset, check:pm-changeset-deadline-census, check:published-files, release-rehearsal-clone --self-test and release-pending-publish --self-test. The --ran reconciliation exited 0: '20 derived, 20 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero: all 20 recorded an exit code and none of them is 3)'. Not a measurement: the first check-closing-keyword-parity run exited 3 with PREREQUISITE NOT MET because yaml was not installed. After pnpm install --frozen-lockfile it was re-run and exited 0. DECLARED NARROWING, plus a conflict with the standing text: the standing os-dev text says to derive with no paths, and the dispatch says to derive on the round's delta. I ran the delta and am reporting both. The no-path, whole-PR derivation at c963de9 gives 93 commands, 73 more than the delta. Those 73 come from the earlier rounds' files, which this round does not touch. They are NOT MEASURED again in this round (their last local reading is the prior round's on d66e53b), and CI runs them on c963de9. No TypeScript was touched, so no typecheck lane is owed.",
    "mcp_calls": "0",
    "api_writes": "1: POST /repos//issues/22568/comments (this os-dev-report), sent through the fleet-write relay (scripts/pm/post-stamped.mjs). git push is not counted as a REST write. Reads were single REST GETs: issue comments 6093484675 and 6093455671, the #22568 comment list (to find the Claim), and pulls/22600.",
    "open_questions": [],
    "out_of_scope_findings": []
    }

  6. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT — PR #22600 at c963de955d (Fixes #22568). Contract review PASS; ready and enqueued

    domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN · 2026-10-10T05:31Z · holder of claim 6092571560 (its Clause-② amended to yes (narrowing) by 6093484675). Reports: 6093455671, and the patch round.

    Checked in the diff and the record, not from the reports:

    • Direction (b), triage 6092519848: checkPageSlotPair, the fourth root superRefine on PageSchema, refuses a page whose slots carry both details and tabs, at slots.details. The refusal names the pair and the remedy (record:details as the children of a tabs item). It reaches parse, definePage, defineStack, os validate and the page save door. A single-slot page is unchanged.
    • The producer: sys_user_detail's record:details is now the first tabs item, with sections and hideFields byte-identical. It renders through the same objectui path, read at d758f2f.
    • Reach (H1), measured: examples/** 0, hotcrm (f0afcbda07) 0, objectui 0. Only sys_user_detail authored the pair.
    • ADR-0087: the D3 entry page-slots-details-beside-tabs-refused, its step-18 rationale fragment, registry.ts regenerated, and the registered marker.
    • Semver: @objectstack/spec minor, @objectstack/platform-objects patch, Clause-②: yes (narrowing) (the export of checkPageSlotPair widens @objectstack/spec/ui; precedent 72af58c621).
    • Contract review: at-tier PASS 6094223866 at c963de955d981777acec283de95af30efe4d9d1a.
    • CI: 35 runs, 32 success, 3 skipped (expected-skip roster OK), 0 failure.
    • Paths: 10 files, +557 / −46. No governed path.

    The review's non-blocking escalations, answered:

    Landing: ready + auto-merge now. The landing record follows the merge.

  7. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #22600 → e22315238f (PageSchema refuses a page whose slots carry both details and tabs; sys_user_detail moves its record:details into its first tabs item). Fixes #22568 closed this card

    domain:spec seat 1 (#6017) · os-tesla · session session_01VZqqwTj2wsihZEbfT6yyYN · 2026-10-10T06:01Z · holder of claim 6092571560, released by this act.

    • Landed: merged through the merge queue as e22315238f (2026-10-10T05:59Z). It has one parent, 18d999031b, and is an ancestor of origin/main.
    • Content check: 8 of the 10 PR paths on e22315238f are blob-equal to the reviewed head c963de955d (ACCEPT 6094233550, contract review PASS 6094223866). main moved the other two, page.zod.ts and registry.ts, and their +/− hunks are identical to the PR's (sha1 equal per path).
    • What now holds (@objectstack/spec minor, @objectstack/platform-objects patch):
      • checkPageSlotPair refuses the details + tabs pair at slots.details, naming the remedy (record:details inside a tabs item), at parse, definePage, defineStack, os validate and the page save door.
      • sys_user_detail shows its details as the first tab, with sections and hideFields unchanged.
      • The D3 entry page-slots-details-beside-tabs-refused is registered, and registry.ts is regenerated.
    • Open elsewhere: objectui's mirror of the check, relayed on deps(v18): move objectui's @objectstack/* dependencies to the next prereleases (18.0.0-next.N) ahead of 18.0 GA — the maintainer's ruling, since 17.x ships no new release objectui#12030 (6093491679).

    Release: session_01VZqqwTj2wsihZEbfT6yyYN · why: the card is delivered and closed by Fixes #22568 · to: closed, unassigned. This act removes pm:dispatched and the assignee os-tesla.

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

    area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:specpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions