Skip to content

Latest commit

 

History

History
416 lines (349 loc) · 27.7 KB

File metadata and controls

416 lines (349 loc) · 27.7 KB

RoboGuide Eval Harness

独立实验评估基础设施(experimental evaluation infrastructure),用于在 Habitat-MAS / EMOS 等外部系统与 RoboGuide 之间进行可复现、可追溯的对比实验。 当前是第一版骨架:实验编排 + 进程边界 + 可复现结果基础设施,并以 E1(Habitat-MAS Mobility,EMOS vs RoboGuide)作为第一条 workload。

E1 的收尾条件、配置记录、已实现启动门禁与待核验项见 E1 收尾计划与配置核验。各类别冻结真实 config/dataset 与代码身份;普通任务失败纳入结果,配置或证据漂移才暂停批量。

e1-pair 为 e1-batch 提供通用的原生 EMOS/生产 B1 配对入口。 准确 episode 在原生环境构造前选定;模型响应、真实 reset、源码和归档完整性独立核对。 入口不注入历史计划、不修改原生策略或 benchmark,也不按结果筛选 population。

Formal B1 的 provenance、failure owner 和 population 规则见 Evaluation Evidence Validity。Formal population 只由有效 provenance 与显式 external-infrastructure failure 决定;benchmark population 另外要求官方 Habitat pddl_success 可用。verify-b1.py 与 Harness 共用 canonical admission,Harness 消费并核对已持久化 verdict。自定义 B1 启动 wrapper 须显式配置 ROBOGUIDE_EVAL_PROTOCOL=B1,使缺少 artifacts 时仍执行 B1 gate。

B1 Controller 事件归档

场景脚本在 EXIT trap 中、停止本次子进程之前调用 b1_artifacts。事件采集复用 GET /v1/events?after=<sequence>&limit=100,按实际末尾 sequence 前进;合法序号间隔 不会补造事件。短页也继续读取,在相同游标得到两次空页后才结束;期间若出现新事件, 继续分页并重新确认尾部。采集前后必须读到身份一致、状态不变的终态 Mission (Completed / Failed / Cancelled)。

Controller HTTP 读取复用应用的 event write gate,等待当前 SQLite batch 提交或回滚后 读取已持久化页;等待在 blocking worker 中进行,不持有 gate 执行 HTTP 写出。 日志或 gate 不可用时返回带 JSON 错误的 HTTP 503,不返回伪造空页或未提交事件。 采集器对 503 仍按归档失败保存原始响应并 fail closed;此机制不提供跨页 snapshot token。

现有 API 没有 snapshot token 或全局高水位。这里确认的是 终态 Mission 的已持久化 事件前缀(terminal_durable_prefix),不保证未来无心跳或迟到事件,也不宣称全局一致 快照。Running、终态无法确认、持续写入导致预算耗尽,都显式归档为 incomplete。 MI 提交前的已记录失败及 Controller 启动失败按既有协议处理,无需伪造空事件快照。

默认最多 256 个事件页、单次响应 8 MiB、累计响应 64 MiB、采集预算 30 秒,单次 socket 等待至多 2 秒;大小探测最多额外保留一个字节。每次尝试在 controller-event-pages/attempt-*/ 保留原始响应字节、HTTP 元数据和结果。 只有完整采集才原子发布 events.json;失败不覆盖已有事件文件。 controller-event-archive.json(v0.1)记录完整性、边界、游标与 events digest。 缺失、损坏、未完成的本轮状态或不匹配的 digest 使 evidence gate 失败;保留既有文件 不能掩盖失败重采集。无此 sidecar 和采集目录的历史归档仍走原有 verifier。

归档异常记为 context.event_archive_error,CLI 返回 2,不改写 run-failure.json 中的 SUT failure owner。Formal admission、semantic goal diagnostic 与官方 benchmark 判定规则保持不变;完整分页仍不能使缺少真实任务注册事件的归档通过 provenance。

B1 终态高度对照诊断

