Changes touching this path
- the retention number becomes an OUTCOME: a daily rollup writes the marginal totals that survive forever and only then drops raw partitions that are both rolled up and past the window
loot#1759, decided by loot#1622 and amended by loot#1625. Until this, thirty
days was a sentence: nothing dropped a row and the raw table grew without bound
on the Postgres volume the relay, the forge and the site share.
The drop is gated on the watermark, never on time alone, and that is the
ticket whole thesis. event_drop_expired() in migration 0003 takes NO argument:
it reads rolled_up_through from the table, uses its own UTC clock, and applies
a retention CONSTANT - so the rollup role cannot widen the drop by lying to it,
and with no watermark it drops nothing. A partition is due only when its day is
at-or-below the watermark AND its whole day is outside the window, so a stalled
rollup ACCUMULATES partitions, which is the observable failure mode we want,
rather than deleting a day nobody aggregated.
The ticket acceptance test is pinned as written: freeze the watermark and
nothing is dropped however old the partitions are. The mutation that makes the
rule time-based reddens exactly that pin and its BOTH-conditions sibling and
leaves every time-only test green, which is the discrimination the ticket asked
for. A day that fails to roll up STOPS the run with the watermark at the last
success; skipping it would advance past a day with no aggregates, the silent
loss the watermark exists to prevent.
Every surviving table is MARGINAL and a test PARSES the CREATE TABLE statements
to prove it: at most one dimension beyond (day, class), never two
visitor-descriptive columns together, never one with path, and no table carries
visitor_key, account_ref or telemetry_id - which is what makes an erasure
complete once the raw rows go. class rides every aggregate and agent gets its
own per-family table (loot#1625); rule_versions reaches every row so rule
boundaries outlive the raw window. No country table, because nothing produces
country.
A THIRD role, metrics_rollup: SELECT on event, which the writer may never have;
write on the rollup tables and the watermark, which the reader may never have;
NO grant on daily_salt; and DDL only through two SECURITY DEFINER doors. The
partition door moves a day rows out of event_default in one transaction with an
explicit UTC bound - p_day::timestamptz would have taken the session time zone
and filed one row under two days depending on who created the partition.
The TypeScript twin of the drop rule PREDICTS what the database will drop and
the summary reports a disagreement loudly with a non-zero exit, because two
implementations of a retention rule parting silently is exactly how a retention
promise stops being true while every timer reads healthy. The bundle was RUN,
not just built: with no credential it starts, reaches main and fails naming the
cause, so the cjs/pg hazard the shipper found is absent here.
The notice moved with it, and a test that asserted the page must NOT claim a
database bound is now inverted: it must claim it, from the shared constant,
and must say the deletion is gated on the totals - a page saying only deleted
after 30 days would describe the time-based expiry loot#1622 rejected. The
account-reference sentences from loot#1758 shortened from as long as the
account to at most 30 days, which is stricter and simpler. Rendered and read.
One header claiming nothing installs a shipper timer yet, a week after one was
installed, is corrected while the rollup was given the same shape.
587 site tests, budget green with the notice raise on the record.
50fe5557 · dbf3dbe6… - the dashboard review fixes for 1940: every CLI query is under the default view, because the collector writes our own machines reports as internal and a dogfood run read as an opted-in install that keeps running, and returning now counts distinct UTC days like the rollup does; the docs-by-section panel reads only docs sections, since SECTION_SQL buckets every path and the panel titled docs was a site-wide top-8 with the root at its head; the rule-boundary marker is the union of the raw windows rule_version and the rollups own rule_versions array, which migration 0003 put on every rollup table for this read, so the two rollup-fed series carry their boundary too; the stale Forge product usage placeholder that #1949 left below the built panel is deleted and its one true sentence about edge-scrubbed forge paths moves into the built panels caveat. each of the three query fixes is pinned in metrics-read.test.ts and each pin went red under the defect it names. the hand-maintained counts (six panels, the three sources, seven columns and six of them, two stages have no producer) become the property they counted, the last hard-coded 30 days read WINDOW_DAYS, one exported dateOnly in rollup.ts replaces two byte-identical copies, one sinceDay spelling replaces the retyped rollup window and the test counts it, the Awaiting prop is why because it carries reasons rather than ticket numbers, and the dead alias in SparkVals is gone. tsc, the reader and rollup tests, the full suite, the build and the budget are green (#1940)
947fe6f3 · dbf3dbe6…diff
Renames are not followed. loot's tree maps a path to an address, so a rename is a delete and an add. This list is the history of the name, not of the bytes.