Severity
High — after a bulk job with failures the user cannot retry, and record IDs are attached to the wrong rows.
What happens
Both bulk completion paths broadcast DATA_PUSH_COMPLETE without an errors array (getFailedResults is never called for pushes). After a bulk push with failures: "Retry Failed Rows" never appears; "Download error file" produces zero rows; and buildPushOutcomeDatasets pairs successfulIds positionally against all source rows — from the first failed record onward, WaveLinkRecordId is attached to the wrong source row. The same positional pairing also mislabels REST upserts, where 204-updated records return no id.
Evidence
src/background/index.ts:1741-1747
src/offscreen/index.ts:80-84
src/services/salesforce/composite-upsert.ts (extractCompositeUpsertId)
Suggested fix
Fetch failedResults/successfulResults from the Bulk API, map rows back to input indices, and include errors and per-row ids in the completion payload.
Environment
Commit 74cf21b (main), WaveLink 0.6.0. Found in the 2026-08-31 adversarial audit (code-verified).
Severity
High — after a bulk job with failures the user cannot retry, and record IDs are attached to the wrong rows.
What happens
Both bulk completion paths broadcast
DATA_PUSH_COMPLETEwithout anerrorsarray (getFailedResultsis never called for pushes). After a bulk push with failures: "Retry Failed Rows" never appears; "Download error file" produces zero rows; andbuildPushOutcomeDatasetspairssuccessfulIdspositionally against all source rows — from the first failed record onward,WaveLinkRecordIdis attached to the wrong source row. The same positional pairing also mislabels REST upserts, where 204-updated records return no id.Evidence
src/background/index.ts:1741-1747src/offscreen/index.ts:80-84src/services/salesforce/composite-upsert.ts(extractCompositeUpsertId)Suggested fix
Fetch
failedResults/successfulResultsfrom the Bulk API, map rows back to input indices, and includeerrorsand per-row ids in the completion payload.Environment
Commit
74cf21b(main), WaveLink 0.6.0. Found in the 2026-08-31 adversarial audit (code-verified).