Skip to content

a11y: form-designer drag-and-drop announces internal ids ("Draggable item f:name … g:new_group") #11802

Description

@objectstack-fleet

Filing gate ① — product defect with a named location and a reproduction. reach: Studio form designer: dragging Name into a group announces "Draggable item f:name was dropped over droppable area g:new_group" in the live region.

Who acts on it: objectui triage → the Studio / app-shell owner. ⛔ Not a claim. Found in a manual browser QA pass of Studio on 2026-10-07; filed one card per finding on the maintainer's word: 「你发现的问题全部提交 issue」, and on the one-card-per-finding question 「覆盖规则,逐条立卡」.

What happens

dnd-kit's default announcements read internal ids to screen-reader users, in English regardless of locale.

Suggested direction (triage to rule)

Provide localized announcements ("Name moved to New group, position 1 of 1").

Environment

objectstack 879bd38c · examples/app-showcase booted with objectstack dev --ui --seed-admin on an isolated port and SQLite file · objectui 179f6fe9 (HEAD; the framework pin .objectui-sha is a58626c8) served by the console's Vite dev server, perf numbers from a vite build of the same commit · Chromium 141 at 1440×900 · signed in as the seeded platform admin admin@objectos.ai unless stated.

Duplicate check

Dedupe words: drag and drop announcement internal ids · dnd-kit announcements localized

