ageval plugin mechanism: service decoupling & static ExtensionGraph
Environment and Agent plugins decouple via export and inject, woven into an ExtensionGraph at lock, then driven by the runtime base.
PLUGIN MECHANISM & EXTENSION GRAPH
STATIC GRAPH · DYNAMIC RUNTIME
EXPORT
INJECT
DRIVE
Environment plugins
docker
e2b
daytona
local
export: service = environment
· Expose standard environment capabilities
capabilities: [exec, upload, stdio]
Swap env via profiles · dataset unchanged
Agent plugins · Executor
claude
codex
dsh
nooa
inject: service = environment
· Declare required environment capabilities
capabilities: [exec, upload]
Generic agents & specialized harnesses plug in alike
Static dependency graph · ExtensionGraph
ageval lock weaves statically · runtime dispatch blueprint
1. Contract matching
requires ⊆ capabilities
Agent needs paired to env caps (e.g. dsh ↔ docker)
2. Early verification
Preflight: Docker alive & API keys ready
Cap or credential mismatch blocks the run
3. Lock dispatch topology (lock.json)
extension_bindings frozen into an immutable lockfile
Same input → byte-identical; dispatch strictly by graph
4. First-class official harnesses
DeepSeek dsh and peers align as plugins
No framework fork — the graph resolves dispatch
Static graph · dynamic runtime drive
Stable runtime base
Dispatch by graph · zero custom branches
01
Open environment
Bound env plugin from the graph (e.g. docker)
02
Dispatch Agent
run.py invokes Agent via executor
03
Independent scoring
Upload gold now; isolated scoring yields PASS
04
Seal evidence & reclaim
Archive evidence; finally releases the env
No base forks · swap Agent/env via config only
LEGEND
Plugin contract declaration
Contract inputs
ExtensionGraph dispatch core
Dynamic drive along the graph
Stable runtime base