---
name: project-step1335-ci-skip-audit-2026-08-14
description: 段 1 CI workflow 「非致命的 skip」 全数 audit — .github/workflows/ 全 8 file で 50 hit 実測 (rei-learning-cycle.yml 単独 40)、 3 category 分類 ((i) 妥当 33 / (ii) 致命的 12 / Finding 2 revenge 1)、 heartbeat + red-if-stale 3 方式提案。 実装は 別 STEP (STEP 1336) 判断で 段 1 は audit + 設計案まで
metadata:
  node_type: memory
  type: project
  originSessionId: d2082c05-0e81-4fc9-9613-331ad2f49b5b
  modified: 2026-08-14T14:57:12.086Z
---

# STEP 1335 (tentative) — CI 「非致命的 skip」 audit (2026-08-14 段 1)

## 経緯

STEP 1334 arc close 段 0a-0b 完了に続く 段 1 (「非致命的 skip」 38 箇所 audit)。 [[feedback-success-signal-decoupled-from-operational-state-2026-08-14]] の 例 3 (arxiv radar 4 日停止 = CI 緑のまま気付かず) の 本命対策 (個別 arxiv 修理でなく 38 箇所 全数 categorize + heartbeat 設計)。 事前予測 38 箇所、 実測 **50 hit** (2 割増、 mirror-sync.yml + smoke-test.yml + snapshot-push.yml + lean-verify.yml + daily-impossibility-equations.yml + metadb-auto-sync.yml も対象)。

## 実測 (全 8 workflow)

| workflow | hit 数 | 主要 category |
|---|---|---|
| `rei-learning-cycle.yml` | 40 | 大半、 8 npm task 個別 skip + 2 pipeline 全体 skip + 3 pull rebase + 14 git add 存在確認 + 5 python fallback + 2 commit-nothing + 2 push fail + 3 summary |
| `mirror-sync.yml` | 3 | GitLab / Codeberg mirror push の 2 layer (secrets 未設定時 skip + 実 push 失敗時 continue-on-error) + summary |
| `metadb-auto-sync.yml` | 3 | diff view + 存在確認 add + pull rebase |
| `lean-verify.yml` | 1 | lake cache 失敗時 source rebuild fallback |
| `daily-impossibility-equations.yml` | 1 | jq view fallback |
| `snapshot-push.yml` | 1 | commit no-change |
| `smoke-test.yml` | 1 | summary if:always |
| `test.yml` | 0 | (握りつぶし なし) |

**合計 50 hit** (事前予測 38 の 132%)。

## 3 category 分類

### (i) 妥当 = 33 hit — 握りつぶし妥当、 変更なし

- **git pull rebase (4)**: `rei-learning-cycle.yml:70,124,242` + `metadb-auto-sync.yml:106` — 一時的 rebase 失敗を 握りつぶし、 次 run で 追いつく想定
- **git add 存在確認 (14)**: `rei-learning-cycle.yml:127-129,244-256` + `metadb-auto-sync.yml:101` — path 不在時の 握りつぶし、 「あれば add / なければ skip」 の意図的挙動 (Finding 2 revenge の 126 のみ 除外)
- **commit-nothing (3)**: `rei-learning-cycle.yml:140,280` + `snapshot-push.yml:34` — 変更ゼロ時 「コミット対象なし」 は normal state
- **python parse fallback (5)**: `rei-learning-cycle.yml:155,260,288,290,291` — file 一時不在 or JSON parse fail を 握りつぶし、 初回起動 or 空 file で 落ちない設計
- **fallback with explicit rebuild (1)**: `lean-verify.yml:44` — Mathlib cache miss で source から build、 fallback path 明示
- **view command fallback (2)**: `metadb-auto-sync.yml:85` (diff 差異検出は非 0 exit で normal) + `daily-impossibility-equations.yml:63` (jq view 表示用)
- **Summary if:always (3)**: `rei-learning-cycle.yml:146` + `mirror-sync.yml:75` + `smoke-test.yml:60` — 前 step 成否問わず summary、 GH Actions 標準 pattern
- **mirror secrets 未設定 skip (2)**: `mirror-sync.yml:40,58` の (a) 「secrets 未設定時 skip」 layer のみ 妥当、 (b) 「secrets ある時の 実 push fail」 layer は (ii) 対象

### (ii) 致命的だが握りつぶし = 12 hit — heartbeat + red-if-stale 対象

