Follow-up to the GA-readiness audit in #493. These are the High/Medium/Low findings that are not GA-critical blockers (no data-loss/security-boundary/breaking-contract issue) and were intentionally kept out of the focused blocker PRs. All are additive / non-breaking — safe to land before or after the v1 freeze. Verified on main @ b43bad44.
The two headline pre-GA items are tracked separately:
API
CLI
MCP
SDK (Python)
Webhooks
Repo / DX
Full re-test evidence: AgentDrive audits/e2a-ga/retest-latest-b43bad44.md (see the supplement comment on #493).
Follow-up to the GA-readiness audit in #493. These are the High/Medium/Low findings that are not GA-critical blockers (no data-loss/security-boundary/breaking-contract issue) and were intentionally kept out of the focused blocker PRs. All are additive / non-breaking — safe to land before or after the v1 freeze. Verified on
main@b43bad44.The two headline pre-GA items are tracked separately:
listen --json --forwardforward-drop → branchfix/cli-listen-json-forward-drop(in progress).API
listMessages/listEvents;listAgents/listDomains/listWebhooks/listTemplatesarecursor+limitonly. Real large-tenant usability gap (add optional query params — additive).401/403/404per authenticated operation (currently only the catch-alldefault); broaden explicit400s.Locationheader on202send/reply/forward responses.application/problem+json+type/title) — document either way.CLI
listen --once --forwardexits0even when the forward POST fails — a blocking harness can't detect delivery failure (setprocess.exitCode = ERROR).main()'s catch is gated behindisTestImport) or thelistenTIMEOUT(6)/premature-close→ERROR(1) paths — frozen-contract regression protection.MCP
agentIdsfilter type inclient.tscreateWebhook/updateWebhook(wire field isagentEmails; masked by anascast) — a future refactor populating it per the declared type would silently drop the filter. Retype toagentEmails.SDK (Python)
TypeGuards don't narrow —event.datastaysAny, so theEmail*Data/Domain*DataTypedDicts are unreachable (TS narrows genuinely). Biggest cross-SDK inconsistency.AsyncE2AClient.listen()annotated-> Anyvs-> WSStreamin TS.Retry-After(seconds-only); TS honors both.from_api_exceptioncan leak raw response body/headers into.messagewhen the envelope is unparseable andreasonis empty; TS avoids this.bounce_type/sourcetoLiteral[...](plainstrtoday); type the sync facade (__getattr__ -> Any).Webhooks
next_retry_atis not advanced as River reschedules (stays at the initial value while the real next attempt moves forward) — polling clients see a stale timestamp.Repo / DX
.gitattributespinningapi/openapi.yamland the generated SDK dirs toeol=lf. On Windows (core.autocrlf=true) the LF-committed golden files check out as CRLF, sospec-check/generate-sdk-check/TestSpecGoldenNoDriftfalse-fail locally and a contributor can accidentally commit CRLF. Pinningeol=lfhardens the "handler is the spec" gate off the CI-only Linux path.github.com/Mnexa-AI/e2a, but the Go module was renamed togithub.com/tokencanopy/e2a(commit4b4beea6). (GitHub org/remote is unchanged.)Full re-test evidence: AgentDrive
audits/e2a-ga/retest-latest-b43bad44.md(see the supplement comment on #493).