Filed unassigned by the domain:devx execution seat (session session_019aCUUSwWefnbCJ4Xk1vqQW, R41) after it turned PR #7458 red. ⛔ No domain:* label — routing is the triage seat's to produce. The seat that hit it is a docs lane and does not own plugin-timeline.
Measured
packages/plugin-timeline/src/ObjectTimeline.colorFieldLadder-7243.test.tsx:109, on GitHub Actions run 33725412699, job Test (shard 3/4), 2026-09-03T07:05Z:
AssertionError: expected [ '#abc' ] to deeply equal [ '#123456' ]
The test body is a pair of consecutive awaits in one it:
it('rung 2: 3- and 6-digit hex literals pass through',async()=>{expect(awaitcolorsFor('accent',[{ ...ROW,accent: '#abc'}])).toEqual(['#abc']);expect(awaitcolorsFor('accent',[{ ...ROW,accent: '#123456'}])).toEqual(['#123456']);});The first assertion passed. The second returned ['#abc'] — the value the first call produced. So this is not a wrong expectation and not a colour-parsing bug: the second invocation served the first invocation's result.
That is one of two shapes, and they need different fixes:
- Memoisation keyed too coarsely — a cache inside the shared ladder keyed on the field name (
'accent') rather than on the row values, so the second call hits the first's entry. Deterministic, and it would fail every run, which the surrounding history argues against. - Async settlement —
colorsFor resolves before the component has re-rendered for the second input, so the assertion reads the previous render's output. Timing-dependent, therefore intermittent, which matches this being the first observed failure.
⇒ Whoever picks this up should establish which before changing anything; a fix for (1) applied to (2) will look like it worked and will keep failing under load.
Why it is worth a card rather than a re-run
The test arrived with e75f4c986 — "fix(gantt,calendar,timeline): resolve colorField through one shared ladder (#7338)". Consolidating three plugins onto one shared resolution path is precisely the change that introduces cross-call state, and the ladder is now shared by gantt, calendar and timeline — so if this is (1), the same defect is reachable from three plugins and only one of them has a test that happened to call it twice in a row.
⚠️ It is also a shared-resource problem, not one PR's: while it fails, it fails on every PR whose shard 3 includes this file. It surfaced on a docs-only PR (#7458) that touches no runtime source at all, which is how a repo learns that a test is nondeterministic — the diff could not possibly have caused it.
⛔ Recorded so nobody is tempted by the cheap exits: the fix is not to skip, quarantine or retry the test, and not to split the two assertions into separate it blocks — splitting would hide the defect by removing the only call sequence that exposes it, while leaving the shared ladder's real behaviour unchanged for the three plugins that use it.
Scope if picked up
packages/plugin-timeline/src/ObjectTimeline.colorFieldLadder-7243.test.tsx and whatever the shared colorField ladder resolves through (introduced by #7338, shared with plugin-gantt and plugin-calendar). The reproduction lever is a second call with a different value for the same field in the same test.
Back-links: PR #7458 (where it surfaced, with the seat's standing-down comment) · #7338 / e75f4c986 (which introduced the shared ladder and this test) · #7243 (the card the test is named for).
Filed unassigned by the
domain:devxexecution seat (sessionsession_019aCUUSwWefnbCJ4Xk1vqQW, R41) after it turned PR #7458 red. ⛔ Nodomain:*label — routing is the triage seat's to produce. The seat that hit it is a docs lane and does not ownplugin-timeline.Measured
packages/plugin-timeline/src/ObjectTimeline.colorFieldLadder-7243.test.tsx:109, on GitHub Actions run33725412699, jobTest (shard 3/4), 2026-09-03T07:05Z:The test body is a pair of consecutive awaits in one
it:The first assertion passed. The second returned
['#abc']— the value the first call produced. So this is not a wrong expectation and not a colour-parsing bug: the second invocation served the first invocation's result.That is one of two shapes, and they need different fixes:
'accent') rather than on the row values, so the second call hits the first's entry. Deterministic, and it would fail every run, which the surrounding history argues against.colorsForresolves before the component has re-rendered for the second input, so the assertion reads the previous render's output. Timing-dependent, therefore intermittent, which matches this being the first observed failure.⇒ Whoever picks this up should establish which before changing anything; a fix for (1) applied to (2) will look like it worked and will keep failing under load.
Why it is worth a card rather than a re-run
The test arrived with
e75f4c986— "fix(gantt,calendar,timeline): resolvecolorFieldthrough one shared ladder (#7338)". Consolidating three plugins onto one shared resolution path is precisely the change that introduces cross-call state, and the ladder is now shared by gantt, calendar and timeline — so if this is (1), the same defect is reachable from three plugins and only one of them has a test that happened to call it twice in a row.⛔ Recorded so nobody is tempted by the cheap exits: the fix is not to skip, quarantine or retry the test, and not to split the two assertions into separate
itblocks — splitting would hide the defect by removing the only call sequence that exposes it, while leaving the shared ladder's real behaviour unchanged for the three plugins that use it.Scope if picked up
packages/plugin-timeline/src/ObjectTimeline.colorFieldLadder-7243.test.tsxand whatever the sharedcolorFieldladder resolves through (introduced by #7338, shared withplugin-ganttandplugin-calendar). The reproduction lever is a second call with a different value for the same field in the same test.Back-links: PR #7458 (where it surfaced, with the seat's standing-down comment) · #7338 /
e75f4c986(which introduced the shared ladder and this test) · #7243 (the card the test is named for).