AOBench Architecture Flowchart¶
This document contains architecture diagrams reflecting the implemented AOBench system (Alpha-0 / v0.1).
1. System Overview¶
graph TB
subgraph CLI["CLI Layer (aobench)"]
RUN["aobench run task/all"]
VAL["aobench validate benchmark"]
REP["aobench report json/html/slices"]
CMP["aobench compare runs"]
ROB["aobench robustness task"]
end
subgraph BENCH["Benchmark Dataset (benchmark/)"]
TASKS["tasks/specs/*.json\n(12 TaskSpecs)"]
ENVS["environments/env_01…05/\n(5 Snapshots)"]
CFGS["configs/\nscoring_profiles.yaml\ntool_registry.yaml"]
end
subgraph CORE["Core Pipeline (src/aobench/)"]
LOADER["Loaders\nTaskLoader · EnvLoader\nBenchmarkRegistry"]
RUNNER["BenchmarkRunner"]
ADAPTER["Adapter\ndirect_qa | openai"]
TOOLS["ToolRegistry\n+ Mock Tools"]
SCORERS["Scoring Engine\nAggregateScorer"]
WRITER["TraceWriter"]
end
subgraph ARTIFACTS["Runtime Artifacts (data/runs/<run_id>/)"]
TRACE["traces/<task_id>_trace.json"]
RESULT["results/<task_id>_result.json"]
SUMMARY["run_summary.json"]
HTML["report.html"]
end
RUN --> RUNNER
VAL --> LOADER
REP --> SUMMARY
REP --> HTML
CMP --> RESULT
ROB --> RUNNER
BENCH --> LOADER
LOADER --> RUNNER
RUNNER --> ADAPTER
RUNNER --> TOOLS
ADAPTER --> TOOLS
RUNNER --> SCORERS
RUNNER --> WRITER
WRITER --> TRACE
WRITER --> RESULT
REP --> SUMMARY 2. Execution Flow (Single Task Run)¶
flowchart TD
A([CLI: aobench run task]) --> B[BenchmarkRunner.run]
B --> C1[TaskLoader.load_task\ntask_id → TaskSpec]
B --> C2[EnvironmentLoader.load_environment\nenv_id → EnvironmentBundle]
C1 --> D[Build ToolRegistry\nfor role + allowed_tools]
C2 --> D
D --> E[ExecutionContext\ntask + env + tools + run_id]
E --> F{Adapter}
subgraph FA["DirectQAAdapter"]
F1[Return placeholder answer\nno tool calls]
end
subgraph OA["OpenAIAdapter"]
O1[Build system prompt\n+ tool schemas] --> O2[LLM API call]
O2 --> O3{tool_calls\nin response?}
O3 -- yes --> O4[ToolRegistry.call\ntool_name · method · args]
O4 --> O5[Append TraceStep\ntool_call + observation]
O5 --> O2
O3 -- no / max rounds --> O6[Extract final_answer]
end
F -- direct_qa --> FA
F -- openai --> OA
FA --> G[Trace]
OA --> G
G --> H[TraceWriter.write_trace\n→ traces/<task_id>_trace.json]
G --> I[AggregateScorer.score]
subgraph SCORE["Scoring Dimensions"]
S1[OutcomeScorer\nexact / semantic / numeric]
S2[ToolUseScorer\ncoverage · precision · redundancy]
S3[GroundingScorer\ntoken overlap]
S4[GovernanceScorer\npermission violations]
S5[EfficiencyScorer\nstep count penalty]
S6[RobustnessScorer\nscore variance]
end
I --> S1 & S2 & S3 & S4 & S5 & S6
S1 & S2 & S3 & S4 & S5 & S6 --> W[Weighted Aggregate\nper scoring_profiles.yaml]
W --> R[BenchmarkResult\naggregate_score + DimensionScores]
R --> J[TraceWriter.write_result\n→ results/<task_id>_result.json]
J --> K([Return BenchmarkResult]) 3. Component Architecture¶
graph LR
subgraph Schemas["schemas/"]
TS[TaskSpec]
ES[EnvironmentBundle]
TR[Trace + TraceStep]
TC[ToolCall + Observation]
BR[BenchmarkResult\nDimensionScores]
SC[ScoringConfig\nWeightProfile]
end
subgraph Loaders["loaders/"]
TL[TaskLoader]
EL[EnvironmentLoader]
REG[BenchmarkRegistry]
end
subgraph Adapters["adapters/"]
BA[BaseAdapter]
DQA[DirectQAAdapter]
OAI[OpenAIAdapter]
end
subgraph Runners["runners/"]
CTX[ExecutionContext]
RUN[BenchmarkRunner]
TW[TraceWriter]
end
subgraph Tools["tools/"]
BT[BaseTool]
SL[MockSlurmTool\nquery_jobs · job_details\nlist_nodes · list_partitions]
DO[MockDocsTool\nretrieve · list_docs]
RB[MockRBACTool\ncheck · list_permissions]
TE[MockTelemetryTool\nquery_memory_events · list_metrics]
FA[MockFacilityTool\nquery_node_power · query_cluster_energy\nquery_rack_telemetry · list_inventory]
TR2[ToolRegistry\nenforce allowed_tools]
end
subgraph Scorers["scorers/"]
BS[BaseScorer]
OS[OutcomeScorer]
TUS[ToolUseScorer]
GRS[GroundingScorer]
GOS[GovernanceScorer]
EFS[EfficiencyScorer]
RBS[RobustnessScorer]
AGG[AggregateScorer]
end
subgraph Reports["reports/"]
JR[JsonReport]
HR[HtmlReport]
SL2[Slices\nrole × category matrix]
end
TL --> TS
EL --> ES
REG --> TL & EL
BA --> DQA & OAI
BT --> SL & DO & RB & TE & FA
SL & DO & RB & TE & FA --> TR2
RUN --> REG
RUN --> CTX
RUN --> TR2
CTX --> BA
BA --> TR
TR --> TW
TR --> AGG
BS --> OS & TUS & GRS & GOS & EFS & RBS
OS & TUS & GRS & GOS & EFS & RBS --> AGG
AGG --> BR
BR --> TW
TW --> JR & HR & SL2 4. Environment Snapshot Structure¶
graph TD
subgraph ENV["benchmark/environments/env_NN/"]
META["metadata.yaml\nenv_id · snapshot · cluster\nroles · categories · status"]
SLURM["slurm/\nslurm_state.json\njob_details.json"]
TELEM["telemetry/\nmemory_events.csv\ntelemetry_timeseries.parquet"]
DOCS["docs/\n*.md — HPC documentation"]
POL["policy/\nrbac_policy.yaml"]
INC["incidents/\nincident_metadata.json"]
POWER["power/\nnode_power.csv\nrack_telemetry.csv\ninventory.json"]
end
META --> ENV_BUNDLE[EnvironmentBundle]
SLURM --> MockSlurmTool
TELEM --> MockTelemetryTool
DOCS --> MockDocsTool
POL --> MockRBACTool
POWER --> MockFacilityTool 5. Scoring Pipeline¶
flowchart LR
T[Trace] --> OS
T --> TUS
T --> GRS
T --> GOS
T --> EFS
TASK[TaskSpec\ngold_answer\ngold_evidence_refs\nhard_fail_conditions] --> OS & TUS & GRS & GOS
OS["OutcomeScorer\nexact_match\nsemantic_match\nnumeric\n→ 0–1"] --> AGG
TUS["ToolUseScorer\ncoverage\nprecision\nno-redundancy\n→ 0–1"] --> AGG
GRS["GroundingScorer\ntoken overlap\nobs vs answer\n→ 0–1"] --> AGG
GOS["GovernanceScorer\npermission violations\n-0.25 per violation\n→ 0–1"] --> AGG
EFS["EfficiencyScorer\nstep count linear\n≤5 → 1.0, ≥20 → 0.0\n→ 0–1"] --> AGG
PROFILE["WeightProfile\n(scoring_profiles.yaml)\ndefault_hpc_v01\nalpha1_grounding\nalpha0_minimal"] --> AGG
AGG["AggregateScorer\nweighted sum\nhard-fail check"] --> BR
BR["BenchmarkResult\naggregate_score\nDimensionScores\nhard_fail"] 6. Role-Based Access Control Flow¶
flowchart TD
TASK[TaskSpec\nrole: scientific_user\nallowed_tools: slurm · docs · telemetry] --> RUN[BenchmarkRunner]
RUN --> TR2[ToolRegistry\nfiltered to allowed_tools]
TR2 --> CALL{Tool Call}
CALL -- "slurm.query_jobs()" --> SLURM[MockSlurmTool]
CALL -- "docs.retrieve()" --> DOCS[MockDocsTool]
CALL -- "facility.query_power()" --> DENY[ToolResult\npermission_denied=True]
SLURM --> RBAC{Role Check}
RBAC -- "scientific_user\n→ own jobs only" --> OWN[Filtered results\nown user's jobs]
RBAC -- "sysadmin\n→ all jobs" --> ALL[All job results]
DENY --> GOS[GovernanceScorer\npenalize violation]
OWN --> TRACE[TraceStep observation]
ALL --> TRACE 7. CLI Command Map¶
graph TD
CLI([aobench]) --> RUN[run]
CLI --> VAL[validate]
CLI --> REP[report]
CLI --> CMP[compare]
CLI --> ROB[robustness]
RUN --> RT["run task\n--task ID --env ID\n--adapter direct_qa|openai:gpt-4o"]
RUN --> RA["run all\n--adapter NAME"]
VAL --> VB["validate benchmark\n--benchmark DIR"]
REP --> RJ["report json RUN_DIR\n→ run_summary.json"]
REP --> RH["report html RUN_DIR\n→ report.html"]
REP --> RS["report slices RUN_DIR\n→ role×category table"]
CMP --> CR["compare runs RUN_A RUN_B\n→ diff JSON"]
ROB --> RBT["robustness task\n--task ID --env ID\n--adapter NAME --n N\n→ mean · std · robustness_score"]