Skip to content

fix(integrations): preserve Slack Content correction across runtime gaps - #5721

Merged
3mdistal merged 4 commits into
BuilderIO:mainfrom
3mdistal:fix/slack-provider-context
Sep 23, 2026
Merged

3mdistal merged 4 commits into
BuilderIO:mainfrom
3mdistal:fix/slack-provider-context

Conversation

@3mdistal

@3mdistal 3mdistal commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

Problem

In a production Slack→Content correction, Content updated the existing Design Ask, but Dispatch never posted the final Slack reply. The task, campaign, and A2A continuation became terminal failed three seconds after a continuation self-dispatch TLS error, with Durable integration campaign was disabled for this scope. The same terminal reason occurred in the test channel on September 1. A scheduled retry cannot recover a terminal row after its continuation identity has been cleared.

The durable-dispatch check currently treats two different conditions alike: an explicit rollout shutdown and a temporarily unavailable runtime prerequisite. That makes a transient host/config mismatch destroy already-started work, even if the downstream edit succeeded.

Change

  • Declare the durable-dispatch flag in server app config so all runtime readers use one typed setting.
  • Distinguish an explicit flag-off or scope removal from unavailable runtime prerequisites (flag not present, background route unavailable, or A2A secret unavailable).
  • Keep an already-started A2A continuation and campaign recoverable during the latter; reschedule the continuation and log only non-secret reason categories. Explicit rollout disable still fails closed.
  • Return the no-op claim attempt when pausing. Move temporarily unavailable campaign and A2A work out of each bounded recovery scan, and prioritize receipt-confirmed A2A owners. The A2A deferral is one bulk update, not a database round trip per task.
  • Preserve the same distinction in the A2A sweep, campaign sweep, and signed campaign continuation route.

This does not resurrect the already-terminal production correction; it prevents that loss on future work. The companion workspace PR #1278 emits the scheduled recovery function, but must not be treated as the full Slack fix until this Core release is consumed and a fresh human-interface create-and-correct test passes.

Proof and remaining gate

  • Focused Core tests: 195 passed across config, durable dispatch, continuation, campaign recovery, and plugin routes. After the review fixes, all 156 tests across the four changed recovery/store suites passed, including 35 consecutive runtime pauses without consuming a remote-poll attempt and a full 200-owner unavailable scan window that leaves later work reachable.
  • A two-step regression pauses an already-started continuation without contacting Content, then resumes it by polling the same persisted downstream A2A task ID and delivers the Slack response. No second message/send client is available in that processor test.
  • Core typecheck, diff check, and all 77 repository guards pass.
  • The revised grouped, receipt-first recovery query parsed successfully against an in-memory PostgreSQL-compatible engine.
  • This is local proof, not deployed acceptance. Publish this package, update the workspace dependency, deploy, and verify one Content item, its follow-up correction, and the final Slack reply before calling the flow fixed.
content_product_impact:
  lane: contract_repair
  features:
    - content.feature.durable-foundations
  capabilities:
    - content.agent.action-parity
  record_change: none
  proof:
    - pnpm --filter @agent-native/core exec vitest --run src/integrations/a2a-continuation-processor.spec.ts
  rationale: Preserve one canonical Content mutation while its cross-app Slack acknowledgement recovers.

@3mdistal
3mdistal requested a review from steve8708 September 23, 2026 17:24
builder-io-integration[bot]

This comment was marked as outdated.

@github-actions

github-actions Bot commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

Here's a visual recap of what changed:

Visual recap

Open the full interactive recap

@builder-io-integration builder-io-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Builder reviewed your changes — looks good ✅

Review Details

Incremental Code Review Summary

The latest commits address both previously reported issues: runtime-paused A2A continuations now return their claimed attempt budget, and temporarily unavailable A2A owners are bulk-deferred outside the bounded recovery scan. I verified the updated state transitions, grouped recovery query, SQL deferral scope, campaign/A2A lease handling, explicit-disable versus runtime-unavailable semantics, and continuation route behavior with three independent review passes. The changes are consistent with the intended recovery model, and focused integration tests reported passing across the changed suites. The previously open comments were resolved before this review.

No new confirmed bugs were found. This remains a standard-risk integration/state-machine change.

🧪 Browser testing: Skipped — PR only modifies backend/config/docs/tests, no UI impact.

@3mdistal
3mdistal merged commit ddabced into BuilderIO:main Sep 23, 2026
51 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants