【必須】新しいアクティビティを作成してcheck-inする。「/as」「新しい作業始める」「アクティビティ作って」「これやる」など新規作業の開始で発動。このスキルを経由せずにadd_activityを呼ばない(orchの起票はorch skillに従う)。
activity-finish
【必須】現在のアクティビティを完了にする、または完了にせず中断して寝かせる。「/af」「この作業完了」「クローズして」「一旦ここまで」「今日はここで止める」「いったん置いておく」など終える・中断する意図で発動。このスキルを経由せずにupdate_activityでcompleted・pending・snoozed・shelvedにしない。
実行スコア 未検証
インストール方法を見る含まれるファイル(1)
- SKILL.md12.2 KB
SKILL.md(原文)
インストールする前に、エージェントに与えられる指示の中身を確認できます。
activity-finish
現在のアクティビティを完了にする。完了ではなく、戻ってくる前提で離れる(中断する)ときは末尾の「中断する」節に従う。
手順
-
対象の特定: 「現在のアクティビティ」を以下の優先順位で特定する
- このセッション内でcheck-in・作成したactivityを対象にする
- 候補が複数ある場合は1ターンだけどれを完了にするか確認する
- セッション内に該当がなければ
get_activities(limit=15)で一覧を提示し選んでもらう(limitを省略するとデフォルト5件になり対象が一覧から漏れうるため明示する。タイトルベースで提示し、内部ID・数値は表示しない)
完了ではなく中断・切り替えの意図(「一旦ここまで」「今日はここで止める」など)なら、手順2以降ではなく「中断する」節へ進む
対象がorch(
orchタグが付き、説明の先頭に担い手欄があるもの)なら、この手順の続きに進まずorch skillの「終える」節へ進む。担い手欄が無ければorchではないので、このまま続ける -
終了条件(goal)の確認: 手元に今のgoalブロックが無ければ
get_goal(activity_id=...)で読み直し、labelを見る(get_goalはcheck_inと違いactivityのstatusを変えない読み取り専用なので、statusを書き換えずに確認できる)。以下のgoal_idはget_goal応答のgoal_id_rawを指す -
止めているaskの処理: このactivityを止めている未決着のask(未回答、または回答済みで未triage)を取得する。
get_asks(blocking_activity_id=...)(未回答)とget_asks(blocking_activity_id=..., triage_pending_only=true)(回答済み未triage)で読む。update_activity(status="completed")の応答にpending_asksが付いたときも同じ一覧である(付いていたら、完了後でも次の判断を行う。完了自体は止められない)。0件なら次へ進む。1件以上あれば、askを1件ずつ次のとおり判断する- 続きの残タスクがあるなら、そこへ付け替える(原則): 残タスクがすでに別のactivityとして存在するならそのactivityへ、無ければ activity-start skillで先に起こしてから、
update_activity(activity_id, move_asks_to=<新activityのid>, move_ask_ids=[<askのid>])で付け替える。完了と同じ呼び出しにmove_asks_toを含めてもよい(move_ask_idsを省くと未決着askを全件付け替える) - 実質決着しているなら記録して閉じる: ユーザーが別の場で同じ件に答えた、会話の中で結論が出ている、など答えが既に分かっているaskは、その答えを
add_decisionsで決定事項として記録してから片付ける。未回答ならwithdraw_ask、回答済み未triageならtriage_ask(決定事項にした内容はpromote、そうでなければdismiss) - 残タスクが無く、そのaskがまだ必要なら: それを待つactivityをその場で起こして(activity-start)付け替える
- 不要なら取り下げる: 未回答なら
withdraw_ask、回答済み未triageならtriage_ask(action="dismiss")
付け替え・取り下げをせずに完了させると、askは完了済みのactivityにぶら下がったまま、後から作業を引き継ぐ者に届かない
- 続きの残タスクがあるなら、そこへ付け替える(原則): 残タスクがすでに別のactivityとして存在するならそのactivityへ、無ければ activity-start skillで先に起こしてから、
-
labelに応じて完了させるundefined(goal無し):update_activity(status="completed", closed_by="user", closed_reason=...)。事後にgoalを促すことはしない。ただし、ユーザーがその場で「何をもって終わったか」を条件として言ったときだけ、set_goal(activity_id, goal={"new": {...条件はstate="satisfied"か理由付きwaivedで作成...}})で全条件を終端にして作り、続けてjudge_goalで判定する(update_activityは呼ばない。activityの完了はjudge_goal側で行われる)not_needed(不要印):update_activity(status="completed", closed_by="user", closed_reason=...)。不要印は「この activity には終了条件を置かない」という明示の印なので、事後にgoalを作る例外は適用しないactive(openの条件が残る): 1ターンだけ確認し、ユーザーの選択に応じて次のいずれかにする- 残りの条件を理由付きでwaivedにしてから達成扱いにする:
update_goal(goal_id, changes=[{"op":"set","id":<条件id>,"state":"waived","note":理由}, ...])→judge_goal(goal_id, verdict="achieved", judged_by="human")(waivedにするとsatisfiedが0件になる場合はこの選択肢を示さない。全条件のidが要るときはget_goal(activity_id=...)で確認する) judge_goal(goal_id, verdict="failed", note=理由, judged_by="human")で閉じる- 同じgoalに未完了の兄弟activityが残るなら、このactivityだけ
update_activity(status="completed", closed_by="user")(goalは未判定のまま残る)
- 残りの条件を理由付きでwaivedにしてから達成扱いにする:
judge_ready(判定待ち): 手元のgoalブロック(またはget_goalの応答)のopen_questionsに未決があれば畳むか1ターン聞く。そのうえで条件のうちsatisfiedが1件以上あればjudge_goal(goal_id, verdict="achieved")、0件ならjudge_goal(goal_id, verdict="failed", note=理由)か条件を足す。judged_byは、goalに紐づく未完了activityがこの1件だけなら"human"(/afの起動自体をgoal全体の完了明言とみなす)、他にも未完了activityがあれば"session"closed(判定済み):update_activity(status="completed")だけを呼ぶ。closed_byは渡さない(サーバーがclosed_by="goal_judge"を自動で書く)
-
完了記録の追記:
descriptionの末尾に完了記録を追記する。日付に加えて、会話から自明な範囲で「何がどうなって終わったか」を一行添える(例:\n\n## 完了\nYYYY-MM-DD ○○を実装しPRを作成して完了)。自明でない場合はユーザーへの質問はせず日付のみ記載するupdate_activity(status="completed", ...)で閉じた場合は、そのまま同じ呼び出しにdescriptionを含めてよいjudge_goalで閉じた場合は、閉じた後にstatusを渡さないupdate_activity(activity_id, description=...)で追記する(既にcompletedのactivityへ再度status="completed"を渡しても、サーバー側のガードにより閉じ方の記録は書き換わらない仕様のため、statusは省略すれば足りる)- ログは残さない(軽量にサクッと終わらせる)
-
完了したことをユーザーに一言伝える。goalを判定した場合は判定したこと(達成/未達)も一言添える
- 閉じたアクティビティが
[議論]または[設計]で、次フェーズ([設計]/[作業])が自然に続く内容の場合、「次のactivityを作るか」を一言だけ提案する(勝手に作成はしない) - 承認された場合、
add_activityを直接呼ばず activity-start skillに委譲する(重複チェック・related候補特定・IMPLEMENT_WORKFLOW_GUARD先回りをスキップしないため)
- 閉じたアクティビティが
中断する
進行中のアクティビティを完了にせず、再開しやすい状態にして寝かせる。対象は手順1と同じ方法で特定する(対象が0件ならその旨を伝えて終了する)。
-
再開メモの追記
update_activityのdescription引数は全文置換(既存内容とのマージはない)のため、既存descriptionの全文に中断メモを連結した全文を渡すget_activitiesの一覧プレビューはdescriptionの先頭200文字のみを返す。中断メモを末尾に追記すると一覧上で隠れてしまうため、中断メモは既存内容より前に挿入するget_activitiesで選んだ対象のdescriptionは200字に切り詰められている。そのまま連結のベースにせず、get_by_idsで全文を取得してから連結する- 挿入形式(既存description全文の直前に置く):
## 中断メモ (YYYY-MM-DD) - どこまで: ... - 次にやること: ... - ブロッカー: ...(あれば) --- (既存descriptionの全文) - 内容は会話から自明な範囲で埋める。不明な項目があれば1ターンだけ聞いてよい
- 中断→再開→再中断を繰り返すと中断メモが積み重なり、descriptionが肥大化する(
update_activityはdescription変更のたびにembeddingを再生成する)。過去の中断メモが複数溜まってきたら、直近以外を要約・削減することを検討する
-
ブロッカーが人間の判断の場合の紐づけ
- 手順1で書いたブロッカーが人間の判断待ちなら、
get_goal(activity_id=...)で対象アクティビティの終了条件を確認する(goalが未定義・不要印なら何もしない) - 対応する条件があれば、ask-compose skillでaskを起票し、
update_goal(goal_id, changes=[{"op": "edit", "id": <条件id>, "actor": "human", "bound": {"type": "ask", "id": <ask_id>}}])で束縛する。対応する条件がまだ無ければ{"op": "add", "statement": ..., "actor": "human", "bound": {"type": "ask", "id": <ask_id>}}で新規に足す - openの条件がそのまま再開条件になるため、これ以外に再開条件を別立てで書く必要はない
- 手順1で書いたブロッカーが人間の判断待ちなら、
-
statusの変更
- 近く(同じ日〜数日以内)に再開する見込み:
status="pending"に戻す - 明確な再開時期が読めずしばらく寝かせる:
status="snoozed"にする。snoozedは既定3日(環境変数で変更可)経過後、次にget_activitiesが呼ばれたタイミングでpendingへ復活する(バックグラウンドタイマーではなく呼び出し時にまとめて反映されるため、get_activitiesが呼ばれるまでは3日経過後もsnoozedのままになりうる) - 期限を決めず長期棚上げする:
status="shelved"にする。shelvedは自動復活せず、明示的にstatusを変更するまでactive一覧に出てこない - 判断に迷う場合はユーザーに選んでもらう
- 手順1の
description更新とこのstatus変更は、update_activityの同一呼び出しにまとめて渡す(snoozed状態のアクティビティはstatusを指定せず他フィールドのみ更新すると自動的にpendingへ復活するため、呼び出しを分けると意図しないstatus遷移が起きうる)
- 近く(同じ日〜数日以内)に再開する見込み:
-
中断したことと、再開は
check-inから行える旨を一言伝える
中断ではgoalに触れない(手順2のask束縛を除く)。ログも残さない。
注意
/afが呼ばれたこと自体が「終わった」の根拠。goal無し・不要印のactivityでは、エージェント側で「本当に終わった?」等の判定ロジックは入れない- goal付きのactivityでも完了は拒否されない。判定を挟むのは上記の分岐に従うときだけで、goalが未判定のまま
update_activity(completed)を呼んでも通る(応答に付くgoal_hintは知らせであり、拒否ではない) - sync-memory的な記録の棚卸しはしない。あくまで軽量な完了操作
- 完了と中断の境界: 作業が終わったなら完了、戻ってくる前提で離れるなら中断。セッション全体の一括記録の意図(sync-memory)では発動しない
レビュー
まだレビューはありません。使ってみた感想をお寄せください。
コメント
ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。
まだコメントはありません。最初のコメントを書いてみませんか。
同じリポジトリのスキル
【必須】open askを1件ずつ人間に提示し、回答をanswer_askで記録する。「askに答える」「open ask消化して」「溜まってるask片付けたい」などで発動。このスキルを経由せずにanswer_askを呼ばない。
【必須】add_askでaskを起票する前に、question/contextをテンプレートで組み立てる。離席中・セッション跨ぎでしか答えられない判断が出たときや、「これ聞いといて」「判断委譲しといて」「後で確認して」などで発動。このスキルを経由せずにaskの文面を書かない(メタaskを除く)。
add_askの応答のsimilar_asksを見て、同型の問いが繰り返され裁定が一貫していると気づいたとき、判例をまとめてメタask(kind="meta")を起票する。
人間の判断待ちaskの受け箱をMonitorで監視し、判断構造が同じopen askが溜まっていればメタaskを起票する。「ask storeを監視して」「asksを見張って」「open askの滞留をチェックして」などで発動。
過去の判断を疑う場面で、一次資料と経緯ログから全体像を組み直し、文脈不足を分析して知識を正しい場所に置き直す長いプロセス。過去のdecisionとの食い違い、同じtagで3度目の方針変更、同じバグの2回目、「前に決めなかったっけ?」「また同じ話してる」「グルグル回ってない?」などで発動。