**★ 3 例目 arxiv radar 4 日停止 の 元凶 = 8 個の 個別 npm task skip**:

| # | line | task | 影響 |
|---|---|---|---|
| 1 | 97-98 | `npm run cycle:daily` (pipeline 全体) | Rei 日次生命線 全体停止しても CI 緑 = **最も 危険** |
| 2 | 142 | `git push origin main` | 学習結果 push 失敗、 数日分データ消失 potential |
| 3 | 161 | `npm run radar:scan` | 情報 radar 停止 (別 arxiv radar と別 layer) |
| 4 | 169 | `npm run nnue:evolve` | NNUE 進化停止 |
| 5 | 177 | `npm run eternal:evolve` | Eternal SEED_KERNEL 拡張停止 |
| 6 | 185 | `npm run silence` | Silence cycle 停止 |
| 7 | 197 | `npm run activity:refresh` | Activity Log 更新停止 (= [[feedback-success-signal-decoupled-from-operational-state-2026-08-14]] observation-anchor 用の 計器自身が 停止 = 二重の 危険) |
| 8 | 209 | `npx tsx scripts/research-radar/daily-radar.ts` | **★ arxiv radar 4 日停止 の 直接源** |
| 9 | 221 | `npm run buddy:refresh` (build-daily-banner) | OGP banner 更新停止 |
| 10 | 233 | `npm run buddy:refresh` | Buddy 更新停止 |
| 11 | 282 | `git push origin main` (2 段目 = selfplay 系) | 同 142 |
| 12 | mirror push 実失敗 (`mirror-sync.yml:40,58` の (b) layer) | GitLab / Codeberg mirror が 継続的 失敗しても 気付かず |

### Finding 2 revenge = 1 hit — 案 C (段 2) で 削除対象

- `rei-learning-cycle.yml:126`: `git add rei-aios.db || true` — `.gitignore:5` で `*.db` 除外済、 silent-fail 確定。 [[project-knowledge-store-dual-sqlite-json-2026-08-14]] 案 C 実装で SQLite が JSON からの derived view になり、 git add 対象から消滅 = **修正でなく消滅** (藤本さん 08-14 insight)。 段 2 で吸収、 本 STEP scope 外。

## heartbeat + red-if-stale 設計 (3 方式提案)

(ii) 12 hit の 対策として:

### 方式 A: 「最後の成功 timestamp」 file (推奨、 最小変更)

- 各 (ii) task の 成功時に `data/heartbeat/{task-name}.json` に `{"lastSuccess": "2026-08-14T02:30:00Z", "taskName": "daily-radar"}` を write (task 側に 1 行 append)
- 新 workflow `check-heartbeat.yml` を 6 時間毎 schedule で起動、 各 heartbeat file を読み、 stale threshold (task 別、 daily task = 30h、 hourly task = 3h) 経過なら `::error::stale task {name} last success N hours ago` + `exit 1` で **明示的 red**
- 一時的失敗で 誤警報しない (threshold 経由)、 継続的失敗のみ red
- 変更範囲: (a) 各 task 末尾に heartbeat write 1 行、 (b) 新 check-heartbeat.yml 1 file、 (c) `data/heartbeat/` gitignore

### 方式 B: 個別 job 分離 + 各 job 直接 red

- 8 個の npm task skip を それぞれ独立 job に分離 (`radar-scan` / `nnue-evolve` / ... / `daily-radar`)
- 各 job から `|| echo` を除去、 job 単位の GH Actions status で 成否可視化
- 「一時的失敗で毎回 red」 の 誤警報が過多 → retry step + threshold で 緩和
- 変更範囲: rei-learning-cycle.yml 大幅 refactor (現状の巨大 1 job → 10 job)、 job 間の cache / repo state 共有 が 複雑化

### 方式 C: site 側 dashboard 露出

- 各 task の 成功 timestamp を `data/site-stats.json` (or 新 `data/heartbeat.json`) に集約
- site rendering 時 (dashboard component) に 「radar last success: 4 日前」 と 赤色表示 → 藤本さん view から **直接可視**
- CI 側は 変更なし、 表示側だけの改善 = 「気付き」 は増えるが 「自動通知」 は無い

### 私 (Claude) の 推奨: 方式 A + 方式 C の combo

