DeepSeek SuperagentでGitHub IssueをPRまで運ぶ:導入と最初の一件
!作業依頼を受け取り、成果物を返す小さなロボット。KD Agentic
アシスタントが設定関数を直し、「空文字も処理できるようにした」と言いました。ところが変更をプロジェクトへ戻して動かすと、呼び出し側には古い引数名が残っていて、またエラーになります。
「できた」と言うこと、ファイルを変更すること、実際に動かして確かめることは別々です。変更箇所や確認方法を毎回聞き直すのではなく、依頼と成果を追える場所に置けたらどうでしょう。
まずは、インストール不要の二つのチャットで「範囲と合格条件を書いた依頼票」を作ってみます。そのあと、DeepSeekの公開リポジトリにあるdsh-superagent-prototypeを練習用GitHubリポジトリにつなぎ、小さなREADME修正をPull Request(PR)として受け取るところまで進みます。PRは、プロジェクトへ取り込む前に人が確認できる変更提案です。
まず二つの普通のチャットで、依頼票を作る
二つのAIチャットを開き、ウィンドウAに次の材料を貼り付けてください。
> あなたはタスクを整理する担当です。変更作業はしないでください。元の情報:READMEには「npm run demoを実行するとhelloと表示される」と書いてあります。実際の取り決め:npm run demoの出力はHello, world!です。目標、変更してよい範囲、合格条件を含む依頼票を作ってください。変更してよいのはREADMEだけです。プログラム、スクリプト、依存関係は変更しないでください。
Aが作った依頼票に、最初の材料も添えてウィンドウBへ渡します。
> 依頼票に従い、READMEの変更前と変更後の文章を提示してください。制約を一つずつ満たしているか説明してください。提示された材料だけを使ってください。ターミナルが使えない場合、コマンドを実行したとは言わないでください。
期待する変更は、READMEのhelloをHello, world!に直すことだけです。プログラムと起動コマンドはそのままです。Bの結果をAへ戻し、元の制約と照らし合わせてもらいましょう。もしBが起動コマンドまで変えてしまったら、どこを直してほしいのかを具体的に伝えられます。
回答の言い回しは見本と同じでなくて構いません。見るのは、変更範囲と期待する結果です。この練習で得られるのは文章による納品物であり、プログラムが実行された証拠ではありません。チャットを二つに分けても、間違いが自動でなくなるわけではありません。
ここで身につけたのは、変更範囲と合格条件を一枚の依頼票にまとめると、「できた?」を何度も聞かずに成果を受け取りやすくなるということです。
この依頼票の考え方を、次は実際のリポジトリにつながるSuperagentへ持ち込みます。先ほどの練習は、Superagentをインストールしたことにも、独立した監査役が正しさを保証することにもなりません。
リポジトリの横にある作業台として考える
dsh-superagent-prototypeは、DeepSeek Harness(DSH)の上で動き、GitHubから依頼を受け付けます。GitHubがメッセージを運び、Policyが依頼者を確認し、Ticketが仕事を記録し、独立したセッションと作業ディレクトリで処理します。結果は元の議論へ戻り、たとえばPRとして人が確認できます。
一つのリポジトリを対象にした研究用プロトタイプです。DeepSeekの正式な製品ではなく、チーム内部の実装とも同一ではありません。関連する設計記事にある構想の一部も、このコードにはまだ実装されていません。製品のスイッチを入れる感覚ではなく、アカウント、実行環境、設定を自分で管理するソフトウェアとして扱いましょう。
最初に向いているのは、結果を小さな差分で確かめられる仕事です。
| 仕事 | 依頼に書くこと | 人が見るところ |
| --- | --- | --- |
| ドキュメント修正 | READMEのどの説明をどう直すか | 差分が指定した文章だけか |
| テスト追加 | 対象関数、境界ケース、既存動作を保つこと | テストが追加され、実際に実行されたか |
| 小さな不具合修正 | 再現入力、実際の結果、期待する結果 | 再現条件が解消し、関連テストも通るか |
| Feishuからの依頼 | 設定後、指定したチャットで同じ依頼票を渡す | 元の会話への返答と対応するPR |
どれも活用候補であり、成功の保証ではありません。依頼に情報が足りなければ、PRではなく追加説明を求めることもあります。最初の目標は、練習用リポジトリに届いた変更を自分で読めることです。
どのマシンで動かすかを先に決める
ここで大事なのは、専用の作業ディレクトリは、セキュリティ上の隔離ではないという点です。
公式のデプロイガイドでは、ExecutorとメインSession用のプリセットが、実行サービスと同じOSユーザーでdanger-full-access権限により動きます。プロセスはパスを指定してプログラムを実行でき、そのユーザーのホームディレクトリも読めます。アカウントを切り替えるラッパーは、どの認証情報を使うかを選ぶものです。プロセス自体を閉じ込める仕組みではありません。
机の上の「ロボット用」と書いた鍵箱を想像してください。使う鍵は選べても、同じユーザーから開けられる引き出しまで封じるものではありません。初回は専用OSユーザー、またはロボットの認証情報と練習用リポジトリだけを置いた隔離環境を使うのが無難です。DSHの専用Profileや一つのリポジトリに絞る設定は仕事を整理しますが、個人ファイルを読めなくする境界にはなりません。
以下はPOSIXシェル向けです。Windowsでは、すでに用意したWSLのLinux環境で実行してください。PowerShellへそのまま貼り付ける手順ではありません。公式スクリプトはtmuxやシェル、Pythonのfcntlなどを使います。WSLの導入は別のシステム準備なので、すでに環境がある場合はここを進めます。
場所も二つに分けます。一つはSuperagent本体のリポジトリ、もう一つはSuperagentに作業させる練習用プロジェクトです。本体のリポジトリへインストールしても、作業対象の場所が自動で決まるわけではありません。
手順1:ツールとモデル接続を確認する
選んだLinux/POSIX環境で、以下を一つずつ実行します。
node -v
pnpm -v
git --version
python3 --version
tmux -V
gh --version
dsh --version
SETUPではNode.js 22.19以上または24以上、Git 2.32以上、Python 3.8以上、GitHub CLI 2.48以上に加え、pnpmとtmuxが必要とされています。DSHは、取得したプロジェクトのpackage.jsonにあるengines.dshの条件も満たさなければなりません。バージョンは、実際に使うチェックアウトの記述を基準にしてください。
各コマンドでバージョンが表示されることを確認します。command not foundと出た項目だけを準備リストに加え、先へ進む前に解決します。すでにあるツールを重ねてインストールする必要はありません。
DSHが作業台の土台、Superagentはその上に載せる作業パッケージです。さらにDSHで利用できるモデルサービスを設定します。コードがオープンソースでもモデル呼び出しが無料とは限らず、費用や利用枠は選んだサービスとアカウントによって変わります。まずDSHで普通のモデル会話を一度できるようにしておくと、「モデルが応答しない」のか「GitHubから依頼が届かない」のかを切り分けやすくなります。
手順2:公式のセットアップ案内を使う
Superagent本体を、作業対象の練習用リポジトリとは別の場所へ取得します。
git clone https://github.com/deepseek-ai/dsh-superagent-prototype.git
cd dsh-superagent-prototype
既存のコーディングアシスタントでこのディレクトリを開き、次のように依頼します。
> このリポジトリのSETUP.mdを読んで、私と一緒にdsh-superagentをセットアップしてください。
さらに、「最初はGitHubだけ、練習用リポジトリだけを接続する。依頼できるのは自分だけ。自動マージは無効にする。実行前に全体の計画を示し、確認を待つ。認証情報は自分がローカルでログインまたは入力する」と伝えます。
公式のセットアップ手順は、必要な情報を一つずつ集め、全体の計画を提示してから確認を求めます。手元に用意するのは、練習用リポジトリのowner/name、ロボット用GitHubユーザー名、依頼を許可する自分のユーザー名、練習用リポジトリのローカルパス、コミット作者の名前、auto-mergeを使うかどうかです。最初はGitHub only、自分だけを許可、自動マージはNoにすると設定を絞れます。
ロボットには専用のGitHubユーザーアカウントが必要です。そのアカウントを練習用リポジトリへ招待し、書き込み権限を付けます。現在のデプロイ方式はアカウントの通知を読むため、GitHub Appをそのまま代わりにはできません。対象はgithub.comのリポジトリで、GitHub Enterprise Serverはサポート対象外です。
手順3:自分とロボットのGitHubログインを分ける
デプロイガイドは、ロボット用GitHub認証情報を使う独立したghラッパーを用意します。専用環境で実行し、同名ファイルがすでにあれば内容を確認してから扱ってください。
mkdir -p ~/.local/bin
cat > ~/.local/bin/gh-agent <<'EOF'
#!/bin/sh
GH_CONFIG_DIR="$HOME/.config/gh-agent" exec gh "$@"
EOF
chmod +x ~/.local/bin/gh-agent
~/.local/bin/gh-agent auth login
~/.local/bin/gh-agent api user --jq .login
ログイン画面ではロボットのアカウントを選びます。最後のコマンドが返すのはロボットのログイン名です。自分のユーザー名が返った場合は、先へ進まず認証先を確認します。
トークンをチャットへ貼り付ける必要はありません。このラッパーは、机の「ロボット用鍵箱」のような役割をします。正しい鍵を選ぶものの、同じOSユーザーが使える他のファイルを隔離するものではありません。
手順4:インストール、設定、起動を分ける
以下は、Superagent Profileがまだない新規環境でのインストール手順です。コーディングアシスタントには、公式デプロイガイドと照らし合わせて計画してもらいましょう。
npm install -g @deepseek-ai/dsh@0.2.1-rc.3
pnpm install
pnpm build
dsh superagent --from-default-profile web --dump-config > /dev/null
dsh plugin --profile superagent add "link:$PWD"
すべてSuperagent本体のリポジトリのルートで実行します。最初の行はデプロイ文書に記載されたDSHの固定バージョンです。すでにDSHがある場合は、package.jsonの互換範囲を先に確認します。
4行目のProfile作成コマンドは新規インストール用です。既存のsuperagent Profileに再実行すると、設定を置き換えてしまいます。すでに使っている人は、設定を保ったまま公式のUpgrade手順に進みます。
ビルドが成功しても、依頼を受けられる状態とは限りません。 次に、examples/profile.cordis.patch.ymlを参考にマシン設定を整え、絶対パスのstateDirを指定します。新規環境では公式の案内に沿って例を使い、既存設定があるならファイル全体を置き換えず必要箇所だけ編集します。プロファイル用プラグインはPATHやGitの設定にも影響するため、普段使うProfileとは分けて管理し、個別に再起動・更新します。
続いてサービスを起動し、状態を確認します。
scripts/dsh-superagent start
scripts/dsh-superagent status
起動ログに出るアドレスを開き、サイドバーからSuperagentを選択します。標準の計画では127.0.0.1:3082を使いますが、実際のポートは設定に従ってください。
パネルでは四つの設定をそろえます。
- Sources:練習用リポジトリのowner/nameと、ロボット用ghラッパーの絶対パス。
- Policy:自分のGitHubログイン名を許可リストへ追加。リストが空だと依頼はTicketになりません。
- Execution:作業ディレクトリのルートとprepareコマンド。各Ticket用にプロジェクトの作業コピーを作れるよう、実際のクローンパスからworktreeコマンドを組み立ててもらいます。
- Prompts:コミット作者とロボットであることの開示文を設定し、マージは人が行う条件を残します。
電源ケーブルのように、この四つがつながって初めて依頼が動きます。モデルだけを変更しても、GitHubアカウントや作業ディレクトリの設定不足は補えません。設定保存後に再起動を求められたら、サービスが戻るのを待ちます。外部ログインを直した後は、表示されるCheck againで再確認します。
手順5:最初の本物の依頼を送る
Policyで許可したアカウントから、練習用リポジトリのIssueに新しいコメントを投稿します。
@<agent-login> Please correct the README's demo output description.
It should say Hello, world!
Only change README. Do not change the program, scripts, or dependencies.
Please open a PR and explain what changed and how you checked it.
山括弧の箇所をロボットの実際のユーザー名に置き換えます。これは依頼文の例であり、コマンドではありません。
通常はGitHubアカウントの通知を約1分間隔で確認して依頼を受け取ります。既存Issue本文を編集してmentionを足す方法では通知されません。新しいコメントとして投稿してください。また、need-agentラベルを付けるだけでは依頼のトリガーになりません。ラベルから自動で受け付けるには別のルールが必要です。
パネルのOverviewにTicketが作られたか、タスクSessionと元コメントへの返答があるかを確認します。結果はPRのこともあれば、情報の追加依頼のこともあります。確認は三段階に分けましょう。
1. Ticketがある:依頼を受け取る経路が動いた。
2. PRがある:変更案が作られた。
3. 差分と確認記録を見る:依頼した変更範囲と合格条件を満たしたか判断できる。
READMEの練習なら、出力説明が直り、起動コマンドが変わっておらず、プログラム・スクリプト・依存関係が変更されていないことを差分で確認します。「全部通りました」という文章だけでは、実際に何を確認したかの代わりになりません。
statusの終了コードも状況の切り分けに役立ちます。0は正常、1はプロセスまたはランタイムの問題、2はSourceなどのモジュールエラー、3はセットアップ待ちです。2や3の場合、再起動を繰り返しても足りない設定は出てきません。errorsやsetupに表示された詳細を見ます。サービスの状態が正常でも、最初のPRが依頼どおりかどうかは別に確認してください。
一件できたら、任せる範囲を少しずつ広げる
READMEの修正が届いたら、次はテスト環境がすでにあるリポジトリで、小さな関数の境界テストを頼めます。依頼票にテストコマンド、変更してはいけないファイル、失敗した場合の報告方法を加えると、確認しやすくなります。
自分から仕事候補を見つける動作は、明示的な依頼とは別に考えます。SETUPの初期値であるobserveは、候補を記録するだけで実行しません。許可された人から明示的に届く依頼と、エージェントが先回りして見つけた候補は同じものではありません。まず候補の内容を見て、どの範囲まで任せるか決めましょう。
Feishuも後から追加できる入口です。ボットアプリ、権限、専用のlark-cli設定、許可リストが必要になります。依頼を出す場所は増えますが、リポジトリ権限、実行マシン、モデル設定は引き続き必要です。
今は後回しでよいこと
Feishu、自発的なスキャン、複数人からの依頼、自動マージ、本番環境への接続は、最初の一件が届いてから考えれば十分です。最初の目標は、練習用リポジトリに届いた変更を読める小さなPRを一つ受け取ることです。
アイデアを相談するだけなら、いつものチャットも便利です。常駐する作業台の価値は、依頼、状態、納品物を追える場所にまとめられること。PRが戻ってきたら差分を開き、確認結果を読み、取り込むかどうかを自分で決めましょう。
参照した一次資料と適用範囲
以下の公開プロジェクト資料を2026年11月7日に確認しました。コマンドやパネル名はチェックアウトするバージョンで変わることがあります。
- プロジェクトREADME:研究用プロトタイプの位置づけ、対象リポジトリ、内部実装との違い。
- SETUP.md:前提条件、セットアップ時の質問、初期設定、最初の依頼。
- 006 Deployment:アカウント、権限、インストール、パネル設定、通知確認、起動と終了コード。
- package.json:Node.jsとDSHの互換条件、ビルドコマンド。
[开源] 把 Pi 和 DeepSeek Harness 装进了手机:一个 Android 上的开源 AI Agent
大家好,分享一个我业余在做的开源项目:小维助手(WeiAssist),一个装在 Android 手机上的 AI Agent。
它最大的特点:同一个 App 里支持两种 Agent 引擎:[Pi]( earendil-works/pi) 和 [DeepSeek Harness]( deepseek-ai/deepseek-harness),在设置里一键切换 。
GitHub: zjw1918/WeiAssist
下载: github.com/zjw1918/WeiAssist/releases/latest (v0.3.0,Apache 2.0)
两个引擎,按需选
| | Pi | DeepSeek Harness |
| --- | --- | --- |
| 安装 | 内置,装好 App 就能用 | 设置 → AI 引擎,一键安装(自动在 Termux 里装好 Ubuntu + Node.js + dsh) |
| 特点 | 轻量、快,极简的 Agent 循环 | 自带文件、bash、子 Agent、网页抓取、技能(skills)、工作流 |
| 版本 | 随 App 打包 | 默认装经过测试的版本,也可以装最新版或任意版本,随时回退 |
几个设计上的点:
- 两个引擎共用同一套模型和密钥:OpenAI、Anthropic、Google、DeepSeek、OpenRouter、xAI、Moonshot、Mistral,
以及任何 OpenAI 兼容接口(Ollama、vLLM、LM Studio…)。配一次,两边都能用。
- 两个引擎都能用 App 的手机能力:操作 App、跑 Termux 命令、收发文件,也都走同一套安全确认。
- 不阉割引擎原生能力:DeepSeek Harness 的子 Agent、技能、工作流都原样保留,
并在 UI 里做了对应展示,而不是为了"两边一致"砍成最小公约数。
- DeepSeek Harness 不接触你的密钥:它通过 App 访问模型服务,Key 始终只在 App 里(Android Keystore 加密)。
- 每个会话记住自己的引擎:可以一个会话用 Pi 快速问答,另一个会话用 DeepSeek Harness 跑重活,互不影响。
演示:DeepSeek Harness 子 Agent 并行
让它开 3 个子 Agent 分别调研 Rust / Go / Zig,每个子 Agent 一张实时卡片(耗时、步骤、当前在做什么),
全部完成后由主 Agent 汇总成一张对比表:

其他能力
- 手机上的 Linux:配合 Termux 查资料、处理数据、写代码并运行,长任务放 tmux 后台。
- 替你操作 App:通过无障碍服务操作应用,"发送 / 支付 / 删除"前一定先问你,不管用哪个引擎。
- 多会话并行:多个对话同时在后台跑,还有一个"总管"帮你启动、查看、停止它们(支持语音)。
- Telegram 远程:配对一个 Bot,人不在手机旁也能指挥它,危险操作在 Telegram 里 ✅ / ❌ 确认。不需要服务器。