启用物理诊断的新 B1 运行会在 evidence/diagnostics-terminal.json v0.4 中只读记录 本次实际 PDDL robot_at_thresh。自动归档额外写出 evidence/goal-geometry-diagnostic.json:对冻结 goal 中可表达的 any_at 谓词, 使用终态目标位置与所有 agent 的 PDDL 参考位置,计算完整三维距离和忽略世界 Y 坐标后的 X/Z 距离。两个谓词都在同一个终态成立才得到联合反事实 true;并不要求 两个不同机器人。计算支持任意已记录的 agent 数量。

结果以 Habitat 原始 pddl_success 为官方值;三维重建必须与它一致,否则对照 标记 unavailable。源摘要、终态 episode/scene/step、机器人集合、阈值、目标或 provenance 缺失/不匹配 也标记 unavailable。X/Z 结果仅为诊断性的假设重算,不是另一套官方评分,不能进入 Formal/benchmark population 或替代 Mission satisfaction。旧版 v0.3 终态诊断没有直接 记录阈值,因此不会被自动伪装成 v0.4 对照。需要离线重算时可运行 uv run python -m roboguide_eval.b1_goal_geometry <run-dir> --output <new-output-path>, 输出应放在新目录以保留原始归档。

边界(必须遵守)

  • Eval Harness 不属于 RoboGuide Core、Runtime、Control Plane、State & Memory Plane 或任何 Local EAIOS;它不修改 Proposal / Commit / Binding / Runtime 语义。
  • Harness 不 import、不复制、不重实现 EMOS / Habitat-MAS / RoboGuide 的内部 逻辑;外部系统只通过进程边界(subprocess)访问。
  • 不把 Habitat/EMOS 依赖加入 RoboGuide Python 环境;Harness 与 EMOS 各自 保留独立环境。
  • RoboGuideRunner 只接纳真实 Controller / Node Protocol / Runtime / Local EAIOS production-path evidence,不允许绕过 RoboGuide 直接调用 Habitat skill。
  • Harness 不定义 Habitat-MAS 如何判定 task success;各系统 runner 只把各自 原始输出转换为 canonical metrics,并保留 raw evidence。
  • 真实 results、本机 local.yaml、数据集与模型文件不提交 Git。

目录结构

evaluation/
├── specs/e1/mobility-smoke.yaml   # E1 smoke 实验定义(可移植、无机器信息)
├── e1/controlled-workload-v0.1.yaml # Formal E1 candidate + fail-closed admission
├── e1/PREFLIGHT-CLOSURE.md        # preflight checks + exact remaining blocker
├── local.yaml.example             # 本机配置模板(复制为 local.yaml,不入库)
├── src/roboguide_eval/
│   ├── models.py                  # ExperimentSpec 领域模型与 canonical 序列化
│   ├── config.py                  # spec 加载/校验、digest、本机配置、ProcessSpec 解析
│   ├── metrics.py                 # canonical metric 注册表与 MetricsPayload 合同
│   ├── process.py                 # 进程管理器(argv、env、timeout、terminate/kill)
│   ├── runner.py                  # SystemRunner 生命周期与实验编排
│   ├── results.py                 # RunManifest、run 目录、trace、汇总
│   ├── cli.py                     # doctor / run / summarize
│   └── systems/                   # emos.py / roboguide.py 命名 runner
└── tests/                         # 离线、确定性测试(fixture 子进程)

核心概念

  • ExperimentSpec(specs/**/*.yaml,roboguide-eval.experiment-spec/v0.1): 描述实验本身 —— experiment id、benchmark、task、episode 选择、systems under test、LLM provider/model/reasoning、seeds、metrics、timeout、数据集身份与 机器人上下文元数据。canonical JSON 序列化产出稳定 digest,写入每次 run 的 manifest。
  • EnvironmentSpec / ProcessSpec:spec 只携带可移植期望(期望产物、超时、 metrics 来源路径);工作目录、可执行文件、参数、Conda 环境、凭据全部来自 evaluation/local.yaml 或 ROBOGUIDE_EVAL_* 环境变量,解析时合并 (spec < local config < 环境变量)为最终 ProcessSpec。配置了 Conda 环境时, argv 自动包装为 conda run --no-capture-output -n <env> ...,不需要交互式 conda activate。
  • SystemRunner:统一生命周期 prepare -> run_episode -> collect_result -> cleanup。EmosRunner 启动官方 EMOS entry point;RoboGuideRunner 启动 POST /v1/missions -> Control -> Node -> Local EAIOS production scenario 并归约 其持久证据。两者均只跨进程观察,不 import 对方运行时。
  • RunManifest(roboguide-eval.run-manifest/v0.1):每个 run 的唯一完整 身份 —— experiment/system/benchmark/task/episode/seed、LLM 配置 (含预留的 reported_model,用于记录 API 实际返回的 model identifier)、 run id、RoboGuide git SHA、外部系统版本、数据集身份/digest、config digest、 起止时间、完整命令、退出状态、失败原因与环境信息。
  • Canonical metrics(roboguide-eval.metrics/v0.3):注册表当前包含 E1 核心指标(success、subgoal_success_rate、simulation_steps、token_usage、 wall_time、coordination_latency)与预留指标(assignment 三项、scheduling/ recovery latency、resource conflicts、deadline miss、state freshness、 control-plane overhead),并独立表达 benchmark success、local skill completion、 episode termination、RoboGuide Mission completion、global/local calls/tokens、 physical dispatch、message activity 与 failure categories。runner 产出的 metrics.json 保留 raw evidence 引用;未知指标名拒绝入库。v0.2 历史证据仍可读, 新输出使用 v0.3。v0.1 → v0.2 迁移(尚无正式论文数据): subgoal_success(boolean)改为 subgoal_success_rate(number,[0,1], 带范围校验)——布尔无法表达部分 subgoal 完成;invalid_assignment_count 移除,由 reserved 的 assignment 三指标替代(定义见下)。

Episode identity(selector ≠ resolved)

E1 是 paired comparison:同一个 Habitat-MAS episode 必须分别由 EMOS 和 RoboGuide 执行。因此 manifest 的 episode_selection 区分两层:

  • selector:spec 的 episode 标签(如 seed-pinned-sample)+ seed —— 描述"如何选取",不是 episode id;
  • resolution:从官方输出解析出的真实身份——resolved_episode_id、 resolved_scene_id、dataset_index、dataset_record、evidence_source 列表与 status(resolved / multiple-episodes / unresolved + reason)。

回答"EMOS run X 和 RoboGuide run Y 是否同一 benchmark episode"看 resolved_episode_id + dataset_record(配合 spec 的 dataset digest)。 不伪造:解析不到就 unresolved/partial 并记录原因。

相同 episode 仍不足以形成 paired workload。两侧还必须覆盖同一 semantic goal predicates。当前 episode 51 的官方任务要求两个 any_at 谓词在联合终态 成立;每个谓词都允许任意机器人满足,不要求两个不同机器人分别执行。 Habitat adapter 会把完整的 joint terminal-state goal 冻结进 Mission Grounding Context。最终 MissionPlan 是否覆盖全部谓词由 MI Reviewer/Repairer 和 provenance diagnostic 记录;遗漏谓词属于 RoboGuide/model outcome,不会伪造成 provenance invalid,也不会把该次观察从 Formal population 中静默排除。只有官方 pddl_success 可用时,run 才能进入 benchmark population。

Authoritative semantic evidence v0.2 在中立 identity 字段中保留 episode_id、dataset_revision、dataset_sha256,场景来自 world_context.scene_id。Habitat adapter 从已加载 dataset 对象的实际配置解析 data_path(含 split),沿用当前部署的 .json.gz 文件名去后缀作为 revision, 对 gzip 原始字节计算 SHA-256;不从 B1 输入复制身份。此路径要求部署数据在加载和 采集期间保持不可变,只支持当前单文件 dataset;缺失来源、scene shards、无法识别的 episode/scene 均失败。v0.1 缺少 dataset 身份,读取时拒绝,不自动补齐或升级。 Evaluation 将这四个字段逐项与 b1-input-used.json 严格交叉绑定,任一字段缺失、 类型错误或不匹配都使 provenance invalid;重新计算外层 digest 也不能绕过。 Request 的每条 review_history(包括 repair 前后及 early failure 前已产生的 review) 还必须保留格式正确且等于最终 frozen grounding_context.context_digest 的 grounding_context_digest;缺失、跨 snapshot 或 stale review 使 provenance invalid。 该检查复用现有 request record,不改变 Mission Request HTTP API。

