Skip to content

Commit 7ca689b

Browse files
authored
Merge pull request #771 from hideyukiMORI/feat/weekly-scheduled-ci
feat(ci): 週次 schedule と workflow_dispatch を追加し外界の変化を検知する (v1.8.169)
2 parents e6bcfe7 + 48440b0 commit 7ca689b

6 files changed

Lines changed: 119 additions & 6 deletions

File tree

.github/workflows/ci.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,37 @@ on:
55
branches: [main]
66
pull_request:
77
branches: [main]
8+
# 週次で main をフル実行する(push とは独立に)。
9+
#
10+
# 検知したいのは「コードの変化」ではなく **外界の変化** — 上流の advisory データである。
11+
# 2026-05-30 から 2026-08-12 までの 74 日間、このリポジトリには 1 コミットも無く、
12+
# CI も一度も走らなかった。その間にコードは 1 行も変わっていないのに `pip-audit` の
13+
# 検出数は 0 → 22 件(pyjwt / cryptography / starlette を含む=認証と TLS の面)へ増えていた。
14+
# advisory は我々のコミットではなく、それ自身の時計で公開されるためである。
15+
#
16+
# ここでの検知器は `pip-audit`。`uv.lock` をコミットしていて `uv sync` がそれを尊重するので、
17+
# 週次実行は「いま固定している版に対する既知脆弱性」を正確に測る。
18+
#
19+
# 毎時 00 分は GitHub Actions の高負荷帯で schedule が遅延しやすいと公式に明記されているため、
20+
# 意図的に 30 分にずらしている。月曜 00:30 UTC = 09:30 JST(週明けの始業時刻)。
21+
#
22+
# 🔴 既知の限界: public リポジトリの scheduled workflow は、リポジトリの活動が 60 日間
23+
# 無いと GitHub により **自動的に無効化される**。上記の空白は 74 日で、しきい値を 14 日
24+
# 超えている。つまりこの装置は、それが検知しようとしている状態そのものによって止められうる。
25+
# 「週次が動いている」ことを外側から確かめる仕組みは、この workflow では解決できない
26+
# (docs/review/2026-08-12.md の後続タスク)。
27+
schedule:
28+
- cron: '30 0 * * 1'
29+
# schedule の初回発火を待たずに動作確認・再実行するための手動トリガー。
30+
workflow_dispatch:
31+
32+
# 同一 ref への連続 push で古い実行を打ち切り、CI 時間を無駄にしない。
33+
# 🔴 `github.event_name` を必ず group に含めること。含めないと schedule / workflow_dispatch の
34+
# 実行が push の実行に cancel され、「設定したのに走らない」状態になる。設定ファイルは
35+
# 正しく見えるのに動かないため気づきにくい(nene-origin で実測された罠)。
36+
concurrency:
37+
group: ci-${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
38+
cancel-in-progress: true
839

940
jobs:
1041
check:

CHANGELOG.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,32 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
88
99
---
1010

11+
## [1.8.169] — 2026-08-12
12+
13+
CI を push から切り離し、週次で外界の変化(上流 advisory)を検知できるようにした。
14+
15+
### Added
16+
- `.github/workflows/ci.yml`**週次 `schedule`**`cron: '30 0 * * 1'` = 月曜 09:30 JST)と
17+
**`workflow_dispatch`** を追加。検知したいのはコードの変化ではなく**外界の変化**である。
18+
v1.8.167 で解消した 22 件は、コードが 74 日間 1 行も変わらない間に積み上がったもので、
19+
CI が push にしか結合していなかったために誰も気づけなかった。
20+
`uv.lock` をコミットしているため、週次実行は「いま固定している版に対する既知脆弱性」を
21+
`pip-audit` で正確に測る。
22+
- **`concurrency` グループ**を追加し、`${{ github.event_name }}`**含めた**
23+
含めないと schedule / workflow_dispatch の実行が push の実行に cancel され、
24+
「設定したのに走らない」状態になる(nene-origin で実測された罠)。
25+
26+
### Notes
27+
- 毎時 00 分は GitHub Actions の高負荷帯で `schedule` が遅延しやすいと公式に明記されているため、
28+
意図的に 30 分にずらしている。
29+
- 🔴 **既知の限界**: public リポジトリの scheduled workflow は、リポジトリの活動が
30+
**60 日間**無いと GitHub により自動的に無効化される。本リポジトリの空白は **74 日**
31+
しきい値を 14 日超えており、**この装置は自身が検知しようとしている状態によって
32+
停止させられうる**。リポジトリ単体では解決できないため、限界を明記するに留めた。
33+
詳細は [日報 2026-08-12 §4](docs/review/2026-08-12.md)
34+
35+
---
36+
1137
## [1.8.168] — 2026-08-12
1238

