Skip to content

feat(echidnabot): consume typed VerifyOutcome + mode/smtStatus from echidna GraphQL (follow-up to echidna#180) #245

Description

@hyperpolymath

Context

echidna#180 / echidna PR #188 added the three GraphQL operations (verifyProof, suggestTactics(prover/context/goalState), proverStatus) the echidnabot client expects, and also surfaced the typed REST /api/verify taxonomy through GraphQL:

  • new GraphQL enum VerifyOutcome with variants PROVED / NO_PROOF_FOUND / INVALID_INPUT / UNSUPPORTED_FEATURE / TIMEOUT / INCONSISTENT_PREMISES / PROVER_ERROR / SYSTEM_ERROR
  • new fields on VerifyProofResult: outcome: VerifyOutcome!, mode: String, smtStatus: String

This issue tracks the echidnabot-side work to consume the new typed fields. The current client (bots/echidnabot/src/dispatcher/echidna_client.rs) only deserializes status / message / proverOutput / durationMs / artifacts from GraphQL and the bare valid: bool from REST, dropping the typed taxonomy in both transports.

What to do

In bots/echidnabot/src/dispatcher/echidna_client.rs:

  1. Extend VerifyProofData with optional outcome: Option<String> (or a typed enum mirroring the new server-side enum), mode: Option<String>, smt_status: Option<String>. Update the GraphQL query string in verify_proof_graphql to request the new fields.
  2. Extend RestVerifyResponse identically — the REST handler has been emitting these fields since the 2026-04-17 typed-outcome work; the client currently silently discards them (seam-audit sub-finding in echidna#180).
  3. Wire the typed outcome into ProofResult so downstream consumers can distinguish Timeout from Failed without re-parsing the message string. The existing parse_proof_status heuristic stays as a fallback for when outcome is None (older echidna servers).
  4. Add a unit test that round-trips a VerifyOutcome::TIMEOUT and asserts it lands as ProofStatus::Timeout on the bot side.

Out of scope

  • The new suggestTactics(prover, context, goalState) mutation — the client already issues this exact query in suggest_tactics_graphql; once echidna PR chore(deps): bump pulldown-cmark from 0.13.3 to 0.13.4 in /bots/glambot #188 lands it just starts working.
  • The new proverStatus query — same: the client already issues it.
  • The EchidnaApiMode::Auto retry-after-failure behaviour — out of scope, separate issue if it needs tuning.

Don't

  • Don't touch src/abi/ (owner-intentional broken namespace per memory entry [echidna src/abi/ namespace intentional]).

Filed because

GitHub does not auto-close cross-repo Closes references, per the estate memory entry [Cross-repo Closes keyword doesn't auto-fire]. This issue parks the follow-up that echidna PR #188 unblocks.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew capability or improvement to existing behaviour

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions