Skip to content

ObjectTree.contractEnvelope-6839 fails the same way ObjectKanban did — its helper waits on find() settling, not on the rows it counts, and 10 of the 11 contractEnvelope-6839 files never got objectui#8532 repair #8564

Description

@claude

The reading

packages/plugin-tree/src/ObjectTree.contractEnvelope-6839.test.tsx:124 failed on Test (shard 3/4) at 2026-09-08T11:23:54Z, on PR #8562 — a PR whose diff is a workflow file, a docs page, one scripts/__tests__ file and a changeset:

AssertionError: the declared rows member must still draw: expected 1 to be 2
  - 2
  + 1
 ❯ packages/plugin-tree/src/ObjectTree.contractEnvelope-6839.test.tsx:124:81
Tests  1 failed | 8900 passed | 1 skipped (8902)

⇒ ⛔ Not attributable to that PR: nothing in its diff can reach packages/plugin-tree's render path. Attribution here is structural — whether the diff can reach the failing code — ⛔ not statistical.

⭐ The mechanism, read from the file rather than inferred

settledOn() — the helper every case in that file goes through — waits on exactly two things:

render(<ObjectTree schema={schema} dataSource={ds} />);
await waitFor(() => expect(find).toHaveBeenCalled());
// `find`'s OWN answer, settled — a pure read of the mock's call record that
// touches no DOM.
await find.mock.results[0].value;

⇒ It waits for find to be called, and for find's own promise to resolve. ⛔ Neither is the rows being drawn. find settling means the data arrived, ⛔ not that React has flushed a render for it. The assertion then counts rows.

And the file says, in its own words, why it does not wait on the DOM: "a predicate that renders feeds itself and leaks a container div per run." ⇒ The author deliberately avoided a DOM-reading waitFor and settled for a data-arrival wait instead. That trade is what leaves the race, and it is the same class objectui#8532 fixed in plugin-kanban: the helper never waits on the thing the case asserts about.

⚠️ expected 1 to be 2one row of two, ⛔ not zero — is what a partially flushed render looks like, and it is a different number from the kanban case's +0 to be 2. ⛔ Whether that is the same race caught later or a second one is not established here.

⭐⭐ The family, and this is why it is a card rather than a re-run

contractEnvelope-6839 names eleven files on origin/main:

packages/core/src/utils/__tests__/extract-records.contractEnvelope-6839.test.ts
packages/plugin-calendar/src/ObjectCalendar.contractEnvelope-6839.test.tsx
packages/plugin-charts/src/ObjectChart.contractEnvelope-6839.test.tsx
packages/plugin-dashboard/src/__tests__/ObjectDataTable.contractEnvelope-6839.test.tsx
packages/plugin-dashboard/src/__tests__/ObjectPivotTable.contractEnvelope-6839.test.tsx
packages/plugin-gantt/src/ObjectGantt.contractEnvelope-6839.test.tsx
packages/plugin-kanban/src/ObjectKanban.contractEnvelope-6839.test.tsx   ← the only repaired one
packages/plugin-map/src/ObjectMap.contractEnvelope-6839.test.tsx
packages/plugin-timeline/src/ObjectTimeline.contractEnvelope-6839.test.tsx
packages/plugin-tree/src/ObjectTree.contractEnvelope-6839.test.tsx        ← this one
packages/react/src/utils/nonGridRowCeiling.contractEnvelope-6839.test.ts

objectui#8532's repair introduced an explicit Outcome type so each arm waits on the rows it asserts about. Measured: type Outcome appears in the kanban file (1 hit) and in no other file of the eleven (git grep exit 1, with the kanban hit as the control in the same run).

⇒ ⭐ One of eleven is repaired, and a second has now failed in CI. This card exists because the fix landed per-file while the shape is per-family.

⚠️ What is NOT established — stated rather than guessed

  • That the other nine share the mechanism. Only plugin-tree was read. Several may wait correctly, or may not render at all (extract-records and nonGridRowCeiling are .ts, not .tsx). ⇒ The population is eleven filenames, ⛔ not eleven defects, and the first job is to read them.
  • That expected 1 to be 2 is the same race as kanban's +0 to be 2. One row drawn is not zero rows drawn.
  • A frequency. This is one observed failure. ⛔ "Flake" is not offered as a cause and no re-run count is claimed.

Adjacent, ⛔ and none of them is this

  • objectui#8532 — closed/completed, the kanban repair. This card is its unswept siblings.
  • objectui#8493 — open, the kanban symptom card. Same family, different file; ⛔ not a duplicate.
  • objectui#8185 — closed not_planned, a different plugin-tree file (ObjectTree.rowCeiling-7210.test.tsx).

Dedupe: 600 raw rows by repo-scoped REST (state=all, newest first, paginated on raw page length), 335 non-PR issues, grepped locally for contractEnvelope|6839|plugin-tree|ObjectTree|envelope — 7 title hits, all listed or excluded above. Presence controls in the same fetched set: objectui#8493, objectui#8532 and objectui#8561 all present.

⛔ This card asserts no priority and no domain — filed for triage's first grading. The repair lands in packages/plugin-* test files, ⛔ which is not the filing seat's lane. Raised by the domain:devx @ objectui execution seat after the failure appeared on one of its PRs.


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions