Fix Slack reply recovery after successful mutations#2212
Conversation
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
|
Here's a visual recap of what changed: Open the full interactive recap |
There was a problem hiding this comment.
Builder reviewed your changes — looks good ✅
Review Details
Incremental Code Review Summary
The latest PR head fixes the previously reported A2A provenance issue. withPersistedArtifactMarker now builds a deduplicated verification-secret list containing the explicit organization secret and the global A2A_SECRET, then passes it to extractA2AArtifactIdentities before signing the outer marker. This preserves nested organization-signed artifacts in organization-only deployments while retaining global-secret compatibility.
The added regression coverage exercises organization-scoped nested marker verification, and the continuation processor still propagates the applicable secret set when validating and persisting recoverable checkpoints. The broader delivery retry, deterministic history-ID, FIFO task ordering, and serialized checkpoint paths remain consistent with the prior review.
The previously open artifact-marker comment was verified fixed and resolved. The incremental review agents found no additional confirmed bugs in the latest changes. This is a standard-risk change because it modifies shared integration persistence and retry state.
✅ Result: No new actionable findings.
🧪 Browser testing: Skipped — PR only modifies backend/integration logic and tests, with no user-facing browser UI impact.

Summary
Why
A Slack correction could successfully update the existing Content record but leave the thread silent. Retrying the whole integration task would risk replaying the mutation. This change separates mutation truth from delivery truth: the stable Content identity is retained, while only the missing provider reply is retried.
Provider posting remains at-least-once when acceptance is ambiguous before a receipt is returned. Slack does not expose a generic exactly-once primitive for this reply path, so an accepted post followed by a lost provider response can still produce a duplicate reply. The durable guarantee here is that recovery preserves exact conversation-history identity and never reruns the successful Content mutation.
Verification
@agent-native/coreTypeScript 7 typecheckgit diff --checkQA
No preview Slack bot or integration environment exists. Real Slack-to-Content QA remains intentionally deferred until this PR is merged and deployed. The frozen deployed story is: rename the Content record, correct unrelated fields in the same Slack thread, preserve the stable ID and live title, create no duplicate Content record, and receive one truthful confirmation on the clean provider path.