simulation-orchestrator
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSimulation Orchestrator
模拟编排工具
Goal
目标
Provide tools to manage multi-simulation campaigns: generate parameter sweeps, track job execution status, and aggregate results from completed runs.
提供工具管理多模拟任务:生成参数扫描配置、跟踪任务执行状态、汇总已完成运行的结果。
Requirements
要求
- Python 3.10+
- No external dependencies (uses Python standard library only)
- Works on Linux, macOS, and Windows
- Python 3.10+
- 无外部依赖(仅使用Python标准库)
- 支持Linux、macOS和Windows系统
Inputs to Gather
需要收集的输入信息
Before running orchestration scripts, collect from the user:
| Input | Description | Example |
|---|---|---|
| Base config | Template simulation configuration | |
| Parameter ranges | Parameters to sweep with bounds | |
| Sweep method | How to sample parameter space | |
| Output directory | Where to store campaign files | |
| Simulation command | Command to run each simulation | |
运行编排脚本前,需向用户收集以下信息:
| 输入项 | 描述 | 示例 |
|---|---|---|
| 基础配置 | 模拟配置模板 | |
| 参数范围 | 待扫描参数的取值区间 | |
| 扫描方法 | 参数空间的采样方式 | |
| 输出目录 | 任务文件的存储路径 | |
| 模拟命令 | 运行单个模拟的命令 | |
Decision Guidance
决策指引
Choosing a Sweep Method
选择扫描方法
Need every combination (full factorial)?
├── YES → Use grid (warning: exponential growth with parameters)
└── NO → Is space-filling coverage needed?
├── YES → Use lhs (Latin Hypercube Sampling)
└── NO → Use linspace for uniform sampling per parameter| Method | Best For | Sample Count |
|---|---|---|
| Low dimensions (1-3), need exact corners | n^d (exponential) |
| 1D sweeps, uniform spacing | n per parameter |
| High dimensions, space-filling | user-specified budget |
需要所有参数组合(全因子)?
├── 是 → 使用grid(注意:参数数量增加时组合数呈指数增长)
└── 否 → 是否需要空间填充式覆盖?
├── 是 → 使用lhs(Latin Hypercube Sampling)
└── 否 → 使用linspace进行单参数均匀采样| 方法 | 适用场景 | 样本数量 |
|---|---|---|
| 低维度(1-3个参数),需要精确覆盖所有边界 | n^d(指数级增长) |
| 一维扫描,均匀间隔采样 | 每个参数取n个值 |
| 高维度,需要空间填充式覆盖 | 用户指定的采样数量 |
Campaign Size Guidelines
任务规模指南
| Parameters | Grid Points Each | Total Runs | Recommendation |
|---|---|---|---|
| 1 | 10 | 10 | Grid is fine |
| 2 | 10 | 100 | Grid acceptable |
| 3 | 10 | 1,000 | Consider LHS |
| 4+ | 10 | 10,000+ | Use LHS or DOE |
| 参数数量 | 每个参数的网格点数 | 总运行次数 | 建议 |
|---|---|---|---|
| 1 | 10 | 10 | 使用grid即可 |
| 2 | 10 | 100 | 使用grid可行 |
| 3 | 10 | 1,000 | 考虑使用LHS |
| 4+ | 10 | 10,000+ | 使用LHS或DOE |
Script Outputs (JSON Fields)
脚本输出(JSON字段)
| Script | Output Fields |
|---|---|
| |
| |
| |
| |
| |
| |
Note on swept parameter names:writes each swept value into the base config by key path. A bare name (e.g.sweep_generator.py) overwrites a top-level key; a dot-notation name (e.g.kappa) targets a nested key. The swept key path must match where the solver reads the value — sweepingparameters.kappaagainst a config that nestskappawould add an unused top-level key and silently leave the base value in place. Seeparameters.kappa.references/sweep_strategies.md
| 脚本 | 输出字段 |
|---|---|
| |
| |
| |
| |
| |
| |
关于扫描参数名称的说明:会按键路径将每个扫描值写入基础配置。裸名称(如sweep_generator.py)会覆盖顶层键;点符号名称(如kappa)会定位嵌套键。扫描的键路径必须与求解器读取值的位置匹配——如果针对嵌套了parameters.kappa的配置扫描parameters.kappa,会添加一个未使用的顶层键,而基础值会保持不变且无提示。详见kappa。references/sweep_strategies.md
Workflow
工作流
Step 1: Generate Parameter Sweep
步骤1:生成参数扫描配置
Create configurations for all parameter combinations:
bash
python3 scripts/sweep_generator.py \
--base-config base_config.json \
--params "dt:1e-4:1e-2:5,kappa:0.1:1.0:3" \
--method linspace \
--output-dir ./campaign_001 \
--json创建所有参数组合的配置文件:
bash
python3 scripts/sweep_generator.py \
--base-config base_config.json \
--params "dt:1e-4:1e-2:5,kappa:0.1:1.0:3" \
--method linspace \
--output-dir ./campaign_001 \
--jsonStep 2: Initialize Campaign
步骤2:初始化任务
Create campaign tracking structure:
bash
python3 scripts/campaign_manager.py \
--action init \
--config-dir ./campaign_001 \
--command "python sim.py --config {config}" \
--json创建任务跟踪结构:
bash
python3 scripts/campaign_manager.py \
--action init \
--config-dir ./campaign_001 \
--command "python sim.py --config {config}" \
--jsonStep 3: Track Job Status
步骤3:跟踪任务状态
Monitor running jobs:
bash
python3 scripts/job_tracker.py \
--campaign-dir ./campaign_001 \
--update \
--json监控运行中的任务:
bash
python3 scripts/job_tracker.py \
--campaign-dir ./campaign_001 \
--update \
--jsonStep 4: Aggregate Results
步骤4:汇总结果
Combine results from completed runs:
bash
python3 scripts/result_aggregator.py \
--campaign-dir ./campaign_001 \
--metric final_energy \
--jsonresult_aggregator.pybest_runsummary.minimizetrue--maximizebest_runbash
undefined合并已完成运行的结果:
bash
python3 scripts/result_aggregator.py \
--campaign-dir ./campaign_001 \
--metric final_energy \
--jsonresult_aggregator.pybest_runsummary.minimizetrue--maximizebest_runbash
undefinedHigher is better -> select the maximum
指标值越高越好 → 选择最大值
python3 scripts/result_aggregator.py
--campaign-dir ./campaign_001
--metric yield
--maximize
--json
--campaign-dir ./campaign_001
--metric yield
--maximize
--json
> **Decision guidance**: If higher is better (yield, accuracy, throughput), pass
> `--maximize`; otherwise the reported `best_run` is the **minimum**.python3 scripts/result_aggregator.py
--campaign-dir ./campaign_001
--metric yield
--maximize
--json
--campaign-dir ./campaign_001
--metric yield
--maximize
--json
> **决策指引**:如果指标值越高越好(产量、准确率、吞吐量),传入`--maximize`;否则默认`best_run`对应指标值的最小值。CLI Examples
CLI示例
bash
undefinedbash
undefinedGenerate 5x3=15 runs varying dt (5 values) and kappa (3 values)
生成5×3=15次运行,dt取5个值,kappa取3个值
python3 scripts/sweep_generator.py
--base-config sim.json
--params "dt:1e-4:1e-2:5,kappa:0.1:1.0:3"
--method linspace
--output-dir ./sweep_001
--json
--base-config sim.json
--params "dt:1e-4:1e-2:5,kappa:0.1:1.0:3"
--method linspace
--output-dir ./sweep_001
--json
python3 scripts/sweep_generator.py
--base-config sim.json
--params "dt:1e-4:1e-2:5,kappa:0.1:1.0:3"
--method linspace
--output-dir ./sweep_001
--json
--base-config sim.json
--params "dt:1e-4:1e-2:5,kappa:0.1:1.0:3"
--method linspace
--output-dir ./sweep_001
--json
Generate LHS samples for 4 parameters with budget of 20 runs
为4个参数生成LHS样本,采样数量为20
python3 scripts/sweep_generator.py
--base-config sim.json
--params "dt:1e-4:1e-2,kappa:0.1:1.0,M:1e-6:1e-4,W:0.5:2.0"
--method lhs
--samples 20
--output-dir ./lhs_001
--json
--base-config sim.json
--params "dt:1e-4:1e-2,kappa:0.1:1.0,M:1e-6:1e-4,W:0.5:2.0"
--method lhs
--samples 20
--output-dir ./lhs_001
--json
python3 scripts/sweep_generator.py
--base-config sim.json
--params "dt:1e-4:1e-2,kappa:0.1:1.0,M:1e-6:1e-4,W:0.5:2.0"
--method lhs
--samples 20
--output-dir ./lhs_001
--json
--base-config sim.json
--params "dt:1e-4:1e-2,kappa:0.1:1.0,M:1e-6:1e-4,W:0.5:2.0"
--method lhs
--samples 20
--output-dir ./lhs_001
--json
Check campaign status
查看任务状态
python3 scripts/campaign_manager.py
--action status
--config-dir ./sweep_001
--json
--action status
--config-dir ./sweep_001
--json
python3 scripts/campaign_manager.py
--action status
--config-dir ./sweep_001
--json
--action status
--config-dir ./sweep_001
--json
List jobs (read-only), optionally filtered by status
列出任务(只读),可按状态筛选
python3 scripts/campaign_manager.py
--action list
--config-dir ./sweep_001
--status-filter failed
--json
--action list
--config-dir ./sweep_001
--status-filter failed
--json
python3 scripts/campaign_manager.py
--action list
--config-dir ./sweep_001
--status-filter failed
--json
--action list
--config-dir ./sweep_001
--status-filter failed
--json
Get summary statistics from completed runs (minimize: best = lowest)
汇总已完成运行的统计信息(最小化:最优为最低值)
python3 scripts/result_aggregator.py
--campaign-dir ./sweep_001
--metric final_energy
--json
--campaign-dir ./sweep_001
--metric final_energy
--json
python3 scripts/result_aggregator.py
--campaign-dir ./sweep_001
--metric final_energy
--json
--campaign-dir ./sweep_001
--metric final_energy
--json
Maximization metric: best = highest value (yield, accuracy, throughput)
最大化指标:最优为最高值(产量、准确率、吞吐量)
python3 scripts/result_aggregator.py
--campaign-dir ./sweep_001
--metric yield
--maximize
--json
--campaign-dir ./sweep_001
--metric yield
--maximize
--json
undefinedpython3 scripts/result_aggregator.py
--campaign-dir ./sweep_001
--metric yield
--maximize
--json
--campaign-dir ./sweep_001
--metric yield
--maximize
--json
undefinedConversational Workflow Example
对话式工作流示例
User: I want to run a parameter sweep on dt and kappa for my phase-field simulation. I want to try 5 values of dt between 1e-4 and 1e-2, and 4 values of kappa between 0.1 and 1.0.
Agent workflow:
- Calculate total runs: 5 x 4 = 20 runs
- Generate sweep configurations:
bash
python3 scripts/sweep_generator.py \ --base-config simulation.json \ --params "dt:1e-4:1e-2:5,kappa:0.1:1.0:4" \ --method linspace \ --output-dir ./dt_kappa_sweep \ --json - Initialize campaign:
bash
python3 scripts/campaign_manager.py \ --action init \ --config-dir ./dt_kappa_sweep \ --command "python phase_field.py --config {config}" \ --json - After user runs simulations, aggregate results:
bash
python3 scripts/result_aggregator.py \ --campaign-dir ./dt_kappa_sweep \ --metric interface_width \ --json
用户:我想为我的相场模拟开展dt和kappa的参数扫描。dt要在1e-4到1e-2之间取5个值,kappa要在0.1到1.0之间取4个值。
Agent工作流:
- 计算总运行次数:5×4=20次
- 生成扫描配置:
bash
python3 scripts/sweep_generator.py \ --base-config simulation.json \ --params "dt:1e-4:1e-2:5,kappa:0.1:1.0:4" \ --method linspace \ --output-dir ./dt_kappa_sweep \ --json - 初始化任务:
bash
python3 scripts/campaign_manager.py \ --action init \ --config-dir ./dt_kappa_sweep \ --command "python phase_field.py --config {config}" \ --json - 用户运行模拟后,汇总结果:
bash
python3 scripts/result_aggregator.py \ --campaign-dir ./dt_kappa_sweep \ --metric interface_width \ --json
Error Handling
错误处理
| Error | Cause | Resolution |
|---|---|---|
| Invalid file path | Verify base config file exists |
| Malformed param string | Use format |
| Would overwrite | Use |
| No results to aggregate | Wait for jobs to complete or check for failures |
| Result files missing field | Verify metric name in result JSON |
| 错误 | 原因 | 解决方法 |
|---|---|---|
| 文件路径无效 | 确认基础配置文件存在 |
| 参数格式错误 | 使用 |
| 会覆盖已有内容 | 使用 |
| 无结果可汇总 | 等待任务完成或检查失败原因 |
| 结果文件缺少指定字段 | 确认结果JSON中的指标名称正确 |
Integration with Other Skills
与其他技能的集成
The simulation-orchestrator works with other simulation-workflow skills:
parameter-optimization simulation-orchestrator
│ │
│ DOE samples ────────────────>│ Generate configs
│ │
│ │ Run simulations
│ │
│<──────────────────────────── │ Aggregate results
│ │
│ Sensitivity analysis │
│ Optimizer selection │模拟编排工具可与其他模拟工作流技能配合使用:
parameter-optimization simulation-orchestrator
│ │
│ DOE样本 ────────────────>│ 生成配置
│ │
│ │ 运行模拟
│ │
│<──────────────────────────── │ 汇总结果
│ │
│ 敏感性分析 │
│ 优化器选择 │Typical Combined Workflow
典型组合工作流
- Use to get sample points
parameter-optimization/doe_generator.py - Use to create configs
simulation-orchestrator/sweep_generator.py - Run simulations (user's responsibility)
- Use to collect results
simulation-orchestrator/result_aggregator.py - Use to analyze
parameter-optimization/sensitivity_summary.py
- 使用获取样本点
parameter-optimization/doe_generator.py - 使用创建配置
simulation-orchestrator/sweep_generator.py - 运行模拟(用户负责)
- 使用收集结果
simulation-orchestrator/result_aggregator.py - 使用进行分析
parameter-optimization/sensitivity_summary.py
Verification checklist
验证清单
Before trusting a campaign's or summary statistics, record concrete evidence for each item:
best_run- Confirmed the swept key path actually changed the value the solver reads: opened at least one generated and verified the swept parameter (e.g.
config_NNNN.json) holds the expected value at the expected nesting level, not a duplicate unused top-level key (parameters.kappawrites by key path).sweep_generator.py - Reconciled job accounting from : recorded
result_aggregator.py --json,summary.total_jobs, andsummary.completed, and confirmedsummary.failed. Any shortfall means runs were silently skipped (missing result file orcompleted + failed == total_jobsreturnedextract_metric) and must be investigated, not ignored.None - Confirmed and that the recorded
completed > 0matches the field the solver actually writes. A typo'd or absent metric makessummary.metricreturnextract_metric, yielding zero completed runs with no error.None - Recorded and confirmed it matches the intended direction (default minimize;
summary.minimizefor yield/accuracy/throughput) before quoting--maximize.best_run - Did NOT treat "completed" as physical success: it flags a job completed purely from a result-file's existence and stamps
job_tracker.py0 — independently checked the run's real exit status / solver logs for non-zero codes or NaN/Inf output.exit_code - Applied an outlier/sanity check to the metric values (e.g. Tukey 1.5x IQR from ) and confirmed
references/aggregation_methods.mdis physically plausible, not a crashed run that emitted a spurious extremum.best_run.value - For LHS sweeps, recorded the used and saved
--seed(parameter bounds,manifest.json,total_runs) so the sample set is reproducible.parameter_space
在信任任务的或统计摘要前,需逐一确认以下事项:
best_run- 确认扫描的键路径确实修改了求解器读取的值:打开至少一个生成的,验证扫描参数(如
config_NNNN.json)在预期的嵌套层级上有预期值,而非出现一个未使用的重复顶层键(parameters.kappa按键路径写入)。sweep_generator.py - 核对的任务统计:记录
result_aggregator.py --json、summary.total_jobs和summary.completed,确认summary.failed。若不相等,说明有运行被静默跳过(缺少结果文件或completed + failed == total_jobs返回extract_metric),必须排查原因,不可忽略。None - 确认,且记录的
completed > 0与求解器实际输出的字段一致。若指标名称拼写错误或不存在,summary.metric会返回extract_metric,导致None为0且无错误提示。completed - 记录并确认其与预期的优化方向一致(默认最小化;针对产量/准确率/吞吐量使用
summary.minimize),再引用--maximize。best_run - 不要将的“completed”视为实际运行成功:它仅根据结果文件的存在标记“completed”并硬编码
job_tracker.py为0——需独立检查运行的实际退出状态/求解器日志,确认是否有非零代码或NaN/Inf输出。exit_code - 对指标值进行异常值/合理性检查(如参考中的Tukey 1.5x IQR方法),确认
references/aggregation_methods.md符合物理逻辑,而非崩溃运行产生的虚假极值。best_run.value - 对于LHS扫描,记录使用的并保存
--seed(参数范围、manifest.json、total_runs),确保样本集可复现。parameter_space
Common pitfalls & rationalizations
常见误区与合理化借口
| Tempting shortcut | Why it's wrong / what to do |
|---|---|
| "The job tracker says completed, so the run succeeded." | |
" | Jobs with a missing result file or a metric that |
"Aggregation returned a | By default the aggregator minimizes. If higher is better you must pass |
"I swept | |
| "The metric name is close enough." | A misspelled or absent metric makes |
| "Grid covers everything, so use it for all my parameters." | Grid is |
| "LHS is random, so I don't need to record anything." | LHS is reproducible only with a fixed |
| 诱人的捷径 | 错误原因及正确做法 |
|---|---|
| “任务跟踪器显示已完成,所以运行成功了。” | |
| “已完成的任务数量很多,所以我已经拿到所有结果了。” | 缺少结果文件或 |
“汇总结果返回了 | 汇总器默认执行最小化操作。如果指标值越高越好,必须传入 |
“我扫描了 | |
| “指标名称差不多就行。” | 拼写错误或不存在的指标会导致 |
| “网格能覆盖所有情况,所以所有参数都用网格扫描。” | 网格扫描的数量是 |
| “LHS是随机的,所以不需要记录任何信息。” | 只有在固定 |
Security
安全性
Input Validation
输入验证
- Metric names () are validated against
result_aggregator.py --metricto prevent traversal or injection via crafted keys[a-zA-Z_][a-zA-Z0-9_.]* - Swept parameter names () are validated against
sweep_generator.py --params(dot notation for nested keys); invalid names are rejected[a-zA-Z_][a-zA-Z0-9_]*(.[a-zA-Z_][a-zA-Z0-9_]*)* - validates command templates to reject shell chaining operators (
campaign_manager.py,;,|, backticks,&)$ - format strings are parsed and validated (
--paramswith finite numeric bounds —name:min:max:count/NaNrejected —Inf, and positive integer counts capped at 100,000); at most 32 parameters per sweepmin < max - is validated against a fixed allowlist (
--method,grid,linspace)lhs - is validated as a positive integer with an upper bound (max 1,000,000)
--samples - is validated against a fixed allowlist (
--action,init,status); for the read-onlylistaction,listis validated against--status-filter,pending,running,completedfailed
- 指标名称()会验证是否符合
result_aggregator.py --metric格式,防止通过构造的键进行路径遍历或注入攻击[a-zA-Z_][a-zA-Z0-9_.]* - 扫描参数名称()会验证是否符合
sweep_generator.py --params格式(嵌套键使用点符号);无效名称会被拒绝[a-zA-Z_][a-zA-Z0-9_]*(.[a-zA-Z_][a-zA-Z0-9_]*)* - 会验证命令模板,拒绝shell链式操作符(
campaign_manager.py、;、|、反引号、&)$ - 格式字符串会被解析和验证(格式为
--params,数值区间有限——拒绝name:min:max:count/NaN——Inf,正整数数量上限为100000);每次扫描最多支持32个参数min < max - 会验证是否在固定允许列表中(
--method、grid、linspace)lhs - 会验证为正整数且有上限(最大1000000)
--samples - 会验证是否在固定允许列表中(
--action、init、status);对于只读的list操作,list会验证是否为--status-filter、pending、running、completedfailed
File Access
文件访问
- reads a single base config file (JSON) specified by
sweep_generator.pyand writes generated configs to--base-config--output-dir - enforces a 10 MB file-size limit per result file, maximum JSON nesting depth, and strict numeric type checking (rejects
result_aggregator.py,bool,NaN)Inf - All string values from result files are sanitized (truncated, control characters stripped) before surfacing them
- Config paths interpolated into shell commands are validated against a safe-character allowlist and escaped with
shlex.quote()
- 读取
sweep_generator.py指定的单个基础配置文件(JSON),并将生成的配置写入--base-config--output-dir - 对每个结果文件强制执行10MB大小限制、最大JSON嵌套深度,并严格检查数值类型(拒绝
result_aggregator.py、bool、NaN)Inf - 结果文件中的所有字符串值在展示前都会被清理(截断、去除控制字符)
- 插入到shell命令中的配置路径会验证是否符合安全字符列表,并使用进行转义
shlex.quote()
Tool Restrictions
工具限制
- Read: Used to inspect script source, references, base configs, and campaign status files
- Write: Used to save generated sweep configs, campaign manifests, and aggregated results; writes are scoped to the user's working directory
- Grep/Glob: Used to locate campaign files, result files, and search references
- The skill's excludes
allowed-toolsto prevent the agent from executing arbitrary commands when processing untrusted simulation outputsBash
- 读取:用于检查脚本源码、参考文档、基础配置和任务状态文件
- 写入:用于保存生成的扫描配置、任务清单和汇总结果;写入操作仅限于用户的工作目录
- Grep/Glob:用于定位任务文件、结果文件和搜索参考文档
- 技能的排除了
allowed-tools,防止代理在处理不可信模拟输出时执行任意命令Bash
Safety Measures
安全措施
- No ,
eval(), or dynamic code generationexec() - All subprocess calls use explicit argument lists (no )
shell=True - Reduced tool surface (no Bash) limits the agent to read/write operations only
- Command templates are validated but never executed by the skill itself; execution is the user's responsibility
- 不使用、
eval()或动态代码生成exec() - 所有子进程调用使用显式参数列表(不使用)
shell=True - 减少工具范围(无Bash),限制代理仅执行读写操作
- 命令模板会被验证,但技能本身从不执行命令;执行由用户负责
Limitations
局限性
- Not a job scheduler: Does not submit jobs to SLURM/PBS; generates configs and tracks status
- No parallel execution: User must run simulations externally (can use GNU parallel, SLURM, etc.)
- File-based tracking: Status tracked via files; no database or real-time monitoring
- Local filesystem: Assumes all files accessible from local machine
- 不是任务调度器:不会将任务提交到SLURM/PBS;仅生成配置并跟踪状态
- 不支持并行执行:用户需在外部运行模拟(可使用GNU parallel、SLURM等工具)
- 基于文件的跟踪:通过文件跟踪状态;无数据库或实时监控
- 本地文件系统:假设所有文件均可从本地机器访问
References
参考文档
- - Common campaign structures
references/campaign_patterns.md - - Parameter sweep design guidance
references/sweep_strategies.md - - Result aggregation techniques
references/aggregation_methods.md
- - 常见任务结构
references/campaign_patterns.md - - 参数扫描设计指引
references/sweep_strategies.md - - 结果汇总技术
references/aggregation_methods.md
Version History
版本历史
See for the authoritative, dated history. Summary:
CHANGELOG.md- v1.1.3 (2026-06-24): Added a Verification checklist and a Common pitfalls & rationalizations section grounded in the scripts' real behavior (result-file-only "completed" detection, silent skip of unreadable metrics, minimize-by-default direction, key-path merge semantics)
- v1.1.1 (2026-06-23): Dot-notation nested overrides in , input-validation hardening (
sweep_generator.pyname/finite/count caps,--paramsbounds), documented--samplesand the--maximizeaction, corrected Script Outputs table and worked-example numberslist - v1.1.0 (2026-03-26): Standardized metadata, evaluation suite, security review, CHANGELOG
- v1.0.0 (2026-02-25): Initial release with sweep, campaign, tracking, and aggregation
详见获取权威的日期化历史记录。摘要:
CHANGELOG.md- v1.1.3(2026-06-24):新增验证清单和常见误区与合理化借口部分,内容基于脚本实际行为(仅通过结果文件判断“完成”、静默跳过无法读取的指标、默认最小化方向、键路径合并语义)
- v1.1.1(2026-06-23):支持点符号嵌套覆盖,强化输入验证(
sweep_generator.py名称/有限性/数量上限、--params范围),文档化--samples和--maximize操作,修正脚本输出表格和示例数值list - v1.1.0(2026-03-26):标准化元数据、评估套件、安全审查、CHANGELOG
- v1.0.0(2026-02-25):初始版本,包含扫描、任务、跟踪和汇总功能