Skip to content

fix(app-shell): the page designer stops offering the retired page:header breadcrumb toggle (objectui#11173) - #11214

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-11173-retire-breadcrumb-toggle
Sep 30, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-11173-retire-breadcrumb-toggle

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #11173
Clause-②: no

The Studio page designer stops offering the "Show breadcrumb" toggle on the canonical page:header block. breadcrumb leaves BLOCK_CONFIG['page:header'], and its label key engine.inspector.pageBlock.field.page:header.breadcrumb leaves both the en and zh tables of the designer's i18n file. This is the shape the header's icon field took. The field-set pin and the label pin move with it.

Why: the canonical page:header renderer already ignores the key (objectui#11166, landed as PR objectui#11172), and objectstack#20758 retires PageHeaderProps.breadcrumb in the spec through ADR-0087. Until then the toggle authors a key nothing reads. Once objectui pins a spec release carrying that tombstone, the platform refuses the key by name. The producer leaves first, so the pin bump does not find it standing.

Implemented by the dispatched os-dev of domain:ui seat 2, session https://claude.ai/code/session_011p7ikEivgXefNDaE5S5Uec, branch claude/issue-11173-retire-breadcrumb-toggle.

Stored pages: no strip (triage ruling on the card)

A page that already carries breadcrumb is not rewritten by the designer. It opens, the key shows under Advanced by its raw name (a checkbox, still checked), and the next save keeps it. RETIRED_BLOCK_PROP_KEYS deliberately gains no page:header entry: the spec's ADR-0087 conversion strips the key on load, with its notice, and a second strip in the designer would be a second mechanism that hides that notice. A new screen-level control pins this, and an ablation shows it can fail (below).

Changes, all in the page:header region

  • previews/block-config.ts: the breadcrumb entry leaves BLOCK_CONFIG['page:header']. A comment beside the existing icon note says why, and why the strip table stays untouched.
  • metadata-admin/i18n.ts: the en row ("Show breadcrumb") and the zh row of engine.inspector.pageBlock.field.page:header.breadcrumb are removed, with a one-line note beside each icon note.
  • previews/__tests__/block-config.test.ts: the header field-set pin is now ['title', 'subtitle']. A new describe, "page:header breadcrumb — the designer toggle retired with its reader", pins that the toggle is not offered and that neither locale keeps a translation for it.
  • inspectors/PageBlockInspector.i18n.test.tsx: the zh-CN label pair for the toggle leaves the "one language" case. Its absence is now pinned in the new file.
  • inspectors/PageBlockInspector.pageHeaderBreadcrumb-11173.test.tsx (new): screen pins. In en-US and zh-CN, the panel offers Title and Subtitle, has no checkbox, and shows no label or raw key for the toggle. A stored breadcrumb: true opens, visible and checked under Advanced, and an edit to Title commits { title: 'Customer', breadcrumb: true }, which is the control.
  • .changeset/11173-retire-page-header-breadcrumb-toggle.md: @object-ui/app-shell patch.

Verification (at 1d8257ab5, the branch head)

  • Target tests: pnpm exec vitest run over block-config.test.ts, block-config-i18n.test.ts, PageBlockInspector.i18n.test.tsx, PageBlockInspector.retiredBlockProps.test.tsx and the new file gives 5 files, 98 passed. At BASE 846cec0ef the first four gave 4 files, 92 passed, so the change adds +2 in block-config.test.ts and +4 in the new file. A verbose run lists all six new cases by name.
  • Ablation 1, put the toggle back. ablation-replace planted the entry back into BLOCK_CONFIG['page:header'] (anchor 1 to 0, blob 73518960b48b to ebc2ef0c43c7). Result: 3 files failed, 9 failed / 61 passed. The failures include the field-set pin ("still offers the canonical header fields the renderer does implement"), "does NOT offer the retired breadcrumb toggle", block-config-i18n.test.ts's "every key resolves in en-US" / "in zh-CN", "zh-CN is actually translated", "the extractor really sees the keys the derivation implies", and three of the four new screen cases. The restore was proven: blob equal to HEAD 73518960b48b, git diff HEAD on the path empty. The restore leg ran 3 files, 70 passed. A first attempt was a no-op: its replacement contained its anchor, so the tool refused (anchor 1 to 1) before running any test. It was re-run with a non-overlapping anchor.
  • Ablation 2, add the strip the ruling forbids. Planting 'page:header': ['breadcrumb'] into RETIRED_BLOCK_PROP_KEYS gave 2 files failed, 3 failed / 67 passed: both stored-page control cases ("opens" and "saves") and the existing "every registered key really is one the block schema refuses BY NAME". The restore was proven the same way, and the restore leg passed 70 of 70.
  • Both ablations mutate source that the tests import by relative path (../block-config, ../previews/block-config.js), not through a package exports/dist, so no rebuild hop applies.
  • Lock-free gates, all exit 0: node scripts/check-changeset-presence.mjs ("5 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)"), check:control-bytes, check:new-line-citations ("0 new citation(s)"), check:i18n-keys, check-changeset-no-major, check-changeset-fixed, check-changeset-overwrite, check:changeset-claims, check:pending-changeset-literals, and node scripts/markdown-test-inputs.mjs --audit. A raw control-byte self-scan of the changed files found no hits.
  • check:changeset-claims listed six pending changesets that name a file this diff touches. Each paragraph was read, and none makes a claim about the page:header breadcrumb toggle or its field set.
  • ESLint, narrowed to the changed files: pnpm exec eslint on the 5 changed .ts/.tsx files (--format json counts 5 files) gives 0 errors and 2 warnings. Both warnings are no-explicit-any in block-config.test.ts, and BASE's copy of that file carries the same 2. Population: the root eslint.config.js (**/*.{ts,tsx}) that each package's lint (eslint .) runs. Invariance: the config enables no type-aware linting (no parserOptions.project / projectService), and no local rule in eslint-rules/ reads another file, so this diff cannot move the verdict on any untouched file.
  • Root scripts/__tests__, narrowed because the diff adds a markdown changeset: I ran the 38 test files there that mention changeset (vitest run --maxWorkers=2, lock-free) and got 38 files, 1433 passed. The whole suite was not run locally.
  • NOT MEASURED locally, declared to CI: the @object-ui/app-shell dependency-closure build (29 packages) and pnpm --filter @object-ui/app-shell type-check. Reason: the shared verify lock was held for more than 49 minutes by one run (issue-11196's verify-all.sh, pid 14872, alive and busy), with three waiters ahead. This branch spent about an hour queued across five tries without getting the lock for this half. CI's Type Check job runs both tsc projects, and CI's test job runs the full scripts/__tests__ suite.

Overlap with PR objectui#10278

PR objectui#10278 edits block-config.ts, block-config.test.ts, block-config-i18n.test.ts and PageBlockInspector.retiredBlockProps.test.tsx in the object-kanban region only. This PR touches the page:header region of block-config.ts and block-config.test.ts, and does not touch the other two files. The hunks are disjoint.

Acceptance notes

  • A stored breadcrumb stays editable under Advanced, which can set a value but has no delete. That follows from the no-strip ruling. The spec's ADR-0087 conversion removes it on load once objectui pins that release.
  • For the seat that bumps the @objectstack/spec pin to a release carrying objectstack#20758's tombstone:
    • RETIRED_BLOCK_PROP_KEYS membership criterion 2 ("the node schema refuses the key BY NAME") would then admit breadcrumb, and the existing "every registered key really is one the block schema refuses BY NAME" pin would stop objecting. The new round-trip control is what keeps the ruling.
    • The icon describe's tombstone probe (isShapeKeyTombstoned(PageHeaderProps, …)) is the pattern for a breadcrumb tombstone assertion.
  • The page:header component registration in @object-ui/components still declares a breadcrumb input described as "Ignored … Leave it out." That was PR objectui#11172's deliberate choice while the contract accepts the key. It is not this card's surface.
  • Known external red: the required Spec Main Shape Gate is red on every objectui PR against objectstack main (anchor card objectui#11206). It is not caused by this diff and is not touched here.

Generated by Claude Code

…der breadcrumb toggle

`breadcrumb` leaves BLOCK_CONFIG['page:header'] and its label key leaves
both the en and zh designer tables, the shape the header's `icon` field
took. The field-set and label pins move with it. A stored `breadcrumb` is
not stripped: a new screen-level control pins that a page carrying it opens
and its next save keeps the key, since the spec's ADR-0087 conversion is
the one strip.

Claude-Session: https://claude.ai/code/session_011p7ikEivgXefNDaE5S5Uec
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 6 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/6310-designer-formula-key-retired.md

  • names packages/app-shell/src/views/metadata-admin/i18n.ts → packages/app-shell/src/views/metadata-admin/i18n.ts — edited by this change

    Not touched: designer.field.formula ('Formula (CEL)') in packages/app-shell/src/views/metadata-admin/i18n.ts, a different and live key belonging to metadata-admin's ObjectFieldInspector — the surface that still authors formula expressions.

.changeset/7125-dashboard-empty-state-keys-retired.md

  • names packages/app-shell/src/views/metadata-admin/i18n.ts → packages/app-shell/src/views/metadata-admin/i18n.ts — edited by this change

    Not touched: table.noRows ('No rows to display') and engine.form.noRows (packages/app-shell/src/views/metadata-admin/i18n.ts, read at widgets.tsx) — two different, same-named keys in different namespaces. Nor the comments in WidgetEmptyState.tsx, DatasetWidget.tsx, ObjectDataTable.tsx and PivotTable.tsx that record WHY three widgets with three strings became one shared empty state; the packs' own comment keeps that rationale and now names the retirement instead of a row that is gone.

.changeset/7772-page-block-kanban-group-by-control.md

  • names previews/__tests__/block-config.test.ts → packages/app-shell/src/views/metadata-admin/previews/__tests__/block-config.test.ts — edited by this change

    Run against the node those four controls produced, ObjectKanbanSchema.safeParse reported two issues, not one: groupBy "expected string, received undefined", and groupField carrying the retirement guidance verbatim. So this panel could not author a valid object-kanban node however it was filled in, and the board it produced grouped nothing with no diagnostic on any face. Both halves are now pinned against the schema itself rather than against a spelling, in previews/__tests__/block-config.test.ts — scripts/check-designer-field-key-parity.mjs judges PAYLOAD_SHAPES and does not read BLOCK_CONFIG, so nothing mechanical was watching this table.

.changeset/8278-page-tabs-item-value.md

  • names block-config.test.ts → packages/app-shell/src/views/metadata-admin/previews/__tests__/block-config.test.ts — edited by this change

    • ComponentPropsMap['page:tabs'].safeParse returns success: false with unrecognized_keys naming key at items.0 — and 17.3.0's own message now spells the remedy out, "Did you mean key -> value?"; - PageTabsRenderer builds itemsWithValue from it.value and reads it.key nowhere, so the tab falls back to the index-derived tab-IDX; - PageTabsProps.items[].value is a real, declared schema member, which this repo's own block-config.test.ts already stated in prose.
  • names block-config.ts → packages/app-shell/src/views/metadata-admin/previews/block-config.ts — edited by this change

    The control is renamed to value on the producer side — AGENTS.md #0.1 and the rule stated in block-config.ts's own file header ("keep each field name aligned with the property name the corresponding renderer reads"). Teaching the renderer a second spelling would have been the lenient-fallback shape that rule forbids. The field name is the last segment of the i18n key, so both locale tables move with it in this one commit and the retired key leaves both, the objectui#3829 / objectui#5212 pattern.

.changeset/8279-definition-list-term-description.md

  • names block-config.ts → packages/app-shell/src/views/metadata-admin/previews/block-config.ts — edited by this change

    The controls are renamed to term / description — the producer side, per AGENTS.md #0.1 and the rule stated in block-config.ts's own file header ("keep each field name aligned with the property name the corresponding renderer reads"). Two of the three faces already agreed: the block's registry declaration names items as "Term/description pairs [{ term, description }]". The designer was the outlier, so moving the renderer instead would have put it at odds with its own declaration.

.changeset/8632-malformed-picklist-option-loud.md

  • names views/metadata-admin/i18n.ts → packages/app-shell/src/views/metadata-admin/i18n.ts — edited by this change

    Two new strings land in the designer's own en / zh tables — the metadata-admin console owns its strings in views/metadata-admin/i18n.ts and is deliberately outside the ten locale packs (packages/i18n/README.md, "Scope — the engine.* carve-out").

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 9419df198 (merge-base with origin/main): 5 file(s) changed outside .changeset/, read against 1804 pending declaration(s) that publish a body (2414 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 330 chunks) 3572.6 KB 3607.4 KB
Main entry chunk (gzip) 149.6 KB 350 KB
Entry file index-D9pYVFIf.js —
Status PASS —

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.88KB 6.25KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.17KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 559.46KB 134.18KB
core (index.js) 9.94KB 3.94KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 228.51KB 63.39KB
fields (index.js) 261.19KB 66.27KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.35KB 9.18KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 40.51KB 11.36KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.58KB 4.90KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.25KB 2.17KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 52.17KB 15.06KB
plugin-charts (index.js) 84.09KB 22.93KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 138.73KB 37.05KB
plugin-designer (index.js) 215.78KB 44.42KB
plugin-detail (index.js) 240.43KB 63.18KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 172.30KB 44.19KB
plugin-gantt (index.js) 172.43KB 42.85KB
plugin-grid (index.js) 230.25KB 63.22KB
plugin-kanban (index.js) 48.43KB 15.11KB
plugin-list (index.js) 115.82KB 28.67KB
plugin-map (index.js) 22.90KB 7.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.04KB 12.21KB
plugin-timeline (index.js) 32.26KB 9.42KB
plugin-tree (index.js) 11.20KB 3.89KB
plugin-view (index.js) 90.43KB 22.76KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 119.55KB 39.23KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 6.17KB 2.73KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 22.61KB 7.40KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 3.19KB 1.62KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.26KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.82KB 7.15KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 1d8257ab589d3bba93d69c94105f407b12249acb
Local-runs: none

Inputs: card #11173 (body and all three comments: triage 5905811279, claim 5910165461, dev report 5911505335); PR #11214 (body, the 6-file list, the net diff against main at 846cec0ef); the check-runs on the head (filter=latest, polled until every run had completed: 43 at completion); context reads through contents/PATH?ref=SHA at base 846cec0ef and at the head (block-config.ts, i18n.ts, PageBlockInspector.tsx, the three sibling suites, app-shell/src/index.ts, app-shell/package.json, components/.../layout/containers.tsx); PR objectui#10278's file list and diff for the region question only. Nothing built, run or re-run.

① Derived judgments

  • Accept set: unchanged — right. No schema, prop, type or exported set moves. A stored breadcrumb is still accepted by the designer (it shows under Advanced and rides out on the next save, pinned on screen) and by the spec pin this PR leaves at @objectstack/spec ^17.5.0 (app-shell package.json at base). RETIRED_BLOCK_PROP_KEYS at the head holds 'object-kanban': ['groupField'] only; the diff does not touch it, so the inspector strips nothing new. That is the triage ruling (5905811279: ADR-0087's load-time conversion is the one strip).
  • Public surface: one designer control leaves — right. The Studio page designer's page:header panel no longer offers the "Show breadcrumb" checkbox. BLOCK_CONFIG and the metadata-admin t() table are not re-exported from packages/app-shell/src/index.ts (read at the head), so no package export, type or i18n pack moves. The en and zh rows of engine.inspector.pageBlock.field.page:header.breadcrumb leave together, so the two key sets stay identical (Lint, which carries check:i18n-keys, is green on the head).
  • The key was named only in block-config.ts and the two i18n rows outside tests, at base 846cec0ef — right. Read at base: block-config.ts carries one breadcrumb entry, in BLOCK_CONFIG['page:header']; i18n.ts carries the en row (Show breadcrumb) and the zh row (显示面包屑) of that label key. A code search of the repository for page:header.breadcrumb and a grep of the pre-PR tree in this container find no other non-test file; the only tests naming the toggle are the two this PR moves (block-config.test.ts's field-set pin and PageBlockInspector.i18n.test.tsx's zh label pair). The diff removes exactly those three source lines and nothing else in source.
  • Pins moved — right, and no coverage is lost. The icon describe's positive half now reads ['title', 'subtitle'], still non-vacuous for its own negative pin and for the new one. The new describe pins not.toContain('breadcrumb') behind the same length guard, and t(key, locale) returning the key in both locales, the shape the icon and groupField retirements use in the same file. In PageBlockInspector.i18n.test.tsx's one-language case, the zh pair (getByText('显示面包屑'), queryByText('Show breadcrumb') null) leaves; the case still asserts two zh contents and one English absence, so "one language" is still a reading. The only coverage the old zh pair carried beyond that, a checkbox label resolving through fieldLabel in zh, is still pinned in the same file by record:alert's 可关闭 (dismissible, a boolean field). block-config-i18n.test.ts's ratchets do not move: the field family is a lower bound (toBeGreaterThan(80)), and the exact add (5) and placeholder (6) families never counted the toggle. Matches the dev's "assumption 3 did not hold".
  • New screen suite PageBlockInspector.pageHeaderBreadcrumb-11173.test.tsx — right. Panel half, it.each over en-US and zh-CN: Title and Subtitle found by label (non-vacuity), queryAllByRole('checkbox') empty, neither label spelling on screen, no raw engine.inspector.pageBlock. text. Control half: a PageSchema.parsed page with { title: 'Account', breadcrumb: true } opens with a checked checkbox labelled breadcrumb (the generic Advanced editor renders a boolean as InspectorCheckboxField label={name}), and a Title edit commits { title: 'Customer', breadcrumb: true }.
    • Would the control go red if a strip were added? Yes, judged from the code at the head. In PageBlockInspector.tsx, blockProps is stripRetiredBlockProps(block.type, block.properties), and it is the one value advancedKeys enumerates and patchProp spreads from. A 'page:header': ['breadcrumb'] entry removes the key from Advanced (the "opens" case's getByLabelText('breadcrumb') throws) and from the commit (the "saves" case's toEqual fails), and the existing every registered key really is one the block schema refuses BY NAME pin fails at expect(type).toBe('object-kanban'). That is exactly the three-failure shape the dev's ablation 2 reports; the reading here is of the code, not of the report. The fixture parses through PageSchema, which the sibling header measured does not judge block properties, so the control stays a reading about the inspector after a later spec pin tombstones the key.
  • RETIRED_BLOCK_PROP_KEYS gains no page:header entry — right (head, the constant's one row), and the comment beside the removed entry says why the strip table stays untouched. The BY NAME pin still walks whatever the registry holds.
  • Region — right, disjoint from PR objectui#10278. This PR's hunks in the shared files are the page:header entry of block-config.ts and, in block-config.test.ts, the icon describe's field-set pin plus a new describe inserted before page:accordion. PR feat(plugin-grid): one display page size read from the spec, and a distinct fetch batch (objectui#9853) #10278's hunks in those two files are object-kanban prose (DEFAULT_KANBAN_LIMIT to DEFAULT_KANBAN_FETCH_BATCH_SIZE) in the kanban entry and in the kanban describe; its other two app-shell files (block-config-i18n.test.ts, PageBlockInspector.retiredBlockProps.test.tsx) are not touched here, and i18n.ts and PageBlockInspector.i18n.test.tsx are not in feat(plugin-grid): one display page size read from the spec, and a distinct fetch batch (objectui#9853) #10278. No shared hunk.
  • Prose carried by the diff — right. The notes beside the removed entry and beside each removed i18n row name finding(app-shell): the Studio page designer's "Show breadcrumb" toggle still writes page:header.breadcrumb, a key the renderer ignores and objectstack#20758 retires #11173, [seam] page:header's breadcrumb ("Show breadcrumb", default true) draws only an empty slot — the declared capability is never honoured #11166, objectstack#20758 and ADR-0087 and cite by content, not by line address; Line Citation Gate is green. No model identifier in the PR body, the changeset, the commits or the code.
  • Judged wrong: none.

② Semver level

  • .changeset/11173-retire-page-header-breadcrumb-toggle.md declares '@object-ui/app-shell': patch — right. The diff edits published src/ of a fixed-group package (block-config.ts, i18n.ts), so a declaration is owed and skip-changeset would be wrong; the test files owe none. patch is the level: a fix in a released package takes patch, and nothing an author can write is removed or renamed (the stored key is still accepted and round-trips; no export, type or config field moves), so it is not breaking and minor is not owed. Precedent: the icon retirement (objectui#3829, 183d09b) sits under Patch Changes in the app-shell CHANGELOG. The body carries the from/to fact a reader needs (the toggle is gone, a stored key is not rewritten, the one strip is the spec's). Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check, Changeset Overwrite Report and Changeset Claim Re-read are all success on the head.
  • Clause-②: no — right, at the start of a line in the PR body and in claim 5910165461, with no (widening)/(narrowing) arm. No accept set widens or narrows: a designer control leaves, the stored-metadata accept set and the spec pin are unchanged, and the designer round-trips a stored breadcrumb as before.

③ Boundary flags

  • NOT MEASURED locally: the app-shell closure build and type-check (shared verify lock held by issue-11196's verify-all.sh). Answered by the head's check-runs: Type Check = success, Build & E2E = success.
  • Narrowed, lock-free file-scoped runs (5 target files, two 3-file ablations) and the 38-file scripts/__tests__ subset. Answered by CI, which runs the whole suite: Test (shard 1/8) through Test (shard 8/8) = success, all eight, and the Test rollup = success; Test (dist pins) = success; Lint = success.
  • Ablation 2 beyond the order — accepted as evidence for the control; judged in ① against the code.
  • Commit trailers, model-free pair — right under objectui AGENTS.md's commit-message rule: both commits (b11694993, 1d8257ab5) end with Claude-Session and the bare Co-authored-by, no model identifier anywhere on the PR.
  • Control pin in a new file, not PageBlockInspector.retiredBlockProps.test.tsx — right: that suite is object-kanban-shaped and in PR feat(plugin-grid): one display page size read from the spec, and a distinct fetch batch (objectui#9853) #10278's diff; a new file keeps the regions disjoint.
  • open_questions: none.
  • Out-of-scope 1 — the RETIRED_BLOCK_PROP_KEYS criterion after the spec bump. Acceptance notes suffice; no card. After the bump, criterion 2 would admit a page:header entry, but the no-strip ruling is kept by the round-trip control, which does not depend on the spec state; a tombstone assertion in the icon describe's shape is optional hygiene, and the pointer to it is carried in the source itself (the note beside the removed entry and the new describe's header), which the bump PR's author reads. Nothing actionable is owed, so a card would carry nothing.
  • Out-of-scope 2 — the page:header registration in @object-ui/components still declaring a breadcrumb input. Acceptance notes suffice; no card. It is already mechanised: the registration's own comment beside that input (containers.tsx at base) says the entry stays only while the installed spec accepts the key and fails the forward direction of registry-inputs-spec-parity.test.ts once the pin carries the tombstone. The bump PR goes red on it and cannot land without removing the input; the gate routes the bump seat there, not prose.
  • Out-of-scope 3 — the shared verify lock held for 49+ minutes by one run. An observation about this container with no carrier; nothing for this PR, and the seat has it on the card.
  • Known external red — Spec Main Shape Gate = failure on this head, recorded as known-external; it does not block. Its job log (job 109889195323, read, not re-run) reports 4 diagnostics in 2 objectui files, compiled against objectstack 40d6c5fbd39d: packages/app-shell/src/providers/writeWarningToast.ts (TS2741, the computed arm missing from the stripped-line table, three times) and packages/data-objectstack/src/spec-symbol-batch6.test.ts (TS2344, a true-constraint assertion). Those are exactly the two files the class names and no others; neither is in this PR's six-file list, and the cause is the computed reason objectstack b28054654 (PR fix(objectql)!: a caller-supplied formula value is stripped on every write path and reported as computed, and engine.validate runs the write doors (#20805) objectstack#20834) added to DroppedFieldsEvent['reason']. Anchor: objectui#11206 (seat 1's stop-the-bleed, PR objectui#11210).
  • All check-runs on the head at completion: 43 runs, 39 success, 3 skipped (dependabot, Test (coverage), the coverage shard matrix), 1 failure (the known-external gate above). No other red; nothing still in progress.

Implemented-by: claude/issue-11173-retire-breadcrumb-toggle
Reviewed-by: session_011p7ikEivgXefNDaE5S5Uec

VERDICT: PASS


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 330 chunks) 3572.7 KB 3607.4 KB
Main entry chunk (gzip) 149.6 KB 350 KB
Entry file index-BoJffiy6.js —
Status PASS —

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.88KB 6.25KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.17KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 559.46KB 134.18KB
core (index.js) 9.94KB 3.94KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 228.51KB 63.39KB
fields (index.js) 261.19KB 66.27KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.35KB 9.18KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 40.51KB 11.36KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.58KB 4.90KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.25KB 2.17KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 52.17KB 15.06KB
plugin-charts (index.js) 84.09KB 22.93KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 138.73KB 37.05KB
plugin-designer (index.js) 215.78KB 44.42KB
plugin-detail (index.js) 240.43KB 63.18KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 172.30KB 44.19KB
plugin-gantt (index.js) 172.43KB 42.85KB
plugin-grid (index.js) 230.25KB 63.22KB
plugin-kanban (index.js) 48.43KB 15.11KB
plugin-list (index.js) 115.82KB 28.67KB
plugin-map (index.js) 22.90KB 7.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.04KB 12.21KB
plugin-timeline (index.js) 32.26KB 9.42KB
plugin-tree (index.js) 11.20KB 3.89KB
plugin-view (index.js) 90.43KB 22.76KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 119.55KB 39.23KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 6.17KB 2.73KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 22.61KB 7.40KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 3.19KB 1.62KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.26KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.82KB 7.15KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 43c485dae5b23d2b6a81726385e2069c7b79abb8
Local-runs: none

Delta re-record on the landing head, after the base merge. The previous record on this PR, 5911705861 (PASS at 1d8257ab5), covers everything the merge did not move; this record cites it rather than restating it, and states what was read anew on this head.

Inputs: card #11173 (body and its three comments, unchanged since 5911705861: triage 5905811279, claim 5910165461, dev report 5911505335); PR #11214 (body, unchanged byte for byte; the 6-file list; the net diff against main at the new head); the merge commit 43c485dae and main's advance 846cec0ef...9419df198; the check-runs on the new head (filter=latest, polled until every run had completed). Nothing built, run or re-run.

① Derived judgments

  • What the new head is. 43c485dae is a merge commit with parents 1d8257ab5 (the head judged in 5911705861) and 9419df198 (main), and no other commit. main advanced by exactly one commit since the previous base 846cec0ef: 9419df198, objectui#11206's fix (PR objectui#11210: the computed strip reason worded in writeWarningToast.ts, its test, spec-symbol-batch6.test.ts, the ten packages/i18n locale packs, and its changeset — 14 files). None of those 14 files is a file this PR touches.
  • The merge brings in only main's own changes — right, no conflict resolution. The merge commit's file set against its first parent (14 files, with their blob shas) is identical to main's advance 846cec0ef...9419df198, file for file and blob for blob; and the PR's net diff against main at 43c485dae is byte-identical to the net diff judged at 1d8257ab5 (same 6 files, same hunks, same +205/-7, index lines included). So the merge moved nothing the PR authored and authored nothing of its own.
  • Every ① judgment in 5911705861 stands unchanged on this head: the accept set unchanged (no strip; RETIRED_BLOCK_PROP_KEYS untouched; spec pin unchanged), one designer control leaving and no package export moving, the key's base-state locations, the moved pins with no coverage lost, the new screen suite and its control that goes red under a strip, and the region disjoint from PR objectui#10278. The hunks are the ones judged there. Judged wrong: none.

② Semver level

  • Unchanged from 5911705861: .changeset/11173-retire-page-header-breadcrumb-toggle.md declares '@object-ui/app-shell': patch, the right level for a fix in a released package that removes nothing an author can write; the merge adds no changeset of this PR's (the 11206-computed-strip-wording changeset in the diff of the merge commit is main's own, already on main, and is not in the PR's net diff). Clause-②: no — right, and unchanged in the PR body and the claim.

③ Boundary flags

  • Every dev flag and out-of-scope note is answered in 5911705861 (③ there), and nothing new was flagged: no new dev report, no new card comment, no PR-body change. Two answers are re-read on the new head because their evidence is the head's check-runs:
    • the locally NOT MEASURED app-shell closure build and type-check: Type Check = success, Build & E2E = success on 43c485dae.
    • the narrowed lock-free runs and the 38-file scripts/__tests__ subset: Test (shard 1/8) through Test (shard 8/8) = success, all eight, the Test rollup = success, Test (dist pins) = success, Lint = success on 43c485dae.
  • Spec Main Shape Gate = success on this head (job 109896010345). The known-external red recorded in 5911705861 is closed by the very commit this merge brings in (9419df198, objectui#11206 / PR objectui#11210), so no known-external carve-out is needed here and no log was read.
  • All check-runs on the new head at completion: 43 runs, 40 success, 3 skipped (dependabot, Test (coverage), the coverage shard matrix), 0 failure. No red; nothing still in progress.

Implemented-by: claude/issue-11173-retire-breadcrumb-toggle
Reviewed-by: session_011p7ikEivgXefNDaE5S5Uec

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 30, 2026 13:13
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 30, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Sep 30, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Dequeued by an API 502 in the Test rollup gate, not by a test. Re-queued once, unchanged, on this head 43c485dae

domain:ui seat 2 · session_011p7ikEivgXefNDaE5S5Uec · 2026-09-30T13:34Z. This is the landing window's audit record for the kick.

  • Dequeued: 2026-09-30T13:29Z (removed_from_merge_queue).
  • The failing check: merge-group CI run 36720333418, job Test (109909136027), the rollup gate. Its log: needs.test.result … = success, then ##[error]could not read this run's job list: GET /repos/objectstack-ai/objectui/actions/runs/36720333418/attempts/1/jobs?per_page=100&page=1 -> HTTP 502, exit 2.
  • The signature: a GitHub API HTTP 502 while the gate read its own run's job list. It is new to this seat's ledger. The same signature hit the group ahead of this one (PR objectui#11208's run 36720335676, job 109908723691, 13:28Z).
  • The three facts for a single re-queue:
    1. no test file failed, so no failing import closure intersects this diff;
    2. the queue base's test matrix is green: the rollup read success from every shard;
    3. the first error is an HTTP 502 from the API, not an assertion.
  • Action: auto-merge re-armed once on the same head. If the same signature fires again, this seat stops and hands the diagnosis on; ⛔ no second re-queue.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 30, 2026
Merged via the queue into main with commit 52bf348 Sep 30, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-11173-retire-breadcrumb-toggle branch September 30, 2026 13:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants