A table is rows and named typed columns, and a formula cannot tell where they came from.
A table holds rows, and named columns with a type each. A column's type is text, number, boolean, or date, and that list is closed.
table invoices date plan region amount 2024-01-05 pro US 1000 2024-01-18 team US 2500 2024-02-03 pro US 1200 2024-02-14 pro EU 800 2024-03-09 pro US 1500
A table is synced from a source, uploaded as a file, or typed by hand. A formula reads all three the same way and cannot tell which one it is reading. Replacing a hand-typed table with a synced one changes no formula.
A model names the tables it reads and, for each one, the column that places a row on a step. Each row of invoices lands on the month its date falls in.
A table with at most one row at each slice at each step can be read as a key. Its values are then read one at a time, as scenario.growth, with no SUM around them.
Every loaded row is counted in one of five places: on a step, before the first step, after the last, with no value to place it by, or on a step but with a value no member of a dimension holds. The five counts say how much of a table a model covers.