fullseye

TRIZ 40 発明原理 × ソフトウェア設計パターン × コンテナ型 — 構造選択マトリクス(fullseye)

作成 2026-09-02 / 対象 = <ローカルの作業パス>\dev\projects\imgevolve(fullseye: ~1000 op、進化探索、fscript、Studio、C codegen)。 目的 = 6 か月後の自分が、設計のジレンマに当たったとき 2 分で「どの構造を選ぶか」を決めるための参照表。 一般的なパターン解説は書かない。fullseye の実ファイルで検証できる事実と、4 軸の採点理由だけを書く。 引用した行番号は 2026-09-02 時点。ファイル名は grep で実在確認済み(未確認のものは「未確認」と明記)。

関連正本: docs/FSCRIPT_DECISION.md(判断の書き方の手本)/ out/robustness-audit-2026-09-02/LEDGER.md(発端の矛盾)/ docs/NEXT_SESSION.md / raptor .claude/skills/triz-ideation/SKILL.md(40 原理・39 特性の原典表)。


§0 2 分で読む

  1. ジレンマを 39 特性の 2 語で言う(例: 「信頼性 #27 を上げると測定精度 #28 が下がる」)。§5 の対応表で原理候補が出る。
  2. §3a の当該原理の行を読む。パターンごとに 4 軸(S 速度 / M メモリ / G 入出力汎用性 / D 検出性)の 1〜5 点と、3 点以下の軸をどの原理・パターン・コンテナで埋めるか(短所のカバー)が書いてある。
  3. パターンを決めたら §3b でコンテナを選ぶ(同じ 4 軸 + 古典的な落とし穴 + カバー)。コンテナが先に決まっている(ndarray を触るしかない等)なら §3c で原理→コンテナを逆引きする。
  4. §4 は fullseye への具体適用。fail-soft の矛盾を解いた実例(2026-09-02、backend_safe.py に実装済みの Mediator+台帳)と、順位づけした次の 9 手。
  5. 採点は「fullseye にその組合せを適用したとき」の値。汎用のパターン評価ではない。理由を読んで納得できなければ点を信じないこと。

読み方の記号: S/M/G/D = 5/4/5/5 = 速度 5・メモリ 4・汎用性 5・検出性 5。3 以下の軸には必ずカバー方法が付く(付いていなければ、その組合せをそのまま使うと弱点が残る)。マトリクスの = 強い対応(採点あり)、 = 弱い対応(採点なし・理由 1 行)、空欄 = 対応なし(パディングしない)。


§1 方法

1.1 原理 → パターンの写像規則

TRIZ 原理は「物質・場」の抽象操作、設計パターンは「責務・依存の配置」。両者を結ぶのは 何を分離・統合・仲介・記録するかという構造動詞である。写像は次の 3 段で行った(§3a の「なぜ」列はこの 3 段の要約):

問い 例(#24 仲介)
1. 原理の構造動詞 原理が対象に何をするか 「A と B の間に C を置く」
2. ソフトウェアの主語 対象は呼出し関係か・データか・時間か 呼出し関係(21 の _safe ラッパと台帳)
3. 一致するパターン 同じ構造動詞を持つパターン Mediator / Facade / Adapter / Proxy / Bridge

一致度: = 構造動詞が同じ(原理の定義がそのままパターンの定義になる)/ = 比喩的に一致(役に立つが、別の原理の方が本命)/ 空欄 = 一致しない。#29 流体・#37 熱膨張・#38 酸化剤・#39 不活性雰囲気は物理原理のため ○ が多い。無理に ● を立てていない

1.2 4 軸の 5 段階(具体基準)

採点は「fullseye の facade api.apply(v, name, a, b) 経路にその構造を入れたとき」を基準にする。hot path = 1 op 呼出し(4 MP 画像で数 ms〜数十 ms、docs/FSCRIPT_MEASUREMENTS.md)。

S 速度(speed) — 成功経路に加わる実行コスト

基準
5 成功経路に呼出しオーバーヘッドを足さない(失敗時のみ仕事をする / 定数の分岐 1 個)
4 呼出しごとに O(1) の作業(dict lookup 1 回、小オブジェクト 1 個の生成)
3 呼出しごとに O(1) だが同期・ロック・thread-local を伴う、または小さな O(k) 走査(k = op 数・stage 数)
2 データに対する追加パス 1 回(O(N)、N = 画素数)
1 データの追加パス複数回、または working set の複製・デバイス転送を伴う

M メモリ(memory) — 追加確保

基準
5 追加確保なし
4 上限つき定数(ring 256 件、lru_cache(64) 等)
3 O(op 数) or O(stage 数) のメタデータ(数百〜数千件の小オブジェクト)
2 呼出しごとに O(N) の一時配列 1 本
1 working set を複製する、または上限なしに成長する

G 入出力の汎用性(I/O generality) — その構造が受け入れる入出力の形

基準
1 固定の単一配列シグネチャ (v, a, b) -> array(現 ops.Op.fn)
2 単一入力 + 固定 kwargs(coerce, device)
3 sort タグつきの単一入力・単一出力(in_sort/out_sort を尊重)
4 型つき多入力 or 多出力(imgops_nary の arity 2、Attempt の (ok, value, reason))
5 任意の型つき多入力・多出力(graphengine.FullseyeGraph の DAG、fslib の ObjectSet)

D 検出性/監査可能性(detectability of silent failure) — 黙って壊れたときに気づけるか

基準
1 沈黙(例外を握りつぶし記録なし。2026-09-02 以前の 21 個の backends_*._safe)
2 記録されるが表面化しない(問い合わせないと分からない。旧 backends._ERRORS ring)
3 1 回だけ表面化する(warn once)or 環境変数でのみ strict 化
4 記録 + 表面化 + 呼出しごとに方針選択可(on_error=)
5 4 に加えて 分類(taxonomy)があり CI が空を断言できる(fallbacks() を assert)

1.3 「短所のカバー方法」列の規約


§2 パターン語彙(fullseye での実在箇所つき)

「既存」列は grep で実在確認したファイル。「(未使用)」は fullseye コアに該当構造が無いことを確認したという意味(tests/ tools/ examples/ は除外して検索)。

2.1 GoF 23 + Null Object

パターン 何か(1 行) fullseye 既存(検証済) 適用余地
Strategy 同じ契約の実装を差替える fslib.py:379-423 PROFILESop(name, backend)_REGISTRY[name][backend](numpy を oracle に native を選ぶ)/ ops.Op.fn ops.REGISTRY 側は gaussiancv_gaussian別 op(FSCRIPT_DECISION.md §1.5)→ backend 次元の統合(§4 候補 8)
Decorator 呼出しを包んで横断関心を足す backend_safe.guard()(L184)/ backends._safe(L64-69)と 21 の backends_*._safe(例 backends_scipy.py:16-)が すべて backend_safe.guard へ委譲(2026-09-02)
Facade 複雑系に単純な入口 fullseye/__init__.py(__all__ L307-)/ api.apply(on_error=, template=)(L1109)/ api.run_pipeline(on_error=)(L1184) 多入力(§4 候補 2)
Mediator 多対多の連絡を 1 点に集める backend_safe.record()(L113)= 全ラッパが報告する 1 点(2026-09-02 新設、22 ラッパ配線済) Studio・進化ループからの購読
Observer 変化を購読者に通知 studio.py Qt signal .connect( 177 箇所 / warnings.warn(FullseyeFallbackWarning)(backend_safe.py:137) Studio の台帳購読(fallback 発生をステータスバーへ)
Chain of Responsibility 順に処理者へ渡す api.py:875-895 op 名 → HALCON alias の順に解決(「Exact op name wins」)/ api._coerce_input(L907)/ _guard_input(sort 検査 → policy) alias 曖昧は api.ambiguous_aliases で公開済(__init__.py:312)
Template Method 骨格固定・一部を子で実装 comm.Channel(comm.py:40-57、未対応は NotImplementedError)/ 各 backends_*.build(Op, IMAGE, ...) の共通形
Null Object(非 GoF) 「何もしない」を正規の値で返す backend_safe.fallback(v, out_sort)(L287: feature→0.0 / region→zeros / contour→空 cs / match→[0,0,0]) これが「壊れた op = 働く恒等」問題の正体。単独では D=1、台帳と組で 4 以上
Command 操作をオブジェクト化 (未使用: QUndoStack/QUndoCommand 0 件) Studio の undo/redo・「パラメータ窓 → スクリプト行生成」(NEXT_SESSION B-4)
Memento 状態の snapshot/復元 fsruntime.GoldenVector(L60: inputs→expect の凍結証拠)/ fsruntime.sign()Recipe.digest() / fssystem.system_snapshot()(L175)
Proxy 代理が本体を遅延・制御 torch_lazy._LazyTorch(L83、torch 800 ms import の遅延) GPU 経路の Circuit Breaker(§4 候補 3)
Flyweight 共有して確保を減らす annotate.py:276,296 lru_cache のフォント/ラスタ共有(弱い一致) / ndarray view(tomography.py:1657 sliding_window_view)
Visitor 構造と操作を分離 (未使用: class *Visitor/visit_ 0 件。codegen.pyalgo_codegen.py は emit 関数群) fscript の eval/codegen 分離監査(§4 候補 7)
Interpreter 文法をクラスで表し評価 fscript.py Parser(L234)+ Node 群(L154-227)+ Env(L541)
Iterator 順次アクセスを抽象化 fslib.ObjectSet.__iter__(L298)/ acquire.py:269 yield self.grab()(フレーム流)
Builder 段階的に組み立て最後に固める fsruntime.compile_recipe(Recipe) -> ReadyRecipe(L201)
Prototype 複製で生成 evolve.py:23,98,102 genome .copy()(ndarray)
Adapter 異なる I/F を合わせる oss_adapter.py(BlockMatching/SGBM/… cv2 を fullseye 規約へ)/ accel_bridge.core_to_accel()(L35)
Bridge 抽象と実装を別階層で独立変化 fslib L1 契約(「One operator, several backends」L11)/ accel_bridge.plan()(L99: CPU/GPU 島分割) ops.REGISTRY へ拡張(§4 候補 8)
Composite 木構造を同一 I/F で graphengine.FullseyeGraph(L24: nodes dict + topological_order + nary) facade apply の多入力(§4 候補 2)
State 状態で振舞いを変える fsruntime.FullseyeRuntime.start/inspect(Recipe→ReadyRecipe→Runtime→Verdict)/ backend_safe._STRICT GPU 経路の open/closed(§4 候補 3)
Singleton 唯一のインスタンス fssystem.SYSTEM_PARAMS(L68)/ backend_safe のモジュール状態(_EVENTS/_COUNTS/_WARNED)
Abstract Factory 関連物の生成を族で backends_*.build(Op, IMAGE, REGION, FEATURE, CONTOUR, norm, binm)Op 列を生成(ops.py:969)
Factory Method 生成をサブクラス/関数に委ねる ops._c(name)(L805: C 文生成器の解決)/ Op(...) 組立

2.2 アーキテクチャ/堅牢性パターン

パターン 何か fullseye 既存(検証済) 適用余地
Pipeline / Pipes-and-Filters 段の列でデータを流す api.run_pipeline(L40 の docstring 側)/ ops.Stage(L1019)/ ops.decode(genome)(L1027)
Registry 名前→実装の表 ops.REGISTRY(L921 list)/ RT_BY_NAME(L922-923 dict、後勝ち)/ DROPPED_DUPLICATES(L1003 付近、捨てた重複を残す) param spec メタデータ(§4 候補 4)
Plugin 実行時に発見・追加 (静的: ops.py:969 が backend モジュール列を明示 import して build。entry_points 0 件) 外部 op パックの登録点(将来)
Result / Either 成否と理由を値で持ち回る metriccontract.Attempt(L170: ok/value/reason/metric、__bool__)/ pyramid_gate.GateResult(L47) op 出力への拡張(§4 候補 2)
Circuit Breaker 連続失敗で経路を遮断 (未使用: circuit/breaker の hit は algo.py の short-circuit 注記のみ) GPU 経路(§4 候補 3)
Bulkhead 区画分離で波及を止める (未使用) 進化探索の per-op 予算(弱)
Retry / Backoff 再試行 (コア未使用。learn_evis.pytools/ のみ) 通信 comm.py の再送(対象外)
Lazy / Memoize / Cache 遅延・記憶 torch_lazy.py / annotate.py:276 lru_cache(64) / volio.py:430 np.load(mmap_mode="r") 台帳 ID→Op のキャッシュは既に dict
Object Pool 生成物を使い回す (未使用。accel.py:275 注記「GPU 常駐のまま」は意図のみ) GPU バッファ(RTX5090 ゲート後)
Event Sourcing / Ledger 事象を追記し状態を導出 backend_safe._EVENTS(L60、ring 256)+ _COUNTS + fallbacks()/events_since(mark()) / ops.DROPPED_DUPLICATES / tests/test_backend_safe.py CI 常設 probe(§4 候補 1)
Saga 多段の補償つき手続き (未使用)
Health Check / Probe 生存・退化を能動検査 tests/test_backends_typed_liveness.py / out/robustness-audit-2026-09-02/probe_runtime_degeneracy.py / fsruntime.GoldenVector / fullseye.capabilities()(__init__.py:294) selfcheck() + CI 常設(§4 候補 1)
Feature Flag / Policy Object 挙動を設定で切替 fssystem.set_system/get_system/system()(L123-160)/ IMGEVOLVE_STRICT_BACKENDSFULLSEYE_STRICTFULLSEYE_QUIET_FALLBACK(backend_safe.py:75-76)/ apply(coerce=, device=, on_error=) + FULLSEYE_ON_ERROR(api._policy L1028) op 単位の既定 policy(§3a #3)
Sentinel / Tainted value 特別値で状態を運ぶ api._LABEL_READING_OPS(L904 frozenset)/ api._NDIM_OK(L1025)/ np.ma.is_masked(mathops.py:139)/ fslib.FsNotReady sort 跨ぎ恒等の検出(§4 候補 1・6)
Tagged output / Provenance 出力に来歴を付ける fsruntime.sign()Recipe.digest()(L105)/ backend_safe.record()source タグ(op/gpu/import/input、api.py:1058,1095,1104,1230ops.py:979) run_pipeline の trace(§4 候補 6)

§3a マトリクス 1: TRIZ 40 原理 × 設計パターン

3a.1 強対応マトリクス(40 × 12)

列 = 数値 op ライブラリに最も効く 12 パターン。Str=Strategy/Registry, Dec=Decorator, Fac=Facade, Med=Mediator, Nul=Null Object, Res=Result/Either, Pip=Pipeline/Composite, Lzy=Proxy/Lazy/Cache, Led=Ledger/Event Sourcing, Pol=Policy/Feature Flag, Prb=Health Probe, Prv=Provenance/Tagged output。 強 / 弱 / 空欄 なし。

# 原理 Str Dec Fac Med Nul Res Pip Lzy Led Pol Prb Prv
1 分割                
2 引き出し                  
3 局所的性質                  
4 非対称化                    
5 統合                
6 多用途化                      
7 入れ子                    
8 釣り合い                    
9 先取り反作用                    
10 先取り作用                    
11 緩衝                      
12 等ポテンシャル                  
13 逆転                    
14 球面化                      
15 動性化                    
16 部分的に                    
17 多次元化                    
18 振動                      
19 周期化                    
20 有用作用継続                    
21 高速化                    
22 災い転じて福                    
23 フィードバック                  
24 仲介                
25 セルフサービス                  
26 コピー                  
27 使い捨て                      
28 機械系の置換                      
29 流体                      
30 柔らかい膜                      
31 多孔質                      
32 色変化                    
33 同質性                  
34 排除と再生                    
35 パラメータ変化                    
36 相変化                    
37 熱膨張                      
38 強い酸化剤                    
39 不活性雰囲気                      
40 複合材料                

3a.2 原理ごとの対応パターンと 4 軸採点(fullseye 適用時)

各行: パターン なぜ一致するか S M G D 短所のカバー(3 点以下の軸のみ)。採点は §1.2 の基準。「既存」= 検証済ファイル。

#1 分割(Segmentation)

パターン なぜ S M G D 短所のカバー
Result / 例外分類(taxonomy) 「失敗」を backend-absent / op-failed / input-sort-mismatch に分割すると台帳が読める。既存: backend_safe.record(source=op\|gpu\|import\|input) 5(失敗時のみ) 4(ring 256) 5(シグネチャ不変) 5
Pipeline / Pipes-and-Filters op を独立 filter に分割。既存 ops.Stageapi.run_pipeline 5 2(段ごとに O(N) 中間配列) 3(単一 sort の鎖) 2(段の失敗が次段の入力に化ける) M: #34 排除と再生 × Object Pool(中間バッファ再利用、§3b Pipeline×ndarray)/ G: #17 多次元化 × Composite(graphengine)/ D: #23 × Ledger(段ごとに current_op で帰属、既存 backend_safe.current_op)
Bulkhead(○) op ごとの予算区画。進化の 1 個体が全体を止めないため 3(区画ごとの計時) 4 5 3(超過は分かるが原因は分からない) S: #21 高速化 × Lazy(計時を失敗時のみ)/ D: #23 × Ledger に timeout 種別を足す

#2 引き出し(Extraction)

パターン なぜ S M G D 短所のカバー
Decorator 横断関心(例外握り・sanitize)を op 本体から引き出す。既存 backend_safe.guard 5(try は成功時ゼロコスト) 5 1((v,a,b) 固定) 4(guard 経由なら記録) G: #17 × Composite(nary は graphengine._eval が別経路で吸収、§4 候補 2)
Facade 内部 API 群から利用者向け面だけ引き出す。既存 fullseye/__init__ 4(名前解決 1 回) 3(__all__ 400 行 + alias dict) 2(coerce,device,on_error 固定 kwargs) 4(on_error= + 入力 sort 記録、2026-09-02) G: #17 × Composite(§4 候補 2)
Mediator 21 か所に散った握りつぶしを 1 点へ引き出す。既存 backend_safe.record 5 4 5 5

#3 局所的性質(Local Quality)

パターン なぜ S M G D 短所のカバー
Strategy / Registry メタデータ op ごとに違う性質(sort、arity、param 型)を表に持つ。既存 ops.Op(in_sort,out_sort)api._LABEL_READING_OPS(局所例外) 4(dict lookup) 3(O(op 数)) 4(型つき param spec で kwargs 化可能) 4(範囲外を検出可) M: 許容(861 op × 数百 B = 数百 KB)。カバー不要だが、成長時は #26 コピー × Flyweight(共通 spec を共有)
Policy(op 単位の on_error) 計測 op は fail-closed、描画 op は fail-soft — 局所で方針を変える。既存 metriccontract(計測だけ strict) 5 3 5 5 M: 上と同じ表に相乗り

#4 非対称化(Asymmetry)

パターン なぜ S M G D 短所のカバー
Result(ok/value/reason) 成功と失敗を対称な「値」にせず、失敗側だけ理由を持つ非対称な型。既存 metriccontract.Attempt 4(小オブジェクト 1 個/呼出し) 4 4 5
Policy(strict vs tolerant の二重契約) 計測は fail-closed、画像は fail-soft の非対称。既存 MetricContractError + attempt()(契約違反だけ翻訳、他の例外は素通し metriccontract.py:195-) 5 5 5 5

#5 統合(Merging)

パターン なぜ S M G D 短所のカバー
Composite(多入力を 1 つの入力に統合) apply((img1,img2), 'add_image')。既存 graphengine.add(inputs)、未: facade 5 5 5 4(arity 不一致は明示エラーにできる)
Mediator(22 ラッパの統合) 既存 backends._safe + 21 の backends_*._safebackend_safe.guard(配線済) 5 4 5 5
Registry(op 宇宙の統合) 進化 ops.REGISTRY と台帳 op(backends_typed)の統合。既存 ops.py:969 _extra += _b.build(...) 4 3 3 3(同名は後勝ちで黙って消えていた) D: #23 × Ledger — 既存 ops.DROPPED_DUPLICATES(捨てた分を残す)+ tests/test_op_contracts.py で assert

#6 多用途化(Universality)

パターン なぜ S M G D 短所のカバー
Facade apply が全 sort・全 backend で 1 入口 1 つの関数が image/region/volume/points を受ける 4 3 2(単入力・a,b 2 ノブ) 4 G: #17 × Composite(多入力、§4 候補 2)+ #3 × param spec(型つき kwargs、§4 候補 4)
Adapter(○) cv2/skimage/torch を同じ (v,a,b) に合わせる。既存 oss_adapter.py 4 2(dtype 変換で O(N) 複製、_to_u8) 3 2(変換誤差は沈黙) M: #26 × view(変換不要な dtype は素通し)/ D: #26 コピー × Probe(difftest/parity.py の cross-backend 比較、既存 docs/PARITY_CROSSBACKEND.md)

#7 入れ子(Nested Doll)

パターン なぜ S M G D 短所のカバー
Decorator の積層 coerce → guard → fn → sanitize → region01 の入れ子。既存 backend_safe.guard + sanitize(L331) 4(層ごとに関数呼出し 1 回 ≈ 数百 ns) 5 1 4 G: 上記 #2 と同じ
Composite(graph in graph) サブグラフを 1 ノードとして使う。既存 FullseyeGraph.to_dict/from_dict は平坦(入れ子未対応) 4 3 5 3(内側の失敗が外に伝わらない) D: #23 × Ledger の current_op を graph ノード ID で階層化("g1/n3")

#8 釣り合い(Anti-Weight)

パターン なぜ S M G D 短所のカバー
Lazy(import 重量を遅延で相殺) torch 800 ms を必要時まで持ち上げない。既存 torch_lazy._LazyTorch 5(初回のみ) 5 5 3(遅延 import の失敗が初回呼出しで露見) D: #9 先取り反作用 × Probe(fullseye.capabilities() で事前申告、既存)
Null Object(○) 失敗を「無害な値」で釣り合わせる — 釣り合いは沈黙を生む 5 5 3 1 D: #24 × Mediator + #23 × Ledger(単独使用禁止。§4 実例)

#9 先取り反作用(Preliminary Anti-Action)

パターン なぜ S M G D 短所のカバー
Probe(import 時 or 明示 selfcheck()) 壊れた op を利用者が踏む前に検出。既存 test_backends_typed_liveness.pyprobe_runtime_degeneracy.py(CI/手動のみ) 5(hot path 外)/ import 時なら 1(861 op 実行) 4 5 5 S: 時間分離 — import 時ではなく CI と fullseye.selfcheck()(§4 候補 1)
Decorator(入力 sort 検証)(○) 不正入力を op の前で止める。既存 api._check_input_sort(ndim/dtype)→ _guard_input が policy=raise なら例外、それ以外は source="input" で記録 4 5 3 4 G: #35 × Policy(coerce=False + on_error="raise")。sort 跨ぎ恒等は捕まえない → §4 候補 1

#10 先取り作用(Preliminary Action)

パターン なぜ S M G D 短所のカバー
Builder / 事前コンパイル 実行前に検証・固定。既存 fsruntime.compile_recipe -> ReadyRecipe(golden 照合込み) 5(実行時ゼロ) 3(ReadyRecipe の複製) 4 5(golden 不一致は FsNotReady) M: 許容(recipe は KB 単位)
Cache / Memoize カーネル・フォントを先に作る。既存 annotate.lru_cache(64)。未: accel._gauss_kernel は毎回生成 5(hit 時) 4 5 2(古いキャッシュは沈黙) D: #26 × Provenance(キャッシュ鍵に version/fingerprint。既存 docs/ops の frontmatter fingerprint の流儀)
Probe(○) 事前検査は #9 の方が本命

#11 緩衝(Cushioning)

パターン なぜ S M G D 短所のカバー
Null Object(sort 妥当な fallback) 失敗時に下流を壊さない値。既存 backend_safe.fallback 5 5 3 1(単独) D: #24 Mediator × #23 Ledger × #32 色変化(warn once)= 既存 guard+record+FullseyeFallbackWarning緩衝は必ず記録と組にする
Circuit Breaker 連続失敗する経路を遮断し再試行コストも緩衝。未使用 5(open 後は分岐 1 個) 4(op ごとの状態 dict) 5 4
Retry(○) 決定的な数値 op には無意味(同じ入力は同じ失敗)。通信のみ 適用外

#12 等ポテンシャル(Equipotentiality)

パターン なぜ S M G D 短所のカバー
一様シグネチャ(Strategy) 全 op が (v,a,b)、持ち上げ不要で差替え可。既存 ops.Op.fn 5 5 1 3 G: #3 × param spec(型つき kwargs を a,b に写像する層、§4 候補 4)+ #17 × Composite(nary、§4 候補 2)
Facade(HALCON alias を同じ高さに) api.py:875 名前 → alias 4 3 2 3 上と同じ
Result 一様型(○) 全 op の返りを Attempt 型に揃えると facade が破壊的変更 4 4 4 5 G/破壊性: 条件分離 — 内層は Result、facade は値(§4 候補 7)

#13 逆転(The Other Way Around)

パターン なぜ S M G D 短所のカバー
Policy(既定の反転: fail-soft 既定 → strict 既定) 「既定が握る」を逆にすると CI が真実を語る。既存 IMGEVOLVE_STRICT_BACKENDS は opt-in 5 5 5 5(CI で strict、利用者は fallback)
Ledger 逆引き(○) 「op → 失敗」でなく「失敗 → op」で読む(fallback_counts()) 5 4 5 5

#14 球面化(Spheroidality)

パターン なぜ S M G D 短所のカバー
Ledger の ring(○) 「直線的に伸びる log」を「環状」にする。既存 _EVENTS + del _EVENTS[:-256] 4(list 切詰めは O(1) 償却でない: 溢れるたび O(256)) 4 5 3(古い事象が消える) S: §3b Ledger×deque(maxlen)/ D: #23 × _COUNTS(件数は消えない、既存)

#15 動性化(Dynamicity)

パターン なぜ S M G D 短所のカバー
Strategy(実行時 backend 切替) 既存 fslib.PROFILES(studio/reference/industrial) 4 3 4 3(profile 間の差は parity test 頼み) D: #26 × Probe(difftest/parity.py を profile ペアで)
Policy / State(実行時 strict 切替) 既存 backend_safe.strict_mode() context manager 5 5 5 4

#16 部分的に(Partial or Excessive Action)

パターン なぜ S M G D 短所のカバー
Probe(標本抽出) 全 861 op を毎回でなく構造データ 1 本で「多くも少なくもなく」検査 5(hot path 外) 4 5 4(標本外は見ない) D: #19 周期化 × CI 常設 + #26 × 乱数ではなく構造データ(memory feedback_random_test_data_hides_structural_defects)
Result(部分成功)(○) 「一部の点だけ測れた」を値で返す。既存 attempt_all 4 4 4 5

#17 多次元化(Another Dimension)

パターン なぜ S M G D 短所のカバー
Composite / Graph(鎖 → DAG) 1D の stage 列を 2D の DAG に。既存 graphengine.FullseyeGraph 4(topo sort O(V+E) 1 回) 3(ノード dict) 5 3(validate() は構造のみ) D: #23 × Ledger(ノード ID で帰属)
Provenance(出力に来歴の次元を足す) 値 + (op, backend, fallback?) 4 4 3(ndarray subclass は numpy 演算で剥がれる) 5 G: 空間分離 — 配列に付けず run_pipeline の trace(side channel dict)に付ける(§4 候補 6)

#18 振動(Vibration)

パターン なぜ S M G D 短所のカバー
Probe(ファジング = 入力を揺らす)(○) 既存 tools/chain_fuzz.py。ただし TYPE_CHECKS['labels'] が緩く自己参照(LEDGER #9) 5(CI) 4 5 3 D: #38 強い酸化剤 × strict 述語(型契約テストを進化側の厳しい sort 契約に揃える)

#19 周期化(Periodic Action)

パターン なぜ S M G D 短所のカバー
Probe(CI 常設の周期実行) 連続監視でなく commit ごと。既存 tests/test_op_example_coverage.py 5 5 5 4
Ledger の周期 flush(○) 長時間バッチで ring が溢れる前に events_since(mark()) で回収。既存 API 5 4 5 4

#20 有用作用継続(Continuity of Useful Action)

パターン なぜ S M G D 短所のカバー
Lazy / 常駐 Runtime import 1.8 s を 1 回で済ませ、以後は休みなく処理。既存 fsruntime.FullseyeRuntime.start 5 3(常駐分) 4 4(deadline_ms 超過は Verdict) M: 許容(設計要件 FSCRIPT_DECISION.md §1.4「Runtime 常駐が必須」)
Pipeline(○) 段間で GPU 常駐(accel.py:275 注記) 4 2 3 2 M/D: #36 相変化 × Object Pool + Ledger の source="gpu"

#21 高速化(Hurrying / Skipping)

パターン なぜ S M G D 短所のカバー
Decorator の zero-cost 成功経路 try/except は成功時にコスト無し。guard は失敗時だけ働く 5 5 1 4 G: #2 と同じ
Cache(hit で丸ごとスキップ) 既存 annotate.lru_cache 5 4 5 2 D: #10 と同じ(鍵に fingerprint)

#22 災い転じて福(Convert Harm into Benefit)

パターン なぜ S M G D 短所のカバー
Ledger(失敗記録 = dead-op 監査) 8 Agent の監査を fallbacks() 1 回に置き換える。既存(2026-09-02) 5 4 5 5
Probe(ファザーのクラッシュ = 回帰テスト) 既存 tests/test_fix_clahe_coverage.py のような「発見 → テスト化」 5 5 5 4

#23 フィードバック(Feedback)

パターン なぜ S M G D 短所のカバー
Ledger → CI assert 出力(失敗)を入力(ゲート)に戻す。assert fullseye.fallbacks() == [] 5 4 5 5
Observer(warn once / Studio 通知) 既存 FullseyeFallbackWarning、Studio 未 5(初回のみ) 4(_WARNED set) 5 3(2 回目以降は沈黙 = 設計どおり) D: fallback_counts() で件数は残る(既存)。時間分離の意図的トレードオフ
Provenance(○) 台帳 event の seq/source が来歴 Ledger に含む

#24 仲介(Mediator)

パターン なぜ S M G D 短所のカバー
Mediator × Ledger 全ラッパ(22)が record() 1 点へ。§4 実例の中核 5(失敗時 dict append 1 回 + lock) 4(ring 256 + counts O(op 数)) 5(シグネチャ不変) 5
Facade(利用者との仲介) on_error= を決める外層 4 3 2 4 G: #17 × Composite
Decorator / Proxy(○) guard 自体が仲介の実体 Mediator に含む

#25 セルフサービス(Self-Service)

パターン なぜ S M G D 短所のカバー
Registry の自己記述(param spec) op が自分の引数型・範囲を申告し、Studio/fscript/docs が自分でウィジェット・行・表を作る。既存: studio._ARG_ROLES(L1185、人間可読の文字列のみ、一部 op)。§4 候補 4 5 3 4 4 M: 許容
Probe(自己検査 selfcheck()) ライブラリが自分の op を自分で検査 5(明示呼出し) 4 5 5
Null Object(○) fallback が入力から自分で妥当値を導く(fallback(v, out_sort)) #11 参照

#26 コピー(Copying)

パターン なぜ S M G D 短所のカバー
Probe(Python 実装 = 安価なオラクル複製) native/GPU を numpy の写しと比べる。既存 fslib L14「numpy implementation is the oracle」、difftest.py(ただし C 側は未実行 FSCRIPT_DECISION §1.5) 5(CI) 2(両実装の出力を保持) 4 5 M: #16 × 標本(全画素でなく構造データ数枚)
Provenance / Memento(golden vector) 検証時の出力の写しを凍結し照合。既存 fsruntime.GoldenVector 5 3 4 5
Lazy(○ view = 複製の回避) §3b Flyweight×view 参照

#27 使い捨て(Cheap Short-Living Objects)

パターン なぜ S M G D 短所のカバー
Result(○ 呼出しごとの小オブジェクト) Attempt を毎回作って捨てる。永続化しないので安い 4 4 4 5
使い捨て context(strict_mode() with 文) 既存 backend_safe.strict_mode 5 5 5 4

#28 機械系の置換(Mechanics Substitution)

パターン なぜ S M G D 短所のカバー
Strategy / Bridge(numpy → native/GPU) 同じ契約で「動力源」を替える。既存 fslib.op(name, backend)accel_bridge.plan() 5(切替は plan 時) 2(device 転送でコピー) 4 3(GPU 失敗は source="gpu" で記録されるが毎回再挑戦) M: #20 × 常駐(島単位で転送、既存 plan)/ D: #36 × Circuit Breaker(§4 候補 3)

#29 流体(Pneumatics & Hydraulics)

パターン なぜ S M G D 短所のカバー
Pipeline / generator(○ 「流す」の比喩) フレームを流体のように流す。既存 acquire.stream()yield §3b Pipeline×generator を参照。原理としては #20 が本命

#30 柔らかい膜(Flexible Shells & Thin Films)

パターン なぜ S M G D 短所のカバー
Decorator(薄い膜 = guard) op 本体を変えず薄い膜で包む。既存 guard(w 関数 1 層) 5 5 1 4 G: #2 と同じ
Adapter(○ 膜としての変換層) oss_adapter #6 参照        

#31 多孔質(Porous Materials)

パターン なぜ S M G D 短所のカバー
Plugin / Hook(○ 拡張の穴) 外部 op パックの登録点。既存は静的 import(ops.py:969) 4 3 5 2(外部 op の失敗も同じ guard を通れば 4) D: #24 × Mediator を登録点で強制(guard を通らない op を登録不可に)

#32 色変化(Colour Change)

パターン なぜ S M G D 短所のカバー
Provenance / Warning category(見えないものを色づけ) fallback を FullseyeFallbackWarning という専用カテゴリにする → filterwarnings で選別可。既存 5 5 5 4
Ledger の source タグ(○) op/gpu/import/input の 4 色 Ledger に含む        

#33 同質性(Homogeneity)

パターン なぜ S M G D 短所のカバー
Mediator(全 backend が同じ guard) 21 個の私家版 _safeguard へ委譲して同質化(済) 5 4 5 5
Result の同質型 全計測が Attempt を返す。既存 metriccontract 4 4 4 5
Strategy(同じ契約の backend 群) fslib の「numpy = oracle」規約 5 3 4 3 D: #26 × Probe

#34 排除と再生(Discarding & Recovering)

パターン なぜ S M G D 短所のカバー
Ledger の ring 排除 + counts 再生 事象は捨て、件数は残す。既存 _EVENTS/_COUNTS 5 4 5 4
Cache eviction / Object Pool lru_cache(64) の LRU 排除。GPU バッファ再生は未 5 4 5 2 D: #10 と同じ

#35 パラメータ変化(Parameter Changes)

パターン なぜ S M G D 短所のカバー
Policy(on_error="fallback"\|"warn"\|"raise") 構造を変えずパラメータで挙動の相を変える。既存 api.apply/run_pipeline(on_error=) + FULLSEYE_ON_ERROR + strict_mode() 5 5 5 4(呼出しごと選択)
Feature Flag(set_system) 既存 fssystem(HALCON 流) 5 5 5 3(設定の食い違いは沈黙) D: system_snapshot() を Recipe の digest に含める(#26 × Provenance)
Strategy(○) profile 切替は #15

#36 相変化(Phase Transitions)

パターン なぜ S M G D 短所のカバー
State / Circuit Breaker(closed → open → half-open) GPU 経路の相転移。1 回目の失敗で記録+warn、以後は CPU 固定、明示リセットで再挑戦 5 4 5 4
Builder の相(Recipe → ReadyRecipe) 既存 fsruntime。「可変」→「凍結」の相転移 5 3 4 5
Lazy(○ 未ロード → ロード済) torch_lazy #8 参照        

#37 熱膨張(Thermal Expansion)

パターン なぜ S M G D 短所のカバー
Backoff(○ 膨張する待ち) 数値 op に再試行は無意味(#11)。通信のみ 適用外
拡散→収縮(○) 進化環境の「拡散(採掘)→収縮(進化)」(memory project_fullseye_evolution_environment_2026_09_01)は原理 #37 より #36 相変化

#38 強い酸化剤(Strong Oxidants)

パターン なぜ S M G D 短所のカバー
Policy(strict = 反応を激しくして露見させる) CI では FULLSEYE_STRICT=1 で全 fallback を例外に 5 5 5 5
Probe(敵対検証・ファザー) 既存 out/.../adversarial/tools/chain_fuzz.py 5 4 5 4

#39 不活性雰囲気(Inert Atmosphere)

パターン なぜ S M G D 短所のカバー
Null Object(不活性な出力) fallback 値は下流で「反応しない」(zeros / 0.0 / 空 contour) 5 5 3 1 D: #11 と同じ(必ず Ledger と組)
Bulkhead(○ 隔離) 未使用

#40 複合材料(Composite Materials)

パターン なぜ S M G D 短所のカバー
Decorator + Ledger + Policy + Warning(= guard) 単独では D=1 の Null Object を、4 パターンの複合で D=5 に。§4 実例そのもの 5 4 5 5
Strategy + Probe(numpy oracle + native) fslib の設計。複合の片方(native)を他方(numpy)で常時検証 5 2 4 5 M: #16 × 標本

§3b マトリクス 2: 設計パターン × コンテナ型

パターンを決めた後、「その責務をどのコンテナで持つか」が速度・メモリ・検出性を実際に決める(同じ Ledger でも list ring と deque(maxlen) では S が違う)。ここでは fullseye で実在するコンテナを列にし、自然な組合せ(●)だけを採点する。

3b.1 コンテナ列の定義と fullseye での実在箇所(検証済)

記号 コンテナ fullseye 実在箇所 備考
L list ops.REGISTRY(L921)/ backend_safe._EVENTS(ring: del _EVENTS[:-256]) 順序あり・末尾 O(1)・先頭削除 O(n)
T tuple ops.OPS(L924 back-compat)/ api.run_pipeline の stage (name,a,b) 不変・hashable
D dict ops.RT/_BY_NAME(L922-923、後勝ち)/ fssystem.SYSTEM_PARAMS(L68)/ graphengine.nodes / fslib._REGISTRY[name][backend] / backend_safe._COUNTS 挿入順保持(3.7+)
S set/frozenset backend_safe._WARNED(warn once)/ api._LABEL_READING_OPS(L904)/ ops._UNCLIPPED_SORTS(L1058) 所属判定 O(1)
Q collections.deque segmentation.py:105(flood fill BFS)/ physarum_search.py:284 両端 O(1)・maxlen で ring
H heapq mesh_decimate.py:262,283(edge collapse 優先度、version stamp で stale 除外)/ meshrepair.py:518 遅延削除が定石
A array.array 未使用(0 件) ndarray が代替
B bytes comm.py:245(Modbus frame)/ dsp.py:62 frombuffer / fslib.py:312 Seq.__hash__ = tobytes() 不変・境界越え
N ndarray(密) 全 op。acoustics.py:329 ascontiguousarrayorder="F"/asfortranarray は 0 件(全て C 順) dtype/連続性が速度を決める
V ndarray view / copy tomography.py:1657imgforensics.py:1108 sliding_window_view / evolve.py:23 genome .copy() / fslib.Seq(コピー + write-protect) view = 0 コピーだが alias
R 構造化/masked 配列 mathops.py:139,221,857 np.ma.is_masked / 構造化 dtype はコア未使用 mask = 値つき sentinel
P scipy.sparse mesh_smooth.py:84(COO→CSR Laplacian)/ geodesic3d.py:20 csr / colortransport.py 疎グラフ・疎行列
M np.memmap volio.py:430 np.load(mmap_mode="r") / scale.py:147,162 open_memmapprocess_tiled_memmap working set > RAM
G torch tensor(device) accel.py:42 as_tensor(device=) / accel_bridge.plan/run 転送コストが支配
C @dataclass ops.Op/ops.Stage/fsruntime.RecipeGoldenVector/metriccontract.Attempt/pyramid_gate.GateResult(22 ファイル) 自己記述・型ヒント
W 台帳行(dict の list) backend_safe.record()ev dict / ops.DROPPED_DUPLICATES / runtime_degeneracy.json 追記のみ
K 木(nested dict / kd-tree) curvature3d.py:29 cKDTree / fscript AST(Node 群)/ octree 未使用 空間索引・構文木
E グラフ(隣接 dict / CSR) graphengine.FullseyeGraph(nodes dict + topological_order)/ mesh_smooth CSR 隣接 DAG 実行・Laplacian
Z queue.Queue / threading.Lock backend_safe._LEDGER_LOCK / video.py:246 / queue.Queue 未使用 スレッド境界
I generator / iterator acquire.py:269 yield self.grab() / fslib.ObjectSet.__iter__(L298) 遅延・流し込み
U functools.lru_cache annotate.py:276,296(maxsize 64 / 8) 鍵は hashable 必須

3b.2 適合マトリクス(パターン × コンテナ)

自然な組合せ(3b.3 で採点)/ 可能だが本命でない / 空欄 = 使わない。

パターン L T D S Q H A B N V R P M G C W K E Z I U
Registry / Strategy                                
Decorator                                        
Facade                                  
Mediator                                  
Observer                                    
Chain of Responsibility                                    
Template Method                                        
Null Object                                      
Command                                  
Memento                                  
Proxy / Lazy                                    
Flyweight                                    
Visitor                                    
Interpreter                                  
Iterator                                  
Builder                                      
Prototype                                      
Adapter                                  
Bridge                                      
Composite                                      
State                                      
Singleton                                      
Pipeline                              
Plugin                                        
Result / Either                                    
Circuit Breaker                                      
Bulkhead                                        
Retry / Backoff                                        
Cache / Memoize                                      
Object Pool                                    
Ledger / Event Sourcing                              
Saga                                        
Health Probe                                      
Policy / Feature Flag                                      
Sentinel / Tainted                                      
Provenance / Tagged                                  

3b.3 採点(● セルのみ。列 = S/M/G/D + 古典的な落とし穴 + 短所のカバー)

パターン × コンテナ fullseye での形 S M G D 落とし穴 短所のカバー(≤3 の軸)
Registry × D(dict) ops.RT[name] 5 3 3 3 後勝ちで同名が黙って消える D: Ledger × W — 既存 DROPPED_DUPLICATES + tests/test_op_contracts.py / G: Registry × C(param spec)
Registry × L(list) ops.REGISTRY の登録順 4(線形探索は禁物) 3 3 3 順序が「先勝ち/後勝ち」の意味を持ち、import 順で挙動が変わる S/D: 常に D を索引にし、L は列挙専用に(既存 _BY_NAME)
Registry × C(dataclass) Op(name, category, halcon, in_sort, out_sort, fn, c_stmt) 5 3 4(params フィールドを足せば型つき kwargs) 4(型ヒントで静的検査可) フィールド追加で 861 op の生成側を全部触る M: 許容 / #3 局所的性質 × 既定値(params=())で段階導入
Facade × D HALCON alias → op 名 の dict(api.py:875) 4 3 2 3 alias 衝突を先勝ちで隠す(LEDGER「曖昧解決 2 件」) D: Ledger × W — 既存 api.ambiguous_aliases(__init__.py:312 で公開)/ G: #17 × Composite
Facade × N(ndarray) apply(image: ndarray) 5 5 1 4(_check_input_sort が ndim/dtype を見て source="input" 記録) 1-D を 2-D op に渡しても以前は通った(LEDGER #3) G: Composite × E(多入力は graph へ)
Mediator × D _COUNTS[name] += 1 5 3(O(op 数)) 5 5 なし(件数は消えない) M: 許容
Mediator × S(set) _WARNED(warn once) 5 3 5 3(2 回目以降は沈黙 = 意図) clear_fallbacks(reset_warnings=True) を忘れると再警告しない D: Ledger × D(件数)で補完(既存)
Mediator × W(台帳行) record()ev = {name, source, out_sort, error, seq} 5 4 5 5 行が dict なのでスキーマ drift が沈黙 (D は 5 だが)将来 Result × C(dataclass 化)で型を固める
Mediator × Z(Lock) _LEDGER_LOCK 3(失敗時のみ lock、成功経路はゼロ) 5 5 5 GIL 下でも del _EVENTS[:-N] と append の競合はあり得るので必要 S: 失敗時のみなので実質 5。成功経路に lock を置かない(#21 高速化)
Observer × L 購読者 list(Qt signal 内部) 4 3 5 3(購読漏れは沈黙) 例外を投げる購読者が他を止める D: Decorator × try で購読者ごとに隔離(#39 不活性)
Observer × S _WARNED = 「一度通知した」集合 5 3 5 3 上と同じ 上と同じ
Chain × L 処理者 list を順に(alias 解決) 4 3 3 2(どの処理者が採ったか残らない) 順序依存 D: Provenance × W(採用した処理者名を記録)
Chain × Q(deque) BFS(segmentation.py:105) 5(両端 O(1)) 2(フロンティア O(N) 最悪) 3 4(終了しない = 明白) list.pop(0) を使うと O(N²) M: #16 × 部分(タイル、scale.process_tiled)
Null Object × N fallbackzeros/clip(v) 5 2(image sort は clip で O(N) 複製) 3 1 恒等と区別不能 D: Mediator × W(既存 guard が必ず record)/ M: np.clip(v, 0, 1, out=...) は入力を壊すので不可 — 許容
Command × L / Q / H undo スタック(未使用)/ 優先度キュー(mesh_decimate) 5 / 5 / 4(log n) 3 / 4(maxlen) / 3 5 3 heapq は stale entry(既存は version stamp int(vver[i]) で遅延削除 = 正解) D: Command × C(コマンドに applied: bool を持たせる)
Memento × T / B / V / C GoldenVector(C)/ Seq.__hash__tobytes()(B)/ genome .copy()(V) 5 / 4(O(N) hash) / 4(O(N) copy) / 5 5 / 4 / 2 / 3 4 5 view を snapshot と誤認して後で書き換わる M(V): fslib.Seq 方式 = コピー + setflags(write=False)(既存 L240)
Proxy/Lazy × M(memmap) volio.np.load(mmap_mode="r")scale.process_tiled_memmap 4(ページフォルト) 5 3 3(OS が握るので I/O エラーが遅れて出る) 書込み memmap の flush 忘れ D: Probe × W(タイル完了を台帳に)/ G: Pipeline × M 参照
Proxy/Lazy × I(generator) acquire.stream() 5 5 4 2(途中で切れても呼び手は「終わった」と思う) 1 回しか回せない D: Result × C(終端理由を返す)+ limit 到達を明示
Flyweight × D / V / U 共有 kernel dict / view / lru_cache(64) 5 4 5 2(共有物の変更が全員に波及) view が alias、cache の鍵に version 無し D: Sentinel × V(setflags(write=False))+ Provenance × D(鍵に fingerprint)
Visitor × K / E AST / graph の走査 4 5 5 4 ノード型追加で Visitor 全部を直す (fullseye 未使用。fscript は isinstance 分岐。§4 候補 7)
Interpreter × D / C / K fscript.Env(D)・Node dataclass(C)・AST(K) 4 3 4 4(FScriptError に行番号) builtins が dict でなく if 連鎖だと分岐が増える 既存で 4 以上。memory feedback_nested_conditionals_use_a_table
Iterator × L / Q / I ObjectSet / BFS / stream 5 5 4 3 反復中の変更 D: Memento × T(反復前に tuple 化)
Builder × T / C RecipeReadyRecipe(frozen dataclass) 5 3 4 5 「Ready」なのに可変フィールドを持つ 既存 FsNotReady で fail-closed
Prototype × V genome .copy() 4 2 3 4 copy() 忘れで親子が alias M: 許容(genome は小)/ 画像は #26 × view
Adapter × B / N / P / G Modbus bytes / dtype 変換 / COO→CSR / as_tensor 4 / 3(dtype 複製) / 3 / 1(転送) 5 / 2 / 3 / 1 3 2(変換の丸めが沈黙) S/M(G): #20 × Object Pool × G(常駐)/ D: Probe × N(parity.py の cross-backend 比較)  
Bridge × D / G fslib._REGISTRY[name][backend] / CPU-GPU 島 accel_bridge.plan 5 3 4 3 backend 間の意味論差 D: #26 × Probe(numpy oracle)、既存 difftest/parity
Composite × K / E FullseyeGraph(隣接 dict + topo sort) 4 3 5 3(validate() は構造のみ) 循環・未定義入力 D: Ledger × W(ノード ID で current_op)
State × D / C _STRICT / FullseyeRuntime 5 5 5 4 グローバル状態のテスト間漏れ (既存 strict_mode() context で復元)
Singleton × D SYSTEM_PARAMS / モジュール状態 5 5 5 3(設定の食い違いが沈黙) テスト分離 D: Memento × C(system_snapshot() を digest に)
Pipeline × L / T stage 列 [(name,a,b)] 5 3 3 3 段の失敗が次段入力に化ける D: Mediator × W(既存 current_op 帰属)/ G: Composite × E
Pipeline × N 段ごとの中間 ndarray 5 2(段数 × O(N)) 3 3 中間配列の dtype 昇格(float64 化)で 8 倍 M: #34 × Object Pool × L(バッファ再利用、out=)/ #1 × M(タイル memmap、既存 scale.py)
Pipeline × M(memmap tiles) scale.process_tiled_memmap(tile=1024, halo=16) 3(halo 重複) 5 3 3(タイル境界の継ぎ目誤差) halo 不足 S: 許容(RAM 超え専用)/ D: 既存 scale.tiling_error(L89)で継ぎ目を実測
Pipeline × G(torch) accel_bridge.run(stages, device) 2(転送)〜5(島内) 1(CPU/GPU 二重) 3 4(source="gpu" 記録) 転送律速(api.apply docstring「単発 op は転送律速」) S/M: #20 有用作用継続 × 島分割(既存 plan)+ Object Pool × G
Pipeline × I(generator) フレーム流に op を map 5 5 4 2 途中終了が沈黙 D: Proxy × I と同じ
Plugin × D 外部 op パックの登録 dict 4 3 5 2 guard を通らない op が混入 D: Mediator を登録関数で強制(登録時に guard で包む)
Result × C Attempt(ok, value, reason, metric) 4 4 4 5 if att.value: で 0.0 を偽と誤認 既存 __bool__ = ok(設計で回避)
Circuit Breaker × D {op_name: state}(未使用) 5 4 5 4 half-open の再挑戦条件が無いと永久 open Policy × S(明示 reset API)
Bulkhead × Z per-op timeout / worker 区画(未使用) 3 4 5 3 Windows で signal ベースの timeout は使えない S/D: 進化ループの外側(robust.py)で計時、hot path に置かない
Cache × D / U kernel dict / lru_cache(64) 5 4 5 2 鍵に version が無い D: Provenance × D(鍵に fingerprint)
Object Pool × L / Q / G バッファ再利用(未使用) 5 4 3 2(古い内容が残る) 「空」のつもりで前回の値 D: Sentinel × N(fill(nan) して返却)
Ledger × L(ring) _EVENTS + del _EVENTS[:-256] 4(溢れるたび O(256)) 4 5 4 古い事象が消える S: Ledger × Q(deque(maxlen=256))に替えると append O(1)(1 行変更・挙動同値)
Ledger × Q(deque maxlen) 推奨形 5 4 5 4 events_since は線形走査(256 件なので無視可)
Ledger × D(counts) _COUNTS 5 3 5 5 なし
Ledger × S(warned) _WARNED 5 3 5 3 上述 上述
Ledger × W 行 = dict 5 4 5 5 スキーマ drift Result × C
Ledger × Z lock (Mediator × Z と同じ)          
Saga × L 補償手続き list(未使用) 4 3 5 3 補償自体の失敗 (fullseye では対象外)
Health Probe × N / W 構造データ ndarray を全 op に流し、結果行を runtime_degeneracy.json 5(CI) 4 5 5 乱数データは構造欠陥を隠す 既存: memory feedback_random_test_data_hides_structural_defects
Policy × D / S SYSTEM_PARAMS / _ON_ERROR_CHOICES tuple + 検証 5 5 5 4(不正値は ValueError) 文字列 typo 既存 _policy() が検証(fail-closed)
Sentinel × S / R _LABEL_READING_OPS(frozenset)/ masked array 5 / 3(mask 伝播 O(N)) 5 / 2 3 4 / 4 masked が numpy 関数で剥がれる(np.asarray で mask 消失) R: Provenance × W(side channel)に逃がす。R は mathops 内に閉じる(既存)
Provenance × D / R / C / W trace dict / masked / dataclass / 台帳行 5 / 3 / 4 / 5 4 / 2 / 4 / 4 3 / 3 / 4 / 5 5 ndarray subclass は演算で剥がれる G: 空間分離 — 値と来歴を別コンテナに(run_pipeline の trace dict)

§3c マトリクス 3: TRIZ 40 原理 × コンテナ型

パターンを経由せず「原理 → コンテナ」を直接引く表。コンテナが先に決まっている状況(ndarray を返す契約は動かせない、GPU tensor しか触れない、等)で使う。列は §3b.1 と同じ記号。

3c.1 適合マトリクス(40 × 21)

# 原理 L T D S Q H A B N V R P M G C W K E Z I U
1 分割                                  
2 引き出し                                    
3 局所的性質                                    
4 非対称化                                      
5 統合                                      
6 多用途化                                        
7 入れ子                                    
8 釣り合い                                      
9 先取り反作用                                        
10 先取り作用                                      
11 緩衝                                      
12 等ポテンシャル                                      
13 逆転                                      
14 球面化                                      
15 動性化                                      
16 部分的に                                      
17 多次元化                                      
18 振動                                        
19 周期化                                      
20 有用作用継続                                      
21 高速化                                      
22 災い転じて福                                        
23 フィードバック                                      
24 仲介                                      
25 セルフサービス                                        
26 コピー                                    
27 使い捨て                                      
28 機械系の置換                                      
29 流体                                        
30 柔らかい膜                                        
31 多孔質                                      
32 色変化                                      
33 同質性                                        
34 排除と再生                                      
35 パラメータ変化                                        
36 相変化                                      
37 熱膨張                                        
38 強い酸化剤                                        
39 不活性雰囲気                                      
40 複合材料                                      

3c.2 採点(● セル。列 = 原理 × コンテナ | fullseye での形 | S/M/G/D | 落とし穴 | 短所のカバー)

原理 × コンテナ fullseye での形 S M G D 落とし穴 短所のカバー(≤3 の軸)
#1 分割 × N(タイル分割) scale.process_tiled(tile=1024, halo=16) 3(halo 重複 ~3%) 5(タイル分だけ) 3 3(継ぎ目) halo 不足で境界アーティファクト S: 許容 / D: 既存 scale.tiling_error で継ぎ目を数値化(#23 × W)
#1 × P(疎ブロック) Laplacian を CSR で(mesh_smooth.py:84) 5(nnz 比例) 5 3 4(shape 不一致は例外) COO のまま演算すると遅い (#36 × P 参照: COO→CSR 相転移)
#1 × M(memmap タイル) scale.process_tiled_memmap 3 5 3 3 flush 忘れ D: #23 × W(タイル完了台帳)
#2 引き出し × R(mask で邪魔な要素を除外) np.ma(mathops) 3(mask 伝播) 2(mask 配列 O(N)) 3 4 np.asarray で mask が消える S/M: mask を bool ndarray として別持ち(#17 × N)/ D: 4
#2 × P(非零だけ取り出す) 疎行列化 5 5 3 4 密→疎の閾値
#3 局所的性質 × D(op ごとの表) _LABEL_READING_OPSfslib.PROFILES 5 3 4 4 表と実装の二重管理 M: 許容 / memory feedback_nested_conditionals_use_a_table(表どうしの整合をテストで突き合わせる)
#3 × R(構造化 dtype = フィールドごとに型) 未使用。点群 (N,3)+属性を構造化配列で持つ案 4 5 4 3(フィールド名 typo は KeyError = 明白だが、dtype 順序依存が沈黙) 演算のたびに view が必要 D/G: #40 × R 参照(dataclass に ndarray を束ねる方が fullseye 流)
#3 × C(dataclass に局所の性質) Op.in_sort/out_sort、将来 params 5 3 4 4
#4 非対称化 × H(優先度で非対称に処理) mesh_decimate の edge collapse 4 3 3 4 stale entry 既存 version stamp
#4 × C(ok/value/reason の非対称) Attempt 4 4 4 5
#5 統合 × N(stack/concatenate) 多チャネル化(backend_safe.fallbacknp.stack([vv]*3,-1)) 2(O(N) 複製) 2 3 3 軸の取り違え(HWC vs CHW) S/M: #26 × V(broadcast_to の view)/ D: shape assert
#5 × E(グラフ統合) FullseyeGraph.add(inputs=[...]) 4 3 5 3 D: #23 × W
#6 多用途化 × D(何でも入る dict) graphengine.nodes[id] = {op, inputs, a, b} 5 3 5 2(キー typo が沈黙) スキーマ無し D: #25 × C(dataclass 化で属性エラー = 明白)
#7 入れ子 × K / E AST / サブグラフ 4 3 5 3 深さの再帰限界 D: #23 × W(階層 ID)
#8 釣り合い × M(RAM を disk で釣り合わせる) volio mmap 4 5 3 3 遅延 I/O エラー D: #9 × S(事前に存在・サイズ検査)
#9 先取り反作用 × S(許可集合で先に弾く) _ON_ERROR_CHOICES_NDIM_OK 5 5 5 5 集合の更新漏れ (テストで表と実装を突き合わせる)
#10 先取り作用 × C(事前コンパイル) ReadyRecipe 5 3 4 5
#10 × U(事前計算 cache) lru_cache 5 4 5 2 鍵に version 無し D: #26 × D(fingerprint 鍵)
#11 緩衝 × Q(deque(maxlen) = 溢れても壊れない) Ledger ring の推奨形 5 4 5 4 古い事象消失 D: _COUNTS(既存)
#11 × N(sort 妥当な zeros) fallback 5 2 3 1 恒等と区別不能 D: #24 × W(必須、既存 guard) / M: 許容
#12 等ポテンシャル × T(一様 stage tuple) (name, a, b) 5 5 1 3 位置引数の意味が op ごとに違う(a = sigma か閾値か) G: #3 × C(param spec)/ D: 同左(範囲検査)
#12 × N(全 op が float64 [0,1] ndarray) ops の clip 規約(_UNCLIPPED_SORTS 例外) 5 3(float64 固定 = uint8 の 8 倍) 1 3(clip が符号情報を捨てる: signed01 の注記) 符号つき応答の半分が消える M: #35 × N(dtype を op 契約に)/ D: 既存 backend_safe.signed01
#13 逆転 × P(COO ↔ CSR / 転置表現) 行索引 ↔ 列索引 5 5 3 4 変換コスト
#13 × I(push → pull) acquire.stream() の generator(呼び手が引く) 5 5 4 2 途中終了が沈黙 D: #32 × C(終端理由)
#14 球面化 × Q(環状バッファ) ring 5 4 5 4 上述 上述
#15 動性化 × D(実行時に表を差替え) set_systemPROFILES 5 3 5 3 グローバル状態 D: #26 × C(system_snapshot())
#15 × G(device 間を動的に移動) accel_bridge.plan 2(転送) 1 3 4(source="gpu") 転送律速 S/M: #20 × G(常駐・島)
#16 部分的に × V(sliding window view = 部分だけ見る) sliding_window_view(tomography, imgforensics) 5(0 コピー) 5 3 3(view に書くと元が壊れる) 巨大な仮想 shape を copy() すると爆発 D/M: setflags(write=False) + 決して .copy() しない規約
#16 × I(必要な分だけ生成) generator 5 5 4 2 上述 上述
#17 多次元化 × N(軸を足す: batch 次元) accel._to_batch の (B,1,H,W) 5 3 4 3 軸順の規約違い D: shape 契約テスト(既存 tests/test_chain_type_contracts.py)
#17 × E(鎖 → DAG) FullseyeGraph 4 3 5 3 D: #23 × W
#19 周期化 × Q / H(周期スケジュール) 周期 probe / 優先度付き再検査(未使用) 5 4 5 4
#20 有用作用継続 × G(GPU 常駐) 島単位で転送(plan) 5(島内) 1(二重保持) 3 4 メモリ二重 M: #34 × Object Pool × G(バッファ再利用、RTX5090 ゲート後)
#20 × I(途切れないフレーム流) acquire.stream() 5 5 4 2 上述 上述
#21 高速化 × N(ベクトル化 = Python ループを飛ばす) 全 op の基本 5 2(一時配列) 3 3 一時配列の連鎖で O(N) × 式の項数 M: out= 引数・np.multiply(a,b,out=a)(#34 × N 再利用)
#21 × V(view で複製を飛ばす) sliding_window_view[::2] 5 5 3 3 alias D: write=False
#22 災い転じて福 × W(失敗行 = 監査資産) fallbacks() → dead-op 一覧 5 4 5 5
#23 フィードバック × D / W(件数・事象を CI へ戻す) fallback_counts() / events_since(mark()) 5 3〜4 5 5
#24 仲介 × C(値と失敗を運ぶ型) Attempt 4 4 4 5
#24 × Z(スレッド境界の仲介) _LEDGER_LOCK(失敗時のみ) 3→5 5 5 5 成功経路に lock を置くと 3 S: 失敗時のみに限定(既存)
#25 セルフサービス × C(自己記述) Opparams を足すと Studio/fscript/docs が自動生成 5 3 4 4 生成側 861 op M: 許容 / 段階導入(既定値)
#26 コピー × V(view = 安価な写し) genome/画像 5 5 3 3 alias D: write=False
#26 × C(golden の写し) GoldenVector 5 3 4 5
#27 使い捨て × T(不変の一時 tuple) stage tuple、Attempt 相当 5 5 3 3 G: #12 と同じ
#28 機械系の置換 × P(密→疎) Laplacian / OT の疎化 5 5 3 4 密度閾値
#28 × G(CPU→GPU) accel 2〜5 1 3 4 転送 #20 参照
#29 流体 × I(流す) generator pipeline 5 5 4 2 上述 上述
#30 柔らかい膜 × R(mask = 柔らかい境界) masked 3 2 3 4 mask 消失 S/M: #2 × R と同じ
#31 多孔質 × P(空隙 = 疎) 疎行列 5 5 3 4
#32 色変化 × R(mask で「疑わしい画素」に色をつける) masked array を tainted として 3 2 3 4 剥がれる G: #17 × W(side channel)
#32 × C(ok フラグ) Attempt.okGateResult 4 4 4 5
#33 同質性 × N(全 op が同 dtype) float64 規約 5 3 1 3 上述 #12 × N 同左
#34 排除と再生 × Q / U(古い順に捨てて再利用) deque(maxlen) / LRU 5 4 5 3〜4 消えたものが必要だった D: _COUNTS(件数は不滅)
#35 パラメータ変化 × N(dtype/連続性を変える) ascontiguousarray(float64)(acoustics.py:329)、uint8 化(_u8) 3(変換 O(N)) 2 3 2(丸め・オーバーフローが沈黙) uint8 で [0,1] を 255 倍する際の飽和 D: #9 × S(dtype 許可集合、既存 dtype.kind in "biufc")+ parity
#36 相変化 × P(COO → CSR) coo_matrix(...).tocsr()(mesh_smooth.py:84) 5 3(変換中は二重) 3 4 CSR に要素追加不可
#36 × M(disk ↔ RAM) memmap ↔ ndarray 4 5 3 3 上述 上述
#37 熱膨張 × L(償却成長) list append の倍々成長 5(償却 O(1)) 3(最大 2 倍の余白) 5 4 上限なし成長 M: #11 × Q(maxlen)
#38 強い酸化剤 × S(厳格な許可集合で反応を激化) FULLSEYE_ON_ERROR=raise + 許可 dtype/ndim 5 5 5 5 厳格すぎて正当入力を弾く (既存 _NDIM_OK は「明らかに違う」だけ弾く軽い検査 = 意図的)
#39 不活性雰囲気 × T / V(不変 = 反応しない) tuple stage / write=False 配列(fslib.Seq) 5 5 3 4 不変を破る np.asarray 経路 G: 許容(不変性は sort の契約)
#40 複合材料 × D / R(異種を束ねる) {"shape":..., "cs": [...]} contour dict(fallback)、構造化配列(未使用) 5 4 4 2(dict スキーマが沈黙) D: #25 × C(dataclass 化)

§4 fullseye への適用

4.1 実例(解決済): fail-soft の矛盾 — 2026-09-02 に backend_safe.py / api.py で実装

矛盾(39 特性): 改善したい = 信頼性 #27・操作容易性 #33(facade は利用者のパイプラインを落とさない)/ 悪化する = 測定精度 #28・制御の困難さ #37(壊れた op が「働く恒等」と区別できない)。2026-09-02 の監査で確定バグ 7 件中 6 件が「例外なし・答えが違う」型(LEDGER.md)。原因は 3 層の fail-soft: facade api.apply / GPU 分岐 except Exception / 22 ファイルの私家版 _safe(記録するのは backends.py の 1 つだけ)。

物理的矛盾: 「握りつぶすべき」かつ「握りつぶすべきでない」。側を選ばず分離で解く:

分離 TRIZ 原理 パターン 実装(検証済)
空間(内層は記録・外層が決める) #24 仲介 Mediator × Ledger backend_safe.record()(L113)= 全ラッパが報告する 1 点。backends._safe(L64-69)と 21 の backends_*._safe すべてbackend_safe.guard に委譲(grep -l "_bs.guard\|backend_safe.guard\|import backend_safe" backends_*.py = 21)
分類 #1 分割 Result / taxonomy record(source="op"\|"gpu"\|"import"\|"input")。GPU: api.py:1095,1104,1230 / import: ops.py:979 / 入力 sort: api._check_input_sort + _guard_input(L1036-1058、_NDIM_OK で ndim/dtype の軽い検査)
条件(呼び手が選ぶ) #35 パラメータ変化 Policy api.apply(..., on_error="fallback"\|"warn"\|"raise")(L1109)/ run_pipeline(L1184)/ 既定は env FULLSEYE_ON_ERROR_policy() が不正値を ValueError で拒否(fail-closed)。"raise"strict_mode(True) の with で内層を strict に切替(_run_guarded L1062)
時間(1 回だけ見せる) #11 緩衝 + #32 色変化 Observer × set FullseyeFallbackWarning(専用カテゴリ = 色)を op 名ごとに 1 回(_WARNED set)。FULLSEYE_QUIET_FALLBACK で沈黙可
フィードバック #23 Ledger → CI fullseye.fallbacks() / fallback_counts() / mark()+events_since()(facade __init__.py:30,311 で公開)。CI は構造データ probe 後に assert fallbacks() == []
害を益に #22 Ledger = 監査 8 Agent を回した dead-op 監査が fallback_counts() 1 回に。tests/test_backend_safe.py が回帰

4 軸(実測根拠つき): S 5(成功経路は try のみ。lock/dict append は失敗時だけ。_run_guardedmark()/current_op は呼出しごとに lock 1 回 + thread-local 代入 = 数百 ns、4 MP op の ms 級に対し無視可 — ただし厳密には 4.5)/ M 4(ring 256 + counts O(op 数) + warned set)/ G 5(apply のシグネチャは kwargs 追加のみ、既存呼出しは無変更)/ D 5(記録 + 分類 + warn once + 呼出しごと policy + CI assert)。

残っている弱点(正直に): (1) GPU 経路は記録されるが毎回再挑戦する(Circuit Breaker 無し → 候補 5)。(2) _check_input_sort は ndim/dtype の粗い検査で、sort 跨ぎ恒等(tb_quaternion_to_rgb 型)は捕まえない → 候補 1・6。(3) _EVENTS は list ring で溢れるたび O(256)(§3b Ledger × L)→ deque(maxlen=256) に替えるだけで S=5(挙動同値)。

4.2 次の候補 — マトリクスから選んだ「より理想的な構造」(順位つき)

順位 = (D の上がり幅 × 影響 op 数)÷ 実装難度。各行: 4 軸 / 矛盾(39 特性)/ 分離原理 / 難度。

順位 候補 原理 × パターン × コンテナ S/M/G/D 矛盾(改善 vs 悪化) 分離 難度 根拠・既存資産
1 fullseye.selfcheck() + CI 常設 probe: 構造データ 1 組を全 op に流し、(a) fallback 件数 (b) sort 跨ぎ恒等(入力≡出力)(c) 定数出力 を台帳行で返す。CI は「呼べた/毎回拒否/引数組めない」を分けて数える #9 先取り反作用 + #22 × Health Probe × N/W 5/4/5/5 信頼性 #27 vs 時間の損失 #25 時間(import 時でなく CI・明示呼出し) ★☆☆ out/.../probe_runtime_degeneracy.pytriage_degenerate.py が土台。tests/test_backends_typed_liveness.py は同 sort 恒等のみ(盲点)
2 facade の多入力(nary): apply((img1, img2), "add_image") を Composite 入力で受け、list_opsarity を出す。arity 不一致は ArityError(taxonomy に source="input") #17 多次元化 + #5 統合 × Composite × T/E 5/5/5/4 適応性 #35 vs 操作容易性 #33 空間(単入力 facade の裏に graph 経路) ★☆☆ graphengine._eval(RT, nary, ...) が既に nary を扱う。LEDGER #4(17 op が KeyError)
3 GPU 経路の Circuit Breaker: op ごとに {closed, open}。初回失敗で記録+warn once、以後は CPU 直行(再挑戦コストゼロ)。fullseye.reset_gpu() で half-open。device="cuda!"(strict device)は raise #36 相変化 + #11 緩衝 × Circuit Breaker × D 5/4/5/4 速度 #9 vs 信頼性 #27 条件(strict device)+ 時間(open 後) ★☆☆ api.py:1095,1104 に record 済。CI は CUDA 不在で GPU 実効カバレッジ 0%(test_false_confidence.md)— RTX5090 ゲートで実測
4 op param spec メタデータ: Opparams: tuple[ParamSpec](name/type/range/choices/default)。Studio の型適合ウィジェット・fscript 行生成・docs 表・範囲検査が自動生成される #25 セルフサービス + #3 局所的性質 × Registry × C 5/3/4/4 操作容易性 #33 vs 装置の複雑さ #36 空間(メタデータは registry、UI は購読) ★★☆ studio._ARG_ROLES(L1185、人間可読・一部 op)と docs/ops/*.md の frontmatter から初期値を生成できる。NEXT_SESSION B-1 の前提
5 Ledger の deque 化 + 台帳行の dataclass 化: _EVENTS = deque(maxlen=256)FallbackEvent dataclass(schema drift を型で止める) #34 排除と再生 × Ledger × Q/C 5/4/5/5 速度 #9 vs 情報の損失 #24 ★☆☆ 1 ファイル数行。fallbacks()dict(e) を返す契約を保てば互換
6 run_pipeline の provenance trace(side channel): 各段の (op, backend, device, fallback?, elapsed) を配列とは別のdict list で返す(return_trace=True)。sort 跨ぎ恒等を段単位で検出 #17 多次元化 + #32 色変化 × Provenance × W 4/4/3/5 測定精度 #28 vs 物質の量 #26(メモリ) 空間(値と来歴を別コンテナ) ★★☆ ndarray subclass は演算で剥がれる(§3b Provenance × R)。events_since(mark()) を段ごとに切るだけで作れる
7 内層 Result 型(OpResult)+ facade は値: backend/typed 層は (ok, value, reason, kind) を返し、facade が policy で値に畳む。metriccontract.Attempt を全 sort に一般化 #4 非対称化 + #12 等ポテンシャル × Result × C 4/4/4/5 測定精度 #28 vs 操作容易性 #33 条件(内層は型、外層は値) ★★☆ 現行の guard が例外→記録で同じ情報を得ているため増分価値は限定的。やるなら候補 6 と統合
8 backend 次元の統合(Strategy/Bridge を ops.REGISTRY へ): gaussian/cv_gaussian/GPU を 1 op × backends にし、profile で選ぶ。parity テストが op 単位で自動生成される #28 機械系の置換 + #15 動性化 × Bridge × D 5/3/4/4 適応性 #35 vs 装置の複雑さ #36 条件(profile) ★★★ fslib L1 に同設計が実在(op(name, backend)PROFILES)。進化側の REGISTRY は名前が鍵なので後方互換に alias 層が要る
9 fscript Interpreter 監査: builtins dispatch を表に、AST ノード網羅テスト、FScriptError の kind 分類。Visitor 化はしない(VM 一本の決定 FSCRIPT_DECISION 判断 2 により codegen と意味論を共有する必要が無い) #1 分割 + #33 同質性 × Interpreter × D/K 4/5/4/4 制御の困難さ #37 vs 装置の複雑さ #36 ★★☆ fscript.Parser/Node/Envtests/test_fscript.py。価値は限定的なので最下位

上位 3 件は合計 ★☆☆ × 3 で、D を上げる幅が最大(候補 1 は「壊れた op を利用者より先に見つける」、候補 2 は 17 op の KeyError を消す、候補 3 は GPU の沈黙再挑戦を止める)。候補 4 は Studio 4 本柱の前提なので UI 作業の直前に。


§5 使い方(再利用チェックリスト)

5.1 ジレンマに当たったら

  1. 2 語で言う: 「改善したい特性 X(39 特性の番号)/ 悪化する特性 Y」。言えなければまだ問題が 1 つに潰れている(FSCRIPT_DECISION.md §0 の「3 つの別々の問い」の型)。
  2. 原理候補を引く: raptor triz-ideation SKILL の矛盾マトリクス(または下の速引き)。
  3. §3a の当該原理の行を読む → パターンと 4 軸。制約と一致する軸プロファイルを選ぶ:
    • hot path(op 本体・進化ループ内)→ S=5 必須。M は out=/view で稼ぐ。
    • facade / I/O 境界 → G=4 以上。S は 4 で妥協可(dict lookup 1 回)。
    • 検証・CI・監査 → D=5 必須。S は無視(時間分離で hot path 外へ)。
  4. 3 点以下の軸の「短所のカバー」を辿る(別行の組合せを重ねる)。カバーが辿れないなら、その構造は fullseye では使わない。
  5. §3b でコンテナを決める。落とし穴列を読んでから書く。
  6. 実装したら docs/design/ に判断を 1 節足す(この文書の §4.2 に順位を入れ直す)。

5.2 コンテナが先か、パターンが先か

状況 先に決めるもの 理由
既存の契約が動かせない((v,a,b) -> ndarray、GPU tensor、memmap) コンテナが先 → §3c で原理→コンテナ、次に §3b を逆引きしてパターン パターンはコンテナに合わせて変えられるが、契約を破ると 861 op と進化が壊れる
新しい責務(監査・方針・登録)を足す パターンが先 → §3a、次に §3b でコンテナ 責務の置き場が決まらないとコンテナの寿命・所有者が決まらない
速度が支配(ms 級 op、4 MP) コンテナが先(N/V/G の S 列) §1.2 の S は「データへの追加パス」で決まる = コンテナ選択そのもの
検出性が支配(CI・監査) パターンが先(Ledger/Probe/Policy) D はパターンで決まり、コンテナは W/D/Q のどれでも 4 以上
迷ったら パターン → コンテナ コンテナの置換(list→deque)は 1 行、パターンの置換(Null Object→Result)は API 変更

5.3 39 特性 → 原理の速引き(fullseye で実際に出た矛盾のみ)

改善 vs 悪化 効いた原理(本書の実例)
信頼性 #27 / 操作容易性 #33 vs 測定精度 #28 / 制御 #37 #24 仲介・#1 分割・#35 パラメータ変化・#11 緩衝・#32 色変化・#23 フィードバック・#22(§4.1)
速度 #9 vs 信頼性 #27(GPU) #36 相変化・#11 緩衝(Circuit Breaker)
適応性 #35 vs 操作容易性 #33(nary) #17 多次元化・#5 統合(Composite)
操作容易性 #33 vs 複雑さ #36(Studio ウィジェット) #25 セルフサービス・#3 局所的性質(param spec)
物質の量 #26(メモリ)vs 測定精度 #28(来歴) #17 多次元化 + 空間分離(side channel)
時間の損失 #25 vs 信頼性 #27(検査コスト) #9 先取り反作用 + 時間分離(CI へ)
適応性 #35 vs 複雑さ #36(backend 切替) #28 機械系の置換・#15 動性化 + 条件分離(profile)

5.4 禁じ手(この文書から導かれる)


付録 A. 検証済み事実と未検証事項

検証済み(grep/sed で実在確認、2026-09-02〜03): backend_safe.py(guard L184 / record L113 / FullseyeFallbackWarning L50 / _EVENTS ring 256 / _COUNTS / _WARNED / strict_mode / markevents_since)、api.py(_policy L1028 / _check_input_sort L1036 / _guard_input / _run_guarded L1062 / apply(on_error=, template=) L1109 / run_pipeline(on_error=) L1184 / GPU record L1095,1104,1230)、ops.py(REGISTRY L921 / RT_BY_NAME L922-923 / DROPPED_DUPLICATES / import record L979)、21 の backends_*.pybackend_safe.guard へ委譲、fullseye/__init__.py の公開(fallbacks 等 L30,311)、tests/test_backend_safe.py / test_ops3d_ledger.py の存在、§2・§3b.1 の各ファイル・行。

fullseye コアに存在しないことを確認: Circuit Breaker / Retry(コア)/ Bulkhead / Saga / QUndoStack / Visitor クラス / entry_points plugin / array.array / octree / queue.Queue / 構造化 dtype / order="F"

未検証・注意: (1) 本書の行番号は 2026-09-03 時点の作業ツリー。auto-commit で動く。(2) 採点は実測でなく §1.2 の基準による見積り(実測値があるのは FSCRIPT_MEASUREMENTS.md の言語層コストと scale.tiling_error のみ)。(3) タスク指示の「23 backend files」は本調査では _safe を定義するファイル 22(backends.py + 21)。backend_safe.py 自身のコメント(L28)は「23 backend files … 24 wrapper families」と書いており、backends_typed_fallback を含めた数え方と思われる — 数え方の差で、事実は同じ(記録していたのは 1 つだけ)。