Echidnabot is a Tier 1 (Verifier) bot in the gitbot-fleet ecosystem. It acts as the bridge between the ECHIDNA neurosymbolic theorem proving platform and the gitbot-fleet orchestration layer. It receives webhook events, dispatches verification requests to ECHIDNA, and reports findings back to the fleet.
Current state: ~65-70% actual completion (claims 75%). Core infrastructure complete (Axum server, webhooks, database, GraphQL, ECHIDNA HTTP client). Critical gaps: container isolation is EMPTY, bot modes not wired into handlers, retry logic not integrated, ZERO automated tests.
File: src/executor/container.rs
This file is EMPTY. Proofs currently run without any isolation — a malicious proof could execute arbitrary code on the host.
pub struct PodmanExecutor {
image: String,
timeout: Duration,
memory_limit: String,
network: bool, // should be false for proof checking
}- Run proof-checking in Podman containers (rootless)
- No network access (
--network=none) - Memory limit (
--memory=512mdefault, configurable) - CPU limit (
--cpus=2default, configurable) - Timeout with SIGKILL (
--timeout) - Read-only filesystem except
/tmpfor proof artifacts - Drop ALL capabilities (
--cap-drop=ALL) - No new privileges (
--security-opt=no-new-privileges)
- Mount proof files as read-only volume
- Capture stdout/stderr for proof results
- Parse exit code: 0 = verified, non-zero = failed/timeout
- Clean up containers after completion
- Check if Podman is available at startup
- If not: log warning, use
bubblewrap(bwrap) as lighter alternative - If neither: refuse to run proofs (fail-safe, not fail-open)
- Unit test: PodmanExecutor creates correct command line args
- Integration test: run a trivial proof in container, verify result
- Test: malicious proof attempt (e.g.,
rm -rf /) is contained - Test: timeout kills container after configured duration
Files: src/webhook/ handlers, src/bot/modes.rs or equivalent
Bot modes are defined (Verifier, Advisor, Consultant, Regulator) but NOT connected to the webhook handlers.
- Read bot mode from
.bot_directives/echidnabot.scmin the target repo - Default to
Verifiermode if no directive found - Mode determines:
- Verifier: Full proof checking, block PR on failure
- Advisor: Check proofs, comment results, don't block
- Consultant: Only analyze when explicitly requested (@echidnabot check)
- Regulator: Enforce minimum proof coverage thresholds
- On PR open/update: determine mode → dispatch appropriate action
- Verifier/Advisor: automatically trigger proof checking
- Consultant: only respond to explicit mentions
- Regulator: check proof coverage metrics
- On push to main: determine mode → dispatch appropriate action
- All modes: update proof status dashboard
- Test: webhook with Verifier mode triggers proof checking
- Test: webhook with Consultant mode does NOT auto-trigger
- Test: missing directive defaults to Verifier
Files: src/scheduler/ or src/executor/
Retry logic is defined somewhere in the codebase but NOT integrated into the actual execution pipeline.
- Locate the retry/backoff implementation
- Wire it into the proof execution pipeline:
- Container startup failure → retry with backoff
- ECHIDNA API timeout → retry up to 3 times
- Transient network errors → retry with exponential backoff
- Proof timeout → do NOT retry (intentional, resource-saving)
- If ECHIDNA API fails 5 consecutive times → circuit breaker opens
- Log error, notify fleet coordinator
- Auto-reset after 5 minutes
- Test: transient failure retries and succeeds on second attempt
- Test: permanent failure stops after max retries
- Test: circuit breaker opens after consecutive failures
The repo has ZERO tests despite importing test libraries.
- Test: HTTP client constructs correct API requests
- Test: response parsing handles success case
- Test: response parsing handles error case
- Test: timeout handling
- Test: valid HMAC-SHA256 signature passes
- Test: invalid signature is rejected
- Test: missing signature header is rejected
- Test: query resolves proof status
- Test: mutation triggers proof check
- Test: authentication required for mutations
- Test: proof result CRUD operations
- Test: concurrent access handling
- Test: full webhook → dispatch → (mock) ECHIDNA → finding → fleet context flow
- Use mock ECHIDNA server (axum test server)
cargo test— minimum 20 tests, all passing- No test requires actual ECHIDNA instance (use mocks)
- License: must be
PMPL-1.0-or-later(not AGPL) - Author: must be
"Jonathan D.A. Jewell <jonathan.jewell@open.ac.uk>"
- Every
.rsfile needs:// SPDX-License-Identifier: PMPL-1.0-or-later // SPDX-FileCopyrightText: 2025 Jonathan D.A. Jewell
- Update completion to actual percentage
- Fix tech-stack if inaccurate
- Add session history entry
grep -r "AGPL" .returns nothing- All
.rsfiles have SPDX headers
Connect echidnabot to echidna's trust verification mechanisms.
- When ECHIDNA returns a proof result, include the confidence level in the Finding:
- Level 5: Cross-checked by 2+ independent small-kernel systems
- Level 4: Checked by small-kernel system (Lean4, Coq, Isabelle) with certificate
- Level 3: Single prover with proof certificate (Alethe, DRAT/LRAT)
- Level 2: Single prover result without certificate
- Level 1: Large-TCB system or unchecked result
- Map confidence to Finding severity and metadata
- Before dispatching to ECHIDNA, verify that the solver binaries haven't been tampered with
- Check SHA256 manifest (see echidna SONNET-TASKS.md Task 2)
- Report integrity status in Finding metadata
- Parse ECHIDNA proof results for axiom usage
- Flag proofs using
sorry,Admitted,postulate,choice,--type-in-type - Report axiom reliance as separate Finding with Warning severity
- Test: confidence level correctly mapped for each prover type
- Test: axiom usage detected and reported
- Test: solver integrity check included in results