scene/index 的来源(pinned dataset resolver):在 local.yaml 为系统配置 dataset_path 指向 pinned episodes 文件后,runner 只读解析(gzip+JSON,不 import Habitat/EMOS),并先校验文件 SHA-256 与 spec 的 dataset digest 一致; episode id 在 dataset 内唯一时给出 resolved_scene_id / dataset_index / dataset_record,digest 不匹配、id 缺失或重复时给出显式 dataset_status (digest-mismatch / not-found / ambiguous),不猜。未配置 dataset_path 时 dataset_status: not-configured,scene 保持 null。

EMOS 官方输出与 metric 来源

canonical metric 官方来源 说明
success evaluator 摘要 Average episode pddl_success:(stderr,logger 格式) stdout+stderr 双流合并解析;仅单 episode run 映射为布尔(均值≥0.5);批次保留均值在 details,不布尔化
subgoal_success_rate 官方 pddl_stage_goals.<stage>_success 聚合的均值 mobility 的 stage-goal measurement(经 composite_stage_goals 配置节点注册)在 evaluator 摘要中输出 per-stage 成功率;其均值为 rate,原始 stage 值保留在 details.emos_stage_goal_success
simulation_steps stdout Episode ID: <id>, Num Steps: <n> 官方横幅 habitat Env.log_episode_steps 在 env reset 时打印
token_usage chat_history_output/<date>/<config>/<ablation>/<episode_id>/token_usage.json EMOS 自带 per-agent 实际 usage total(MultiLLMPolicy.act 构造的嵌套布局,默认开启);按 prepare 快照差异定位本次新写的文件,复制进 run 目录 raw-evidence/ 并记录 source path
wall_time Harness 实测进程时长 details.wall_time_source = harness_process_duration 标注来源

evaluator 摘要在 stderr:habitat-baselines 的聚合摘要走 Python logging(默认 stderr,带时间戳前缀),横幅走 print(stdout)—— 两者都已对真实 run 验证,解析器合并双流。

token 成本细分是 harness 侧记账职责:EMOS 只记录 per-agent total_tokens;input/output/cached/reasoning 的细分由 EMOS 侧最小记账 插桩提供——habitat_mas/utils/models.py 中每个 LLM 调用通过 _record_usage 把完整 usage 对象 + 时间戳 + 延迟追加写入 episode 目录 的 token_usage_details.jsonl(instrumentation only:不触碰 task assignment / reflection / execution 任何算法路径,且 RoboGuide 臂将来复用 同一 CrabAgent 栈时测量自动对称)。EmosRunner 按快照差异定位本次新写的 明细文件,复制进 run 目录 raw-evidence/ 并记录 source path,聚合成 canonical 细分(token_input_usage / token_output_usage 直接可得; cached_prompt_tokens / reasoning_tokens 在上游 usage 携带明细时可得, 否则 unavailable 并说明原因)。

本地记账代理(roboguide-eval proxy)保留为诊断工具:不改 baseline 的透明转发 + 落盘,用于排查中转问题或交叉核对——--upstream 必须是不带 /v1 的根地址,OPENAI_BASE_URL 指向 http://127.0.0.1:<port>/v1。 MI Responses 可通过同一个代理的 /responses;两臂须固定是否经过代理。 --run-id <public-id> 要求新的 log path,并分别记录 requested_model 与真实 response_model / response_id / system_fingerprint 及非敏感推理参数。 返回身份缺失、非 JSON、流式或超过 4 MiB 的 metadata parsing budget 时保持 unavailable, 不能从请求模型名补造。只记录已知 numeric usage 字段,不记录 Prompt、输出文本、 headers、URL query 或凭据。默认最多 10000 条、每条 64 KiB;预算或落盘失败 不改变转发的响应。旁路 <log>.status.json 区分记录丢失和 in-flight 请求,只有 graceful close 且所有已进入代理的请求已归档,才会给出 complete=true。 消费者必须校验 run_id、顺序、记录数、sidecar 和每次返回身份;此状态不证明 绕过代理的请求不存在,也不证明 relay 内部实际模型权重身份。 TTFT 在 baseline 非流式调用下不可观测,如实不记录(插桩记录的是每次调用 的请求/响应时间戳与总延迟)。

