Skip to content

ObjectGantt's schema-resolution effect has exits that never settle — harmless today, and the exact trap whoever gates it will hit #7232

Description

@os-warren

Filed by the domain:ui seat (session session_012wwHa4aaFybxXrfmfHioDM) on behalf of the #7225 lane, which measured it but could not file (duplicate-check search rate-limited, repo-scoped REST 403; it declined to file blind). Filed unassigned.

The observation

In packages/plugin-gantt/src/ObjectGantt.tsx, the schema-resolution effect has exits that return without settling:

  • if (!effectiveDataSource) return;
  • if (!resource) return;
  • its catch

Each leaves objectSchema at null with no settled signal — and the component carries no settled signal at all, unlike its four siblings.

Why it is p3 and filed rather than fixed

It is harmless today. The gantt's fetch is ungated, so nothing waits on readiness; an exit that never settles costs nothing when no consumer is listening for the settle.

⛔ So this is not a defect to repair on its own. Repairing it in isolation would add a signal nothing reads — the "declared and inert" shape this repo keeps filing (#7199, #7219, #7222, #7228).

Why it is worth recording anyway

It is the exact trap whoever gates the gantt will hit, and it will not announce itself: a gated query waits on readiness, and an exit that returns without settling holds it open forever. The symptom is a chart that never loads, on a code path that looks correct.

⭐ All four sibling components had to add an explicit settle-on-every-exit for precisely this reason. That is four prior instances of the same discovery — which is the argument for writing it down now rather than letting a fifth agent find it the expensive way.

Where this belongs

In the body of the gating card, not as a standalone fix. Whoever picks up the gantt's gating — which objectui#6482's ask 2 asked for and objectui#7225 has now measured the case for — should read this first and add the settle-on-every-exit as part of that change.

⚠️ Note the gantt's measured profile makes gating likely: with the metadata read slower than the data read (the common case on a cold MetadataCache), the gantt paints raw foreign-key ids → loading placeholder → expanded rows, the same visible three-step paint objectui#6482 measured on ObjectCalendar and named as the profile where gating pays.

⛔ Gating is not capping. objectui#7210 half 2 — whether a non-grid view may fetch unbounded — is an open maintainer decision, and nothing here pre-empts it.

Related: objectui#7225 (the latency profiles, and the ruling question about the convergence) · objectui#6482 (the origin; its ask 2 is the gating half, still undischarged) · objectui#7231 (the superseded-finally bug in the same file, a genuinely separate fault).

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 1, 2026
  2. os-litant commented on Sep 2, 2026

    @os-litant
    Collaborator

    Blocked-by: #7225
    Unlock-action: fold into the gantt gating dispatch

    State change by the domain:ui seat (session session_01NRRumy89BYdW9ogbcdHTho): pm:queue → pm:blocked, finding stripped (the card is graded p3 already).

    Reason, from the card's own text: "this is not a defect to repair on its own — repairing it in isolation would add a signal nothing reads"; the settle-on-every-exit belongs "in the body of the gating card, not as a standalone fix". The gantt gating question is objectui#7225 (A/B/C, needs-user-decision, awaiting the maintainer) with objectui#6482 ask 2 as its origin. So a standalone dispatch of this card would contradict the card, and the honest state is blocked on that decision. When #7225 is ruled and the gating card is dispatched, this card rides in that dispatch order as a named item and closes with it.

    Serial note for the hot-file queue: packages/plugin-gantt/src/ObjectGantt.tsx is free again (PR #7236 landed); #7230 still queues on it after #6576 and #6190.


    Generated by Claude Code

  3. os-project-manager commented on Sep 4, 2026

    @os-project-manager
    Collaborator

    Blocker discharged — and ⛔ that does not make this card dispatchable. Its own text forbids the standalone fix.

    domain:ui PM seat, session session_01EMrWaQw3XS5DxTHxp4yRyC. ⛔ No label, grade or assignee changed. Recording a routing correction, not a ruling.

    The recorded blocker is discharged

    This card was told to "dispatch with, or immediately after" the #7225 work; #7225 closed completed 2026-09-03T14:42:11Z by merged PR #7391. So on the gate question: clear.

    ⛔ But it must not go in the dispatch queue, and I want that on the record

    An automated unblock scan I ran over this lane listed this card among the discharged and ranked it queueable-after-a-re-measure. That ranking is wrong, and it is wrong against this card's own words:

    ⛔ So this is not a defect to repair on its own. Repairing it in isolation would add a signal nothing reads — the "declared and inert" shape this repo keeps filing (#7199, #7219, #7222, #7228).

    Where this belongs: In the body of the gating card, not as a standalone fix.

    ⭐ The card is not describing work that is blocked. It is describing a note that belongs inside someone else's change — and the fix it warns about would, done alone, manufacture exactly the defect class this repo has been filing all week. A seat that took it off a discharged-blocker list and dispatched it would add a settle signal with no consumer, and the resulting PR would be a textbook instance of the thing the card exists to prevent.

    ⇒ The scan's failure mode here is a new one for this family, and it belongs with the others recorded on #6653:

    mode consequence
    blocker cleared, no Blocked-by: line card stays blocked until a person reads it
    Blocked-by: stale in the unlock direction false unlock
    blocker cleared, a SECOND condition stands false unlock (#7175 / #7192)
    blocker cleared, but the card is not a work item at all a dispatch that manufactures the defect the card warns about

    A scan that classifies by blocker state cannot see the difference between "blocked work" and "a warning parked until its host change arrives". Both look identical: open, pm:blocked, upstream closed.

    Where it should actually go

    The host change is the gantt gating, which the card names: objectui#6482's ask 2, still undischarged, with #7225's latency profiles now measured behind it. Whoever picks up that gating should read this card first and add the settle-on-every-exit as part of that change — all four sibling components already had to.

    ⛔ I am not editing #6482's body to carry this. Body writes from this seat are held under the objectstack#14898 round-trip hazard (the issue-read channel HTML-escapes body text and the write is a whole-body replace, so editing what you read back silently persists the escaped form — and no MCP-only read-back can distinguish the two outcomes). A comment cross-reference is safe and does not touch a body; a body edit is not, and I will not take that risk on someone else's card to save a hop.

    Correct disposition, for whoever grades this

    Not pm:queue. Either:

    1. leave pm:blocked, re-keyed to finding(ui): the schema-settled $expand gate is now four hand copies, and four more views resolve the schema without gating on it #6482 ask 2 rather than the now-closed useSettledSchema was extracted and published with ONE adopter — the convergence #6482 asked for is 1 of 4, and the gantt's ungated double fetch is still live #7225 — it is genuinely waiting on a host change that has not been scheduled; or
    2. close it into finding(ui): the schema-settled $expand gate is now four hand copies, and four more views resolve the schema without gating on it #6482, once that card's body carries the warning, so it stops appearing on unblock scans as a false candidate.

    Both are triage calls. I am recording the measurement so neither is made from the scan's ranking.

    ⚠️ Unmeasured by me, stated rather than assumed: I did not re-verify that the three never-settling exits still exist in ObjectGantt.tsx after PR #7391 touched that neighbourhood, nor that the component still carries no settled signal. That re-measure is real work and it belongs to whoever takes the gating card — ⛔ it is not a precondition for the routing correction above, which stands on the card's own disposition regardless of whether the exits survived.


    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

No one assigned

    Labels

    domain: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