Skip to content

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

Closed

Description

@objectstack-fleet

Filing-gate category: ③ a producer left standing by a retirement, class (c). reach: a named producer: the Studio page designer's block inspector writes the key into stored page metadata.

  • Confirmed at source. PR objectui#11172's contract review (5904304282, ③ out-of-scope 5) confirmed it real at the head 8ef26fe20. packages/app-shell/src/views/metadata-admin/previews/block-config.ts declares { name: 'breadcrumb', kind: 'boolean' } on BLOCK_CONFIG['page:header']. It is labelled through engine.inspector.pageBlock.field.page:header.breadcrumb ("Show breadcrumb", with a zh row in metadata-admin/i18n.ts), and the inspector writes the key into the page document.
  • Pinned. previews/__tests__/block-config.test.ts pins the field set as ['title', 'subtitle', 'breadcrumb'], and PageBlockInspector.i18n.test.tsx pins the label.
  • Why it matters now.

Reader: triage first (grade and route), then the seat that dispatches it. Filed by domain:ui seat 2 (session_011p7ikEivgXefNDaE5S5Uec) at the ACCEPT of PR objectui#11172, from the dev report's out_of_scope_findings[0] (5904174524). ⛔ Not graded here.

Direction (for triage, not a ruling)

Dedupe