1339
セッションの実測を記録として残し、mcp 2.0 移行規模の過大見積もりを訂正した。

docs/review/2026-08-12.md

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# 日報 — 2026-08-12
22

33
**作業者**: hideyukiMORI
4-
**バージョン**: v1.8.168(セッション終了時点)
4+
**バージョン**: v1.8.169(セッション終了時点)
55

66
---
77

@@ -216,7 +216,60 @@ ls .venv/lib/python3.14/site-packages/mcp/server/ # fastmcp が無いこと
216216
217217
---
218218

219-
## 4. 明日以降の方針
219+
## 4. 週次の定期再検査を導入(v1.8.169)
220+
221+
§1 の根本原因(CI が push に結合していて、コードが動かない限り外界の変化を検知できない)を
222+
塞ぐため、`.github/workflows/ci.yml` に週次 `schedule` を入れた。
223+
224+
| 追加 || 理由 |
225+
|---|---|---|
226+
| `schedule` | `cron: '30 0 * * 1'`(月曜 09:30 JST) | 検知したいのは**外界の変化**。検知器は `pip-audit` |
227+
| `workflow_dispatch` || schedule の初回発火を待たずに確認・再実行するため |
228+
| `concurrency.group` | <code v-pre>...-${{ github.event_name }}</code> を**含む** | 含めないと schedule 実行が push に cancel される |
229+
230+
- **毎時 00 分を避けた理由**: GitHub 公式に「`schedule` イベントは高負荷時に遅延しうる。
231+
高負荷時間帯には毎時の開始が含まれる」「遅延の可能性を下げるには毎時の別の時刻に
232+
スケジュールせよ」と明記されているため、意図的に 30 分にずらした。
233+
- **`uv.lock` をコミットしている効果**: `uv sync` が lock を尊重するので、週次実行は
234+
「いま固定している版に対する既知脆弱性」を正確に測る。検知器として精度が高い。
235+
- **フル CI を回す設計にした理由**: 監査専用の workflow を別に作ると、PR のマージ関門と
236+
週次チェックが**別々に育って乖離する**。同じ `ci.yml` を回せば「週次で確認しているもの」=
237+
「マージに必要なもの」が定義上一致する。
238+
239+
### 🔴 この装置自身の限界(未解決)
240+
241+
**public リポジトリの scheduled workflow は、リポジトリの活動が 60 日間無いと
242+
GitHub により自動的に無効化される**(公式ドキュメントに明記)。
243+
244+
本リポジトリの空白は **74 日**(2026-05-30 → 2026-08-12)で、**しきい値を 14 日超えている**
245+
246+
> **この装置は、それが検知しようとしている状態そのものによって停止させられうる。**
247+
> 「週次が動いていること」を外側から確かめる仕組みは、この workflow の中では解決できない。
248+
249+
対策はリポジトリ単体では完結しない(外部からの `workflow_dispatch` 発火や、
250+
活動中のリポジトリからの横断ディスパッチなど)。フリート全体の装置設計に属するため、
251+
本日時点では**限界を明記するに留める**
252+
253+
### 通知の実測(誰が赤に気づくのか)
254+
255+
週次で回しても、失敗が誰にも届かなければ「CI が走っていなかった」が
256+
「走ったが誰も見なかった」に化けるだけなので、実測した。
257+
258+
| 測定項目 | 実測値 |
259+
|---|---|
260+
| 通知の配信 | **機能している**`ci_activity` 通知が実際に生成されている) |
261+
| 未読通知の総数 | **1,828 件** |
262+
| うち `ci_activity` | **634 件** |
263+
| 本リポジトリの未読 `ci_activity` | **128 件** |
264+
| 最古の未読 | **2026-05-11**(3 ヶ月前) |
265+
266+
**配信は届いている。届いた先が飽和している。** 週次の失敗通知を 1 件足しても、
267+
1,828 件の山に 1,829 件目として積まれるだけで、検知装置としては機能しない。
268+
通知経路の設計はフリート全体に効くため別途提案する。
269+
270+
---
271+
272+
## 5. 明日以降の方針
220273

