この2週間、Stack 連載で L1 Runner(Fact)、L2 Ollama(Inference)、L4 MCP(Context) を順に立ててきた。読者から繰り返し聞くのは一言:「ツールは全部つながったのに、毎日まだ手でフローを繋いでいる。」 Claude Code は diff を出せ、MCP は GitHub の Context を引ける、Runner は push 後に緑になる——それでも「issue #142 を直して PR」はターミナル前に40分座り込みが残る。
それが L5 · OpenHands の問いだ。もう1本 CLI を買う話ではなく、Cloud Mac をツール集合から多段工程を自律で走らせる Agent プラットフォームへ上げる。本稿は L5-Q01 · R1 · シリーズ Hub:読者を「コーディングツール」から「Agent プラットフォーム」の認知へ運ぶ——Workflow が Stack のどこにいるか、OpenHands vs Claude Code が置き換え関係でない理由、典型タスク、OpenHands self-hosted on macOS の構成。Docker インストール手順は含まない(それは L5-Q02 の SEO ランディング)。
Cloud Mac AI Stack · シリーズスローガン(第四の輪)
Claude Code は Diff、GitHub Runner は Fact、OpenHands は Workflow を生む。
MCP が Context、Ollama が任意の Inference。Workflow は Context / Diff / Fact を消費し、ループ内で後二者を何度も呼ぶ——一方向パイプラインではない。詳細は Stack 言語。
「ツール集合」罠:どれも優秀、鎖全体はまだ人力
現場でよく見る1週間(顧客 repo で何度も確認した形):
- 月曜:Claude Code で API 層、MCP で GitHub issue 一覧——セッション内は順調。
- 火曜:別マシンから push、Runner が赤——Agent の変更と CI スクリプトが揃っていない(L1 実行エンジン未読だとここで繰り返す)。
- 水曜:手動テスト、設定変更、また Claude Code でファイル補完。
- 木曜:ようやく緑、だがドキュメント、マイグレーション、サンプルテストが欠ける——「コード変更」と「要件納品」が同一視されていた。
ツール集合とは:各ステップに最適ツールはあるが、「要件全体」に責任を持つ層がない。 Agent プラットフォームが足すのは、自分でタスク分解・実行・失敗からの再試行ができる Workflow 層——OpenHands は Stack でそれを担う OSS 選択肢(旧 OpenDevin 系)。
Stack 言語:Workflow と Context / Diff / Fact
全シリーズ共通の記法:Workflow を Fact の下流と一方向矢印で描かない。 Workflow(L5)はオーケストレーション層で、タスク期間中に Context を消費し Diff を出し Fact で検証し、「要件完了」と判定するまで繰り返す:
Cloud Mac AI Stack · 産出物の関係(呼び出し順ではない) Workflow(L5 · OpenHands) ├── Context(L4 · MCP) ← repo / issue / API を読む ├── Diff(L3 · Claude Code 等) ← コード変更 / ファイル書き込み └── Fact(L1 · Runner / テスト) ← test / build / CI シグナル Agent loop(Workflow 内部 · 複数回イテレーション可) Diff ↔ Fact ↑ ↓ Observe → 再 Plan → 再 Execute …
四つの産出物:Context · Diff · Fact · Workflow(MCP · コーディング層 · Runner · OpenHands)。Inference(L2 · Ollama)は任意で上図から外し、Agent loop と混同しない。
| 層 | コンポーネント | 産出 | 答える問い |
|---|---|---|---|
| L4 | MCP | Context | Agent は何が見える? |
| L3 | Claude Code | Diff | 今回の変更は何? |
| L1 | GitHub Runner | Fact | 組織は信じられる? |
| L5 | OpenHands | Workflow | 要件全体は終わった? |
Workflow は「もう1つの CI job」ではなく、多段・中断再開可能なタスク状態機械:ループ内で Diff と Fact を何度も呼び、PR が渡せるまで回す。Claude Code は単ラウンド Diff が得意;OpenHands はループ全体を無人で走らせるのが得意——Context と Fact が先に敷かれている前提。
OpenHands 一分定位(百科ではない)
OpenHands は OSS の自律ソフトウェア工程 Agent プラットフォーム:サンドボックス(多くは Docker)で自然言語目標を受け、計画 → コード/コマンド → 出力読取 → デバッグを自動化し、GitHub(issue、PR、CI 状態)と接続できる。Cloud Mac AI Stack では Claude Code のペア体験も Runner の客観ビルド証明も置き換えない——その上で多段納品を編成する。
「もう1つ MCP Server」との違い
MCP はコンテキスト境界を広げる(repo 読取、API 呼び出し);OpenHands はタスクの深さを広げる(次に何を呼ぶか、リトライするかを自分で決める)。L4 がなければ盲打ち;L1 がなければ「完了」は組織で受け入れられない。
OpenHands vs Claude Code:競合ではない理由
OpenHands vs Claude Code や Claude Code alternative で来る人の本音:どちらか1つで足りない? Cloud Mac AI Stack ではいいえ、そうすべきでもない——層が違い、産出物が違う:
- Claude Code(L3) → Diff:ペアコーディング、人がその場にいる。
- OpenHands(L5) → Workflow:自律 Agent、人は目標を置く。
OpenHands を「もう1つの Claude Code」にすると即ハマる:頭の中の曖昧なプロダクト感覚には弱い;Claude Code は8ステップ issue を無人では回しにくい。正解は積み上げ——昼は Claude Code で難所、夜は OpenHands が issue キューを消化。
| 次元 | Claude Code(L3 · Diff) | OpenHands(L5 · Workflow) |
|---|---|---|
| 対話 | 人在、段階確認 | 目標駆動、多段自律 |
| 典型時間 | 5–30分セッション | 30分〜数時間タスク |
| 得意 | 複雑な一点リファクタ、意図の同期 | スクリプト化要件、小改修バッチ、テンプレ feature |
| リスク | セッション終了で半成品 | 暴走、ファイル過多、権限過大 |
| 産出 | Diff | Workflow(PR、ログ、ステップ軌跡) |
| OpenHands alternative? | ❌ 違う | ❌ Claude Code 代替ではない |
経験則(契約ではない):PR で変更意図を一文で言える → Claude Code;「issue を終わらせて」→ OpenHands を検討。 大規模 repo で CodeGraph 索引があるならペア層は Claude Code のまま;OpenHands はテンプレ化されたバックエンド作業向き。両者は MCP Context を共有するが責務は共有しない。
OpenHands で何ができる?(検索ユーザーの第一問)
OpenHands agent や OpenHands github で来る人の本当の問い:何を任せると堅い? 以下はテスト + CI ありを前提に最初に試すタスク型——L5-Q02 チュートリアルの例プールでもある:
| タスク型 | 典型入力 | 期待納品 | 適合 |
|---|---|---|---|
| Fix bug | GitHub issue + 再現手順 | パッチ + テスト + PR | ⭐⭐⭐⭐ |
| Dependency upgrade | 「React 18→19 に上げる」 | lockfile + 破壊的変更の修正 | ⭐⭐⭐⭐ |
| Lint cleanup | ESLint / SwiftLint レポート | warning 一括修正、挙動不変 | ⭐⭐⭐⭐⭐ |
| Generate tests | 未カバー模块リスト | 単体テスト PR | ⭐⭐⭐ |
| Documentation sync | API 変更 diff | README / OpenAPI 同期 | ⭐⭐⭐⭐ |
| Scaffold / boilerplate | 「REST endpoint 追加」テンプレ | ルート + テスト骨格 | ⭐⭐⭐⭐ |
最初の OpenHands タスクに不向き: テストなし大リファクタ、UX 大改、業務承認が要る schema 移行、本番シークレット直結。これらは Claude Code のペアセッションに残し、人のゲート後に Runner で Fact。
OpenHands の動き方(How OpenHands Works)
How OpenHands works、OpenHands architecture、OpenHands agent loop で来る人が知りたいのは Docker コマンドではなく:自律 Agent が一文をマージ可能 PR にどう変える? 核心は四ステップ——Plan → Execute → Observe → Debug:
| 段階 | 内容 | 消費する層 |
|---|---|---|
| Plan | issue 読取、サブタスク分割、ファイル一覧 | Context(MCP、GitHub、repo ツリー) |
| Execute | パッチ、shell、ツール呼び出し | Diff を産出 |
| Observe | テスト出力、lint、ビルドログ | Fact(ローカル test または Runner) |
| Debug | Observe 結果で計画またはコード修正 | Execute へ;未達なら loop 継続 |
OpenHands agent loop(概念 · 単一パイプラインではない)
┌──────────┐
│ Plan │ ← Context
└────┬─────┘
▼
┌──────────┐
│ Execute │ → Diff
└────┬─────┘
▼
┌──────────┐
│ Observe │ ← Fact(test / build / CI)
└────┬─────┘
│
未達 │ 達成
▼
┌──────────┐ ┌─────────────┐
│ Debug │ ──────▶│ Workflow 完了│ → PR / 納品
└────┬─────┘ └─────────────┘
│
└──── Plan または Execute へ(次ラウンド)
「もっと強い Chat を入れる」とは別物。OpenHands architecture の要は状態付きタスク機——各 Observe が trajectory に書かれ、次の Plan に使われる。Fix bug、Lint cleanup などは同じ loop の別入口。次の 実タスク再生 で1 issue を四段すべて通す;Docker と UI は L5-Q02。
L0–L4 を積んでから L5——さもないと Agent はサンドボックスで独り言
「初日から OpenHands」式のツール積み上げは推奨しない。順序は L1 投入順と同じで、MCP のあと L5:
- L0 — 常時稼働 Cloud Mac macOS ノード。
- L1 — Runner:
push → 緑/赤が再現可能。 - L2–L3 — 任意 Ollama + Claude Code、Fact の上でコーディング。
- L4 — MCP Hub + 権限モデル:Agent の読み書きを監査可能に。
- L5 — OpenHands:多段 Workflow。
L1 なしでも OpenHands は技術的に PR まで行けるが、マージリスクは判断不能——「Claude Code SSH は緑、Actions は赤」と同型の組織事故。L4 権限なしでは自律 Agent の token 露出が拡大;MCP セキュリティ spec 参照。
実タスク再生:Plan → Execute → Observe → Debug を1周
以下は OpenHands サンドボックス fork で再生したタスク形(数字は示意)。agent loop と照合:
目標:issue #218「CSV エクスポートに UTF-8 BOM がない」を修正 ① issue + 関連 src/export/*.ts を読む ~2 min · Context(MCP/Git) ② 6ステップ計画 ~1 min · Plan ③ 4ファイル変更 + テスト1本追加 ~8 min · Execute ④ pnpm test → 失敗(スナップショット不一致) ~3 min · Observe · Fact ⑤ ログ読取 → さらに2ファイル修正 ~5 min · Debug → 再 Execute ⑥ 再テスト → 緑 ~3 min ⑦ PR 作成、issue リンク ~1 min · Workflow 納品 合計約23分 wall time · 人は目標承認 + 最終 merge review のみ
④(Observe)に注意:テスト失敗は災害ではなく agent loop の入力。 ペアツールではその場修正;OpenHands は Observe → Debug で Fact を次の Execute に戻す。安定テストコマンドがなければ(L1 未固定)Observe に信号がなく空転——Runner 先行の理由のひとつ。
トリガ側の概念(インストール教程ではない、GitHub 接続の説明のみ):
# 概念:issue ラベルで自律タスク起動(疑似コード) on: issues: types: [labeled] if: github.event.label.name == 'agent:openhands' run: | openhands run \ --repo "${{ github.repository }}" \ --issue "${{ github.event.issue.number }}" \ --max-iterations 40 \ --sandbox docker
Runner · OpenClaw · OpenHands:三名、三役
L5 で最も聞かれる三角関係:
| コンポーネント | Stack 層 | 比喩 | 典型動作 |
|---|---|---|---|
| GitHub Runner | L1 · Fact | 両足 | xcodebuild、pnpm test、アーカイブ |
| OpenClaw | オーケストレーション(Stack 主層外) | 配車席 | 起動順、レシート、監査、ACK |
| OpenHands | L5 · Workflow | 自律エンジニア | 要件読取、コード変更、PR まで反復 |
OpenClaw はアーキテクチャ判断をしない——「いつ走らせ、終わったらどう通知」。OpenHands は Runner の代わりに iOS パッケージに署名しない——review 可能な PR とステップログ。三者は同一 Cloud Mac に積めるが、1つの runbook に責務を混ぜない。
Cloud Mac 上の典型 OpenHands 構成(self-hosted · Docker · macOS)
OpenHands Mac、OpenHands self-hosted、OpenHands Docker で来るエンジニアが要するのは置けるトポロジ——手順ではなく「部品の位置」。Apple Silicon Cloud Mac で推す最小本番形:
OpenHands self-hosted on macOS(Cloud Mac · L0 ベース)
GitHub(issues / webhooks / PR)
│
▼
┌─────────────────────────────────────┐
│ Cloud Mac · macOS · Apple Silicon │
│ ┌─────────────┐ ┌───────────────┐ │
│ │ OpenHands │ │ Claude Code │ │ L5 Workflow + L3 Diff(同機可)
│ │ (Docker) │ │ (SSH/端末) │ │
│ └──────┬──────┘ └───────────────┘ │
│ │ sandbox workspace │
│ ▼ │
│ ┌─────────────┐ ┌───────────────┐ │
│ │ MCP Servers │ │ Ollama (任意) │ │ L4 Context · L2 Inference
│ └─────────────┘ └───────────────┘ │
│ │ git push │
│ ▼ │
│ ┌─────────────────────────────────┐ │
│ │ GitHub Runner (self-hosted) │ │ L1 Fact
│ └─────────────────────────────────┘ │
└─────────────────────────────────────┘
Workflow 層をノート PC ではなく Cloud Mac に置く理由
- 時間 — OpenHands タスクは30–90分が普通;蓋を閉じると切れる。
- OpenHands Docker — サンドボックスは安定 daemon が要る;24/7 Cloud Mac が向く。
- Runner と同スタック — 変更後、同一 macOS ノードで検証、「SSH 緑・Actions 赤」を減らす。
- ABI 一致 — iOS / macOS ターゲットは Apple Silicon 上の方が Linux VPS より驚きが少ない。
最小 OpenHands Docker 起動(概念断片;完全 docker compose は L5-Q02):
# Cloud Mac · OpenHands self-hosted(示意)
docker pull docker.all-hands.dev/all-hands-ai/openhands:0.9
docker run -d --name openhands \
-e SANDBOX_USER_ID=$(id -u) \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $HOME/.openhands:/.openhands \
-p 3000:3000 \
docker.all-hands.dev/all-hands-ai/openhands:0.9
専用ノード ≠ 自動的に安全
Cloud Mac は算力と macOS ABIを解く;OpenHands は依然repo 単位の最小権限(bot ブランチ、prod secret なし)が要る。将来の L6 Agent Ops / Governance で audit、policy、人の gate——本稿は Workflow を立て、ガバナンスは次の輪。
L5 Agent Stack 推奨スペック:Workflow からどの Cloud Mac を借りるか
構成を読んだあとの自然な問い:Workflow 層に何を載せる? 実運用の積載からの選型表(契約 SLA ではない):
| シナリオ | 推奨構成 | メモ |
|---|---|---|
| OpenHands Only(軽量 issue、ローカル推論なし) | M4 · 16GB | Docker サンドボックス + API LLM;agent Workflow 試行向け |
| OpenHands + Claude Code(同機ペア + 自律) | M4 · 24GB | 昼 Diff、夜 Workflow;CI とメモリ競合回避 |
| OpenHands + Ollama 7B | M4 · 24GB | プライベート Inference + Agent;オフピークスケジュール |
| OpenHands + Ollama 14B + Runner | M4 Pro · 48GB | 14B 常駐 + サンドボックス + 日次 macOS CI;Swap リスク最小 |
| iOS チーム(OpenHands issue + xcodebuild CI) | M4 · 24GB+ | Agent と Runner 同機;archive ピークで 8GB+ 確保 |
商業ナラティブの Workflow → Cloud Mac → スペック:先に L5 能力を確定し、Docker +(任意)Ollama + Runner を支えるノードを選ぶ——機械を先に借りてツールを後から積まない。
向き・不向き:Agent 宣伝より境界の方が重要
| OpenHands(L5)向き | 不向き / 慎重に |
|---|---|
| 社内ツール、足場、ドキュサイト、テスト補完 | 規制金融 / 医療コアで人の gate なし |
| issue テンプレ明確、テストカバーそこそこ | テストも CI もない「とりあえず動かす」repo |
| 反復移行(依存更新、lint 一括) | 強いプロダクト直感が要る UX 大改 |
| L1 Runner + L4 MCP 権限ポリシー済み | secret が repo に散在、token ローテなし |
| 「Agent PR + 人が merge」を受け入れる | Agent が main 直 push / prod 自動リリース |
スクリプトと小サービス:はい;無防備な本番書き込み:いいえ。 OpenHands は工程加速器であり、免責の「自動 DevOps」ではない。
意思決定:Cloud Mac を Agent プラットフォームに上げるべきか
下の自己診断で左列 ≥3なら L5 投入;そうでなければ L1/L4 を先に。
| OpenHands 可 | まだ早い |
|---|---|
| 週 ≥5 の「小さく完結」issue が並ぶ | 主痛みが「macOS CI がない」 |
| Runner は緑だが手作業のステップ連結が多い | Claude Code セッションがまだ不安定 |
| MCP 権限と bot アカウントが段階付け済み | GitHub PAT が repo 全体 admin |
| サンドボックスとタスクログを維持する意思 | merge review をする人がいない |
| Cloud Mac 24GB または Ollama オフピーク済み | 16GB で 14B + Agent + Xcode 同時 |
結論(要約ではなく決断): OpenHands の価値は「賢い Chat」ではなく、Cloud Mac がツール集合から要件に責任を持つプラットフォームになること——ただし Fact(Runner)と Context/権限(MCP)が先に立っていること。さもないと手動連結を自動化しただけで、組織は依然 merge できない。
L5 連載:意思決定から最初の自律タスクへ
| 篇 | qid | テーマ | 状態 |
|---|---|---|---|
| ① · 本稿 | L5-Q01 | ツール集合 → Agent プラットフォーム(決断 R1) | 公開済み |
| ② | L5-Q02 | Cloud Mac に OpenHands 導入 + 最初の自律タスク | 次回 |
| ③ | L5-Q03 | OpenHands vs OpenClaw 分担詳説 | 予定 |
| ④ | L5-Q04 | Runner + OpenHands:CI 失敗後の自動 PR? | 予定 |
| ⑤ · L6 延伸 | L6-Q05 | Agent Ops / Governance(Context→Workflow→統制) | 📅 6/16 |
L6 閉環の前に少なくとも ② を:再現可能な OpenHands tutorial がなければ Hub にランディングがない。全スタック地図は L6-Q01;シリーズは「AI Tool Stack」から「AI Engineering Platform」へ、L6-Q05 Agent Governance が最後の輪。
FAQ
How OpenHands works / agent loop とは?
Plan → Execute → Observe → Debug;Context 消費、Diff 産出、Fact 検証——動き方参照。
OpenHands vs Claude Code — どちら?
二者択一ではない。Diff は Claude Code、多段 issue は OpenHands——比較。
OpenHands tutorial / インストールは?
本 Hub に手順なし。Docker + 最初の issue→PR は L5-Q02(6/14 予定)。
Mac で self-hosted できる?
可。常時 Cloud Mac + Docker サンドボックス;典型構成。
Runner なしで OpenHands?
動くが非推奨。先に L1。
OpenClaw とは?
オーケストレーション vs 自律工程——三角分担と OpenClaw ノート。
どのスペックを借りる?
L5 Agent Stack スペック;OpenHands のみ M4 16GB、Claude Code または Ollama 7B 併用は 24GB。
L5 Agent Stack · 選型
ワークロードに合わせて Cloud Mac スペックを選ぶ
OpenHands Only → M4 16GB · + Claude Code → M4 24GB · + Ollama 14B + Runner → M4 Pro 48GB。本 Hub で Workflow 層を整理し、L5-Q02 で最初の自律タスクを通す。
Cloud Mac 料金・スペックを見る