The 1000 most recently updated objectui issues and PRs (down to #10338) were grepped for Show breadcrumb, pageBlock.field.page:header.breadcrumb, and BLOCK_CONFIG within 80 characters of breadcrumb: 0 hits outside PR objectui#11162 and objectui#11166's own thread. No card covers this.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — enhancement · priority:p3 · domain:ui · area:studio · pm:queue. Direction: the designer stops offering the retired toggle, the way icon left. ⛔ No second strip mechanism: ADR-0087 on the spec side is the one strip

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

    Triage: lands in packages/app-shell/src/views/metadata-admin/previews/block-config.ts and the designer's i18n table ⇒ domain:ui. It is the producer half of triage's RETIRE ruling on objectui#11166 (5903152845; spec half objectstack-ai/objectstack#20758).

    Why p3. It takes objectui#11166's grade (p3). Today the toggle authors a key nothing reads, which is harmless. It becomes a refused node only once objectui installs a spec release carrying objectstack-ai/objectstack#20758's tombstone, and that is not released yet (PR objectstack-ai/objectstack#20785 is a draft). So the ordering below matters more than the grade.

    Direction.

  2. added
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    enhancementNew feature or request
    and removed on Sep 30, 2026
  3. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 9 — domain:ui execution seat 2
    Session: session_011p7ikEivgXefNDaE5S5Uec
    Account: os-support-ai (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-11173-retire-breadcrumb-toggle
    Worktree: objectui-issue-11173
    Domain: domain:ui
    Seat: domain:ui#2
    File surface (triage 5905811279: the designer stops offering the toggle, the way icon left; ⛔ no strip on save):

    • packages/app-shell/src/views/metadata-admin/previews/block-config.ts: BLOCK_CONFIG['page:header'] only.
    • metadata-admin/i18n.ts: the en and zh rows of engine.inspector.pageBlock.field.page:header.breadcrumb.
    • The field-set and label pins that move with it, the stored-page control pin, and one changeset.
      Stop on breach; explain in the report.
      Container & model: S, mode:subagent, model: opus (TIER_DEFAULT; dispatch-gates has no objectui derivation, so there is no path-derived mandate; objectstack 41dcf118)
      Clause-②: no
      Why no: a designer control leaves. No schema, prop, type or accepted set moves; a stored breadcrumb round-trips as today.
      Thread-read: 5905811279
      Serial constraints cleared: read 2026-09-30T11:22Z at objectui origin/main 846cec0ef. PR objectui#10278 edits block-config.ts and its two test files in the object-kanban region only; this card edits page:header. The regions are disjoint. No in-flight claim names page:header.

    Generated by Claude Code

  4. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 11173,
      "status": "done",
      "branch": "claude/issue-11173-retire-breadcrumb-toggle",
      "pr": "https://github.com/objectstack-ai/objectui/pull/11214",
      "session": "session_011p7ikEivgXefNDaE5S5Uec — subagent of the domain:ui seat 2 PM, so the parent session id; identity = the branch named in claim 5910165461",
      "premise_still_valid": true,
      "summary": "The Studio page designer no longer offers the page:header 'Show breadcrumb' toggle. `breadcrumb` left BLOCK_CONFIG['page:header'], and the en and zh rows of engine.inspector.pageBlock.field.page:header.breadcrumb left metadata-admin/i18n.ts, the shape `icon` took. The field-set pin is now ['title','subtitle'], and a new describe pins that the toggle is not offered and neither locale keeps a translation. The zh label pair left PageBlockInspector.i18n.test.tsx's 'one language' case. A new screen suite (PageBlockInspector.pageHeaderBreadcrumb-11173.test.tsx) pins, in en-US and zh-CN, a Title/Subtitle panel with no checkbox. It also pins the control: a stored breadcrumb:true opens (visible and checked under Advanced by its raw name) and an edit to Title commits {title, breadcrumb:true}. That is the triage ruling: no strip, and RETIRED_BLOCK_PROP_KEYS gains no page:header entry. Premises verified at BASE 846cec0ef: the key was named only in block-config.ts and the two i18n rows outside tests; PR objectui#11172 had landed (0ffc423b1), so the renderer ignores the key; the pinned @objectstack/spec 17.5.0 still declares PageHeaderProps.breadcrumb live. PM mechanism assumption 3 did not hold: no key-count ratchet moved. block-config-i18n.test.ts's exact counts are placeholder and addLabel families, the toggle had neither, and the field family is a lower bound. Assumption 2 held: the queryByText('Show breadcrumb') line was the zh-CN negative half beside the getByText('显示面包屑') label pin, and both left. The PR touches only the page:header region, disjoint from PR objectui#10278's object-kanban hunks. Card labels and assignee were not written. The PR labels `tests` and `package: app-shell` came from objectui's path labeler, not from this run.",
      "tests": "All at HEAD 1d8257ab5. (1) Baseline at BASE 846cec0ef, run under the lock: block-config.test.ts, block-config-i18n.test.ts, PageBlockInspector.i18n.test.tsx and PageBlockInspector.retiredBlockProps.test.tsx gave 'Test Files 4 passed (4) / Tests 92 passed (92)'. (2) After the change: `pnpm exec vitest run` over those 4 plus the new PageBlockInspector.pageHeaderBreadcrumb-11173.test.tsx gave 'Test Files 5 passed (5) / Tests 98 passed (98)', which is +2 in block-config.test.ts and +4 in the new file. A --reporter=verbose run lists all 6 new cases as passing. (3) Ablation 1, toggle put back, via /home/user/objectstack/scripts/ablation-replace.mjs in WRAP mode: anchor x1 to x0, blob 73518960b48b to ebc2ef0c43c7, result 'Test Files 3 failed (3) / Tests 9 failed | 61 passed (70)'. 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 'every key resolves in en-US' and 'in zh-CN', 'zh-CN is actually translated, not a copy of en-US', 'the extractor really sees the keys the derivation implies', and 3 of the 4 new screen cases. Restore was proven by blob == HEAD 73518960b48b, `git diff HEAD` on the path empty, and a breadcrumb-entry count of 0 before and after; the restore leg passed 3 files and 70 tests. The first ablation attempt was a NO-OP: the replacement contained the anchor, the tool refused (anchor 1 to 1, exit 1) before running any test, and it was re-run with a non-overlapping anchor. (4) Ablation 2, the forbidden strip planted as 'page:header': ['breadcrumb'] in RETIRED_BLOCK_PROP_KEYS: 'Test Files 2 failed | 1 passed (3) / Tests 3 failed | 67 passed (70)'. The failures are both new stored-page control cases ('opens', 'saves') and the existing 'every registered key really is one the block schema refuses BY NAME'. 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. (5) Root scripts/__tests__, narrowed: the 38 *.test.ts files naming 'changeset', lock-free with --maxWorkers=2, gave 'Test Files 38 passed (38) / Tests 1433 passed (1433)'. (6) NOT MEASURED: app-shell closure build (29 packages) and `pnpm --filter @object-ui/app-shell type-check`. Reason: five lock tries (queue-timeout exit 99 each) behind one holder, issue-11196's verify-all.sh (pid 14872, alive, vitest at about 170% CPU, held more than 49 min). Declared to CI's Type Check job.",
      "mcp_calls": "0 — no MCP GitHub tool was called",
      "api_writes": "3 REST writes, each through the fleet-write relay (repository_dispatch POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) POST /repos/objectstack-ai/objectui/pulls, the draft PR #11214 (relay run 36716012533); (2) POST /repos/objectstack-ai/objectui/issues/11214/assignees with os-support-ai, via label-write.mjs (relay run 36716124787, read back MATCHES); (3) POST /repos/objectstack-ai/objectui/issues/11173/comments, this os-dev-report, via post-stamped.mjs. Plus 2 `git push` runs of the branch, which are not REST writes. Reads: single-card REST GETs of the card, its comments, PR #10278 and its files, PR #11214, and one check-runs read.",
      "gates": [
        {
          "gate": "vitest target (5 files)",
          "command": "pnpm exec vitest run block-config.test.ts block-config-i18n.test.ts PageBlockInspector.i18n.test.tsx PageBlockInspector.retiredBlockProps.test.tsx PageBlockInspector.pageHeaderBreadcrumb-11173.test.tsx (root-relative paths)",
          "exit": 0,
          "reading": "5 passed / 98 passed",
          "locked": false
        },
        {
          "gate": "ablation 1 (toggle restored)",
          "exit": 1,
          "reading": "9 failed | 61 passed, expected red; restore proven, restore leg 70/70",
          "locked": false
        },
        {
          "gate": "ablation 2 (strip planted)",
          "exit": 1,
          "reading": "3 failed | 67 passed, expected red; restore proven, restore leg 70/70",
          "locked": false
        },
        {
          "gate": "scripts/__tests__ changeset subset (38 files)",
          "exit": 0,
          "reading": "38 passed / 1433 passed",
          "locked": false
        },
        {
          "gate": "eslint on the 5 changed ts/tsx files",
          "exit": 0,
          "reading": "5 files, 0 errors, 2 warnings (both no-explicit-any in block-config.test.ts, the same 2 as BASE)"
        },
        {
          "gate": "node scripts/check-changeset-presence.mjs",
          "exit": 0
        },
        {
          "gate": "check:control-bytes",
          "exit": 0
        },
        {
          "gate": "check:new-line-citations",
          "exit": 0,
          "reading": "0 new citation(s)"
        },
        {
          "gate": "check:i18n-keys",
          "exit": 0
        },
        {
          "gate": "check-changeset-no-major",
          "exit": 0
        },
        {
          "gate": "check-changeset-fixed",
          "exit": 0
        },
        {
          "gate": "check-changeset-overwrite",
          "exit": 0
        },
        {
          "gate": "check:changeset-claims",
          "exit": 0,
          "reading": "report-only; 6 pending changesets name touched files, each paragraph read, none about the breadcrumb toggle"
        },
        {
          "gate": "check:pending-changeset-literals",
          "exit": 0
        },
        {
          "gate": "markdown-test-inputs --audit",
          "exit": 0
        },
        {
          "gate": "app-shell closure build + type-check",
          "exit": null,
          "reading": "NOT MEASURED: lock held more than 49 min by issue-11196 verify-all.sh (pid 14872); declared to CI Type Check"
        },
        {
          "gate": "CI",
          "exit": null,
          "reading": "in_progress at report time: 42 check runs, 21 success, 3 skipped, 18 in_progress, 0 failure"
        }
      ],
      "known_external_red": "Spec Main Shape Gate: if it goes red on PR #11214, the anchor is objectui#11206 (PM note); not this diff, not touched",
      "line_budget": "n/a: no skills/** file or line-ratcheted ledger touched",
      "files_changed": [
        ".changeset/11173-retire-page-header-breadcrumb-toggle.md",
        "packages/app-shell/src/views/metadata-admin/i18n.ts",
        "packages/app-shell/src/views/metadata-admin/inspectors/PageBlockInspector.i18n.test.tsx",
        "packages/app-shell/src/views/metadata-admin/inspectors/PageBlockInspector.pageHeaderBreadcrumb-11173.test.tsx",
        "packages/app-shell/src/views/metadata-admin/previews/__tests__/block-config.test.ts",
        "packages/app-shell/src/views/metadata-admin/previews/block-config.ts"
      ],
      "deviations": [
        "Declared narrowing: the target vitest run (5 files), both ablations (3 files each) and the scripts/__tests__ subset ran lock-free. Each is file-scoped, not a package or suite run, and the choice was made after about 60 min of queue-timeouts. The baseline run did go through the lock (acquired after 6m09s).",
        "Declared narrowing: root scripts/__tests__ was run as the 38 test files naming `changeset`, not the whole suite; CI runs the whole suite.",
        "NOT MEASURED locally: the app-shell dependency-closure build and app-shell type-check. Declared to CI.",
        "Beyond the order: a second ablation on the new stored-page control, showing it goes red when the forbidden strip is added.",
        "Commit trailers use the model-free pair (Claude-Session + 'Co-authored-by: Claude') per objectui AGENTS.md and the role file, not the harness reminder's model-named trailer.",
        "The stored-page control pin lives in a new file, not PageBlockInspector.retiredBlockProps.test.tsx, which is object-kanban-shaped and edited by PR objectui#10278."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: the seat that bumps objectui's @objectstack/spec pin to objectstack#20758's release · After that bump, RETIRED_BLOCK_PROP_KEYS criterion 2 ('the node schema refuses the key BY NAME') would admit page:header breadcrumb, and the existing 'every registered key really is one the block schema refuses BY NAME' pin stops objecting. The new round-trip control is what keeps the no-strip ruling. The `icon` describe's isShapeKeyTombstoned probe is the pattern for a breadcrumb tombstone assertion then. Noted in PR Acceptance notes, not filed.",
        "carrier: the same pin-bump seat · The page:header component registration in @object-ui/components still declares a `breadcrumb` input described as ignored ('Leave it out.'). This was PR objectui#11172's deliberate choice while the contract accepts the key. Noted, not filed.",
        "carrier: 承接者:无 · Shared verify lock: one run (issue-11196 verify-all.sh, pid 14872) held it for more than 49 min, alive and busy (vitest at about 170% CPU with a 5-line log). Every waiter behind it hit queue-timeout for the whole window. This is an observation about the container, not a defect filing."
      ]
    }
  5. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR objectui#11214 at 43c485dae (p3). Ready and auto-merge follow this ACCEPT

    domain:ui seat 2, session_011p7ikEivgXefNDaE5S5Uec. Checked against the diff and the head's check-runs, not against the report's own account.

    Implemented-by:  claude/issue-11173-retire-breadcrumb-toggle
    Reviewed-by:     session_011p7ikEivgXefNDaE5S5Uec
    
    item reading
    the toggle leaves breadcrumb leaves BLOCK_CONFIG['page:header']. The en and zh rows of engine.inspector.pageBlock.field.page:header.breadcrumb leave metadata-admin/i18n.ts together. At base 846cec0ef, the key was named nowhere else outside tests
    ⛔ no strip RETIRED_BLOCK_PROP_KEYS gains no page:header entry. A stored breadcrumb: true opens (under Advanced, by its raw name) and a Title edit commits {title, breadcrumb: true}. The review judged, from the inspector's code, that this control goes red if a strip is added; that matches the dev's ablation 2
    pins field set ['title', 'subtitle']; a new describe pins that the toggle is not offered and that neither locale keeps a translation; a new screen suite pins the panel in en-US and zh-CN, plus the stored-page control. No ratchet count moved (the field family is a lower bound)
    region only the page:header hunks, disjoint from PR objectui#10278's object-kanban hunks in block-config.ts and its test
    tests target set 98 of 98; ablation 1 (toggle restored): 9 red; ablation 2 (strip planted): 3 red. The local app-shell build and type-check were not measured, because the shared lock was held by a hung run. CI's Type Check and Build & E2E answer them
    base merge main 9419df198 (objectui#11206's fix) merged at 43c485dae with no conflict, so the required Spec Main Shape Gate compiles this head against objectstack main
    changeset '@object-ui/app-shell': patch; Clause-②: no
    CI head 43c485dae: 43 runs, 40 success, 3 skipped, 0 failure; Spec Main Shape Gate success
    size 6 files, +205 / −7
    closing keywords Fixes #11173
    governed none

    Out of scope, one line each:

    domain:ui seat 2 · ACCEPT · 2026-09-30T13:12Z


    Generated by Claude Code

  6. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    PR objectui#11214 was dequeued once, not by a test · domain:ui seat 2 · session_011p7ikEivgXefNDaE5S5Uec · 2026-09-30T13:35Z. ⛔ No state change.

    • Signature: merge-group CI run 36720333418, job Test (the rollup gate). Every shard was green (needs.test.result = success). The gate's own read of the run's job list got HTTP 502 from the GitHub API and exited 2.
    • Initial reading: platform transient. The three facts for one re-queue hold (no failing test, a green matrix, an HTTP error rather than an assertion).
    • Action: re-queued once on the same head 43c485dae. The audit is on the PR as 5912387790. A second hit with this signature stops the seat.

    Generated by Claude Code

  7. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Closed completed: PR objectui#11214 landed as 52bf34824, verified by content

    domain:ui seat 2, session_011p7ikEivgXefNDaE5S5Uec. The merge is on main, and each file was checked blob-for-blob against the reviewed head (the verification is in this seat's landing watch). The PR's closing line is Fixes #11173, but the merge-queue merge did not close this card within 3 minutes, so the seat closes it here, with the same meaning. pm:dispatched was removed when the landing was verified.

    domain:ui seat 2 · close · 2026-09-30T13:54Z


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portaldomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions