diff --git a/skills/supervise/SKILL.md b/skills/supervise/SKILL.md index 14038153..72bb13c1 100644 --- a/skills/supervise/SKILL.md +++ b/skills/supervise/SKILL.md @@ -27,22 +27,38 @@ Use only fields the selected backend can materialize. { "name": "source-skeptic-v1", "description": "Challenge one candidate claim against primary evidence.", + "harness": "codex", "prompt": { "appendSystemPrompt": "Return a claim table with source locations, contradictions, unknowns, and a reproducible rejection check." }, "model": { - "default": "", + "provider": "openai", + "default": "gpt-5.6-sol", "reasoningEffort": "xhigh" }, - "metadata": { - "role": "driver" + "tools": { + "agent_runtime_coordination_spawn_worker": true + }, + "resources": { + "failOnError": true, + "skills": [ + { + "kind": "inline", + "name": "profile-authoring", + "content": "" + } + ] } } ``` The example shows placement, not required values. -Use `metadata.role: 'driver'` only when this child should author and supervise descendants. -Omit that role for a leaf. +Replace the example skill content with the exact bytes the parent received. +Declare `tools.agent_runtime_coordination_spawn_worker: true` only when this child can create descendants. +That declaration is the recursion signal; names, descriptions, prompts, and metadata never grant authority. +Every profile with spawn authority must carry the complete authoring skill in `resources.skills`. +Also declare every other coordination or work tool the child needs by its visible name. +Omit spawn authority and the authoring skill for an ordinary leaf. The task argument names the concrete artifact and a check that can fail. The profile names how the agent works and which capabilities it receives. diff --git a/tests/kernel/skill-tool-names.test.ts b/tests/kernel/skill-tool-names.test.ts index 0270d81f..c0e0d95c 100644 --- a/tests/kernel/skill-tool-names.test.ts +++ b/tests/kernel/skill-tool-names.test.ts @@ -74,3 +74,20 @@ describe('shipped skills name no harness-native tool', () => { ).toEqual([]) }) }) + +describe('supervise skill recursive authority', () => { + const supervise = readFileSync(join(skillsRoot, 'supervise', 'SKILL.md'), 'utf8') + + it('teaches the profile-owned spawn signal and complete skill propagation', () => { + expect(supervise).toContain('tools.agent_runtime_coordination_spawn_worker: true') + expect(supervise).toContain( + 'Every profile with spawn authority must carry the complete authoring skill', + ) + expect(supervise).toContain('"name": "profile-authoring"') + expect(supervise).toContain('"failOnError": true') + }) + + it('does not grant recursion through role metadata', () => { + expect(supervise).not.toMatch(/metadata\.role|role\s*:\s*['"]driver['"]|"role"\s*:\s*"driver"/) + }) +})