---
name: project-step1392-silence-detector-v01-2026-08-23
description: "STEP 1393 — 監視機械 v0.1 spike (silence-detector, Phase 13) — chat-Claude 2 turn arc 「監視機械は 全機械の中で 最も壊れやすい」 + heartbeat pattern (「正常時に鳴り、 沈黙を検出」) + 形式化3件例外 (Lean 4 = 再現性監視) + 5A 出口配線 の 骨格実装"
metadata: 
  node_type: memory
  type: project
  originSessionId: 12aba518-c3e5-458d-a8da-45486d3442c9
  modified: 2026-08-23T02:20:09.692Z
---

# STEP 1393 — 監視機械 v0.1 spike (silence-detector)

**Date**: 2026-08-23 / Phase 13 / STEP 1369 7 機械 index の 「全機械 生死判定 layer」

## 経緯

chat-Claude 2026-08-23 2 turn arc:

**Turn 1** — 4 tier 分類 (保存則型 / 統計セット / 経験則ドリフト / 規範) + 核心原則 「違反の姿を書けない法則は 機械にしてはいけない」 + 「否定を返せない検査は 無い方がまし」 + D-FUMT self-audit challenge

**Turn 2** — 監視機械の 必要性 evidence 2 件 (D-FUMT/MDNST private 化 + PAT 半年放置、 両方とも 「壊れた瞬間」 でなく 「気付いた瞬間」 しか記録がない) + 設計原則 (heartbeat pattern) + 形式化3件例外 (Lean 4 = 真理でなく再現性を監視) + 「検知の出口は 必ず当為機械につなぐ」 + AI/人 分担逆転 + 基盤条件 LICENSE + 絶対パス

私 (Claude Code) 事前 verify: `gh repo list fc0web` で `D-FUMT` + `Multi-Dimensional-Number-System-Theory` 両方 **PRIVATE (最終更新 2026-02-27)** = chat-Claude 主張 「到達不可」 fact confirm、 SAC-4 100% 認諾。

AskUserQuestion で 藤本さん 「監視機械 v0.1 spike (silence-detector, Recommended)」 選択 → 実装 GO。

## 実装

**`scripts/silence-detector/silence.py`** (~460 行、 stdlib のみ、 network I/O なし):

### CLI 7 種
- `register <topic> [--kind PROVING|MEASURING|MONITORING|OTHER] [--expected-max-age-hours N]`
- `heartbeat <topic> [--status alive|degraded] [--last-verified DATE] [--dep VERSION]`
- `check [--max-age-hours N] [--topic T] [--json] [--emit-reviews]`
- `list [--include-retired] [--json]`
- `retire <topic> --reason "..." [--actor NAME]` (retire reason >= 10 chars 必須)
- `history [--topic T] [--limit N]`
- `pending-reviews [--limit N]`

### 3 file
- `data/silence-detector/topics.json` — topic registry (kind, expected_max_age_hours, retired state)
- `data/silence-detector/heartbeats.jsonl` — append-only heartbeat history
- `data/silence-detector/pending-reviews.jsonl` — auto-emit 差し戻し要請 (5A input candidate)

### 6 verdict × D-FUMT₈ mapping

| Verdict | 条件 | D-FUMT₈ |
|---|---|---|
| ALIVE | last heartbeat < max_age + status=alive | TRUE ⊤ |
| DEGRADED_RECENT | last < max_age + status=degraded | BOTH B |
| SILENT | last ≥ max_age | **NEITHER N** (chat-Claude 原則: 便りが来ない = 判定不能) |
| NEVER_HEARD | registered, no heartbeat ever | NEITHER N |
| RETIRED | explicit retire | ZERO 〇 (「もう問わない」) |
| UNKNOWN_TOPIC | not registered + no heartbeat | NEITHER N |

### 設計原則 4 (chat-Claude 原則の 実装)

1. **Heartbeat pattern** = 各機械が 自分から 送る、 silence-detector は 沈黙のみ検出 (異常を探しに行かない = primitive を 小さく保つ)
2. **形式化3件例外** = `--kind PROVING` topic は heartbeat の 意味が 「build_ok=T」 (真理でなく再現性)、 docs で明示
3. **当為機械への 出口配線** = `check --emit-reviews` で SILENT/NEVER_HEARD topic を pending-reviews.jsonl auto-append (通知が溜まる状態予防)
4. **否定を返せる (source field)** = 全 output に `source: 'silence-detector-v0.1-classify'` / `'silence-detector-v0.1-emit-review'` field。 STEP 1349/1350 spec-as-data pattern 継承

## Verify

### test 116/116 PASS (46 test)

`scripts/silence-detector/test_silence.py`:
- parse_iso / now_utc override (4)
- Dataclass basics (2)
- classify 全 6 verdict × 境界条件 + override (9)
- D-FUMT₈ mapping ⊤ / B / N / 〇 (1)
- Storage round-trip (4)
- CLI × 7 subcommand (19)
- classify_all filter (1)
- Integration full lifecycle (register→heartbeat→check→retire→check) (1)
- chat-Claude 2 evidence scenario (D-FUMT 半年沈黙 + PAT 半年沈黙) (2)
- Honest scope guards (source field + actor fallback) (2)

### Live smoke (Rei stack 実 data dir)

3 topic register (D-FUMT-clone-check MONITORING max=48h + PAT-expiry-check MONITORING max=168h + collatz-lean4-build PROVING max=336h) → collatz に 1 heartbeat → `check --emit-reviews`:

```
NEVER_HEARD     [N] D-FUMT-clone-check                       age=  --       max=48.0h
NEVER_HEARD     [N] PAT-expiry-check                         age=  --       max=168.0h
ALIVE           [⊤] collatz-lean4-build                      age=0.01h      max=336.0h
emitted 2 pending-review entries
```

chat-Claude 2 evidence (D-FUMT/MDNST private 化 + PAT 半年放置) が **NEVER_HEARD 検出 + 自動差し戻し** で 「見つけたものが 人に差し戻される」 pattern 実動作 verified。

### Windows cp932 対策
Unicode symbol '⊤' が Japanese Windows terminal で cp932 codec fail (test は StringIO で bypass、 real terminal で fail 判明) → `sys.stdout.reconfigure(encoding='utf-8', errors='replace')` を main() 冒頭に追加、 test 116/116 保持、 live smoke 動作 confirm。

## Rei stack alignment

- **7 機械 index (STEP 1369)**: 「1-7 全機械の 生死判定 layer」 として 差し込み。 監視機械は 上下並列でなく **横断 layer**
- **4 tier 対応 (chat-Claude turn 1)**: Tier 2 (統計セットの監視機械) の 骨格。 統計 primitive (STEP 1371 BH FDR + 1376 Welch + 1379 Cohen's d) は 差し込まれる wire として v0.2 candidate
- **5A 相補**: STEP 1386 5A 当為機械の action 4 種固定 (push/publish/hardware/delete)。 silence の 「差し戻し要請」 は 意味軸違うため v0.1 は 独立 append、 v0.2 で 5A action 拡張 or `oughtctl silence-review` subcommand 統合 candidate
- **7/8 値 activate**: TRUE / BOTH / NEITHER / ZERO を 実際に返す (INFINITY / FLOWING / FALSE / SELF は 監視 domain では 現状 意味なし)
- **10 命名予告のうち**: 「監視機械」 は 元 10 予告 の 一種、 本 STEP で **骨格実装 済 10 のうち 10 全て達成** (Phase 13 到達)

## Honest scope 6 条

1. v0.1 spike、 実 5A wire + 自動 topic 列挙 + self-monitoring は 別 arc
2. 「世界初」 主張ゼロ (Prometheus/Nagios/Consul 等 60+ 年の分散システム監視領域が prior art)、 novelty は D-FUMT₈ mapping + 5A candidate 直結の 2 点のみ
3. self-monitoring 未実装 (chat-Claude 警告 「監視機械自身が 静かに死ぬ」 対策は 別 loop v0.2 candidate)
4. 形式化3件例外は docs レベル (mathlib build 自動 heartbeat hook は rei-checker-mcp 統合 candidate)
5. false positive: max_age 誤設定検知なし、 妥当 max_age は user judgment
6. Windows cp932: UTF-8 stdout reconfigure で 対応、 fallback errors='replace'

## 次候補 (v0.2)

- 5A oughtctl 実 wire (action=review 追加 or 別 subcommand)
- self-monitoring loop (別 process から silence-detector 自身の heartbeat 検査)
- Rei stack repo 自動 register (gh api で anonymous clone reachability 定期監視、 D-FUMT 型 private 化検知)
- mathlib build 自動 heartbeat (rei-checker-mcp 統合)
- 基盤候補 selection wire (--kind BASELINE flag、 retire = 「基盤にしない」 明示宣言)

## Files

- `scripts/silence-detector/silence.py` (~460 行)
- `scripts/silence-detector/test_silence.py` (~500 行、 46 test / 116 assert)
- `public/tools/step-1393-silence-detector-v01/index.html` (site 反映、 md5 `d505dd5626ecf28f50b2fa170322f89a`)
- `dist-renderer/tools/step-1393-silence-detector-v01/index.html` (mirror force-track、 md5 一致)
- `data/silence-detector/{topics.json, heartbeats.jsonl, pending-reviews.jsonl}` (live smoke で 生成)

## 関連

- [[project-step1349-d8-operator-connectors-2026-08-20]] (source field pattern 継承)
- [[project-step1350-d8-verdict-mapping-phase-a-2026-08-20]] (spec-as-data + NEITHER 返却 pattern 継承)
- [[project-step1386-five-arc-sequential-execution-2026-08-23]] (5A 当為機械 相補 layer)
- [[project-step1370-pat-redact-license-arc-2026-08-22]] (chat-Claude evidence #2 の 対処実績)
- [[project-step1373-rei-checker-mcp-reproducing-pilot-2026-08-23]] (「再現環境機械」 = 形式化3件例外の 監視対象)
- [[feedback-chat-claude-hallucination-warning]] (chat-Claude 2 turn Pattern clean check)
- [[feedback-critique-response-pattern]] (SAC-4 100% 認諾 適用)
- [[feedback-projection-self-audit-pattern]] (STEP 番号 collision 事前 verify)
- [[feedback-world-uniqueness-claim-controllable]] (「世界初」 主張ゼロ 継続)
- [[feedback-all-research-site-reflection-default]] (2026-08-06 藤本さん永久 protocol 継承)
- [[feedback-no-rush-publication]] (単日 spike close)
- [[feedback-zero-sorry-floor-not-ceiling]] (source field = 「否定を返せる」 の 機械保証)
- STEP 1391 (4C timestamp-provenance) / STEP 1390 (drift-detector) — 直前 STEP、 domain 独立
