You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
finding(plugin-timeline): a gantt row that is a non-null primitive or an array (items: [0], ['x'], [true], [[]]) draws an unlabelled empty row silently — while validate now refuses it #7364
Found while implementing #7164 (maintainer ruling A+). Not repaired there: the ruling fixed the render-time door at exactly three shapes — items not an array, a null row, a row whose items is a truthy non-array — and required the card's CONTROL rows, which include items: [0] and items: [[]], to keep DRAWING. So this corner was deliberately left as measured, and it is recorded here rather than widened silently.
What is wrong
A row that is a non-null primitive or an array has no .items and no .label, so the gantt walk reads undefined off it and draws an EMPTY, UNLABELLED row. Nothing tells the author. Measured in render through the real TimelineRenderer, on a67abdc88 (main) and on the #7164 branch at 8e1dc8274 — identical readings:
(items: ['x'] and items: [true] take the same path: 'x'.items and true.items are undefined.) That is consumer-side tolerance of the kind #6750 / #6759 refused elsewhere on this branch: authored content that is not a row is dropped without a word.
After #7164, validate REFUSES every one of these at authoring time (items[0]: expected object, received number / received array), so the declared accept set and the rendered one disagree in this corner. The direction is the safe one — the renderer is more lenient than validate, never the reverse, and it does not crash — but declared and rendered still differ.
B — leave it: validate is the door that matters at authoring, and the renderer's leniency here is harmless.
Recommendation: A, on the family's refuse-not-tolerate principle (#6750, #6759, #7164) — an AI-authored document that emits a scalar where a row belongs should be told so on screen, not shown a blank row.
Blocked-by: #7164 (the predicate and the key both land there).
Found while implementing #7164 (maintainer ruling A+). Not repaired there: the ruling fixed the render-time door at exactly three shapes —
itemsnot an array, anullrow, a row whoseitemsis a truthy non-array — and required the card's CONTROL rows, which includeitems: [0]anditems: [[]], to keep DRAWING. So this corner was deliberately left as measured, and it is recorded here rather than widened silently.What is wrong
A row that is a non-null primitive or an array has no
.itemsand no.label, so the gantt walk readsundefinedoff it and draws an EMPTY, UNLABELLED row. Nothing tells the author. Measured in render through the realTimelineRenderer, ona67abdc88(main) and on the #7164 branch at8e1dc8274— identical readings:(
items: ['x']anditems: [true]take the same path:'x'.itemsandtrue.itemsareundefined.) That is consumer-side tolerance of the kind #6750 / #6759 refused elsewhere on this branch: authored content that is not a row is dropped without a word.After #7164,
validateREFUSES every one of these at authoring time (items[0]: expected object, received number/received array), so the declared accept set and the rendered one disagree in this corner. The direction is the safe one — the renderer is more lenient thanvalidate, never the reverse, and it does not crash — but declared and rendered still differ.Options
timeline.gantt.unusableRange.malformedRowkey finding(plugin-timeline): a gantt row that isnull, or whoseitemsis a truthy non-array, crashes the render —findUnusableGanttDatereads the walk defensively andcalculateDateRangereads it bare #7164 added: changeclassifyGanttRows's row predicate fromrow == nullto "not an object", and the existing copy already reads correctly (items[0] is 0, which is not a row shape). One predicate, no new key, no new packs. It changes the render accept set beyond the A+ ruling, so it is a ruling, not a dev's call.validateis the door that matters at authoring, and the renderer's leniency here is harmless.Recommendation: A, on the family's refuse-not-tolerate principle (#6750, #6759, #7164) — an AI-authored document that emits a scalar where a row belongs should be told so on screen, not shown a blank row.
Blocked-by: #7164 (the predicate and the key both land there).