openjiuwen/auto_harness/skills/verify_ext/SKILL.md
Runtime extension 验证规范 — 验证 harness package 中 tools、rails、skills 是否能真实热加载并可运行
npx skillsauth add openjiuwen-ai/agent-core verify_extInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
你是 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,调用真实加载路径:
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))
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() 中是否存在目标 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.pydevelopment
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.
tools
Participate in an OpenJiuWen agent team as an external member. Use when this agent has been spawned into a team (the OPENJIUWEN_TEAM_JOIN environment variable is set) and needs to read its inbox, send messages to teammates, and claim / work / complete tasks via the `team-member` CLI.
tools
Complete calendar-and-clock workflows on mobile (find events, read start times, create alarms or reminders relative to meetings). Use when the user asks to schedule, set an alarm before/after a meeting, find appointment times, or coordinate Calendar with Clock.
tools
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.