Severity
Medium — silent column loss dependent on row order.
What happens
deriveColumns(rawRecords) samples limit = 50. For SELECT Id, Account.Name FROM Contact where the first 50 rows have Account = null (e.g. ORDER BY … NULLS FIRST), derived columns are [Id, Account]; rows 51+ carry data under Account.Name, which never becomes a column — the value is absent from the grid and every export, for every row. Load More pages beyond row 50 never contribute columns either.
Evidence
src/ui/utils/records.ts:69; also src/services/salesforce/queryAll.ts:56
Suggested fix
Derive columns over all loaded records (the flatten pass is already O(N)) or union keys incrementally as pages arrive.
Environment
Commit 74cf21b (main), WaveLink 0.6.0. Found in the 2026-08-31 adversarial audit (code-verified).
Severity
Medium — silent column loss dependent on row order.
What happens
deriveColumns(rawRecords)sampleslimit = 50. ForSELECT Id, Account.Name FROM Contactwhere the first 50 rows haveAccount = null(e.g.ORDER BY … NULLS FIRST), derived columns are[Id, Account]; rows 51+ carry data underAccount.Name, which never becomes a column — the value is absent from the grid and every export, for every row. Load More pages beyond row 50 never contribute columns either.Evidence
src/ui/utils/records.ts:69; alsosrc/services/salesforce/queryAll.ts:56Suggested fix
Derive columns over all loaded records (the flatten pass is already O(N)) or union keys incrementally as pages arrive.
Environment
Commit
74cf21b(main), WaveLink 0.6.0. Found in the 2026-08-31 adversarial audit (code-verified).