成本分析语义(cached ⊆ input):上游语义中 cached_tokens 是 prompt_tokens 的子集(canonical token_input_usage 包含缓存命中 部分)。有效输入成本 = (input − cached) + cached × 缓存单价;直接拿 token_input_usage 乘全价会重复计费缓存部分。实测参考:mobility smoke 一次 run 的 input 41436 中 18432(44.5%)为缓存命中——两臂/多 run 对比 时必须披露缓存命中差异或按有效成本归一。批次 run(一次进程跑多个 episode)的 per-episode token 归因暂缓,五个 token 字段显式 unavailable。

episode identity 的解析顺序:stdout 官方横幅(首选)→ episode_log/**/ *_steps_log.json 相对上一 run 后刷新的 baseline 的新增记录(回退,每个 run 只归属自己新增的记录)→ scene/index 由 digest 校验后的 pinned dataset 补全。 横幅时机已对源码验证:habitat VectorEnv 默认 auto_reset_done=True, episode done 的那次 step 自动 reset 并打印刚结束 episode 的横幅——包括 最后一个/唯一一个 episode;回退路径保留作非标准执行栈的纵深防御。

token 定位防串场:同一 episode id 的历史 token 记录(不同日期目录)永远 不作为本次证据——只有相对 prepare 快照新建或变更的文件才算,多于一处变 更时显式 ambiguous,找不到时 unavailable 并说明原因。

可用性策略:没有可靠官方来源的 metric 一律缺失,不填 0、不猜测,原因 记录在 details.unavailable_metrics。此外 runner 写入前强制执行 canonical 合同校验(名称/类型/bounds):违反合同的 payload 不会落盘为不可读数据,而是 降级为空 values + details.metrics_validation_error + trace metrics_invalid 事件,run 的 manifest/日志/证据全部保留。

coordination_latency 测量边界(冻结,采集前需协议确认)

E1 controlled comparison 的协调延迟只测量全局协调阶段:

  • EMOS:从开始 global coordination / group discussion 到 final assignment 确定;
  • RoboGuide:从一个已 ready 的 Task/Role requirements 进入全局协调,到 assignment 完成 Commit。

不计入:simulator reset、本地机器人执行、navigation、Habitat skill runtime。 Mission Intelligence 是否计入该指标未决——正式采集前必须先冻结协议; 在此之前该 metric 保持 unavailable(runner 自动标注)。

Assignment 指标定义(reserved,测量要求)

原 invalid_assignment_count 定义过模糊,已移除。替代三项均为 reserved, 在能可靠提取事件前不采集:

  • initial_infeasible_assignment_count:初始 coordinator proposal 中被目标 robot/local agent 判定 capability-infeasible 的 assignment 数;
  • final_infeasible_assignment_count:最终进入执行但 capability 上不可执行 的 assignment 数;
  • reassignment_count:因 assignment 拒绝 / feasibility conflict 发生的重新 分配次数。

测量要求:需要从 EMOS 的 Leader Assignment → Agent Reflection → Reject/Reassign 环节可靠提取带 identity 的结构化事件。当前审计结论:这些 环节没有结构化日志输出(仅散落在对话文本中),无法可靠提取——若要采集, 需要在 benchmark integration 层加最小 instrumentation(带 assignment id 与 拒绝原因的事件输出),且不得改动 EMOS 算法逻辑。

结果目录

每次 run 生成独立目录(真实 results 不提交 Git):

