作成日: 2026-04-02
ステータス: Draft
目的: wiki capability の Phase 2 を小さく切り、evidence 拡張だけを先に実装させる試験例
関連:
docs/capabilities/wiki/仕様書.mddocs/capabilities/implement/仕様書.mddocs/history/wiki/task_contract例_phase1a.mdPhase 2 全体を一度に進めるのではなく、
wiki_worker が返す evidence を Phase 2 向けに拡張する最小 task
として切り出した contract 例。
今回の対象は次に限定する。
commit_sha を evidence に残すattempt_count を evidence に残すfailed_stage / failure_reason / retryable / next_recommendation を返す今回は wiki intent 自体の supervision 実装までは含めない。
retry 回数は常に attempt_count=1 としてよい。
task_id: wiki-phase2a-evidence-v1
intent: implement
target:
service: local
delegation_mode: known_only
requested_by: brain
requested_at: "2026-04-02T00:00:00Z"
constraints:
implicit_scope:
- repo:akira/butler2
require_approval_for: []
max_minutes: 25
payload:
goal: >
wiki capability の Phase 2-a として、
sync_docs_to_wiki が返す evidence を拡張する。
spec: >
対象は butler/maids/wiki_worker.py と tests/test_wiki_non_llm_maid.py に限定する。
仕様書の Phase 2 から、次だけを先に実装する:
1) payload.commit_sha が与えられたら evidence.commit_sha に残す
2) すべての返却で evidence.attempt_count を返す(現段階では常に 1)
3) failure 時に failed_stage / failure_reason / retryable / next_recommendation を返す
4) 成功・非発火時の既存挙動は壊さない
supervision や retry の本体実装はまだ入れない。
target_paths:
- butler/maids/wiki_worker.py
- tests/test_wiki_non_llm_maid.py
context_files:
- docs/capabilities/wiki/仕様書.md
- docs/history/wiki/task_contract例_phase1a.md
deliverables:
- code
- tests
acceptance_tests:
- uv run python -m unittest tests.test_wiki_non_llm_maid -v
- >
uv run python -c "
from butler.runtime import execute_task;
from butler.models import TaskContract, Constraints;
task = TaskContract(
task_id='wiki-phase2a-check',
intent='wiki',
target={'service': 'wiki'},
constraints=Constraints(max_minutes=1),
success_criteria=['ok'],
delegation_mode='known_only',
requested_by='test',
requested_at='2026-04-02T00:00:00Z',
payload={
'operation': 'sync_docs_to_wiki',
'repo_path': '.',
'repo_slug': 'butler2',
'committed_files': [],
'commit_sha': 'abc123',
'dry_run': True,
},
);
result = execute_task(task);
assert result.evidence.get('commit_sha') == 'abc123', result.evidence;
assert result.evidence.get('attempt_count') == 1, result.evidence
"
file_checks:
- path: butler/maids/wiki_worker.py
contains: "commit_sha"
- path: butler/maids/wiki_worker.py
contains: "attempt_count"
- path: butler/maids/wiki_worker.py
contains: "retryable"
- path: tests/test_wiki_non_llm_maid.py
contains: "commit_sha"
notes: >
- 実行コマンドは system python ではなく uv run python を使うこと。
- WIKIJS_URL / WIKIJS_TOKEN を使う実ネットワーク疎通テストは不要。
- patch は最小にし、既存の create/update テストを壊さないこと。
verification:
hard_conditions:
essential:
- id: wiki_tests_pass
type: test_command
command: "uv run python -m unittest tests.test_wiki_non_llm_maid -v"
description: >
wiki worker の既存テストと追加テストが全件通ること。
- id: commit_sha_evidence_present
type: test_command
command: >
uv run python -c "
from butler.runtime import execute_task;
from butler.models import TaskContract, Constraints;
task = TaskContract(
task_id='wiki-phase2a-check',
intent='wiki',
target={'service': 'wiki'},
constraints=Constraints(max_minutes=1),
success_criteria=['ok'],
delegation_mode='known_only',
requested_by='test',
requested_at='2026-04-02T00:00:00Z',
payload={
'operation': 'sync_docs_to_wiki',
'repo_path': '.',
'repo_slug': 'butler2',
'committed_files': [],
'commit_sha': 'abc123',
'dry_run': True,
},
);
result = execute_task(task);
assert result.evidence.get('commit_sha') == 'abc123', result.evidence;
assert result.evidence.get('attempt_count') == 1, result.evidence
"
description: >
dry_run 非発火経路でも commit_sha と attempt_count が evidence に残ること。
evidence:
- id: worker_file_exists
type: file_exists
path: butler/maids/wiki_worker.py
- id: wiki_tests_file_exists
type: file_exists
path: tests/test_wiki_non_llm_maid.py
scope_guard:
- id: no_scope_violation
type: scope_check
description: >
変更は wiki worker と対応テストの周辺に閉じること。
soft_conditions:
- id: no_bak_files
type: file_absent
pattern: "config/*.bak"
uncertain_evidence:
fields:
- changed_files
- hard_condition_results
- soft_condition_results
- test_results
- stdout_tail
- stderr_tail
- why_uncertain
success_criteria:
- "commit_sha が与えられた場合に evidence へ残ること"
- "attempt_count=1 が返ること"
- "failure 時に retryable / failed_stage / failure_reason / next_recommendation が返ること"
この task が通れば、次は wiki intent 自体の retryable / non-retryable 分類や
supervision 導入へ進みやすくなる。