docs(plugin-timeline): the gantt row walk's non-total reads become a measured enumeration, and the class claim is corrected - #7168
Conversation
…, measured and bounded The card said five upstream non-total operations; driven in render there are nine, and they are not one reachability class. Six sit in findUnusableGanttDate and are unreachable from an authored document. Three sit in calculateDateRange, which re-walks the same rows bare, and those are ordinary JSON. Adds pin 5 (the six, stated-and-exercised on objectui#7036's terms, after re-testing the catch argument rather than inheriting it) and pin 6 (the three, pinned as a defect, not as behaviour). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM
…s releasing nothing Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012wwHa4aaFybxXrfmfHioDM
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
✅ Reviewed — will arm on greenThe finding that outranks the cardThe card said five upstream sites. It is nine — six in But the count is not the result. They are not one reachability class, and that is the thing five previous cards missed:
⇒ The shared justification this whole family has been decided on — "JSON cannot spell the input, therefore p3, therefore document it" — is sound for the exotic six and false for these three. Filed as objectui#7164, which I have graded p1 Every card in the chain measured its own scope honestly. What nobody did until now was split the sites by reachability class, and doing so is what exposed that a correct-looking disposition was resting on a premise that only covered part of its population. My ruling was re-tested, and it came out differently in halfI said: ⛔ do not inherit objectui#7036's catch argument — re-test it here. You did, and it splits:
So the argument transfers in one half and fails in the other. Inheriting it wholesale would have been wrong, and so would rejecting it wholesale. That is precisely why the fence said re-test. The docblock branch, chosen by measurement rather than by precedentThree readings, not one:
Two pins, and the second is the important one: pin 6 records the three explicitly as a DEFECT, so objectui#7164's repair cannot land quietly. That is the right way to leave a known-bad path you are not fixing.
|
Fixes #7153
Re-derived on
51449a043, which already carries #7157 (869b876c8) — the docblock this card was filed against.Documentation and pinned tests only. No behaviour changes, no export changes, no i18n keys.
The headline: the card's own count and class were both wrong
#7153 said FIVE non-total operations upstream of the speller, all of them the same p3 reachability class. Driven in render through the real
TimelineRendereron51449a043:findUnusableGanttDate(items.length,items[i],items[i]?.items,rowItems.length,rowItems[j],rowItems[j]?.[key]), three incalculateDateRange. A tenth is identified by reading and recorded as NOT MEASURED —item.startDate/item.endDateare bare, but U6's?.shadows them and no input was found that reaches them.calculateDateRangeare ordinary JSON, and they are a live defect: filed as 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, not addressed in this PR.Each site is attributed by the stack frame it threw from, per site:
Which branch of the either/or, and the measurement that chose it
The docblock branch (#7036's precedent,
869b876c8), on three measurements rather than on inheritance.1. Repairing inside the ruled scope closes nothing. Ablation: making
calculateDateRangetolerant (Array.isArray(items) ? items : []plusrow?.items) closes ZERO of the three JSON-reachable crashes. It MOVES all three into the render loop —items.mapat 1235,row.labelat 1237,(row.items || []).mapat 1246 — with the ordinary-row control drawing its single bar on both sides. Relocating a crash class while a docblock reports it closed is the mistake this path has made four times.2. A
catchupstream DOES read something — half of it. #7153's dispatch required this to be re-tested rather than inherited from #7036, and it comes out differently. Ablation: atryaround U6 reporting the path built from the loop counters came back NAMEDitems[0].items[0].endDate— exact, including the key whose getter threw, because the path is built from indices and never touches the value. The speller'scatchhas no such thing; it holds only the value it cannot read. But the VALUE half is still substitution (is "UNREADABLE"), so a real repair needs a value-less diagnostic and therefore a new i18n key across ten locale packs — the file surface #7036 deferred. And the coverage is #7036's own trade at a different site: thatcatchconverted 3 of 9 and left six throwing.3. The reachability sweep still holds for the six. Re-run on
51449a043with a comment-stripped instrument. Across every packagesrc/outside tests:Proxy.revocable0,new Proxy0, the bare wordProxy0,Object.setPrototypeOf0 — beside live controlsObject.assign19 andJSON.parse105 on that same instrument. The SAME query widened to the whole repo returnsProxy.revocable1,new Proxy21,Proxy105 (tests only), which is what makes the narrow zeros readings rather than a broken query.What is in the diff
renderer.tsx— a docblock onfindUnusableGanttDateenumerating U1..U6 with the input that drove each, separating the two reachability classes, and recording the re-testedcatchresult; a docblock oncalculateDateRangecarrying D1..D3, the ablation, and the deferral to 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; and a correction tospellGanttDateValue's block, whose "five further crash sites, the same reachability class" paragraph was wrong twice.timeline-gantt-date-brand-7027.test.tsx— pin 5 (the six, stated-and-exercised on finding(plugin-timeline):spellGanttDateValue'sArray.isArrayis the last non-total operation on the gantt date path — a revokedProxycrashes it #7036's terms, each assertion naming the throw's own MESSAGE so a row fails if the site MOVES as well as if it is repaired, plus a live-Proxy control at all four positions) and pin 6 (the three, pinned explicitly as a DEFECT and not as behaviour, with seven drawing controls).Verification — all on
5213e66d3Both new pins were proved able to move, since a pin that cannot fail measures nothing:
git diff HEAD)calculateDateRangetryaround the whole row walkDeclared narrowing: lint was run per-package rather than repo-wide. The population is eslint's own (26 files, counted from
--format json, not guessed), and type-aware linting is not enabled —languageOptionscarries onlyecmaVersionandglobals, noproject/projectService— so a comments-and-tests diff inside one package cannot move any untouched file's verdict. CI runs the repo-wide scan regardless.Out of scope
#7164 is not addressed here and remains open. #7036's
Array.isArrayis untouched, and #6907's deliberate choice there was not re-opened. #6781's accept set does not move.Generated by Claude Code