Severity
High — retry duplicates already-successful records and the error file blames the wrong rows.
What happens
mapRecords excludes rows with mapping errors from mappedRecords, so push-error recordIndex values refer to the compacted array. The UI then applies those indices to the uncompacted sourceRecords. With one dropped row, every failure after it is attributed to the wrong source row: WaveLinkSourceRow in the error file is off by one per drop, and Retry Failed Rows re-sends rows that already succeeded (duplicate inserts) while omitting the rows that actually failed.
Evidence
src/data/mappers/index.ts:154-156
src/ui/screens/DataPushScreen.tsx:553 (buildRetryDataset), :578 (buildPushOutcomeDatasets)
Suggested fix
Keep an index map from mapped-record position back to source-record position (or keep failed rows as placeholders) and translate indices before building retry/outcome datasets.
Environment
Commit 74cf21b (main), WaveLink 0.6.0. Found in the 2026-08-31 adversarial audit (code-verified).
Severity
High — retry duplicates already-successful records and the error file blames the wrong rows.
What happens
mapRecordsexcludes rows with mapping errors frommappedRecords, so push-errorrecordIndexvalues refer to the compacted array. The UI then applies those indices to the uncompactedsourceRecords. With one dropped row, every failure after it is attributed to the wrong source row:WaveLinkSourceRowin the error file is off by one per drop, and Retry Failed Rows re-sends rows that already succeeded (duplicate inserts) while omitting the rows that actually failed.Evidence
src/data/mappers/index.ts:154-156src/ui/screens/DataPushScreen.tsx:553(buildRetryDataset),:578(buildPushOutcomeDatasets)Suggested fix
Keep an index map from mapped-record position back to source-record position (or keep failed rows as placeholders) and translate indices before building retry/outcome datasets.
Environment
Commit
74cf21b(main), WaveLink 0.6.0. Found in the 2026-08-31 adversarial audit (code-verified).