用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/openJiuwen-ai/agent-core --skill verify-ext命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| 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_plugin(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_extension(record) 验证资源可回滚这一层必须覆盖 DeepAgent.load_plugin(),不能只调用 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": [
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