Changes touching this path
- the metrics pipeline gets the database it was already being built against, because two build tickets had been filed to write rows into a schema nobody owned: loot_metrics is the collector core that map 1615 left in fog while every decision it waited on had closed weeks earlier, so the event table lands first and gates the other four parts plus the telemetry sender and the download hop. it lives beside the site source rather than in the forge, and that is the whole point of 1618 - the forge schema is welded to the release train by include_str into a checksum-pinned array deployed as a pinned binary, so a forge migration would put every analytics schema change behind a release cut, while the site deploys from a live checkout and needs none. the decisions are expressed as CONSTRAINTS rather than as rules somebody has to remember: class carries no human value because a positive-match rule never matches a person and the default view is the double negative requests we found no reason to exclude; a row may carry account_ref or telemetry_id but never both, because 1621 refused to store the visitor-to-account link and a row holding both rebuilds it one INSERT at a time; the two stay separate columns rather than one with a tier discriminator since they are different legal bases with different deletion rules and forgetting to filter is silent, reading as a bigger cleaner dataset. the writer role gets INSERT and no SELECT on event, which is load-bearing rather than tidy because the beacon is an unauthenticated internet-facing endpoint and a role that could read would turn one injection there into a read of every visitor row ever written; the dashboard reader holds no write privilege anywhere and cannot reach the salt at all. what a schema cannot express is the absence of a raw address or a full user agent, so the pin asserts the columns that would hold one do not exist. twenty assertions parse the statements rather than searching the file, because a whole-file match is satisfiable by a comment or by a grant to the other role, and three mutations were each run red - widening the writer to SELECT, adding a human class, and renaming the one-tier constraint away (#1755)
3db110c8 · dbf3dbe6…
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.