Filed by Claude Code (session session_01D76mrPJrSSdaKRxR2rvrMG) from that QA pass.


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    on Oct 7, 2026
  2. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: write metadata — the form designer by keyboard and screen reader | 缺项 | P3

    Triage: first grade, bug · priority:p3 · domain:ui · area:studio · pm:queue. Direction as the body proposes

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-07T17:26Z. ⛔ Not a claim, ⛔ not a dispatch.

    Triage: lands in the form designer's drag-and-drop context (its dnd-kit live-region announcements) ⇒ domain:ui; rationale: a Studio or console surface in objectui. Filed from the browser QA pass of 2026-10-07 (objectstack 879bd38c, objectui 179f6fe9); paths re-read on objectui main 9990f9e122.

    • Why p3: a screen-reader user hears internal ids; the move itself works.
    • Direction:
      • pass localized announcements that name the field label, the group label and the position
    • Clause-②: no. Patch changeset in objectui.
  3. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 8
    Session: session_01DrKzdPdyLLBW3qpZ4vtk7z
    Account: huangyiirene
    Branch: claude/issue-11802-form-dnd-announcements
    Worktree: objectui-issue-11802
    Domain: domain:ui
    Seat: domain:ui#1
    File surface (line numbers on 5aa7f55):

    • packages/app-shell/src/views/studio-design/ObjectFormDesigner.tsx: the DndContext props only (about :573–:620). Add an accessibility prop with localized announcements and screen-reader instructions, naming the field label, the group label and the position.
    • One new module-private announcements helper beside it, if the context's props grow past a few lines.
    • New engine.studio.formDnd.* rows of packages/app-shell/src/views/metadata-admin/i18n.ts, EN and ZH.
    • The tests beside these, and .changeset/11802-*.md.

    ⛔ Not on it:

    • Seat 2's objectui#11781 (claim 6049679587): the "Drag to reorder … click a field to edit its properties" hint, wherever it renders (engine.studio.designer.hint), and the Form tab's layout caption.
    • isKeptOffLayout and the designer's layout model, as objectui#11780 left them. The drag handlers' behaviour (onDragStart / onDragOver / onDragEnd) does not change.
    • @dnd-kit/* versions, and any package.json change.
    • packages/components/src/ui/** and packages/i18n/**.

    Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
    Container & model: M, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui over these paths: no path-derived mandate; default tier)
    Clause-②: no
    Responsibility: objectui app-shell Studio: the form designer's DndContext passes no announcements, so dnd-kit reads its internal ids ("Draggable item f:name was dropped over droppable area g:new_group") to screen-reader users, in English whatever the locale | the platform path is right: dnd-kit takes localized announcements through DndContext's accessibility prop | every screen-reader user arranging a form in Studio, measured by the filer in the 2026-10-07 QA pass
    Thread-read: 6043167024
    Serial constraints cleared: none blocking.

    Why Clause-②: no: the announcements are a prop of a module-internal component's DndContext. No export, prop, @object-ui/types member, accepted input or packages/i18n key is added. App-shell's ENGINE_STRINGS are unexported.

  4. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 11802,
      "status": "done",
      "branch": "claude/issue-11802-form-dnd-announcements",
      "pr": "https://github.com/objectstack-ai/objectui/pull/11869",
      "session": "session_01DrKzdPdyLLBW3qpZ4vtk7z — the session the PM claim comment 6050699288 names (subagent run; the parent session id)",
      "premise_still_valid": true,
      "summary": "Studio's form designer DndContext now takes accessibility={dndAccessibility}: localized (en, zh) onDragStart / onDragOver / onDragEnd / onDragCancel announcements and screen-reader instructions under engine.studio.formDnd.*, built by a new module-private helper formDndAnnouncements.ts. Every sentence names the field and group through the resolvers the cards and section headers render from (fieldLabelOf, labelOf) and the place as 'N of M' inside the group, read off the container map onDragEnd reads with onDragEnd's own arithmetic (dropPlaceIn), so the announced place is the committed one; a sentence repeating the place the region already named is skipped (it used to overwrite the pick-up sentence). Drag handlers, layout model, isKeptOffLayout, sensors and collision detection are unchanged; no export, prop, types member, package.json or packages/i18n key. Draft PR objectui#11869; card assignee untouched, PR assignee and labels left to the seat (zero label/assign writes).",
      "tests": "HEAD the gate union ran on: 8f5fb15 (git rev-parse --short HEAD). Commits: 76d637f (fix + pins + changeset), 8f5fb15 (refactor: the announcements close over the render values instead of reading refs, removing a react-hooks/refs warning the first cut added). | GATES (command -> exit -> verdict line), all on 8f5fb15 unless noted: | pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build (os-verify-lock) -> 0 -> 'VERDICT command-exit 0'; 28 packages 'build: Done', scope 29 (@object-ui/test-support has no build script). Ran while HEAD was 76d637f; the closure excludes app-shell, so the refactor cannot move it. | pnpm --filter @object-ui/app-shell type-check (os-verify-lock) -> 0 -> 'TYPECHECK_EXIT=0' (script echo '> tsc --noEmit && tsc -p tsconfig.test.json'); tsc -p tsconfig.test.json --listFiles lists ObjectFormDesigner.dndAnnouncements-11802.test.tsx, formDndAnnouncements.ts, ObjectFormDesigner.tsx. | pnpm exec vitest run --maxWorkers=2 over ObjectFormDesigner.test.tsx, ObjectFormDesigner.dndAnnouncements-11802.test.tsx, DataPillar.hiddenSystemFields-11780.test.tsx (the existing move test, control), StudioDesignSurface.formFields.test.tsx, select-placeholder-literal-11252.test.ts, block-config-i18n.test.ts, scripts/__tests__/check-i18n-en-drift.test.ts, scripts/__tests__/check-i18n-dead-keys.test.ts (os-verify-lock) -> 0 -> 'Test Files 8 passed (8) / Tests 247 passed (247)'. | pnpm exec eslint --no-inline-config --format json on the 4 touched source files -> 0 -> 4 files, 0 errors, 1 warning react-hooks/set-state-in-effect (the base file carries the same one). Narrowed lint, declared: population = app-shell's own 'eslint .' under root eslint.config.js; file count 4 read from --format json; invariance: eslint.config.js has no parserOptions/projectService (type-aware linting off), so the diff cannot move a verdict on an untouched file. | pnpm check:control-bytes -> 0 -> 'check-control-bytes: OK'; check:new-line-citations -> 0 -> 'VERDICT new-cross-file-line-citations: 0 new citation(s)'; check:changeset-claims -> 0 -> 'No pending changeset names a file this change touches.'; check:pending-changeset-literals -> 0 -> 'No test source names a pending changeset.'; check:i18n-designer-parity -> 0 -> 'Every en row has a zh row, and every shared row carries the same placeholders.' | Derived from the diff (objectui package.json + .github/workflows, by hand: objectui has no dispatch-gates.mjs): check:vi-mock-specifiers / check:vi-mock-inherit / check:vi-mock-override-shape / check:test-path-roots -> 0 each -> OK; check:i18n-keys -> 0; check:i18n-drift -> 0 -> 'No designer-table en value changed in this range.'; check:esm-specifiers -> 0 (specifier leg only, as the script runs it); check:self-import, check:phantom-deps, check:unreferenced-sources -> 0 each -> OK; node scripts/check-changeset-presence.mjs -> 0 -> '4 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'; pnpm changeset:check -> 0 -> 'No changeset declares a major bump.'; node scripts/check-changeset-overwrite.mjs -> 0; check:handler-key-reads, check:metadata-write-doors -> 0 each -> OK; node scripts/check-type-check-coverage.mjs -> 0 -> '43/43 packages compile their tests'; node scripts/check-lint-coverage.mjs -> 0 -> '46/46 packages linted'; node scripts/check-governed-queue-guard.mjs --test (5 paths) -> 0 -> 'NOT GOVERNED'. pnpm check:i18n-dead-keys (report-only) -> 0, no engine.studio.formDnd.* key listed. | PINS: ObjectFormDesigner.dndAnnouncements-11802.test.tsx, 8 cases on the REAL live region and instructions (real DndContext, sensors, handlers; only collisionDetection replaced by an x-band test geometry because happy-dom measures every box as zero). Headline: 'Name moved to New group, position 1 of 1.' and '名称 已移到 新分组,第 1 个,共 1 个。'; start/over/end/cancel each by label; no sentence matches the f:/g: id pattern. CONTROL on every drop: the announced place equals the place the committed fields give the field; DataPillar.hiddenSystemFields-11780 write-back drop green and unchanged. | REVERSE CHECK (fix committed; run on 76d637f and again on 8f5fb15, both under os-verify-lock with trap restore): ObjectFormDesigner.tsx checked out from base 5aa7f55; marker 'accessibility={dndAccessibility}' 1 -> 0 on disk; mutated blob 1b49b48 = base blob; 8 of 8 pins red in the predicted direction, first: expected 'Picked up Name. It is in Ungrouped, position 1 of 2.', received 'Picked up draggable item f:name.'; restored by git checkout HEAD --, restored blob 233eb78 = HEAD blob, git diff HEAD and --cached empty. No permanent mutation test kept. | H1 confirmed: one DndContext in the designer (no other dnd context in packages/app-shell/src; each section's SortableContext sits inside it). Ids: fields are sortables 'f:' + field name (draggable and droppable), sections droppables 'g:' + group key including 'g:__ungrouped__'; sections are not draggable (button moves). | H2 confirmed: entryByName + fieldLabelOf (cards) and labelOf (section headers) exist; reused, no second map. | H3 corrected: dnd-kit's LiveRegion is role=status, aria-live=assertive, aria-atomic=true, and NOT debounced (announce is a plain setState; each sentence replaces the last). Kept position on every over (what a keyboard user needs per arrow key), skipped only same-place repeats. | REAL-BROWSER reading (Chromium /opt/pw-browsers/chromium, dev-only harness mounting ObjectFormDesigner in the console Vite dev server on port 5311, MutationObserver with characterDataOldValue; harness never committed and deleted, server stopped by PID). Before (base): pointer drag Name -> New group gave 7 texts with ids: 'Picked up draggable item f:name.' / 'over droppable area f:name' / 'over g:__ungrouped__' / 'no longer over a droppable area' / 'over g:new_group' / 'over f:name' / 'dropped over droppable area f:name'; the pick-up sentence and 'over g:new_group' were each replaced before the observer's next callback. After (8f5fb15): 'Picked up Name. It is in Ungrouped, position 1 of 2.' / 'Name is over Ungrouped, position 2 of 2.' / 'Name is not over a group.' / 'Name is over New group, position 1 of 1.' / 'Name moved to New group, position 1 of 1.' (5 texts, each about 100 ms or more apart); zh identical shape ('名称 已移到 新分组,第 1 个,共 1 个。'); draft name@new_group. Cross-group onto a field: ended 'Industry moved to Contact, position 1 of 2.', draft industry first in contact; that 1.3 s drag gave 9 texts, two pairs about 20 ms apart while cards shifted. Keyboard: pick-up and cancel by label; a keyboard drop finds no target (finding 1). | FILES CHANGED: packages/app-shell/src/views/studio-design/ObjectFormDesigner.tsx (import; module-level placeIn/dropPlaceIn beside the id helpers; dndAccessibility useMemo; accessibility prop on DndContext); packages/app-shell/src/views/studio-design/formDndAnnouncements.ts (new, module-private); packages/app-shell/src/views/metadata-admin/i18n.ts (7 engine.studio.formDnd.* rows, en and zh); packages/app-shell/src/views/studio-design/ObjectFormDesigner.dndAnnouncements-11802.test.tsx (new); .changeset/11802-form-dnd-announcements.md (@object-ui/app-shell patch). All inside the claim's file surface; the dropPlaceIn/placeIn helpers and the useMemo sit in ObjectFormDesigner.tsx outside the literal DndContext props span, read as the claim's 'announcements helper beside it'; handlers untouched. | DEVIATIONS: (1) a second commit after the first push (refs -> render closures) to avoid adding a react-hooks/refs lint warning; every gate re-ran on 8f5fb15. (2) Commit trailers are the model-free pair (Claude-Session + Co-authored-by: Claude) per objectui AGENTS.md, not the harness reminder's model-named Co-Authored-By; PR footer is the os-dev session-URL form, not the harness reminder's form. (3) The browser reading used a dev-only harness, not a booted Studio with a backend. (4) Narrowed lint as declared above; repo-wide lint and the test farm are CI's. CI ON 8f5fb15, read once, not awaited: Lint, Build & E2E, Changeset Declaration, Governed Surface Queue Guard and the other finished checks success; Test shards, Type Check and Spec Main Shape Gate in_progress; Bundle Analysis FAILURE, which its own PR comment calls a superseded ceiling, not a size regression ('This is not a budget violation ... Nothing grew'; aggregate, per-chunk, membership and headroom halves all pass): objectui#11798's PR #11852 changed scripts/check-eager-closure-budget.mjs on main after base 5aa7f55. git merge-tree of HEAD with current main exits 0 (clean, although main also edited metadata-admin/i18n.ts). The gate's remedy is updating the branch onto main (the seat's update-branch), never widening a ceiling; not done here.",
      "mcp_calls": "0 — no MCP GitHub tool called",
      "api_writes": "2 — (1) pr_create via scripts/pm/fleet-write/dispatch.mjs: POST /repos/objectstack-ai/objectstack/dispatches (HTTP 204) -> relay run 37719603864 -> POST /repos/objectstack-ai/objectui/pulls (draft, objectui#11869; read-back 10344 bytes sent = stored, identical); (2) this os-dev-report via scripts/pm/post-stamped.mjs: POST /repos/objectstack-ai/objectui/issues/11802/comments. git push of the one branch (empty-branch probe + 2 commits) is not REST. Zero label, assignee or PATCH writes.",
      "open_questions": [
        {
          "question": "The localized screen-reader instructions keep dnd-kit's own content (pick up with Space or Enter, move with the arrow keys, drop with Space or Enter, Escape cancels), but a keyboard drag in this designer never reaches a drop target (finding 1), so the arrow-key promise cannot land today. Keep them as written, or reword them until the keyboard path works?",
          "options": [
            "A keep the instructions faithful to the KeyboardSensor the designer installs, and land the keyboard fix (finding 1) as its own card",
            "B reword them now to drop the arrow-key promise, and restore it when the keyboard path is fixed"
          ],
          "recommendation": "A, because the copy then describes the contract the designer means to offer, B writes a defect into user-visible text that needs a second rewrite later, and the fix for finding 1 is one collision-detection change on the same DndContext."
        }
      ],
      "out_of_scope_findings": [
        "class: a · reach: real Chromium on the dev-only harness mounting the same ObjectFormDesigner the Studio Form tab mounts (readOnly false, sensors on; Studio itself not booted): focus card 'Industry', Space, ArrowDown x3, Space -> draft unchanged; the base live region said 'Picked up draggable item f:industry.' then 'Draggable item f:industry was dropped.' with no droppable · evidence: the DndContext's collisionDetection is pointerWithin, which returns no collision when pointerCoordinates is null; dnd-kit derives pointer coordinates from the activator event via getEventCoordinates, which returns null for a KeyboardEvent, so over stays null for every keyboard drag and onDragEnd returns without committing; keyboard-only and screen-reader users cannot move a field within or between groups · fix shape: a collision detection that answers for the keyboard (for example closestCenter when there are no pointer coordinates); changes drag behaviour, so outside this card's ruling · dedupe words: form designer keyboard drag no drop target · pointerWithin keyboard sensor · Studio keyboard reorder fields · dnd-kit keyboard over null",
        "class: a (user-facing untranslated copy read to screen-reader users) · reach: real Chromium on the same harness, zh locale: every field card carries aria-roledescription='sortable' in English (the useSortable default roleDescription in SortableField), read with the card on focus · evidence: dnd-kit sortable sets roleDescription 'sortable' unless useSortable gets attributes.roleDescription; SortableField passes none; outside this card's DndContext-props fence · dedupe words: aria-roledescription sortable English · form designer card role description localized · useSortable roleDescription"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT — PR objectui#11869 (head 8f5fb15) · the open question ruled A

    domain:ui seat 1 · session_01DrKzdPdyLLBW3qpZ4vtk7z · reviewed against the PR's file list and diff hunks, git merge-tree, its check runs and the dev's report 6051238904, read 2026-10-08T03:00Z.

    • Shape: draft → main. The first line is Fixes #11802, and Clause-②: no starts a later line.
    • Scope: 5 files, +449/−0, inside claim 6050699288's surface.
      • ObjectFormDesigner.tsx (+69):

        • an import;
        • module-level placeIn / dropPlaceIn beside the id helpers;
        • a dndAccessibility memo;
        • the accessibility prop on the DndContext.

        Drag handlers, sensors, collision detection, the layout model and isKeptOffLayout are unchanged.

      • Other files:

        • a new module-private formDndAnnouncements.ts;
        • 7 engine.studio.formDnd.* rows, EN and ZH;
        • one pin file;
        • the changeset.
      • Seat 2's objectui#11781 hint is not touched.

    • Clause-② re-read: the new exports (FormDndSlot, FormDndLookups, FormDndAccessibility, formDndAccessibility) are module-level in a new module that packages/app-shell/src/index.ts does not name. no holds.
    • Mechanism (measured):
      • Every sentence names the field and the group through the resolvers the cards and section headers render from (fieldLabelOf, labelOf).
      • The place is "N of M", computed by onDragEnd's own arithmetic, so the announced place is the committed one.
      • H3 corrected: dnd-kit's live region is aria-live=assertive and not debounced. A sentence that repeats the place already announced is skipped.
    • Tests:
      • Pins: 8 pins on the real live region. Headline: "Name moved to New group, position 1 of 1." and "名称 已移到 新分组,第 1 个,共 1 个。". No sentence carries an f: or g: id.
      • Control: the place announced on every drop equals the committed one, and objectui#11780's drop write-back stays green.
      • Reverse check: 8 of 8 pins went red as predicted ("Picked up draggable item f:name."). The restore was proven by blob hash.
      • Real browser: the base read 7 id-bearing texts, and the head reads 5 labelled ones.
    • Open question ruled A: the screen-reader instructions stay faithful to the KeyboardSensor the designer installs. The broken keyboard path is fixed on its own card, not hidden in copy.
    • CI at 8f5fb15: Bundle Analysis is red on a superseded ceiling, not a size regression. Its own comment says "Nothing grew", and every measured half passes.
      • objectui#11852 (5d69133) lowered the ceiling after this branch's base 5aa7f55.
      • The dev merges main in (a merge commit) and pushes. The PR is queued once CI on that head is green.
      • An in-memory git merge-tree is clean against main and against objectui#11868.
    • Filed from the dev's findings:
      • objectui#11871: a keyboard drag never reaches a drop target. pointerWithin answers nothing without pointer coordinates.
      • objectui#11872: every field card's aria-roledescription is English "sortable".
    • PR assignee: set by this seat to huangyiirene.

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Heads-up from domain:ui seat 2 (session_01MgfduSkFrfM3eorB3UGfAU) · 2026-10-08T03:12Z. ⛔ Not a claim, and no request to change this card's scope.

    This seat's PR objectui#11874 (objectui#11781, ACCEPTed) also edits packages/app-shell/src/views/studio-design/ObjectFormDesigner.tsx. Its hunks are in SortableField (about :158–:191), Section (about :345) and the designer hint (about :546–:560). There, a read-only package's field cards drop "drag to reorder" from their accessible name, along with the grab cursor and drag handle. That is disjoint from this card's DndContext props (claim 6050699288).

    • Whichever of PR objectui#11874 and PR objectui#11869 lands second merges main.
    • After objectui#11874 lands, a field card's accessible name on a read-only package reads {label} — click to view properties. An announcement that names the card should read naturally beside it.

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report (revision 1)

    {
      "issue": 11802,
      "status": "done",
      "revision": 1,
      "branch": "claude/issue-11802-form-dnd-announcements",
      "pr": "https://github.com/objectstack-ai/objectui/pull/11869",
      "session": "session_01DrKzdPdyLLBW3qpZ4vtk7z",
      "premise_still_valid": true,
      "head": "826b4a5",
      "merge_commit": "826b4a5 = merge (no-ff, no rebase) of origin/main 456238c into 8f5fb15; parents 8f5fb15 and 456238c; 5d69133 (objectui#11852, the replaced eager-closure ceilings) is an ancestor (merge-base --is-ancestor exit 0). i18n.ts auto-merged without conflict. Branch diff against main after the merge: the same 5 files, 449 insertions, as before. No package.json or lockfile change on main, so no install; plugin-charts (in app-shell closure, changed on main) rebuilt before the type-check.",
      "summary": "Merged current main into the branch with a merge commit so Bundle Analysis weighs it against the ceilings in force, re-ran the named gates on the merge head, pushed to the same branch. No code, copy, PR body or label change. Ruling A on the open question noted: instructions stay as written.",
      "tests": "pnpm --filter @object-ui/plugin-charts build (os-verify-lock) -> 0 -> VERDICT command-exit 0 | pnpm exec vitest run --maxWorkers=2 ObjectFormDesigner.dndAnnouncements-11802.test.tsx ObjectFormDesigner.test.tsx (os-verify-lock) -> 0 -> Test Files 2 passed (2) / Tests 23 passed (23) | pnpm --filter @object-ui/app-shell type-check (os-verify-lock) -> 0 -> script echo tsc --noEmit && tsc -p tsconfig.test.json, VERDICT command-exit 0 | pnpm check:i18n-designer-parity (os-verify-lock) -> 0 -> Every en row has a zh row, and every shared row carries the same placeholders. | pnpm check:control-bytes (os-verify-lock) -> 0 -> check-control-bytes: OK (scanned 7858 tracked text file(s); skipped 85 binary). | pnpm check:changeset-claims (os-verify-lock) -> 0 -> No pending changeset names a file this change touches. | All on 826b4a5. CI on the new head not read or awaited (Bundle Analysis re-run is the seat's to read).",
      "mcp_calls": "0",
      "api_writes": "1 this round: POST /repos/objectstack-ai/objectui/issues/11802/comments (this revision, via post-stamped.mjs relay). git push 8f5fb15..826b4a5 is the same push budget item, not REST. Run total: 3 (pr_create, os-dev-report, this revision).",
      "open_questions": [],
      "out_of_scope_findings": [
        "Unchanged from the os-dev-report; per the PM, the seat files finding 1 (keyboard drag finds no drop target) and finding 2 (aria-roledescription sortable in English) as their own cards."
      ]
    }

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR objectui#11869 → main 33e3583

    domain:ui seat 1 · session_01DrKzdPdyLLBW3qpZ4vtk7z · verified 2026-10-08T04:03Z.

    • Merged through the merge queue at 2026-10-08T04:00:57Z, after it was queued at 2026-10-08T03:42:58Z.
      • CI on head 826b4a5 before queueing: 40 of 43 check runs passed, and the 3 skipped are the expected ones.
      • check-governed-merges.mjs: not governed, +449/−0.
    • Content check:
      • 33e3583 is one squash commit on parent bee5d6f. It changes 5 files, +449, the same as the PR.
      • 3 files are blob-identical to the reviewed head 826b4a5. ObjectFormDesigner.tsx's per-file patch-id matches (00f50280…).
      • i18n.ts: the default patch-id differs only in its context lines. objectui#11868 (bee5d6f) landed rows beside this PR's 14 engine.studio.formDnd.* rows.
        • Compared without context (-U0), the added and removed lines are identical, and so is the patch-id (c105ff23…).
        • The whole diff's -U0 patch-id matches too (62dd2d71…).
      • The landed bytes are the reviewed change.
    • Card: closed completed by the PR's Fixes. pm:dispatched was removed and read back.
    • Follow-ups filed from this card:
      • objectui#11871: a keyboard drag never reaches a drop target;
      • objectui#11872: aria-roledescription is left in English.

    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 portalbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions