一键导入
verify-ext
Runtime extension 验证规范 — 验证 harness package 中 tools、rails、skills 是否能真实热加载并可运行
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Runtime extension 验证规范 — 验证 harness package 中 tools、rails、skills 是否能真实热加载并可运行
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
实现阶段主操作手册 — 指导 agent 完成改码与局部验证,并把提交留给独立 commit phase
扩展实现阶段 — 在 worktree 中生成运行时扩展代码
扩展方案设计 — 将能力缺口转化为 ExtensionDesign 结构
Generates a multimodal Skill markdown file from a source URL. Use this Skill when a user wants to turn a web tutorial, product support article, or software guide into a reusable agent Skill with concise steps and embedded screenshots.
Comprehensive step-by-step workflow for navigating the Booking.com mobile site to search for destinations, select dates/occupancy, browse results, and extract detailed hotel information including pricing and facilities.
Navigate github.com in mobile Chrome to retrieve repository information (files, README, contributors, languages, releases, packages) and switch to desktop site mode for richer metadata (forks, stars). Use for in-browser research, not git CLI or GitHub API operations.
| 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 必须显式设置,推荐一致ToolCard.input_params 必须符合 JSON Schema 规范:
{}、Nonetype: "object" 字段,禁止 type 缺失或为 null{"type": "object", "properties": {}}tool.card.tool_info().parameters 是否包含 type: "object"skills/<skill_name>/ 必须包含合法 SKILL.md失败归因:
manifest_invalidentry_point_not_allowedmodule_import_failedclass_init_failedskill_manifest_invalid必须创建临时 DeepAgent,调用真实加载路径:
from openjiuwen.harness.deep_agent import DeepAgent
from openjiuwen.harness.schema.config import DeepAgentConfig
from openjiuwen.core.single_agent.schema.agent_card import AgentCard
agent = DeepAgent(AgentCard(name="test_agent", description="test")).configure(
DeepAgentConfig(enable_task_loop=False))
record = await agent.load_expert_harness(config_path)
labels = [f"{ref.kind.value}:{ref.identity}" for ref in record.refs]
record 返回值格式(LoadRecord):
record.phase == "hot" — 通过热加载路径加载record.refs — 每个已绑定或复用资源的事实记录labels — 从 record.refs 派生的可读标签,格式为 "<kind>:<identity>"示例:["rail:MyRail", "tool:my_tool_id", "skill:/path/to/skills/pptx"]
断言:
labels 包含每个 "rail:<ClassName>"labels 包含每个 "tool:<tool_id_or_name>"ToolCard 出现在 agent.ability_manager.list()labels 包含每个 "skill:<resolved_path>"
agent._registered_rails 中存在 SkillUseRail 且其 skills_dir 包含声明的 skill 目录路径await agent.unload_expert_harness(record) 验证资源可回滚这一层必须覆盖 DeepAgent.load_expert_harness(),不能只调用 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() 中是否存在目标 ToolCardRunner.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 合法注意:skill 的验证目标仅限于"能加载生效",不需要深入验证 skill 内容质量、功能完整性或依赖安装情况。SkillUseRail 仅读取 SKILL.md frontmatter,不执行 skill 内部 Python 文件。
失败归因:
tool_not_calledtool_result_failedtool_result_schema_missingartifact_not_createdartifact_format_invalidartifact_placeholder_outputrail_hook_not_observedrail_tool_state_not_sharedskill_not_loadedverify_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