results/<experiment-id>/<run-id>/
├── manifest.json    # 完整可复现身份
├── metrics.json     # canonical metrics + raw evidence 引用
├── trace.jsonl      # 结构化事件轨迹
├── stdout.log       # 外部进程 stdout(失败也保留)
└── stderr.log       # 外部进程 stderr(失败也保留)

外部进程失败(非零退出、超时、无法启动)不会销毁证据:manifest 记录退出码与 failure_reason,stdout/stderr 持久化,metrics 允许为空。

使用

# 环境体检(不运行 episode;含 ${VAR} 凭据可解析性检查)
uv run roboguide-eval doctor --spec evaluation/specs/e1/mobility-smoke.yaml

# 运行一个系统(命令映射由本机配置提供)
uv run roboguide-eval run --spec evaluation/specs/e1/mobility-smoke.yaml --system emos

# 覆盖 episode / seed
uv run roboguide-eval run --spec ... --system emos --episode seed-pinned-sample --seed 7

# 汇总
uv run roboguide-eval summarize --results evaluation/results
uv run roboguide-eval summarize --results evaluation/results --json

配置现有 EMOS Conda 环境

  1. cp evaluation/local.yaml.example evaluation/local.yaml(模板已按 emos-baseline 交接文档填好结构:workdir、habitat 环境、GPU 1、中转 endpoint、EMOS_LLM_MODEL: "{model}" 跟随 spec);
  2. 运行前导出凭据:set -a; source /data/workspace/code/emos-baseline/emos.env; set +a (或在 shell 中 export OPENAI_API_KEY);doctor 会提前发现缺失的引用;
  3. 凭据使用 ${OPENAI_API_KEY} 引用,spawn 时从环境解析,manifest 只保留 占位符,不会写入真实 key;
  4. 也可用环境变量临时覆盖: ROBOGUIDE_EVAL_EMOS_WORKDIR / ROBOGUIDE_EVAL_EMOS_EXECUTABLE / ROBOGUIDE_EVAL_EMOS_CONDA_ENV。

EMOS episode 固定(已对 habitat-lab 源码验证)

当前 habitat-lab 版本没有 episode_ids 过滤,确定性来自两个手段:

  • habitat.seed={seed} + habitat.environment.iterator_options.num_episode_sample=1 ——固定 seed 确定性地采样出恰好一个 episode(注意 seed 必须非零,iterator 忽略 seed 0);这是 smoke spec 的默认映射,episode 多样性来自 seed 网格;
  • habitat.dataset.content_scenes=["<scene_id>"] ——场景级过滤,一个进程跑该 场景的全部 episodes 作为一批。

一个 EMOS 评估进程总是跑完整个(过滤后的)episode 集合,所以 harness 的 episode 字段语义是"确定性选择方案的标签"(selector);run 实际执行的 episode 身份由 EmosRunner 从官方输出解析后写入 manifest 的 episode_selection.resolution(见上文 Episode identity 一节)。EMOS 的 pddl_success 由 EmosRunner 从 stdout 的 Average episode ... 日志行转换 (仅单 episode run 映射为布尔,均值 ≥ 0.5;批次不布尔化),其余 EMOS 指标 原样保留在 details;wall_time 在系统未自报时由 harness 用实测进程时长 回填,并在 details.wall_time_source 标注来源。metric 来源总表见上文 "EMOS 官方输出与 metric 来源"。

✅ 数据就绪(2026-09-09 验证):MP3D ToU 已批复、90 栋全量场景在位 (21GB,habitat 仅需 glb 子集),mobility 99 集引用的 18 个场景全部 就绪(目录 + glb 双确认),mp3d.scene_dataset_config.json 在位; smoke 已实际跑通 episode 20。robot 配置说明:robot_configs/mp3d/ mobility_episodes_1.json 为手工补的 alias(作者包只有 9 集,alias 补至 10 集,其余 89 集无条目)。已对源码确认其影响:mobility 配置 randomize_agent_start: 1,agent 每集由 simulator RNG(受 habitat.seed 驱动)随机放置——缺失条目不会崩溃(直接索引分支在 randomize 分支的 else 里,不会到达),配置条目仅影响 LLM 的场景文字 描述;同 seed 可复现同一初始状态,两臂同 seed 对比不受影响。

