@tyhld/conductor 0.12.18 → 0.12.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tyhld/conductor",
3
- "version": "0.12.18",
3
+ "version": "0.12.20",
4
4
  "description": "采配くん管制の見守りアプリ(conductor-agent)。各PCで常駐し、中央(devlog-tracker)へ定期的に生存報告(heartbeat)を送る常駐CLI。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -7,17 +7,19 @@
7
7
  **関門でない確認(3ボタンのカード)は出しません。**
8
8
  関門でない確認は**すべてその場で「はい」**として通し、この機の記録に「**聞かずに通した**」を1行残します。
9
9
 
10
- ★**3関門(main直変更/本番確認/DB実行)だけは、自走モードでも人に聞きます**
10
+ ★**関門(本番確認/DB実行)だけは、自走モードでも人に聞きます**
11
11
  (便 918ce835・えふさん確定 2026-09-17「本番操作は人承認へ戻す」)。
12
+ ★main 直変更と、本番 DB を直接変える道具は、関門ではなく **`deny`** です(便 fc22bc34・1-2節)。
12
13
  2026-09-06〜09-17 は関門も聞かずに通していました(便 e6c5658a の実測で、関門の判定21件が確認なしで実行)。
13
14
  ★2026-09-18 から、関門は**入口の番人が管制に聞いて、答えが返るまで実行させません**。
14
15
  auto モードでも同じです(便 ab6e36ca・4節)。
15
16
 
16
17
  | | 自走モード(既定) | 従来(`CC2_AUTORUN=0`) |
17
18
  | --- | --- | --- |
18
- | 3関門(main直変更/本番確認/DB実行) | ★**管制の2択(はい/いいえ)で人が判断** | 同左 |
19
+ | 関門(本番確認/DB実行) | ★**管制の2択(はい/いいえ)で人が判断** | 同左 |
19
20
  | そのほかの確認(`cd` / `npx` / 削除 など) | **聞かずに通す**+この機の記録に1行 | 管制の3ボタンで人が判断 |
20
21
  | **危険**(持ち出し・秘密・番人の設定への書き込み・`gh pr merge --admin`) | **`deny`** | 同左 |
22
+ | **抜け道**(main 直 push・API での合流・保護の変更・秘密の値の設定・リポの削除・検査の省略・本番 DB の直接変更) | **`deny`**(便 fc22bc34・1-2節) | 同左 |
21
23
  | 管制へつながらないとき | 関門は **`deny`**(フェイルクローズ)。それ以外の職人の作業は止まりません | 関門は `deny`(フェイルクローズ) |
22
24
  | PR の合流(`gh pr merge --auto` など・鉄則7) | **聞かずに通す**(関門ではない・ADR-007) | 同左 |
23
25
 
@@ -57,28 +59,78 @@ CC2_AUTORUN=0
57
59
 
58
60
  | 順番 | 何に当たるか | どうなるか |
59
61
  | --- | --- | --- |
60
- | 1 | **危険**(本番破壊・force push・データ消失・認証情報の露出/持ち出し) | `deny`(実行させない) |
61
- | 2 | **3関門**(main直変更/本番確認/DB実行) | ★入口の番人が**その場で管制の2択で聞き、答えが出るまで待つ**。「はい」→ `allow`/「いいえ」・答えが来ない・聞けない → **`deny`**(便 ab6e36ca・4節)。自走モードでも・auto モードでも同じ |
62
+ | 1 | **危険**(本番破壊・force push・データ消失・認証情報の露出/持ち出し)+★**抜け道**(1-2節) | `deny`(実行させない) |
63
+ | 2 | **関門**(本番確認/DB実行) | ★入口の番人が**その場で管制の2択で聞き、答えが出るまで待つ**。「はい」→ `allow`/「いいえ」・答えが来ない・聞けない → **`deny`**(便 ab6e36ca・4節)。自走モードでも・auto モードでも同じ |
62
64
  | 3 | それ以外 | `allow`(自走) |
63
65
 
64
66
  ★**新しいコマンドは必ず 3 に落ちます**。これが「将来出てくる道具が自動的に正しい側へ行く」形です。
65
67
 
66
68
  ### ★PRのマージは関門ではありません(ADR-007)
67
69
 
68
- `gh pr merge`(および `gh api …/pulls/N/merge`)は**関門から外し、職人が自走できます**。
70
+ `gh pr merge`(`--auto`・`--merge`・`--squash`・`--rebase`・`--delete-branch`)は**関門から外し、職人が自走できます**。
69
71
  マージを関門にすると、職人は毎回**最後の1手で人を待って止まる**ため、「指示を出したら終わりまで進む」が