221274
| 優先度 | タスク |
222275
|---|---|

docs/todo/current.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# TODO — current
22

33
最終更新: 2026-08-12
4-
現状: **v1.8.168 / 依存の既知脆弱性 22 件を解消し CI を緑に復帰 / 471 tests・カバレッジ 93%**
4+
現状: **v1.8.169 / 依存の既知脆弱性 22 件を解消し CI を緑に復帰 / 471 tests・カバレッジ 93%**
55

66
---
77

@@ -182,7 +182,10 @@ v1.8.161)、#553(#578 で実装済みを確認し close)、ハウスキー
182182
||| リリース時は `v*` タグ push → publish.yml が自動公開([手順](../how-to/release-and-publish.md)| infra |
183183
||| PyJWT 推移的 CVE(PYSEC-2025-183)— mcp 修正待ち | 保留 |
184184
||| **mcp 2.0 系への移行**(2026-08-12 調査済み)— 2.0.0 で `mcp.server.fastmcp``mcp.server.mcpserver` に改名。**実測の移行規模は概算 11 行**`src/nene2/mcp/server.py` の 1 行が唯一の依存点・`src/example/mcp.py``LocalMcpServer` 越しで変更不要)。実質的な破壊点は `call_tool()` の戻り値が `CallToolResult` になったことのみ。**着手条件=`mcp` のバージョン境界の決定**。調査と移行方針は [日報 2026-08-12 §2](../review/2026-08-12.md) が設計ノート。<br>🔴 **訂正**: 当初「`src/nene2/mcp/``src/example/mcp.py` の全面書き換えが必要」と記載していたが**過大評価だった**。根拠が「テストが 4 本落ちた」だけで依存の実体を測っていなかった(`grep``server.py` の 1 行のみと判明)。着手判断には訂正後の数字を使うこと | 保守 |
185-
||| **依存の定期再検査を仕組み化**(2026-08-12)— コード凍結中でも上流 advisory は増える。実際 2ヶ月半 CI が走らず 22 件が無検知で積み上がった。`schedule:` トリガーの CI か月次 `uv lock --upgrade` 運用の導入を検討 | infra |
185+
| ~~~~ || ~~**依存の定期再検査を仕組み化**~~ | infra |
186+
|||**2026-08-12 解消(v1.8.169)**`ci.yml` に週次 `schedule`(月曜 09:30 JST)+ `workflow_dispatch``concurrency``github.event_name` 込み)を追加。[日報 2026-08-12 §4](../review/2026-08-12.md) | infra |
187+
||| 🔴 **週次 schedule 自体の生存監視**(2026-08-12 判明)— public リポの scheduled workflow は**活動が 60 日無いと GitHub が自動無効化**する。本リポの空白は **74 日**で 14 日超過しており、**装置が自身の検知対象によって止められうる**。外部からの `workflow_dispatch` 発火など、リポジトリ単体では解決できない | infra |
188+
||| 🔴 **失敗通知の経路設計**(2026-08-12 実測)— 通知の配信は機能しているが、**未読 1,828 件(うち `ci_activity` 634 件・最古 2026-05-11)** で飽和している。週次の失敗を 1 件足しても 1,829 件目になるだけで検知装置として機能しない | infra |
186189

187190
---
188191

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "nene2-python"
3-
version = "1.8.168"
3+
version = "1.8.169"
44
description = "NENE2 Python — minimal API framework following NENE2's design philosophy"
55
readme = "README.md"
66
license = {text = "MIT"}

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)