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