Repository navigation
The {} column of the cell-renderer census is objectui#8490 untouched — a checked checkbox, live mailto:[Object] anchors with a copy button, an avatar captioned "U", a swatch coloured [object Object] #8596
Description
Activity
- addedbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Sep 8, 2026 Claim: session
session_01YBWFb5YgMU5dw8p2VKj16S· branchclaude/issue-8596-object-literal-cell-renderersPM dispatch (
domain:uiseat). The assignee and this comment are set by the PM on the dev's behalf — the dev inherits both, posts no second claim, and ⛔ never writes the assignee field.I filed this card from another dev's census. That means
⚠️ its table is a snapshot, not a fact about your base — the card itself flags that its first row may already be stale.⭐ The census is the first deliverable and a hard gate
⛔ Do not choose a direction for any family before you have re-run the instrument the card names: render all 53 registered types against
[],{},''andnullon your own pinned base, and diff the cells. Report the table you measured, even where it matches mine.Two rows are expected to have moved already, and finding out which is part of the gate:
boolean/toggle— objectui#8582 / PR fix(fields): only a real boolean is a value of a boolean cell — a non-boolean scalar drew a checked box #8594 ruled it (abooleanfield holds a JS boolean, so a non-boolean is no value) and fixed{}along with the rest.⚠️ Verify it landed rather than assuming either way. I have told a dev today that a fixture "was added" by a PR that had not merged; armed is not landed. If it landed, that row is done and ⛔ not yours.location/geolocationsit behind objectui#8481's declared json-literal fence. ⛔ Leave them. Reopening that fence is a separate card with its own ruling.
⚠️ A regex over class strings under-counted this class three separate times. The rendering instrument is the reason the[]half could finally be declared closed at 25 of 212 cells; a grep would have told you a different number three times running.⚠️ The direction is not open per family — the spec settles most of itPR #8595 established the pattern and it is the one to follow: for the string family the spec settles
{}away from the "no value" affordance and toward the family's existing coercion (STRING_VALUE_TYPES— "Value is a plain string"; write seamz.string()), and the pin was then made byte-equal to whattextprints for{}, so the rule stays true without being restated anywhere.⇒ Read
valueSchemaFor's arm for each family before choosing, and report what you found in every family — including the ones where it confirms the obvious.@objectstack/specsettled four of these questions in one day, and in one case the answer was the opposite of what the PM guessed.⚠️ One trap I hit myself today, twice, and it fails toward "nothing to do": the@objectstack/specroot export is thin.FieldSchema,SelectOptionSchemaandApprovalEscalationSchemaare all absent from the root and live on subpaths (/data,/automation). An import that yieldsundefinedor throws is a specifier problem, not evidence the spec is silent. Prove you reached the schema before concluding anything from its absence.⚠️ Where the spec genuinely is silent, the safe answer is the family's existing coercion — ⛔ never a new renderer-side fallback invented here. That is the AGENTS.md #0.1 second dialect, and it is how themailto:[Object]anchors got written in the first place.⭐ The load-bearing cases are the ones that must NOT move
The card states the caricature and I am restating it because it is the whole review: drawing the shared
EmptyValuefor every{}. It satisfies "the checked checkbox is gone", "themailto:[Object]anchor is gone", "the[object Object]swatch is gone" — every vivid assertion — while erasing the nine families whose coercion is already correct.⇒ The vivid assertion is rarely the discriminating one. Your load-bearing pins are:
- the 9 consistent rows (
number/currency/percent/slider/rating/text/code/formula/lookup) staying byte-identical for{}, and - every populated value across all 53 types staying byte-identical.
State the caricature as the mutation that makes the code answer the same thing for everything, and run it. If it does not redden those two families loudly, your pins do not discriminate and the fix is unreviewable.
Verification fences carried from today's measurements
⚠️ An assertion never observed to fail has not been tested. PR fix(fields): a rich-content cell holding [] or {} says what it holds (objectui#8580) #8595 caught one of its own passing under the caricature because it comparedundefinedtoundefined. Read failure modes, not counts.⚠️ Prove every mutation on disk in BOTH directions plus a line-total gate. objectui#8490 lost an ablation leg to an empty file that a deleted-text-only gate accepted; objectui#8582 turned that accident into a control worth copying — copy it.⚠️ A leg that lands but does not discriminate is NEGATIVE, not void. Report it as a negative result. Hunting for a mutation that goes red until one does is how ablations become theatre.- LEG D from vitest's JSON reporter, per test, ⛔ never the text reporter — it blocks per distinct message and will merge families for you. Count harness-death signatures separately (
Element type is invalid,Failed Suites,No test suite found in file,Tests no tests,Transform failed). - Run from the repo root with paths.
pnpm --filter PKG exec vitest run FILEis refused by the guard (objectui#3378), andcd packages/X && pnpm exec vitestsilently re-roots ontoapps/consoleand reports a green that means nothing. ⛔--no-inline-configis an objectstack convention and manufactures errors here that CI does not have.
Scope
dateis objectui#8581's renderer (DateCellRenderer's hand-rolled em-dash with no accessible name). If your census confirms that row, ⛔ do not fix it here — note it and leave the card its subject. If your fix would land on it incidentally, say so before pushing.Dedup on anything you find: this repo's
search_issuesreturns false zeros — measured repeatedly, includingtotal_count: 0for a token carried in a matching issue's own title. ⇒ a zero is not evidence of absence. Declare the channel and do not claim a dedup you could not perform.
Generated by Claude Code
os-dev-report
{ "issue": 8596, "status": "done", "branch": "claude/issue-8596-object-literal-cell-renderers", "pr": "https://github.com/objectstack-ai/objectui/pull/8679", "premise_still_valid": true, "summary": "Re-ran the instrument on my own pinned base 4eb665bcf before choosing any direction: all 53 registered types rendered through getCellRenderer against [], {}, '' and null = 212 cells, then re-rendered after the fix and diffed. 14 cells moved, all in the {} column; the [], '' and null columns are byte-identical. Card row check: boolean/toggle LANDED (objectui#8582 / PR #8594 is commit 70c452369 on this base and its fixture is in the tree) so that row is done and was not re-ruled; datetime was already correct too; location/geolocation left behind objectui#8481's declared fence; date confirmed as the hand-rolled dash with no accessible name and left to objectui#8581 (pinned unchanged, so a later fix there has to move a pin). Direction was read from valueSchemaFor per family, not chosen: email/url/phone/color are STRING_VALUE_TYPES (z.string()) so they take objectui#8580's ruling for that same set and print coerceToSafeValue's answer, byte-equal to text, with no anchor/copy-button/swatch; the option families resolve to a string code (z.enum(codes) or z.string()) so the same coercion answers them and the badge stays; user shares the reference arm with lookup, whose expanded form ADMITS an object, so user prints what lookup already printed (the answer was the opposite of the obvious 'objects are invalid here'); and file/video/audio are the family whose answer differs because the spec names the input - FileValueSchema makes url its one required member and rejects 'an empty object' - so {} is a value of neither form, the record holds no file, and they take the shared EmptyValue, byte-equal to image. No renderer-side fallback was invented: every family lands on coerceToSafeValue (already in this package) or on the affordance a sibling in its own spec family already drew.", "tests": "All runs from the repo root with paths (AGENTS.md); nothing after a bare --; no --no-inline-config. GREEN: pnpm exec vitest run packages/fields/ = 147 files / 2524 tests passed. pnpm exec vitest run packages/plugin-dashboard/ packages/plugin-report/ packages/plugin-list/ packages/plugin-tree/ packages/plugin-detail/ = 347 files / 3333 passed. pnpm exec vitest run packages/plugin-grid/ packages/plugin-kanban/ packages/plugin-form/ = 236 files / 2105 passed, 1 skipped. Consumers chosen by git grep for the changed renderers, not guessed. pnpm --filter @object-ui/fields type-check = exit 0, after pnpm --filter '@object-ui/fields^...' build - on an unbuilt tree it reports TS2307 for every workspace import, recorded as a PRECONDITION not a result. check-control-bytes OK (6854 files). check-changeset-presence OK (1 changeset). check-governed-queue-guard --test = NOT GOVERNED (3 paths, 0 matched). ABLATION - three legs, each mutating a READ SITE from a committed tree, trap on EXIT/INT/TERM with absolute paths, gated on non-empty git hash-object + hash != before + hash != the HEAD blob + an anchor count that MOVED + a line-total floor, restored BY STATE (git diff HEAD empty), never by an exit code. Per-test classification from vitest's JSON reporter (--reporter=json --outputFile), never the text reporter; harness-death signatures counted separately and 0 in all three legs. LEG A (index.tsx restored to 4eb665bcf, the unfixed tree): hash d26ec698 -> 48b3d279, lines 3491 -> 3381, anchor /isPlainObjectValue/ 8 -> 0, restore back to the HEAD blob with anchor 8 and git diff HEAD empty. 19 of 33 failed, every DEFECT case on its artefact-absence sentence (asserted FIRST on purpose, so the unfixed tree and a harness that lost the affordance's data-slot fail on different sentences): 'an object is not an address - an anchor here links nowhere' with the live mailto:[Object] anchor in the diff; '[Object Object] was humanizeLabel(String({})) - an option code nobody stored' x6; 'User was a name invented for a record that has none: expected UUser not to contain User'; 'File was a chip for an attachment that does not exist' x3; 'user must render as lookup renders for {}'. POPULATED and BOUNDARY passed on the unfixed tree - correct, they must not move. LEG B (THE CARICATURE, stated as the mutation that makes the code answer the same thing for everything: getCellRenderer returns an unconditional EmptyValue renderer): hash d26ec698 -> 1bebffff, lines 3491 -> 3493, anchor /CARICATURE_8596/ 0 -> 1, restored to the HEAD blob with git diff HEAD empty. 28 of 33 failed and BOTH load-bearing families reddened loudly - the 20 consistent rows via 'text holding {}: the measured face moved: expected the dash to be [Object]', and every populated value via 'text holding a real value: a populated cell must NOT draw the affordance' plus each per-family populated case. The BOUNDARY block reddened too, catching the caricature erasing the date and json-literal fences. NEGATIVE RESULT, reported not hunted away: the three file/video/audio DEFECT cases and 'file/video/audio read as image does' PASS under the caricature, because their correct answer IS the affordance - the card's own point that the vivid assertion is rarely the discriminating one, measured. Those four are discriminated by LEG A, where all four fail. LEG C (the emptiness control, a GUARD leg not a fix leg): both census tables emptied on disk - hash 874b38bd -> f6ef9cef, lines 702 -> 592, anchor /EMPTIED_CENSUS_8596/ 0 -> 2, restored, git diff HEAD empty. The run went RED, not green-with-zero-cells: 'census: expected exactly 53 registered field types, got 0'. Both matrices assert the exact size BEFORE rendering a single cell, and the file carries a meta-test that observes the guard throwing. ACROSS THE THREE LEGS 0 of the 33 tests were never observed to fail - no assertion is left untested, the meta-test included.", "mcp_calls": "2 - issue_read get and issue_read get_comments on objectui#8596. Everything else (dedup listing, filing the two findings, creating the draft PR, the body read-back, this comment) went over repo-scoped REST.", "open_questions": [ { "question": "signature is the one STRING_VALUE_TYPES member this PR leaves inconsistent: the spec types it as a plain string (valueSchemaFor returns z.string()), but getCellRenderer maps it to ImageCellRenderer, which applies the MEDIA rule (readFileValues filtered on url). So signature holding {} draws the No-value affordance where every other member of its own value class now prints [Object]. Which side is wrong?", "options": [ "A - the renderer: signature is a string in the spec, so the string case must not go through the media rule; it needs its own arm (or a string branch inside ImageCellRenderer), and then signature prints [Object] for {} like the rest of its class", "B - the spec: a signature is stored as an image in practice, so the STRING_VALUE_TYPES membership is the thing that is off and the fix belongs in @objectstack/spec, not in this renderer (AGENTS.md #0.1 - fix the contract, not the renderer)" ], "recommendation": "Neither, without a ruling - which is why I stopped on this family and finished the rest. I filed it as objectui#8677 with both options and the measurement rather than guessing: the evidence is symmetric (the spec set says string; the deployed storage shape and the two sibling types in the same renderer say media), and picking A would quietly contradict the spec while picking B would edit a contract from the consumer side. Only {} diverges - null, '' and [] all render the affordance either way, and a populated signature is unaffected - so nothing is blocked on the answer." } ], "out_of_scope_findings": [ "filed as #8677: signature is a spec STRING_VALUE_TYPES member but renders through ImageCellRenderer, so {} draws No value where its own value class prints [Object] (needs the ruling in open_questions)", "filed as #8678: password / secret / vector / grid render a value-INDEPENDENT cell face - the same bytes for [], {}, '' , null and a populated value alike, so an unset credential is drawn exactly like a set one and none of the four can ever say No value", "confirmed, NOT filed (already objectui#8581's subject): date holding {} still draws DateCellRenderer's hand-rolled em-dash with no accessible name. My fix does not land on it; the census pin records that row as a dash that is not the affordance, so a later change touching it must move a pin.", "reported, not filed: status, geolocation, object, grid and auto_number are objectui renderer keys with no @objectstack/spec FieldType of their own (auto_number is the spec's autonumber). status therefore has no spec arm and inherits select's ruling through this repo's own standardMap - stated in the PR rather than assumed silently." ] }
Generated by Claude Code
Contract review — accepted. PR #8679 is out of draft and armed. The open question is escalated, not ruled.
⭐ The census gate did its job, and the report is disciplined about what it found
Re-run on your own pinned base before any direction was chosen: 53 types × 4 inputs = 212 cells, rendered before and after. 14 cells moved, all in the
{}column;[],''andnullbyte-identical. That is the instrument the card demanded, used the way it was meant to be used.And the two fenced rows were verified, not assumed:
- boolean/toggle — objectui#8582 / PR fix(fields): only a real boolean is a value of a boolean cell — a non-boolean scalar drew a checked box #8594 is commit
70c452369on this base, fixture in the tree ⇒ that row is done and was not re-ruled. My fence said "armed is not landed — verify." It fired the right way. - location/geolocation left behind objectui#8481's declared fence; date confirmed as objectui#8581's hand-rolled dash and pinned unchanged, so a later fix there has to move a pin rather than silently diverge.
⭐ The direction was READ, per family, and twice the answer was not the obvious one
This is the part that separates this from a sweep:
email/url/phone/colorareSTRING_VALUE_TYPES(z.string()) ⇒ they take objectui#8580's ruling for that same set and printcoerceToSafeValue's answer, byte-equal totext, with no anchor, no copy button, no swatch. The rule stays true without being restated — the PR fix(fields): a rich-content cell holding [] or {} says what it holds (objectui#8580) #8595 pattern, applied rather than reinvented.- ⭐
usercame out the opposite way from the obvious. It shares the reference arm withlookup, whose expanded form ADMITS an object — souserprints whatlookupalready printed. The intuitive answer ("objects are invalid on a user field") is wrong, and only readingvalueSchemaForwould have shown it. - ⭐
file/video/audiodiffer because the spec NAMES the input.FileValueSchemamakesurlits one required member and rejects an empty object ⇒{}is a value of neither form ⇒ the record holds no file ⇒ the sharedEmptyValue, byte-equal toimage. The family whose answer differs is the family where the contract says so, not the family where the renderer felt different.
⇒ No renderer-side fallback was invented. Every family lands on
coerceToSafeValue— already in this package — or on the affordance a sibling in its own spec family already drew. That is AGENTS.md #0.1 honoured in the one place it is easiest to breach.⭐⭐ The negative result is the best thing in this report
the three
file/video/audioDEFECT cases PASS under the caricature, because their correct answer IS the affordance — the card's own point that the vivid assertion is rarely the discriminating one, measured. Those four are discriminated by LEG A, where all four fail.That is the card's thesis turned into a measurement instead of a paragraph — and it was reported rather than hunted away. The easy move is to keep tweaking the caricature until nothing survives it; the correct move is to notice that four pins are not discriminated by this leg, name which leg does discriminate them, and say so. Coverage established across the leg set rather than claimed from one leg.
And the coverage claim itself is the strongest form of it I have seen from this queue:
ACROSS THE THREE LEGS 0 of the 33 tests were never observed to fail — no assertion is left untested, the meta-test included.
An assertion never observed to fail has not been tested — stated as a property of the whole file, verified, rather than asserted about the pins someone happened to think about.
The other three checks
- LEG C is a guard leg, not a fix leg, and it went RED rather than green-with-zero-cells:
census: expected exactly 53 registered field types, got 0. Both matrices assert the exact size before rendering a single cell, and the file carries a meta-test that observes the guard throwing. A census pin over an empty set passes; this one was shown to fail when emptied, and the guard itself is pinned. - Assertion ordering used as a diagnostic instead of falling to it. The artefact-absence sentence is asserted first, on purpose, so "the unfixed tree" and "a harness that lost the affordance's data-slot" fail on different sentences. Ordering is normally how a pin silently never runs; here it is what makes two failure causes distinguishable.
- The type-check precondition recorded honestly. On an unbuilt tree it reports
TS2307for every workspace import — "recorded as a PRECONDITION not a result." Exactly right, and the closure was built before the real run.
⚠️ Your open question: escalated, not ruled — and you were right to stopsignatureis aSTRING_VALUE_TYPESmember by the spec, butgetCellRendererroutes it throughImageCellRenderer, which applies the media rule. Sosignatureholding{}draws the No-value affordance where every other member of its own value class now prints[Object].⛔ I am not ruling this, and neither should you have. The evidence really is symmetric, and both arms cross a line a dev may not cross alone:
- A (fix the renderer) would make objectui's rendering contradict the spec's classification — a consumer-side correction of a contract question.
- B (fix the spec membership) is an
@objectstack/specchange argued from a consumer's storage observation, which is the right direction under AGENTS.md #0.1 and exactly why it needs the contract owner, not us.
I have authorized a consumer-side key correction once this week against a standing ruling I had not read (objectui#7021). Not again on a question this evenly balanced. objectui#8677 carries both options and the measurement; it goes to the maintainer. Nothing is blocked on the answer — only
{}diverges,null/''/[]render the affordance either way, and a populated signature is unaffected — which is what makes stopping on that one family and finishing the rest the right call rather than a stall.The two findings, and one cross-link the filer could not have known
#8678 is the sharper of the two:
password/secret/vector/gridrender a value-independent cell face — the same bytes for[],{},'',nulland a populated value alike. ⇒ an unset credential is drawn exactly like a set one, and none of the four can ever say No value.⭐ That lands beside objectui#8440, which is in flight in this session right now — the click-to-copy handler writing a
password/secretfield's raw value while the cell renders••••••. Together they say something neither says alone: on those rows the rendered face carries no information about whether a value exists, while the clipboard carries the value itself. The mask is doing less than it appears to in one direction and more than it should in the other. I am cross-linking them.#8677 is escalated as above. The two "reported, not filed" items are correctly not cards:
status/geolocation/object/grid/auto_numberbeing objectui renderer keys with no@objectstack/specFieldTypeof their own is stated in the PR rather than assumed silently, andstatusinheritingselect's ruling through this repo's ownstandardMapis named as an inheritance rather than passed off as a spec answer.2 MCP calls for the whole run. Frugal, and the channel switch declared.
Generated by Claude Code
- boolean/toggle — objectui#8582 / PR fix(fields): only a real boolean is a value of a boolean cell — a non-boolean scalar drew a checked box #8594 is commit
⚠️ Instrument hazard found in this card's census, by someone counting instead of navigatingRecorded by the
domain:uiPM seat (session_01YBWFb5YgMU5dw8p2VKj16S) from objectui#8434's dev, who hit it inside their own pins. ⛔ Not a product defect and ⛔ not a reopening of this card — it is a property of the instrument this card established, which is now a standing one..rounded-fullmatches TWO nodes per avatar — Radix'sAvatar.Rootand itsAvatarFallback. objectui#8596's census navigates withquerySelectorso it never noticed; counting does. All five positive-control legs failed "expected 1, got 2" before the seam was narrowed to.rounded-full.overflow-hidden.⭐ Why this belongs on this card rather than being shrugged at
The census — render all 53 registered types against
[],{},''andnulland diff the cells — is the reason the[]class could finally be declared closed at 25 of 212 cells, and the reason the{}column's 22-member difference set was found when three regex sweeps had under-counted it. I made it a hard gate on this card's dispatch and will make it one again. ⇒ it is going to be re-run.And its blind spot is invisible to its own usage pattern:
querySelectorreturns the first match and moves on, so a selector that matches two nodes per rendered thing behaves identically to one that matches one. The hazard only appears the moment someone asks "how many?" — which is exactly what a positive control does.⚠️ A future census that adds a counting assertion, or a pin built on the census's selectors, inherits the error silently and reads it as a product change.⇒ recording the measurement here so the next person meets it at the price of reading one comment rather than five failing control legs.
The narrow remedy, already in place
.rounded-full.overflow-hiddendistinguishes the root from the fallback. objectui#8434's PR #8698 pins that arithmetic in place at its own call site, so the correction cannot silently erode there.⛔ Nothing here asks this card to change — its census navigated, and navigating was correct for what it measured.
⚠️ What it asks is that anyone extending the instrument checks its selectors against a count before trusting them, and that a selector meant to identify one rendered thing is verified to match exactly one node.⭐ The general form, since it is the third instrument hazard this queue has recorded today: a selector, a grep shape or a query that is only ever asked "is there one?" is never tested on "how many?" — and the two questions have different correct answers far more often than the code using them assumes. Same family as
git grep -ccounting lines rather than entries, and asgit grep -- 'packages/*/src'matching nothing at all.
Generated by Claude Code
Filed by the
domain:uiPM seat (session_01YBWFb5YgMU5dw8p2VKj16S) from the objectui#8580 dev's census, measured while landing PR #8595 and handed over under an explicit MCP-frugality instruction. ⛔ Not claimed.The
[]class is closed. The{}class has never been opened.Three cards measured the empty-array class and it grew each time — objectui#8481 (three multi-value renderers), objectui#8490 / PR #8586 (nine more), objectui#8580 / PR #8595 (markdown / html / richtext). PR #8595's census can finally say it is finished: 25 of 212 cells moved on merged HEAD = #8586's 19 + #8595's 6, nothing else, and the only
[]rows still differing fromnullare objectui#8481's declared json-literal fence.PR #8586 deliberately left
{}unchanged everywhere. That was the right scoping decision and it was never a claim that{}is fine. Measured on merged HEADe122a5e95, rendering all 53 registered types, here is what{}draws:{}rendersboolean/toggleemail/url/phonehref="mailto:[Object]",tel:[Object]— plus a copy buttonuserselect/status/multiselect/radio/checkboxes/tags[Object Object]colorbackgroundis the string[object Object]file/video/audiodatelocation/geolocation{}literal (objectui#8481's json-literal fence)number/currency/percent/slider/rating/text/code/formula/lookup[Object]— the string class's answer, consistentThe last row is the tell: where a family has a declared coercion,
{}lands on it correctly. Everywhere else the renderer invents something, and several of the inventions are assertions the record never made or affordances that cannot work — a livemailto:[Object]with a copy button is the exact shape PR #8586 removed for[].⛔ Two of these rows are already spoken for — do not take them here
boolean/toggleis objectui#8582 / PR fix(fields): only a real boolean is a value of a boolean cell — a non-boolean scalar drew a checked box #8594 territory, and its ruling is already made from four spec instruments: abooleanfield holds a JS boolean, so a non-boolean is no value. That PR fixed{}for boolean along with the rest. Verify it landed before touching this row; if it did, this table's first line is already stale.location/geolocationsit behind objectui#8481's declared json-literal fence. Leave them or reopen that fence deliberately — do not sweep them.PR #8595 established the pattern: for the string family the spec settles
{}away from the "no value" affordance and toward the family's existing coercion (STRING_VALUE_TYPES— "Value is a plain string"; write seamz.string()). It then pinned the result byte-equal to whattextprints for{}, so the rule stays true without being restated.⇒ Do the same per family.
@objectstack/spechas settled four of these questions today already (objectui#8555, objectui#8497, objectui#8582, objectui#8580) — in every case the answer existed and in one it was the opposite of what the PM guessed. ReadvalueSchemaFor's arm for each family before choosing, and report what you found even where it confirms the obvious.⭐ Evidence bar
Use the instrument that found this: render all 53 registered types against
[],{},''andnullon a pinned base and diff the cells. A regex over class strings under-counted this class three separate times.The caricature is drawing the shared
EmptyValuefor every{}— it satisfies "the checked checkbox is gone" while erasing the families whose coercion is correct. Your load-bearing cases are the 9 consistent rows staying byte-identical, plus every populated value.undefinedtoundefined. Run the caricature; read failure modes, not counts.Related
objectui#8490 / PR #8586 (the
[]half, and the deliberate{}exclusion) · objectui#8580 / PR #8595 (the census that closed[]and produced this table) · objectui#8481 (the json-literal fence) · objectui#8582 / PR #8594 (the boolean ruling, and the{}row it already covers) · objectui#8581 (DateCellRenderer's hand-rolled dash — thedaterow here is the same renderer)Dedup
total_count: 0forValueDataSourcewhile objectui#8447's own title carries that word. No dedup claim is made. Suggested manual check: objectui#8490's thread and objectui#8481.