- **方式 A** = 内部監視 + 明示的 red signal (「CI 緑 = 稼働」 の 等号破棄)
- **方式 C** = 藤本さん の 日常 view から 見える化 (heartbeat 単体では 藤本さん自身が check_heartbeat.yml の 通知に気付く必要、 site dashboard で 常時 可視化 = 二重 safety)
- 方式 B は 「refactor scope 大」 で 段 1 内では過剰、 別 STEP (段 5 candidate) に移す

## 段 1 の 出口 (実装 vs audit 分離判断)

本 STEP scope は **audit + 設計案の 提示まで**。 実装 (方式 A + C の 具体的 workflow / script 書き起こし) は **STEP 1336 (tentative)** に分離を 推奨:

**理由 3 点**:

1. **順序原則**: [[feedback-one-reproduction-over-ten-unverified]] 継承。 設計案 3 方式を 藤本さんに judgment いただいてから 実装、 「grep が先」 と同じ pattern で 「設計 judgment が 実装前」。
2. **rule-add audit**: [[feedback-rule-add-requires-fire-audit]] 継承。 新 rule (heartbeat + red-if-stale) を 追加する前に、 それが 本当に必要な 12 hit か、 (i) の一部を (ii) に格上げすべきか、 (ii) の一部は 単に 削除すべきか、 の 追加 audit が 藤本さん judgment 対象。
3. **急がずゆっくりと** [[feedback-no-rush-publication]]: 段 1 で audit 完了 → 段 1 hook で 藤本さん judgment 待ち → 段 1 後継 STEP で 実装、 の 3 段が healthy pace。 1 session で 全部やると (i) 妥当判定の 一部を 見誤る risk。

## 藤本さん judgment 待ち事項

段 1 出口 で 決めていただく:

1. **方式 A / B / C の 選択** (推奨: A + C combo)
2. **heartbeat stale threshold** の 具体値 (daily task 30h / hourly task 3h は 素案、 藤本さん pace に合わせて調整)
3. **12 hit (ii) の 内訳確認**: (2) と (11) の push fail は 実は 同一 concern (「学習結果 push 失敗」)、 まとめて 1 個で扱うか 2 個で扱うか。 (12) mirror-sync は 別 STEP か 本 heartbeat scope に含めるか
4. **STEP 1335 番号 承認** (私 が 「STEP 1335 tentative」 と 呼んでいる、 藤本さん判断で 別番号 or 承認)
5. **STEP 1336 実装 STEP の 起動 timing** (段 2 案 C 実装との 順序、 段 2 の Finding 2 消滅と 本 STEP の (12) mirror-sync は 独立 = 並行可能)

## site 反映 判断

本 STEP は audit + 設計案の **中間成果** = 実装完了時 (STEP 1336) に site 反映で 一体化する方が 意味がある可能性。 「audit だけの site page」 vs 「audit + 実装まとめの site page」 の どちらが 藤本さん view から 有用か 判断待ち。 現状 私推奨: **STEP 1336 完了時に 統合 site page 1 個** (audit + 設計 + 実装 evidence を 1 場所に集約、 STEP 1334 site page pattern と同じ)。

## 関連

- [[project-session-2026-08-14-step1334-arc-close-state]] (段 1 の 起源 queue、 本 file は 段 1 完了 record)
- [[feedback-success-signal-decoupled-from-operational-state-2026-08-14]] (3 例統合 pattern、 本 audit は 例 3 (CI 握りつぶし) の 対策展開)
- [[project-step1334-knowledge-api-wiring-and-deeper-disconnect-2026-08-14]] (Finding 2 origin、 本 audit で `rei-learning-cycle.yml:126` を Finding 2 revenge として scope 分離)
- [[project-knowledge-store-dual-sqlite-json-2026-08-14]] (段 2 案 C 実装、 本 audit の Finding 2 revenge は 案 C で 修正でなく消滅)
- [[feedback-one-reproduction-over-ten-unverified]] (audit → judgment → 実装 の 順序原則、 本 STEP を audit-only に 留める根拠)
- [[feedback-rule-add-requires-fire-audit]] (新 rule (heartbeat) 追加前の fire audit 必要性)
- [[feedback-no-rush-publication]] (段 1 → 段 1 hook → STEP 1336 実装 の 3 段 pace 根拠)
- [[project-finding3-external-exposure-grep-result-2026-08-14]] (段 0b、 grep が 先の順序原則 直前先例)