70
72
  成立しませんでした。マージはPRという記録が残り、レビューとCIの結果が付いた上での操作です。
71
73
 
72
- **外したのはマージだけ**です。`git push origin main` のような**本番ブランチへの直接 push** は
73
- 関門のまま残ります(PRもレビューもCIも通らずに本番の元が変わるため、性質がまったく違います)。
74
- 関門1の呼び名も「マージ」から「**main直変更**」へ変わりました(種別の字面 `merge` は管制の表示・
75
- 集計が使っているのでそのままです)。
74
+ **外したのはマージだけ**です。`git push origin main` のような**本番ブランチへの直接 push** は、
75
+ 便 fc22bc34 で関門から **`deny`** へ移しました(1-2節)。★API での合流(`gh api …/pulls/N/merge` の書き込み)も `deny` です。
76
76
 
77
77
  ★**保護を迂回する合流 `gh pr merge --admin` は `deny`** です(便 918ce835・えふさん確定 2026-09-17)。
78
78
  branch protection は「CI が通っていない物を main に入れない」歯止めで、`--admin` はそれを外します。
79
79
  止めるのは動詞が `gh` で `pr merge` の後ろに `--admin` があるときだけで、PR の本文やコミットの説明に
80
80
  字面が出るだけの操作は止めません。本番の DDL を含む PR の合流も、鉄則7の自動合流のままです(本番操作の承認とは分けます)。
81
81
 
