一键导入
verify-ext
// Runtime extension 验证规范 — 验证 harness package 中 tools、rails、skills 是否能真实热加载并可运行
// Runtime extension 验证规范 — 验证 harness package 中 tools、rails、skills 是否能真实热加载并可运行
评估方法论 — 根据 query 中的评估模式执行代码库健康评估或 runtime extension 能力缺口评估
扩展方案设计 — 将能力缺口转化为 ExtensionDesign 结构
扩展实现阶段 — 在 worktree 中生成运行时扩展代码
规划规范 — 将评估结果收敛为结构化任务计划
流水线选择规范 — 根据任务和事实选择最合适的 pipeline
实现阶段主操作手册 — 指导 agent 完成改码与局部验证,并把提交留给独立 commit phase
| name | verify_ext |
| description | Runtime extension 验证规范 — 验证 harness package 中 tools、rails、skills 是否能真实热加载并可运行 |
| immutable | true |
| tools | ["read_file","bash_tool","glob_tool","grep_tool"] |
你是 auto-harness 扩展验证阶段的规范。目标不是证明文件能 import,而是证明生成的 runtime extension 在真实 harness 加载路径里可注册、可观测、可调用。
必须检查:
harness_config.yaml 存在且 schema_version: harness_config.v0.1type: packagemodule 和 classmodule 必须以 openjiuwen.extensions.harness.<extension_name> 开头harness_config.yaml 实际声明的 module 和 class 为唯一来源;不要手写或猜测 module pathmodule 必须能映射到扩展根目录内真实存在的 .py 文件__init__.py 不得包含 re-exportToolCardToolCard.id 和 ToolCard.name 必须显式设置,推荐一致SKILL.md失败归因:
manifest_invalidentry_point_not_allowedmodule_import_failedclass_init_failedskill_manifest_invalid必须创建临时 DeepAgent,调用真实加载路径:
loaded = await agent.load_harness_config(config_path)
断言:
rail:<ClassName>tool:<ClassName>ToolCard.name 出现在 agent.ability_manager.list()SkillUseRail这一层必须覆盖 DeepAgent.load_harness_config(),不能只调用 load_runtime_rails() / load_runtime_tools()。
失败归因:
harness_load_failedrail_not_registeredtool_not_registeredskill_not_loaded运行时验收必须使用结构化 test spec,不接受“模型自然语言说成功”作为通过依据。
推荐 spec:
{
"name": "runtime_extension_acceptance",
"components": ["rail", "tool", "skill"],
"prewarm_queries": [
"请简单回复:hello"
],
"tool_tests": [
{
"tool_name": "example_tool",
"query": "请调用 example_tool,并只根据工具结果回答。",
"assertions": {
"must_call_tool": "example_tool",
"tool_result_success": true,
"required_fields": ["source"]
}
}
],
"rail_tests": [
{
"query": "请完成一个会触发 rail 生命周期的简短任务。",
"assertions": {
"observable_state_file": ".state/<session_id>.json",
"json_contains": ["updated_at"],
"must_observe_side_effect": true
}
}
],
"skill_tests": [
{
"query": "根据已加载的扩展技能,说明这个扩展适合何时使用。",
"assertions": {
"answer_contains_any": ["统计", "工具", "流程", "策略"]
}
}
]
}
Tool 验收必须使用 agent-core/harness 自身可观测接口:
agent.ability_manager.list() 中是否存在目标 ToolCard.nameRunner.resource_mgr.get_tool(tool_id) 能取回工具实例ToolCall 并让 ability_manager 在 session 下执行Runner.resource_mgr.get_tool(tool_id).invoke(..., session=session) 验证工具核心输出,但这不能替代工具注册检查before_tool_call / after_tool_call,或注册测试用 tracking rail 记录 ToolCallInputsToolOutput.success 必须为 true,或返回明确结构化降级结果文件/产物生成类 Tool 必须通过 artifact-level acceptance gate。不能只验证“工具返回成功”,必须验证真实产物存在且格式有效。
测试必须做到:
tmp_path 下的 output_path,避免写到未知工作目录。success=true、path 或 absolute_path、exists=true、format、size_bytes > 0。format 匹配,文件大小大于 0。success=true 但文件不存在、格式错误或只是中间结构,必须失败。格式最低断言:
zipfile.ZipFile 打开,断言包含 [Content_Types].xml、ppt/presentation.xml,且至少存在一个 ppt/slides/slide*.xml。zipfile.ZipFile 打开,断言包含 [Content_Types].xml 和 word/document.xml。%PDF 开始。json.load 重新解析,并断言设计声明的关键字段存在。禁止通过:
Rail 验收必须检查可观测副作用:
<extension_root>/.state/<session_id>.jsonOutputSchema,仅当扩展主动写入 session stream 时可用如果 Rail 与 Tool 配合,必须验证“Rail 写状态 + Tool 读状态”:
Skill 验收必须检查:
SKILL.md frontmatter 合法失败归因:
tool_not_calledtool_result_failedtool_result_schema_missingartifact_not_createdartifact_format_invalidartifact_placeholder_outputrail_hook_not_observedrail_tool_state_not_sharedskill_not_usedverify_ext 失败后必须把以下内容交给 implement_ext agent:
最多修复 3 轮。只有 L1、L2、L3 全部通过,才允许进入 activate。
当 Tool 需要读取 Rail 采集的数据时,必须使用文件系统状态作为事实来源:
ctx.session.get_session_id() 获取 session_idkwargs["session"].get_session_id() 获取 session_id<extension_root>/.state/<session_id>.jsonkwargs["ctx"]、kwargs["agent"] 或扫描 agent rails参考:
openjiuwen/harness/tools/todo.pyopenjiuwen/harness/rails/task_planning_rail.py