作成日: 2026-04-02
ステータス: Draft
目的: commit_result と wiki_sync を分けて Brain に返せる最小形を試す
関連:
docs/capabilities/wiki/仕様書.mddocs/history/wiki/task_contract例_phase2a.mdPhase 2 の残り項目のうち、
commit_result と wiki_sync をまとめて返す最小構造
だけを先に実装させる試験例。
今回の方針:
payload.commit_result が与えられた場合だけ、evidence.commit_result と evidence.wiki_sync を追加するevidence.wiki_sync には従来の wiki 側 evidence を複製するこれにより既存利用者を壊さずに、Brain 側では
commit_result と wiki_sync を分けて扱えるようにする。
task_id: wiki-phase2c-envelope-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: 20
payload:
goal: >
wiki capability の Phase 2-c として、
`commit_result` と `wiki_sync` を分けて返せる最小形を実装する。
spec: >
対象は butler/maids/wiki_worker.py と tests/test_wiki_non_llm_maid.py に限定する。
payload.commit_result が与えられた場合、
返却 evidence に commit_result と wiki_sync を追加する。
wiki_sync には従来の wiki evidence を格納する。
既存の flat evidence は互換のため維持する。
payload.commit_result がない場合の既存挙動は壊さない。
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例_phase2a.md
deliverables:
- code
- tests
acceptance_tests:
- uv run python -m unittest tests.test_wiki_non_llm_maid -v
file_checks:
- path: butler/maids/wiki_worker.py
contains: "commit_result"
- path: butler/maids/wiki_worker.py
contains: "wiki_sync"
- path: tests/test_wiki_non_llm_maid.py
contains: "commit_result"
notes: >
- uv run python を使うこと。
- WIKIJS_URL / WIKIJS_TOKEN を使う実ネットワーク疎通テストは不要。
- commit_result は pass-through に近い扱いでよい。整形しすぎないこと。
verification:
hard_conditions:
essential:
- id: wiki_tests_pass
type: test_command
command: "uv run python -m unittest tests.test_wiki_non_llm_maid -v"
- id: nested_commit_result_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-phase2c-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': [],
'dry_run': True,
'commit_result': {'status': 'ok', 'commit_sha': 'abc123'},
},
);
result = execute_task(task);
assert result.evidence.get('commit_result', {}).get('status') == 'ok', result.evidence;
assert result.evidence.get('wiki_sync', {}).get('triggered') is False, result.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
soft_conditions: []
success_criteria:
- "payload.commit_result が与えられた場合に evidence.commit_result と evidence.wiki_sync が返ること"
- "既存の flat evidence が維持されること"
- "uv run python -m unittest tests.test_wiki_non_llm_maid -v が通ること"