Stabilize live plugin validation - #24
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Executive Summary
This PR makes complete live plugin validation strict, repeatable, and non-blocking for merges.
Description
The live voice harness now sweeps matching active calls, snapshots both owners, applies a request-time lower bound, requires one stable current record per owner, and cleans up every fresh matching record. It checks driver-local speech only on the driver record and requires two-way conversation plus agent-local speech on the AUT record. Hosted scenarios use a speech-safe three-word marker while retaining exact action, target, and single accepted-message assertions.
Hosted post-call turns use a default-deny tool map and a durable SMS journal. Successful sends retain their accepted message ID so later delivery-failure events cannot escape into an unrelated recovery turn and create a duplicate. Pre-delivery policy audit rows remain visible in diagnostics but do not count as accepted SMS messages. A2A receivers are enabled and verified before each scenario, mock completions receive request-unique response IDs, external events acknowledge after durable handoff, setup-only network operations use bounded retries, and public failure output contains only state and counts.
Reason
Live failures were recurring across mutable receiver state, stale reply/call correlation, incorrect transcript ownership, reused mock response IDs, long-running external acknowledgements, model-sensitive hosted actions, and duplicate hosted delivery recovery. The fixes address those failure modes without retrying calls or messages or weakening end-to-end assertions.
Decisions
Testing
npm run lint— passed across 152 files.npm run typecheckandnpm run build— passed.npm test— 70 files and 827 tests passed.python3 -m unittest tests/live/test_a2a_preflight.py— 3 tests passed.git diff --check— passed.