Skip to content
Back to skills

Org Attach

ASecurity

組織の生きているペイン(secretary / dispatcher / worker)へ tmux で**直接入る** ための **コマンドを出力するだけ** の read-only スキル。`mcp__org-broker__list_panes`(論理ペイン) と `/usr/bin/tmux -L claude-org-broker list-panes -a`(pane_id ↔ session マッピング)を pane_id(%N)で突き合わせ、各ペインに role + name(task_id) ラベル付きの attach コマンドを 生成する(読取専用 `-r` / 書込は `-r` 無し / デタッチは `Ctrl-b d`)。 「ワーカーのペインを見たい」「ワーカーのペインに入りたい」「dispatcher の様子を直接見たい」 「ペインに入りたい」「あのペインを直接覗きたい」「attach コマンド教えて」 「tmux でつなぎたい」「worker の画面に入る」等で発動。 自分で attach はせず・ペインも一切変更しない(コマンド文字列とペイン一覧表を...

  • 5 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 5, 2026
ai-agentsbashbackend

Works with

  • terminal
  • mcp

Security analysis

A100/100

Scanned October 5, 2026

npx -y skills add suisya-systems/claude-org-ja --skill org-attach --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Org Attach?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Org Attach
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/suisya-systems-org-attach/badge)](https://www.skillsdirectory.com/skills/suisya-systems-org-attach)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: org-attach
description: >
  組織の生きているペイン(secretary / dispatcher / worker)へ tmux で**直接入る**
  ための **コマンドを出力するだけ** の read-only スキル。`mcp__org-broker__list_panes`(論理ペイン)
  と `/usr/bin/tmux -L claude-org-broker list-panes -a`(pane_id ↔ session マッピング)を
  pane_id(%N)で突き合わせ、各ペインに role + name(task_id) ラベル付きの attach コマンドを
  生成する(読取専用 `-r` / 書込は `-r` 無し / デタッチは `Ctrl-b d`)。
  「ワーカーのペインを見たい」「ワーカーのペインに入りたい」「dispatcher の様子を直接見たい」
  「ペインに入りたい」「あのペインを直接覗きたい」「attach コマンド教えて」
  「tmux でつなぎたい」「worker の画面に入る」等で発動。
  自分で attach はせず・ペインも一切変更しない(コマンド文字列とペイン一覧表を表示するのみ)。
  作業委譲(org-delegate)・ダッシュボードで状況一覧(org-dashboard)・watcher 停止(org-attention-stop)
  には発動しない。
effort: low
allowed-tools:
  - Read
  - Bash(printenv ORG_TRANSPORT)
  - Bash(/usr/bin/tmux -L claude-org-broker list-panes*)
  - Bash(/usr/bin/tmux -L claude-org-broker list-sessions*)
  - mcp__org-broker__list_panes
  - mcp__org-broker__list_peers
---

# org-attach: 組織ペインへの tmux attach コマンドを生成(read-only)

組織の生きているペイン(secretary / dispatcher / worker)へ人間が**自分のターミナルから**
tmux で直接 attach するための **attach コマンド文字列を生成して表示する** スキル。
このスキルは **何も attach しない・どのペインも変更しない**。論理ペイン一覧(broker)と
tmux 側の pane_id↔session マッピングを pane_id(`%N`)で join し、各ペインへの attach コマンドを
role + name(task_id) ラベル付きで印字するだけ。コピーした人間がコマンドを自分の端末に貼って入る。

> **輸送層 両系(frame C / 二フレーム) — このスキルは broker(tmux) フレーム専用**:
> このスキルは tmux backend(socket `claude-org-broker`)上の **detached tmux session への attach** を
> 前提とする。**broker フレーム**: 各 broker ペインは `claude-org-broker-{pid}-{seq}` という独立した detached
> tmux session(1 ペイン = 1 session)として存在し、`tmux attach -t <session>` で入れる ―
> 本スキルの attach モデルが意味を持つ主フレームはこちら。**renga フレーム(opt-in,
> `ORG_TRANSPORT=renga`)は概念が異なる**: renga のペインは**所属タブ内のタイル**であって、独立した
> detached session ではない。「detached session へ attach し直す」概念がそのまま写像せず、ペイン単位の
> `tmux attach -t <session>` は存在しない。よって **`ORG_TRANSPORT=renga` では**本スキルの broker/tmux
> attach 形は**適用外**で、org のペインが並ぶタブを表示して直接見る。org が全ペインを同一タブへ置くのは
> org 側の配置規則であり、規範の正本は契約
> [`docs/contracts/backend-interface-contract.md`](../../../docs/contracts/backend-interface-contract.md)
> §4.2 の SINGLE-TAB MUST(本スキルはこれを再掲せず参照する)。したがって**その org のタブを表示している
> 間は** 1 画面で全ペインが見えるが、別のタブを表示している間は org のペインは視界に入らない。そのときは
> org のタブへ切り替えるか、renga の org サイドバー(全タブ横断でタブとペインを一覧する cross-tab パネル。
> renga `src/app/org_sidebar.rs:1-3`)から該当ペインを選ぶ。
> **この適用外は transport が renga の場合に限る**: 外側フレームが renga でも `ORG_TRANSPORT` が broker の
> 構成では detached tmux session が実在するので本スキルは**適用される**(その場合に必要なのは attach 打鍵の
> `Ctrl+B` 衝突回避で、手順は
> [`docs/operations/dispatcher-view.md`](../../../docs/operations/dispatcher-view.md)「外側フレームが renga の
> 場合」)。本スキルは `ORG_TRANSPORT=renga` のときだけ「broker(tmux) 専用ツールです」と明示して停止する
> (下記 Step 0)。
>
> (**既定の二フレーム注記(Refs #604)**: org-attach は本質的に broker/tmux ツールなので header を
> **broker 主軸**で書く。輸送層全体の既定は二つのフレームで指す対象が異なる ― **運用既定**は renga
> (broker 実走 dogfood が Epic #6 Issue G まで未活性)だが、**コード既定**は `tools/transport.py:
> DEFAULT_TRANSPORT` が runtime 0.1.28 (Epic #586) で `renga`→`broker` にフリップ済み。broker tool を
> 使う手保守スキルのうち
> [`.claude/skills/org-attention-stop/SKILL.md`](../org-attention-stop/SKILL.md) は header を
> 「既定 `broker` / opt-in `renga`」のコード既定フレームで書く ― 本スキルはこの broker 主軸の先例に倣う。
> ([`.claude/skills/org-attention-start/SKILL.md`](../org-attention-start/SKILL.md) は逆に「既定 `renga`」
> の運用既定フレームで書かれており、両者は指す対象が異なるだけで矛盾しない。)総説は root
> [`CLAUDE.md`](../../../CLAUDE.md)「輸送層(transport)両系」節、契約面は
> [`docs/contracts/backend-interface-contract.md`](../../../docs/contracts/backend-interface-contract.md)
> Surface 8。)

> **権限フレーム**: `list_panes` は broker の **ops-tier ツール**(secretary / dispatcher のみ付与、
> worker には付与されない)。したがって org-attach は **窓口(Secretary)/ ディスパッチャー面のスキル**で、
> 人間は窓口セッションから実行する。

## なぜ `/usr/bin/tmux` 絶対パス必須か(最重要)

zsh では `tmux` は oh-my-zsh の tmux プラグインで **alias 化けする**(`tmux is an alias for
_zsh_tmux_plugin_run`)。素の `tmux ...` を出力すると、人間の zsh に貼った瞬間に alias 経由で
別物(プラグインのラッパ)が走り、`-L claude-org-broker` の socket 指定や `attach -r -t <session>` が
意図通り効かない。**生成する全コマンドで実体パス `/usr/bin/tmux` を使い**、出力にもその理由を 1 行添える。

## Step 0: 輸送フレームを確認する(renga なら停止)

まず `ORG_TRANSPORT` を read-only で読む(この 1 コマンドだけが Step 0 の許可対象):

```bash
printenv ORG_TRANSPORT
```

renga transport(`ORG_TRANSPORT=renga`)ならこのスキルは適用外なので attach コマンドを生成せず停止する。

- **`ORG_TRANSPORT=renga`(明示)の場合** → 次の旨を伝えて停止する(attach コマンドは生成しない):
  「現在は renga transport(`ORG_TRANSPORT=renga`)で稼働しています。renga のペインは所属タブ内のタイルで、
  detached tmux session への attach という概念がそのまま適用されません。組織のペインはすべて同じタブに
  置かれるので、その組織のタブを表示している間はそのまま画面で見られます。別のタブを表示中なら、組織の
  タブへ切り替えるか、renga の org サイドバー(全タブ横断でタブとペインを一覧するパネル)から該当ペインを
  選んでください。ペイン状況の一覧は [`/org-dashboard`](../org-dashboard/SKILL.md) を使ってください。」
- **それ以外(無設定 / `broker`)** → broker(tmux) フレームとして Step 1 へ進む。

## Step 1: 論理ペイン一覧を取得(broker)

```
mcp__org-broker__list_panes
```

戻り値は 1 論理ペイン = 1 レコードで、主に次のフィールドを持つ:

- `id`: tmux backend では **これが tmux の pane_id(`%N` 文字列)そのもの**。
  (runtime `broker_queue_event.schema.json`: "Backend-native pane id: int on WezTerm,
  string (e.g. `"%3"`) on tmux" / `dispatcher/runner.py`: "broker/tmux backend emits tmux
  pane_id strings of the form %N"。WezTerm backend では int になるが、本スキルが対象とする
  tmux socket `claude-org-broker` では `%N` 文字列で来る。)
- `name`: ペイン名(`worker-{task_id}` / `dispatcher` / `secretary` 等)
- `role`: `secretary` / `dispatcher` / `curator` / `worker`
- `focused`, geometry(`x` / `y` / `width` / `height`), `cwd`

> **重要 — attach 可能なのは broker が spawn した子ペイン(dispatcher / worker)だけ**:
> 窓口(root secretary)は broker 起動時に **logical pane(bookkeeping entry、`register_logical_pane`)**
> として登録されるだけで、**adapter 実ペインを持たず `id` / pane_id が `null`(`%N` 無し)**。よって
> broker socket の detached session には**出現せず attach 対象外**である(窓口は org を起動した人間の
> 手元 terminal でそのまま動くので、そもそも attach 不要)。`id` が `%N` のレコードだけが attach 可能。
> 一次参照: [`docs/operations/broker-dogfood-runbook.md`](../../../docs/operations/broker-dogfood-runbook.md)
> §8(attach 導線の正準ガイド・「対象範囲(重要)」節)。

`list_panes` が空 / 取得不可なら「組織ペインが見つかりません。`/org-start` 済みか確認してください」と
報告して停止する。`list_panes` が `[tool_not_authorized]` を返したら ops-tier 権限が無い
(worker セッションから呼んでいる等)ので、窓口 / ディスパッチャー面で実行するよう案内する。

補足が要れば `mcp__org-broker__list_peers`(read-only)で peer 名と cwd を突き合わせてもよい
(join には必須ではない)。

> **`list_peers` の直前に
> [`.claude/skills/org-delegate/references/capability-first-drive-operational-gate.md`](../org-delegate/references/capability-first-drive-operational-gate.md)
> を Read し、`monitoring-read-only` の分岐を適用する。** 全タブ列挙では予約名が別 org のペインと
> 衝突しうるので、素の名前突き合わせは**他 org のペインに自 org のラベルを付けて人間に提示**しうる。
>
> **縮退時(capability 形かつ未承認)の帰結**: 列挙結果を破棄する。**破棄しても Step 3 の pane-id
> join は継続し、表示するラベル(role / name(task_id))は `list_panes` 由来のままである** — join key
> も表示元も `list_panes` なので、落ちるのは peer 名 / cwd の**補足だけ**で本スキルの出力は成立する。
>
> **承認済み(`first_drive` が `recorded`)のときの帰結**: 共有 reference §1-2 の三値判定を対象名に
> 適用し、**「在」と確定したレコードの補足だけを表示に使う**。「不在」「unknown」のレコードは自 org の
> ものとして表示しない(unknown はその旨を添えて出す)。判定手順と評価順の正本は §1-2。
>
> **どちらの帰結でも**、この列挙は表示補助にしか使わないため **attach 可否・join・lifecycle 判定の
> いずれにも波及させない**(本スキルは read-only であり、縮退が破壊的な後段に繋がる経路を持たない)。
> **旧版 fallback(現行配備の全 backend)では従来どおりで、今日の挙動は変わらない。**

## Step 2: tmux 側の pane_id ↔ session マッピングを取得

```bash
/usr/bin/tmux -L claude-org-broker list-panes -a -F '#{pane_id} #{session_name}'
```

- `-L claude-org-broker`: runtime の `BROKER_SOCKET`。組織の tmux はこの socket 上にある
- `-a`: 全 session の全ペインを列挙
- `-F '#{pane_id} #{session_name}'`: 各行を `%N <session>` の固定 2 列に整形して**頑健にパース**する
  (tmux のデフォルト行は `session:window.pane: [geometry] [history] %N (active)` 形で、ここからも
  session 名と `%N` を取れるが、明示 `-F` の方が確実)

出力例(1 行 = 1 ペイン、各 broker ペインは独立 session `claude-org-broker-{pid}-{seq}`):

```
%0 claude-org-broker-1912-1
%5 claude-org-broker-1912-14
%6 claude-org-broker-1912-17
```

socket 接続自体が落ちている場合は `error connecting to ... claude-org-broker` が返る。その時は
「tmux socket `claude-org-broker` に繋がりません(組織が起動していない可能性)。`/org-start` 済みか
確認してください」と報告して停止する。

## Step 3: pane_id(%N)で join

`list_panes` の `id`(`%N`)を key に、Step 2 の `%N → <session>` マッピングと突き合わせる:

```
list_panes.id (%N)  ⨝  tmux pane_id (%N)  →  各論理ペインの session 名
```

join 前に、まず `id` が `null`(`%N` 無し)の **logical pane を除外**する。これらは attach 対象外で、
join に回さず別枠で報告する(下記)。`id` が `%N` のレコードだけを tmux マッピングと突き合わせる。

両側で**マッチしないエントリは失敗にせず一覧で報告する**(実運用で起こる):

- **`id` が `null` の logical pane(通常は窓口 = secretary)**: これは drift ではなく**正常**。
  adapter 実ペインを持たないので attach できない。「(logical pane / attach 対象外。窓口は人間の手元
  terminal)」と注記して別枠表示する(attach コマンドは出さない)。
- **list_panes に `%N` があるが tmux に同 `%N` が無い**: backend 再起動 / pane が死んだ直後の drift。
  「session 解決不可」として attach コマンドは出さず、行だけ「(tmux 側に %N 無し)」と注記して出す。
- **tmux にあるが list_panes に無い**: 組織外の手動 session / 孤児 session。「(broker 未登録 session)」
  として、role/name は不明のまま attach コマンドだけ参考表示する(人間判断に委ねる)。

## Step 4: attach コマンドを生成して出力

join できた各ペインについて、role + name(task_id) ラベル付きで次を出力する:

- **読取専用 attach(既定・安全)**: `/usr/bin/tmux -L claude-org-broker attach -r -t <session>`
  - `-r` = read-only attach。覗くだけで誤入力でペインを壊さない。**まずこちらを案内する**
- **読取書込 attach(自分で打ちたい時のみ)**: 同じコマンドから **`-r` を外す**
  → `/usr/bin/tmux -L claude-org-broker attach -t <session>`
- **デタッチ**: attach 中に `Ctrl-b d` を押すと、ペインを動かしたまま自分だけ抜ける
  (ペインは生き続ける ― close ではない)
  - **`Ctrl-b` は tmux prefix の既定値**: prefix を変更している場合は設定した prefix に読み替える。
    さらに、**attach する端末が renga の場合はこの打鍵が届かない** — renga の org サイドバーは既定で
    有効なあいだ `Ctrl+B`(tmux prefix `Ctrl-b` と同じ物理入力)を消費して PTY へ渡さないため、
    detach できず抜けられなくなる。attach する前に
    [`docs/operations/dispatcher-view.md`](../../../docs/operations/dispatcher-view.md) の
    「外側フレームが renga の場合」の回避策(renga 設定 `[ui] org_sidebar = "off"`、または tmux prefix
    の変更)を適用すること。

出力末尾に「`tmux` は zsh で alias 化けするため、必ず実体パス `/usr/bin/tmux` を使うこと」と、上記
`Ctrl-b` の読み替え(tmux prefix の既定値であること・renga の画面から attach する場合は先に
[`docs/operations/dispatcher-view.md`](../../../docs/operations/dispatcher-view.md)「外側フレームが renga の
場合」の回避策が要ること)を添える。

## 出力フォーマット(worked example)

Step 1 / Step 2 が次を返したとする:

`list_panes`(論理ペイン。窓口 = secretary は `id` が `null` の logical pane):

| id | role | name |
|---|---|---|
| `null` | secretary | secretary |
| `%5` | dispatcher | dispatcher |
| `%6` | worker | worker-feat-org-attach-skill |

`/usr/bin/tmux -L claude-org-broker list-panes -a -F '#{pane_id} #{session_name}'`
(secretary は logical pane なので broker socket に**出ない**点に注意):

```
%5 claude-org-broker-1912-14
%6 claude-org-broker-1912-17
```

logical pane 除外 → `%N` を持つ dispatcher / worker のみ join → 生成する出力:

```
組織ペインへの attach コマンド(broker/tmux フレーム・read-only スキル:表示のみ、自動 attach はしません)
※ これらを自分のターミナルに貼って入る

■ dispatcher (dispatcher)          session=claude-org-broker-1912-14
  読取専用 : /usr/bin/tmux -L claude-org-broker attach -r -t claude-org-broker-1912-14
  読取書込 : /usr/bin/tmux -L claude-org-broker attach    -t claude-org-broker-1912-14

■ worker (worker-feat-org-attach-skill)   session=claude-org-broker-1912-17
  読取専用 : /usr/bin/tmux -L claude-org-broker attach -r -t claude-org-broker-1912-17
  読取書込 : /usr/bin/tmux -L claude-org-broker attach    -t claude-org-broker-1912-17

(logical pane / attach 対象外)
- secretary (secretary): 窓口は logical pane(pane_id 無し・broker socket 非出現)。
  org を起動した人間の手元 terminal でそのまま見えるので attach 不要。

- まず読取専用(-r)で入るのを推奨。自分で打ちたい時だけ -r を外す。
- 抜けるとき: Ctrl-b d(デタッチ。ペインは動いたまま自分だけ抜ける)。
- 別セッションへ切替: Ctrl-b s(attach 中にセッション一覧から選ぶ。現状は per-session attach)。
- 上記 Ctrl-b は tmux prefix の既定値。変更していれば設定した prefix に読み替える。
  renga の画面から attach する場合は、org サイドバー(既定で有効)が Ctrl+B(tmux prefix Ctrl-b と
  同じ物理入力)を消費して PTY へ渡さないため上の打鍵が届かない(detach できず抜けられなくなる)。
  先に docs/operations/dispatcher-view.md「外側フレームが renga の場合」の回避策
  (renga 設定 [ui] org_sidebar = "off"、または tmux prefix の変更)を適用すること。
- tmux は zsh で alias 化けするため、必ず実体パス /usr/bin/tmux を使うこと。
```

unmatched があった場合の追記例:

```
(参考) join できなかったエントリ:
- broker %3 (worker / worker-foo) : tmux 側に %3 無し(pane drift の可能性、attach 不可)
- tmux session claude-org-broker-1912-9 (%9)  : broker 未登録 session(組織外/孤児の可能性)
    /usr/bin/tmux -L claude-org-broker attach -r -t claude-org-broker-1912-9
```

## やらないこと(read-only 不変条件)

- 自分で `attach` しない(コマンド**文字列**を出すだけ)
- ペインを spawn / close / rename / send_keys / send_message しない
- `.state/` / registry / tmux のいずれも変更しない
- 書込み・spawn・送信系の broker / tmux ツールは `allowed-tools` に含めない
  (許可は `list_panes` / `list_peers` と read-only な tmux `list-panes` / `list-sessions` のみ)
- 状況の一覧だけが目的なら [`/org-dashboard`](../org-dashboard/SKILL.md)、作業委譲は
  [`/org-delegate`](../org-delegate/SKILL.md) を使う(本スキルは attach 用コマンド出力専用)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.