The tenant-range purge inventory, extensible by construction: each
later feature appends its adopted table here instead of editing purgeTenant's
body, so adoption is one additive row plus the counter/result pair the types
force alongside it. Ordering is not load-bearing (the deletes run
concurrently; see purgeTenant).
mastra_workflow_snapshot is deliberately absent: it rides the same range but
over run_id, paired with artifact deletion and an app-owned index, so it
keeps its own block. mastra_background_tasks rides the range over
its own run_id — the originating run's tenant-salted id, always present on a
task row — without artifacts or an app index, so it lives here. Tables no
feature writes yet (mastra_scorers) are absent because nothing salts their
ids yet — the schema-guard's inventory pin is what forces that decision when a
feature adopts one.
The tenant-range purge inventory, extensible by construction: each later feature appends its adopted table here instead of editing purgeTenant's body, so adoption is one additive row plus the counter/result pair the types force alongside it. Ordering is not load-bearing (the deletes run concurrently; see purgeTenant).
mastra_workflow_snapshotis deliberately absent: it rides the same range but overrun_id, paired with artifact deletion and an app-owned index, so it keeps its own block.mastra_background_tasksrides the range over its ownrun_id— the originating run's tenant-salted id, always present on a task row — without artifacts or an app index, so it lives here. Tables no feature writes yet (mastra_scorers) are absent because nothing salts their ids yet — the schema-guard's inventory pin is what forces that decision when a feature adopts one.