隐私
没有我的服务器。App 直连你选的模型服务,密钥只存在手机上,密码框内容永远不会发出去。
已知局限
- DeepSeek Harness 需要 Termux,约 1.5 GB 空间,首次安装 10–30 分钟。
- UI。
想听听大家的意见
- 你更想在手机上用哪种引擎?还希望接入哪些 Agent 引擎?
- 最想让手机上的 Agent 帮你干什么?
欢迎试用、提 Issue / PR,觉得有意思的话给个 Star 就很感谢了 🙏
OpenCode Go × dshで月$10 — Opus 5.5で計画し、DeepSeek V4.1 Flashに大量実行させる
OpenCode Goが安くてコスパいい。
現状は、Opus 5.5(Claude Pro 月$20)で計画し、
OpenCode Goの月$10のサブスクで DeepSeek V4.1 Flash をお得に仕入れ
実行部隊として,全自動で昼夜を問わず働かせ続けよう
という記事です。
合計は月$30になりますが、それでもMaxを契約するより安い
しかし、OpenCodeをそのまま使うと、ハーネス自体はあまり良くない。
そこで DeepSeek Harness(dsh) に替えると
キャッシュヒット率が上がってトークンが節約できたり
モデルの性能を最大限に引き出せたり
なぜか出力速度も100 tok/s以上で速苦なったり(という噂もある)
といった効果が期待できます。
これを使うと,一つのiOSアプリならOpenCode + dshだけでも一回数行の指示で作れます。
サブスクがAPI料金と比ベてどれだけ得したか表示するアプリ
自分の好みにあった論文が日本語訳と画像・動画付きで表示されるアプリ
ここまで押さえれば,全部を読む必要はありません。(そもそも全自動で何かをさせるための記事なので,人間が時間を割いて読むのは本末転倒)
導入してみたい・とりあえず無料枠で試してみたいと思ったら、保存しておいて、あとでこの記事のリンクをそこらへんのAIに投げ、ハーネスを結びつけるところまでやってもらいましょう。
※この記事は2026年11月時点の環境のメモです。OpenCode Goの料金・提供モデル・利用上限は変わるので、公式情報を確認してください。
はじめに:全部を高いモデルでやる必要はない
正直に言うと、私はOpus 5.5を崇拝していない。計画を立てるときや、失敗したときの原因究明では本当に頼りになる。だが、すべての実装・調査・テスト・ドキュメント更新までOpus 5.5にやらせると、請求を見るたびに「この作業、本当にOpusじゃないとダメだったか?」と思う。
Opus 5.5は高い。高いこと自体は悪くない。悪いのは、高くなくていい仕事に高いモデルを使い続けることだ。研究者に書類整理をさせるようなもので、仕事の質は上がらないのに、疲れだけ増える。
一方で、実際のコーディング作業の多くは「そこそこ賢ければ回せる」仕事でもある。設計方針が決まっていて、変更範囲が明確で、テスト方法も決まっているなら、Opus 5.5でなくても十分に戦える。というか、そういう仕事をOpus 5.5に投げている時間は、私にとっては思考の中断でしかない。
そこで、役割を分けることにした。
計画・分解・レビューはOpus 5.5
大量の実装・調査・テストはDeepSeek V4.1 Flash
実行ハーネスはDeepSeek Harness(dsh)
DeepSeek V4.1 Flashの供給元はOpenCode Go(月$10)
この構成にすると、高価なモデルは「判断が必要なところ」だけに使い、安いモデルで「量が必要なところ」を回せる。しかも、dshに乗り換えたことでキャッシュヒット率とデコード速度が上がった印象がある。
サブエージェントを何本も走らせていると、いつの間にか「これはOpusにやらせる仕事か?」と自問するようになる。大体の答えはNoで、Noと言いながらOpusに投げているから、財布が痛む。
この記事では、その構成の考え方と、実際に導入するときの手順をまとめる。導入でまごついた部分を「人間がやる作業」と「AIに任せられる作業」に分け、コピペ用のプロンプトも用意した。
対象読者
AIコーディングのトークン代を抑えたい
高いモデルと安いモデルの使い分けに興味がある
OpenCode Goやdshを試してみたい
サブエージェントを大量に走らせるワークフローを作りたい
結論:こういう分担にした
役割
担当
理由
プランナー
Opus 5.5
問題設定、タスク分解、設計判断、最終レビュー
オーケストレーター
dsh
サブエージェントの実行、キャッシュ、スループット
ワーカー
DeepSeek V4.1 Flash(OpenCode Go)
安くて速く、実装・調査・テストに十分な性能
レビュアー
Opus 5.5
差分の最終確認、設計との整合性チェック
処理の流れはこうなる。
[Opus 5.5]
計画・タスク分解・受け入れ条件の定義
|
v
[DeepSeek Harness (dsh)]
オーケストレーション / キャッシュ / サブエージェント実行
|
+--> [DeepSeek V4.1 Flash] 実装 A
+--> [DeepSeek V4.1 Flash] 実装 B
+--> [DeepSeek V4.1 Flash] 調査 C
+--> [DeepSeek V4.1 Flash] テスト D
|
v
差分・テスト結果を Opus 5.5 でレビュー
ポイントは、dshをプランナーにしないこと。dshは実行層に徹させ、計画と最終判断はOpus 5.5に残す。こうすると、安いモデルの失敗を高いモデルで回収しやすい。
なぜOpus 5.5が「頭脳」で、DeepSeek V4.1 Flashが「実行部隊」なのか
私はベンチマークを鵜呑みにするつもりはない。だが、「Opusのほうが賢い気がする」という空気でモデルを選ぶのはもっと嫌いだ。なので、公開ベンチマークで確認する。FrontierCS 2(2026年11月4日時点)は、CS論文の主要な貢献をコードから抜き、AIエージェントが実装し直して人間の参照実装を全指標で上回れるかを競う48タスクのベンチマークだ。
モデル(ハーネス)
FCI
通過率
推定APIコスト/タスク
Claude Opus 5.5(Claude Code)
51.2
58.3%(28/48)
約$20.0
DeepSeek V4.1 Flash(DeepSeek Harness)
28.4
12.5%(6/48)
約$0.11
FCI(FrontierCS Capabilities Index)は能力の指数で、数字が大きいほど難しいタスクを通しやすい。10ポイント差で「指標を上回るオッズ」が約2.7倍になる。Opus 5.5とDeepSeek V4.1 Flashの差は22.8ポイントなので、オッズで約10倍。正解が一つに決まらない設計判断をOpus 5.5に残すのは、この差が理由である。
一方で、API費用は約187倍違う。DeepSeek V4.1 FlashのFCIはOpus 5.5の約55%だが、1タスクあたり約$0.11のAPI費用で回り、ハーネスはDeepSeek Harness(dsh)だ。設計が決まり、変更範囲とテストが明確な実行タスクなら、この単価差がそのままコスパの差になる。
これは信仰の話ではなく、仕事の種類と単価の話だ。Opus 5.5も通過率58.3%で万能ではないので、プランの最終確認は人間が行う前提で読んでほしい。
研究タスクの通過率を、そのまま実務の成功率として読まないこと。計画力だけを測った指標でもない。API費用は従量課金の推定値で、OpenCode Goの月$10(Opus込みで月$30)とは課金形態が違う。ハーネスもOpus側はClaude Code、DeepSeek側はdshと揃っていない。
この記事の設定では、dshのプロバイダはOpenCode Goだけなので、Opus 5.5はdshの外(Claude CodeやWebのチャット)で動かす。プランナーの出力は plan.md のようなファイルに落とし、ワーカーに渡す。レビューは差分とテスト結果をOpus 5.5側に戻す、という受け渡しになる。
なお、dshでサブエージェントをどう起動するかはバージョンによって変わる。ここでは役割の分け方と設定に絞り、起動方法の詳細は割愛する。
なぜOpenCode Goなのか
OpenCode Goは、月$10の固定額で、DeepSeek V4.1 Flashなどのモデルを使えるサブスクリプションだ。公式ページ(2026年11月時点)では、Goプランが月$10、上位のGo Plusが月$40と表示されている。DeepSeek V4.1 Flashは「5時間あたり約43,000リクエスト、月$100相当」という目安で載っている。
無制限ではなく上限はある。それでも、個人がサブエージェントを何本も走らせる用途では、十分に大きい数字だと感じる。執筆時点の私の環境では、opencode-go プロバイダから deepseek-v4.1-flash と deepseek-v4-pro が見えている。
ここで、財布の話をしておく。私の場合、Opus 5.5側に月$20かかっている。OpenCode Goの月$10と合わせると、合計は月$30だ。OpenCode Go単体の$10だけを見ると「激安」に見えるが、実際に払うのは$30。それでも、全部をOpus 5.5の上位プラン(Max)で回すより安い。
項目
月額
役割
Opus 5.5側のプラン
$20
計画・レビュー
OpenCode Go
$10
DeepSeek V4.1 Flashの実行
合計
$30
料金は執筆時点の私の契約の話で、プラン名や価格は変わる。MaxにもMaxの価値はあるので、これは「私の用途では」という比較だ。
OpenCode Goのいいところは、「最高のモデル」ではなく「そこそこいいモデル」を大量に使えることだと思う。
Opus 5.5ほどの推論力はない
それでも実装、リファクタリング、テスト、調査、ドキュメント更新には十分
サブエージェントとして並列に投げても、財布へのダメージが小さい
もちろん、OpenCode GoがあればOpus 5.5が不要になるわけではない。難しい設計判断や、失敗したときの原因究明は、依然として高いモデルのほうが強い。だから「全部を安いモデルにする」のではなく、仕事の種類で分けるのが大事だ。
金額の比較はトークン量やキャッシュの効き方で変わるので単純には言えないが、「計画はOpus、実行はDeepSeek」にすると、同じ予算で回せるタスク数は増える印象がある。特に、サブエージェントを何本も走らせるワークロードでは効いてくる。
注意:料金・モデル・利用上限は変わる。契約前に公式サイトの最新情報を確認してほしい。
なぜdshなのか
OpenCodeのハーネスは、私にはあまり合わなかった。使い方が悪いだけかもしれないが、サブエージェントの制御や、長いセッションでのキャッシュの効き方に物足りなさを感じていた。
dsh(DeepSeek Harness)に乗り換えてから、印象が変わった。
キャッシュが効きやすいと感じた:同じシステムプロンプトや同じプレフィックスを繰り返すワークロードで、キャッシュヒット率の表示が高かった
デコードが速い:手元では、1回の実行で100 tok/sを超えるデコード速度が表示されたことがあった
サブエージェントを回しやすい:実行層として割り切って使える
UIで使用量が見える:トークン数、キャッシュヒット率、ターン数が確認できる
ただし、これは厳密なベンチマークではない。OpenCodeのハーネスと同一条件で比較測定したわけでもない。プロンプト長、キャッシュの状態、マシン、ネットワーク、モデルのバージョンで大きく変わる。あくまで「私の環境ではこう感じた」という参考値として読んでほしい。
私の環境はこんな感じ。
macOS(Apple Silicon)
Node.js v22.23.4
dsh 0.2.1-rc.5
OpenCode CLI 1.19.4
検証に使ったモデル:opencode-go / deepseek-v4.1-flash(無料モデルも別途試した)
セットアップの全体像
dshでOpenCode Goを使うには、大きく3つの部品が必要になる。
OpenCodeのAPIキー(Goサブスクリプション用。無料モデルも試すならZen用も。人間が用意)
opencode.ai宛のヘッダーを注入するプラグイン(AIで作成可能)
dshのプロバイダ設定(AIで作成可能)
ファイルで言うと、次のようになる。
~/.dsh/
├── plugins/
│ └── opencode-headers/
│ └── index.js # opencode.ai 宛の fetch にヘッダーを付ける
├── profiles/
│ └── web/
│ └── cordis.patch.yml # プロバイダとデフォルトモデルの設定
└── .credentials.yaml # APIキーの参照(値はここに入る)
プラグインの置き場所は任意だが、cordis.patch.yml に書く file:// のパスと一致させないといけない。ここでは ~/.dsh/plugins/ の下に置いている。
なぜプラグインが必要かというと、opencode.ai側が「OpenCodeの公式クライアントからのリクエストか」を見ているからだ。dshのpi-aiは独自のヘッダーを送るので、そのままだと弾かれることがある。そこで、OpenCode CLIと同じ user-agent と x-opencode-client を付ける。
これは非公式のワークアラウンドなので、OpenCode側の仕様変更で動かなくなる可能性がある。利用規約の範囲内で、自己責任で使ってほしい。
人間がやる部分
ここはAIに任せにくい。というか、任せるべきではない。
1. OpenCodeのアカウントとGoサブスクリプションを用意する
OpenCodeのアカウントを作る
OpenCode Goに加入する(執筆時点で月$10)
ダッシュボードからAPIキーを発行する
支払いとログインが絡むので、ここは人間の仕事だ。
2. APIキーを安全に保管する
APIキーはパスワードと同じ扱いにする。
Gitにコミットしない
チャットに貼らない
スクリーンショットに映さない
使わなくなったら失効させる
dshは ~/.dsh/.credentials.yaml にキーを保存する。ファイルのパーミッションは 600 にしておく。
chmod 600 ~/.dsh/.credentials.yaml
3. Node.jsとdshを用意する
手元では Node.js v22.23.4 で動作を確認した。dshは npx で起動できる。
node --version
npx --yes @deepseek-ai/dsh --version
必要なNode.jsのバージョンは変わることがある。起動しない場合はdshのREADMEも確認してほしい。
4. APIキーをdshに登録する
dshの設定画面(Models)にAPIキー欄があれば、そこに入れるのが一番簡単だ。
うまく見つからない場合は、~/.dsh/.credentials.yaml の refs に直接追加する。
version: 1
refs:
OPENCODE_API_KEY: sk-... # OpenCode Zen(無料モデル)用
OPENCODE_GO_API_KEY: sk-... # OpenCode Go用(同じキーなら片方だけでもよい)
既存の records や他の refs がある場合は消さずに、refs にキーを追加する。
refs の名前は、あとで出てくる apiKeyEnv と揃える。片方のキーで opencode と opencode-go の両方にアクセスできるなら、両方を OPENCODE_API_KEY にしてもよい。
UIで登録した場合は、--dump-config と ~/.dsh/.credentials.yaml の refs を見て、apiKeyEnv と同じ名前で保存されているか確認する。
5. dshを起動してモデルを選ぶ
npx --yes @deepseek-ai/dsh web
ブラウザが自動で開く。開かない場合は、ターミナルに表示されたURLを開く。
画面右下のモデル選択から、次のどちらかを選ぶ。
本番用:opencode-go → DeepSeek V4.1 Flash
お試し用:opencode → DeepSeek V4.1 Flash Free
モデルピッカーではプロバイダごとにグループが分かれている。opencode と opencode-go は別物なので、ここを取り違えないように注意する。
モデル名は変わりやすい。元記事(2026年8月)では deepseek-v4-flash-free、手元(2026年11月)では deepseek-v4.1-flash-free だった。記事の表記より、ピッカーに表示されている名前を優先してほしい。
AIに任せられる部分
ファイル作成、YAMLの編集、設定の検証、起動、トラブルシュートはAIに任せられる。ただし、APIキーの入力だけは人間がやる。
作業
人間
AI
補足
OpenCodeアカウント作成
✅
❌
支払い・ログイン
Goサブスクリプション契約
✅
❌
支払い
APIキー発行
✅
❌
秘密情報
dshへのキー登録
✅
△
UI入力が安全。AIは場所だけ案内
Node.jsの確認
△
✅
コマンドで確認
プラグイン作成
❌
✅
ファイル生成
cordis.patch.yml 編集
❌
✅
YAML編集
設定の検証
△
✅
--dump-config
dshの起動
△
✅
バックグラウンド起動
モデル選択
✅
△
UIで最終確認
テスト送信
✅
✅
ブラウザ自動化があればAI
トラブルシュート
△
✅
ログと設定の切り分け
コピペ用プロンプト1:セットアップ
AIエージェントにファイルを作らせるためのプロンプト。APIキーは渡さない。プロンプト1を使うときは、後述の「設定ファイル」節のプラグインとYAMLも一緒に貼る。
あなたは私のmacOS環境でDeepSeek Harness(dsh)をセットアップするエージェントです。
目的は、dshのwebプロファイルでOpenCode GoのDeepSeek V4.1 Flashを使えるようにすることです。
前提:
- Node.js と npx が使える。
- dshは npx --yes @deepseek-ai/dsh で起動できる。
- 私はOpenCodeのAPIキーを持っているが、チャットには貼らない。
- 既存の ~/.dsh/profiles/desktop は変更しない。
- 変更してよいのは ~/.dsh/profiles/web と ~/.dsh/plugins だけ。
作業:
1. 私が貼り付けるプラグインのコードを、~/.dsh/plugins/opencode-headers/index.js として保存する。
2. 私が貼り付けるYAMLを、~/.dsh/profiles/web/cordis.patch.yml に追記する。すでにファイルがある場合は、既存の内容を壊さない。
3. npx --yes @deepseek-ai/dsh --profile web --dump-config を実行し、次を確認する:
- opencode-headers が file://... で入っている
- llm-pi-ai に opencode と opencode-go がある
- agent-default-model が opencode-go / deepseek-v4.1-flash になっている
4. 変更したファイルのパスと、確認結果だけを報告する。APIキーの値は表示しない。
5. dshはまだ起動しない。APIキーの登録は私が行う。
禁止:
- APIキーを読む・表示する・ログに出す。
- ~/.dsh/.credentials.yaml を勝手に編集しない。
- 既存のdesktopプロファイルを変更する。
設定ファイル節の file:///Users/yourname/... は自分の環境に合わせて変更する。プロンプト1でAIに渡す場合も、同じパスに直してから貼る。Windowsなら file:///C:/Users/<user>/.dsh/plugins/opencode-headers/index.js のようになる。
コピペ用プロンプト2:起動と検証
dshのwebプロファイルを起動して、設定が反映されているか確認してください。
1. npx --yes @deepseek-ai/dsh --profile web --dump-config で設定を確認する。
2. npx --yes @deepseek-ai/dsh web --no-open --port 5199 をバックグラウンドで起動する。
3. ログから起動URLを取得する。トークン付きURLはチャットに貼らず、私に「ログの場所」だけ教える。
4. 起動ログにプラグインのエラーが出ていないか確認する。
5. 私がブラウザでテストできるよう、URLの場所と、選ぶべきモデル(opencode-go / DeepSeek V4.1 Flash)を案内する。
注意:
- APIキーの値は表示しない。
- 失敗した場合は、エラーコード(QUOTA / MISSING_CREDENTIAL / 401 / 403 / UNKNOWN_MODEL)を確認して、推測でキーを書き換えない。
コピペ用プロンプト3:トラブルシュート
dshでOpenCode Goのモデルを呼び出したときにエラーが出ました。
次の観点で切り分けてください。
1. モデルの選択ミス
- 無料モデルは opencode / deepseek-v4.1-flash-free
- Goのモデルは opencode-go / deepseek-v4.1-flash
- プロバイダとモデルIDの組み合わせが正しいか
2. 認証情報
- ~/.dsh/.credentials.yaml の refs に、設定した名前(OPENCODE_API_KEY / OPENCODE_GO_API_KEY)があるか
- cordis.patch.yml の apiKeyEnv と同じ名前か
- 値は表示せず、設定されているかだけ確認する
3. エラーコード
- QUOTA / 429 FreeUsageLimitError: 無料枠の上限。Goモデルに切り替える
- MISSING_CREDENTIAL: キーが見つからない
- INVALID_CREDENTIAL / 401: キーが無効
- 403: モデルへのアクセス権がない
- UNKNOWN_MODEL: モデルIDが違う
4. プラグイン
- opencode-headers が --dump-config に出ているか
- file:// のパスが実在するか
- 起動ログにプラグインのロードエラーがないか
変更する前に、現在の設定とエラーの全文を確認してください。
APIキーを推測で書き換えたり、チャットに表示したりしないでください。
コピペ用プロンプト4:プランナー/ワーカー/レビュアー
Opus 5.5で計画を立て、DeepSeek V4.1 Flashに渡すときのプロンプト例。
プランナー(Opus 5.5)
あなたはシニアエンジニアです。以下のタスクを、DeepSeek V4.1 Flashのサブエージェントが実行できる単位に分解してください。
出力形式:
- タスクID
- 目的
- 入力(読むべきファイル)
- 変更してよいファイル
- 完了条件
- テスト/検証コマンド
- 依存関係
- 並列実行の可否
制約:
- 1タスクの変更範囲は小さくする
- 完了条件はコマンドで検証できる形にする
- 設計判断が必要な部分は、ワーカーに任せずプランナー側に残す
- 不明点は「要確認」として明示する
タスク:
(ここに依頼内容を書く)
ワーカー(DeepSeek V4.1 Flash)
あなたはタスク<ID>の実装担当です。以下の計画に従ってください。
- 目的: ...
- 入力: ...
- 変更してよいファイル: ...
- 完了条件: ...
- テスト: ...
ルール:
- 変更してよいファイル以外は触らない
- 不明点があれば、勝手に決めずに「要確認」として報告する
- 作業後に、変更内容とテスト結果を簡潔にまとめる
- 秘密情報(APIキー、トークン)は読まない・表示しない
レビュアー(Opus 5.5)
以下の差分とテスト結果をレビューしてください。
観点:
- 計画の目的を満たしているか
- 変更範囲が適切か
- 設計上の一貫性が崩れていないか
- テストが十分か
- セキュリティ上の問題がないか
出力:
- 重大な問題
- 改善提案
- 追加で必要なテスト
- マージ可否
設定ファイル
以下は、本番用にOpenCode Goをデフォルトにした場合の設定例。
プラグイン
~/.dsh/plugins/opencode-headers/index.js に置く。内容は元記事のコードをそのまま使っている。
export const name = 'opencode-headers'
const OpenCodeHost = 'opencode.ai'
const OpenCodeHeaders = Object.entries({
'user-agent': 'opencode/latest/1.18.18/cli',
'x-opencode-client': 'cli',
})
function targetUrl(input) {
if (typeof input === 'string') { return new URL(input) }
if (input instanceof URL) { return input }
if (typeof input?.url === 'string') { return new URL(input.url) }
return undefined
}
function isOpenCodeHostname(hostname) {
const host = hostname.toLowerCase()
return host === OpenCodeHost || host.endsWith(.${OpenCodeHost})
}
export function apply(ctx, config) {
ctx.effect(() => {
const originalFetch = globalThis.fetch
globalThis.fetch = (input, init) => {
let url
try {
url = targetUrl(input)
} catch (_notAUrl) {
url = undefined
}
if (url === undefined || !isOpenCodeHostname(url.hostname)) {
return originalFetch(input, init)
}
const headers = new Headers(input instanceof Request ? input.headers : undefined)
if (init?.headers !== undefined) {
for (const [key, value] of new Headers(init.headers)) { headers.set(key, value) }
}
for (const [key, value] of OpenCodeHeaders) { headers.set(key, value) }
return originalFetch(input, { ...init, headers })
}
return () => {
globalThis.fetch = originalFetch
}
})
}
cordis.patch.yml
~/.dsh/profiles/web/cordis.patch.yml
- insert:
- id: opencode-headers
name: 'file:///Users/yourname/.dsh/plugins/opencode-headers/index.js'
- id: llm-pi-ai
name: '@deepseek-ai/dsh-llm-pi-ai'
config:
providers:
opencode:
apiKeyEnv: OPENCODE_API_KEY
opencode-go:
apiKeyEnv: OPENCODE_GO_API_KEY
- id: agent-default-model
name: '@deepseek-ai/dsh-agent-default-model'
config:
provider: opencode-go
model: deepseek-v4.1-flash
opencode と opencode-go は別のキーを使う想定で、OPENCODE_API_KEY と OPENCODE_GO_API_KEY に分けている。同じキーで両方にアクセスできる場合は、両方を OPENCODE_API_KEY にしてもよい。その場合は refs の名前も揃える。
無料モデルで試したい場合は、agent-default-model を次のように変える。
- id: agent-default-model
name: '@deepseek-ai/dsh-agent-default-model'
config:
provider: opencode
model: deepseek-v4.1-flash-free
credentials.yaml
version: 1
refs:
OPENCODE_API_KEY: sk-... # OpenCode Zen用
OPENCODE_GO_API_KEY: sk-... # OpenCode Go用
既存の records や他の refs がある場合は消さずに追記する。値は絶対に公開しない。ファイルをGit管理しない。パーミッションは 600 にする。
設定の確認
npx --yes @deepseek-ai/dsh --profile web --dump-config
次の3点を確認する。
opencode-headers が file://... で入っている
llm-pi-ai に opencode と opencode-go がある
agent-default-model が意図したプロバイダ/モデルになっている
dshの起動
npx --yes @deepseek-ai/dsh web
ブラウザが自動で開く。開かない場合は、表示されたURLを開く。--no-open を付けると自動オープンを止められる。
つまずいたポイント
1. opencode と opencode-go は別物
ここが一番まごついた。
opencode = OpenCode Zen。無料モデル(deepseek-v4.1-flash-free など)がある
opencode-go = OpenCode Go。有料サブスクリプションのモデル(deepseek-v4.1-flash など)がある
モデルピッカーでは別グループで表示される。手元では、deepseek-v4.1-flash-free を opencode-go 側で選ぶと「Model is unavailable」、deepseek-v4.1-flash を opencode 側で選ぶと「Model access is disabled」と表示されたことがある。
プロバイダとモデルIDの組み合わせを揃えるのが重要だ。
2. 無料モデルは無料枠が尽きると QUOTA になる
無料モデル deepseek-v4.1-flash-free は、アカウントの無料枠を使う。枠が尽きると、opencode.aiからHTTP 429の FreeUsageLimitError が返り、dshでは QUOTA / 「Request quota exhausted.」と表示される。
これは設定ミスではない。無料枠のリセットを待つか、OpenCode Goのモデルに切り替える。
3. MISSING_CREDENTIAL は名前の不一致が多い
cordis.patch.yml の apiKeyEnv と、~/.dsh/.credentials.yaml の refs のキー名が一致していないと、MISSING_CREDENTIAL になる。opencode と opencode-go で別名を使っている場合は、両方の組を確認する。
設定側と保存側で同じ名前を使う。
cordis.patch.yml
apiKeyEnv: OPENCODE_GO_API_KEY
.credentials.yaml
refs:
OPENCODE_GO_API_KEY: sk-...
4. file:// のパスは絶対パスで書く
プラグインの name は file:// URLで指定する。macOSなら file:///Users/...、Windowsなら file:///C:/Users/... のように、スラッシュの数とドライブレターに注意する。
name: 'file:///Users/yourname/.dsh/plugins/opencode-headers/index.js'
5. UIでモデルを変えると agent-default-model が書き換わることがある
dshのUIでモデルを切り替えると、その選択が cordis.patch.yml の agent-default-model に反映されることがある。つまり、UIで選んだモデルが新しいデフォルトになる。
「設定ファイルに書いたのに、次に起動したらモデルが変わっている」と感じたら、UIの選択が保存された可能性を疑う。設定ファイルとUIの両方を確認する。
6. プラグインのUser-Agentは固定値
このプラグインは、手元のOpenCode CLIのバージョン(1.19.4)に関係なく、opencode/latest/1.18.18/cli という固定値を送る。動かなくなったら、OpenCode CLIが実際に送っているUser-Agentに合わせて更新する。
7. これは非公式のワークアラウンド
opencode.aiのクライアント判定を回避するためのヘッダー注入なので、OpenCode側の仕様変更で動かなくなる可能性がある。利用規約を確認し、自己責任で使う。APIキーを共有したり、他人のアカウントで使ったりしない。
運用のコツ
計画はOpus 5.5、実行はDeepSeek V4.1 Flash
一番大事なのはこれ。DeepSeek V4.1 Flashは安いが、設計判断まで任せると失敗することがある。計画、タスク分解、受け入れ条件の定義、最終レビューはOpus 5.5に残す。
タスクは小さく、完了条件はコマンドで検証できる形にする
ワーカーに渡すタスクは、変更範囲が小さく、テストで合格判定できる形にする。「いい感じに直して」ではなく、どのファイルを、どういう条件を満たすように変えるかを明確にする。
並列化できるものは並列化する
独立した調査、テスト追加、ドキュメント更新は並列に投げやすい。依存関係があるタスクは順番に実行する。
レビューを省略しない
安いモデルの出力は、必ずレビューする。差分、テスト結果、設計との整合性を確認する。最終判断はOpus 5.5に戻す。
キャッシュと使用量を眺める
dshのUIにはトークン数やキャッシュヒット率が表示される。同じプレフィックスを繰り返すワークロードではキャッシュが効きやすい。使用量を見ながら、プロンプトの構成やタスクの切り方を調整する。
秘密情報をワーカーに渡さない
サブエージェントにAPIキーを渡す必要はない。dsh側で認証を完結させ、ワーカーにはコードとタスクだけを渡す。
まとめ
高いモデルは計画とレビューに、安いモデルは大量実行に分ける
OpenCode Goは月$10。Opus 5.5の月$20と合わせて、合計月$30で回せる
dshはキャッシュとデコード速度の面で好印象だった(数値は環境依存)
ただし、性能値は環境依存。ベンチマークではなく参考値
導入の山場は、opencode と opencode-go の違い、APIキーの参照名、プラグインのパス
人間がやるのはアカウント・支払い・APIキー。ファイル作成と設定はAIに任せられる
「全部をOpus 5.5でやる」構成から、「Opus 5.5で計画し、DeepSeek V4.1 Flashで大量に実行する」構成に変えると、私の手元では同じ予算でできる仕事の量が増えた。まだ試していない人は、無料枠が残っていればまず無料モデルでdshに慣れてから、OpenCode Goに切り替えるとよい。
私はOpus 5.5を崇拝していないが、信頼はしている。信頼しているモデルには、ちゃんと考える仕事をさせたい。実装と調査は、安くて元気なDeepSeek V4.1 Flashに任せる。そのほうが、私は気分よくコードを書ける。
参考
FrontierCS 2(ベンチマーク、2026-11-04時点)
frontier-cs.org
元記事:DeepSeek Harness で opencodeの deepseek-v4-flash-free を利用する方法
kagasu.hatenablog.com
OpenCode Go
opencode.ai
DeepSeek Harness(dsh)
deepseek-ai/deepseek-harness
Paseo と DeepSeek Harness (DSH) で構築する自律管理型マルチエージェント開発スタジオ
Paseo と DeepSeek Harness (DSH) で構築する:100% 自律管理型マルチエージェント開発スタジオの深層
AgDex システム&アーキテクチャチーム
2026年11月2日
読了目安 15分
マルチエージェント設計&データ主権
技術エグゼクティブ・サマリー
単一のターミナル内でコーディングエージェントを孤立して動かす時代は終わりました。本稿では、Paseo のローカルデーモンおよび管理型 Git Worktree と、DeepSeek Harness (DSH) の Cordis プラグイン実行基盤を統合し、完全セルフホストのオープンソース・マルチエージェント開発工坊を構築する方法を徹底解剖します。Direct Provider 通信による思考プロセスのリアルタイム可視化、対話型質問カード、そして計算コスト 83.2%〜92.8% 削減(商用フラッグシップ比では 95% 以上の削減)の実証データを公開します。
1. ターミナルの限界:なぜ単一エージェントの CLI 運用はスケールで破綻するのか
2025年から2026年にかけて、最先端基盤モデルに支えられた自律型コーディングエージェント群——Claude Code(Claude Opus 5.5 / Sonnet 5.5 搭載)から OpenAI Operator / Codex(GPT 6.1 SOL 搭載)、Google Antigravity(Gemini 4 Argon 搭載)、Cursor、Aider に至るまで——は開発者の生産性を飛躍的に高めました。しかし、単機能の生成にとどまらず複数タスクにわたる大規模スプリントを並行処理させようとした途端、深刻なボトルネックに直面します。それは「単一ターミナルかつ単一作業ディレクトリの制約」です。
エンジニアが1つの Git リポジトリ内で複数のエージェントプロセスを立ち上げると、ファイルシステムは大混乱に陥ります。バックグラウンドのビルドウォッチャーがクラッシュし、未コミットのコードが別エージェントに上書きされ、並行実行された Git コマンドが致命的な .git/index.lock 競合を頻発させます。手動で大量の tmux ペインを立ち上げて回避しようとしても、コンテキスト切り替えの認知的負荷は限界に達します。
さらに、商用のプロプライエタリなクラウド環境は、高額なシート課金や不透明なトークン手数料、強制的なテレメトリ送信で開発組織を囲い込みます。Claude opus 5.5、GPT 6.1 SOL、Gemini 4 Argon といった最先端商用モデルは単一タスクで卓越した推論力を発揮するものの、多重エージェントによる連続的なスプリントループを商用クラウド API だけで回し続けることは、組織の API 予算を急速に逼迫させます。現場が真に求めているのは、物理的な作業領域の隔離、複数デバイスからの遠隔操作、そして外部クラウドに依存しない安全な自律型マルチエージェント管理ハブです。
2. Paseo アーキテクチャ:ローカルファースト・デーモンと管理型 Git Worktree
Paseo(github.com/getpaseo/paseo)は、分散型ローカルコントロールプレーンによってこの並行制御の課題を根本から解決します。核となる軽量 TypeScript デーモンが各エージェントのライフサイクルを監視し、プロセスI/Oを統括し、デスクトップ(Electron)、Web、モバイル(Expo iOS/Android)へエンドツーエンド暗号化(E2EE)WebSocket を介してリアルタイム中継します。
+─────────────────────────────────────────────────────────────────────────────────────────────────+
| PASEO + DEEPSEEK HARNESS (DSH) MULTI-AGENT ARCHITECTURE |
+─────────────────────────────────────────────────────────────────────────────────────────────────+
| |
| [ CLIENT ACCESS MATRIX ] |
| • Desktop (Electron) • Web Dashboard • Mobile App (Expo / iOS / Android) |
| │ (E2EE WebSocket Relay) |
| ▼ |
| [ PASEO LOCAL CONTROL DAEMON ] (Node / TypeScript) |
| • Workspace Manager • Process Supervisor • Diff / Stream Review Engine |
| │ |
| ┌───────────────────────┼────────────────────────┐ |
| ▼ ▼ ▼ |
| [ WORKSPACE: feat/auth ] [ WORKSPACE: feat/db ] [ WORKSPACE: test/e2e ] |
| • Worktree: slug-auth • Worktree: slug-db • Worktree: slug-tests |
| • Branch: feature/auth • Branch: feature/db • Branch: test/e2e |
| • Hook: paseo.json • Hook: paseo.json • Hook: paseo.json |
| │ │ │ |
| ▼ (Direct Provider IPC) ▼ (Direct Provider IPC) ▼ (Direct Provider IPC) |
| [ DEEPSEEK HARNESS (DSH) ] [ DEEPSEEK HARNESS (DSH) ] [ DEEPSEEK HARNESS (DSH) ] |
| • Preset: PTC (Reasoning) • Preset: Standard (CRUD) • Preset: Minimal (Test Suite) |
| • Cordis Plugin Kernel • Cordis Plugin Kernel • Cordis Plugin Kernel |
| • Reversible Registers • Reversible Registers • Reversible Registers |
| |
+─────────────────────────────────────────────────────────────────────────────────────────────────+
Paseo は重量級の仮想マシンを起動する代わりに、管理型 Git Worktree(決定論的に $PASEO_HOME/worktrees/<hash>/<slug>/ 配下に配置)を作業空間の隔離基盤として採用しています。
- 自動ブランチプロビジョニング: origin/main からの自動分岐や個別プルリクエストのチェックアウトを、共通の .git オブジェクトデータベースを共有しながら即座に実行します。
- 自動化されたライフサイクルフック: paseo.json を定義することで、各 Worktree 作成時の依存関係インストールや .env 生成、アーカイブ時の自動クリーンアップを自動化します。
- 仮想マシンのメモリオーバーヘッド皆無: 1インスタンスあたり 1.5GB〜3GB を消費する Docker コンテナとは異なり、Git Worktree のディスク差分はわずか 50MB 未満、起動時間は 180 ミリ秒以下です。
このアーキテクチャにより、Git インデックスのロックやコードの衝突、メモリ不足に悩まされることなく、同一リポジトリ上で 3台、5台、10台のエージェントを同時に安定稼働させることが可能になります。
3. DeepSeek Harness (DSH):Cordis プラグインカーネルの全貌
Paseo がオーケストレーターと作業領域の隔離を担う一方、自律的な推論とツール実行エンジンを提供するのが DeepSeek Harness (DSH)(@deepseek-ai/dsh)です。DeepSeek はエージェント設計において「Agent = Model + Harness」という明快な哲学を掲げています。
従来のフレームワークはツール定義やステートループを単一の巨大なクラスに固定しがちでした。これに対し、DeepSeek Harness は時空間の構成可能性を追求した先進的メタフレームワーク Cordis を採用しており、あらゆる構成要素がプラグインとして設計されています:
- モデルアダプタ: DeepSeek V4 Pro、Flash、あるいは vLLM や Ollama でローカル配信されるオープンモデルを柔軟に切り替え可能。
- エージェントループ: 計画立案、内省、反復的なツールディスパッチを司る交換可能な制御ループ。
- ツール&スキル: AST構文解析、ファイル変更、Bash実行、MCP連携を含む動的な拡張機能群。
- セッション&ストレージ: ターン間の状態破壊を防止し、厳格な監査証跡を保証する追記専用イベントログ。
Cordis カーネル最大の工学的強みは「可逆的登録(Reversible Registrations)」です。プラグインやツールがアンマウントされると、関連するイベントリスナー、プロンプト定義、ミドルウェアが自動的に完全ロールバックされ、メモリリークやゴーストツールの残留を根本から遮断します。
DSH はこれらの機能を4つの特化型プリセットにパッケージングしています:Standard(汎用コーディング)、PTC (Program-Time Compute)(深い推論と大規模リファクタリング)、Minimal(トークン消費を抑えた自動テスト)、Creator(高速プロトタイピング)。
4. Direct Provider 対 ACP:高速通信ブリッジの優位性
外部エージェントランタイムをオーケストレーターに接続する際、標準の Agent Client Protocol (ACP) が使われるケースが一般的です。しかし実測検証の結果、ACP は帯域幅の狭い隘路となってしまい、ストリーミング思考の表現力喪失や対話型UIカードの欠落といった制限をもたらすことが判明しました。
この制約を打開するため、オープンソースコミュニティの Jecvay 氏によって開発されたのが paseo-dsh-direct です。DSH を Paseo の内部 IPC 通信路に直接ネイティブ Provider として結合します:
1. リアルタイム推論深度(Reasoning Effort)スライダー: DeepSeek V4 の内部思考プロセスを平坦なテキストに潰すことなく、ストリーミング形式で忠実に描画。
2. 対話型 ask_user_question カード: 曖昧な要件が発生した際、Paseo の UI 上に選択式カードや確認モーダルを直接提示し、1クリックで意思決定を完了。
3. Build vs. Plan 実行前ゲートウェイ: 破壊的なシェルコマンドの実行前に、エージェントへ明確な手順計画の提示を義務付け、人間が事前承認。
4. インフライト・ステアリング(In-flight Steer): エージェントの思考途中であっても、セッションを破棄することなく介入して指示を軌道修正可能。
さらに paseo-dsh-direct はセッションの完全永続化に対応しており、~/.dsh/sessions から過去の実行ログを取り込んで Paseo の Diff ビューア上でデバッグの経緯を即座に再生できます。
5. 実証ベンチマーク:フットプリント測定と開発コスト 90% 削減の実態
Paseo と DSH の実用性を検証するため、実戦的な開発スプリントを想定したストレステストを実施しました:FastAPI マイクロサービスのリファクタリング、Pydantic スキーマの更新、および 4台の並行エージェントによる E2E 統合テストの自動作成です。
+─────────────────────────────────────────────────────────────────────────────────────────────────+
| Table 1: Multi-Agent Concurrency & Isolation Benchmark (4 Concurrent Agents) |
+──────────────────────────┬──────────────┬──────────────────┬──────────────┬─────────────────────+
| Concurrency Strategy | Cold Latency | Resident RAM (4x)| Disk Delta | Merge & Git Safety |
+──────────────────────────┼──────────────┼──────────────────┼──────────────┼─────────────────────+
| Single Directory (Raw) | Instant (0s) | ~220 MB | 0 MB | ❌ 100% Lock Fail |
| Docker / MicroVM (e2b) | 4.2s ~ 7.8s | 7.4 GB ~ 12.0 GB | 4.8 GB | ⚠️ Complex Remote |
| Paseo Managed Worktree | < 180 ms | < 340 MB (Shared)| ~120 MB | ✅ Native Clean PR |
+──────────────────────────┴──────────────┴──────────────────┴──────────────┴─────────────────────+
表1 の測定値が示す通り、Paseo の Git Worktree はコンテナ型 MicroVM と比較して起動速度が23倍高速であり、RAM消費量を95%削減しながら、Git インデックスロックを完全に解消しています。
+─────────────────────────────────────────────────────────────────────────────────────────────────+
| Table 2: 3-Agent Parallel Sprint Financial ROI (4.5M Total Tokens) |
+──────────────────────────┬───────────────┬────────────────┬───────────────┬─────────────────────+
| Model / Harness Setup | Input Tokens | Output Tokens | Total Cost | Effective Savings |
+──────────────────────────┼───────────────┼────────────────┼───────────────┼─────────────────────+
| Claude Opus 5.5 (CLI) | $14.00 (3.5M) | $20.00 (1.0M) | $34.00 | Baseline (0%) |
| DeepSeek V4 Pro via DSH | $0.75 (3.5M) | $4.95 (1.0M) | $5.70 | 83.2% Reduction |
| DeepSeek V4 Flash Hybrid | $0.35 (3.5M) | $2.10 (1.0M) | $2.45 | 92.8% Reduction |
+──────────────────────────┴───────────────┴────────────────┴───────────────┴─────────────────────+
コスト面(表2)においては、Claude Opus 5.5 で 450万トークンのマルチターンコーディングを回すと 34.00 ドルを要します(Claude Sonnet 5.5 では 17.00 ドル、GPT 6.1 SOL などの最先端推論フラッグシップでは 120 ドル以上に急騰します)。一方、プロンプトキャッシュを併用した DeepSeek V4 Pro(DSH経由)では、スプリント全体の総費用はわずか 5.70 ドル(Opus 5.5 比 83.2% のコスト削減) に圧縮されます。さらに、テストコード生成や定型処理に DeepSeek Flash をハイブリッド投入した場合、費用は 2.45 ドル にまで低下し、最大 92.8%(商用フラッグシップ比では 97% 以上)のコスト圧縮を達成します。
6. 実践プロダクションガイド:3エージェント並行スプリントの立ち上げ
自律管理型マルチエージェントスタジオの導入は極めてシンプルです。まず、リポジトリのルートに paseo.json を作成し、隔離環境のフックを設定します:
{
"worktrees": {
"root": "~/.paseo/worktrees"
},
"hooks": {
"setup": "pnpm install && cp .env.example .env",
"teardown": "pnpm test:clean"
},
"services": {
"dev": {
"command": "pnpm dev",
"port": 3000,
"proxy": true
}
}
}
設定完了後、Paseo CLI から3つの Worktree を瞬時に立ち上げます:paseo workspace create --isolation worktree --mode branch-off --new-branch feat/auth --worktree-slug auth-service --base origin/main。データベース移行とテスト作成用にも同様に実行します。
Paseo デスクトップ UI から、認証エージェントには深い推論を行う PTC プリセットを、DB移行とテスト作成には Standard プリセットを割り当てます。各エージェントが隔離された作業ディレクトリで同時にコードを生成する間、開発者はデスクトップ上で差分を統括レビューするか、外出先から Expo モバイルアプリ経由で PR を承認できます。
7. 自律管理型スタジオの未来と AgDex 連携
Paseo、DeepSeek Harness、そして paseo-dsh-direct の融合は、AI支援開発の主導権が閉鎖的な商用クラウドエディタから開発者自身の手元へ戻りつつあることを証明しています。オープンで自律管理型の編排は、比類なき処理速度、データ主権、そして圧倒的な経済合理性をもたらします:
- 完全なデータ主権: ソースコード、Git の履歴、APIシークレットがローカルPCや社内VPCの外部へ漏洩するリスクを完全に遮断。
- 柔軟なモデル選択: エディタ環境を変えることなく、最先端のクラウドAPI(Claude opus 5.5, GPT 6.1 SOL, Gemini 4 Argon)とオフラインのローカルLLMをシームレスに併用。
- SaaS課金の排除: 毎月の高額な座席サブスクリプションに縛られることなく、エージェントの並行数を自由に拡張。
AgDex.ai ディレクトリ では、インタラクティブな 3-Step Stack Finder と連動して本ソフトウェアスタックを網羅しており、Claude Code や DeepSeek などのエンジニアリングツールの検証済みスターターテンプレート、実測テレメトリ、比較ベンチマークを提供して、自律型マルチエージェント群を配備する開発チームを支援しています。
参考情報および検証済みオープンソースリポジトリ
本稿で解説したすべてのツールおよびプラグインはオープンソースとして公開されており、誰でも検証可能です:
• Paseo オーケストレーション基盤: getpaseo/paseo(公式サイト: paseo.sh)
• DeepSeek Harness (DSH): deepseek-ai/deepseek-harness(npm: @deepseek-ai/dsh)
• Direct Provider プラグイン (Jecvay 氏): Jecvay/paseo-dsh-direct
• Cordis プラグインカーネル: cordis.moe
よくある質問(FAQ)
Q1: Paseo の Git Worktree は Docker コンテナと比較して何が優れていますか?
Git Worktree は仮想化を行わず、基底の .git データベースを共有する軽量な物理ディレクトリを作成します。起動時間は180ミリ秒未満、追加のRAM消費はゼロであり、Docker のように数ギガバイトのイメージ容量や複雑なボリュームマウントを必要としません。
Q2: 標準の ACP プロトコルではなく paseo-dsh-direct を使う理由は?
汎用の ACP プロトコルはモデル固有の高度な制御機能を切り捨ててしまいます。paseo-dsh-direct を利用することで、DeepSeek V4 のリアルタイム推論深度スライダー、選択肢付き質問カード、および実行前計画承認ゲートウェイにネイティブ IPC 経由でアクセスできます。
Q3: 外部クラウド API を使わず、完全オフラインで動作させることは可能ですか?
はい、可能です。Paseo と DeepSeek Harness はどちらも 100% セルフホスト対応です。vLLM や Ollama でローカル配信される量子化版 DeepSeek や Qwen Coder モデルを DSH に接続することで、完全にエアギャップされた無償の開発環境を構築できます。
Q4: 開発デスクから離れている間、どのようにモバイルからレビューや指示を行いますか?
Paseo はローカルデーモンと Expo モバイルアプリ(iOS/Android)を結ぶエンドツーエンド暗号化 WebSocket 中継を備えています。開発者は外出先のモバイル回線から安全にリアルタイムのコード差分を確認し、質問に回答してタスクを承認できます。
---
元記事:AgDex.ai - Orchestrating DeepSeek Harness (DSH) with Paseo: Inside the 100% Sovereign Multi-Agent Software Studio
最新の AI エージェントアーキテクチャ・ベンチマークデータは agdex.ai でご確認いただけます。
DeepSeek Harnessのagent loopは本当に差し替え可能か、patchで壊してみた
「agent loop自体がプラグイン」という主張を検証する
DeepSeek Harness(以下DSH)はDeepSeekが公開したdeveloper previewのAIエージェント基盤で、「everything is a plugin」を掲げている。プラグインアーキテクチャを謳うハーネス自体は珍しくないが、DSHのドキュメントは一歩踏み込んで「agent loop自身もプラグインの1つで、差し替え可能」だと明言している。
これが本当なら、DSHは「決まったループの上で動くツールを足す」だけのハーネスではなく、ループ本体まで含めて組み替えられる自作PC的な基盤ということになる。読めば「差し替えられる」とは書いてあるが、実際に差し替えて壊してみた記録は見当たらなかったので、自分で手を動かして確かめた。
土台にあるのはCordis(Koishiのメタフレームワーク、作者shigmaはDeepSeek在籍)というプラグインシステムで、プラグイン単位で登録・解除が可逆に行える設計思想を持つ。「行id単位でconfigを丸ごと差し替えられるpatch機構」と「特権的なコアは無い」というのがDSHの売りだ。
検証環境: Node.js v26.4.0、@deepseek-ai/dsh@0.1.0-rc.6(npm、developer preview版)。ローカルLLM不要でNode.jsだけで完結する。
まず --dump-config でagent-loopの行を見つける
npx @deepseek-ai/dsh --profile web --dump-config
490行のYAML構成ダンプが出力される。目的の行はこれだった。
== @deepseek-ai/dsh-base
- id: agent-loop
name: '@deepseek-ai/dsh-agent-loop'
config:
agents: []
- id: fs-sandbox
name: '@deepseek-ai/dsh-fs-sandbox'
- id: llm-deepseek
name: '@deepseek-ai/dsh-llm-deepseek'
headless profile(1タスクを投げて結果を印字して終了するCLIモード)でも同じ行idが出てくる。profile間で共通のidを持つ行を、ユーザー側の cordis.patch.yml で狙い撃ちする、というのがDSHのpatch機構の建付けだ。
壁その1: name を直接書き換えるとロード段階で拒否される
素直に「同じidのままnameだけ自作プラグインに変える」patchを書いてみる。
- id: agent-loop
name: ./stub-agent-loop.mjs
config: {}
起動すると、こう言われて無視された。
dsh: [.../cordis.patch.yml] patch: name mismatch for "agent-loop" (expected "@deepseek-ai/dsh-agent-loop", got "./stub-agent-loop.mjs"), skipping
内部で使われている @deepseek-ai/cordis-plugin-include のソースを読むと、これは意図的なガードだった。
if (name && name !== target.name) {
warn('patch: name mismatch for %C (expected %C, got %C), skipping', id, target.name, name)
continue
}
コメントには「後続のパッチレイヤーが前のレイヤーが挿入した行を設定・無効化できるように」という設計意図が書かれている。つまり config の丸ごと上書きは許可されるが、プラグイン実装そのもの(name)の無断すり替えは拒否される。「行idを狙ってconfig丸ごと置換できる」というドキュメントの説明は、configフィールドの話であって、プラグイン本体の差し替えには別の手順が必要ということだ。
正攻法は、既存行を disabled: true で無効化してから、insert で新しい行を追加すること。
- id: agent-loop
disabled: true
- insert:
- id: stub-agent-loop
name: ./stub-agent-loop.mjs
disabled: true はconfigの一部として扱われるのでnameチェックの対象外になり、これは通る。
壁その2: 何もしないstubでもWebサーバーは起動する
まずは中身が空っぽの、ログを出すだけのプラグインを差し込んでみた。
export const name = 'stub-agent-loop'
export function apply(ctx) {
console.error('[stub-agent-loop] apply() called, ctx keys:', Object.keys(ctx).slice(0, 30))
}
dsh --profile web で起動すると、あっさり成功した。
[stub-agent-loop] apply() called, ctx keys: [ 'fiber' ]
dsh web: 127.0.0.1
curl でルートページを叩くと200が返り、HTML・JSバンドルも普通に配信される。agent-loopの実サービス(ctx.agentLoop)が何も無い状態でも、Webサーバーの起動シーケンス自体は通る。 DSHの「特権的なコアは無い」という主張は、少なくとも起動時の依存関係については本当だった。
(Web UIの会話用APIは独自のtyped RPCプロトコルで、素のcurlでは叩けなかった。ブラウザでの実描画確認は今回の検証環境ではできておらず、そこは未検証として留保する)
壁その3: 実タスクを投げると「no agent factory registered」で即死
headless profileで実際に1タスクを投げてみる。
dsh --profile headless "say hello in one word"
同じ空っぽstubのままだと、今度は構造的なエラーで即座に落ちた。
dsh: no agent factory registered (load an agent-loop plugin)
Web起動時とは対照的に、タスクを実行しようとした瞬間に初めて「agent-loopが提供すべきもの」が要求される。 dsh-agent パッケージが持つ AgentRegistry(ctx.agents)は AgentFactory の登録を必須としており、標準の agent-loop プラグインは自身の初期化時に ctx.agents.setFactory(this) を呼んでこれを満たしている。無効化するとこの登録が消え、タスク実行時にエラーになる。
ここが実質的な「最初の壁」だった。
壁その4: setFactory だけ足すと一歩前進する
ctx.agents をinjectして setFactory() を呼ぶだけの、createAgent は即エラーを投げるstubに変えてみた。
export const inject = ['agents']
export function apply(ctx) {
ctx.agents.setFactory({
async createAgent(ownerCtx, options) {
throw new Error('stub-agent-loop: createAgent not implemented')
},
async resume(ownerCtx, options) {
throw new Error('stub-agent-loop: resume not implemented')
},
})
}
[stub-agent-loop] createAgent() called with sessionId= session-ea96eab5-11c5-4412-b8b3-4679b670e677
dsh: stub-agent-loop: createAgent not implemented
createAgent() が実際に呼ばれ、セッションIDも渡ってくるところまで到達した。次はここに何を実装すれば動くのかという話になる。
最小Agent実装で「1往復の会話」を成立させる
dsh-agent パッケージのREADMEと型定義を読み、Agent interfaceが要求する最小限のプロパティ・メソッド(id, options, session, status, ctx, inbox, cancel, whenIdle, runMaintenance, send/followup/steer/inject)を実装した。中身は約70行。
肝は send() の中身で、標準実装(dsh-agent-loop)のソースコードから確認したイベント発行の順序をそのままなぞる。
turn/start → step/start → user/message → assistant/message → step/end → turn/end
assistant/message には実際のLLM応答の代わりに固定文字列(缶詰の応答)を、dsh-llm パッケージが公開している createAssistantMessage() ヘルパーで組み立てて入れた。LLM呼び出しは一切していない。
dsh --profile headless "say hello in one word"
結果、次の出力とともに正常終了(exit code 0)した。
[stub-agent-loop] apply() called
[stub-agent-loop] createAgent() sessionId= session-00c73f18-e1a4-4006-ad45-c0ec304bd346
[stub-agent-loop] agent entered + announced
[stub-agent-loop] send() message role= user target= next-turn
[stub-agent-loop] turn closed cleanly, no session invariant error raised
stub-agent-loop: no LLM call made, this is a canned reply
最終行がheadlessランナーの標準出力そのもので、dsh --profile headless "<task>" という「1タスクを投げて結果を返す」契約を、LLM呼び出しゼロ・ツール呼び出しゼロの缶詰応答で満たせたことになる。同じstubを web profileにも適用して起動確認したところ、こちらも200応答で立ち上がった(UIでの会話が実際に描画されるかまでは、ブラウザ操作が必要でこの検証環境では確認できていない)。
一番の発見: invariantチェックは標準構成では効いていない
検証を始める前の仮説は「turn/step/tool/* はdurable session eventなので、これを出さない最小ループだとsession logのinvariant(model-visible means logged)チェックに引っかかって落ちるはず」というものだった。
実際には、turn/start〜turn/end の標準順序さえなぞれば session.append() はあっさり通った。--dump-config の出力を見直すと、web/headless どちらのprofileにも invariant companion(dsh-session/invariant や dsh-agent/invariant、READMEに「monotonic sequence numbers, turn/step enclosure, and same-step tool call/result pairing」をチェックすると書かれているオプトインプラグイン)が一切ロードされていなかった。
つまり、ドキュメント上「安全網」として説明されているinvariantチェックは、標準のweb/headless profileには含まれておらず、壊れた自作agent-loopが不正なイベント順序でsessionを汚しても、デフォルト構成では誰も気づかない。 実際に落ちる壁は、invariantではなく、もっと手前の「ctx.agents へのAgentFactory登録」だった。
まとめ
検証項目
結果
--dump-config にagent-loop行があるか
あった(id: agent-loop)
patchで name を直接書き換えられるか
できない(name不一致で拒否される安全策あり)
disabled + insert で構造的に差し替えられるか
できる
空のstubでWebサーバーは起動するか
起動する(agent-loopは起動時の必須依存ではない)
空のstubでheadlessタスクを実行できるか
できない(no agent factory registeredで即死)
setFactory() だけで一歩進むか
進む(createAgent()が呼ばれる)
最小Agent実装(約70行、LLM呼び出しなし)でheadlessタスクは完走するか
完走する
durable session eventのinvariantチェックで落ちるか
落ちない(そもそもデフォルトでロードされていない)
「agent loop自体がプラグインで差し替え可能」というDSHの主張は、少なくとも構造上は本当だった。ただし実際にやってみると、name の無断すり替えを拒否する安全策があったり、Webサーバー起動とタスク実行とで依存チェックのタイミングがずれていたり、想定していたinvariantの安全網がデフォルトでは無効だったりと、ドキュメントを読むだけでは見えない挙動がいくつも出てきた。「差し替えられる」という一文の裏には、Agent interfaceの契約(inbox、turn/step境界、durable event順序)を自分で満たす責任が乗っている。
今回はDeepSeek APIキーが手元になく、実LLM呼び出しを伴う会話の検証はできていない。缶詰応答での「1往復」止まりという点は留保しておく。
From prose to assertions: making 'done' checkable when an AI agent writes the code
The hardest part of an AI coding loop is not getting code written. It is the moment after the agent says "done".
When one agent writes the code and another agent reviews it, you have not removed the trust problem — you have just moved it. The reviewer reads the diff, reads the tests, reads the ticket, and produces a verdict. If the ticket says "spacing should be 12vp" and the screenshot looks about right, the verdict is "pass". Two auditors can look at the same delivery and disagree, and nothing in the tooling forces that disagreement to resolve.
That is the gap I tried to close in DwGuard-Dsh-Hmos, a plugin for DeepSeek Harness that orchestrates HarmonyOS app delivery: DSH freezes a four-dimension acceptance pack (function / aesthetic / performance / accessibility), runs an adversarial pre-review before dispatch, hands the work to DevEco Code in Goal mode, then audits the delivery with independently gathered evidence.
The change I want to write about is small in surface area and large in consequence: acceptance criteria can carry a machine-checkable assertion, and the audit gate recomputes the verdict instead of trusting prose.
Three failures of prose criteria
My criteria used to be a sentence plus a verification method:
statement: 冷启动到首帧 ≤ 800ms (cold start to first frame ≤ 800ms)
verify: Profiler 启动分析毫秒数 (milliseconds from the profiler)
And an audit check was a result plus free-text evidence:
result: pass
evidence: 3 runs, 700/720/760ms, screenshot artifacts/perf.png
Three problems showed up immediately:
1. Criteria are not executable. "12vp" in a sentence means nothing to a machine. Two auditors reading the same criterion can reach opposite conclusions and both feel right.
2. Evidence is not reviewable. evidence is free text. No tool can tell whether "1200ms" satisfies "≤ 800ms" without a human eyeballing it.
3. The report is not consumable. The verdict lives inside markdown. CI, regression scripts, and the next agent cannot read a field; they re-parse prose.
So the audit was still a person voting, with extra steps.
The assertion: criteria that can fail by themselves
The fix is an optional assertion on each criterion:
{
"id": "P-01",
"dimension": "performance",
"statement": "Cold start to first frame ≤ 800ms",
"verify": "ms reported by the startup profiler",
"weight": "must",
"ruleId": "DW-PERF-01",
"assertion": {
"matcher": "lte",
"expected": 800,
"unit": "ms",
"source": "startup profiler"
}
}
Eight matchers cover the criteria I actually write:
| matcher | meaning |
|---|---|
| equals | numeric comparison when both sides are numbers, exact string otherwise |
| contains | substring, case-insensitive |
| regex | pattern (unanchored — add ^$ yourself) |
| range | within [min, max], inclusive |
| gte / lte | numeric greater/less or equal |
| oneOf | equals one of a list |
| present | non-empty |
The audit side then must report an actual value next to the verdict:
{
"criterionId": "P-01",
"result": "pass",
"evidence": "three cold starts: 700/720/760ms; screenshot artifacts/perf.png",
"actual": "720ms"
}
One detail matters more than it looks: numeric matchers take the first number inside actual. That means measured values can keep their units — "12vp" parses as 12, "720ms" as 720, "4.9:1" as 4.9. The assertion compares numbers; the report stays human-readable.
The rules that make it a gate instead of a suggestion
An optional field that nobody enforces is decoration. So the gate has opinions:
| situation | result |
|---|---|
| criterion has an assertion, check says pass, but no actual | error — you cannot pass an assertion you never ran |
| criterion has an assertion, check says pass, assertion recomputes to fail | error — audit refused; this is the self-contradiction case |
| criterion has an assertion, check says fail, assertion recomputes to pass | warning — something else may have failed it; ask for review |
| criterion has an assertion, check says unverified without actual | warning (the existing must-gate already errors) |
| criterion has no assertion | unchanged behaviour: human verdict + evidence |
| the assertion itself is invalid (unknown matcher, range with no bounds, bad regex) | the spec refuses to freeze with E_CRITERION_ASSERTION_INVALID |
Plus a nudge at authoring time: a must criterion whose statement contains numbers but carries no assertion gets W_CRITERION_NO_ASSERTION, because that is exactly where two auditors will disagree later.
The subtle rule is the third one. Saying "fail" when the number passes is not always wrong — a screenshot can show a layout bug that a timing assertion cannot see. But the gate should make that mismatch visible instead of silently accepting whatever the reviewer wrote.
What it changes in the artefacts
Because the verdict is now recomputed, the reports gain a column each:
- spec.md and the Goal brief gain an assertion column, so the executor knows which criteria will be measured rather than judged;
- audit-<n>.md gains assertion / actual / verdict columns;
- the acceptance report's evidence index gains assertion / actual;
- rework orders gain a gate problems section — previously a contradicted assertion produced a refusal with nowhere to record why.
And audit-<n>.json now contains checks[].assertionVerdict, which means CI can fail a build on verdict: fail without parsing markdown. That was the whole point of making the report consumable.
What stays human
I want to be careful here, because "machine-checkable acceptance" is easy to oversell.
- Assertions only cover what is measurable. "The empty state feels calm" cannot be asserted. It stays a judgement call, and I still write those criteria — they just do not claim to be objective.
- The assertion does not collect evidence. Somebody still gathers the actual value: a screenshot with a known device, a dumpsys reading, a layout tree. Evidence files get copied, hashed, and recorded, but the assertion only decides pass/fail from the number.
- Thresholds are taste wearing a number. "≤ 800ms" is a decision I made, not a law of physics. Turning it into an assertion makes the decision visible and debatable, which is an improvement, but the number itself is still a human judgement.
- Values can be gamed. If the process that produces actual is the same process being audited, an agent can satisfy the letter. That is why the audit playbook insists on externally observable sources — hidumper render stats and hitrace for performance, layout bounds for spacing — and treats in-app timing instrumentation as auxiliary evidence, never the sole basis.
The honest result
The change shipped as 0.5.0 and the suite went from 49 to 55 tests, all green (six new ones specifically about assertions: accepting valid, rejecting invalid, recomputing, refusing contradictions, refusing a pass without actual, and keeping old packs unchanged).
The real payoff is not "the AI is now trustworthy". It is that disagreement became resolvable. When two auditors disagree now, there is a file with a number and a rule that says whether it passes. Either the number is wrong, or the threshold is wrong, or the measurement is wrong — and all three are fixable. Before, the disagreement was just two paragraphs.
If you are building an agent loop where one model checks another, the question to ask is not "is the reviewer good". It is: can the reviewer's verdict be recomputed by something that did not write it?
Plugin: <Dogwind221/dwguard-dsh-hmos> · npm: <npmjs.com> · listed in awesome-dsh-plugin.
1 reaction
When Coding Agents Watch GitHub: A Practical Safety Checklist Before They Open PRs
A coding agent that waits for a prompt is easy to understand. You give it a task, watch the run, and review the result. An agent that watches issues and comments changes the arrangement. It may notice a request, decide whether it is allowed to act, create a separate work session, and return a pull request later.
The deepseek-ai GitHub organization hosts a public dsh-superagent research prototype, but its README explicitly says it is not an official DeepSeek product. The README describes it as reference research code, not production-ready software. Its value here is as a design case: the project makes permission and review questions visible.
This is not a setup guide for that prototype. I have not installed or tested it. The checklist below is a safer way to evaluate any system that turns GitHub activity into coding work.
A new input is also a new trust boundary
The prototype's flow is more than "issue in, code out." Its documentation describes sources that receive events, policies that decide who may request work, tickets that hold tasks, and executors that do the coding. Work can return to the conversation where it started. Its setup guide recommends a dedicated agent account and an initial observe mode for work inferred from activity, rather than immediately executing it.
That separation matters. A public issue is not automatically an authorized instruction. A comment can include misleading requests, hostile text, or copied instructions from an untrusted source. If that text reaches a model connected to a shell and a write-capable account, it is part of the system's input whether or not the author intended it as a command.
GitHub's own Actions security guidance makes a related point: workflow credentials should have the least privilege needed, and default token permissions should be read-only where possible. The same principle applies to an agent. Its model may be capable, but its permissions should assume that some inputs will be wrong or malicious.
What the prototype gets right, and what it does not prove
The project draws a useful line between a direct request from an allowed person and work inferred from ambient activity. In its documented setup, inferred work begins in observe mode. The operator can see what the system would have done before enabling that behavior. The guide also advises using a dedicated GitHub identity, keeping it separate from the operator's personal account, and requiring human review rather than enabling automatic merging as the default.
Those are good starting choices, not a security certification. The same deployment documentation warns that its worker sessions run with broad operating-system access under the operator's user. The account wrappers select GitHub credentials, but they do not isolate the process. A worker may still run programs by path and read files in that user's home directory. The docs recommend a dedicated OS account for isolation.
This is the important distinction: separate GitHub identity is not the same as a sandbox. A bot account limits how the agent appears and what it can do in the repository. It does not, by itself, limit what code running on the host can read or execute.
The checklist: start with observation, not autonomy
Before connecting any always-on coding agent to a real repository, answer these questions in order.
1. Which events can create work?
Start with explicit mentions from a small set of trusted accounts. Avoid treating every new issue, every comment, or every conversation as permission to run code. If the tool supports inferred work, keep it in a mode that records candidate tasks without executing them until you have inspected its decisions.
Write the rule down in plain language. For example: "Only a new comment that mentions the agent, from an approved account, can start a task." That is easier to test than a vague instruction such as "help with relevant issues."
2. Who is allowed to ask?
Use an explicit allowlist. Do not assume that repository visibility, team membership, or an issue label is enough to establish intent. Review who can add accounts to the list and how quickly removals take effect.
Try negative tests before real work: an unapproved account mentions the agent; a bot posts a comment; a user edits an old issue to add a mention. The expected result should be no execution and a clear record of why the request was rejected.
3. What can the agent's GitHub identity change?
Create a separate account for the agent, then grant only the repository access required for its task. Keep merge rights with people. Make the agent's branches easy to identify, and ensure its comments and commits are visibly attributed to the agent rather than to a human maintainer.
Review token scopes and repository permissions directly. If the agent only needs to read issues and create branches or pull requests, do not give it organization-wide administration or access to unrelated repositories. Recheck permissions when the tool or workflow changes.
4. What can the process read on the host?
This is easy to miss when setup instructions focus on GitHub accounts. Find out which operating-system user runs the agent, which directories it can read, whether its shell can access environment variables, and where credentials are stored. Check whether its tools can reach internal network services.
Use a dedicated OS account or a properly isolated execution environment when the agent handles untrusted issue text. Keep secrets out of the agent's checkout and home directory where possible. A wrapper that changes which GitHub account a command uses is helpful, but it is not a process sandbox.
5. Can text in the task change what the agent is allowed to do?
Prompt instructions are not a permission boundary. Define limits outside the model too: allowed repositories, allowed commands, network access, branch rules, and whether secrets are available. Treat instructions quoted inside issues, pull requests, logs, and linked pages as untrusted data unless a trusted person explicitly confirms the task.
6. What has to pass before a pull request is ready?
Require the same checks you expect from a human contribution: tests, formatting, dependency review, and a human reading the diff. The agent should explain what it changed, which tests it ran, and what it could not verify. A green check means the configured checks passed; it does not mean the request was safe or correct.
Keep automatic merge disabled while you learn how the agent behaves. A pull request is a review boundary, not a guarantee. If the agent can merge its own changes, review whether that permission is genuinely necessary and what happens when tests are incomplete or the change touches sensitive code.
7. How will you stop and investigate it?
Know how to pause event intake, stop active workers, revoke credentials, and inspect logs before enabling the service. Decide who receives alerts for stuck tasks, repeated retries, or unexpected repository writes. Test the stop path before the agent has access to valuable credentials.
A low-risk rollout in three stages
A small rollout makes failures easier to understand.
- Stage one: observe. Connect a test repository or a narrow set of events. Let the system record what it would do. Compare its decisions with what maintainers actually want.
- Stage two: prepare changes. Permit a dedicated account to create branches and draft pull requests in a low-risk repository. Keep a person responsible for every review and merge.
- Stage three: expand one permission at a time. Add more requesters or repositories only after you have checked false triggers, quality, noisy behavior, and recovery. Do not change event access, host access, and merge rights together. If something goes wrong, you need to know which new permission caused it.
Keep a short record of expected behavior for test cases: who requested work, what event started it, what the agent was allowed to do, which checks ran, and who approved the result. This creates evidence for a decision to widen access, rather than relying on a few impressive demonstrations.
The useful idea is the workflow, not the word "autonomous"
DeepSeek's prototype points to a real design problem: a team may want one agent to carry work across messages, code changes, and review comments without making people restate the task in every session. That can save coordination effort. It also means the agent becomes a long-running participant with access to event streams and execution tools.
The project itself is careful to label its public implementation as a research reference, not production-ready software. Its documentation also exposes tradeoffs that a launch headline can hide, including broad host access and the need for a separate operating-system boundary. Those caveats are reasons to test it as an operations system, evaluating both its code and the safeguards around it.
A useful rule is simple: automate the preparation of a change before automating permission to apply it. Start with narrow inputs, limited credentials, isolated execution, visible drafts, and human approval. Expand only when the logs show that the system follows those limits consistently.
Before enabling an issue-to-PR agent, check:
- Only approved people can create an executable request.
- Inferred work is observed before it is allowed to run.
- The agent uses a dedicated, narrowly scoped GitHub identity.
- Its operating-system access is isolated from personal files and secrets.
- Pull requests require human review and do not merge themselves.
- You can pause the service, revoke access, and inspect its actions.
I write about software engineering and AI systems. Subscribe if you want practical, source-based guides like this one.
Have you let an agent act on GitHub issues or pull requests? What permission limit would you set first?
Sources: DeepSeek dsh-superagent prototype, DeepSeek setup guide, DeepSeek deployment and permissions guide, DeepSeek project philosophy, GitHub Actions secure use reference.
1 reaction · 1 comment
¡Muy interesante esto de DeepSeek! Ha lanzado de código abierto DSH SuperAgent
Un agente de código que escucha eventos de un repo de GitHub y crea Pull Request de forma autónoma
Lo mejor es que explica paso a paso cómo está montado:
deepseek-ai/dsh-superagent-prototype t.co
561 likes · 42 reposts · 19,635 views
我把自己的 Agent 从 Wails 迁到了 MyGo 原生 GUI,全程踩坑和实践分享
最近把自己写的工作 agent [Ally agent]( Bronya0/ally-agent) 的界面重写了一遍,起因是无意中看到有人推荐 MyGo ,加上我对内存和性能一直有点追求,多年来一直在用 wails ,想换个试试,就想拿自己的项目试点,没想到结果意外的不错。
旧版本的技术栈是典型的 Go + Wails + Vue (wails 我用了很多年 最近终于 V3 发正式版了 等了四年,可惜我也老了),界面用 Naive UI ,样式美观,效果也相当不错。但做久了有几个地方比较麻烦( tarui 应该也是一样):
跨平台界面的细节不一致,构建链比较长,还有前端内存出了问题以后,我这个写后端的人不太容易排查。
折腾了一段时间,现在主要页面已经迁到 [MyGo]( egoist/mygo) 了,记录一下过程中比较有感触的地方。
先说一下技术路线:Wails 的界面通过系统 WebView 展示网页; MyGo 既支持这种方式,也支持用 Go 写 Native UI ,由框架自己绘制。WebView 也有自己的优势,MyGo 两种都支持,相当于有个兜底,下面会说。
Ally 现在的聊天、设置等常用页面用 Native UI ,插件页面和部分预览仍然按需使用 WebView 。
一、UI 跨平台一致性
这是我这次迁移最重视的一点。
之前用 Wails 做界面,Windows 上调好的页面,到了 macOS 上经常还要再看一遍。字体、行高、滚动条、输入框这些地方,偶尔就会有一点不一样。
比如我画的表格,不知道为啥线条在 macOS 上看着发虚,Windows 上就正常。单看问题都不大,但调整完一个平台还得顾着另一个平台,挺烦的。
Wails 使用系统 WebView ,Windows 和 macOS 背后的浏览器引擎不一样,前端样式最终要经过各自的渲染实现。
MyGo 的 Native UI 由框架自己负责布局和绘制。迁移后,我在 Windows 上调好的主体界面,拿到 macOS 上看到的效果接近得多,需要针对平台单独修的地方也少了。
当然,自绘也不等于所有像素都完全一致。MyGo 的文字排版仍然使用[各平台的文字系统]( mygo.egoist.dev):Windows 是 DirectWrite ,macOS 是 Core Text ,Linux 是 Pango 。字体回退、DPI 、输入法这些还是要分别检查。但至少不用再同时处理两套 WebView 引擎带来的样式差异了。
以前总觉得 Electron 重,碰到这些问题后倒是能理解为什么有些项目愿意用它:自带 Chromium ,渲染环境相对好统一。OpenCode 桌面端后来也[从 Tauri 换到了 Electron]( github.com/anomalyco/opencode/blob/dev/packages/d…),不过人家具体为什么换,我就不瞎猜了。
二、内存问题现在能用熟悉的 Go 工具查
以前 Wails 版本的 Go 后端一样可以用 pprof,但界面在 WebView 里,Go 堆、JavaScript 堆、DOM 、浏览器渲染进程是几块不同的东西。
前端也有 DevTools ,可以拍 JS heap snapshot 、查 DOM 引用。但我平时主要写 Go ,遇到界面内存持续上涨,分析起来没有 Go 那么顺手。
现在主要界面和业务都在 Go 进程里,我给 Ally 加了一个按需导出诊断的入口:在设置里点“导出内存诊断”,会导出 heap.pprof、allocs.pprof、goroutine.pprof 等文件。
比如在空闲时导出一次,复现内存增长后再导出一次,就可以对比:
go tool pprof -http=127.0.0.1:0 \
-base=before/heap.pprof after/heap.pprof
heap 主要看还活着的对象,allocs 主要看累计分配。分配量大不一定是泄漏,也可能是某段代码反复创建临时对象,GC 能回收,但会持续消耗 CPU 。
当然,pprof 主要看到的是 Go 堆。系统和 GPU 资源,以及 WebView 子进程的内存,还是得用其他工具看。
三、帧处理的坑
MyGo 的界面更新会重新构建控件树,写 UI 时要特别留意渲染函数里做了什么。
我的 Agent 有命令执行卡片,命令输出可能很长。之前即使卡片折叠着、界面上只展示最后几行,代码仍然会先把整段输出拆分、去空行,再取出末尾几行。
看起来只是一个字符串处理函数,但界面更新时会反复执行。
后来改了两处:
1. 只需要末尾几行时,从字符串尾部向前扫描,不再先拆分整个输出。
2. 需要重复使用的派生结果按原始内容缓存;内容没变就复用。折叠时不构造展开用的行数据,并释放对应缓存。
一次本地测试里,用两万行命令输出测试折叠卡片的相关处理,单次分配从约 1.9 MB 降到 1.9 KB ,耗时从约 0.72 ms 降到 0.02 ms。
这是这段处理在该样本下的局部结果,不是整个应用的性能对比。[对应修改在这里]( github.com/Bronya0/ally-agent/commit/a1e085b9397e…)。
类似的问题还有工具参数 JSON:同一条消息的卡片头、卡片体都可能读取参数,如果每次渲染都 Unmarshal 一遍,长对话里分配会越来越明显。现在把解析结果挂在控件局部状态上,原始参数变化时才重新解析。
我的感受是,性能问题要先分清楚是“每次请求执行一次”,还是“界面更新时每帧执行一次”。后者哪怕单次看着不重,乘上帧数和控件数量也很拖累性能。
四、构建链变短
旧项目的构建大致要经过前端依赖、绑定生成、Vite 构建,再编译 Go 。MyGo Native UI 的主要页面直接用 Go 写,主界面去掉了前端打包这一步,我自己的项目构建起来明显快了不少。
MyGo 不依赖 CGO ,交叉编译也省事。目前 Ally 的构建脚本可以在 macOS 上处理 Windows 、macOS 、Linux 的 x64 和 ARM64 六个目标,另外生成 macOS Universal 包。
例如编译一个 Windows x64 二进制,核心就是:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o Ally.exe .
实际发布还要处理资源、压缩包、签名等事情;能交叉编译出来,也不代表已经在目标系统完成运行验证。Linux 的图形环境和使用 WebView 时需要的系统库,也仍然要考虑。
这里补充一下:我刚看了 [Wails 3.1 的发布说明]( wails.io),它也加入了无 CGO 构建能力。目前 macOS 和 Linux 的 purego 后端还是实验性质,CGO 仍是默认选项。
所以“无 CGO”以后不一定是两者之间的主要区别。对我这个项目来说,更明显的差别是主界面不用再经过 Vue 那套构建流程了。
五、MyGo 组件够用,但 Web 生态还是强很多
迁移前我担心原生 GUI 要从头写一堆控件,实际比想象中好一些。
MyGo 已经有常见的表单、列表、树、弹窗,也有代码编辑器、Diff 、Markdown 等组件。Ally 的文件浏览和代码编辑用到了它的编辑器,聊天内容也用到了 Markdown 相关能力。
但如果和成熟的 Web 组件库比,差距还是很明显。Naive UI 这类库积累了很长时间,一个表单、选择器或者弹窗拿来就能用,样式、焦点、键盘操作、动画都比较完整。
好在 MyGo 的定制能力不错,但要做出自己满意的效果,颜色、间距、状态和交互细节还是得花时间。我之前不太想碰这类原生 UI ,一个原因就是觉得手写样式太累。
现在有 AI 帮忙,这件事容易太多了。先用框架已有组件和 Base/Parts API ,让 AI 根据目标效果调整样式,再自己检查实际交互。
我的经验是,尽量复用组件本身的焦点、键盘导航、浮层和滚动行为,别为了改外观把这些重新实现一遍,非常容易踩坑。
六、WebView 的优势还在,可以混合使用
WebView 最大的好处之一就是生态。
视频播放、复杂图表、各种文件预览,Web 上已经有大量现成方案。很多东西如果坚持全部原生重写,维护成本很高。
MyGo 可以在 Native UI 窗口里嵌入 WebView ,所以我的做法是:常驻界面用原生 UI ,需要 Web 生态的地方再创建 WebView 。
Ally 目前的 HTML 和 Mermaid 预览就是这样处理的。预览可见时按需创建,数量做限制,离开后释放。否则一个长对话里出现很多图表时,每个预览都长期挂着 WebView ,前面省下来的资源很容易又花回去。
迁移后日常使用的内存占用和响应都有比较明显的改善。不过我还没有整理同一机器、相同会话和操作条件下的完整对照数据,暂时不拿具体数字比较两个框架。
七、插件化是 Go 里比较麻烦的东西,需要谨慎考虑
这是迁移前有点低估、做起来以后感受很深的一点。
看看 [DeepSeek Harness 的 Web Client 架构]( github.com/deepseek-ai/deepseek-harness/blob/mast…),它有插件加载、服务、事件和 UI Slots ,插件可以在已有界面里贡献功能。
Web 技术和 JavaScript 的动态加载能力,让这类扩展比较容易分发和迭代。当然,WebView 本身不会自动提供插件体系,生命周期、扩展点和权限边界都得应用自己设计。
纯 Go 桌面应用要做同样的事就麻烦得多。[Go 标准库的 plugin]( pkg.go.dev) 不支持 Windows ,加载后也不能卸载,对编译工具链和依赖版本还有要求,不适合直接拿来做一个跨 Windows 、macOS 、Linux 的热插拔 GUI 插件市场。
最后 Ally 还是用了混合方案:主程序是原生 UI ,插件页面按需跑在 WebView 里。插件可以打成 zip 安装,在侧栏增加页面,通过宿主提供的接口访问存储、HTTP 和工作区等能力;重新导入后可以更新,不用重启整个应用。
目前这更接近“可插拔页面”,和 DSH 那种能扩展更多核心能力的插件体系不太一样。WebView 也有自己的生命周期和资源成本,要做成完整生态,扩展点、兼容性和权限模型还有不少事要解决。
代码
大概就这些,迁移完之后我自己还是比较满意的,欢迎大家一起尝试原生界面
我的项目代码在 [Ally 仓库]( Bronya0/ally-agent): Bronya0/ally-agent 原来的 Wails 版本还在 main 分支,MyGo 版本在 [mygo 分支]( github.com/Bronya0/ally-agent/tree/mygo),感兴趣或想学习 MyGo 的可以对比着看,欢迎点个 Star 。
15 comments
DeepSeek が描く AI エージェントの未来像
DeepSeek が Super-agent という AI エージェントの構想を公開しました。利用者と会話を続けながら複数の仕事を進め、GitHub やチャットの変化にも対応します。人が作業やセッションを管理する負担をどう減らすのか、既存のエージェントとの違いも含めてまとめました。
TL;DR
Super-agent は仕事の進行やセッションの管理をシステムへ任せ、人が細かく指示・確認する負担を減らす構想です。
利用者との会話と仕事の振り分けは Router、個々の作業は Worker が担当します。GitHub やチャットの通知も受け取り、対応が必要なものを担当へ届けます。
Router と Worker をクラウドで動かし、自宅PCのコードや開発ツールを使って作業する構成も想定しています。
利用者が複数サービスで組んでいる仕組みを、AI ベンダーが体系化して提供してくれることに期待しています。
Worker もクラウド側にあるため、自宅PCとの接続や GUI・ブラウザ操作が安定して動くかは気になるところです。
はじめに
DeepSeek Harness のチームが、Exploring Super-agent Design: Towards a More Autonomous Agent System という設計記事を公開しました。
元記事では、仕事の振り分けやセッション間の情報の引き継ぎをシステムへ任せ、人が細かく指示・確認する負担を減らす設計を提案しています。その分、人が仕事の目的や優先順位を決めたり、成果を確認して承認したりすることに集中できるようにする狙いです。
以前、Work や dot から自宅PCの Codex へ仕事を依頼する構成を記事にしました。今回の構想では、利用者との対話と実作業を分担する仕組みを、エージェントの実行基盤として扱っています。
自分でも仕組みを理解しておきたかったので、元記事の設計を既存のエージェントと比べながらまとめてみました。
DeepSeek の Super-agent 構想
Super-agent が目指すのは、人が個々のセッションを操作して仕事を進める負担を減らし、複数の仕事を継続して任せられるエージェントです。人は目的や優先順位を伝え、必要な場面で判断や承認を行います。その間の仕事の振り分けや情報の引き継ぎを、システム側が受け持つ設計です。
元記事では、モデルの能力が上がるにつれて個々の仕事への監視や細かな指示が減ってきたと説明しています。複数のエージェントを連携させる能力も上がり、別々のセッションへ仕事を分担する使い方も可能になってきました。
Claude Code や Codex で複数の仕事を進めるときは、実装用や調査用のセッションを分けて使うことがあります。文脈が混ざらない一方で、進捗の確認や対応するセッションへの追加指示は利用者が行う必要があります。
個々の仕事を任せられるようになっても、どのセッションが何を知っているかを人が覚えておく必要があれば、同時に任せられる仕事の数は人間の注意力に制限されます。元記事では、モデルの能力向上に伴って、この人間側の負担が生産性を制限するようになると説明しています。
そこで、担当を決めて必要な情報を届けるところまでエージェントの仕組みに含めます。人からの指示に加えて GitHub やチャットの変化も受け取り、対応が必要な仕事を進めます。途中で判断が必要になったときや成果の確認を求めるときには、人へ戻ってきます。
利用者が話す相手や場所を変えても、それまでの依頼を踏まえて対応する。作業中にも別の仕事を引き受け、異常があれば復旧する。こうした動作を継続して行えるように、エージェントの実行基盤を設計し直すのが Super-agent の構想です。
比較の出発点として、ローカルのエージェントを仕事ごとに起動する構成を描くと次のようになります。
利用者が仕事ごとのセッションを管理する構成
Super-agent では利用者とのやり取りを受け持つ Router と、仕事を実行する Worker を分けます。会話や作業の記録は実行プロセスの外へ保存し、コードや開発ツールがある環境にも接続します。
DeepSeek の Super-agent 構想
利用者は実装を頼んだ後に別の調査を依頼しても、同じ Router と話を続けられます。担当は裏でそれぞれの仕事を進め、結果や相談が必要な点を Router へ返します。チャットから始めた仕事について、後から GitHub の PR に書いた追加指示を受けて進めることも想定しています。
元記事が挙げる性質は次のとおりです。
性質
目指す動作
Continuous
チャットや GitHub などやり取りする場所が変わっても、同じエージェントとして文脈を保つ
Productive
複数の仕事を並行して進め、作業中にも次の依頼を受ける
Proactive
外部の出来事を確認し、対応する価値があるものに自ら取りかかる
Persistent
継続して稼働し、必要な作業環境へ接続しながら異常から復旧する
これを Router と Worker の分担やイベントの処理、非同期のやり取りによって実現します。実行処理と状態・環境を分けることや、外側から監視する仕組みも含まれます。ハーネスを含む実行基盤全体の設計が話の中心になります。
仕事ごとのセッションは内部に残ります。その管理をシステムへ任せ、利用者が毎回どのセッションを開くか考えなくても済むようにする構想だと理解しました。
利用者との対話と作業担当の分担
Router は利用者との会話を続けながら、新しい仕事を Worker へ振り分けます。進行中の仕事との関係や、複数の仕事にまたがる判断も扱います。
たとえば、ある不具合の修正を頼んだ後に別のライブラリの調査を依頼したとします。修正は Worker A、調査は Worker B が担当し、Router は両方の状況を把握して利用者と話を続けます。
Router 自身は実作業を行いません。元記事では Bash ツールを持たなくてもよく、軽いモデルで速度と品質を両立できる場合が多いとしています。会話を担当するモデルが実装や長い調査に取りかかると、その間の会話や別の依頼への応答も遅くなるためです。
Worker は仕事ごとに分かれた文脈と、実作業に必要なツールを持ちます。不具合の原因を調べてコードを直す担当と、ライブラリの仕様を調べる担当では、途中のログや推論を共有し続ける必要はありません。各 Worker が作業を進め、重要な結果を Router へ報告します。利用者への返答は Router がまとめて行います。
別の担当へ仕事を任せる点は、一般的な orchestrator / worker 構成やサブエージェントと共通しています。ただ、複雑な仕事を細かい作業へ分ける orchestrator と、ここでいう Router では担当範囲が違います。Router は独立した仕事の振り分けと全体の調整を行い、一件の仕事の詳細な計画や分割は Worker 側が受け持ちます。
Worker はその仕事に必要ならさらにサブエージェントを使えます。たとえば機能追加を担当する Worker の中で、設計・実装・テストを分担する Agent Team を動かす形です。Router と Worker は役割の区分なので、必ずそれぞれが一つのセッションになるという意味でもありません。
外部イベントと作業中の追加指示
継続して仕事を進めるには、最初の依頼に加えて、その後に起きたことも受け取る必要があります。
修正した PR にレビューが付く。CI が失敗する。チャットで変更の相談が出る。元記事ではこうした外部の出来事を Trigger として扱います。
すべてをモデルに判断させると、関係のないメッセージにも推論が必要になります。そこで、送信元や対象のグループなど、決まった条件で判定できるものはプログラムで先に絞ります。そのうえで、内容を読まないと対応の要否が分からないものをモデルに判断させます。元記事の Fast Path / Slow Path はこの分担です。
担当が決まった後の続報にも、毎回 Router の判断は必要ありません。
たとえば Worker A が PR の修正を担当するなら、その PR に関する通知の届け先として Worker A のセッションを登録します。コメントや CI 結果の通知が届くと、プログラムがこの登録に従って Worker A へ直接送ります。通知のたびに Router のモデルが担当を選び直す必要はありません。
元記事の subscription (購読) は、この通知先の登録を指しています。PR やチャットのスレッドごとに届け先を登録し、後続の通知をプログラムで振り分ける仕組みです。届いた内容を読んで対応を考えるのは Worker です。
まだ担当のいない新しい仕事や、担当をまたぐ調整は Router が扱います。Worker も重要な結果を Router へ報告するので、Router は全体の状況を追いながら利用者とやり取りできます。
作業中の追加指示を受け取るため、ツールの実行も非同期にします。長いビルドを開始したら、完了までその呼び出しの中で待ち続けず、結果が後からイベントとして届くようにします。その間に届いた追加指示も、現在のモデルの推論ステップが終わった時点で扱えます。
これならビルド中に方針が変わっても、ビルドの終了まで会話を止めずに済みます。単に裏でコマンドを実行するだけでなく、作業の途中にも入力を受け取れるようにする設計です。
長く動かすほど増える履歴にも工夫があります。直近で必要な情報はコンテキストへ入れ、長い内容や古い記録は外へ置いて参照を残します。過去の仕事が再び話題になったら、その参照をたどって必要な記録を読み直します。元記事では Inline & Spill、Chain of Recall と呼んでいる仕組みです。
実行処理・履歴・作業環境の分離
この構想ではエージェントの実行処理と履歴をクラウドへ置き、実際に作業する環境を必要に応じて接続します。
Agent Loop はモデルに問い合わせ、返ってきたツール呼び出しを実行へつなぎ、その結果をモデルへ返す処理です。これを実行するプログラムと、残しておきたい会話や作業の記録を分けます。
分ける対象
置き場所と役割
Agent Loop
クラウドでモデルへの問い合わせとツール呼び出しを取りまとめる
会話履歴・作業状態
外部のデータベースなどへ保存し、実行処理を起動し直しても読み出せるようにする
作業環境
コードや SDK、ファイル、アプリがあるPCなど。必要な処理を実際に行う
Agent Loop のプロセスが落ちても、記録は外へ残ります。別のプロセスがその記録を読み直せれば、同じ仕事の続きを扱えます。実行中の一つのプロセスを生かし続けることと、仕事の継続を分けて考えるわけです。
元記事でも、Anthropic の Managed Agents の設計記事を参照しています。こちらもハーネスとセッションの記録、作業環境を分け、それぞれを交換できるようにする設計です。
DeepSeek が特に接続先として挙げているのは、利用者が普段使っているPCです。自宅PCには未コミットの変更や、そのPCで使っている開発ツールがあります。すべてをクラウドへ複製する代わりに、作業環境をそのまま使います。
PC側にはコマンドを実行して結果を返す軽量な daemon を置きます。会話や仕事の状態はクラウド側で管理し、Agent Loop が必要な処理をPC側へ依頼する形です。元記事では BYOM (Bring Your Own Machine) と呼んでいます。クラウドの環境や、必要なときに作る環境も接続先に含まれます。
この構成なら、自宅PCを閉じてもクラウド側での対話や記録は維持できます。そのPCが必要な作業は接続を待ち、再びオンラインになったときに進める想定です。
継続運用には外側から状態を見る Watchdog も置きます。プロセスの停止や API エラーだけでなく、同じ作業を繰り返して進んでいない状態や、目的からのずれも確認します。Watchdog 自身もツールを持つエージェントのセッションで、主な実行処理とは別に監視や復旧を行います。
以前の自分の構成では、クラウド側の dot からローカルで動く Codex などの作業担当へ依頼していました。Super-agent の構想では Worker の Agent Loop もクラウド側に置き、ローカルPCにはコマンドを実行して結果を返す daemon を置きます。
以前は作業担当がPC上で動いていたので、そのPCの GUI やブラウザを操作するツールを直接使えました。Worker がクラウド側にあると、手元の画面を確認したり操作したりするためにも、クラウドとPCの間でやり取りする仕組みが必要になります。クラウドに用意したブラウザで調べる仕事と、自宅PCのアプリや既存のブラウザを使う仕事では、接続先も変わります。
クラウド側で操作を判断し、PC側のプログラムに画面取得やクリックを実行してもらう形が考えられます。会話や仕事の記録が残っていても、通信が切れる前と同じ画面が開いているとは限りません。接続が戻ったら操作対象の状態を確認し、その状態に合わせて続きを進める必要があります。
操作の指示や結果がクラウドとPCを行き来するため、途中で止まったり、結果がうまく戻らなかったりしないかは気になります。画面の取得から操作結果の確認、通信断後の再開まで、基盤側で安定して扱えるようになることを期待しています。
構想の一部を実装した dsh-superagent-prototype も公開されています。README には内部版や設計記事と同一ではなく、記事中の将来構想には未実装のものもあると明記されています。ここで説明した全体像がそのまま完成した製品として使える段階ではないようです。
既存のエージェントとの比較
Claude Code や Codex でもサブエージェントへの分担やクラウドでの作業、離れた端末からの追加指示ができます。Cowork にも複数段階の仕事を任せ、クラウドで並行して進めたり定期実行したりする機能があります。
Super-agent の構想で整理されているのは、そうした機能を継続的な仕事の流れとしてどう組み合わせるかです。利用者と話す担当や続報の届け先に加え、記録の保存と作業環境への接続まで設計しています。
利用体験としては Grok Bot や ChatGPT dots、Claude Duet にも近い部分があります。
製品
公式に説明されている仕組み
Super-agent と重なる部分
Grok Bot
専用のクラウドPCで常駐する Bot。まとめ役と専門の Bot が連携し、スマホやデスクトップから仕事を頼める
会話を続ける担当と、複数の担当による仕事の分担
ChatGPT dots
継続的な仕事を引き受け、会話の合間も作業を進める。Work や Codex へ仕事を依頼して進捗を扱う
会話を続けながら別の担当へ作業を任せる構成
Claude Duet
継続する会話と専用のクラウドPC・ブラウザを持ち、接続したアプリを確認して必要な結果や判断依頼を知らせる
常時動く作業環境と、必要なときに人へ戻るやり取り
Claude Duet は現時点では research preview で、接続したアプリを一定間隔で確認します。
Grok Bot や dots、Duet を見ると、普段の会話を保ったまま裏で仕事が進む使い方は想像しやすくなります。DeepSeek の記事は、その使い方を実現するための実行基盤を具体的に説明しているところが面白いと感じました。
おわりに
仕組みを追っていくと、最近見かける Grok Bot からほかのエージェントへ仕事を任せる構成に近いと感じました。以前自分が組んだ dots 基盤も、会話を担当するエージェントと実作業を進めるエージェントをつなぐ点では同じ発想です。
利用者が複数のサービスを組み合わせて作っているこうした仕組みを、AI ベンダーが体系化して提供してくれると面白そうです。サービス同士のつなぎ方や仕事の引き継ぎを自分で組まなくても済むなら、より多くの人がエージェントに仕事を任せやすくなると思います。
自分は以前、dot との接続がうまくいかず、結局使わなくなりました。その経験もあるので、Worker までクラウド側へ移る構成で自宅PCとのやり取りがどう扱われるかは気になります。普段の開発環境や GUI・ブラウザの操作まで含めて安定して使えるなら、かなり自分の使いたい形に近づきそうです。
Mentions
DeepSeek SuperagentでGitHub IssueをPRまで運ぶ:導入と最初の一件 !作業依頼を受け取り、成果物を返す小さなロボット。KD Agentic アシスタントが設定関数を直し、「空文字も処理できるようにした」と言いました。ところが変更をプロジェクトへ戻して動かすと、呼び出し側には古い引数名が残っていて、またエラーになります。 「できた」と言うこと、ファイルを変更すること、実際に動かして確かめることは別々です。変更箇所や確認方法を毎回聞き直すのではなく、依頼と成果を追える場所に置けたらどうでしょう。 まずは、インストール不要の二つのチャットで「範囲と合格条件を書いた依頼票」を作ってみます。そのあと、DeepSeekの公開リポジトリにあるdsh-superagent-prototypeを練習用GitHubリポジトリにつなぎ、小さなREADME修正をPull Request(PR)として受け取るところまで進みます。PRは、プロジェクトへ取り込む前に人が確認できる変更提案です。 まず二つの普通のチャットで、依頼票を作る 二つのAIチャットを開き、ウィンドウAに次の材料を貼り付けてください。 > あなたはタスクを整理する担当です。変更作業はしないでください。元の情報:READMEには「npm run demoを実行するとhelloと表示される」と書いてあります。実際の取り決め:npm run demoの出力はHello, world!です。目標、変更してよい範囲、合格条件を含む依頼票を作ってください。変更してよいのはREADMEだけです。プログラム、スクリプト、依存関係は変更しないでください。 Aが作った依頼票に、最初の材料も添えてウィンドウBへ渡します。 > 依頼票に従い、READMEの変更前と変更後の文章を提示してください。制約を一つずつ満たしているか説明してください。提示された材料だけを使ってください。ターミナルが使えない場合、コマンドを実行したとは言わないでください。 期待する変更は、READMEのhelloをHello, world!に直すことだけです。プログラムと起動コマンドはそのままです。Bの結果をAへ戻し、元の制約と照らし合わせてもらいましょう。もしBが起動コマンドまで変えてしまったら、どこを直してほしいのかを具体的に伝えられます。 回答の言い回しは見本と同じでなくて構いません。見るのは、変更範囲と期待する結果です。この練習で得られるのは文章による納品物であり、プログラムが実行された証拠ではありません。チャットを二つに分けても、間違いが自動でなくなるわけではありません。 ここで身につけたのは、変更範囲と合格条件を一枚の依頼票にまとめると、「できた?」を何度も聞かずに成果を受け取りやすくなるということです。 この依頼票の考え方を、次は実際のリポジトリにつながるSuperagentへ持ち込みます。先ほどの練習は、Superagentをインストールしたことにも、独立した監査役が正しさを保証することにもなりません。 リポジトリの横にある作業台として考える dsh-superagent-prototypeは、DeepSeek Harness(DSH)の上で動き、GitHubから依頼を受け付けます。GitHubがメッセージを運び、Policyが依頼者を確認し、Ticketが仕事を記録し、独立したセッションと作業ディレクトリで処理します。結果は元の議論へ戻り、たとえばPRとして人が確認できます。 一つのリポジトリを対象にした研究用プロトタイプです。DeepSeekの正式な製品ではなく、チーム内部の実装とも同一ではありません。関連する設計記事にある構想の一部も、このコードにはまだ実装されていません。製品のスイッチを入れる感覚ではなく、アカウント、実行環境、設定を自分で管理するソフトウェアとして扱いましょう。 最初に向いているのは、結果を小さな差分で確かめられる仕事です。 | 仕事 | 依頼に書くこと | 人が見るところ | | --- | --- | --- | | ドキュメント修正 | READMEのどの説明をどう直すか | 差分が指定した文章だけか | | テスト追加 | 対象関数、境界ケース、既存動作を保つこと | テストが追加され、実際に実行されたか | | 小さな不具合修正 | 再現入力、実際の結果、期待する結果 | 再現条件が解消し、関連テストも通るか | | Feishuからの依頼 | 設定後、指定したチャットで同じ依頼票を渡す | 元の会話への返答と対応するPR | どれも活用候補であり、成功の保証ではありません。依頼に情報が足りなければ、PRではなく追加説明を求めることもあります。最初の目標は、練習用リポジトリに届いた変更を自分で読めることです。 どのマシンで動かすかを先に決める ここで大事なのは、専用の作業ディレクトリは、セキュリティ上の隔離ではないという点です。 公式のデプロイガイドでは、ExecutorとメインSession用のプリセットが、実行サービスと同じOSユーザーでdanger-full-access権限により動きます。プロセスはパスを指定してプログラムを実行でき、そのユーザーのホームディレクトリも読めます。アカウントを切り替えるラッパーは、どの認証情報を使うかを選ぶものです。プロセス自体を閉じ込める仕組みではありません。 机の上の「ロボット用」と書いた鍵箱を想像してください。使う鍵は選べても、同じユーザーから開けられる引き出しまで封じるものではありません。初回は専用OSユーザー、またはロボットの認証情報と練習用リポジトリだけを置いた隔離環境を使うのが無難です。DSHの専用Profileや一つのリポジトリに絞る設定は仕事を整理しますが、個人ファイルを読めなくする境界にはなりません。 以下はPOSIXシェル向けです。Windowsでは、すでに用意したWSLのLinux環境で実行してください。PowerShellへそのまま貼り付ける手順ではありません。公式スクリプトはtmuxやシェル、Pythonのfcntlなどを使います。WSLの導入は別のシステム準備なので、すでに環境がある場合はここを進めます。 場所も二つに分けます。一つはSuperagent本体のリポジトリ、もう一つはSuperagentに作業させる練習用プロジェクトです。本体のリポジトリへインストールしても、作業対象の場所が自動で決まるわけではありません。 手順1:ツールとモデル接続を確認する 選んだLinux/POSIX環境で、以下を一つずつ実行します。 node -v pnpm -v git --version python3 --version tmux -V gh --version dsh --version SETUPではNode.js 22.19以上または24以上、Git 2.32以上、Python 3.8以上、GitHub CLI 2.48以上に加え、pnpmとtmuxが必要とされています。DSHは、取得したプロジェクトのpackage.jsonにあるengines.dshの条件も満たさなければなりません。バージョンは、実際に使うチェックアウトの記述を基準にしてください。 各コマンドでバージョンが表示されることを確認します。command not foundと出た項目だけを準備リストに加え、先へ進む前に解決します。すでにあるツールを重ねてインストールする必要はありません。 DSHが作業台の土台、Superagentはその上に載せる作業パッケージです。さらにDSHで利用できるモデルサービスを設定します。コードがオープンソースでもモデル呼び出しが無料とは限らず、費用や利用枠は選んだサービスとアカウントによって変わります。まずDSHで普通のモデル会話を一度できるようにしておくと、「モデルが応答しない」のか「GitHubから依頼が届かない」のかを切り分けやすくなります。 手順2:公式のセットアップ案内を使う Superagent本体を、作業対象の練習用リポジトリとは別の場所へ取得します。 git clone https://github.com/deepseek-ai/dsh-superagent-prototype.git cd dsh-superagent-prototype 既存のコーディングアシスタントでこのディレクトリを開き、次のように依頼します。 > このリポジトリのSETUP.mdを読んで、私と一緒にdsh-superagentをセットアップしてください。 さらに、「最初はGitHubだけ、練習用リポジトリだけを接続する。依頼できるのは自分だけ。自動マージは無効にする。実行前に全体の計画を示し、確認を待つ。認証情報は自分がローカルでログインまたは入力する」と伝えます。 公式のセットアップ手順は、必要な情報を一つずつ集め、全体の計画を提示してから確認を求めます。手元に用意するのは、練習用リポジトリのowner/name、ロボット用GitHubユーザー名、依頼を許可する自分のユーザー名、練習用リポジトリのローカルパス、コミット作者の名前、auto-mergeを使うかどうかです。最初はGitHub only、自分だけを許可、自動マージはNoにすると設定を絞れます。 ロボットには専用のGitHubユーザーアカウントが必要です。そのアカウントを練習用リポジトリへ招待し、書き込み権限を付けます。現在のデプロイ方式はアカウントの通知を読むため、GitHub Appをそのまま代わりにはできません。対象はgithub.comのリポジトリで、GitHub Enterprise Serverはサポート対象外です。 手順3:自分とロボットのGitHubログインを分ける デプロイガイドは、ロボット用GitHub認証情報を使う独立したghラッパーを用意します。専用環境で実行し、同名ファイルがすでにあれば内容を確認してから扱ってください。 mkdir -p ~/.local/bin cat > ~/.local/bin/gh-agent <<'EOF' #!/bin/sh GH_CONFIG_DIR="$HOME/.config/gh-agent" exec gh "$@" EOF chmod +x ~/.local/bin/gh-agent ~/.local/bin/gh-agent auth login ~/.local/bin/gh-agent api user --jq .login ログイン画面ではロボットのアカウントを選びます。最後のコマンドが返すのはロボットのログイン名です。自分のユーザー名が返った場合は、先へ進まず認証先を確認します。 トークンをチャットへ貼り付ける必要はありません。このラッパーは、机の「ロボット用鍵箱」のような役割をします。正しい鍵を選ぶものの、同じOSユーザーが使える他のファイルを隔離するものではありません。 手順4:インストール、設定、起動を分ける 以下は、Superagent Profileがまだない新規環境でのインストール手順です。コーディングアシスタントには、公式デプロイガイドと照らし合わせて計画してもらいましょう。 npm install -g @deepseek-ai/dsh@0.2.1-rc.3 pnpm install pnpm build dsh superagent --from-default-profile web --dump-config > /dev/null dsh plugin --profile superagent add "link:$PWD" すべてSuperagent本体のリポジトリのルートで実行します。最初の行はデプロイ文書に記載されたDSHの固定バージョンです。すでにDSHがある場合は、package.jsonの互換範囲を先に確認します。 4行目のProfile作成コマンドは新規インストール用です。既存のsuperagent Profileに再実行すると、設定を置き換えてしまいます。すでに使っている人は、設定を保ったまま公式のUpgrade手順に進みます。 ビルドが成功しても、依頼を受けられる状態とは限りません。 次に、examples/profile.cordis.patch.ymlを参考にマシン設定を整え、絶対パスのstateDirを指定します。新規環境では公式の案内に沿って例を使い、既存設定があるならファイル全体を置き換えず必要箇所だけ編集します。プロファイル用プラグインはPATHやGitの設定にも影響するため、普段使うProfileとは分けて管理し、個別に再起動・更新します。 続いてサービスを起動し、状態を確認します。 scripts/dsh-superagent start scripts/dsh-superagent status 起動ログに出るアドレスを開き、サイドバーからSuperagentを選択します。標準の計画では127.0.0.1:3082を使いますが、実際のポートは設定に従ってください。 パネルでは四つの設定をそろえます。 - Sources:練習用リポジトリのowner/nameと、ロボット用ghラッパーの絶対パス。 - Policy:自分のGitHubログイン名を許可リストへ追加。リストが空だと依頼はTicketになりません。 - Execution:作業ディレクトリのルートとprepareコマンド。各Ticket用にプロジェクトの作業コピーを作れるよう、実際のクローンパスからworktreeコマンドを組み立ててもらいます。 - Prompts:コミット作者とロボットであることの開示文を設定し、マージは人が行う条件を残します。 電源ケーブルのように、この四つがつながって初めて依頼が動きます。モデルだけを変更しても、GitHubアカウントや作業ディレクトリの設定不足は補えません。設定保存後に再起動を求められたら、サービスが戻るのを待ちます。外部ログインを直した後は、表示されるCheck againで再確認します。 手順5:最初の本物の依頼を送る Policyで許可したアカウントから、練習用リポジトリのIssueに新しいコメントを投稿します。 @<agent-login> Please correct the README's demo output description. It should say Hello, world! Only change README. Do not change the program, scripts, or dependencies. Please open a PR and explain what changed and how you checked it. 山括弧の箇所をロボットの実際のユーザー名に置き換えます。これは依頼文の例であり、コマンドではありません。 通常はGitHubアカウントの通知を約1分間隔で確認して依頼を受け取ります。既存Issue本文を編集してmentionを足す方法では通知されません。新しいコメントとして投稿してください。また、need-agentラベルを付けるだけでは依頼のトリガーになりません。ラベルから自動で受け付けるには別のルールが必要です。 パネルのOverviewにTicketが作られたか、タスクSessionと元コメントへの返答があるかを確認します。結果はPRのこともあれば、情報の追加依頼のこともあります。確認は三段階に分けましょう。 1. Ticketがある:依頼を受け取る経路が動いた。 2. PRがある:変更案が作られた。 3. 差分と確認記録を見る:依頼した変更範囲と合格条件を満たしたか判断できる。 READMEの練習なら、出力説明が直り、起動コマンドが変わっておらず、プログラム・スクリプト・依存関係が変更されていないことを差分で確認します。「全部通りました」という文章だけでは、実際に何を確認したかの代わりになりません。 statusの終了コードも状況の切り分けに役立ちます。0は正常、1はプロセスまたはランタイムの問題、2はSourceなどのモジュールエラー、3はセットアップ待ちです。2や3の場合、再起動を繰り返しても足りない設定は出てきません。errorsやsetupに表示された詳細を見ます。サービスの状態が正常でも、最初のPRが依頼どおりかどうかは別に確認してください。 一件できたら、任せる範囲を少しずつ広げる READMEの修正が届いたら、次はテスト環境がすでにあるリポジトリで、小さな関数の境界テストを頼めます。依頼票にテストコマンド、変更してはいけないファイル、失敗した場合の報告方法を加えると、確認しやすくなります。 自分から仕事候補を見つける動作は、明示的な依頼とは別に考えます。SETUPの初期値であるobserveは、候補を記録するだけで実行しません。許可された人から明示的に届く依頼と、エージェントが先回りして見つけた候補は同じものではありません。まず候補の内容を見て、どの範囲まで任せるか決めましょう。 Feishuも後から追加できる入口です。ボットアプリ、権限、専用のlark-cli設定、許可リストが必要になります。依頼を出す場所は増えますが、リポジトリ権限、実行マシン、モデル設定は引き続き必要です。 今は後回しでよいこと Feishu、自発的なスキャン、複数人からの依頼、自動マージ、本番環境への接続は、最初の一件が届いてから考えれば十分です。最初の目標は、練習用リポジトリに届いた変更を読める小さなPRを一つ受け取ることです。 アイデアを相談するだけなら、いつものチャットも便利です。常駐する作業台の価値は、依頼、状態、納品物を追える場所にまとめられること。PRが戻ってきたら差分を開き、確認結果を読み、取り込むかどうかを自分で決めましょう。 参照した一次資料と適用範囲 以下の公開プロジェクト資料を2026年11月7日に確認しました。コマンドやパネル名はチェックアウトするバージョンで変わることがあります。 - プロジェクトREADME:研究用プロトタイプの位置づけ、対象リポジトリ、内部実装との違い。 - SETUP.md:前提条件、セットアップ時の質問、初期設定、最初の依頼。 - 006 Deployment:アカウント、権限、インストール、パネル設定、通知確認、起動と終了コード。 - package.json:Node.jsとDSHの互換条件、ビルドコマンド。
[开源] 把 Pi 和 DeepSeek Harness 装进了手机:一个 Android 上的开源 AI Agent 大家好,分享一个我业余在做的开源项目:小维助手(WeiAssist),一个装在 Android 手机上的 AI Agent。 它最大的特点:同一个 App 里支持两种 Agent 引擎:[Pi]( earendil-works/pi) 和 [DeepSeek Harness]( deepseek-ai/deepseek-harness),在设置里一键切换 。 GitHub: zjw1918/WeiAssist 下载: github.com/zjw1918/WeiAssist/releases/latest (v0.3.0,Apache 2.0) 两个引擎,按需选 | | Pi | DeepSeek Harness | | --- | --- | --- | | 安装 | 内置,装好 App 就能用 | 设置 → AI 引擎,一键安装(自动在 Termux 里装好 Ubuntu + Node.js + dsh) | | 特点 | 轻量、快,极简的 Agent 循环 | 自带文件、bash、子 Agent、网页抓取、技能(skills)、工作流 | | 版本 | 随 App 打包 | 默认装经过测试的版本,也可以装最新版或任意版本,随时回退 | 几个设计上的点: - 两个引擎共用同一套模型和密钥:OpenAI、Anthropic、Google、DeepSeek、OpenRouter、xAI、Moonshot、Mistral, 以及任何 OpenAI 兼容接口(Ollama、vLLM、LM Studio…)。配一次,两边都能用。 - 两个引擎都能用 App 的手机能力:操作 App、跑 Termux 命令、收发文件,也都走同一套安全确认。 - 不阉割引擎原生能力:DeepSeek Harness 的子 Agent、技能、工作流都原样保留, 并在 UI 里做了对应展示,而不是为了"两边一致"砍成最小公约数。 - DeepSeek Harness 不接触你的密钥:它通过 App 访问模型服务,Key 始终只在 App 里(Android Keystore 加密)。 - 每个会话记住自己的引擎:可以一个会话用 Pi 快速问答,另一个会话用 DeepSeek Harness 跑重活,互不影响。 演示:DeepSeek Harness 子 Agent 并行 让它开 3 个子 Agent 分别调研 Rust / Go / Zig,每个子 Agent 一张实时卡片(耗时、步骤、当前在做什么), 全部完成后由主 Agent 汇总成一张对比表:  其他能力 - 手机上的 Linux:配合 Termux 查资料、处理数据、写代码并运行,长任务放 tmux 后台。 - 替你操作 App:通过无障碍服务操作应用,"发送 / 支付 / 删除"前一定先问你,不管用哪个引擎。 - 多会话并行:多个对话同时在后台跑,还有一个"总管"帮你启动、查看、停止它们(支持语音)。 - Telegram 远程:配对一个 Bot,人不在手机旁也能指挥它,危险操作在 Telegram 里 ✅ / ❌ 确认。不需要服务器。  隐私 没有我的服务器。App 直连你选的模型服务,密钥只存在手机上,密码框内容永远不会发出去。 已知局限 - DeepSeek Harness 需要 Termux,约 1.5 GB 空间,首次安装 10–30 分钟。 - UI。 想听听大家的意见 - 你更想在手机上用哪种引擎?还希望接入哪些 Agent 引擎? - 最想让手机上的 Agent 帮你干什么? 欢迎试用、提 Issue / PR,觉得有意思的话给个 Star 就很感谢了 🙏
OpenCode Go × dshで月$10 — Opus 5.5で計画し、DeepSeek V4.1 Flashに大量実行させる OpenCode Goが安くてコスパいい。 現状は、Opus 5.5(Claude Pro 月$20)で計画し、 OpenCode Goの月$10のサブスクで DeepSeek V4.1 Flash をお得に仕入れ 実行部隊として,全自動で昼夜を問わず働かせ続けよう という記事です。 合計は月$30になりますが、それでもMaxを契約するより安い しかし、OpenCodeをそのまま使うと、ハーネス自体はあまり良くない。 そこで DeepSeek Harness(dsh) に替えると キャッシュヒット率が上がってトークンが節約できたり モデルの性能を最大限に引き出せたり なぜか出力速度も100 tok/s以上で速苦なったり(という噂もある) といった効果が期待できます。 これを使うと,一つのiOSアプリならOpenCode + dshだけでも一回数行の指示で作れます。 サブスクがAPI料金と比ベてどれだけ得したか表示するアプリ 自分の好みにあった論文が日本語訳と画像・動画付きで表示されるアプリ ここまで押さえれば,全部を読む必要はありません。(そもそも全自動で何かをさせるための記事なので,人間が時間を割いて読むのは本末転倒) 導入してみたい・とりあえず無料枠で試してみたいと思ったら、保存しておいて、あとでこの記事のリンクをそこらへんのAIに投げ、ハーネスを結びつけるところまでやってもらいましょう。 ※この記事は2026年11月時点の環境のメモです。OpenCode Goの料金・提供モデル・利用上限は変わるので、公式情報を確認してください。 はじめに:全部を高いモデルでやる必要はない 正直に言うと、私はOpus 5.5を崇拝していない。計画を立てるときや、失敗したときの原因究明では本当に頼りになる。だが、すべての実装・調査・テスト・ドキュメント更新までOpus 5.5にやらせると、請求を見るたびに「この作業、本当にOpusじゃないとダメだったか?」と思う。 Opus 5.5は高い。高いこと自体は悪くない。悪いのは、高くなくていい仕事に高いモデルを使い続けることだ。研究者に書類整理をさせるようなもので、仕事の質は上がらないのに、疲れだけ増える。 一方で、実際のコーディング作業の多くは「そこそこ賢ければ回せる」仕事でもある。設計方針が決まっていて、変更範囲が明確で、テスト方法も決まっているなら、Opus 5.5でなくても十分に戦える。というか、そういう仕事をOpus 5.5に投げている時間は、私にとっては思考の中断でしかない。 そこで、役割を分けることにした。 計画・分解・レビューはOpus 5.5 大量の実装・調査・テストはDeepSeek V4.1 Flash 実行ハーネスはDeepSeek Harness(dsh) DeepSeek V4.1 Flashの供給元はOpenCode Go(月$10) この構成にすると、高価なモデルは「判断が必要なところ」だけに使い、安いモデルで「量が必要なところ」を回せる。しかも、dshに乗り換えたことでキャッシュヒット率とデコード速度が上がった印象がある。 サブエージェントを何本も走らせていると、いつの間にか「これはOpusにやらせる仕事か?」と自問するようになる。大体の答えはNoで、Noと言いながらOpusに投げているから、財布が痛む。 この記事では、その構成の考え方と、実際に導入するときの手順をまとめる。導入でまごついた部分を「人間がやる作業」と「AIに任せられる作業」に分け、コピペ用のプロンプトも用意した。 対象読者 AIコーディングのトークン代を抑えたい 高いモデルと安いモデルの使い分けに興味がある OpenCode Goやdshを試してみたい サブエージェントを大量に走らせるワークフローを作りたい 結論:こういう分担にした 役割 担当 理由 プランナー Opus 5.5 問題設定、タスク分解、設計判断、最終レビュー オーケストレーター dsh サブエージェントの実行、キャッシュ、スループット ワーカー DeepSeek V4.1 Flash(OpenCode Go) 安くて速く、実装・調査・テストに十分な性能 レビュアー Opus 5.5 差分の最終確認、設計との整合性チェック 処理の流れはこうなる。 [Opus 5.5] 計画・タスク分解・受け入れ条件の定義 | v [DeepSeek Harness (dsh)] オーケストレーション / キャッシュ / サブエージェント実行 | +--> [DeepSeek V4.1 Flash] 実装 A +--> [DeepSeek V4.1 Flash] 実装 B +--> [DeepSeek V4.1 Flash] 調査 C +--> [DeepSeek V4.1 Flash] テスト D | v 差分・テスト結果を Opus 5.5 でレビュー ポイントは、dshをプランナーにしないこと。dshは実行層に徹させ、計画と最終判断はOpus 5.5に残す。こうすると、安いモデルの失敗を高いモデルで回収しやすい。 なぜOpus 5.5が「頭脳」で、DeepSeek V4.1 Flashが「実行部隊」なのか 私はベンチマークを鵜呑みにするつもりはない。だが、「Opusのほうが賢い気がする」という空気でモデルを選ぶのはもっと嫌いだ。なので、公開ベンチマークで確認する。FrontierCS 2(2026年11月4日時点)は、CS論文の主要な貢献をコードから抜き、AIエージェントが実装し直して人間の参照実装を全指標で上回れるかを競う48タスクのベンチマークだ。 モデル(ハーネス) FCI 通過率 推定APIコスト/タスク Claude Opus 5.5(Claude Code) 51.2 58.3%(28/48) 約$20.0 DeepSeek V4.1 Flash(DeepSeek Harness) 28.4 12.5%(6/48) 約$0.11 FCI(FrontierCS Capabilities Index)は能力の指数で、数字が大きいほど難しいタスクを通しやすい。10ポイント差で「指標を上回るオッズ」が約2.7倍になる。Opus 5.5とDeepSeek V4.1 Flashの差は22.8ポイントなので、オッズで約10倍。正解が一つに決まらない設計判断をOpus 5.5に残すのは、この差が理由である。 一方で、API費用は約187倍違う。DeepSeek V4.1 FlashのFCIはOpus 5.5の約55%だが、1タスクあたり約$0.11のAPI費用で回り、ハーネスはDeepSeek Harness(dsh)だ。設計が決まり、変更範囲とテストが明確な実行タスクなら、この単価差がそのままコスパの差になる。 これは信仰の話ではなく、仕事の種類と単価の話だ。Opus 5.5も通過率58.3%で万能ではないので、プランの最終確認は人間が行う前提で読んでほしい。 研究タスクの通過率を、そのまま実務の成功率として読まないこと。計画力だけを測った指標でもない。API費用は従量課金の推定値で、OpenCode Goの月$10(Opus込みで月$30)とは課金形態が違う。ハーネスもOpus側はClaude Code、DeepSeek側はdshと揃っていない。 この記事の設定では、dshのプロバイダはOpenCode Goだけなので、Opus 5.5はdshの外(Claude CodeやWebのチャット)で動かす。プランナーの出力は plan.md のようなファイルに落とし、ワーカーに渡す。レビューは差分とテスト結果をOpus 5.5側に戻す、という受け渡しになる。 なお、dshでサブエージェントをどう起動するかはバージョンによって変わる。ここでは役割の分け方と設定に絞り、起動方法の詳細は割愛する。 なぜOpenCode Goなのか OpenCode Goは、月$10の固定額で、DeepSeek V4.1 Flashなどのモデルを使えるサブスクリプションだ。公式ページ(2026年11月時点)では、Goプランが月$10、上位のGo Plusが月$40と表示されている。DeepSeek V4.1 Flashは「5時間あたり約43,000リクエスト、月$100相当」という目安で載っている。 無制限ではなく上限はある。それでも、個人がサブエージェントを何本も走らせる用途では、十分に大きい数字だと感じる。執筆時点の私の環境では、opencode-go プロバイダから deepseek-v4.1-flash と deepseek-v4-pro が見えている。 ここで、財布の話をしておく。私の場合、Opus 5.5側に月$20かかっている。OpenCode Goの月$10と合わせると、合計は月$30だ。OpenCode Go単体の$10だけを見ると「激安」に見えるが、実際に払うのは$30。それでも、全部をOpus 5.5の上位プラン(Max)で回すより安い。 項目 月額 役割 Opus 5.5側のプラン $20 計画・レビュー OpenCode Go $10 DeepSeek V4.1 Flashの実行 合計 $30 料金は執筆時点の私の契約の話で、プラン名や価格は変わる。MaxにもMaxの価値はあるので、これは「私の用途では」という比較だ。 OpenCode Goのいいところは、「最高のモデル」ではなく「そこそこいいモデル」を大量に使えることだと思う。 Opus 5.5ほどの推論力はない それでも実装、リファクタリング、テスト、調査、ドキュメント更新には十分 サブエージェントとして並列に投げても、財布へのダメージが小さい もちろん、OpenCode GoがあればOpus 5.5が不要になるわけではない。難しい設計判断や、失敗したときの原因究明は、依然として高いモデルのほうが強い。だから「全部を安いモデルにする」のではなく、仕事の種類で分けるのが大事だ。 金額の比較はトークン量やキャッシュの効き方で変わるので単純には言えないが、「計画はOpus、実行はDeepSeek」にすると、同じ予算で回せるタスク数は増える印象がある。特に、サブエージェントを何本も走らせるワークロードでは効いてくる。 注意:料金・モデル・利用上限は変わる。契約前に公式サイトの最新情報を確認してほしい。 なぜdshなのか OpenCodeのハーネスは、私にはあまり合わなかった。使い方が悪いだけかもしれないが、サブエージェントの制御や、長いセッションでのキャッシュの効き方に物足りなさを感じていた。 dsh(DeepSeek Harness)に乗り換えてから、印象が変わった。 キャッシュが効きやすいと感じた:同じシステムプロンプトや同じプレフィックスを繰り返すワークロードで、キャッシュヒット率の表示が高かった デコードが速い:手元では、1回の実行で100 tok/sを超えるデコード速度が表示されたことがあった サブエージェントを回しやすい:実行層として割り切って使える UIで使用量が見える:トークン数、キャッシュヒット率、ターン数が確認できる ただし、これは厳密なベンチマークではない。OpenCodeのハーネスと同一条件で比較測定したわけでもない。プロンプト長、キャッシュの状態、マシン、ネットワーク、モデルのバージョンで大きく変わる。あくまで「私の環境ではこう感じた」という参考値として読んでほしい。 私の環境はこんな感じ。 macOS(Apple Silicon) Node.js v22.23.4 dsh 0.2.1-rc.5 OpenCode CLI 1.19.4 検証に使ったモデル:opencode-go / deepseek-v4.1-flash(無料モデルも別途試した) セットアップの全体像 dshでOpenCode Goを使うには、大きく3つの部品が必要になる。 OpenCodeのAPIキー(Goサブスクリプション用。無料モデルも試すならZen用も。人間が用意) opencode.ai宛のヘッダーを注入するプラグイン(AIで作成可能) dshのプロバイダ設定(AIで作成可能) ファイルで言うと、次のようになる。 ~/.dsh/ ├── plugins/ │ └── opencode-headers/ │ └── index.js # opencode.ai 宛の fetch にヘッダーを付ける ├── profiles/ │ └── web/ │ └── cordis.patch.yml # プロバイダとデフォルトモデルの設定 └── .credentials.yaml # APIキーの参照(値はここに入る) プラグインの置き場所は任意だが、cordis.patch.yml に書く file:// のパスと一致させないといけない。ここでは ~/.dsh/plugins/ の下に置いている。 なぜプラグインが必要かというと、opencode.ai側が「OpenCodeの公式クライアントからのリクエストか」を見ているからだ。dshのpi-aiは独自のヘッダーを送るので、そのままだと弾かれることがある。そこで、OpenCode CLIと同じ user-agent と x-opencode-client を付ける。 これは非公式のワークアラウンドなので、OpenCode側の仕様変更で動かなくなる可能性がある。利用規約の範囲内で、自己責任で使ってほしい。 人間がやる部分 ここはAIに任せにくい。というか、任せるべきではない。 1. OpenCodeのアカウントとGoサブスクリプションを用意する OpenCodeのアカウントを作る OpenCode Goに加入する(執筆時点で月$10) ダッシュボードからAPIキーを発行する 支払いとログインが絡むので、ここは人間の仕事だ。 2. APIキーを安全に保管する APIキーはパスワードと同じ扱いにする。 Gitにコミットしない チャットに貼らない スクリーンショットに映さない 使わなくなったら失効させる dshは ~/.dsh/.credentials.yaml にキーを保存する。ファイルのパーミッションは 600 にしておく。 chmod 600 ~/.dsh/.credentials.yaml 3. Node.jsとdshを用意する 手元では Node.js v22.23.4 で動作を確認した。dshは npx で起動できる。 node --version npx --yes @deepseek-ai/dsh --version 必要なNode.jsのバージョンは変わることがある。起動しない場合はdshのREADMEも確認してほしい。 4. APIキーをdshに登録する dshの設定画面(Models)にAPIキー欄があれば、そこに入れるのが一番簡単だ。 うまく見つからない場合は、~/.dsh/.credentials.yaml の refs に直接追加する。 version: 1 refs: OPENCODE_API_KEY: sk-... # OpenCode Zen(無料モデル)用 OPENCODE_GO_API_KEY: sk-... # OpenCode Go用(同じキーなら片方だけでもよい) 既存の records や他の refs がある場合は消さずに、refs にキーを追加する。 refs の名前は、あとで出てくる apiKeyEnv と揃える。片方のキーで opencode と opencode-go の両方にアクセスできるなら、両方を OPENCODE_API_KEY にしてもよい。 UIで登録した場合は、--dump-config と ~/.dsh/.credentials.yaml の refs を見て、apiKeyEnv と同じ名前で保存されているか確認する。 5. dshを起動してモデルを選ぶ npx --yes @deepseek-ai/dsh web ブラウザが自動で開く。開かない場合は、ターミナルに表示されたURLを開く。 画面右下のモデル選択から、次のどちらかを選ぶ。 本番用:opencode-go → DeepSeek V4.1 Flash お試し用:opencode → DeepSeek V4.1 Flash Free モデルピッカーではプロバイダごとにグループが分かれている。opencode と opencode-go は別物なので、ここを取り違えないように注意する。 モデル名は変わりやすい。元記事(2026年8月)では deepseek-v4-flash-free、手元(2026年11月)では deepseek-v4.1-flash-free だった。記事の表記より、ピッカーに表示されている名前を優先してほしい。 AIに任せられる部分 ファイル作成、YAMLの編集、設定の検証、起動、トラブルシュートはAIに任せられる。ただし、APIキーの入力だけは人間がやる。 作業 人間 AI 補足 OpenCodeアカウント作成 ✅ ❌ 支払い・ログイン Goサブスクリプション契約 ✅ ❌ 支払い APIキー発行 ✅ ❌ 秘密情報 dshへのキー登録 ✅ △ UI入力が安全。AIは場所だけ案内 Node.jsの確認 △ ✅ コマンドで確認 プラグイン作成 ❌ ✅ ファイル生成 cordis.patch.yml 編集 ❌ ✅ YAML編集 設定の検証 △ ✅ --dump-config dshの起動 △ ✅ バックグラウンド起動 モデル選択 ✅ △ UIで最終確認 テスト送信 ✅ ✅ ブラウザ自動化があればAI トラブルシュート △ ✅ ログと設定の切り分け コピペ用プロンプト1:セットアップ AIエージェントにファイルを作らせるためのプロンプト。APIキーは渡さない。プロンプト1を使うときは、後述の「設定ファイル」節のプラグインとYAMLも一緒に貼る。 あなたは私のmacOS環境でDeepSeek Harness(dsh)をセットアップするエージェントです。 目的は、dshのwebプロファイルでOpenCode GoのDeepSeek V4.1 Flashを使えるようにすることです。 前提: - Node.js と npx が使える。 - dshは npx --yes @deepseek-ai/dsh で起動できる。 - 私はOpenCodeのAPIキーを持っているが、チャットには貼らない。 - 既存の ~/.dsh/profiles/desktop は変更しない。 - 変更してよいのは ~/.dsh/profiles/web と ~/.dsh/plugins だけ。 作業: 1. 私が貼り付けるプラグインのコードを、~/.dsh/plugins/opencode-headers/index.js として保存する。 2. 私が貼り付けるYAMLを、~/.dsh/profiles/web/cordis.patch.yml に追記する。すでにファイルがある場合は、既存の内容を壊さない。 3. npx --yes @deepseek-ai/dsh --profile web --dump-config を実行し、次を確認する: - opencode-headers が file://... で入っている - llm-pi-ai に opencode と opencode-go がある - agent-default-model が opencode-go / deepseek-v4.1-flash になっている 4. 変更したファイルのパスと、確認結果だけを報告する。APIキーの値は表示しない。 5. dshはまだ起動しない。APIキーの登録は私が行う。 禁止: - APIキーを読む・表示する・ログに出す。 - ~/.dsh/.credentials.yaml を勝手に編集しない。 - 既存のdesktopプロファイルを変更する。 設定ファイル節の file:///Users/yourname/... は自分の環境に合わせて変更する。プロンプト1でAIに渡す場合も、同じパスに直してから貼る。Windowsなら file:///C:/Users/<user>/.dsh/plugins/opencode-headers/index.js のようになる。 コピペ用プロンプト2:起動と検証 dshのwebプロファイルを起動して、設定が反映されているか確認してください。 1. npx --yes @deepseek-ai/dsh --profile web --dump-config で設定を確認する。 2. npx --yes @deepseek-ai/dsh web --no-open --port 5199 をバックグラウンドで起動する。 3. ログから起動URLを取得する。トークン付きURLはチャットに貼らず、私に「ログの場所」だけ教える。 4. 起動ログにプラグインのエラーが出ていないか確認する。 5. 私がブラウザでテストできるよう、URLの場所と、選ぶべきモデル(opencode-go / DeepSeek V4.1 Flash)を案内する。 注意: - APIキーの値は表示しない。 - 失敗した場合は、エラーコード(QUOTA / MISSING_CREDENTIAL / 401 / 403 / UNKNOWN_MODEL)を確認して、推測でキーを書き換えない。 コピペ用プロンプト3:トラブルシュート dshでOpenCode Goのモデルを呼び出したときにエラーが出ました。 次の観点で切り分けてください。 1. モデルの選択ミス - 無料モデルは opencode / deepseek-v4.1-flash-free - Goのモデルは opencode-go / deepseek-v4.1-flash - プロバイダとモデルIDの組み合わせが正しいか 2. 認証情報 - ~/.dsh/.credentials.yaml の refs に、設定した名前(OPENCODE_API_KEY / OPENCODE_GO_API_KEY)があるか - cordis.patch.yml の apiKeyEnv と同じ名前か - 値は表示せず、設定されているかだけ確認する 3. エラーコード - QUOTA / 429 FreeUsageLimitError: 無料枠の上限。Goモデルに切り替える - MISSING_CREDENTIAL: キーが見つからない - INVALID_CREDENTIAL / 401: キーが無効 - 403: モデルへのアクセス権がない - UNKNOWN_MODEL: モデルIDが違う 4. プラグイン - opencode-headers が --dump-config に出ているか - file:// のパスが実在するか - 起動ログにプラグインのロードエラーがないか 変更する前に、現在の設定とエラーの全文を確認してください。 APIキーを推測で書き換えたり、チャットに表示したりしないでください。 コピペ用プロンプト4:プランナー/ワーカー/レビュアー Opus 5.5で計画を立て、DeepSeek V4.1 Flashに渡すときのプロンプト例。 プランナー(Opus 5.5) あなたはシニアエンジニアです。以下のタスクを、DeepSeek V4.1 Flashのサブエージェントが実行できる単位に分解してください。 出力形式: - タスクID - 目的 - 入力(読むべきファイル) - 変更してよいファイル - 完了条件 - テスト/検証コマンド - 依存関係 - 並列実行の可否 制約: - 1タスクの変更範囲は小さくする - 完了条件はコマンドで検証できる形にする - 設計判断が必要な部分は、ワーカーに任せずプランナー側に残す - 不明点は「要確認」として明示する タスク: (ここに依頼内容を書く) ワーカー(DeepSeek V4.1 Flash) あなたはタスク<ID>の実装担当です。以下の計画に従ってください。 - 目的: ... - 入力: ... - 変更してよいファイル: ... - 完了条件: ... - テスト: ... ルール: - 変更してよいファイル以外は触らない - 不明点があれば、勝手に決めずに「要確認」として報告する - 作業後に、変更内容とテスト結果を簡潔にまとめる - 秘密情報(APIキー、トークン)は読まない・表示しない レビュアー(Opus 5.5) 以下の差分とテスト結果をレビューしてください。 観点: - 計画の目的を満たしているか - 変更範囲が適切か - 設計上の一貫性が崩れていないか - テストが十分か - セキュリティ上の問題がないか 出力: - 重大な問題 - 改善提案 - 追加で必要なテスト - マージ可否 設定ファイル 以下は、本番用にOpenCode Goをデフォルトにした場合の設定例。 プラグイン ~/.dsh/plugins/opencode-headers/index.js に置く。内容は元記事のコードをそのまま使っている。 export const name = 'opencode-headers' const OpenCodeHost = 'opencode.ai' const OpenCodeHeaders = Object.entries({ 'user-agent': 'opencode/latest/1.18.18/cli', 'x-opencode-client': 'cli', }) function targetUrl(input) { if (typeof input === 'string') { return new URL(input) } if (input instanceof URL) { return input } if (typeof input?.url === 'string') { return new URL(input.url) } return undefined } function isOpenCodeHostname(hostname) { const host = hostname.toLowerCase() return host === OpenCodeHost || host.endsWith(.${OpenCodeHost}) } export function apply(ctx, config) { ctx.effect(() => { const originalFetch = globalThis.fetch globalThis.fetch = (input, init) => { let url try { url = targetUrl(input) } catch (_notAUrl) { url = undefined } if (url === undefined || !isOpenCodeHostname(url.hostname)) { return originalFetch(input, init) } const headers = new Headers(input instanceof Request ? input.headers : undefined) if (init?.headers !== undefined) { for (const [key, value] of new Headers(init.headers)) { headers.set(key, value) } } for (const [key, value] of OpenCodeHeaders) { headers.set(key, value) } return originalFetch(input, { ...init, headers }) } return () => { globalThis.fetch = originalFetch } }) } cordis.patch.yml ~/.dsh/profiles/web/cordis.patch.yml - insert: - id: opencode-headers name: 'file:///Users/yourname/.dsh/plugins/opencode-headers/index.js' - id: llm-pi-ai name: '@deepseek-ai/dsh-llm-pi-ai' config: providers: opencode: apiKeyEnv: OPENCODE_API_KEY opencode-go: apiKeyEnv: OPENCODE_GO_API_KEY - id: agent-default-model name: '@deepseek-ai/dsh-agent-default-model' config: provider: opencode-go model: deepseek-v4.1-flash opencode と opencode-go は別のキーを使う想定で、OPENCODE_API_KEY と OPENCODE_GO_API_KEY に分けている。同じキーで両方にアクセスできる場合は、両方を OPENCODE_API_KEY にしてもよい。その場合は refs の名前も揃える。 無料モデルで試したい場合は、agent-default-model を次のように変える。 - id: agent-default-model name: '@deepseek-ai/dsh-agent-default-model' config: provider: opencode model: deepseek-v4.1-flash-free credentials.yaml version: 1 refs: OPENCODE_API_KEY: sk-... # OpenCode Zen用 OPENCODE_GO_API_KEY: sk-... # OpenCode Go用 既存の records や他の refs がある場合は消さずに追記する。値は絶対に公開しない。ファイルをGit管理しない。パーミッションは 600 にする。 設定の確認 npx --yes @deepseek-ai/dsh --profile web --dump-config 次の3点を確認する。 opencode-headers が file://... で入っている llm-pi-ai に opencode と opencode-go がある agent-default-model が意図したプロバイダ/モデルになっている dshの起動 npx --yes @deepseek-ai/dsh web ブラウザが自動で開く。開かない場合は、表示されたURLを開く。--no-open を付けると自動オープンを止められる。 つまずいたポイント 1. opencode と opencode-go は別物 ここが一番まごついた。 opencode = OpenCode Zen。無料モデル(deepseek-v4.1-flash-free など)がある opencode-go = OpenCode Go。有料サブスクリプションのモデル(deepseek-v4.1-flash など)がある モデルピッカーでは別グループで表示される。手元では、deepseek-v4.1-flash-free を opencode-go 側で選ぶと「Model is unavailable」、deepseek-v4.1-flash を opencode 側で選ぶと「Model access is disabled」と表示されたことがある。 プロバイダとモデルIDの組み合わせを揃えるのが重要だ。 2. 無料モデルは無料枠が尽きると QUOTA になる 無料モデル deepseek-v4.1-flash-free は、アカウントの無料枠を使う。枠が尽きると、opencode.aiからHTTP 429の FreeUsageLimitError が返り、dshでは QUOTA / 「Request quota exhausted.」と表示される。 これは設定ミスではない。無料枠のリセットを待つか、OpenCode Goのモデルに切り替える。 3. MISSING_CREDENTIAL は名前の不一致が多い cordis.patch.yml の apiKeyEnv と、~/.dsh/.credentials.yaml の refs のキー名が一致していないと、MISSING_CREDENTIAL になる。opencode と opencode-go で別名を使っている場合は、両方の組を確認する。 設定側と保存側で同じ名前を使う。 cordis.patch.yml apiKeyEnv: OPENCODE_GO_API_KEY .credentials.yaml refs: OPENCODE_GO_API_KEY: sk-... 4. file:// のパスは絶対パスで書く プラグインの name は file:// URLで指定する。macOSなら file:///Users/...、Windowsなら file:///C:/Users/... のように、スラッシュの数とドライブレターに注意する。 name: 'file:///Users/yourname/.dsh/plugins/opencode-headers/index.js' 5. UIでモデルを変えると agent-default-model が書き換わることがある dshのUIでモデルを切り替えると、その選択が cordis.patch.yml の agent-default-model に反映されることがある。つまり、UIで選んだモデルが新しいデフォルトになる。 「設定ファイルに書いたのに、次に起動したらモデルが変わっている」と感じたら、UIの選択が保存された可能性を疑う。設定ファイルとUIの両方を確認する。 6. プラグインのUser-Agentは固定値 このプラグインは、手元のOpenCode CLIのバージョン(1.19.4)に関係なく、opencode/latest/1.18.18/cli という固定値を送る。動かなくなったら、OpenCode CLIが実際に送っているUser-Agentに合わせて更新する。 7. これは非公式のワークアラウンド opencode.aiのクライアント判定を回避するためのヘッダー注入なので、OpenCode側の仕様変更で動かなくなる可能性がある。利用規約を確認し、自己責任で使う。APIキーを共有したり、他人のアカウントで使ったりしない。 運用のコツ 計画はOpus 5.5、実行はDeepSeek V4.1 Flash 一番大事なのはこれ。DeepSeek V4.1 Flashは安いが、設計判断まで任せると失敗することがある。計画、タスク分解、受け入れ条件の定義、最終レビューはOpus 5.5に残す。 タスクは小さく、完了条件はコマンドで検証できる形にする ワーカーに渡すタスクは、変更範囲が小さく、テストで合格判定できる形にする。「いい感じに直して」ではなく、どのファイルを、どういう条件を満たすように変えるかを明確にする。 並列化できるものは並列化する 独立した調査、テスト追加、ドキュメント更新は並列に投げやすい。依存関係があるタスクは順番に実行する。 レビューを省略しない 安いモデルの出力は、必ずレビューする。差分、テスト結果、設計との整合性を確認する。最終判断はOpus 5.5に戻す。 キャッシュと使用量を眺める dshのUIにはトークン数やキャッシュヒット率が表示される。同じプレフィックスを繰り返すワークロードではキャッシュが効きやすい。使用量を見ながら、プロンプトの構成やタスクの切り方を調整する。 秘密情報をワーカーに渡さない サブエージェントにAPIキーを渡す必要はない。dsh側で認証を完結させ、ワーカーにはコードとタスクだけを渡す。 まとめ 高いモデルは計画とレビューに、安いモデルは大量実行に分ける OpenCode Goは月$10。Opus 5.5の月$20と合わせて、合計月$30で回せる dshはキャッシュとデコード速度の面で好印象だった(数値は環境依存) ただし、性能値は環境依存。ベンチマークではなく参考値 導入の山場は、opencode と opencode-go の違い、APIキーの参照名、プラグインのパス 人間がやるのはアカウント・支払い・APIキー。ファイル作成と設定はAIに任せられる 「全部をOpus 5.5でやる」構成から、「Opus 5.5で計画し、DeepSeek V4.1 Flashで大量に実行する」構成に変えると、私の手元では同じ予算でできる仕事の量が増えた。まだ試していない人は、無料枠が残っていればまず無料モデルでdshに慣れてから、OpenCode Goに切り替えるとよい。 私はOpus 5.5を崇拝していないが、信頼はしている。信頼しているモデルには、ちゃんと考える仕事をさせたい。実装と調査は、安くて元気なDeepSeek V4.1 Flashに任せる。そのほうが、私は気分よくコードを書ける。 参考 FrontierCS 2(ベンチマーク、2026-11-04時点) frontier-cs.org 元記事:DeepSeek Harness で opencodeの deepseek-v4-flash-free を利用する方法 kagasu.hatenablog.com OpenCode Go opencode.ai DeepSeek Harness(dsh) deepseek-ai/deepseek-harness
Paseo と DeepSeek Harness (DSH) で構築する自律管理型マルチエージェント開発スタジオ Paseo と DeepSeek Harness (DSH) で構築する:100% 自律管理型マルチエージェント開発スタジオの深層 AgDex システム&アーキテクチャチーム 2026年11月2日 読了目安 15分 マルチエージェント設計&データ主権 技術エグゼクティブ・サマリー 単一のターミナル内でコーディングエージェントを孤立して動かす時代は終わりました。本稿では、Paseo のローカルデーモンおよび管理型 Git Worktree と、DeepSeek Harness (DSH) の Cordis プラグイン実行基盤を統合し、完全セルフホストのオープンソース・マルチエージェント開発工坊を構築する方法を徹底解剖します。Direct Provider 通信による思考プロセスのリアルタイム可視化、対話型質問カード、そして計算コスト 83.2%〜92.8% 削減(商用フラッグシップ比では 95% 以上の削減)の実証データを公開します。 1. ターミナルの限界:なぜ単一エージェントの CLI 運用はスケールで破綻するのか 2025年から2026年にかけて、最先端基盤モデルに支えられた自律型コーディングエージェント群——Claude Code(Claude Opus 5.5 / Sonnet 5.5 搭載)から OpenAI Operator / Codex(GPT 6.1 SOL 搭載)、Google Antigravity(Gemini 4 Argon 搭載)、Cursor、Aider に至るまで——は開発者の生産性を飛躍的に高めました。しかし、単機能の生成にとどまらず複数タスクにわたる大規模スプリントを並行処理させようとした途端、深刻なボトルネックに直面します。それは「単一ターミナルかつ単一作業ディレクトリの制約」です。 エンジニアが1つの Git リポジトリ内で複数のエージェントプロセスを立ち上げると、ファイルシステムは大混乱に陥ります。バックグラウンドのビルドウォッチャーがクラッシュし、未コミットのコードが別エージェントに上書きされ、並行実行された Git コマンドが致命的な .git/index.lock 競合を頻発させます。手動で大量の tmux ペインを立ち上げて回避しようとしても、コンテキスト切り替えの認知的負荷は限界に達します。 さらに、商用のプロプライエタリなクラウド環境は、高額なシート課金や不透明なトークン手数料、強制的なテレメトリ送信で開発組織を囲い込みます。Claude opus 5.5、GPT 6.1 SOL、Gemini 4 Argon といった最先端商用モデルは単一タスクで卓越した推論力を発揮するものの、多重エージェントによる連続的なスプリントループを商用クラウド API だけで回し続けることは、組織の API 予算を急速に逼迫させます。現場が真に求めているのは、物理的な作業領域の隔離、複数デバイスからの遠隔操作、そして外部クラウドに依存しない安全な自律型マルチエージェント管理ハブです。 2. Paseo アーキテクチャ:ローカルファースト・デーモンと管理型 Git Worktree Paseo(github.com/getpaseo/paseo)は、分散型ローカルコントロールプレーンによってこの並行制御の課題を根本から解決します。核となる軽量 TypeScript デーモンが各エージェントのライフサイクルを監視し、プロセスI/Oを統括し、デスクトップ(Electron)、Web、モバイル(Expo iOS/Android)へエンドツーエンド暗号化(E2EE)WebSocket を介してリアルタイム中継します。 +─────────────────────────────────────────────────────────────────────────────────────────────────+ | PASEO + DEEPSEEK HARNESS (DSH) MULTI-AGENT ARCHITECTURE | +─────────────────────────────────────────────────────────────────────────────────────────────────+ | | | [ CLIENT ACCESS MATRIX ] | | • Desktop (Electron) • Web Dashboard • Mobile App (Expo / iOS / Android) | | │ (E2EE WebSocket Relay) | | ▼ | | [ PASEO LOCAL CONTROL DAEMON ] (Node / TypeScript) | | • Workspace Manager • Process Supervisor • Diff / Stream Review Engine | | │ | | ┌───────────────────────┼────────────────────────┐ | | ▼ ▼ ▼ | | [ WORKSPACE: feat/auth ] [ WORKSPACE: feat/db ] [ WORKSPACE: test/e2e ] | | • Worktree: slug-auth • Worktree: slug-db • Worktree: slug-tests | | • Branch: feature/auth • Branch: feature/db • Branch: test/e2e | | • Hook: paseo.json • Hook: paseo.json • Hook: paseo.json | | │ │ │ | | ▼ (Direct Provider IPC) ▼ (Direct Provider IPC) ▼ (Direct Provider IPC) | | [ DEEPSEEK HARNESS (DSH) ] [ DEEPSEEK HARNESS (DSH) ] [ DEEPSEEK HARNESS (DSH) ] | | • Preset: PTC (Reasoning) • Preset: Standard (CRUD) • Preset: Minimal (Test Suite) | | • Cordis Plugin Kernel • Cordis Plugin Kernel • Cordis Plugin Kernel | | • Reversible Registers • Reversible Registers • Reversible Registers | | | +─────────────────────────────────────────────────────────────────────────────────────────────────+ Paseo は重量級の仮想マシンを起動する代わりに、管理型 Git Worktree(決定論的に $PASEO_HOME/worktrees/<hash>/<slug>/ 配下に配置)を作業空間の隔離基盤として採用しています。 - 自動ブランチプロビジョニング: origin/main からの自動分岐や個別プルリクエストのチェックアウトを、共通の .git オブジェクトデータベースを共有しながら即座に実行します。 - 自動化されたライフサイクルフック: paseo.json を定義することで、各 Worktree 作成時の依存関係インストールや .env 生成、アーカイブ時の自動クリーンアップを自動化します。 - 仮想マシンのメモリオーバーヘッド皆無: 1インスタンスあたり 1.5GB〜3GB を消費する Docker コンテナとは異なり、Git Worktree のディスク差分はわずか 50MB 未満、起動時間は 180 ミリ秒以下です。 このアーキテクチャにより、Git インデックスのロックやコードの衝突、メモリ不足に悩まされることなく、同一リポジトリ上で 3台、5台、10台のエージェントを同時に安定稼働させることが可能になります。 3. DeepSeek Harness (DSH):Cordis プラグインカーネルの全貌 Paseo がオーケストレーターと作業領域の隔離を担う一方、自律的な推論とツール実行エンジンを提供するのが DeepSeek Harness (DSH)(@deepseek-ai/dsh)です。DeepSeek はエージェント設計において「Agent = Model + Harness」という明快な哲学を掲げています。 従来のフレームワークはツール定義やステートループを単一の巨大なクラスに固定しがちでした。これに対し、DeepSeek Harness は時空間の構成可能性を追求した先進的メタフレームワーク Cordis を採用しており、あらゆる構成要素がプラグインとして設計されています: - モデルアダプタ: DeepSeek V4 Pro、Flash、あるいは vLLM や Ollama でローカル配信されるオープンモデルを柔軟に切り替え可能。 - エージェントループ: 計画立案、内省、反復的なツールディスパッチを司る交換可能な制御ループ。 - ツール&スキル: AST構文解析、ファイル変更、Bash実行、MCP連携を含む動的な拡張機能群。 - セッション&ストレージ: ターン間の状態破壊を防止し、厳格な監査証跡を保証する追記専用イベントログ。 Cordis カーネル最大の工学的強みは「可逆的登録(Reversible Registrations)」です。プラグインやツールがアンマウントされると、関連するイベントリスナー、プロンプト定義、ミドルウェアが自動的に完全ロールバックされ、メモリリークやゴーストツールの残留を根本から遮断します。 DSH はこれらの機能を4つの特化型プリセットにパッケージングしています:Standard(汎用コーディング)、PTC (Program-Time Compute)(深い推論と大規模リファクタリング)、Minimal(トークン消費を抑えた自動テスト)、Creator(高速プロトタイピング)。 4. Direct Provider 対 ACP:高速通信ブリッジの優位性 外部エージェントランタイムをオーケストレーターに接続する際、標準の Agent Client Protocol (ACP) が使われるケースが一般的です。しかし実測検証の結果、ACP は帯域幅の狭い隘路となってしまい、ストリーミング思考の表現力喪失や対話型UIカードの欠落といった制限をもたらすことが判明しました。 この制約を打開するため、オープンソースコミュニティの Jecvay 氏によって開発されたのが paseo-dsh-direct です。DSH を Paseo の内部 IPC 通信路に直接ネイティブ Provider として結合します: 1. リアルタイム推論深度(Reasoning Effort)スライダー: DeepSeek V4 の内部思考プロセスを平坦なテキストに潰すことなく、ストリーミング形式で忠実に描画。 2. 対話型 ask_user_question カード: 曖昧な要件が発生した際、Paseo の UI 上に選択式カードや確認モーダルを直接提示し、1クリックで意思決定を完了。 3. Build vs. Plan 実行前ゲートウェイ: 破壊的なシェルコマンドの実行前に、エージェントへ明確な手順計画の提示を義務付け、人間が事前承認。 4. インフライト・ステアリング(In-flight Steer): エージェントの思考途中であっても、セッションを破棄することなく介入して指示を軌道修正可能。 さらに paseo-dsh-direct はセッションの完全永続化に対応しており、~/.dsh/sessions から過去の実行ログを取り込んで Paseo の Diff ビューア上でデバッグの経緯を即座に再生できます。 5. 実証ベンチマーク:フットプリント測定と開発コスト 90% 削減の実態 Paseo と DSH の実用性を検証するため、実戦的な開発スプリントを想定したストレステストを実施しました:FastAPI マイクロサービスのリファクタリング、Pydantic スキーマの更新、および 4台の並行エージェントによる E2E 統合テストの自動作成です。 +─────────────────────────────────────────────────────────────────────────────────────────────────+ | Table 1: Multi-Agent Concurrency & Isolation Benchmark (4 Concurrent Agents) | +──────────────────────────┬──────────────┬──────────────────┬──────────────┬─────────────────────+ | Concurrency Strategy | Cold Latency | Resident RAM (4x)| Disk Delta | Merge & Git Safety | +──────────────────────────┼──────────────┼──────────────────┼──────────────┼─────────────────────+ | Single Directory (Raw) | Instant (0s) | ~220 MB | 0 MB | ❌ 100% Lock Fail | | Docker / MicroVM (e2b) | 4.2s ~ 7.8s | 7.4 GB ~ 12.0 GB | 4.8 GB | ⚠️ Complex Remote | | Paseo Managed Worktree | < 180 ms | < 340 MB (Shared)| ~120 MB | ✅ Native Clean PR | +──────────────────────────┴──────────────┴──────────────────┴──────────────┴─────────────────────+ 表1 の測定値が示す通り、Paseo の Git Worktree はコンテナ型 MicroVM と比較して起動速度が23倍高速であり、RAM消費量を95%削減しながら、Git インデックスロックを完全に解消しています。 +─────────────────────────────────────────────────────────────────────────────────────────────────+ | Table 2: 3-Agent Parallel Sprint Financial ROI (4.5M Total Tokens) | +──────────────────────────┬───────────────┬────────────────┬───────────────┬─────────────────────+ | Model / Harness Setup | Input Tokens | Output Tokens | Total Cost | Effective Savings | +──────────────────────────┼───────────────┼────────────────┼───────────────┼─────────────────────+ | Claude Opus 5.5 (CLI) | $14.00 (3.5M) | $20.00 (1.0M) | $34.00 | Baseline (0%) | | DeepSeek V4 Pro via DSH | $0.75 (3.5M) | $4.95 (1.0M) | $5.70 | 83.2% Reduction | | DeepSeek V4 Flash Hybrid | $0.35 (3.5M) | $2.10 (1.0M) | $2.45 | 92.8% Reduction | +──────────────────────────┴───────────────┴────────────────┴───────────────┴─────────────────────+ コスト面(表2)においては、Claude Opus 5.5 で 450万トークンのマルチターンコーディングを回すと 34.00 ドルを要します(Claude Sonnet 5.5 では 17.00 ドル、GPT 6.1 SOL などの最先端推論フラッグシップでは 120 ドル以上に急騰します)。一方、プロンプトキャッシュを併用した DeepSeek V4 Pro(DSH経由)では、スプリント全体の総費用はわずか 5.70 ドル(Opus 5.5 比 83.2% のコスト削減) に圧縮されます。さらに、テストコード生成や定型処理に DeepSeek Flash をハイブリッド投入した場合、費用は 2.45 ドル にまで低下し、最大 92.8%(商用フラッグシップ比では 97% 以上)のコスト圧縮を達成します。 6. 実践プロダクションガイド:3エージェント並行スプリントの立ち上げ 自律管理型マルチエージェントスタジオの導入は極めてシンプルです。まず、リポジトリのルートに paseo.json を作成し、隔離環境のフックを設定します: { "worktrees": { "root": "~/.paseo/worktrees" }, "hooks": { "setup": "pnpm install && cp .env.example .env", "teardown": "pnpm test:clean" }, "services": { "dev": { "command": "pnpm dev", "port": 3000, "proxy": true } } } 設定完了後、Paseo CLI から3つの Worktree を瞬時に立ち上げます:paseo workspace create --isolation worktree --mode branch-off --new-branch feat/auth --worktree-slug auth-service --base origin/main。データベース移行とテスト作成用にも同様に実行します。 Paseo デスクトップ UI から、認証エージェントには深い推論を行う PTC プリセットを、DB移行とテスト作成には Standard プリセットを割り当てます。各エージェントが隔離された作業ディレクトリで同時にコードを生成する間、開発者はデスクトップ上で差分を統括レビューするか、外出先から Expo モバイルアプリ経由で PR を承認できます。 7. 自律管理型スタジオの未来と AgDex 連携 Paseo、DeepSeek Harness、そして paseo-dsh-direct の融合は、AI支援開発の主導権が閉鎖的な商用クラウドエディタから開発者自身の手元へ戻りつつあることを証明しています。オープンで自律管理型の編排は、比類なき処理速度、データ主権、そして圧倒的な経済合理性をもたらします: - 完全なデータ主権: ソースコード、Git の履歴、APIシークレットがローカルPCや社内VPCの外部へ漏洩するリスクを完全に遮断。 - 柔軟なモデル選択: エディタ環境を変えることなく、最先端のクラウドAPI(Claude opus 5.5, GPT 6.1 SOL, Gemini 4 Argon)とオフラインのローカルLLMをシームレスに併用。 - SaaS課金の排除: 毎月の高額な座席サブスクリプションに縛られることなく、エージェントの並行数を自由に拡張。 AgDex.ai ディレクトリ では、インタラクティブな 3-Step Stack Finder と連動して本ソフトウェアスタックを網羅しており、Claude Code や DeepSeek などのエンジニアリングツールの検証済みスターターテンプレート、実測テレメトリ、比較ベンチマークを提供して、自律型マルチエージェント群を配備する開発チームを支援しています。 参考情報および検証済みオープンソースリポジトリ 本稿で解説したすべてのツールおよびプラグインはオープンソースとして公開されており、誰でも検証可能です: • Paseo オーケストレーション基盤: getpaseo/paseo(公式サイト: paseo.sh) • DeepSeek Harness (DSH): deepseek-ai/deepseek-harness(npm: @deepseek-ai/dsh) • Direct Provider プラグイン (Jecvay 氏): Jecvay/paseo-dsh-direct • Cordis プラグインカーネル: cordis.moe よくある質問(FAQ) Q1: Paseo の Git Worktree は Docker コンテナと比較して何が優れていますか? Git Worktree は仮想化を行わず、基底の .git データベースを共有する軽量な物理ディレクトリを作成します。起動時間は180ミリ秒未満、追加のRAM消費はゼロであり、Docker のように数ギガバイトのイメージ容量や複雑なボリュームマウントを必要としません。 Q2: 標準の ACP プロトコルではなく paseo-dsh-direct を使う理由は? 汎用の ACP プロトコルはモデル固有の高度な制御機能を切り捨ててしまいます。paseo-dsh-direct を利用することで、DeepSeek V4 のリアルタイム推論深度スライダー、選択肢付き質問カード、および実行前計画承認ゲートウェイにネイティブ IPC 経由でアクセスできます。 Q3: 外部クラウド API を使わず、完全オフラインで動作させることは可能ですか? はい、可能です。Paseo と DeepSeek Harness はどちらも 100% セルフホスト対応です。vLLM や Ollama でローカル配信される量子化版 DeepSeek や Qwen Coder モデルを DSH に接続することで、完全にエアギャップされた無償の開発環境を構築できます。 Q4: 開発デスクから離れている間、どのようにモバイルからレビューや指示を行いますか? Paseo はローカルデーモンと Expo モバイルアプリ(iOS/Android)を結ぶエンドツーエンド暗号化 WebSocket 中継を備えています。開発者は外出先のモバイル回線から安全にリアルタイムのコード差分を確認し、質問に回答してタスクを承認できます。 --- 元記事:AgDex.ai - Orchestrating DeepSeek Harness (DSH) with Paseo: Inside the 100% Sovereign Multi-Agent Software Studio 最新の AI エージェントアーキテクチャ・ベンチマークデータは agdex.ai でご確認いただけます。
DeepSeek Harnessのagent loopは本当に差し替え可能か、patchで壊してみた 「agent loop自体がプラグイン」という主張を検証する DeepSeek Harness(以下DSH)はDeepSeekが公開したdeveloper previewのAIエージェント基盤で、「everything is a plugin」を掲げている。プラグインアーキテクチャを謳うハーネス自体は珍しくないが、DSHのドキュメントは一歩踏み込んで「agent loop自身もプラグインの1つで、差し替え可能」だと明言している。 これが本当なら、DSHは「決まったループの上で動くツールを足す」だけのハーネスではなく、ループ本体まで含めて組み替えられる自作PC的な基盤ということになる。読めば「差し替えられる」とは書いてあるが、実際に差し替えて壊してみた記録は見当たらなかったので、自分で手を動かして確かめた。 土台にあるのはCordis(Koishiのメタフレームワーク、作者shigmaはDeepSeek在籍)というプラグインシステムで、プラグイン単位で登録・解除が可逆に行える設計思想を持つ。「行id単位でconfigを丸ごと差し替えられるpatch機構」と「特権的なコアは無い」というのがDSHの売りだ。 検証環境: Node.js v26.4.0、@deepseek-ai/dsh@0.1.0-rc.6(npm、developer preview版)。ローカルLLM不要でNode.jsだけで完結する。 まず --dump-config でagent-loopの行を見つける npx @deepseek-ai/dsh --profile web --dump-config 490行のYAML構成ダンプが出力される。目的の行はこれだった。 == @deepseek-ai/dsh-base - id: agent-loop name: '@deepseek-ai/dsh-agent-loop' config: agents: [] - id: fs-sandbox name: '@deepseek-ai/dsh-fs-sandbox' - id: llm-deepseek name: '@deepseek-ai/dsh-llm-deepseek' headless profile(1タスクを投げて結果を印字して終了するCLIモード)でも同じ行idが出てくる。profile間で共通のidを持つ行を、ユーザー側の cordis.patch.yml で狙い撃ちする、というのがDSHのpatch機構の建付けだ。 壁その1: name を直接書き換えるとロード段階で拒否される 素直に「同じidのままnameだけ自作プラグインに変える」patchを書いてみる。 - id: agent-loop name: ./stub-agent-loop.mjs config: {} 起動すると、こう言われて無視された。 dsh: [.../cordis.patch.yml] patch: name mismatch for "agent-loop" (expected "@deepseek-ai/dsh-agent-loop", got "./stub-agent-loop.mjs"), skipping 内部で使われている @deepseek-ai/cordis-plugin-include のソースを読むと、これは意図的なガードだった。 if (name && name !== target.name) { warn('patch: name mismatch for %C (expected %C, got %C), skipping', id, target.name, name) continue } コメントには「後続のパッチレイヤーが前のレイヤーが挿入した行を設定・無効化できるように」という設計意図が書かれている。つまり config の丸ごと上書きは許可されるが、プラグイン実装そのもの(name)の無断すり替えは拒否される。「行idを狙ってconfig丸ごと置換できる」というドキュメントの説明は、configフィールドの話であって、プラグイン本体の差し替えには別の手順が必要ということだ。 正攻法は、既存行を disabled: true で無効化してから、insert で新しい行を追加すること。 - id: agent-loop disabled: true - insert: - id: stub-agent-loop name: ./stub-agent-loop.mjs disabled: true はconfigの一部として扱われるのでnameチェックの対象外になり、これは通る。 壁その2: 何もしないstubでもWebサーバーは起動する まずは中身が空っぽの、ログを出すだけのプラグインを差し込んでみた。 export const name = 'stub-agent-loop' export function apply(ctx) { console.error('[stub-agent-loop] apply() called, ctx keys:', Object.keys(ctx).slice(0, 30)) } dsh --profile web で起動すると、あっさり成功した。 [stub-agent-loop] apply() called, ctx keys: [ 'fiber' ] dsh web: 127.0.0.1 curl でルートページを叩くと200が返り、HTML・JSバンドルも普通に配信される。agent-loopの実サービス(ctx.agentLoop)が何も無い状態でも、Webサーバーの起動シーケンス自体は通る。 DSHの「特権的なコアは無い」という主張は、少なくとも起動時の依存関係については本当だった。 (Web UIの会話用APIは独自のtyped RPCプロトコルで、素のcurlでは叩けなかった。ブラウザでの実描画確認は今回の検証環境ではできておらず、そこは未検証として留保する) 壁その3: 実タスクを投げると「no agent factory registered」で即死 headless profileで実際に1タスクを投げてみる。 dsh --profile headless "say hello in one word" 同じ空っぽstubのままだと、今度は構造的なエラーで即座に落ちた。 dsh: no agent factory registered (load an agent-loop plugin) Web起動時とは対照的に、タスクを実行しようとした瞬間に初めて「agent-loopが提供すべきもの」が要求される。 dsh-agent パッケージが持つ AgentRegistry(ctx.agents)は AgentFactory の登録を必須としており、標準の agent-loop プラグインは自身の初期化時に ctx.agents.setFactory(this) を呼んでこれを満たしている。無効化するとこの登録が消え、タスク実行時にエラーになる。 ここが実質的な「最初の壁」だった。 壁その4: setFactory だけ足すと一歩前進する ctx.agents をinjectして setFactory() を呼ぶだけの、createAgent は即エラーを投げるstubに変えてみた。 export const inject = ['agents'] export function apply(ctx) { ctx.agents.setFactory({ async createAgent(ownerCtx, options) { throw new Error('stub-agent-loop: createAgent not implemented') }, async resume(ownerCtx, options) { throw new Error('stub-agent-loop: resume not implemented') }, }) } [stub-agent-loop] createAgent() called with sessionId= session-ea96eab5-11c5-4412-b8b3-4679b670e677 dsh: stub-agent-loop: createAgent not implemented createAgent() が実際に呼ばれ、セッションIDも渡ってくるところまで到達した。次はここに何を実装すれば動くのかという話になる。 最小Agent実装で「1往復の会話」を成立させる dsh-agent パッケージのREADMEと型定義を読み、Agent interfaceが要求する最小限のプロパティ・メソッド(id, options, session, status, ctx, inbox, cancel, whenIdle, runMaintenance, send/followup/steer/inject)を実装した。中身は約70行。 肝は send() の中身で、標準実装(dsh-agent-loop)のソースコードから確認したイベント発行の順序をそのままなぞる。 turn/start → step/start → user/message → assistant/message → step/end → turn/end assistant/message には実際のLLM応答の代わりに固定文字列(缶詰の応答)を、dsh-llm パッケージが公開している createAssistantMessage() ヘルパーで組み立てて入れた。LLM呼び出しは一切していない。 dsh --profile headless "say hello in one word" 結果、次の出力とともに正常終了(exit code 0)した。 [stub-agent-loop] apply() called [stub-agent-loop] createAgent() sessionId= session-00c73f18-e1a4-4006-ad45-c0ec304bd346 [stub-agent-loop] agent entered + announced [stub-agent-loop] send() message role= user target= next-turn [stub-agent-loop] turn closed cleanly, no session invariant error raised stub-agent-loop: no LLM call made, this is a canned reply 最終行がheadlessランナーの標準出力そのもので、dsh --profile headless "<task>" という「1タスクを投げて結果を返す」契約を、LLM呼び出しゼロ・ツール呼び出しゼロの缶詰応答で満たせたことになる。同じstubを web profileにも適用して起動確認したところ、こちらも200応答で立ち上がった(UIでの会話が実際に描画されるかまでは、ブラウザ操作が必要でこの検証環境では確認できていない)。 一番の発見: invariantチェックは標準構成では効いていない 検証を始める前の仮説は「turn/step/tool/* はdurable session eventなので、これを出さない最小ループだとsession logのinvariant(model-visible means logged)チェックに引っかかって落ちるはず」というものだった。 実際には、turn/start〜turn/end の標準順序さえなぞれば session.append() はあっさり通った。--dump-config の出力を見直すと、web/headless どちらのprofileにも invariant companion(dsh-session/invariant や dsh-agent/invariant、READMEに「monotonic sequence numbers, turn/step enclosure, and same-step tool call/result pairing」をチェックすると書かれているオプトインプラグイン)が一切ロードされていなかった。 つまり、ドキュメント上「安全網」として説明されているinvariantチェックは、標準のweb/headless profileには含まれておらず、壊れた自作agent-loopが不正なイベント順序でsessionを汚しても、デフォルト構成では誰も気づかない。 実際に落ちる壁は、invariantではなく、もっと手前の「ctx.agents へのAgentFactory登録」だった。 まとめ 検証項目 結果 --dump-config にagent-loop行があるか あった(id: agent-loop) patchで name を直接書き換えられるか できない(name不一致で拒否される安全策あり) disabled + insert で構造的に差し替えられるか できる 空のstubでWebサーバーは起動するか 起動する(agent-loopは起動時の必須依存ではない) 空のstubでheadlessタスクを実行できるか できない(no agent factory registeredで即死) setFactory() だけで一歩進むか 進む(createAgent()が呼ばれる) 最小Agent実装(約70行、LLM呼び出しなし)でheadlessタスクは完走するか 完走する durable session eventのinvariantチェックで落ちるか 落ちない(そもそもデフォルトでロードされていない) 「agent loop自体がプラグインで差し替え可能」というDSHの主張は、少なくとも構造上は本当だった。ただし実際にやってみると、name の無断すり替えを拒否する安全策があったり、Webサーバー起動とタスク実行とで依存チェックのタイミングがずれていたり、想定していたinvariantの安全網がデフォルトでは無効だったりと、ドキュメントを読むだけでは見えない挙動がいくつも出てきた。「差し替えられる」という一文の裏には、Agent interfaceの契約(inbox、turn/step境界、durable event順序)を自分で満たす責任が乗っている。 今回はDeepSeek APIキーが手元になく、実LLM呼び出しを伴う会話の検証はできていない。缶詰応答での「1往復」止まりという点は留保しておく。
From prose to assertions: making 'done' checkable when an AI agent writes the code The hardest part of an AI coding loop is not getting code written. It is the moment after the agent says "done". When one agent writes the code and another agent reviews it, you have not removed the trust problem — you have just moved it. The reviewer reads the diff, reads the tests, reads the ticket, and produces a verdict. If the ticket says "spacing should be 12vp" and the screenshot looks about right, the verdict is "pass". Two auditors can look at the same delivery and disagree, and nothing in the tooling forces that disagreement to resolve. That is the gap I tried to close in DwGuard-Dsh-Hmos, a plugin for DeepSeek Harness that orchestrates HarmonyOS app delivery: DSH freezes a four-dimension acceptance pack (function / aesthetic / performance / accessibility), runs an adversarial pre-review before dispatch, hands the work to DevEco Code in Goal mode, then audits the delivery with independently gathered evidence. The change I want to write about is small in surface area and large in consequence: acceptance criteria can carry a machine-checkable assertion, and the audit gate recomputes the verdict instead of trusting prose. Three failures of prose criteria My criteria used to be a sentence plus a verification method: statement: 冷启动到首帧 ≤ 800ms (cold start to first frame ≤ 800ms) verify: Profiler 启动分析毫秒数 (milliseconds from the profiler) And an audit check was a result plus free-text evidence: result: pass evidence: 3 runs, 700/720/760ms, screenshot artifacts/perf.png Three problems showed up immediately: 1. Criteria are not executable. "12vp" in a sentence means nothing to a machine. Two auditors reading the same criterion can reach opposite conclusions and both feel right. 2. Evidence is not reviewable. evidence is free text. No tool can tell whether "1200ms" satisfies "≤ 800ms" without a human eyeballing it. 3. The report is not consumable. The verdict lives inside markdown. CI, regression scripts, and the next agent cannot read a field; they re-parse prose. So the audit was still a person voting, with extra steps. The assertion: criteria that can fail by themselves The fix is an optional assertion on each criterion: { "id": "P-01", "dimension": "performance", "statement": "Cold start to first frame ≤ 800ms", "verify": "ms reported by the startup profiler", "weight": "must", "ruleId": "DW-PERF-01", "assertion": { "matcher": "lte", "expected": 800, "unit": "ms", "source": "startup profiler" } } Eight matchers cover the criteria I actually write: | matcher | meaning | |---|---| | equals | numeric comparison when both sides are numbers, exact string otherwise | | contains | substring, case-insensitive | | regex | pattern (unanchored — add ^$ yourself) | | range | within [min, max], inclusive | | gte / lte | numeric greater/less or equal | | oneOf | equals one of a list | | present | non-empty | The audit side then must report an actual value next to the verdict: { "criterionId": "P-01", "result": "pass", "evidence": "three cold starts: 700/720/760ms; screenshot artifacts/perf.png", "actual": "720ms" } One detail matters more than it looks: numeric matchers take the first number inside actual. That means measured values can keep their units — "12vp" parses as 12, "720ms" as 720, "4.9:1" as 4.9. The assertion compares numbers; the report stays human-readable. The rules that make it a gate instead of a suggestion An optional field that nobody enforces is decoration. So the gate has opinions: | situation | result | |---|---| | criterion has an assertion, check says pass, but no actual | error — you cannot pass an assertion you never ran | | criterion has an assertion, check says pass, assertion recomputes to fail | error — audit refused; this is the self-contradiction case | | criterion has an assertion, check says fail, assertion recomputes to pass | warning — something else may have failed it; ask for review | | criterion has an assertion, check says unverified without actual | warning (the existing must-gate already errors) | | criterion has no assertion | unchanged behaviour: human verdict + evidence | | the assertion itself is invalid (unknown matcher, range with no bounds, bad regex) | the spec refuses to freeze with E_CRITERION_ASSERTION_INVALID | Plus a nudge at authoring time: a must criterion whose statement contains numbers but carries no assertion gets W_CRITERION_NO_ASSERTION, because that is exactly where two auditors will disagree later. The subtle rule is the third one. Saying "fail" when the number passes is not always wrong — a screenshot can show a layout bug that a timing assertion cannot see. But the gate should make that mismatch visible instead of silently accepting whatever the reviewer wrote. What it changes in the artefacts Because the verdict is now recomputed, the reports gain a column each: - spec.md and the Goal brief gain an assertion column, so the executor knows which criteria will be measured rather than judged; - audit-<n>.md gains assertion / actual / verdict columns; - the acceptance report's evidence index gains assertion / actual; - rework orders gain a gate problems section — previously a contradicted assertion produced a refusal with nowhere to record why. And audit-<n>.json now contains checks[].assertionVerdict, which means CI can fail a build on verdict: fail without parsing markdown. That was the whole point of making the report consumable. What stays human I want to be careful here, because "machine-checkable acceptance" is easy to oversell. - Assertions only cover what is measurable. "The empty state feels calm" cannot be asserted. It stays a judgement call, and I still write those criteria — they just do not claim to be objective. - The assertion does not collect evidence. Somebody still gathers the actual value: a screenshot with a known device, a dumpsys reading, a layout tree. Evidence files get copied, hashed, and recorded, but the assertion only decides pass/fail from the number. - Thresholds are taste wearing a number. "≤ 800ms" is a decision I made, not a law of physics. Turning it into an assertion makes the decision visible and debatable, which is an improvement, but the number itself is still a human judgement. - Values can be gamed. If the process that produces actual is the same process being audited, an agent can satisfy the letter. That is why the audit playbook insists on externally observable sources — hidumper render stats and hitrace for performance, layout bounds for spacing — and treats in-app timing instrumentation as auxiliary evidence, never the sole basis. The honest result The change shipped as 0.5.0 and the suite went from 49 to 55 tests, all green (six new ones specifically about assertions: accepting valid, rejecting invalid, recomputing, refusing contradictions, refusing a pass without actual, and keeping old packs unchanged). The real payoff is not "the AI is now trustworthy". It is that disagreement became resolvable. When two auditors disagree now, there is a file with a number and a rule that says whether it passes. Either the number is wrong, or the threshold is wrong, or the measurement is wrong — and all three are fixable. Before, the disagreement was just two paragraphs. If you are building an agent loop where one model checks another, the question to ask is not "is the reviewer good". It is: can the reviewer's verdict be recomputed by something that did not write it? Plugin: <Dogwind221/dwguard-dsh-hmos> · npm: <npmjs.com> · listed in awesome-dsh-plugin.
When Coding Agents Watch GitHub: A Practical Safety Checklist Before They Open PRs A coding agent that waits for a prompt is easy to understand. You give it a task, watch the run, and review the result. An agent that watches issues and comments changes the arrangement. It may notice a request, decide whether it is allowed to act, create a separate work session, and return a pull request later. The deepseek-ai GitHub organization hosts a public dsh-superagent research prototype, but its README explicitly says it is not an official DeepSeek product. The README describes it as reference research code, not production-ready software. Its value here is as a design case: the project makes permission and review questions visible. This is not a setup guide for that prototype. I have not installed or tested it. The checklist below is a safer way to evaluate any system that turns GitHub activity into coding work. A new input is also a new trust boundary The prototype's flow is more than "issue in, code out." Its documentation describes sources that receive events, policies that decide who may request work, tickets that hold tasks, and executors that do the coding. Work can return to the conversation where it started. Its setup guide recommends a dedicated agent account and an initial observe mode for work inferred from activity, rather than immediately executing it. That separation matters. A public issue is not automatically an authorized instruction. A comment can include misleading requests, hostile text, or copied instructions from an untrusted source. If that text reaches a model connected to a shell and a write-capable account, it is part of the system's input whether or not the author intended it as a command. GitHub's own Actions security guidance makes a related point: workflow credentials should have the least privilege needed, and default token permissions should be read-only where possible. The same principle applies to an agent. Its model may be capable, but its permissions should assume that some inputs will be wrong or malicious. What the prototype gets right, and what it does not prove The project draws a useful line between a direct request from an allowed person and work inferred from ambient activity. In its documented setup, inferred work begins in observe mode. The operator can see what the system would have done before enabling that behavior. The guide also advises using a dedicated GitHub identity, keeping it separate from the operator's personal account, and requiring human review rather than enabling automatic merging as the default. Those are good starting choices, not a security certification. The same deployment documentation warns that its worker sessions run with broad operating-system access under the operator's user. The account wrappers select GitHub credentials, but they do not isolate the process. A worker may still run programs by path and read files in that user's home directory. The docs recommend a dedicated OS account for isolation. This is the important distinction: separate GitHub identity is not the same as a sandbox. A bot account limits how the agent appears and what it can do in the repository. It does not, by itself, limit what code running on the host can read or execute. The checklist: start with observation, not autonomy Before connecting any always-on coding agent to a real repository, answer these questions in order. 1. Which events can create work? Start with explicit mentions from a small set of trusted accounts. Avoid treating every new issue, every comment, or every conversation as permission to run code. If the tool supports inferred work, keep it in a mode that records candidate tasks without executing them until you have inspected its decisions. Write the rule down in plain language. For example: "Only a new comment that mentions the agent, from an approved account, can start a task." That is easier to test than a vague instruction such as "help with relevant issues." 2. Who is allowed to ask? Use an explicit allowlist. Do not assume that repository visibility, team membership, or an issue label is enough to establish intent. Review who can add accounts to the list and how quickly removals take effect. Try negative tests before real work: an unapproved account mentions the agent; a bot posts a comment; a user edits an old issue to add a mention. The expected result should be no execution and a clear record of why the request was rejected. 3. What can the agent's GitHub identity change? Create a separate account for the agent, then grant only the repository access required for its task. Keep merge rights with people. Make the agent's branches easy to identify, and ensure its comments and commits are visibly attributed to the agent rather than to a human maintainer. Review token scopes and repository permissions directly. If the agent only needs to read issues and create branches or pull requests, do not give it organization-wide administration or access to unrelated repositories. Recheck permissions when the tool or workflow changes. 4. What can the process read on the host? This is easy to miss when setup instructions focus on GitHub accounts. Find out which operating-system user runs the agent, which directories it can read, whether its shell can access environment variables, and where credentials are stored. Check whether its tools can reach internal network services. Use a dedicated OS account or a properly isolated execution environment when the agent handles untrusted issue text. Keep secrets out of the agent's checkout and home directory where possible. A wrapper that changes which GitHub account a command uses is helpful, but it is not a process sandbox. 5. Can text in the task change what the agent is allowed to do? Prompt instructions are not a permission boundary. Define limits outside the model too: allowed repositories, allowed commands, network access, branch rules, and whether secrets are available. Treat instructions quoted inside issues, pull requests, logs, and linked pages as untrusted data unless a trusted person explicitly confirms the task. 6. What has to pass before a pull request is ready? Require the same checks you expect from a human contribution: tests, formatting, dependency review, and a human reading the diff. The agent should explain what it changed, which tests it ran, and what it could not verify. A green check means the configured checks passed; it does not mean the request was safe or correct. Keep automatic merge disabled while you learn how the agent behaves. A pull request is a review boundary, not a guarantee. If the agent can merge its own changes, review whether that permission is genuinely necessary and what happens when tests are incomplete or the change touches sensitive code. 7. How will you stop and investigate it? Know how to pause event intake, stop active workers, revoke credentials, and inspect logs before enabling the service. Decide who receives alerts for stuck tasks, repeated retries, or unexpected repository writes. Test the stop path before the agent has access to valuable credentials. A low-risk rollout in three stages A small rollout makes failures easier to understand. - Stage one: observe. Connect a test repository or a narrow set of events. Let the system record what it would do. Compare its decisions with what maintainers actually want. - Stage two: prepare changes. Permit a dedicated account to create branches and draft pull requests in a low-risk repository. Keep a person responsible for every review and merge. - Stage three: expand one permission at a time. Add more requesters or repositories only after you have checked false triggers, quality, noisy behavior, and recovery. Do not change event access, host access, and merge rights together. If something goes wrong, you need to know which new permission caused it. Keep a short record of expected behavior for test cases: who requested work, what event started it, what the agent was allowed to do, which checks ran, and who approved the result. This creates evidence for a decision to widen access, rather than relying on a few impressive demonstrations. The useful idea is the workflow, not the word "autonomous" DeepSeek's prototype points to a real design problem: a team may want one agent to carry work across messages, code changes, and review comments without making people restate the task in every session. That can save coordination effort. It also means the agent becomes a long-running participant with access to event streams and execution tools. The project itself is careful to label its public implementation as a research reference, not production-ready software. Its documentation also exposes tradeoffs that a launch headline can hide, including broad host access and the need for a separate operating-system boundary. Those caveats are reasons to test it as an operations system, evaluating both its code and the safeguards around it. A useful rule is simple: automate the preparation of a change before automating permission to apply it. Start with narrow inputs, limited credentials, isolated execution, visible drafts, and human approval. Expand only when the logs show that the system follows those limits consistently. Before enabling an issue-to-PR agent, check: - Only approved people can create an executable request. - Inferred work is observed before it is allowed to run. - The agent uses a dedicated, narrowly scoped GitHub identity. - Its operating-system access is isolated from personal files and secrets. - Pull requests require human review and do not merge themselves. - You can pause the service, revoke access, and inspect its actions. I write about software engineering and AI systems. Subscribe if you want practical, source-based guides like this one. Have you let an agent act on GitHub issues or pull requests? What permission limit would you set first? Sources: DeepSeek dsh-superagent prototype, DeepSeek setup guide, DeepSeek deployment and permissions guide, DeepSeek project philosophy, GitHub Actions secure use reference.
¡Muy interesante esto de DeepSeek! Ha lanzado de código abierto DSH SuperAgent Un agente de código que escucha eventos de un repo de GitHub y crea Pull Request de forma autónoma Lo mejor es que explica paso a paso cómo está montado: deepseek-ai/dsh-superagent-prototype t.co
我把自己的 Agent 从 Wails 迁到了 MyGo 原生 GUI,全程踩坑和实践分享 最近把自己写的工作 agent [Ally agent]( Bronya0/ally-agent) 的界面重写了一遍,起因是无意中看到有人推荐 MyGo ,加上我对内存和性能一直有点追求,多年来一直在用 wails ,想换个试试,就想拿自己的项目试点,没想到结果意外的不错。 旧版本的技术栈是典型的 Go + Wails + Vue (wails 我用了很多年 最近终于 V3 发正式版了 等了四年,可惜我也老了),界面用 Naive UI ,样式美观,效果也相当不错。但做久了有几个地方比较麻烦( tarui 应该也是一样): 跨平台界面的细节不一致,构建链比较长,还有前端内存出了问题以后,我这个写后端的人不太容易排查。 折腾了一段时间,现在主要页面已经迁到 [MyGo]( egoist/mygo) 了,记录一下过程中比较有感触的地方。 先说一下技术路线:Wails 的界面通过系统 WebView 展示网页; MyGo 既支持这种方式,也支持用 Go 写 Native UI ,由框架自己绘制。WebView 也有自己的优势,MyGo 两种都支持,相当于有个兜底,下面会说。 Ally 现在的聊天、设置等常用页面用 Native UI ,插件页面和部分预览仍然按需使用 WebView 。 一、UI 跨平台一致性 这是我这次迁移最重视的一点。 之前用 Wails 做界面,Windows 上调好的页面,到了 macOS 上经常还要再看一遍。字体、行高、滚动条、输入框这些地方,偶尔就会有一点不一样。 比如我画的表格,不知道为啥线条在 macOS 上看着发虚,Windows 上就正常。单看问题都不大,但调整完一个平台还得顾着另一个平台,挺烦的。 Wails 使用系统 WebView ,Windows 和 macOS 背后的浏览器引擎不一样,前端样式最终要经过各自的渲染实现。 MyGo 的 Native UI 由框架自己负责布局和绘制。迁移后,我在 Windows 上调好的主体界面,拿到 macOS 上看到的效果接近得多,需要针对平台单独修的地方也少了。 当然,自绘也不等于所有像素都完全一致。MyGo 的文字排版仍然使用[各平台的文字系统]( mygo.egoist.dev):Windows 是 DirectWrite ,macOS 是 Core Text ,Linux 是 Pango 。字体回退、DPI 、输入法这些还是要分别检查。但至少不用再同时处理两套 WebView 引擎带来的样式差异了。 以前总觉得 Electron 重,碰到这些问题后倒是能理解为什么有些项目愿意用它:自带 Chromium ,渲染环境相对好统一。OpenCode 桌面端后来也[从 Tauri 换到了 Electron]( github.com/anomalyco/opencode/blob/dev/packages/d…),不过人家具体为什么换,我就不瞎猜了。 二、内存问题现在能用熟悉的 Go 工具查 以前 Wails 版本的 Go 后端一样可以用 pprof,但界面在 WebView 里,Go 堆、JavaScript 堆、DOM 、浏览器渲染进程是几块不同的东西。 前端也有 DevTools ,可以拍 JS heap snapshot 、查 DOM 引用。但我平时主要写 Go ,遇到界面内存持续上涨,分析起来没有 Go 那么顺手。 现在主要界面和业务都在 Go 进程里,我给 Ally 加了一个按需导出诊断的入口:在设置里点“导出内存诊断”,会导出 heap.pprof、allocs.pprof、goroutine.pprof 等文件。 比如在空闲时导出一次,复现内存增长后再导出一次,就可以对比: go tool pprof -http=127.0.0.1:0 \ -base=before/heap.pprof after/heap.pprof heap 主要看还活着的对象,allocs 主要看累计分配。分配量大不一定是泄漏,也可能是某段代码反复创建临时对象,GC 能回收,但会持续消耗 CPU 。 当然,pprof 主要看到的是 Go 堆。系统和 GPU 资源,以及 WebView 子进程的内存,还是得用其他工具看。 三、帧处理的坑 MyGo 的界面更新会重新构建控件树,写 UI 时要特别留意渲染函数里做了什么。 我的 Agent 有命令执行卡片,命令输出可能很长。之前即使卡片折叠着、界面上只展示最后几行,代码仍然会先把整段输出拆分、去空行,再取出末尾几行。 看起来只是一个字符串处理函数,但界面更新时会反复执行。 后来改了两处: 1. 只需要末尾几行时,从字符串尾部向前扫描,不再先拆分整个输出。 2. 需要重复使用的派生结果按原始内容缓存;内容没变就复用。折叠时不构造展开用的行数据,并释放对应缓存。 一次本地测试里,用两万行命令输出测试折叠卡片的相关处理,单次分配从约 1.9 MB 降到 1.9 KB ,耗时从约 0.72 ms 降到 0.02 ms。 这是这段处理在该样本下的局部结果,不是整个应用的性能对比。[对应修改在这里]( github.com/Bronya0/ally-agent/commit/a1e085b9397e…)。 类似的问题还有工具参数 JSON:同一条消息的卡片头、卡片体都可能读取参数,如果每次渲染都 Unmarshal 一遍,长对话里分配会越来越明显。现在把解析结果挂在控件局部状态上,原始参数变化时才重新解析。 我的感受是,性能问题要先分清楚是“每次请求执行一次”,还是“界面更新时每帧执行一次”。后者哪怕单次看着不重,乘上帧数和控件数量也很拖累性能。 四、构建链变短 旧项目的构建大致要经过前端依赖、绑定生成、Vite 构建,再编译 Go 。MyGo Native UI 的主要页面直接用 Go 写,主界面去掉了前端打包这一步,我自己的项目构建起来明显快了不少。 MyGo 不依赖 CGO ,交叉编译也省事。目前 Ally 的构建脚本可以在 macOS 上处理 Windows 、macOS 、Linux 的 x64 和 ARM64 六个目标,另外生成 macOS Universal 包。 例如编译一个 Windows x64 二进制,核心就是: CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o Ally.exe . 实际发布还要处理资源、压缩包、签名等事情;能交叉编译出来,也不代表已经在目标系统完成运行验证。Linux 的图形环境和使用 WebView 时需要的系统库,也仍然要考虑。 这里补充一下:我刚看了 [Wails 3.1 的发布说明]( wails.io),它也加入了无 CGO 构建能力。目前 macOS 和 Linux 的 purego 后端还是实验性质,CGO 仍是默认选项。 所以“无 CGO”以后不一定是两者之间的主要区别。对我这个项目来说,更明显的差别是主界面不用再经过 Vue 那套构建流程了。 五、MyGo 组件够用,但 Web 生态还是强很多 迁移前我担心原生 GUI 要从头写一堆控件,实际比想象中好一些。 MyGo 已经有常见的表单、列表、树、弹窗,也有代码编辑器、Diff 、Markdown 等组件。Ally 的文件浏览和代码编辑用到了它的编辑器,聊天内容也用到了 Markdown 相关能力。 但如果和成熟的 Web 组件库比,差距还是很明显。Naive UI 这类库积累了很长时间,一个表单、选择器或者弹窗拿来就能用,样式、焦点、键盘操作、动画都比较完整。 好在 MyGo 的定制能力不错,但要做出自己满意的效果,颜色、间距、状态和交互细节还是得花时间。我之前不太想碰这类原生 UI ,一个原因就是觉得手写样式太累。 现在有 AI 帮忙,这件事容易太多了。先用框架已有组件和 Base/Parts API ,让 AI 根据目标效果调整样式,再自己检查实际交互。 我的经验是,尽量复用组件本身的焦点、键盘导航、浮层和滚动行为,别为了改外观把这些重新实现一遍,非常容易踩坑。 六、WebView 的优势还在,可以混合使用 WebView 最大的好处之一就是生态。 视频播放、复杂图表、各种文件预览,Web 上已经有大量现成方案。很多东西如果坚持全部原生重写,维护成本很高。 MyGo 可以在 Native UI 窗口里嵌入 WebView ,所以我的做法是:常驻界面用原生 UI ,需要 Web 生态的地方再创建 WebView 。 Ally 目前的 HTML 和 Mermaid 预览就是这样处理的。预览可见时按需创建,数量做限制,离开后释放。否则一个长对话里出现很多图表时,每个预览都长期挂着 WebView ,前面省下来的资源很容易又花回去。 迁移后日常使用的内存占用和响应都有比较明显的改善。不过我还没有整理同一机器、相同会话和操作条件下的完整对照数据,暂时不拿具体数字比较两个框架。 七、插件化是 Go 里比较麻烦的东西,需要谨慎考虑 这是迁移前有点低估、做起来以后感受很深的一点。 看看 [DeepSeek Harness 的 Web Client 架构]( github.com/deepseek-ai/deepseek-harness/blob/mast…),它有插件加载、服务、事件和 UI Slots ,插件可以在已有界面里贡献功能。 Web 技术和 JavaScript 的动态加载能力,让这类扩展比较容易分发和迭代。当然,WebView 本身不会自动提供插件体系,生命周期、扩展点和权限边界都得应用自己设计。 纯 Go 桌面应用要做同样的事就麻烦得多。[Go 标准库的 plugin]( pkg.go.dev) 不支持 Windows ,加载后也不能卸载,对编译工具链和依赖版本还有要求,不适合直接拿来做一个跨 Windows 、macOS 、Linux 的热插拔 GUI 插件市场。 最后 Ally 还是用了混合方案:主程序是原生 UI ,插件页面按需跑在 WebView 里。插件可以打成 zip 安装,在侧栏增加页面,通过宿主提供的接口访问存储、HTTP 和工作区等能力;重新导入后可以更新,不用重启整个应用。 目前这更接近“可插拔页面”,和 DSH 那种能扩展更多核心能力的插件体系不太一样。WebView 也有自己的生命周期和资源成本,要做成完整生态,扩展点、兼容性和权限模型还有不少事要解决。 代码 大概就这些,迁移完之后我自己还是比较满意的,欢迎大家一起尝试原生界面 我的项目代码在 [Ally 仓库]( Bronya0/ally-agent): Bronya0/ally-agent 原来的 Wails 版本还在 main 分支,MyGo 版本在 [mygo 分支]( github.com/Bronya0/ally-agent/tree/mygo),感兴趣或想学习 MyGo 的可以对比着看,欢迎点个 Star 。
DeepSeek が描く AI エージェントの未来像 DeepSeek が Super-agent という AI エージェントの構想を公開しました。利用者と会話を続けながら複数の仕事を進め、GitHub やチャットの変化にも対応します。人が作業やセッションを管理する負担をどう減らすのか、既存のエージェントとの違いも含めてまとめました。 TL;DR Super-agent は仕事の進行やセッションの管理をシステムへ任せ、人が細かく指示・確認する負担を減らす構想です。 利用者との会話と仕事の振り分けは Router、個々の作業は Worker が担当します。GitHub やチャットの通知も受け取り、対応が必要なものを担当へ届けます。 Router と Worker をクラウドで動かし、自宅PCのコードや開発ツールを使って作業する構成も想定しています。 利用者が複数サービスで組んでいる仕組みを、AI ベンダーが体系化して提供してくれることに期待しています。 Worker もクラウド側にあるため、自宅PCとの接続や GUI・ブラウザ操作が安定して動くかは気になるところです。 はじめに DeepSeek Harness のチームが、Exploring Super-agent Design: Towards a More Autonomous Agent System という設計記事を公開しました。 元記事では、仕事の振り分けやセッション間の情報の引き継ぎをシステムへ任せ、人が細かく指示・確認する負担を減らす設計を提案しています。その分、人が仕事の目的や優先順位を決めたり、成果を確認して承認したりすることに集中できるようにする狙いです。 以前、Work や dot から自宅PCの Codex へ仕事を依頼する構成を記事にしました。今回の構想では、利用者との対話と実作業を分担する仕組みを、エージェントの実行基盤として扱っています。 自分でも仕組みを理解しておきたかったので、元記事の設計を既存のエージェントと比べながらまとめてみました。 DeepSeek の Super-agent 構想 Super-agent が目指すのは、人が個々のセッションを操作して仕事を進める負担を減らし、複数の仕事を継続して任せられるエージェントです。人は目的や優先順位を伝え、必要な場面で判断や承認を行います。その間の仕事の振り分けや情報の引き継ぎを、システム側が受け持つ設計です。 元記事では、モデルの能力が上がるにつれて個々の仕事への監視や細かな指示が減ってきたと説明しています。複数のエージェントを連携させる能力も上がり、別々のセッションへ仕事を分担する使い方も可能になってきました。 Claude Code や Codex で複数の仕事を進めるときは、実装用や調査用のセッションを分けて使うことがあります。文脈が混ざらない一方で、進捗の確認や対応するセッションへの追加指示は利用者が行う必要があります。 個々の仕事を任せられるようになっても、どのセッションが何を知っているかを人が覚えておく必要があれば、同時に任せられる仕事の数は人間の注意力に制限されます。元記事では、モデルの能力向上に伴って、この人間側の負担が生産性を制限するようになると説明しています。 そこで、担当を決めて必要な情報を届けるところまでエージェントの仕組みに含めます。人からの指示に加えて GitHub やチャットの変化も受け取り、対応が必要な仕事を進めます。途中で判断が必要になったときや成果の確認を求めるときには、人へ戻ってきます。 利用者が話す相手や場所を変えても、それまでの依頼を踏まえて対応する。作業中にも別の仕事を引き受け、異常があれば復旧する。こうした動作を継続して行えるように、エージェントの実行基盤を設計し直すのが Super-agent の構想です。 比較の出発点として、ローカルのエージェントを仕事ごとに起動する構成を描くと次のようになります。 利用者が仕事ごとのセッションを管理する構成 Super-agent では利用者とのやり取りを受け持つ Router と、仕事を実行する Worker を分けます。会話や作業の記録は実行プロセスの外へ保存し、コードや開発ツールがある環境にも接続します。 DeepSeek の Super-agent 構想 利用者は実装を頼んだ後に別の調査を依頼しても、同じ Router と話を続けられます。担当は裏でそれぞれの仕事を進め、結果や相談が必要な点を Router へ返します。チャットから始めた仕事について、後から GitHub の PR に書いた追加指示を受けて進めることも想定しています。 元記事が挙げる性質は次のとおりです。 性質 目指す動作 Continuous チャットや GitHub などやり取りする場所が変わっても、同じエージェントとして文脈を保つ Productive 複数の仕事を並行して進め、作業中にも次の依頼を受ける Proactive 外部の出来事を確認し、対応する価値があるものに自ら取りかかる Persistent 継続して稼働し、必要な作業環境へ接続しながら異常から復旧する これを Router と Worker の分担やイベントの処理、非同期のやり取りによって実現します。実行処理と状態・環境を分けることや、外側から監視する仕組みも含まれます。ハーネスを含む実行基盤全体の設計が話の中心になります。 仕事ごとのセッションは内部に残ります。その管理をシステムへ任せ、利用者が毎回どのセッションを開くか考えなくても済むようにする構想だと理解しました。 利用者との対話と作業担当の分担 Router は利用者との会話を続けながら、新しい仕事を Worker へ振り分けます。進行中の仕事との関係や、複数の仕事にまたがる判断も扱います。 たとえば、ある不具合の修正を頼んだ後に別のライブラリの調査を依頼したとします。修正は Worker A、調査は Worker B が担当し、Router は両方の状況を把握して利用者と話を続けます。 Router 自身は実作業を行いません。元記事では Bash ツールを持たなくてもよく、軽いモデルで速度と品質を両立できる場合が多いとしています。会話を担当するモデルが実装や長い調査に取りかかると、その間の会話や別の依頼への応答も遅くなるためです。 Worker は仕事ごとに分かれた文脈と、実作業に必要なツールを持ちます。不具合の原因を調べてコードを直す担当と、ライブラリの仕様を調べる担当では、途中のログや推論を共有し続ける必要はありません。各 Worker が作業を進め、重要な結果を Router へ報告します。利用者への返答は Router がまとめて行います。 別の担当へ仕事を任せる点は、一般的な orchestrator / worker 構成やサブエージェントと共通しています。ただ、複雑な仕事を細かい作業へ分ける orchestrator と、ここでいう Router では担当範囲が違います。Router は独立した仕事の振り分けと全体の調整を行い、一件の仕事の詳細な計画や分割は Worker 側が受け持ちます。 Worker はその仕事に必要ならさらにサブエージェントを使えます。たとえば機能追加を担当する Worker の中で、設計・実装・テストを分担する Agent Team を動かす形です。Router と Worker は役割の区分なので、必ずそれぞれが一つのセッションになるという意味でもありません。 外部イベントと作業中の追加指示 継続して仕事を進めるには、最初の依頼に加えて、その後に起きたことも受け取る必要があります。 修正した PR にレビューが付く。CI が失敗する。チャットで変更の相談が出る。元記事ではこうした外部の出来事を Trigger として扱います。 すべてをモデルに判断させると、関係のないメッセージにも推論が必要になります。そこで、送信元や対象のグループなど、決まった条件で判定できるものはプログラムで先に絞ります。そのうえで、内容を読まないと対応の要否が分からないものをモデルに判断させます。元記事の Fast Path / Slow Path はこの分担です。 担当が決まった後の続報にも、毎回 Router の判断は必要ありません。 たとえば Worker A が PR の修正を担当するなら、その PR に関する通知の届け先として Worker A のセッションを登録します。コメントや CI 結果の通知が届くと、プログラムがこの登録に従って Worker A へ直接送ります。通知のたびに Router のモデルが担当を選び直す必要はありません。 元記事の subscription (購読) は、この通知先の登録を指しています。PR やチャットのスレッドごとに届け先を登録し、後続の通知をプログラムで振り分ける仕組みです。届いた内容を読んで対応を考えるのは Worker です。 まだ担当のいない新しい仕事や、担当をまたぐ調整は Router が扱います。Worker も重要な結果を Router へ報告するので、Router は全体の状況を追いながら利用者とやり取りできます。 作業中の追加指示を受け取るため、ツールの実行も非同期にします。長いビルドを開始したら、完了までその呼び出しの中で待ち続けず、結果が後からイベントとして届くようにします。その間に届いた追加指示も、現在のモデルの推論ステップが終わった時点で扱えます。 これならビルド中に方針が変わっても、ビルドの終了まで会話を止めずに済みます。単に裏でコマンドを実行するだけでなく、作業の途中にも入力を受け取れるようにする設計です。 長く動かすほど増える履歴にも工夫があります。直近で必要な情報はコンテキストへ入れ、長い内容や古い記録は外へ置いて参照を残します。過去の仕事が再び話題になったら、その参照をたどって必要な記録を読み直します。元記事では Inline & Spill、Chain of Recall と呼んでいる仕組みです。 実行処理・履歴・作業環境の分離 この構想ではエージェントの実行処理と履歴をクラウドへ置き、実際に作業する環境を必要に応じて接続します。 Agent Loop はモデルに問い合わせ、返ってきたツール呼び出しを実行へつなぎ、その結果をモデルへ返す処理です。これを実行するプログラムと、残しておきたい会話や作業の記録を分けます。 分ける対象 置き場所と役割 Agent Loop クラウドでモデルへの問い合わせとツール呼び出しを取りまとめる 会話履歴・作業状態 外部のデータベースなどへ保存し、実行処理を起動し直しても読み出せるようにする 作業環境 コードや SDK、ファイル、アプリがあるPCなど。必要な処理を実際に行う Agent Loop のプロセスが落ちても、記録は外へ残ります。別のプロセスがその記録を読み直せれば、同じ仕事の続きを扱えます。実行中の一つのプロセスを生かし続けることと、仕事の継続を分けて考えるわけです。 元記事でも、Anthropic の Managed Agents の設計記事を参照しています。こちらもハーネスとセッションの記録、作業環境を分け、それぞれを交換できるようにする設計です。 DeepSeek が特に接続先として挙げているのは、利用者が普段使っているPCです。自宅PCには未コミットの変更や、そのPCで使っている開発ツールがあります。すべてをクラウドへ複製する代わりに、作業環境をそのまま使います。 PC側にはコマンドを実行して結果を返す軽量な daemon を置きます。会話や仕事の状態はクラウド側で管理し、Agent Loop が必要な処理をPC側へ依頼する形です。元記事では BYOM (Bring Your Own Machine) と呼んでいます。クラウドの環境や、必要なときに作る環境も接続先に含まれます。 この構成なら、自宅PCを閉じてもクラウド側での対話や記録は維持できます。そのPCが必要な作業は接続を待ち、再びオンラインになったときに進める想定です。 継続運用には外側から状態を見る Watchdog も置きます。プロセスの停止や API エラーだけでなく、同じ作業を繰り返して進んでいない状態や、目的からのずれも確認します。Watchdog 自身もツールを持つエージェントのセッションで、主な実行処理とは別に監視や復旧を行います。 以前の自分の構成では、クラウド側の dot からローカルで動く Codex などの作業担当へ依頼していました。Super-agent の構想では Worker の Agent Loop もクラウド側に置き、ローカルPCにはコマンドを実行して結果を返す daemon を置きます。 以前は作業担当がPC上で動いていたので、そのPCの GUI やブラウザを操作するツールを直接使えました。Worker がクラウド側にあると、手元の画面を確認したり操作したりするためにも、クラウドとPCの間でやり取りする仕組みが必要になります。クラウドに用意したブラウザで調べる仕事と、自宅PCのアプリや既存のブラウザを使う仕事では、接続先も変わります。 クラウド側で操作を判断し、PC側のプログラムに画面取得やクリックを実行してもらう形が考えられます。会話や仕事の記録が残っていても、通信が切れる前と同じ画面が開いているとは限りません。接続が戻ったら操作対象の状態を確認し、その状態に合わせて続きを進める必要があります。 操作の指示や結果がクラウドとPCを行き来するため、途中で止まったり、結果がうまく戻らなかったりしないかは気になります。画面の取得から操作結果の確認、通信断後の再開まで、基盤側で安定して扱えるようになることを期待しています。 構想の一部を実装した dsh-superagent-prototype も公開されています。README には内部版や設計記事と同一ではなく、記事中の将来構想には未実装のものもあると明記されています。ここで説明した全体像がそのまま完成した製品として使える段階ではないようです。 既存のエージェントとの比較 Claude Code や Codex でもサブエージェントへの分担やクラウドでの作業、離れた端末からの追加指示ができます。Cowork にも複数段階の仕事を任せ、クラウドで並行して進めたり定期実行したりする機能があります。 Super-agent の構想で整理されているのは、そうした機能を継続的な仕事の流れとしてどう組み合わせるかです。利用者と話す担当や続報の届け先に加え、記録の保存と作業環境への接続まで設計しています。 利用体験としては Grok Bot や ChatGPT dots、Claude Duet にも近い部分があります。 製品 公式に説明されている仕組み Super-agent と重なる部分 Grok Bot 専用のクラウドPCで常駐する Bot。まとめ役と専門の Bot が連携し、スマホやデスクトップから仕事を頼める 会話を続ける担当と、複数の担当による仕事の分担 ChatGPT dots 継続的な仕事を引き受け、会話の合間も作業を進める。Work や Codex へ仕事を依頼して進捗を扱う 会話を続けながら別の担当へ作業を任せる構成 Claude Duet 継続する会話と専用のクラウドPC・ブラウザを持ち、接続したアプリを確認して必要な結果や判断依頼を知らせる 常時動く作業環境と、必要なときに人へ戻るやり取り Claude Duet は現時点では research preview で、接続したアプリを一定間隔で確認します。 Grok Bot や dots、Duet を見ると、普段の会話を保ったまま裏で仕事が進む使い方は想像しやすくなります。DeepSeek の記事は、その使い方を実現するための実行基盤を具体的に説明しているところが面白いと感じました。 おわりに 仕組みを追っていくと、最近見かける Grok Bot からほかのエージェントへ仕事を任せる構成に近いと感じました。以前自分が組んだ dots 基盤も、会話を担当するエージェントと実作業を進めるエージェントをつなぐ点では同じ発想です。 利用者が複数のサービスを組み合わせて作っているこうした仕組みを、AI ベンダーが体系化して提供してくれると面白そうです。サービス同士のつなぎ方や仕事の引き継ぎを自分で組まなくても済むなら、より多くの人がエージェントに仕事を任せやすくなると思います。 自分は以前、dot との接続がうまくいかず、結局使わなくなりました。その経験もあるので、Worker までクラウド側へ移る構成で自宅PCとのやり取りがどう扱われるかは気になります。普段の開発環境や GUI・ブラウザの操作まで含めて安定して使えるなら、かなり自分の使いたい形に近づきそうです。