Row ui-db-d3 part 3 — the decider's binding bound (receipt f7799f0f4): the labelled partial point stands only if the label reaches the reader per affected month
16 Sept 2026 · branch ui-db-d3-p3 · captured against propflow-stage · at c90ad6b2a4+local
Data note. Every name and balance below comes from propflow-stage, which is anonymized by construction (ADR-0097/0110 — phones in the impossible +1000 NPA, emails @example.test). The identical capture against prod would carry real tenants' names and balances and is not safe to attach anywhere, which is why the generator refuses to run against one.
The caption under the headline now reads 1 of 74 properties · Partial months: 102, as few as 1 of 74 properties · History through Jun '26 · books closed through Aug '26. The middle clause is new and is what the ruling binds.
Why it could not be said before. The two facts already in that caption are whole-LINE facts: contributingProperties counts a property that reported any month, and coverageComplete is one boolean for the entire series. A line whose buildings all reported ninety-five months and one of which missed the ninety-sixth reports “3 of 3 properties” and true — and the dip in that month is indistinguishable from a real decline. contributorsByMonth is the only field that separates the two, and it stopped at the server: MonthlyCoverageSummary omitted it and the client literal never copied it.
This is the DEGRADED form, and that is the honest state of this environment. One building of seventy-four has a monthly store here, so all 102 months are partial; naming them individually would print 102 months into a one-line caption, so past three the caption counts them and states the worst ratio. The named form (“Partial months: 2 of 3 in May '26”) — the case a reader can act on — has no instance in this data and is pinned as a literal in month-coverage.test.ts.
Known legibility nit, left deliberately: on a scope where every month is partial the new clause restates the “1 of 74 properties” beside it. Suppressing it in that case was considered and rejected — the rule would have to decide when a month is “covered enough not to mention”, which is exactly the hidden-hole failure this change exists to remove.
Asserted in the captured DOM — Partial months · properties · History through. The assert is the sentence PREFIX plus the two clauses it sits between — not the full string. The month count and the ratio are this environment's live numbers, and pinning them here would assert the stage data rather than the change; the exact strings are pinned as literals in the unit tests. Asserting 'History through' alongside proves the new clause joined the EXISTING rider rather than replacing it.
SPLIT (the per-property comparison view) — not captured, on purpose. Its legend renders property NAMES, and this environment's property names are real customer names. The capture pipeline's contact gate (verifyRecordContacts) classifies emails and phones and nothing else, so it would pass a picture with customer names in it straight through to a published URL that outlives this PR. The surface is proved the other way instead, in month-coverage-renders.test.tsx: the view is mounted and its rider row ([data-testid="comparison-coverage-rider"]) is asserted to contain the per-month sentence on a partial line and to be absent entirely on a complete one. Capturing it is deferred to a sandbox org with synthetic buildings.
COLLAPSED (the dashboard card) — the capture was attempted, FAILED its assert, and that failure is a finding worth more than the picture. The card draws its sparkline — and with it the entire coverage caption — only at size='large' (form.showTrendChart, top-metric-form.tsx). The default dashboard renders these cards at medium, so on the layout above neither the new per-month clause nor the pre-existing “N of M properties” cue is on screen at all. That is pre-existing behaviour, not introduced here, and it is not fixed here either — adding a caption row to a compact card is a card-layout concern with its own blast radius. But it means the ruling's “collapsed view” requirement is only satisfied at the card's large form today, and that gap should be decided rather than discovered. The collapsed renderer itself is proved by mount test (TopMetricTrendChart with the rider → the sentence on screen; with a complete line → no marker).
Also not in this part: a per-point marker ON the chart — a dashed segment at the partial month — is a change to ObservabilityChart, a 1445-line component shared across the app, and is its own concern. The ruling binds the LABEL, and the label is what renders here.