Mission Front-half Eval(前半链路真实模型评测)

roboguide-eval mission-front 用生产适配器(真实模型 + Capability Catalog v0.3 + 真实审批策略)驱动 Dialogue → Interpreter → Planner → Validator → Reviewer → Repair 链路,按 semantic invariants(非 exact DAG)评测并落盘完整证据 (instruction / dialogue / assessment / plan / review-repair 历史 / token / 延迟 / 失败原因)。两种运行模式:

  • context-free(默认):engine 使用 Empty grounding reader——即 mission-front --cases ... 的原有行为;
  • fixture-grounded:--grounding evaluation/mission_front_grounding/canaries.yaml 运行 Grounding A/B canaries——每个场景按 pair 分为 context_free / fixture_grounded 两臂;grounded 臂通过 FixtureGroundingReader 注入官方 GroundingContextSnapshot 契约对象(fresh/conflict/stale/no-evidence/ MetadataOnly/gap-only 七组场景),快照按当前 dialogue revision 动态绑定 digest, 不另造任何 grounding 语义。

Plan-dependent invariants 在 Planner 阶段未实际执行时标记为 NOT_EVALUATED (不计 FAIL);stage timing 按 case 差分统计。证据与 baseline 报告见 evaluation/baselines/ 与 evaluation/mission_front_evidence/。

当前状态与停止边界

  • 真实实现:进程管理(超时/终止/日志持久化/进程组清理)、spec 解析与校验、 digest、manifest/metrics/trace 基础设施、CLI(含 doctor 凭据检查)、 canonical metric 合同 v0.2(含范围校验与 unavailable 机制)、episode identity 解析(官方横幅 + episode_log 回退)、EMOS 官方输出的 canonical 转换(success/simulation_steps/token_usage + unavailable 标注)、 wall_time 回填、环境变量值的 {model} 占位符替换。
  • Fixture / 待接(按任务边界有意保留):EMOS 官方命令的正式参数映射 (现由 local.yaml 模板承载)、RoboGuide Controller 路径驱动(保持 placeholder,等 Task/Role/ExecutionIntent 语义人工冻结后接 Habitat bridge)、Habitat bridge。
  • Benchmark 侧观察(已对源码证伪的旧担忧,记录结论防止复发):此前怀疑 Env.log_episode_steps 访问 measures['pddl_stage_goals'] 会在 mobility 上 KeyError。实际验证:mobility measurements 列表中的 composite_stage_goals 就是 PddlStageGoals measurement(config-store 名、package 键 pddl_stage_goals 与 measure uuid 三者不同名),已注册 且被 HANDOFF 验证过的 social_rearrange 使用同一列表并成功写出 subgoals 文件——无 KeyError,无需任何 override。mobility 的 pddl spec 也定义了 stage_goals,per-episode stage 数据会正常落 episode_log/**/*_subgoals.json(subgoal metric 接入留待后续轮次)。

结果入库约定(baselines/)

evaluation/results/ 是工作输出区,保持 Git 忽略;需要跨机器同步、评审或 作为论文证据的结果快照,显式复制到 evaluation/baselines/<suite-name>/ 后提交(2026-09 起经项目负责人确认的约定变更)。当前已入库:

  • e1-habitat-mas-mobility/:E1 EMOS 臂 4 次 smoke run(含失败→修复→成功 的完整迭代证据与逐调用 token 记账);
  • mission-front/mission-front-20260911T152347Z-c6eca836/:Mission Front-half 29 case 首轮真实模型 baseline(0/29 通过;主导发现:Interpreter 对简单指令也大量触发澄清,24/29 case 停在 NeedsClarification——属待 review 的前半段行为 evidence,非 harness 故障)。

入库前检查约定:无凭据(精确扫描)、无超大文件(单文件 >1MB 需说明)。