7dfdf80e9e
Grok is a first-class worker CLI. Launcher argv includes --always-approve so unattended tool calls are not blocked; sandbox stays required.
164 lines
6.5 KiB
Python
164 lines
6.5 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
class AckSkillContentTests(unittest.TestCase):
|
|
def test_ack_skill_owns_resources_without_modifying_agent_instructions(self) -> None:
|
|
content = (REPO_ROOT / "skills" / "ack" / "SKILL.md").read_text(encoding="utf-8")
|
|
|
|
for expected in (
|
|
"skiff init ack --project <project-root>",
|
|
"docs/ack/project.md",
|
|
"docs/ack/tasks.yaml",
|
|
"docs/ack/knowledge.yaml",
|
|
"docs/ack/delivery.yaml",
|
|
"tasks: []",
|
|
"validate_tasks.py",
|
|
"validate_knowledge.py",
|
|
"validate_delivery.py",
|
|
"select_tasks.py",
|
|
"select_knowledge.py",
|
|
"references/kickoff.md",
|
|
"不要修改项目的 `AGENTS.md`",
|
|
"当前会话担任 Coordinator",
|
|
"intents.testEnvironment",
|
|
"运行测试环境",
|
|
"运行版本发布",
|
|
):
|
|
self.assertIn(expected, content)
|
|
|
|
def test_ack_skill_is_explicit_only(self) -> None:
|
|
metadata = (REPO_ROOT / "skills" / "ack" / "agents" / "openai.yaml").read_text(
|
|
encoding="utf-8"
|
|
)
|
|
|
|
self.assertIn('display_name: "ACK"', metadata)
|
|
self.assertIn("allow_implicit_invocation: false", metadata)
|
|
|
|
def test_model_routing_is_fingerprint_bound_and_does_not_trust_receipt_reuse(self) -> None:
|
|
content = (
|
|
REPO_ROOT / "skills" / "ack" / "references" / "model-routing.md"
|
|
).read_text(encoding="utf-8")
|
|
|
|
self.assertIn("--expected-launch-fingerprint", content)
|
|
self.assertIn("allowlist-v1", content)
|
|
self.assertIn("禁止根据持久化 receipt 自动复用", content)
|
|
self.assertIn("launcher 身份证明", content)
|
|
|
|
def test_worker_reuse_requires_idle_state_and_verified_history_reset(self) -> None:
|
|
skill = (REPO_ROOT / "skills" / "ack" / "SKILL.md").read_text(
|
|
encoding="utf-8"
|
|
)
|
|
adapter = (
|
|
REPO_ROOT / "skills" / "ack" / "references" / "orca-adapter.md"
|
|
).read_text(encoding="utf-8")
|
|
|
|
self.assertIn("空闲", skill)
|
|
self.assertIn("清理历史消息", skill)
|
|
self.assertIn("无法确认清理成功时创建 fresh worker", skill)
|
|
self.assertIn("角色、profile、worktree", adapter)
|
|
self.assertIn("不得复用仍在工作", adapter)
|
|
self.assertIn("或运行状态不明的 worker", adapter)
|
|
|
|
def test_coordinator_reclaims_only_verified_task_terminals_at_run_end(self) -> None:
|
|
skill = (REPO_ROOT / "skills" / "ack" / "SKILL.md").read_text(
|
|
encoding="utf-8"
|
|
)
|
|
kickoff = (
|
|
REPO_ROOT / "skills" / "ack" / "references" / "kickoff.md"
|
|
).read_text(encoding="utf-8")
|
|
|
|
self.assertIn("整轮任务完成", skill)
|
|
self.assertIn("回收所有只属于 `verified` 任务的 worker", skill)
|
|
self.assertIn("终端,并核对关闭回执", skill)
|
|
self.assertIn("不设置 TTL", skill)
|
|
self.assertIn("blocked", kickoff)
|
|
self.assertIn("failed_retest", kickoff)
|
|
self.assertIn("leftover", kickoff)
|
|
|
|
def test_environment_failures_are_reported_without_consuming_retest_rounds(self) -> None:
|
|
skill = (REPO_ROOT / "skills" / "ack" / "SKILL.md").read_text(
|
|
encoding="utf-8"
|
|
)
|
|
optimization = (
|
|
REPO_ROOT / "skills" / "ack" / "references" / "optimization-method.md"
|
|
).read_text(encoding="utf-8")
|
|
schema = json.loads(
|
|
(REPO_ROOT / "skills" / "ack" / "templates" / "tasks.schema.json")
|
|
.read_text(encoding="utf-8")
|
|
)
|
|
|
|
self.assertIn("环境失败不占复验轮次", skill)
|
|
self.assertIn("userAction", optimization)
|
|
self.assertIn("environmentIncidents", schema["definitions"]["task"]["properties"]["dispatch"]["properties"])
|
|
|
|
def test_validation_ready_hands_off_a_deployed_test_environment(self) -> None:
|
|
skill = (REPO_ROOT / "skills" / "ack" / "SKILL.md").read_text(
|
|
encoding="utf-8"
|
|
)
|
|
delivery = (
|
|
REPO_ROOT / "skills" / "ack" / "references" / "delivery.md"
|
|
).read_text(encoding="utf-8")
|
|
|
|
self.assertIn("不能停在", skill)
|
|
self.assertIn("`verified` 却声称整轮 ACK 已结束", skill)
|
|
self.assertIn("validation_ready", delivery)
|
|
self.assertIn("访问地址和用户下一步", delivery)
|
|
|
|
def test_ack_knowledge_resources_and_version_are_present(self) -> None:
|
|
ack_dir = REPO_ROOT / "skills" / "ack"
|
|
|
|
for relative_path in (
|
|
"templates/knowledge.template.yaml",
|
|
"templates/knowledge.schema.json",
|
|
"examples/knowledge.example.yaml",
|
|
"scripts/validate_knowledge.py",
|
|
"scripts/select_tasks.py",
|
|
"scripts/select_knowledge.py",
|
|
"scripts/run_verification.py",
|
|
"scripts/worker_profiles.py",
|
|
"scripts/launch_worker.py",
|
|
"templates/delivery.template.yaml",
|
|
"templates/delivery.schema.json",
|
|
"examples/delivery.example.yaml",
|
|
"references/delivery.md",
|
|
):
|
|
self.assertTrue((ack_dir / relative_path).is_file(), relative_path)
|
|
version = (ack_dir / "VERSION").read_text(encoding="utf-8").strip()
|
|
self.assertEqual(version, "0.17.1")
|
|
self.assertIn(
|
|
f'ackVersion: "{version}"',
|
|
(ack_dir / "examples" / "tasks.example.yaml").read_text(encoding="utf-8"),
|
|
)
|
|
self.assertIn(
|
|
f"ack v{version}",
|
|
(ack_dir / "examples" / "project.example.md").read_text(encoding="utf-8"),
|
|
)
|
|
self.assertIn(
|
|
'ackVersion: "<接入时的 ack skill 版本>"',
|
|
(ack_dir / "templates" / "tasks.template.yaml").read_text(
|
|
encoding="utf-8"
|
|
),
|
|
)
|
|
self.assertTrue((ack_dir / "references" / "feishu-bug-intake.md").is_file())
|
|
|
|
def test_task_template_derives_project_files_without_persisted_root_paths(self) -> None:
|
|
template = (
|
|
REPO_ROOT / "skills" / "ack" / "templates" / "tasks.template.yaml"
|
|
).read_text(encoding="utf-8")
|
|
|
|
self.assertNotIn("repoPath:", template)
|
|
self.assertNotIn("devWorktree:", template)
|
|
self.assertIn("allowedWorktrees:", template)
|
|
self.assertIn('knowledgeFile: "docs/ack/knowledge.yaml"', template)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|