82
+ ## 1-2. ★抜け道は `deny`(便 fc22bc34・えふさん確定 2026-09-18)
83
+
84
+ 考え方:**ALLOW**=普通の開発・検索・試験・練習環境(本番を変えない)/**ASK**=外部への送信・公開など、
85
+ 正当な仕事だが実世界に影響する操作/**DENY**=職人が行う必要が無い抜け道。ここは DENY の側です。
86
+
87
+ | 抜け道 | 止める形(`policy.py`) |
88
+ | --- | --- |
89
+ | main など保護ブランチへの直接 push | `git push <remote> main`・`HEAD:master`・`--all`・`--mirror`。★書き込む先を書かない形(`git push`・`git push origin`・`git push origin HEAD`)は、**今のブランチと push 先(`@{push}`)を git に確かめ**、保護ブランチなら止める。確かめられない(切り離された HEAD・git リポでない・作業場所が変数)ときも止める(`_main_push_danger`) |
90
+ | 保護の迂回 | `gh pr merge --admin`・API での合流(`gh api` / `curl` で `pulls/N/merge` を PUT/POST・GraphQL の `mergePullRequest`) |
91
+ | 保護の変更(強める向きも) | ブランチの保護・ruleset・必須の検査・環境(`environments/<名前>`)・デプロイの保護(つなぎ先の `update_project_deployment_protection`)への書き込み |
92
+ | 秘密の値の設定・削除 | `vercel env add/rm`・`supabase secrets set/unset`・`wrangler secret put/delete`・`gh variable set/delete`・`fly secrets`・`heroku config:set`・`netlify env:set`、API の `actions/secrets`・`variables` への書き込み |
93
+ | リポの削除 | `gh repo delete`・API の `DELETE repos/<o>/<r>` |
94
+ | 検査・安全設定の省略 | `claude --dangerously-skip-permissions`・`--permission-mode bypassPermissions`・`git … --no-verify`・`git commit -n`・`git -c core.hooksPath=…`・コミットの説明や合流の説明に入った `[skip ci]` 類(GitHub が本当に CI を飛ばす) |
95
+ | 本番 DB の直接変更 | `psql`・`dropdb`・`prisma db push / migrate deploy / migrate reset`・`supabase db push / migration up`・`drizzle-kit push`・`npm/pnpm/yarn run migrate…`・REST の `rpc/exec_sql`(今の設定の deny と揃えた) |
96
+
97
+ ★**字面だけでは止めません**。どれも「実際に動く道具の語の並び」(`_tool_words`)で見ます。PR の本文やコミットの説明に
98
+ 「--admin」「skip ci」と書くだけの操作は通ります(`[skip ci]` 類は、コミットの説明に入った時点で GitHub が本当に CI を飛ばすので止めます)。
99
+ ★`bash -c "…"` などの包みの中も同じ物差しで測り直します。
100
+
101
+ ### ★本番 DB の直接変更は、あとで ASK へ移せる形
102
+
103
+ 判定は `_prod_db_change` の1か所、決定は `PROD_DB_CHANGE_DECISION` の1か所(いまは `DENY`)。
104
+ 「職人が本番の鍵を持たない+人が承認した専用の経路」が完成したら、この定数を `GATE` に差し替えるだけで、
105
+ 同じ判定が関門 db(管制の2択)として返ります(`test_bypass_deny.py` の (7) で差し替えを確かめています)。
106
+ ★差し替えるときは、ホームと各現場の設定の deny(`Bash(psql:*)` など)も人の手番で外してください。
107
+ 外さないと、番人が「はい」を受けても設定の deny で止まります(便 df4accf8 の重大発見2)。
108
+
109
+ ## 1-3. ★関門は「実際に動く道具」で決める(便 ad6b5db9・えふさん確定 2026-09-18)
110
+
111
+ 以前は、コマンドを改行・`|`・`;`・`&` で機械的に区切り(引用符やヒアドキュメントの中でも区切り)、
112
+ 区切った切れ端の文字で関門を決めていました。そのため当てどころがずれていました。
113
+
114
+ - コミットの説明・PR の本文・検索の文字・手順書の中の「create table」「GRANT」が、関門 db に当たる(7日で80件)。
115
+ - 報告をヒアドキュメントで書くだけの Bash が、本文の反映の文字で関門 release に当たって8分止まる(便 30879701)。
116
+ - 逆に、本物の本番反映 `pnpm --filter <部品> exec wrangler deploy --env production` が素通りする(同上)。
117
+
118
+ 今はこう決めます(`policy.py` の `split_commands` / `_gate_command` / `_gate_one`)。
119
+
120
+ 1. **本物の区切りだけで割る**。引用符(`'` `"` `` ` ``)の中と、ヒアドキュメントの本文は割りません。
121
+ 本文は、行の終わりの時点の最後のコマンドに付けます(`cat <<EOF > f` なら cat、`cat <<EOF | mysql` なら mysql)。
122
+ 2. **頭の前置きを剥がす**(`pnpm --filter … exec`・`pnpm exec`・`npm exec --`・`npx`・`yarn`・`yarn workspace <名前>`・
123
+ `bunx`・`env 変数=…`・`time`・`nohup`・`xargs`・`wrangler@3` の版の指定)。そのうえで、実際に動く道具を見ます。
124
+ 3. **文字を扱うだけの道具**(echo・cat・tee・grep・rg・git・gh …)は、引数や本文に何が書かれていても関門にしません。
125
+ 4. **シェル**(`bash -c "…"`・`bash <<EOF`)は、中身を同じ物差しで測り直します。
126
+ 5. **SQL の字面**は、実行しうる入口のときだけ見ます。入口とは、DB の道具・移行の道具・その場で走らせる形
127
+ (`python3 -c`・`node -e`・`python3 - <<EOF`・DB の道具へ流す形)・知らない実行ファイルです。
128
+ 6. 本番反映は、`wrangler deploy`(`--dry-run` を除く)・`wrangler versions/pages deploy`・`vercel --prod`・
129
+ `vercel promote/alias/rollback`・`npm/pnpm/yarn publish`・`supabase functions deploy`・「deploy の語+`--prod`」です。
130
+
131
+ ★**止める側(deny)は変えていません**。危険と抜け道の判定は、今までどおり機械的な区切り(`split_segments`)で見ます
132
+ (引用符の中まで見る方が、止める側としては広いため)。7日分の記録では、DENY の件数は前後で同じ(1,559件)でした。
133
+
82
134
  ## 2. ファイルの役割
83
135
 
84
136
  | ファイル | 役割 |
@@ -90,6 +142,8 @@ branch protection は「CI が通っていない物を main に入れない」
90
142
  | `hook_datalink.py` | フックと管制のやり取り(HTTP)。**製品固有の前提を持たない=切り出し可能** |
91
143
  | `summary_ja.py` | 確認カードに出す**日本語1行**の組み立て |
92
144
  | `test_policy.py` | 単体テスト(297件)。`python3 scripts/hooks/test_policy.py` |
145
+ | `test_bypass_deny.py` | 抜け道の `deny` と、止めてはいけない操作の試験(便 fc22bc34)。`python3 scripts/hooks/test_bypass_deny.py` |
146
+ | `test_gate_real_commands.py` | 関門の当てどころの回帰試験(誤読の実例81件の形・本物の反映・止めてはいけない関門・便 ad6b5db9) |
93
147
  | (`../check_permission_rules.py`) | 現場の許可設定に残った「番人と食い違う行」を洗い出す検査(読むだけ・ADR-009) |
94
148
  | `test_hook_datalink.py` | 連絡線の単体テスト。`python3 scripts/hooks/test_hook_datalink.py` |
95
149
  | `settings.sample.json` | フック登録の見本(★人間が `~/.claude/settings.json` へ反映する) |