Fullseye 設計判断集(ソース中の ★ コメントから生成)
日本語 · English · 简体中文 · 繁體中文 · 한국어 · Deutsch
この repo は、なぜそうなっているかをソースのコメントに書いている。そのうち ★ を付けたものが「効く知見」—— 測って分かったこと、踏んだ失敗、そう作った理由。ここはそれを機械的に集めた生成物で、正本はソースの側にある(だから食い違わない)。
accel.py
- L296 — ★CPU 側(ops._otsu)と同じくビンの上端で切る(2026-09-26)。 中点で切ると argmax ビンの背景画素が前景に混ざる。ここを直し忘れると 同じ絵で CPU と GPU の答えが割れる(test_fast_parity が門)。
- L688 — ★2026-10-02: HALCON 名は
local_max(画素精度のマスク)。以前は local_max_sub_pix と書いていた。
- L812 — interior 差の判定閾値。★2026-09-20(GenSpark 第 32・33 報 N116): 0.0002 の差に “exact” と出て、 語が実測と矛盾していた —— 判定は閾値で決まるので、語に閾値を添える。
accel_match.py
- L170 — ★窓はテンプレより大きくないと full-overlap 位置がゼロになる → r = T//2 + f(粗誤差) + win。
acoustics.py
- L1173 — ★
med == 0 を一律 inf にしていた —— peak も 0 のとき(無音・帯域に 何も無い)まで「無限に卓越したピーク」と報告していた。この 2 つの数は docstring のとおり「何も無くてもピーク周波数を返してしまう」ことへの 正直さの指標なのに、いちばん嘘になる向きに振れていた。0/0 は 0.0 が答え。 (2026-09-05: Linux / numpy 2.5.2 で表面化。旧版はフィルタの残差が わずかに残って med > 0 になっていただけで、不具合は前からあった。)
- L1181 — ★ 大域中央値は帯域を狭めると順序が逆転する(純雑音 11375 対 本物の欠陥 9433。2026-09-06 実測、_local_prominence の表を見よ)。 帯域幅に依らない判定にはこちらを使う。既存の 2 つは意味を変えずに残す —— 名前が同じで中身が変わるほうが、増えるより危ない。
- L1789 — ★
med == 0 を一律 inf にしていた —— peak も 0 のとき(無音・帯域に 何も無い)まで「無限に卓越したピーク」と報告していた。この 2 つの数は docstring のとおり「何も無くてもピーク周波数を返してしまう」ことへの 正直さの指標なのに、いちばん嘘になる向きに振れていた。0/0 は 0.0 が答え。 (2026-09-05: Linux / numpy 2.5.2 で表面化。旧版はフィルタの残差が わずかに残って med > 0 になっていただけで、不具合は前からあった。)
- L2597 — ★fail-closed(2026-10-06): 全帯域の PHAT は帯域の限られた信号で黙って外す。
acquire.py
- L70 — ★公開面は本体から数える(
tests/test_acquire_contract.py の門が AST で 読み、ここと突き合わせる)。dir() は環境で変わるので一次情報はこちら。 2026-09-25 まで 7 つ足りていなかった —— 追記のつもりが当たっていなかった。
- L96 — ★2026-09-24: the table used to carry rows this module could not open.
capabilities() announced nine backends while Camera._open branched on five, so realsense, oak, zed and kinect answered ValueError: unknown backend even with the SDK installed — a declaration/implementation split of exactly the kind a “registered only” gate is blind to. Each row now names the opener, _open dispatches THROUGH the table, and test_acquire_contract.py asserts every declared backend has one. unit is the physical meaning of what grab() returns: “normalised” -> float64 in [0, 1] (an image) “m” -> float64 metres (a depth map; NEVER rescaled to [0, 1], which would destroy the measurement — 35 ledger ops take depth) (name, module-to-probe, pip, kind, unit, opener, one-line desc)
- L144 — ★No count of those SDKs is written here. The corpus lives in another tree, so a number quoted here has no gate keeping it true – it said “13” while the corpus had grown to 28 (2026-09-25). A figure nothing can check is worse than no figure. Each value names things that must exist – a test resolves every one of them, so a rename or a deletion turns the claim red instead of leaving a stale boast.
- L196 — ★
unit carries only what the standard states in prose. Where UVC does not state a unit (PU_GAIN_CONTROL says merely “the setting for the attribute of the addressed Gain control”) the entry is None – inventing dB there would be a claim the standard does not make.
- L254 — ★UVC 1.5 defines
dwExposureTimeAbsolute as “1: 0.0001 sec … 100000: 10 sec”, i.e. 100 us per step, while SFNC gives ExposureTime in us. The same number 5000 therefore means 5 ms under SFNC and 0.5 s under UVC – a factor of 100 that raises no exception and only moves the picture.
- L362 — ★This is the fix for a silent defect: a 12-bit sensor hands back a uint16 buffer, and dividing by the CONTAINER maximum (65535) instead of 4095 makes the whole image 16x too dark (measured: 4095 -> 0.0625) with no exception — every threshold operator downstream is then wrong. The container cannot tell you the depth; the pixel format can, so backends pass it in and this table decides.
- L1048 — ★
as_numpy_ndarray() はフレームのバッファをそのまま指す (vmbpy 同梱の例が「同じメモリを使う」と書いている)。vmbpy の取得は フレームを再キューしてバッファを使い回すので、複製しないと 次の 1 枚が前の 1 枚を書き換える —— 例外は出ず、絵だけが入れ替わる。
- L1425 — ★以前はここが [] を返していた。GenTL を出す全ベンダを覆える唯一の経路 だけが列挙できない、という穴だった。プロデューサは GenTL 1.6 の GENICAM_GENTL{32,64}_PATH に自分を登録するので、こちらはそれを読む。
- L1450 — ★同一性は
id。serial_number は Windows では取得できず既定 0 のまま 返るので、鍵にすると全機が同じ鍵になる(Stereolabs API reference)。
- L1459 — ★
camera_state の既定は NOT_AVAILABLE ―― 一覧に出ても塞がっている ことがある。黙って落とさず状態を添える(在るが使えない、は発見である)。 CAMERA_STATE の全メンバーは公表文書から裏が取れなかったので、 文書が名指しする NOT_AVAILABLE とだけ突き合わせる。
- L1471 — ★pyk4a は台数しか教えてくれないので、シリアルを読むには開くしかない (pyk4a の example/devices.py)。だから列挙そのものが装置を触る ―― 必ず閉じ、開けなかった機は落とさずに「在るが開けない」として返す。
annotate.py
- L3105 — ★句読点(。、)は回さず右上へ寄せるのが本来だが、ここでは寄せない —— できないことを黙って近似せず、docstring に書いて残す。 縦書きで右上へ寄せる字(句読点)。横組みでは字の左下に来る点が、 縦組みでは右上に来る —— 回すのではなく位置を動かすのが組版の作法。 Windows の
@ 付きフォント(GDI が face 名で選ぶ縦組み用の顔)は、これを font 側でやってくれていた。Pillow はフォントをファイルパスで開くので @ の顔には到達できず、HarfBuzz の direction="ttb" も Raqm が入って いる環境と入っていない環境で結果が変わる(この機械の Pillow 12.3.0 は features.check("raqm") が False)。プラットフォームで揃うほうを選ぶ という方針に従い、ここは合成で寄せる。
aoi.py
- L441 — ★積の向きが符号を決める。
fb * conj(fa) の山は「moving が reference に対してどれだけずれているか」に立つ(逆にすると符号が反転し、残差を測る ときに逆向きへ戻してしまうので、完全に一致する対でも残差が 1 を超える)。
api.py
- L170 — ★2026-10-02: 合成パイプライン 6 本を fs.<名前> から出す。以前は ``fs.pipeline3d.`` でしか届かず、 公開経路の門では「1 本も届かない島」として _INTERNAL に置かれていた。import 自体は torch が無くても 通る(torch_lazy)。torch を要るのは呼んだときの FPFH / ICP の側だけ。名前>
- L882 — ★名前はすべて glyph_ で始める。1-D / 2-D / 3-D でレジストリが分かれている repo なので、接頭辞の無い名前は公開経路ごとに別物を指す事故を起こす。
- L898 — ★JSON 一枚で受ける入口。op ではなく API 層の関数(レジストリの op は (画像, a, b) 固定でノブ 2 つなので、文字列も JSON も渡せない)。
- L953 — ★
annotate.overlay_mask は 意図的にトップレベルへ出していない。同名の imgio.overlay_mask が既に fs.overlay_mask として公開されており、引数も 意味も違う(imgio = 生 RGB・mask>0.5・fill/margin / annotate = 役割名の色・ 重み [0,1] も可・形の不一致を拒否)。同じ名前に別の約束を載せると、呼び手は 例外ではなくもっともらしく違う絵を受け取る。公開 API の破壊的変更は 独断でしないので、役割つきの方は fs.annotate.overlay_mask で引く。
- L1115 — ★2026-10-02: 「名前の無い非公開関数」の棚卸しで、op として振る舞うのに公開経路が 1 本も無かった 18 本。 どれも既存の型つき台帳の約束(台帳 = 実装モジュールの集合)に合わないので、facade(fs.<名前>)から出す。 門は tests/test_hidden_ops_exposed_2026_10_02.py(定理か第 2 実装)。名前>
- L1678 — ★空・空白だけの名前は「無い」(2026-09-20、GenSpark N27): 多くの op は halcon 別名が “” なので、
name == halcon の一致で “” が lowpass に解決し、保存したパイプラインに空名が混ざると 別の op が黙って走っていた。名前の照合はこの先で行うので、ここで先に切る。
- L1681 — ★2026-10-11: このコメントと判定が docstring より前にあったので、関数に docstring が 無かった(
find_op.__doc__ が None)。説明の門(台帳・facade 版)が拾った。
- L1697 — ★大小文字とハイフンだけ違う名前は同じ op(2026-09-20、GenSpark N50): HALCON のリファレンスは GAUSS_FILTER のように大文字で書かれることが多く、
GAUSS_FILTER / Gauss-Filter が unknown だった。 正規化して 1 度だけ引き直す(元の綴りに一致が無いときだけなので、既存の解決は変わらない)。
- L1766 — ★2026-09-20(GenSpark 第 35 報 N124): 台帳 op の名前を apply に渡すと「unknown operator」と言い、 op_names() を案内していた(そこにも無い)。索引は tier を知っているので、正しい入口を言う。
- L2066 — ★2026-09-20(GenSpark 第 55 報 N199):
with strict_mode(): apply(gray, "access_channel") が例外にならず、 入力型の fallback(source=”input”)が台帳に残っていた。strict は op 本体の例外と GPU / 高速路だけが見ていて、 _guard_input と非有限出力の門は on_error しか見ていなかった —— 「厳密」が経路ごとに別の意味だった。 strict(strict_mode / set_strict / FULLSEYE_STRICT)は on_error=None のとき “raise” と同じ。明示の on_error は文脈より強い(引数 > 文脈 > 環境変数 > 既定)。
- L2097 — ★ いまのところカラー画像に対して正しい呼び方が存在しない: まとめて渡すと 色が混ざり、チャネルごとに 3 回呼ぶと自己正規化する op が各チャネルを 自分の最大で割ってチャネル間の比を壊す(灰色エッジ法の角度誤差が 自前 Sobel 1.03 度 -> 画像ごと 4.17 度 -> ch ごと 27.86 度、ゼロ点 29.14 度)。 どちらに倒すかは契約の決めなので、ここでは既定の数値は 1 つも変えず、
on_error="raise" のときだけ拒否し、既定では台帳に記録して見えるようにする。 詳細と選択肢は docs/KNOWN_ISSUES.md。
- L2385 — ★2026-09-20(GenSpark 第 26 報 N97): 素の str / dict / スカラーは ndarray でないのでここを素通りし、 既定の fallback 方針では入力がそのまま返っていた(
apply("abc", "gaussian") == "abc")。 raster を取る op には、配列にしてから同じ検査を掛ける。list / tuple は数値の入れ子として下で配列化される。
- L2421 — ★float16 / float32 → float64 の昇格は無損失(値も範囲も変わらない)なので記録しない(2026-09-20、 GenSpark N29): float16 は scipy.ndimage が扱えず op が RuntimeError → fallback で入力のコピーが 返っていた。float32 は op が float32 で走り float32 を返していた(契約は float64)。
- L2692 — ★2026-10-18(外部レビュー 0.6.0 N224): 以前の文は「got name=ndarray」だけで、受け取った image 側 (op 名の文字列)を言わず、規約の説明と食い違って読めた。受け取った 2 つと、直した呼び方を言う。
- L2813 — ★形状不一致(2026-09-19 外部レビュー #13): ラスタ同士の n-ary で形が違うと numpy の 「could not be broadcast」がそのまま台帳に残り、既定の方針では第 1 入力が そのまま返る(sort として妥当な fallback)。返り値の形だけ見た利用者には 「(32,32)+(32,16) が (32,32) で成功した」と映った。何が要るかを文で言う。
- L2817 — ★ただし第 2 入力がマスク(畳み込みの核)の op は形が違って当然 —— 3×3 のマスクを 画像と同じ大きさに埋めないと呼べない、では入口として壊れている(2026-10-12、例の 付与で発見)。核を取る op だけ名指しで外す。
- L3126 — ★2026-09-20(GenSpark 第 15・16 報 N67): 4 op の入口の関門(ops.NATIVE_CRASHES_ON_DEGENERATE)は 効いているのに、その事実は ops.py の中にしか無く、registry を使う側からは見えなかった。 行に載せる(None = 関門なし。理由の文がそのまま値)。
- L3130 — ★2026-09-20(GenSpark 第 20 報 N84): 同じ HALCON 別名を複数の op が名乗る(cv_ / sk_ の移植と コアの実装)。どれが走るかは find_op の規則(完全一致 → name == halcon → _ALIAS_CANONICAL)で 決まっていて曖昧ではないが、その事実が行に無かった。halcon_peers = 同じ別名を名乗る他の op。
- L3251 — ★2026-09-20(GenSpark 第 24 報 N95): 綴り違いの sort が黙って 0 行だった(「該当なし」と区別できない)。
- L3261 — ★台帳には入力ゼロの op(カタログを返すだけ)が在り
in_sort が None になる。 生の None を並べ替えの鍵に混ぜると TypeError で落ちる —— レジストリと n-ary だけ だった頃は None が現れなかったので、この鍵は 2026-09-25 まで壊れずに済んでいた。
astrostack.py
- L157 — ★仮説の検定: 「1 キャッシュライン(64B)に収まるあいだは移す価値が無い」を 予想したが 外れた。float32 は境目 K≈17-19 で 64B(K=16)に近いものの、 float64 は予測 K=8 に対し実際は K≈23-25(約 200B)。バイト数ではなく 要素数で決まっている —— 1 要素あたりの取り出し費用が支配している。 枚数が少ないうちに移すと逆に遅い(float64 K=5 で 1.4 倍遅い)ので、 境目は必ず要る。
-
| L380 — ★MAD が 0 に潰れたのに画像は平坦でない = 量子化(2026-09-08、 poc_thermal_radiometry が踏んだ)。整数の DN では |
x-med |
も整数に なるので、返せる sigma は 1.4826 の倍数だけ —— σ=0.5 の実写相当で 0.0、σ=1.0 と σ=1.983 が同じ 1.4826。黙って 0 を返すと しきい値が背景と同じになり、下流(star_detect)が何も見つけない。 ここは値を返す入口なので raise せず声を上げる(呼び手が method=”clip” を選べる)。refuse するのは答えを出す側 = star_detect の役目。 |
- L617 — ★ ショットノイズの唯一の入口。photons_per_unit=1 で「期待値 = lambda」。
- L708 — ★ field_seed は固定(同じ空)、seed だけ振る(別の観測)。
- L781 — ★この門のコメントは 2026-09-08 まで「完全に平坦 = 雑音が測れない」と 書いていた。前提のほうが間違っていた —— σ が 0 になる道はもう 1 本 あって、整数の DN で MAD が潰れる場合(σ=0.5 相当の実写で 0.0)。 平坦でない画像で空を返すのは保守的な答えではなく誤った答えで、 実際 200x200 の整数フレームに植えた 2 個の点目標が 0 個と返っていた。 平坦なら空(星は無い)、平坦でないなら拒否する、と道を分ける。
- L1106 — ★ 画像の外の中心は「flux 0・area 0・snr inf」を黙って返していた —— 拒否する。 画像の縁で欠けた開口は計算はできるが flux が系統的に少ないので
truncated で印を付ける(area_px は欠けた後の面積)。
- L1344 — 残差の sigma で下支えする。★ 以前は +inf に置き換えていたので 何も落とさず、宇宙線がそのまま平均に入った。
- L1702 — 束ねた sigma で下支えする。★ 以前は中央値画像の空間 MAD を使っていたが、 平坦な整数データではそれも 0 になり床が 1e-12 —— 読み出し雑音の +1 DN が 全部「宇宙線」になった(32x32x9 枚で真の宇宙線 1 に対し 871 画素)。
- L1743 — ★ 同点のときは生の票が多いビンを選ぶ。3x3 の平滑は真の山の左右 どちらから見ても同じ和になるので、平滑値だけで argmax を取ると 「山の隣の空ビン」が選ばれうる —— 実測でまさにそれが起き、真のずれ (-0.087, +0.996) の票 7 + 4 が bin 境界で 2 分されたうえ、中心が 1 ビン ずれて票 0 になった(frame_align が「重なっていない」と誤って fail-closed した)。1e-6 の重みは平滑値の刻み(1/9)よりはるかに小さい ので、本当に差があるときの順位は動かさない。
- L1766 — ★2026-09-08: 2 番手の山の高さも返す。星野なら山は 1 つだが、 繰り返し構造(網点・格子・織物)では格子ベクトルぶんずれた所に同じ高さの 山が並び、そのどれを選んでも「全員が賛成する」= inlier_ratio が 1.00 に なる。賛成率は「答えが正しい確率」ではないので、山が 1 つだったのかを 別の数で出す(0 = 単峰、1 に近い = 等価な候補が他にもある)。
backend_safe.py
- L212 — ★2026-09-20(GenSpark 第 44 報 N158): 環状バッファは黙って古い方を捨てる。捨てた数を数えないと、
fallbacks() が 256 件しか返さない理由が利用者から見えない(counts と件数が合わない)。
- L490 — ★2026-09-19 の門(tests/test_op_probe_ledger)が最初に捕まえたのがこれ:
fly_tau_from_expansion は 「膨張していない標本の time-to-contact は NaN(数を発明すると plausible-wrong)」と docstring に書き、 レジストリの tb_fly_tau_from_expansion はそれを signal の既定値で埋めて有限契約を守る。 関数を直接呼べば NaN の意味が保たれる(flyvision の docstring 参照)。ここに足すときは、その op の docstring に「NaN を返す理由」が書いてあることを確かめること。
- L509 — ★2026-10-18(0.7.0 の preflight の退化スイープ): 複素の sort を名乗る op でも、入力が実数の NaN / Inf だと実数の配列を返すことがある(3 op とも float64 の NaN を返した)。複素の時だけ埋めていたので、 その実数の非有限がそのまま外へ出ていた。実数でも複素数でも、非有限は記録したうえで 0 で埋める。
- L580 — ★feature op は ndarray でなく numpy の スカラを返すので、上の分岐は一度もそれを見ていなかった: NaN/Inf の測定値(例えば退化フレームに対する sk_blur_effect 内の 0/0)が api.apply からそのまま流れ出ていた。非有限のスカラも sort フォールバックへ洗い流し、宣言している「有限·sort として妥当」の保証が feature/contour のスカラにも実際に効くようにする。
backends.py
- L23 — ★
_safe フォールバックは最後の手段であり、死んだ op を隠しうる。out_sort==”image” では backend_safe.fallback がクリップした入力を返すので、どんな入力でもライブラリ呼び出しが例外を投げる wrapper が、進化 / difftest / coverage には失敗ではなく「動く恒等 op」に見えてしまう。実行時の頑健性は保つが、劣化は検出可能にしてある: 握り潰した例外はすべて共有のフォールバック台帳に記録し、strict モードでは代わりに再送出する。2026-09-02: 台帳 / strict スイッチを backend_safe へ下ろし、他の 23 個の backend ファイル(各自の private な _safe を持つ)が同じ場所へ報告するようにした —— それ以前は、24 の wrapper 族のうちこのモジュールだけが記録していた。以下の名前は、ここから import する呼び手やテストのための薄い別名として残す。
- L819 — LBP の符号化。★2026-09-08 まで
b は本当に何もしておらず、 method は 'default'(回転不変でない)に固定だった。実写の テクスチャ(brick / grass / gravel)で測ると、異方な素材では 回転で動く量が素材間の距離の 9.64 倍になり、'uniform' に替えると 1.72 倍まで下がる(examples/poc_real_texture_invariance.py)。 選べないと下げようがないので b を割り当てた。閾値の表にして あるのは、同じ軸で分岐が増えるときの規約(入れ子の if にしない)。 b=0.5(既定)は従来どおり 'default'。
- L1035 — ★cv2 に bool 配列を渡すと
cv2.Laplacian がヒープを壊し、後続の無関係な op でプロセスが死ぬ(2026-09-05 Fable レビュー、Windows で 100 回中に SIGSEGV を 自分でも再現、exit 127)。facade は dtype を契約に揃えるが、op.fn 直接経路 (テスト・coverage・進化ループ)は素通しだった。族の入口で float64 に揃える。
backends_auto.py
- L60 — ★scikit-image が無いときは、同じ答えを返す numpy の双子か、止まる例外か、どちらか(2026-10-25)。 それまでは
_HAS_SK / _HAS_CV が偽だと別の式(面積率、矩形の構造要素、画像平均のしきい値、 恒等写像 …)に黙って落ちていた —— min 構成(numpy + scipy)で image / region 入力の登録 op 488 本を走らせると 89 本が例外なく走って別の値を返した(tools/check_fallback_parity.py で再現できる)。 bit 一致で書けるものは numpy_twins に写し(門: tests/test_numpy_twins_2026_10_25.py)、書けないものは _require_dep で :class:backend_safe.MissingDependencyError を投げる(門: tests/test_fallback_parity_2026_10_25.py)。
- L152 — ★HALCON と同名の形状係数は、HALCON の式で計算する(2026-09-26)。 名前を借りたのにに別の量を返すと、HALCON のレシピを移してきた人が 同じしきい値で違う判定を得る —— しかも例外は出ない。一次情報: circularity C = min(1, F / (π·max²)) max = 重心から全輪郭画素までの最大距離 compactness C = max(1, L² / (4π·F)) L = 輪郭長 roundness C = 1 - σ/μ μ,σ = 重心→輪郭距離の平均と標準偏差 rectangularity 同じ 1 次・2 次モーメントを持つ矩形との差の面積を矩形面積で正規化 (https://www.mvtec.com/doc/halcon/2605/en/circularity.html ほか)
- L160 — ★HALCON の
eccentricity は3 値を返す演算子である(Anisometry / Bulkiness / StructureFactor)。2026-09-26 まで、この op は skimage の離心率 sqrt(1-(b/a)²) という 3 つのどれでもない量を返していた。 3 つとも無次元なので、そのまま返して HALCON と数が合う。円なら (1, 1, 0)。
- L174 — ★寸法を持つ特徴は HALCON と同じ画素値で返す(2026-09-26、ユーザー判断)。 それまでは画像サイズで割って [0,1] に収めていた(「解像度に依らない」規約)。 HALCON のレシピを移してきた人にとっては、正規化も式の違いと同じだけ「数が 合わない」原因になる。正規化が要るなら利用者が割れるが、割った値から画素数を 復元することはできない —— 情報を捨てない側に倒す。docs/KNOWN_ISSUES.md §51。
- L292 — ★2 次モーメントで向きが決まらない形では、向きは定義に含まれない。 正方形や円は共分散が等方なので固有ベクトルが任意に決まる —— そのまま採点すると モーメント矩形が 45 度回った状態で当たり、正方形が 0.651 になる(実測)。 HALCON は「矩形なら 1 を返す」と明記し、向きが決まらない形での過小評価は 最大 10% と書いている(https://www.mvtec.com/doc/halcon/1911/en/rectangularity_xld.html)。 等方なときは「同じモーメントを持つ矩形」が向きの数だけ在るので、どれを選んでも 定義は満たす。ここでは重なりが最大になる向きを選ぶ —— 任意性を最大側で潰す。
- L808 — ★キャンバスを変えない(reshape=False)+ 枠外は鏡映(mode=”reflect”)。 角度は -45°..+45°(a=0.5 で 0°)。四隅には元画像が 折り返して 写り込むので、帳票の傾き補正 (deskew) のように「枠外は背景色で 埋めたい」用途にはそのままでは向かない(既知の設計判断であって バグではない — 詳細と使い分けは
ops._rotate_img の docstring)。
- L831 — ★ただし戻り値の shape は 入力と同じキャンバスに保つ。この registry の image は「段間で無条件に繋がる」契約で、shape を変えると評価器が 目標画像と突き合わせられずに落ちる(実測: 目標サイズ版が (70,50) を 返した瞬間
test_evolve_is_reproducible_given_seed が “operands could not be broadcast together with shapes (70,50) (64,64)” で失敗した)。そこで Ht x Wt にリサンプルした像をキャンバス左上に置き、 余白は 0、はみ出す分は切る —— 「画像が今 Ht x Wt 画素である」ことは そのまま見える。
- L1103 — ★画素で返す(2026-09-26、ユーザー判断)。それまでは 3 成分とも 画像サイズで割って [0,1] に収めていた(「解像度に依らない」規約)が、 同名は同じ数を取る方に倒した —— 正規化は利用者が割れるが、割った値 から画素数は復元できない。docs/KNOWN_ISSUES.md §51。 [0] 面積(画素数)、[1] 重心の行、[2] 重心の列。 領域が空のときは面積ゼロ・中心は画像中心(fail-soft)。
- L1119 — ★3 成分を返す op は、空でも 3 成分を返す(スカラーに落ちると 受け取る側の形が入力で変わる)。円の値 (1, 1, 0) を既定にする。
- L1132 — ★頭打ちを外し、HALCON の式に揃えた(2026-09-26)。以前は
min(1.0, C'/10) で、C’ = L²/(4πF) が 10 を超える形(幅 2 px なら 長さ 80 以上の傷)を全部 1.0 に潰していた —— 傷や割れという、いちばん 見たい領域で「形が違うのに同じ数」が返っていた。HALCON は上ではなく 下を 1 で切る(画素近似で 1 を下回りうるため)。 docs/hardening/compactness-saturated-at-one.md
- L1144 — ★HALCON は同じ 1 次・2 次モーメントを持つ矩形との差で測る。 以前は軸平行の外接矩形との比(skimage の extent)だったので、 同じ長方形を 30 度回しただけで 1.000 が 0.359 に落ちていた (HALCON は 0.998 のまま)。docs/hardening/halcon-named-shape-factors.md
- L1155 — ★HALCON の roundness は
1 - σ/μ(重心→輪郭距離の平均と標準偏差)。 以前は 4A/(π·長軸²) という別の量で、16x64 の矩形で 0.239 対 0.577 と食い違っていた。
- L1161 — ★量もスケールも違っていた(2026-09-26)。等面積円の直径を画像サイズで 割っていたが、HALCON の Diameter は輪郭 2 点間の最大距離(画素)。 30x70 の矩形で 0.2585 対 74.85。おまけに輪郭版
diameter_xld は最大弦を 返していたので、双子どうしで 5.6 倍食い違っていた。
- L1169 — ★HALCON の
elliptic_axis は (Ra, Rb, Phi) を返す。 ここが返して いたのは Anisometry(= Ra/Rb、別の演算子 eccentricity の出力)を 10 で割ったものだった —— 名前が約束している量ではない。
- L1174 — ★画素で返す(2026-09-26)。頭打ちも外れる —— 厚みが画像の長辺の半分を 超える領域は、それまで全部 1.0 だった。
- L1178 — ★画素で返す(2026-09-26)。HALCON の
contlength は輪郭長(画素)。
- L1183 — ★頭打ちを外した(2026-09-26)。
min(1.0, H/W) だったので、 縦長の対象が全部 1.0 になっていた(60x20 で 1.0、真値 3.0 / 160x4 で 1.0、真値 40.0)。横長は正しく出るので、向きが変わった 瞬間に情報が消える。HALCON の height_width_ratio も軸平行の 外接矩形の高さ/幅で、上限は無い。 docs/hardening/features-saturated-at-one.md
- L1201 — ★頭打ちを外した(2026-09-26)。細長い形(幅 4・長さ 80 以上)で モーメント特徴が全部 1.0 になり、形が違うのに同じ数が返って いた。値域 [0,1] は feature の契約ではない。 docs/hardening/features-saturated-at-one.md
- L1249 — ★2026-10-07: 0 画素の平均・標準偏差は 0/0(NaN を guard が置き換えていた)
- L1345 — ★2026-10-25: skimage 無しの Moore 追跡は画素解像度の別の輪郭(点数も座標も違う)だった。 登録 op の答えとしては返さない(fail-closed)。追跡そのものは明示的に
backends_auto._moore_boundaries(mask) を呼べば使える(近似であることを名乗った別経路)。
- L1355 — ★2026-09-02: 返していたのは
np.where の 整数画素座標 そのもので、 sub_pix を名乗りながらサブピクセル精度が無かった。放物線当てはめ による法線方向の精密化を追加(core ops._edges_sub_pix と同じ 共有ヘルパ。同名 op はレジストリで後勝ちなので、実際に走るのは こちら —— core だけ直しても効かない)。 実測(真の位置が列 20.37 の合成ステップエッジ、a=0.2): 旧実装の 返す列は {20.0, 21.0} で平均絶対誤差 0.500 px、精密化後は {20.324, 20.370} で 0.0228 px(約 22 倍改善)。 点の個数・連結成分の分け方は不変(座標が 1 px 未満動くだけ)。
- L1434 — ★画素で返す(2026-09-26)。HALCON の
area_center_xld は (Area, Row, Column, PointOrder)。面積と重心を画素で返す (PointOrder は向きの印なので返していない —— §51)。
- L1440 — ★region 版と同じ HALCON の式。重心は囲まれた面積の重心を使う (点の平均ではない —— 点が密な側に寄ってしまう)。
- L1446 — ★region 版と同じ欠陥がここにも在った(
/10 + 頭打ち)。 直した op の双子を見落とすと、穴が半分残る。
- L1465 — ★画素で返す + 最小外接円ではなく最大弦(2026-09-26)。 領域版
diameter_region と同じ量になる。
- L1470 — ★HALCON は最小外接矩形ではなく同じモーメントを持つ矩形で測る。 輪郭を一度ラスタ化して region 版と同じ式に載せる(差の面積を 直接測るため)。
- L1476 — ★領域版と同じ頭打ちが輪郭版にも在った(2026-09-26)。 直した op の双子を見落とすと、穴が半分残る。
- L1484 — ★region 版と同じ HALCON の 3 値。Ra, Rb は囲まれた面積の幾何 モーメントから導く ——
cv2.fitEllipse は輪郭「点」への 最小二乗当てはめで、細長い形では大きく外れる(実測: 4x80 の 棒で Anisometry 39.1 対 20.65)。HALCON の定義は前者。
- L1500 — ★elliptic_axis: HALCON は (Ra, Rb, Phi)。fitEllipse は直径を返すので 半径にし、角は列(x)軸から反時計回りのラジアンに直す。
- L1502 — ★
ang は最初に返る軸(d1 = 短軸のことが多い)の向きなので、 長軸でなければ 90 度回す —— これを忘れると領域版と 90 度ずれる (30x70 の矩形で region 0 度 / xld -89.9 度、2026-09-26 に実測)。
- L1555 — ★b >= 0.75 で 4 方向(0/45/90/135 度)の平均を取る。既定 b=0.5 は 従来どおり 0 度だけなので、既存の結果は 1 ビットも変わらない。 効くかどうかは a(共起距離)で変わる(poc_real_texture_invariance の節 6、実写 3 素材): 等方な素材には短中距離で効き、異方な brick には 距離 4 でだけ効く(振れ幅/分解能 3.13 -> 1.54)。距離 1 では brick は
- L1560 — 逆に悪化(0.30 -> 0.56)。★根っこは距離を伸ばすと分解能そのものが 0.0328 -> 0.0122 と潰れること。
- L1760 — ★2026-09-02: この 2 つは
{"kind": "zoom"} を共有していたため 完全に同一 の実装で、しかも 2 つとも b を使っていなかった(実測: 同一入力に対する 最大差 0.0、b=0 と b=1 の差 0.0)。HALCON では factor 版が 2 つの倍率、 size 版が目標サイズを取る 別物 なので、kind を分けて実態を名前に合わせた。
- L1833 — ★2026-09-02: 旧仕様は out_sort=feature / metric=”area” で、実体は
np.mean(mask) = 画像に占める面積比。HALCON の area_center は (Area, Row, Column) を返す op なので、(1) 中心を返さない (2) 面積が画素数 ではなく比率(= 解像度依存)という二重の食い違いがあった。1 スカラでは 名前を満たせないため、ncc_locate と同じ match sort の 1-D ベクトル にして (面積比, 行, 列) を返す。match / feature はどちらも終端 sort (候補は identity のみ)なので、ゲノム→op の写像は動かない。
- L1840 — ★2026-09-26 から 3 成分とも画素(面積 [画素数], 行 [px], 列 [px])。説明文が 正規化のまま 3 週間残り、それを読んだ例が座標を (H-1) 倍して壊れた(2026-10-15)。 説明と挙動の一致は tests/test_feature_units_doc_2026_10_15.py が見る。
backends_bridge.py
- L518 — ★定数列で軸が潰れると
axes_transform は ValueError を投げる(傾きが 無限大になるため、向こうの仕様)。潰れた軸だけここで開く —— 定数列は 「描けない」のではなく「真ん中に水平線 1 本」が正しい絵。
backends_decomp.py
- L142 — ★BLAS のスレッド上限をループの外に 1 回掛ける。ここは work_max=64 に 抑えた正方行列を最大 60 回 SVD する場所で、この repo で分解時間の大半を 使う(スイート 1 回で 30.7 秒 / 分解合計 31.4 秒、svd 23,987 回 = 98%)。 64x64 の SVD は 24 スレッドだと 1 スレッドの 3.9 倍遅い —— 分解の中の GEMM が 小さすぎて同期の費用が計算量を上回るため(表は fsthreads の docstring)。 1 回ごとに囲むと仕掛けの 2.4us を 60 回払うので、ループの外に置く。
- L210 — ★
ev[0] は代数的に最大の固有値であって、絶対値最大ではない。 明るい稜線では主曲率が負なので ev[0] は絶対値の小さい方になり、 稜線上で 0・両脇で 1 という逆の応答だった(2026-09-05 Fable レビュー、 実測 [1, .64, 0, 0, 0, 0, .64, 1])。説明どおり絶対値最大を取る。
backends_measure1d.py
- L83 — ★ A float image in 0..255 (cv2.imread(…).astype(float)) was clipped to a flat 1.0 above 1 — every edge brighter than 1 vanished silently.
backends_r3.py
- L49 — ★2026-09-05 まで
except Exception: out = None で握り潰していた。 登録時に外側へ backend_safe.guard が掛かるが、内側で例外を消すと外側は 何も見ない —— strict mode でも例外が出ず、台帳にも残らない。 2026-09-02 の「24 族中 1 族しか台帳に届いていなかった」監査の取りこぼし (Fable の敵対レビューが 5 族目として指摘)。例外はそのまま外へ出す: 外側の guard が記録し、sort に合う値へ落とし、strict なら再送出する。
- L441 — ★探針は 32 px(2026-09-19、GenSpark 第 7 報 N12): 24 px だと db4 / sym4 の level=2 に足りず (必要 (8-1)·2² = 28 px)、import のたびに pywt の「Level value of 2 is too high」が漏れていた。 さらに
python -W error::UserWarning では警告が例外になり、この try/except が xwt_visushrink / xwt_firm_denoise を黙って落としていた(931 → 929 op、FAILED_BACKENDS にも残らない)。 探針は機能の門であって警告の門ではないので、探針の中の警告は数えない。
backends_scipy.py
- L198 — ★lambda >= ~12 で scipy が「boundary conditions did not converge」を投げ、 guard の fallback = 恒等になっていた(旧 1+40a は a>=0.3、既定 0.5 を 含む 7 割が恒等。2026-09-05 Fable レビュー)。説明も 1〜11 に合わせた。
backends_subpix.py
- L453 — ★2026-10-02: 以前は halcon “” で「local_max_sub_pix は core op が既にカバー」と書いていたが、 core の
local_max が名乗るのは画素精度の HALCON local_max(サブピクセルではない)で、 local_max_sub_pix を名乗る op は 1 本も無かった(accel の表だけが誤って書いていた)。 兄弟の sp_local_min_sub_pix は local_min_sub_pix を名乗っており、max 側だけが空いていた。
backends_typed.py
- L493 — ★2026-10-07: 空入力を op が正しく拒否した後、ここが空配列の平均 = NaN を返して いた(8 op。外側の guard が置き換えるので有限に見え、台帳にだけ source=output で 残っていた)。拒否の後始末が 0/0 を作らないよう、空なら 0.0。
- L570 — ★本当に効く r_lo / r_hi(半径の窓)だが、後者は既定が None で「データから決める」 意味なので、正の数値既定を要求する橋の選定には載らない。嘘のノブを 1 本足すより a だけを配線して b を『未使用』と書くほうが正しい。
- L588 — ★2026-10-07: 相対スケールの端が定義域の外へ出ていた 2 本(契約電池で、端の knob が 全入力で拒否されていた)。両端は a=0.5 の値が相対スケールと同じになるよう選んだ (window 10 / k 3)—— 既定の挙動と図の主図は動かない。整数の既定を持つ引数は
_make_runner が整数に丸めて渡す。
- L594 — ★2026-10-18: points_render の不透明度は (0, 1] —— 既定 1.0 の相対スケールは a > 0.5 で 1 を超えて拒否。 足跡の半径は 0.5〜4 画素(a=0.5 で 2.25)。
- L607 — ★2026-10-07 実測:
tb_cx_apply_transfer_function は H を 32x32 固定で束縛していたので 32x32 以外のスペクトルでは全入力・全 knob で拒否していた(契約電池 24x24、図 128x128)。 tb_temporal_band_power / tb_temporal_bandpass は帯域 [3, 5] Hz 固定で、12 フレーム / 32 fps の探針(ビン間隔 2.67 Hz)には帯域内のビンが無く、契約電池で一度も計算されていなかった。
- L801 — ★cleandoc で共通の字下げを外してから継ぐ(2026-10-11)。.strip() だけだと 1 行目以外が 4 字下げのまま残り、 字下げの無い橋渡し文を後ろに足すため後段の cleandoc も最小字下げ 0 と見て外さない → docs/ops の Markdown で空行の後の本文がコードブロックとして表示されていた(tb_ 146 本)。
- L886 — ★2026-09-05 まで
tools/chain_fuzz(非同梱)を sys.path 操作で読んでいた。 wheel では失敗し、下の build() が黙って [] を返すので tb_* 143 op が消えていた。
ballistics.py
- L309 — ★減衰つき(Levenberg–Marquardt)。素の Gauss–Newton は軌跡が短い(曲がりが雑音に埋もれる)と ω の方向が ほぼ不定になり、1 歩で 1e7 rad/s へ飛んだ(2026-09-30、PoC ㉔ の 10〜45 コマ)。費用が下がる歩だけ受け入れる。
- L804 — ★ dt が標本間隔を超えると模型は標本の間で区分線形になり、C_d と推力が別の値に化けるのに例外も NaN も出ない (30 fps の同じ軌跡で dt = 0.5 s にすると C_d 0.33 → 3.1、2026-10-23 の敵対的レビュー)。歩数の上限は ms で渡した t を止める。
- L965 — ★ 残差が離散化の床にあるなら n·ln(RSS_b / RSS_t) は丸め屑の比を増幅するだけ(雑音ゼロの真値で +144、推力の推定値は 3e-14 m/s²)。
blob2d.py
- L289 — ★符号に注意: 頂点は (row, col) の順で並んでいるので、
_monotone_chain が返す向きは (row を x と見た) 反時計回り = 画面では時計回り。内側は 外積が非負の側になる(<= 0 と書いて全物体 solidity 0 を出した)。
- L621 — ★収縮だけでは片側しか出ない。番号の小さい物体は、隣に番号の大きい 物体が来ても近傍の最小値が自分のままなので「内部」と判定される (2026-09-06 実測: 1 と 2 が接する列で 1 の側の輪郭が消えた)。 膨張と両方見れば「近傍に自分と違う番号がある」の対称な判定になる。
calib.py
- L274 — ★ この門が実カメラでは発火しないことを 2026-09-06 に実測した。歪みの 無い合成では設計どおり働く(傾き 0 度で比 3.8e-14、0.05 度で 8.6e-10、 どちらも拒否)。ところが現実的な樽型歪み k1=-0.18 を入れると、平面 ホモグラフィのモデルがそもそも合わなくなり、比が傾きに関係なく 1.9e-06 前後に張り付く(0 度 1.916e-06 / 0.05 度 1.935e-06 / 0.2 度 2.005e-06)。
- L280 — ★ 条件は 2 つ揃ったときだけ: 歪みがあることと、視点間で板が横に 動くこと。どちらか片方なら門は設計どおり鳴る(切り分けは tests/test_calib.py の 3 本)。そして実際の校正セッションは、板を手で 動かして撮るのだから必ず両方が揃う。 しきい値を上げれば済む話でもない —— 歪みありでは 完全退化 1.92e-06 と傾き 2 度 4.42e-06 の差が 2.3 倍しかなく、 分ける線が引けない。よって: * しきい値はそのまま(歪み補正済みの点なら正しく効く) * 比そのものを
orientation_rank_ratio として返す * 実際に止めている後段の門に「板を傾けよ」を言わせる(下) 直せない代わりに、判断材料を利用者に渡す。
caltab.py
- L256 — ★このゲートが捕まえないもの: 一枚の平面ターゲットに対する内部パラメータの 誤り(特に fx/fy の比)。平面 1 枚の homography は内部パラメータに 2 つしか 拘束を与えない(Zhang 2000)ので、誤った fy はここで解いている姿勢 6 自由度に ほとんど吸収され、残差はしきい値の下に留まりうる。 実測 2026-09-05: fy を 500 → 300 と誤らせても Linux/scipy 1.18 では RMS 0.90 px (正しい K なら 0.14 px)。同じ入力が Windows/旧 scipy では 6.39 px になり、 最適化の収束先の違いだけで「検出できたりできなかったり」する。 内部パラメータを検証したいなら、視点を 3 枚以上取るか非平面のターゲットを使う。 ここが効くのは「姿勢では吸収できない」不整合(対応付けの誤り、非平面の板)。
carpath.py
-
| L169 — ★OMPL の mod2pi は (−π, π] に折る(Python の [0, 2π) ではない)。ここを [0, 2π) にすると t >= 0 の判定が常に真に なり、CCSC 系 8 語が一度も候補に出ず(2026-09-28 に語の族を数えて発見)、負の区間長が 2π − |
t |
の遠回りに化ける。 |
champion_to_macro.py
- L225 — ★看板の正直さの主張(「DNA op はロックされた holdout で手作りベースラインに勝ったときだけ追加する」)を強制する —— 以前はこのフラグは表示されるだけで門になっておらず、手作りより悪いマクロが登録され、次の進化で選ばれえた。門は、明示的に上書きしない限りそれを拒否する。
conngraph.py
- L357 — ★2026-10-07: 非零の向きつきグラフに閉路(自己ループ含む)が無ければ W は冪零 = 半径はちょうど 0。 ARPACK は冪零(Jordan 塊)で擬スペクトルの縁を返す(鎖 500 個で 0.366、層状 DAG で 3.6e-5 → reservoir_from_graph が 0 を拒否せず 2.5 万倍に拡大した)。残差では見分けられないので構造で判定する。
- L365 — ★2026-10-07: 強連結成分で並べ替えると W はブロック三角 → 固有値は対角ブロックの和集合。 既約な非負ブロックなら Perron 根に ARPACK が確実に届く(冪零な DAG 部分は 0 に寄与)。
- L727 — ★ 軸ごとに [0,1] へ伸ばすと(成分が横一列のとき)縦だけ 3 倍に伸びて 成分内の距離が成分間より大きくなる —— 全体は一様に縮める。
- L1077 — ★2026-10-07: 入力の和が 0 以下の受け手(負の重みが勝つ)は「和を 1 に正規化」できない。 以前は 1e-300 で割って 1e300 倍に吹き飛び、linear の正規化で他の列が 4e-301 に潰れた。
- L87 — ★ビット一致は保証しない(2026-09-05 に訂正)。数学は行ごとに独立だが、
U @ w は BLAS の GEMM なので、行数 M によって縮約の分割やベクトル化 経路が変わり、丸めが変わりうる。実測: CI の py3.11 ジョブに torch を入れた 途端(= 別の OpenMP 実行時が載った途端)にチャンク有無で結果が食い違った。 保証するのは数値的な一致(数 ULP)であって bit 一致ではない。
demops.py
- L105 — ★ 中央値などで埋める選択肢は用意しない。埋めると存在しない平原ができ、 例外を出さずに水を通す。 ただし効果の大きさは正直に書いておく。同じ実データ(東京湾岸 1024x1024、 欠測 3.83%)で 3 通りを比べた最大集水セル数: 流出口 312,108 (29.8%) / 中央値で穴埋め 338,188 (32.3%) / 壁 315,023 (30.0%) 穴埋めは 8% ほど水増しするが、「1 セルが全体の 3 割を集める」こと自体は この地形の実際である(平坦な埋立地は実際に一箇所へ集まる)。 最初に穴埋めだけを見て「この数字は穴埋めの産物だ」と書いたのは誇張で、 対照を取ったら効果は縮んだ。埋める選択肢を置かないのは、 どこが実際の地形でどこが穴埋めか区別できなくなるからであって、 数字が桁で変わるからではない。
- L613 — ★ この遅さは PoC(examples/poc_dem_terrain.py)で 513^2 の天空率に 41.9 秒 かかって初めて気づいた。テストは小さい格子しか使っておらず、 「動く」ことは確かめていたが「使える」ことは確かめていなかった。
- L694 — ★2026-09-08 修正(
poc_stockpile_volume が発見)。視線の標本が np.rint で目標セル自身に丸まると、そのセルの高さを「途中の地形」 として自分と比べることになる。t < 1 なので分母 dist*t が小さく、 (z-eye)/(dist*t) > (z-eye)/dist は z > eye なら必ず真 —— 目線より高いセルが軒並み自己遮蔽されていた。実測(修正前): 平地に立てた高さ 10 m の柱は 25 m 先・目線 2 m から「見えない」と返り、 目線より低い 1 m の柱だけが「見える」。凸な立体の最高点は外から必ず 見えるので、これは幾何として誤り。標本が目標セルに乗った回は数えない。
- L754 — ★ 台帳の宣言は
points = (N, 3)。スカラを渡すと (3,) になって宣言と 食い違うので、常に (N, 3) へ畳む(2026-09-06 にファザーの TYPEMISS で 露見。地心座標 6 op を足したあとファザーを回していなかった)。 格子のまま (H, W, 3) が欲しいときは :func:dem_geocentric_grid を使う。
-
| L807 — ★縮閉線の内側は測地緯度が一意でない -> 黙って範囲外の緯度を返さず拒否する。 楕円 x²/a² + z²/b² = 1 の縮閉線は (a·x)^(2/3) + (b·z)^(2/3) = (a²-b²)^(2/3)。 等号の外側だけが「法線が 1 本に決まる」領域(2/3 乗は非負なので符号は |
z |
)。 |
- L988 — ★ 鎖の残り。ECEF ↔ 測地座標 は在ったが、その先(ジオイド高・標高・datum・ENU) # が無く、能力ノート docs/capabilities/geodetic-frames.md に「どれも未実装。 # GNSS が返すのは楕円体高で地図が使うのは標高、取り違えると日本付近で 30〜40 m # 静かにずれる」と自分で書いてあった。ここを閉じる。 # ————————————————————————— # :func:
dem_height_frame_convert が受ける高さの基準。
detect.py
- L60 — ★しきい値は argmax ビンの上端(2026-09-26、ops._otsu と同じ直し)。 中点だと argmax ビン(背景の山を含む)の画素が前景に入り、平らな板で 全画素が 1 つの対象として返っていた。
device.py
- L62 — ★
available は「SDK が入っている」であって「Fullseye から開ける」ではない。 2026-09-25 まで名簿はこの 2 つを 1 つの欄で答えていた —— dynamixel_sdk を入れた 機械で available は True になるのに、open_driver("dynamixel") は「その SDK を 直接使え」と断る。読んだ人は「対応済み」と受け取る。 implemented は環境に依らない(この版に一級のアダプタが在るか)ので、表にも 書けるし、どの機械でも同じ門で見られる。「いま開けるか」は implemented and available。
- L68 — ★欄の名前は自分で決めていない ——
acquire は既にこの区別を持っていた (implemented = opener が在る / available = SDK が在る、「the two are different questions」と註まで在る)。同じ問いに 3 層が別々の語で答えると、 読む側は毎回学び直す。先に正しかった層の語に合わせる。
- L105 — ★名簿の綴りと構築子の綴りが違っていた。 名簿(
capabilities())は io-modbus と名乗るのに、構築子は DigitalIO("modbus") を取る —— つまり表を読んでそのまま渡すと ValueError になっていた。名簿を 印刷しておきながら、その綴りで呼べないのは名簿の側の不備である。
- L161 — ★名簿に 12 載せて、扉が 3 つしか無かった(2026-09-25)。
capabilities() は I-O・サーボ・ロボット・ROS を名乗るのに、開ける口が在ったのは :class:DigitalIO の 3 backend だけで、残り 9 には入口が 1 つも無かった —— 名簿を読んだ人が、そこから何かを始める方法が無い。隣の層(comm)は 同じ問いに既に答えていたので、これは機能の不在ではなく片側の入口だけが 塞がれていた型である。開けないものにも「何を入れればよいか」を返す。
- L189 — ★PyPI に無い SDK(ベンダ配布の wheel)は「pip install None」と言わせない。
drivehumanoid.py
- L375 — ★ユーザー案(2026-10-03)「あらかじめ物体ごとの描画をマスク付きで作っておく」。精細なメッシュを向き × 位相ごとに 一度だけ描き(色・マスク・深度のずれ)、毎コマは縮めて貼り、世界の深度と比べて前後を決める。見た目は精細なまま、 1 体の費用は貼る画素の数だけ。近似は 2 つ(門で大きさを測る): (1) 方位を n_yaw 段に丸める、(2) 事前描画は水平に 遠くから見た像なので、カメラが高い・近いときの透視の違いを無視する。
driveinf.py
- L209 — ★道の帯は step ごとに切る: 描画器(render3d)は頂点が 1 つでもカメラの後ろにある三角形を捨てるので、100 m 級の 1 枚の帯は車載カメラから丸ごと消えた(2026-10-01)
driveworld.py
- L615 — ★2026-10-07: 置いた高さ z を物体に残す(残さないと world_move が元の z を外せず、z=2 で置いて z=2 へ動かすと底が 4 になった)
dualxray.py
- L218 — ★2026-10-15 探針で見つけた: Pb 50 mm でも e^{-130} は 0 にならず、正規化すると「ほぼ何も通らない」スペクトルが ふつうの顔で返っていた。透過が 1e-12 を切ったら値を返さず拒否する。
- L956 — ★2026-10-15 探針で見つけた: Fe(26)より上は R がほとんど同じになる(80 kV・窓 20/45 keV の薄い板で Fe 4.403 / Ni 4.417 / Cu 4.418 / Zn 4.416 —— Cu と Zn は逆転する)。区別できない範囲を照合に入れると、 単調性の検査で拒否するか、雑音で Z が 26〜30 を飛び回る。照合は Fe までにし、それより重い R は範囲の外(NaN)。
engine.py
- L190 — ★backend が入っていないだけの名前は「unknown」でなく不足 extra を言う(api._resolve と同じ門、2026-09-19)
- L243 — ★op 名は文字列でなければならない(2026-09-20): 以前は str() で何でも名前にしていたので、 {“op”: “gaussian”} が “{‘op’: ‘gaussian’}” という op 名になり、run で unknown operator になっていた。 名前の規則は stage_name の 1 本(diagnose_stages / unified.Pipeline と共有)。
- L274 — ★2026-09-20(GenSpark 第 30 報 N107): {“stages”: None} が 0 段のエンジンになり、run が入力をそのまま 返していた(壊れた設定が「成功」)。[] は文書どおり恒等、None / 数値は設定の壊れ。
- L280 — ★2026-09-20(GenSpark 第 30 報 N107 の ‘x’ の行): 文字列は 1 文字ずつ段になっていた。from_ops と同じ ops 文字列。
- L372 — ★範囲外は断る(2026-09-20、GenSpark N40): –upto 9 / -1 が黙って全段 / 0 段になっていた
evis_fullseye_bridge.py
- L152 — ★The sky is “infinitely” far (measured: 998 in a world whose animal is 0.3 across), and with the sky in view the 3rd/92nd percentiles straddle it, so the panel collapses to two flat colours — sky and everything-else. depth_max cuts the band at a distance that means something for this body, so the scene gets the colour range instead of the sky.
- L171 — ★ego_camera(モデル自身の目)でも eye パネルを出す。ここを ego>=0 だけで見ていたので、 ハエの複眼から描いたのに複眼の絵がコマに入らなかった(2026-09-14 実測)。
- L180 — ★drop frame 0: the event panel has no previous frame to difference against, so it is blank by construction. Keeping it makes the first thing a reader sees a black panel, which reads as “the events never fired” (measured: frame 0 has 960 lit pixels, frame 20 has 35,550). The stats below still count every frame that was rendered.
- L189 — ★distances carry the MODEL’s unit, not metres: the fly world is cm/g/s, so reporting “6.96m” for a 7 cm walk is a lie the caller cannot see.
unit names it honestly.
examplefig.py
- L148 — 書いた図の sha256 -> 名前。★同じ中身の図が 2 枚出たら台帳に積む
- L220 — ★
colorize_depth は float [0,1] を返す。np.asarray(..., np.uint8) で 受けると 0.x が全部 0 に切り捨てられて真っ黒になる(2026-09-06 に踏んだ)。
- L378 — ★例の本文を落とさない。図が出ないのは残念だが、数字は出さねばならない。
- L417 — ★ここで :func:
_to_rgb8 に丸投げしてはいけない。あれは (H,W) を colorize_depth に渡すが、その中で 1 枚ずつ正規化されるので、 全コマ 0 の画と全コマ 1 の画が同じ色になる(2026-09-09 に試験が捕まえた)。 値域を明示して渡すことで、初めて尺度が 1 つになる。
- L482 — ★Pillow は直前とまったく同じコマを 1 枚に畳む(その分の時間は前の コマの表示時間に足されるので、動きの速さは変わらない)。書いた後で 数え、渡した数と違えば台帳に両方残す —— 「72 コマの GIF」と 言いながら中身が 40 コマ、を黙って通さないため。
- L650 — ★2026-09-08: パネルが小さいと題が入らず、
annotate_figure_grid が (正しく)拒否して図が 1 枚黙って消えていた。29×19 の core 格子や 24×24 の縮小マップは PoC で普通に出るのに、エラーは 「題を短くしろ」と言う —— 実際の直し方は「パネルを大きくしろ」。 2 人の担当が独立に同じ穴に落ちた(看板の scene 図が 1 枚消えた例あり)ので、 呼び手ごとに拡大を書かせず、ここで 1 度だけ最近傍拡大する。 最近傍にするのは、拡大で値を作らないため(補間すると図の上で 存在しない中間値が生まれ、疑似カラーが嘘をつく)。
- L767 — ★2026-10-03: 下の余白を 16 px 広げた。軸名の帯(左下)が x 軸の目盛りの数字に重なって 「0.5」や「20」を隠していた(transforms_tour の図で踏んだ。全部の save_plot に効く)。
- L779 — ★2026-10-21: 棒を 1 本ずつ別の系列にした図(色を棒ごとに変えるため)は、系列の中に x が 1 つしか なく plot_series が間隔を知れないので、棒が描画域の 70 % の幅になり隣と重なった(製造公差 PoC の 歩留まりの対比図で目視)。棒の x を全系列から集め、その最小間隔(棒が 1 本しかなければ目盛りの 間隔)を画素に直して、1 点の系列にだけ bar_width として渡す。複数点の系列は従来どおり自分の間隔。
- L811 — ★2026-10-03: 凡例はデータを最も隠さない隅に置く(MATLAB の legend(‘best’))。右上固定だと 減衰の遅い応答の山が凡例の下に隠れた。点の数で象限を選ぶ最初の版も、Runge の端の山を 半分隠した —— 隠れるのは「点」でなく「線の画素」なので、各隅に凡例を試しに描き、 その矩形の下にあるデータの画素(背景でも格子でもない画素)を数えて最少の隅を選ぶ。
examples/acoustic_condition_monitoring.py
- L469 — ★放物線補間には整数へ引く偏りが残る(ピークが sinc 状なので二次で近似 しきれない)。0 から 1 まで振って偏りを実測し、S 字になることを示す —— 「サブ標本まで読めた」で終わらせると、この偏りが黙って結果に乗る。
examples/annotate_paper_tour.py
- L51 — ★EXTEND: text と path を自分の図の文字と折れ線 (x, y) に差し替える
examples/blas_thread_budget.py
- L117 — ★ここが要点。96x96 は「小さいから速い」のではなく、 小さいからこそ多スレッドが損になる大きさ。ループの外に 1 回置く (1 回ごとに囲むと、絞る仕掛け自体の費用を 30 回払うことになる)。
examples/blob_split_tour.py
- L98 — ★実測(honest): 高さ 2 < h の棒にも種が立つ。blob_seeds は残差
f - R > 0 を種にするが、 成分ごとに背景 0 で再構成すると山の高さ M < h の成分は R = M - h < 0 になり、成分の 全画素と背景 1 px の縁まで残差が正になる(skimage の h_maxima は 残差 >= h で弾く)。 実装は直さず報告する。ここでは棒の種を外して「種の無い塊」の経路を検算する。
- L129 — ★実測(honest): 割れ目は交線に乗らず、番号の大きい種の側が谷に沿って食い込む。 blob_split は段ごとの膨張で「両方の領域に触れた画素」を grey_dilation の max(= 大きい番号)に 与えるので、8 連結の斜め連鎖で番号の大きい領域が谷線に沿って数列ぶん侵入する。種番号を 入れ替えると侵入の向きも入れ替わる(幾何ではなく番号の偏り)。実装は直さず報告する。
- L153 — ★実測(honest): 教科書の h-maxima なら「低いほうの山のそびえ(16 - くびれ 10.07 = 5.93)」 を h が超えた時点で種が 1 つに融合する。blob_seeds は残差 > 0 を種にするので、残差 = min(h, そびえ) > 0 が常に成り立ち、低い山の種は h では消えない。融合するのは 「高いほうの山 - くびれ(22 - 10.07 = 11.93)」を h が超えたとき —— 参照する山が逆。
examples/coherence_scanning.py
- L166 — 6) ★ 位相シフト法との突き合わせ # —————————————————————— #
examples/dem_geodesy_tour.py
- L49 — ★リポジトリ直下を通しておかないと
demops が見つからない(この例は fullseye を import しないので、パスフックが効かない)。
- L61 — ★EXTEND: 自分のタイルの北西角に差し替える(ここは東京付近)。
- L131 — ★正直な内訳: Bowring の 1 回反復は楕円体面では 1e-9 m だが、高さが上がるほど 誤差が増える(実測 8848 m で 8e-7 m、20 km で 4e-6 m)。docstring の 「1e-12 度 / 1e-7 m」は地表付近の値であって、成層圏の高さでは成り立たない。 地形(標高 < 9 km)の用途では 1e-6 m で、ここでは 1e-5 m を閾値にする。
- L160 — ★EXTEND: dem を実データに差し替える(行 0 が北)。ここは既知の傾斜面。
examples/dem_terrain_analysis_tour.py
- L46 — ★リポジトリ直下を通しておかないと
demops が見つからない(この例は fullseye を import しないので、パスフックが効かない)。
- L59 — ★EXTEND: セル寸法 [m]。実データでは dem_cell_size_webmercator(zoom, 緯度) で出す。
- L158 — ★正直な観察: 斜面の途中に欠測があるとき、その北隣は outlet でも欠測へは落ちず 南西(有限の落差がある方向)へ行く。実装は「他に下る先が無いときだけ欠測へ」で、 docstring の「欠測へ向かう流れを許す」より狭い。ここでは印字だけで assert しない。
examples/example_inner_diameter_mm.py
- L67 — 穴(暗い側)を前景に。★面積の大小では決めない —— 穴と地の面積がほぼ同じだと 取り違える(R=100 px の的で地の側を「穴」と取った、2026-10-15)。輝度で決める。
- L71 — area_center は (面積 [px²], 行 [px], 列 [px])。★2026-09-26 に正規化 [0,1] から HALCON と同じ画素値に変わった(ecdaf14637)。
examples/gallery2d_color_artistic.py
- L224 — ★向きも見る(2026-09-26)。ここまでの確認は「二値」「自明解でない」だけで、 どちらの向きでも通っていた —— 実際この op は兄弟の補集合を返していた (docs/hardening/itk-threshold-ops-returned-the-dark-side.md)。明るい画素の 方が region に入ることを、入力そのものと突き合わせて確かめる。
examples/gallery2d_edges.py
- L217 — ★null を破るのは「雑音の扱い」: 素の衝撃は雑音を構造に化かすので、 段差が真値を超える。超えたら鮮鋭化ではなく増幅である。
examples/gallery2d_features.py
- L270 — ★返り値は bits/16 なので 16 倍して読む。上限は画素数で決まる —— 連続値の 画像では最小の刻みが ~1/N になるので推定は log2(N) 付近で頭打ちになり、 16 には届かない(256x256 = 65536 画素で 16 前後、128x128 では 13.7 と実測)。 「測れない線」を画素数から先に引いておくための注意書きで、門もそう書く。
examples/gallery2d_morphology.py
- L228 — ★背景の 1 点だけでは足りない —— 前景の外に 1 画素も漏れていないことを 全数で見る。離散の円板で膨らませると境界の外まで塗ってしまい、最初の実装は 前景 197 画素の円に対して外へ 48 画素(24%)漏らしていた。中心の値は正しい ままなので、中心だけ見る検査では捕まらない。
- L240 — ★閾値を選ばない op なので、検証も「閾値を選ばずに 3 つの山を同時に当てる」 形にする。高さ 1.0 / 0.6 / 0.3 の山を置いて、そのまま返るかを見る。
examples/gallery2d_texture_freq.py
- L305 — ★窓は
_k(a) が決める —— a=0.5 は 7x7(5x5 ではない)。ここを取り違えると 閉形式の定数がずれて、正しい実装が落ちる(実際に一度落とした)。
examples/gallery_illusion_invariants.py
- L231 — ★docstring は (−2, −2) と書くが、この盤(行・列、上向きで出発・白で右)では (+2, −2)。 定理が言うのは「周期 104 で同じ斜めの 2 マス」で、符号は回転の規約で変わる(perpetual.py の自己検査と同じ読み)。
examples/gallery_nary_image_algebra.py
- L117 — ★公開の入口
fullseye.apply は n-ary の 2 入力に「同じ形」を要求する(3×3 のマスクは形の不一致で拒まれる)。 画像と同じ大きさのゼロ配列の中央(scipy の原点 = N // 2)に置けば、同じマスクとして働く。
examples/gallery_openvx_spec_values.py
- L39 — vx_nonlinear_filter の function(vx_non_linear_filter_e)。★引用符つきの “median” を書くと、例の索引 (tools/op_example_index.py)が「この例は 2-D の median op を呼んでいる」と数えてしまう (引用符つきの op 名は振り分けの一覧として拾う規則)。ここは fullseye の median op を使わないので 1 本の文字列から分ける。
examples/optics_four_f_processor.py
- L84 — ★数字は構成で変わる。どの構成で測ったかを必ず併記する —— 併記しないと 説明文が別の実行の数字を引いたまま残る(2026-09-26 にこの例で踏んだ)。
- L199 — ★(1, N) のまま渡すと four_f_filter が「2x2 未満」で断る。 場と同じ格子に広げる —— 断ってくれる op のおかげで気づけた。
- L217 — ★図・動画は opt-in。既定で出さないのは、CI が図の生成時間を払わないため。
examples/piv_flow_from_particles.py
- L27 — ★repo 直下のモジュール(pivops)を import するので、チェックアウトから そのまま走らせても通るように repo 直下を先頭に置く。他の例と同じ作法。 これが無いと
py -3.11 examples/<name>.py が ModuleNotFoundError で落ちる (2026-09-09 実測: 走らせる門が無かった 83 本のうち、落ちたのはこの型の 2 本だけ)。
examples/poc_active_contours.py
- L258 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_allsky_cloud_cover.py
- L104 — ★最後の 3 つは薄い雲(光学的厚さちがい)。しきい値を上げると 薄いものから順に落ちる —— 4 節の階段はこれで出る。
- L142 — ★立体角の重み。dΩ/dA = sinθ/(f²θ) —— 等距離射影のヤコビアン。
examples/poc_asbuilt_wall_deviation.py
- L497 — ★漏れていたのは倒れではなくふくらみ。閉形式で predict_bulge が 1 次の係数として返す量が、そのまま偽の倒れと偽の平面内の振れになる。
- L555 — ★閉形式にはふくらみが吸われた分(§6)を入れた実効の倒れを渡す。 入れないと f=0 の 1 点だけが 1.2 mrad ずれ、予測が外れたように見える。
- L660 — ★雑音だけの床。ふくらみゼロの壁で同じ読み方をすると、これが出る。
examples/poc_astro_photometry.py
- L322 — ★ ここで一度間違えた: 「scale=2 だから明るさも 1/4」と思って flux/4 を書き、 -74.89 % を出した。保存則(上の 6.1e-14)がそれを弾いた。画素あたりの 明るさは 1/4 になるが、星の総和は変わらない。
- L423 — ★ ここで一度 assert を落とした: 上の表の rms(1 回の合成・孤立星 8 個)で 良 6 枚 0.306 % vs 良 12 枚 0.324 % = 0.947 倍が出た。理論 1.414 の 反証ではなく、あの rms が「星ごとの系統ずれ」と「雑音」を足したもので、 標本 8 個では雑音だけを取り出せない、という意味だった。段 1 と同じく 反復を積んで星ごとの平均を引くと、初めて雑音だけが残る。
examples/poc_attention_identities.py
- L232 — ★合否にするのは厳密に数えられる側だけ。(QK^T)V は 2T^2 d + 2T^2 d 回、 Q(K^T V) は 2Td^2 + 2Td^2 回の積和なので、比は 厳密に T/d である。 これは機械に依らない整数の主張で、交差点が T == d にあることの中身でもある。
- L563 — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_barcode_1d.py
- L806 — (d) ★measure_pos のエッジ本数が sigma に非単調に依存する。
examples/poc_battery_ct_degradation.py
- L316 — ★
sdf_offset はスカラのみなので、場でずらすには格子を歪めて評価する。
- L334 — ★積層が缶を突き抜けないように、たわんだ端板が許す高さまで局所的に圧縮する (実セルでも電極は加圧されて縮む)。これをしないと、背の高いガス空隙のところで 端の層が缶に食われ、層数の比較が壊れる(最初そうなった)。
- L612 — ★層は「立ち上がりの縁の数」で数える。
vol_wall_thickness の対 (立ち上がり -> 立ち下がり)で数えると、缶の内面のすぐ内側に余分な 立ち下がりが 1 本入るだけで対がずれ、健全なセルでも 17 -> 16 に落ちる。
examples/poc_battery_electrode_tortuosity.py
- L136 — ★公開経路に無い処理: voxel 空間の 6 近傍隣接グラフ。fullseye は 3-D の # 連結成分(vol_label)も距離変換(vol_distance_transform)も持っているが、 # 「空隙を通り抜ける経路」を扱う口(測地距離・輸送)は無い。 # ————————————————————————— #
- L258 — ★64 voxel のスライスをそのまま渡すとパネル幅が 64 px しかなく、 題の文字が入らずに図ごと落ちる(examplefig は黙って諦めない)。
- L279 — ★固相を 0 のままにすると log10(散逸) は負なので固相がいちばん明るく 塗られる(2026-09-08 に一度そう出した)。固相は空隙の下位 2 % に合わせる。
examples/poc_beam_modal_video.py
- L629 — ★衝突: fps 48.5 では照明の折り返しが f_1 = 3.00 Hz にぴったり乗る
examples/poc_beats_fringes_and_screens.py
- L237 — ★デューティ 50 % の矩形格子は偶数次が消える —— 矩形波のフーリエ係数が 偶数調波でちょうど 0 になるからで、これは実装の都合ではない閉形式の事実。 最初「±1, ±2 が立つ」と期待して NG にした: 期待が誤っていた(op は正しい)。 偶数次が「消えていること」まで見るので、山の位置だけを見るより強い門になる。
- L535 — ★図の書き出しが失敗したら、ここで拾う。見ないと「検査は全部 OK・でも図は 1 枚も出ていない」が黙って通る(examplefig は fail-soft で貯める)。
examples/poc_bev_sensor_fusion.py
- L135 — 置いてある。★これは飾りではない: * 面をセル境界に載せると、面の返りが雑音で隣へ半分こぼれ、適合率が discretisation だけで 0.5 に落ちる。 * 面をセル中心に載せると、今度は真値のほうが浮動小数の丸めで 入ったり入らなかったりする(実際に踏んだ: 側壁の返る列が真値から 外れ、偽占有 133 セルのうち大半がそれだった)。 中間に置けば両方が起きない。
h は 0.2 m の倍数を避けてある —— 高さの量子化を見せるため。lx/ly は 0.1 m の奇数倍にする。
- L564 — ★誤差は 世界の z 軸まわり(= place と同じ)。
R_wc @ rz と 書くと光軸まわりの roll になり、再投影誤差が 1/5 に化ける (2026-09-07 に踏んだ: 0.98 px と出て、幾何の予測 f·tanθ と合わず発覚)。
examples/poc_bilateral_asymmetry.py
- L585 — ★穴 D の門をそのまま渡せる形にしておく(margin が先に潰れ、角度が後から跳ぶ)。
examples/poc_bone_trabecular_thickness.py
- L708 — ★穴が塞がったので、所見を「無い」から「規約が 1 画素ずれる」に書き換える。
examples/poc_bump_coplanarity.py
- L147 — ★本物の低次不良(ダイアタッチのボイド = 中央がなだらかに沈む)。 わざと厳密な 2 次にしない —— 2 次にすると当てはめが定義上 100 % 吸ってしまい、「どれだけ吸われるか」という問いが自明になる。
-
| L306 — ★±SPEC_UM で clip してから渡す。examplefig の発散配色はパネルごとに max |
v |
で正規化するので、clip しないと 3 枚の色の意味が揃わない。 |
- L445 — 6. ★引きすぎの害 —— 本物の低次不良を吸う # ————————————————————————— #
- L540 — (e) ★台帳経由の surface_form_error は PV の float しか返らない
examples/poc_cad_scan_deviation.py
- L434 — ★台帳の out アダプタが dict を (R, t) に切り詰めるので rmse は届かない
- L897 — 章 6: ★欠陥が位置合わせを引く —— 剛体 6 次元への射影で予測する # ————————————————————————— #
- L1103 — ★欠陥を入れない —— 入れると第 6 章の datum ずれ(0.107 mm)が 点移動の下駄になって「初期角度で壊れた量」と混ざる。
- L1256 — ★真値が 0 の対照群で「%」を出すと 0 割りで意味の無い巨大な数になる。 面積は mm^2 のまま並べ、%は真値が意味を持つときだけ添える。
- L1267 — ★1 本の実行の差を「効いた」と読まない —— 種を振って散らばりと比べる
- L1357 — ★穴が塞がったら鳴る assert。実際 2026-09-07 に鳴り、この行を書き換えた: 「円筒穴・面取り・フィレットが組めない」という指摘を受けて plane / cylinder / torus / capsule が足された。指摘が道具を変えたので、記録を残して先へ進める。
- L1379 — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
examples/poc_calipers_under_illusion.py
- L141 — ★はじめ図説に「半幅を変えると採用点の数が変わる」と書いたが、生成された 本文を読むと 4 通りとも 41 点だった。書いたことがデータと違ったので 直し、「変わらない」ほうを門にした。証拠の数が動く例は第 5 章のツェルナー。
- L150 — (b) ★探針 1 枚では足りない —- ずらし量 × 探索半幅の格子で全数を見る 最初は shift=0.25 だけで試して「測定器は決して動かない」と書いた。 格子で見ると 0.125 と 0.375 でだけ 0.14 度傾く。既定に見える 0.25 は、たまたま外れない側だった。
- L266 — 外れた組み合わせを絵の上に描き戻す。★全体図では 8 px の飛びが潰れて 見えないので、目地の帯の周りだけを等倍で切り出す。
- L365 — ★測定線は軸そのものの上にある。そのまま塗ると被写体が消えるので、 指示線だけ 12 px 上へ逃がして描く(測っている行は軸の行のまま)。
- L476 — ★中心の座標は推測せず illusion.py から読む(最初 (h/2, w/4) と当てずっぽうに 置いて、周りの円のエッジを掴み rms が 3.4 になった)。真の中心は (170, 168) と (170, 452)、半径 30。
examples/poc_camera_calibration.py
- L152 — ── 校正(自前の最小バンドル調整。★ 穴 (e))──────────────────────────────────── #
- L181 — ★ 穴 (d): camera_calibration の画像点は (row, col)。project_points は (x, y)。
- L519 — ★ 穴 (b): reprojection_error は歪みを知らない。真値を渡しても 0 にならない。
- L740 — 2. ★ 主役: 再投影 RMS はほぼ同じなのに fx 誤差が 1 桁以上違う
- L748 — 3. ★ 相殺の仕組み: fx の比と Z の比が一致する
- L754 — 4b. ★ 正直な負けの記録: 狭い視野 + 雑音 0.30 px では主点を推定するより 画像中心に固定するゼロ点 B の方が正しい(上回れない条件が実在する)
- L770 — ★ 穴 (c): 歪んだ点なので止めたのは退化門ではなく後段の非有限 K の門。 その文言に「板を傾けよ」が入っていることまで確かめる(2026-09-06 追加)。
- L778 — 5b. ★ 穴 (c3): 閉形式は歪みのぶんだけ系統的に外れる(初期値専用)
- L782 — 6. ★ 穴 (b): reprojection_error は歪みを知らない -> 真値を渡しても大きい
- L788 — 7. ★ 穴 (a)【解消済み 2026-09-19】: 内部パラメータ推定を facade に露出した。 以前は fs から見えず、この tripwire は「塞がったら docstring を更新せよ」と鳴らしていた。 いまは fs.camera_calibration で呼べる(能力ノート camera-intrinsics-calibration)。 ただし facade 関数であって op レジストリの op ではない((画像,a,b) 固定でないため)。
examples/poc_cell_counting.py
- L68 — ★2026-10-02: 他の PoC と同じく、リポジトリ直下を自分で sys.path に足してから fullseye を import する。 パスフック頼みだと、examples/ から PYTHONPATH 無しで走らせたとき(tests/test_poc_scripts_run.py の走らせ方)に 本線の editable install の fullseye が先に入り、この worktree で足した台帳(watersheds_marker)が無くて落ちた。
- L860 — ★指定できる最小の h は 0.05 x max(距離変換)。画像の中に大きい細胞が 1 つあるだけで、画像全体の h の下限が上がる(op の仕様による結合)。
- L1048 — ★この PoC の見出し。偏りの線が 0 を横切る場所で、分割誤りは谷になっていない。
- L1337 — ★過統合と取りこぼしは別物 —— くっついても「消えて」はいない
- L1365 — ★最適な h は密度で動く(偏り基準か 1対1 基準のどちらかで必ず動く)
- L1368 — (5) ★計数が合っていて分割が全部外れている点が実在する 偏りが 3 % 未満なのに、分割誤りが多く残り、1 対 1 対応も最良から離れている。
- L1394 — ★指定できる最小の h が大きさ比とともに上がる(道具の仕様によるスケール結合)
- L1434 — (10) ★道具の穴が「まだ在る」ことを機械で確かめる(直ったら落ちる = 良い落ち方) (a) 進化 op の距離変換は最大値で正規化される
examples/poc_change_detection_misreg.py
- L947 — ★1 枚のグラフ: 残留ずれ vs 偽陽性(掃引の線 + 登録結果の点)
examples/poc_cold_chain_excursion.py
- L570 — ★ピークを探す窓は次の扉開閉の手前まで。ここを広く取ると、τ が大きい ところで次のパルスの立ち上がりを拾い、「崖が来ない」ように見える (2026-09-08 に 200 分の窓で踏んだ: y=53 の実測が 153 分に伸びた)。
- L949 — ★視線方向(D 軸)を幅にする。(t, y, x) のまま投影すると D = 時間 720 になり、返る (H, W) = (60, 12) の細長い絵しか出ない。
- L1008 — ★「当たった」のが規約のおかげか偶然かを分ける: 各点を ±1 m 揺らして数える。
examples/poc_colocalization_crosstalk.py
- L355 — ★裾落ちの予想: しきい値 T より下の Gaussian の裾は領域に入らない。 ピーク p の点のうち領域内の蛍光は 1 − (T − 台)/p(2-D Gaussian の 体積の閉形式)。台 = 細胞質 + 背景(+ 漏れ込みぶん)、p は PSF で σ_ves²/(σ_ves²+σ_psf²) 倍に潰れる。
- L657 — ★2026-09-20:
graph_degree_preserving_shuffle(結合グラフの辺の繋ぎ替え = null model)が台帳に入った。ここで探している 「画像ブロックの並べ替え検定」とは別物なので、graph_ の族は穴の判定から除く(語が同じだけ)。
examples/poc_colormap_readability.py
- L343 — ★段差の列で読み取れる差は Δ + 画素 1 個ぶんのランプ —— これを 忘れると崖を 2 倍高く見積もる(最初そう書いて 0.57 vs 実測 0.30 になった)
- L406 — ★真の勾配で割る。割らないと「場が急なところ」を境目と数えてしまう
- L657 — ★色数を超えると既定で拒否される(この PoC が指摘して同日に fail-closed になった)。ここは「循環したらどうなるか」を測るのが 目的なので cycle=True を明示する —— 明示させること自体が対策。
- L732 — ★この PoC の指摘で同日に直った。名簿の基準が「明度の単調さ」だけだったので、 明度は単調なのに色差の刻みが粗い cividis が「安全」と名乗っていた。 いまは色差の一様さも基準に入り、cividis は CVD_SAFE へ移っている。
examples/poc_complex_plane_fields.py
- L289 — ★「そのまま渡すと厳密に 2」が言えるのは 2 次以下の多項式のときだけ (中心差分がそこまで厳密だから)。一般の正則場では 2 から同じ床の分 だけ引かれる —— 実測 2 − 4.89e-05 に対し正則側の床は 2.06e-04 で同じ桁。 だから「2 に十分近い」ではなく「2 とのずれが床と同じ桁」を門にする。
examples/poc_compound_eye.py
- L271 — ★実測(2026-10-11): 雑音だけの利得は N=49 で 7.05(√49=7.00)、周縁 8px 除外で 全体利得 7.19、床は外周 4 画素にだけ載り k>=4 で 1e-15 の丸め屑。 → 第 2 章の飽和(5.33)は重ねの原理ではなく縁(像の外から画素を借りる帯)の誤差。
- L402 — ★PoC の門(tests/test_poc_scripts_run.py)は exit 0 に加えて “PASS” の印字を 要求する(合否を計算したのに捨てる門を防ぐ規約)。以前は “OK:” と書いていて、 台帳に登録した瞬間に「exit 0 だが PASS を印字していない」で落ちた。
examples/poc_connectome_across_decades.py
- L147 — ★2 匹の平均(半整数)を丸めると偶数丸めで奇数/偶数のギザギザが出る —— 合計(整数)で数える
examples/poc_connectome_motor_bottleneck.py
- L328 — ★2026-10-06: 人型ロボット / evis のデータが無い環境(CI・初見の人)では系列が合成歩容 1 本だけになり、 折れ線は点 1 個で描けず図が消えて PoC 自身の assert で exit 1 だった(手元は人型ロボットのデータがあって緑)。 系列が 2 本未満なら点で描き、図注は実際に使ったデータを言う。門 = tests/test_poc_connectome_motor_figures.py
examples/poc_crop_phenotyping.py
- L209 — ★乱数は必ず (n_plant, NESTED_MAX) の形で先に引く。葉数ごとに引く数を 変えると乱数列がずれ、n_leaf を 1 増やしただけで別の群落になる (2026-09-07: 植被率が葉数に対して単調でなくなり、崖が測れなかった)。
- L525 — ★
grid_coords はボクセル中心を置く(中心間隔 = span/res であって span/(res-1) ではない)。最初 span/(res-1) を掛けて球で面積 +12 %、 体積 +18 % の誤差を出した —— 単位の取り違えは「もっともらしく間違える」。
- L933 — ★2026-10-06: 題が「当たる」と外れた予想のほうを言っていた(本文は「予想が外れた」)。実測を言う。
- L972 — ★真値も葉角分布もこの節が見ている群落そのものから取る。基準条件 (葉 7 枚)の k を使い回すと、上位葉ほど立つ勾配のぶんだけ真値がずれる。
- L981 — ★最大の平面が地面とはかぎらない(群落が閉じると草冠の一部が最大になる)。 最初の平面をそのまま地面にした版は標高 1.69 m と答えた(2026-09-07 に踏んだ)。 いちばん低い平面を採る規則を入れて初めて安定した。
- L1008 — ★対照群: 同じ式を真の法線(バッファが持っている)に当てる。
- L1137 — ★
occupancy_grid の軸は (x, y, z)。render_volume_projection は 軸 0 を視線方向として潰すので、天頂図が欲しければ (z, y, x) へ入れ替える。 入れ替えずに呼ぶと「側面図のつもりの天頂図」が出る(黙って間違える型)。
examples/poc_ct_fidelity.py
- L342 — ★この PoC の見出し。零点 A(水平線)と零点 B に FBP が交差するところが 目で見える。横軸は投影数(左が疎)。 横軸は log —— 交差が起きるのは疎な側(12〜45 本)で、線形軸だと左端に 潰れて肝心のところが読めない。
- L407 — ★2026-09-06 に塞がった。以前は「検出器を倍にすると質量欠損が 2 倍以上 改善する」= 壊れていることを固定していた。いまは 2 つを固定する: (1) 質量がそもそも保存されている (2) 検出器の数では動かない (n_detectors は検出器の幅であって標本化の細かさではないので、 対象が収まっていれば増やしたぶんは空のビンが増えるだけ)。
examples/poc_ct_void_morphology.py
- L233 — ★ダイの占有で代用すると、粗いボクセルで厚み 50 µm のダイがボクセル中心の あいだに落ち、基準そのものが消える(60 µm・位相 2/3 で実際に 0 個になった)。
- L558 — ★全部 nan(どの位相でも測れなかった)を np.nanmean に渡すと警告が出る。 「測れなかった」は平均の対象ではないので、ここで明示的に nan にする。
- L634 — ★nan(測れなかった点)は落として引く —— 折れ線 op は非有限値を拒否する。
- L808 — ★穴が塞がったら鳴る。2026-09-07 に鳴り、この節を書き換えた —— 「esdf は長さ 3 の voxel_size を受けるのに、その出力を引く側が立方限定」という指摘を受けて、 query_distance(と occupancy_grid)が軸ごとの res を受けるようになった。
- L878 — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
- L1097 — ★体積率は粗いボクセルでも保たれ、先に死ぬのは形の指標(予想が外れた側)
examples/poc_datacenter_thermal_field.py
- L221 — ★2026-09-08: この PoC が「散らばった点から場を作る口が無い」と 記録したので
fs.interp_scattered を足した。凸包の外に出た点は op が マスクで返す ので、isfinite で当てずに済む (fill_value を有限値にしても壊れない)。
- L862 — ★「偽の峰 0」が本当に数えているのか、門を壊して確かめる
examples/poc_dem_terrain.py
- L42 — ★リポジトリ直下を通しておかないと
demops が見つからない(この例は fullseye を import しないので、パスフックが効かない)。
- L76 — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
examples/poc_dense_bubble_count.py
- L748 — ★最初は「相対 3 % 以内」と書いて、真値 30 個で 1 個ずれた 0.033 で落ちた —— 言いたかったのは 「誤っても 1 個ぶん」なので、個数の差で書き直した(2026-10-18)。真値は画面の外に出た細胞も 数えているので、1 個の差の一部は op でなく真値の規約の側にある(どれかは区別していない)。
- L751 — ★2 回目: 1 個ぶんでも足りなかった(最大 2 個、600 枚の全数で)。ずれの大きさは印字に残し、 門は「自信をもった誤りの件数」だけにする —— 合わせ直すたびに門を緩めるのは門ではないので、 ここで止める。
- L846 — ★記録(門ではない): o = 0.4 では「決まらない」と言った塊の区間が真値を外す。いびつな泡が 別の泡に食い込むと、くびれが山を残さず、上限 hi にも数えられない(op の docstring の限界)。
examples/poc_dfm_thickness_overhang.py
- L284 — ★向き(表裏)は巻き順で決まるが、marching cubes の巻き順は入力の符号規約で反転する。 閉じたメッシュなら符号付き体積で一意に決まる —— 目視でなく式で決める。
- L379 — ★格子の原点を壁の面にそろえてはいけない。3.0 で切ると壁の面が ちょうど voxel の境目に落ち、掃引 8 点すべてで誤差 0.000 mm になって 「量子化は起きない」という嘘の結論が出る(2026-09-07 に一度そう書いた)。 実際のメッシャは部品の面に格子をそろえてはくれないので、非整合な原点にする。
- L455 — ★h を「T/h が整数」になる点だけで振ってはいけない。整数比では占有ボクセルの 枚数がぴったり T/h 枚になり、誤差 0.000 mm が並んで「量子化は起きない」に 見える(2026-09-07 に一度そう書いた)。h は連続に振る。
- L705 — ★45 度ちょうどの傾斜方向は入れない —— 板の裏 2349.7 mm^2 が自分もしきい値に 貼りついてしまい、「どの向きが良いか」の表が段差の話に乗っ取られる。
- L824 — ★穴が塞がったら鳴る assert。2026-09-07 に鳴り、この行を書き換えた —— 「面ごとの面積が無い」という指摘を受けて face_areas / mesh_volume / boundary_vertices が足された。塞がったことを記録して先へ進める。
examples/poc_dic_strain.py
- L104 — ★正規化は基準画像で決めた 1 つの定数で行う。像ごとの最大で割ると、 変形で最大値がわずかに動くだけで全体の明るさが変わり、輝度不変を 仮定する推定器(Lucas-Kanade / Horn-Schunck)に無関係な誤差が乗る。
- L211 — ★所見を固定する: 変形は補間ではなく斑点の再描画なので、整数シフトは 厳密に一致するはず。ここが崩れたら 2 節以降の「真値」が真値でなくなり、 測っているのが推定器なのか自分の補間器なのか分からなくなる。
- L247 — ★所見を固定する: 3 つとも「動いていない」と答えるだけのゼロ点に桁で勝つ。 1 つでも 10 倍を割ったら、その推定器はこの場面では使い物になっていない。
- L282 — ★所見を固定する。 (1) piv の偏りは掃引の全域で lk / hs より小さい。※「1 桁小さい」が成り立つのは 2 節の u=0.37 の 1 点(0.0002 vs 0.0042 = 21 倍)で、掃引の最大どうしでは 6 倍程度(piv 0.0015 / lk 0.0088)。ここは最大どうしを 2 倍で固定する。
- L365 — ★所見を固定する。 (1) lk と piv は 100 µε を ±30 µε で回収する(実測 +9.1 / +0.4)。
- L369 — (2) ★hs は 100 µε で 22 µε しか返さない —— 上の「符号と桁は出る」は hs には当てはまらない(正則化が一様ひずみそのものを平らにする)。 主張と実測の食い違いなので、実測のほうを固定しておく。
- L413 — ★所見を固定する。 (1) 2 度の回転は微小ひずみでは理論どおり -609 µε 前後の嘘になる (材料は伸びていない)。鋼の降伏ひずみ 2000 µε の 3 割。
- L438 — ★一様勾配(ε が x の 1 次)では鈍らない —— 対称窓の最小二乗は 1 次関数の 傾きを厳密に返すため。窓の効果を見るには曲率のあるひずみ場が要る。 切欠き先端のひずみ集中がまさにそれなので、ガウス形の集中を仕込む。
- L484 — ★所見を固定する。 (1) lk の尖頭は窓幅について単調に下がる(空間分解能の限界そのもの)。
- L522 — ★1 枚の隅を切って数えると窓の取り方で 2 倍動く。全窓の平均を使う。
- L577 — ★所見を固定する: 偏りは斑点を太くすると単調に減る。3 節で見た lk の偏りは 推定器だけの性質ではなく、スペックルの標本化不足が半分を作っている。 ここが単調でなくなったら「0.01 px」の主張の根拠が 1 本崩れる。
examples/poc_die_tilt_tsv_overlay.py
- L167 — 格子の広がり。★erf の裾(±4σ)まで含めないと、傾いたダイでは外周のビアが z ごとに違う切られ方をして偽の傾きになる。
- L241 — ★台帳経由の vol_label は docstring と違って labels だけを返す (
(labels, n) の n が落ちている。節 9 の (f))。
- L297 — ★ここで MU_SI を引いてはいけない。探針はビアの外では空気(0)を 通るので、生の値がそのまま材料の占有率に比例する。引いて clip すると 端のなだらかな部分が 0 に潰れ、長さが 100.0 -> 98.1 µm(-1.9 %)。
- L484 — ★対照群を引いて「傾きが足したぶん」だけを取り出す(推定器の系統誤差を消す)
- L634 — (f) ★同じ op が、呼ぶ経路によって返り値の中身が違う
examples/poc_dimensional_inspection.py
- L521 — ★ rms を信じてよいか —— 敵対的に 1 点だけ外へ動かす
- L1553 — ★2026-09-06 に「埋もれている」が解消された。以前は
n_reach == 0 (届かないことを固定)だった。いまは届くことを固定する。
examples/poc_document_scan.py
- L271 — ★ 2 値マスクに直接 sobel_dir を当てると勾配方向が 0/90 度に量子化され、 1 点 1 票の方向つき Hough はその 2 本に潰れる(実測: 4 本のうち 2 本が ちょうど 0.00 / 90.00 度)。先にぼかしてから方向を測る。
- L389 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_driving_decisions.py
- L247 — ★2026-10-03 まで縞が x に 10 m 長く y に並んでいた(90° 回っていた、ユーザー指摘)。下の門が向きを確かめる。
examples/poc_driving_endless_map.py
- L329 — 追従カメラ: 車の 7 m 後ろ・3 m 上から、車の 25 m 先を見る(★頂点がカメラの後ろにある三角形は描かれないので、 カメラを車の真上に置くと足元の地面に穴が開く)
- L337 — ★描画器は頂点が 1 つでもカメラの後ろにある三角形を捨てるので、足元に穴(空の色)が開く。地平線より下なのに何も 当たらなかった画素だけを地面の色で埋める(第 6 回の env_render と同じ扱い。見た目だけで、門には使わない)
examples/poc_em_second_opinion.py
- L115 — ★面積で揃える: 仕込んだ融合は「min_area 以上の 2 ラベルの和」なので必ず大きい。負例をそのまま 使うと「大きいラベル = 怪しい」だけで AUC が出てしまう(最初の実測: 弦 0.86 に対し面積だけで 0.87)。 負例は正例と同じ下限(2 × merge_area)以上の成分に限り、基準の「面積だけ」も同じ集合で測る。
examples/poc_emva1288_in_camera_processing.py
- L430 — ★壁時計でなく CPU 時間で掛ける: スイートが PoC を 6 本並べて走らせると、単独 31 秒が壁時計 115 秒になった(2026-10-13 の全量)。 この PoC が自分で使う計算量を見るのが目的なので、他のプロセスの混み具合で揺れない量にする。
examples/poc_endless_zoom_and_turning_solids.py
- L75 — 深さの巡回に使う色。★赤と緑は対にしない(意味が見る人で反転するため)
- L303 — ★主張は整数で置く。埋まった箱の数が 6 ズームとも同じ整数列である ことが「ズームしても同じ集合を見ている」そのもので、整数だから 環境に依らない。
- L310 — ★次元のほうは最小二乗を通るので機械精度でしか主張しない。
sd == 0.0 と書いていた時期があり、CI で落ちた —— 6 つとも 6 桁まで 同じ値なのに std != 0 で、degrade の記録も 0 件だった。同じ整数列を 渡しても BLAS の並列化で lstsq の最下位ビットが揺れる。 それは「ズームで次元が動く」ことではない。
- L412 — ★ここで最初の予言を外した。「2 パーセントの床は marching cubes の面取りの せい」と読んだが、距離を伸ばすと厳密な立方体も同じところまで落ちた —— 床の正体は透視投影だった。面取りのぶんは別の量(最大/最小の比)に出る。
- L630 — ★op が静かに degrade していないか。
fs.op.* は backend_safe.guard 越しで、 例外が出ても「sort 妥当な別の値」を返す —— 厳密な等式の検査だけが落ちて、 原因が症状から離れる。degrade していたらここで名指しする。
- L645 — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_eye_to_brain.py
- L60 — ★背側から見るだけだと、像の左右(方位角)は soma の y 軸 = 奥行きに写り、応答の移動が見えない (2026-09-20 に実測: 縞を動かしても同じ場所が光って見えた)。背側と側面の 2 方向を並べる。
- L139 — ★2 値の縞では 1 ビットでも相関 0.99 で量子化の効き目が測れない(実測)。背景 0.5 に +0.3 の 滑らかな縞(σ = 6 px)= 低コントラストの像で、ビット数が信号を潰す条件にする。
- L162 — ★実測(2026-09-20): 効いているのはビット数ではなく「背景を引く」適応。背景 0.5 の像を適応なしで入れると 全柱が刺激され重心が動かない(実データで 0.63)。適応した連続値と 8 ビットは同じ(0.99)。
examples/poc_fabric_defect.py
- L83 — ★マスクの面積はわざと同じくらいに揃えてある。まとめた AUC は陽性画素数で 重みづけた平均に近いので、片方が桁で大きいと「まとめると隠れる」が起きない。
- L119 — ★マスク半径は σ の倍率で個別に決めてある —— 面積を揃えるため。 面積が桁で違うと「まとめた AUC は面積の大きいほうの AUC」に なってしまい、この PoC が測りたい「まとめると隠れる」が 「面積が大きいほうが勝つ」という別の話にすり替わる。
examples/poc_fiber_orientation.py
- L376 — 節 2. ★★素朴な平均が 180 度周期で壊れる # ————————————————————————— #
- L469 — 節 4. ★★重みを選ばないと配向度は必ず小さく出る # ————————————————————————— #
- L499 — ★角度は周期量なので colorize_depth で塗ると 0 度と 179 度が正反対の色に なる。fullseye には循環 LUT の名前は無いが、colorize_flow に (cos2θ, sin2θ) を渡すと 2 倍角の循環 LUT になる(末尾「道具の穴」(f))。
- L693 — ★”coherence” という名前は在るが、信号処理の 2 信号コヒーレンス(別物)
- L724 — (e) ★同じ族の 2 本で入力検査が食い違う
examples/poc_fly_optomotor_steering.py
- L503 — ★2026-10-06: 6 系列に配色の役が 5 つしかなく、motor right が HS left と同じ色だった。 層ごとに 1 色、左 = 実線・右 = 破線にする。
examples/poc_fly_vision.py
- L623 — ★ラミナ段(DC 落とし)を省くと相関が落ちる、を固定する。落ちなくなったら fly_emd_response の側で DC が消えている(仕様変更)なので、この対照を見直す。
- L650 — ★PoC の門(tests/test_poc_scripts_run.py)は exit 0 に加えて “PASS” の印字を 要求する(合否を計算したのに捨てる門を防ぐ規約)。
examples/poc_focus_stacking.py
- L176 — 絞り。★2026-10-14: defocus_blur のぼけが 2 倍広かった(σ = 錯乱円の直径/2、正しくは /4)のを直したら、F 5.6 では 被写界深度が 2 倍深くなり、0.42 mm 間隔の像で奥行きが区別できなくなった(テクスチャ有の RMS 0.47 → 0.91 mm)。 旧版の結果は「F 5.6 と書いて実質 F 2.8 のぼけ」の上に立っていた —— 書いた値と効いていた値を揃えて F 2.8 にする。
- L601 — 1. 絵は効いている。★閾値は +3 dB —— 半導体の実画像は平滑金属(ダイ・リード)が 大半で、そこは単一フレームでも合焦しているため、全面が高周波な合成パターンほど AIF の伸びは大きくない(現場の正直な姿。旧・全面テクスチャ場では +14 dB 出た)。
examples/poc_forensics_roc.py
- L396 — ★穴 (a) は「定数地図」なので、絵にすれば数字を読むまでもない。
- L523 — ★この PoC の見出し。いちばん強い検出器の曲線が、保存ボタン 1 回で 対角線まで(そして下まで)落ちる。
- L677 — (4) ★穴 (a): op の argmin 読み出しは、再保存した画像では実質定数地図。 AUC はちょうど 0.5 = 乱数と区別できない。
- L704 — (9) ★穴 (b): 8 画素格子。差が 8 の倍数のときだけ言い当てる(再保存なし)
- L52 — 色。★赤と緑は対にしない
- L355 — ★変数名は章ごとに分ける(あとの章の best に上書きされて、図の説明が 別の章の数字を出していた)
- L370 — ★図が主題を映しているか。x, y だけで描くと zw 面の回転が消える。 実際にそれで 2 つの GIF がバイト単位で同一になっていた。
- L403 — ★marching-cubes 系と同じく巻きが内向きなので絶対値を取る
- L425 — ★B との差が「断面の角数に依らない」= 2 つの誤差が独立に分かれている証拠
- L559 — ★x, y だけを描くと zw 面の回転が消える。一般の向きで見る。
- L651 — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_fourier_ptychography.py
- L239 — ★明視野と暗視野の境に LED が乗る構成(ピッチ 7 mm・距離 70 mm、照明 NA 0.0995)は外し、境の章で別に見せる
- L390 — ★高さだけの線(振幅は一様)では、full(384 画素)で 2 本の初期値が 0.098 違って拒否された(差は照明 NA 0.2〜0.3 の 帯に集まる。暗視野の露光を 4 倍にしても 0.092)。散乱の弱い物体の高い周波数は、k の丸めの模型の誤差に埋もれる。
- L581 — ★実データでは瞳を画素ごとに自由に推定する(pupil_degree=None)。2〜4 次の多項式に射影すると残差が 2.3 倍 (0.0143 対 0.0061)になり、G7 の大きな要素でも変調が 0.4 に落ちる —— 実機の瞳は振幅にも構造がある(推測)。
examples/poc_gear_tooth_metrology.py
- L199 — 撮像系のぼけ。★2-D のガウスぼかしは σ を直に渡す口が無く、進化 op の つまみ a から σ = 0.3 + 2.7 a を逆算して渡す(末尾「道具の穴」(c))。
examples/poc_geodetic_height_frames.py
- L411 — ★往復は「両方同じ向きに間違っている」を排除できない。独立実装と突き合わせる。
-
| L440 — ★予測(測る前に印字する): 傾斜は atan |
∇H |
。h を使うと atan |
∇H+∇N |
。 |
- L467 — ★予測と実測の最大差は「模型の誤り」か「離散化」かを分ける。セルを細かくする。
-
| L587 — ★予測(閉形式): 下り方向が 90 度以上回る ⇔ ∇H・(∇H+∇N) < 0 ⇔ |
∇H |
^2 + ∇H・∇N < 0。測る前に率を出しておく。 |
-
| L647 — ★2 つ目の(こちらが本命の)閉形式。視線は両端の h で引くので、N の線形部は 視線にも地面にも同じだけ乗って消える。残るのは N が弦から離れる量 = |
N’’ |
d^2 / 8。この場の N’’ は 2C(cos^2θ - sin^2θ) なので |
N’’ |
<= 2C。 |
- L1120 — §10 穴。★2026-09-08 にこの節は「geoid / enu / datum は 0 件」を門にした。 2026-09-22 にその門が鳴った(埋まったから)—— 門を消さずに、まだ空いている 語幹へ付け替える。閉じた側は「何が閉じたか」を名前で固定する。
- L1124 — ★2026-10-15: material_xray_attenuation(X 線の減衰)の “att-enu-ation” が語幹 enu に当たる。 測地の ENU ではなく単語の一部 —— 同じ文字列の別の意味として名前で固定する。
- L1126 — ★2026-10-19: water_attenuation(水の減衰)も同じ。
- L1128 — ★2026-10-05: granular の datum_tilt_check(粉体の山の基準面の傾きの警報)が語幹 datum に当たる。 測地成果ではなく「高さ図の基準面」の意味 —— 同じ語の別の意味として名前で固定する。
- L1138 — ★
ortho は逆向きの教訓: op 名に ortho を含むものは 0 件のままだが、 能力は dem_height_frame_convert(frm/to に “orthometric”)で在る。 件数で「在る」と言ってはいけないのと同じくらい、名前で「無い」と言ってもいけない。
- L1141 — ★2026-10-15: 語幹 “ortho” は名前で実験計画の直交表の op(orthogonal、別の語)に 当たるようになった。門が問うているのは「標高(orthometric)の op」なので、検索語を正確にする。 あわせて検索側の穴も塞いだ: 欧文のクエリは 1 行目の doc までしか見ておらず、”orthometric” は dem_height_frame_convert の引数の説明にしか無いので 0 件だった(opassist.find に docstring 全文の段)。
- L1152 — ★
vertical は op_find が件数を返しても中身は 1 つも関係ない (boundary_vertices などの語幹一致)—— 件数で「在る」と言ってはいけない。
examples/poc_glyph_typo_detection.py
- L40 — 壊す位置(行, 列)。★真値はここで決まる。
- L158 — ★統計は画像の全マスをまとめて取る —— 閾値をその形で導いたから。 行ごとに取ると、4 字の行では四分位が粗すぎて 0.48〜0.59 に跳ね、 正しい版面を自分で断ってしまう(実測)。導出と適用で統計を変えない。
- L210 — ★マスを少し広げて切り出し、その中で「このマスに属する成分」 だけをマスクにする。隣の字がマスの縁からはみ出していると、 マスちょうどで切ったときにその分が消し残り、置換後に 旧字の切れ端が浮いて見える(実測)。
- L287 — ★床は「同じ字なのに絵が違う」量。書体が 2 本以上あるならその散らばりで測るのが 実態に近いが、素の Linux には CJK が 1 本しか入らないことがある (実測: CI は fonts-noto-cjk だけで、この PoC が丸ごと skip して落ちた)。 1 本しか無いときは、ぼけ・線幅・わずかな回転・再標本化という既知の妨害で 同じ字を揺らして床を作る。測っているものが違うので、名前も表示も分ける。
- L355 — ★合成に対する主張を固定する(真値は自分で植えたので厳密に測れる)。 ここが割れたら、穴が塞がったか本当に壊れたかのどちらかで、 assert を消して通すのはどちらでもない。
- L364 — ★環境に依存する量を assert しない。 床は「その環境に入っている書体の 散らばり」から作るので、どの書体が入っているかで動く —— 実測 2026-09-17: 手元(Meiryo / 游ゴシック / MS ゴシック)は 0.0581、CI(Noto 系 3 本)は 0.0462。本数は同じ 3 本で、違うのは中身(CI の 3 本は互いに似ていて 距離の中央が 0.0250 対 0.0437)。この差で
電 1 字(距離 0.053)が CI でだけ床を超え、fp == 0 が手元で緑・CI で赤になった。 固定すべきなのは順序である —— 壊れた字の最小距離が、無事な字の最大距離を 上回ること。これは閾値の置き方と無関係に手法の良し悪しを測る(CI の実測: 無事な字の最大 0.053 < 壊れた字の最小 0.069 で、両環境とも完全に分離)。 その上で「床がその隙間に落ちたか」は環境の性質として報告する。
- L375 — ★これは note 080 で退けた「順位で判定する」とは別物 —— 判定は今も床で行い、 ここで固定するのは分離しているという性質だけ。
- L403 — ★書体 1 本の環境では主張を弱める。妨害から作った床は書体の散らばりより 狭く(実測 0.0258 対 0.0581)、撮り方の違いだけで無事な字まで超えてしまう (実測 7 本中 5 本)。この環境では言えないことを言わないのが正しく、 閾値を緩めて通すのは測定を捨てるのと同じ。CI には CJK を 2 本入れてある。
examples/poc_good_sample_variation_model.py
- L286 — ★地の模様が弱いと、汚れた 3 枚の傷が位相相関の山を引っ張り、0.65 px の「ずれ」として拒否された (実測。拒否は正しい振る舞い —— 汚れた良品は位置合わせも汚す)。ここは帯の比較なので模様を強くする。
examples/poc_granular_heap_repose.py
- L357 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L408 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_graph_hierarchy_segmentation.py
- L369 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_grating_interferometry.py
- L323 — ★正直な限界: 段差の縁の 1 画素だけが π を超える板(平らな背景の隣)は、折り返しが見えずに通る
examples/poc_gravitational_lens_invariants.py
- L77 — 色。★赤と緑は対にしない
-
| L129 — ★縁の幅は像面の画素で測る。光源面の距離をそのまま使うと、倍率の 大きいところで縁が細く見え、面積が系統的にずれる(実測 2.1% → 0.2%)。 d は光源面の量なので、像面での変化率 |
∇d |
で割って像面の単位に直す。 |
- L242 — ★はじめ「暗い像が小さくなる u = 1.5 がいちばん苦しい」と読んで外した。 実測ではどの解像度でも u = 0.3(焦線に近い側)が最悪で、u = 1.5 の 暗い像は n=3201 でも 209 画素ある。苦しいのは「像が小さい」ほうではなく 「像が引き伸ばされて細い弧になる」ほうだった。
- L531 — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_hyperspectral_foreign_matter.py
- L105 — 見た目の色(線形 RGB の反射率)。★同じ色にしたのは設計(この PoC の問いそのもの: 色を合わせた異物)。 皮つきアーモンドの茶色に、殻・木片・茶色に着色した樹脂片を ±3 % で合わせた。黒い樹脂だけは黒い。
- L418 — ★実データの破片は暗い(反射率の中央値 0.07)ので、生の反射率の SAM は足し算のベースラインに負ける(下で数える)。 連続体除去(
spec_continuum_removal、上側の凸包で割る)の帯の深さ 1 − R/包絡 を特徴にする。
- L466 — ★外の真値の検査 1: 別の撮影の基準試料(Training/PP・PE・PET の 11x11)をライブラリにして、試験の場面の PP / PET / PE を分ける
- L482 — ★外の真値の検査 2: この PoC の材料表の物理(吸収帯 + Kubelka–Munk)をライブラリにする
- L944 — 幾何平均(間が空いていれば余裕の真ん中)。★初版は q_k だけで決め、試験のトレイで粒径・含水率の端の仁を 丸ごと排出した(画素の分位点は仁の「個体」のばらつきを数えていない、2026-10-15 に図で見つけた)。
- L1038 — ★クラスごとに同じ画素数で選ぶ: Fisher の Sb = Σ n_k (μ_k − μ)² は画素の多いクラス(ベルト・仁)に 引っ張られ、少ない樹脂片どうし(PE と PP)を分ける帯域を選ばなくなる(2026-10-15 の初回で実測)。
- L1050 — ★log 反射率で選ぶ: 画素ごとの明るさ(陰影)は全帯に共通の足し算になり、多変量の J はその方向を クラス内のばらつきとして割り引く(1 帯域だけでは明るさと材質を分けられない —— k = 1 が弱いのはそのため)
examples/poc_illusions_and_perpetual_drawing.py
- L60 — ★ここは以前「錯視の図で測る側を採点する」章だった。だが並んでいた検査は 自分で置いた定数を読み返すだけで、間に変換が 1 つも無かった —— 厳密に水平に引いた目地が水平だ、平坦に塗ったマスが平坦だ、同値に置いた 2 パッチが同値だ。錯視は人間の知覚の性質なので、測る側が騙される理由が そもそも無い。同義反復なので落とした(2026-09-24、指摘を受けて)。 残したのは 1 件だけ —— 素朴な長さ計測が実際に外すこと。これは 知覚ではなくアルゴリズムの偏りの話なので、中身がある。
- L95 — ★外した予言 —— 「矢羽根が長いほど偏りも大きい」と読んだが違った。
- L103 — ★錯視の絵(カフェウォール・チェッカー・カニッツァ・フレーザー・ エビングハウス)は直線と矩形を引いているだけで、この箱の力を 何も示していない。2026-09-24 の指摘を受けて主図から降ろした。 残すのは、測る側の偏りが見える 1 枚だけ。
- L144 — ★閉形式で厳密に出るものと、再帰で誤差が積もるものを同じ物差しで見ない。
- L167 — ★最初は「104 歩で 52 マス = 0.5 /歩」と書いたが、実測 0.114 と合わなかった。 測り直すと正味の増加は 104 歩あたりちょうど 12 マス(整数)。周期の 中で塗っては消すので、正味はずっと少ない。推測でなく実測が正しかった。
examples/poc_interferometry_step.py
- L401 — 3) ★繰り返し測定 — 偏りと散らばりを分ける # —————————————————————— #
- L444 — 4) ★ゼロ点(包絡線の最大サンプル)との比較 # —————————————————————— #
- L516 — 6) ★雑音掃引 — どこで測れなくなるか # —————————————————————— #
- L556 — ★散らばりが小さいことは正しさの証拠にならない
examples/poc_interreflection_fringe_error.py
- L289 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L292 — ★この PoC だけは CPU 時間が壁時計を大きく上回る(手元 24 スレッドで CPU 10〜13 秒・壁時計 0.6〜0.7 秒、 OMP/OPENBLAS/MKL_NUM_THREADS=1 では CPU・壁時計とも 0.1 秒未満)。計算そのものは小さく、差は BLAS の スレッドの空回り(待ちの spin)で、コア数に比例して増える。60 秒の上限は手元の 4.7 倍で、CI の走者(4 コア) では空回りがさらに小さいので据え置く。上限に近づいたら、計算が増えたのか空回りかをスレッド 1 で切り分ける。
examples/poc_itof_multifreq.py
- L341 — ★2026-10-18: residue_crt の錨を Wang–Xia 2010(IV-A 節)どおりに直した後は、最尤の復号と同等になる。 修正前(最も長い周期 = 16 MHz を常に錨にした)は 0.556 / 0.407 と大きく誤っていた。差の許容は 最尤の 10 % + 標本 5 個(誤りの少ない条件で数個の入れ替わりを許す)。
examples/poc_kendama.py
- L112 — ★CI(2 コア、PoC を並列に走らせる)では full の設定が 600 秒の枠を超えて -1(timeout)になった(2026-09-30、run 36657843727、 手元 160 s)。FULLSEYE_POC_BUDGET=reduced(CI では既定)で、大皿の 20 試行(予測誤差の曲線と主要な門)はそのままに、小皿・中皿・ 画素雑音・推奨品の試行を 10 に、画素雑音の段を 0 / 2 / 8 / 16 px に、3DGS の試行・コマ・間隔の段を減らす。門の閾値は変えない (測った段だけで判定)。展示の数字は full の実測で、reduced は「同じ経路が走る」ことの証拠に留める(先頭に BUDGET: を印字)。
examples/poc_knife_tactile_toughness.py
- L483 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_larval_connectome_reservoir.py
- L43 — ★CI(2 コア)では full の設定が 600 秒の枠を超えて -1(timeout)になった(2026-09-20、run 35501201432)。 FULLSEYE_POC_BUDGET=reduced(CI では既定)で標本・格子・seed を減らす。展示の数字は full の実測で、 reduced は「同じ経路が走る」ことの証拠に留める(先頭に BUDGET: を印字)。
- L207 — 5. 図(FULLSEYE_FIGURE_DIR があるときだけ)。★2,952² の隣接行列をそのまま描くと 1.3 % の点で一色になり、 Fiedler 配置は重い裾の次数分布で 1 点に潰れる(2026-09-20 に実際にそうなった)。升に集約し、対照と並べる。
examples/poc_laser_line_speckle_floor.py
- L349 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_leak_localization.py
- L591 — ★予測 C の検定 —— 漏水位置を細かく振って小数部を散らす
- L726 — ★対照群 —— 反射だけを左右入れ替える。偏りの向きが反転すれば 「遠いほうの継手が偏りの向きを決める」が原因だと言える。
examples/poc_lens_tolerancing.py
- L165 — ★2026-10-21: 棒の縦軸は 0 から(自動範囲は最小値の少し下から始まり、差を 10 倍に見せていた)。
examples/poc_lidar_terrain_change.py
- L425 — ★測れなかった core の面積は土量に一切入らない。有効率で割り戻した値も返す —— 割り戻さないと「静かに欠けた土量」を正しい値だと思ってしまう。
- L713 — ★真値に近い数字が「正しい」とは限らない —— 逆向きの 2 つの誤差を分けて数える
- L842 — ★有効 core が少なすぎるときの LoD は「測った」ことにしない (2 点の標準偏差は数字にはなるが意味を持たない)。
- L845 — ★ここで間引くと C2C が「間引き後の点間隔」を測ってしまい、密度依存が消える (最初に 6000 点へ揃えて書いたら、どの密度でも 0.42 m の一定値になった)。
- L965 — — ★ 合わせた分だけ変化が消える ————————————– #
- L1329 — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
examples/poc_lightfield_depth.py
- L707 — 2b. ★ 穴 (d): docstring は 0-d と言うが実際は (1,)
- L723 — 6. ★ 穴 (a): 既定 linear は 1.15 を 1.0 側へ引く、cubic は引かない
- L747 — 10. ★ 穴 (e) は 2026-09-06 に塞がった。塞がった状態を固定する側へ 書き換えてある(以前は「警告が出ること」を assert していた)。
examples/poc_livestock_body_volume.py
- L1187 — ★3 台と 6 台は接線の集合が完全に一致する(平行投影では向かい合う 2 台が同じ)
- L1195 — ★奇数 13 台が偶数 16 台に勝つ
- L1209 — ★3-D の凸包は「断面の凸包」の代役にならない(胸囲を大きく外す)
- L1212 — ★2 倍則: 胸囲の誤差が体重で 2 倍になる(残差は 2 次項)
examples/poc_machine_condition_fusion.py
- L184 — (継手, 軸受A, 軸受B, 機械全体) の発熱 [W]。★正常・アンバランス・ゆるみは わざと同じにしてある —— 熱では原理的に分けられない 3 モード。
- L202 — ★軸受と同じくらい熱い。違うのは広がりだけ(両軸受 + 機械全体)。
- L1028 — ★2026-09-08: ここは numpy の rfft を自前で書いていた —— 「片側振幅 スペクトルの口が台帳に無い」と読んだためだが、
fs.spectrum は 前から在った(台帳に出ていなかっただけ)。1 つの層だけ見て 「無い」と決めた例なので、op を使う形に直す。
- L1162 — ★2026-09-08: ここは「台帳に spectrum が無い」と書いていたが、
fs.spectrum は最初から在った(dsp の 1-D 層)。無かったのは 「台帳(fs.ledger)に出ていること」と「op ごとのノート」だけで、 この PoC は 1 つの層しか引かずに「無い」と決め、numpy の rfft を 自前で書いていた。ops1d を台帳へ繋いだのでいまは両方から引ける。
examples/poc_malecns_activity_wave.py
- L241 — ★同じ瞬間を 3 方向から(2026-09-20、ユーザー「いくつかの方向から発火状態を見れると良い」): 上段コネクトーム、下段 shuffle
examples/poc_material_optical_library.py
- L111 — ★2026-10-15: 水の k を Hale & Querry 1973 から Segelstein 1981 に差し替えた(RII の Hale の表は NIR を 0.2 µm おきにしか持たず、1.45 / 1.94 µm の吸収帯を線形補間で 1/3 に潰していた。n は滑らかなので Hale のまま)。 1500 nm の k は optiland 0.6.3 の MaterialFile で Segelstein.yml を評価し直した値(2.2392e-4)。
- L195 — ★2026-10-15: 以前は k の相対差に 1e-6 を掛けて n の門に混ぜていたので、k が ±100 % ずれても通った。 写した k は有効数字 5 桁(1.4361e-07 など)なので、丸めの幅は相対 5e-5。optiland が k を持たない点(0)では こちらも 1e-8 未満(水の 500 nm は Segelstein の 9e-10、吸収の無い区間)。
examples/poc_measurement_system_analysis.py
- L155 — ★★看板は一目で読めるものにする。濃淡の地図は情報としては正しいが 読者には「色のついた雑音」で、何の図か分からない。ゲージ R&R の古典的な 見せ方 —— 部品ごとに測定値を縦に並べる —— なら、10 個の塊が縦に離れて いるのが部品差、各塊の太さが測る行為のばらつき、と目で読める。
- L211 — ★「全部内側のはず」と書いたら 1 升はみ出した。実データのほうが正しい —— 規格の例題はわざと 1 点だけ管理外にしてある(範囲図の読み方を示すため)。
- L466 — ★2 点を結んだ直線では「7.3 % 違う」としか言えない。交互作用の強さを 掃引すると、いつモデル選択が効いていつ効かないのかが曲線で見える。
- L661 — ★★規格の「t 表を引く直前に切り捨てる」は、滑らかな t(ν) に対する階段。 実装が踏んだ欠陥(切り捨てずに引いた)が、そのまま曲線と階段の差になる。
- L684 — ★3 点の散布では「向きが逆」が読み取れない。相関係数を掃引すると、 2 本の曲線が無相関の水平線を反対側で横切るのが見える。
- L756 — ★★その 150 は乱数ではなく閉形式で出る: X1²+X2² は u²χ²₂ = 平均 2u² の 指数分布なので、上側 95 % 点は 2u² ln 20。公表値と小数 1 桁まで合う。
- L771 — ★★閉形式が絵になる場所。x1 = x2 = 0 では X1^2 + X2^2 は u^2 chi^2_2、 すなわち平均 2u^2 の指数分布。95 % 点は 2 u^2 ln 20 で閉形式。
- L837 — ★★半幅を 3 本の水平線で並べても「なぜ違うのか」は見えない。密度を 重ねると、正規近似の裾が実際より厚いことが絵で分かる。
- L849 — ★区間は水平の線分で描く(plot_series は非有限を拒むので 「NaN で区切って 2 本の縦線」は使えない。読みやすくもある)
- L912 — ★窓は3 段階すべてが入るように取る。伝播則の下端が 0 を超えるのは x1 > 2 k u = 0.0196 なので、そこまで届かない窓だと「追いつく」が見えない。
- L922 — ★各コマで最大値に正規化する。絶対密度のままだと、指数(原点で 2e4)と 後半の正規(1.6e3)で 1 桁違い、後半が平らに潰れて形の変化が見えない。
examples/poc_mesh_quality_repair.py
- L602 — ★飽和させて見せる。素の差は最大 %.2f mm で、そのまま塗ると 99 %% の画素が 0 の真っ黒になり「走ったが何も出ていない」図になる。
- L816 — ★両対数で描く。線形軸だと誤差が粗い側の 1 点に潰れて、傾き(=誤差則)が まったく読めない図になる(2026-09-07 に一度そう描いた)。
- L832 — ★累積分布をそのまま重ねると 4 本とも 0.9 以上で潰れて何も読めない。 動いているのは上の裾なので、分位点 0.5〜0.99 を横軸にして 「その分位点の曲率」を縦に描く(逆累積の上半分)。
- L568 — ★実測はそれより遅い。マスク上で実際に消えている粒界画素の割合 f_eff は f より 小さい(ぼけが隙間の両端 1 px に隣の黒を漏らし、局所しきい値がそれを拾う)ので、 f_eff で引き直した予測 ΔG0 + 6.64 log10(1-f_eff) と突き合わせる。
examples/poc_moire_screen.py
- L586 — ★2026-09-23: 語の網を (“notch”, “destripe”, “mura”) に狭めた。npr 族が入って ‘moire’ と ‘periodic’ が引っかかるようになったが、
halftone_moire_period は うなりの周期を予言する op であって落とす op ではない —— 穴は残っている。 「語で引く穴の固定」は、別の意味で同じ語を使う族が来た瞬間に偽陽性になる (この PoC は (a) で fly_hex_lattice の例を既に書いている)。穴の主張は 語でなく「何ができないか」で書くこと: ここで無いのは「特定の (fx, fy) を 落とす」op であって、「モアレという語を含む op」ではない。
- L636 — ★2026-09-23: “moire” はここから外した —— この PoC が「族の名前か docstring に入れておけ」と書いた提案がそのまま実装され、
halftone_moire_period が 引けるようになったため。穴の記録は埋まったら埋まったと書く(消さない): 消すと「昔から在った」ことになり、何が効いたのかが記録から落ちる。
- L640 — ★元の判定は「名前にその語を持つ op が返らないこと」(docstring 一致は数えない)。
op_find は docstring も語幹も拾うので、素の == [] にすると edge_alias_energy のような無関係の族で必ず鳴る(一度そう書いて落ちた)。
- L646 — ★2026-10-13:
lattice_moire_peak(flyvision、標本化格子がナイキストを超えた模様から作る モアレの尖り = ピーク/背景中央値)も引けるようになった。網点の 2 版のうなりとは別の モアレ(格子×周期面)で、ディスプレイ・メッシュ・織物の検査カメラ側の語。
- L649 — ★2026-10-15: 位置合わせのモアレ 8 op(moirealign、
moire_*)が加わった —— ピッチの僅かに違う 2 枚の格子の 縞の位相から nm のずれを読む側で、網点のうなり(画質の欠陥)とは逆にモアレを測りに使う語。
- L651 — ★2026-10-15: op_find に docstring 全文の段(最低点 12)が加わり、本文で「モアレ」に触れるだけの op (fly_vogel_lattice・halftone_screen・sampling_alias_distance)も並ぶ。名乗る op だけを数える。
examples/poc_multibeam_bathymetry.py
- L359 — ★走時を使い切った光線は cosθ が層の途中の値のまま残り、後ろの層で dt_full が 負になりうる。負の dt は rem を「生き返らせ」光線を進めてしまう(実データの 152 節点のキャストで 57 度・0.13 s が 110 m → 493 m になった)ので 0 で止める。
- L544 — エコーを合成する部分角の本数。★これを 61 にすると、70 度では隣り合う 部分角の到来時間が 330 µs 離れ、パルス幅 64 µs より広くなるので、包絡線が 櫛になって振幅検出が歯を 1 本拾う(検出のずれが -1131 µs と出た)。 到来時間の密度をヒストグラムで作り、パルスで畳むほうが正しい。
- L572 — ★下限を 0 でクリップしない —— 直下ビームは片側だけになり、照らす帯が 半分になってしまう(フットプリントが半分に出る形で 1 度踏んだ)。
- L729 — ★横軸をそのビーム自身のエコー長で割る。生の µs で重ねると 70 度(21 ms)が軸を独占して、直下と 45 度が縦線 1 本になる。
- L732 — ★
plot_series は xlim の外の点を拒否する(枠に貼り付いて 本物のデータに見えるから)。切るのは呼び手の仕事なので先に切る。
- L1151 — ★重なりの真ん中を見てはいけない —— そこは両測線とも同じ振れ角なので、 誤差が同じだけ乗って差がゼロになる。帯全体で最大を取る。
- L1222 — ★縦軸は高さ(= −深さ)にする。深さのまま描くと上下が逆さになり、 「笑っている」形が「しかめ面」に見えてしまう。
- L1293 — ★縦軸は −深さ。深さのまま描くと海面が下、海底が上の逆さ図になる。
- L1327 — ★
op_find は語幹の部分一致で拾うので、件数が 0 でなくても中身は 無関係なことがある(“footprint” → sk_median_disk)。最上位の 名前まで見てから「無い」と言う。
- L1383 — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
- L1974 — ★左右に分ける: 音速の取り違えは θ について偶(左右対称)。ロールの小さな 取付偏りや参照格子の左右の食い違いは奇(D tanθ δ)。中心対称な階級なので k と n−1−k が鏡像。偶部で崖を測り、奇部は両解で同じか(= 音速でない)を見る。
- L2231 — ★全経路の崖は予測より手前。差は振幅検出の偏り(閉形式に無い量)
examples/poc_nuclei_ploidy.py
- L686 — ★逆向きの 2 つの失敗が打ち消して「真値ぴったり」に化ける行が実在する
examples/poc_one_stroke_epicycles.py
- L209 — ★線画なので灰色のまま出す。(H,W) を渡すと save_gif が疑似カラーに 塗って黄緑の絵になる(実測)—— 強度そのものを見せる図では色は邪魔。
- L246 — ★env は examplefig が 呼ばれるたびに読むので、ここで入れれば効く (import 時に固定されていたら –out が黙って無視される、の回避)。
- L267 — ★2026-10-06: 図の見出しが「photograph (NASA AS11-45-6709)」のまま北斎を描いていた(前の題材の名残)。 出典は入力から決める(–image で自分の写真を渡したときに北斎と名乗らない)。
- L418 — ★この絵では既定のペン幅 1.0 px がたまたまほぼ当たっており(偏り -0.0031)、 解いた幅 0.900 px のほうが偏りは大きい(-0.0294)。閉形式が当てるのは 偏りではなくインク率なので、門はそちらに置く —— 偏りで門を作ると 「元から合っていた絵」で落ちる(実測でそうなった)。
- L422 — ★偏りで門を作ると「元から合っていた絵」で落ちる(この絵では既定 1.0 px の 偏りが -0.0031 と既にほぼ 0 で、解いた 0.903 px のほうが偏りは大きい)。 閉形式が当てるのはインク率で、線が重なるぶん実測は必ず下回る —— 門はその向きと大きさに置く。
- L457 — ★ナイキストを満たしているかを先に測る。等弧長の打ち直しは、標本間隔が 線分より粗いと角を切って線そのものが短くなる —— フーリエに載せる前の 段階で情報が落ちるので、ここを見ないと「予言が当たった」の土台が崩れる。
- L523 — ★図を出さない設定のときは組む前にやめる(examplefig.enabled はそのためにある)。 72 コマを描いてから捨てていたので、この PoC だけで 322 秒かかっていた —— スイートは FULLSEYE_FIGURES=off で全 PoC を並列に走らせ、1 本 600 秒・ 全体 5400 秒の上限があるので、共有ランナーで timeout に落ちる(CI py3.12)。 数値の門はフレームに依らないので、ここを飛ばしても採点は 1 つも減らない。
examples/poc_pallet_load_utilization.py
- L232 — ★デッキの点は雑音で +3σ まで浮くので、床のしきい値で切る。これを 入れないと、はみ出しゼロの荷にも 0.006 m3 の「はみ出し」が出る。
- L479 — ★g = w ちょうどは「格子が偶然そろうかどうか」の勝負になる。
examples/poc_panorama_drift.py
- L112 — ★ 穴 (a): 以下 4 つはどれも fs ファサードにも fs.op にも出ていない
examples/poc_particle_sizing.py
- L213 — ★種を 1 本だけにすると、この曲線の上下はただの揺らぎになる。 4 本の種で平均と散らばりを分けてから「横切った」と言う。
- L428 — ★対照群 —— 融合も縁切れもしていない塊だけを、その塊が写している 粒子そのものと 1 対 1 で突き合わせる。真値の側を全粒子にすると 「大きい粒子ほど融合しやすい」という選び方の偏りが混ざって、 標本化の偏りと区別がつかなくなる(最初そう書いて取り違えた)。
examples/poc_particle_tracking.py
- L702 — ★返りはマスクではなく (N, 3) の (z, y, x) 座標(2-D の
local_max / sk_local_maxima は画像を返すので族の中で不揃い。 10 節の穴 (g))。最初 count_nonzero で数えて桁を間違えた。
- L777 — ★上へ 3.4 倍・下へ 0.93 倍を 1 枚に収めるので、縦軸は log10 の比。 0 が「真値ちょうど」。線形のままだと下向きの外れが潰れて見えない。
- L792 — ★生の MSD を重ねると 4Dτ の直線が全部を支配して差が見えない。 真値で割った比にすると、1.0 からの離れ方(= 壊れ方)が形で読める。
examples/poc_periodic_video_boundary.py
- L137 — 第 2 章 ★空の出力は、等変性の門を素通りする # ————————————————————————— #
- L267 — 第 4 章 ★汚れるフレームは集合として閉形式で予言できる # ————————————————————————— #
- L296 — ★汚れが先頭側だけで末尾側に無いこと = 窓が後方(因果的)である証拠
- L457 — ★この 1 行が要る。門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見ており、落とすと exit -2(門が付ける合成コード、 意味は「exit 0 だが PASS を印字していない」)で赤になる。
examples/poc_phase_measuring_deflectometry.py
- L496 — ★2026-10-15: 手元 23 秒の計算が、CI の並列のシャード(py3.12 3/4)では壁時計 120.6 秒になり、この門だけが赤に なった。壁時計は同じ機械で走る他のテストの負荷を数えてしまう。この門が抑えたいのは「この PoC 自身の計算量」 なので、プロセスの CPU 時間で測る(壁時計は併記する。テスト側の 600 秒の打ち切りは別にある)。
examples/poc_photoelasticity.py
- L160 — ★所見を固定する: これは fullseye の Mueller op に対する厳密な検算で、 δ を 15 度刻みで一周・θ を 5 通り振っても機械精度で一致する(実測 2.2e-16)。 ここが緩んだら 3 節以降で測っているのは「読み取り手順」ではなく op のバグ。
- L181 — ★応力場そのものの検算も固定する。積分した力が荷重に一致しなければ 「真値」ではないし、中心値は閉形式 8P/(πDh) と代数的に同じはず。
- L207 — ★ゼロ点の水準を固定する。以降の「◯倍」はすべてこの 1.09 MPa を分母にしている ので、ここが動くと比較の意味が変わる。
- L231 — ★所見を固定する: 暗視野 1 枚から整数の縞だけ読む素朴な手順は、ゼロ点に 2 倍も勝てない。分解能が fσ/h = 1.78 MPa の刻みに律速されるため。 4 節の位相シフト(誤差が機械精度まで落ちる)との対比がこの PoC の骨格。
- L286 — ★雑音ゼロで同じ強度式から解き戻しているので、θ は厳密に戻るはず (4 枚の平面偏光から 4θ を出す代数がそのまま逆写像になっている)。
- L308 — ★所見を固定する。 (1) 一致率は 95 % を超えるが、100 % にはならない。残りは (δ,θ) ↔ (-δ,θ+90°) の二義性で符号が反転した画素で、1 波長 1 回の測定では原理的に消せない。 「ほぼ合う」でも「完全に合う」でもない、という所見をそのまま固定する。
- L371 — ★所見を固定する。 (1) 減偏光は無い(Stokes の大きさが厳密に 1)。変調が落ちるのは光量ではなく 位相の感度のほうだ、という 5 節の主張の根拠。
- L377 — (2) ★★実測は「マスクを渡すと直る」という素朴な期待の逆を言っている: マスク無し 97.0 % / 標本化不足を外して 97.1 % / 低変調まで外すと 81.9 %。 低変調の画素を抜くと領域が分断され、skimage の unwrap が島ごとに 別の 2π オフセットを選ぶため。「どちらもマスクで外せる」は 予報としては正しいが、処方としては誤り。実測のほうを固定しておく。
- L442 — ★所見を固定する。 (1) 雑音も量子化も無ければ、明視野/暗視野の比から δ は厳密に戻る。
- L445 — (2) ★8 bit 量子化「だけ」の誤差が、雑音 σ=0.002 だけの誤差と同オーダー (実測 0.00277 vs 0.00305)。カメラの bit 深さは雑音と同じ重さで効く。
examples/poc_pigment_unmixing.py
- L860 — ★「1 つの数字にまとめない」の根拠そのもの。同じ行の中で 1.000 と 0.013 が並ぶ。
- L1082 — ★勝てなかったことを図でも残す。ゼロ点の線より下に来ている復元が 1 本も無い。
examples/poc_pipe_wall_loss.py
- L423 — ★健全部は「欠陥が 1 つも掛からない z」を選ぶこと。最初 z=20..60 を 健全部と書いたが、そこは管底腐食の真上だった(肉厚 4.5 mm)。
- L471 — ★r_in/r_out は 画素(ボクセル)単位。mm のまま渡すと視野の外を サンプルして返り値が全部 0 になる(黙って。最初これで真っ黒な図が出た)。
- L817 — ★パネルごとに正規化されるので、同じ範囲に切ってから渡す (切らないと E0 だけ ±4 mm、他は ±1 mm で塗られて比べられない)。
- L1040 — ★穴が塞がったら鳴る。2026-09-07 に鳴り、この節を書き換えた —— 「mm のまま渡すと 例外なしに全部 0 が返る」という指摘を受けて、輪が視野の外なら fail-closed に なった。空を返して黙る側から、拒否して教える側へ変わったことを記録する。
examples/poc_pixel_shift.py
- L418 — drizzle(既存 op、面積保存の別実装)で独立に合わせる。★drizzle の shifts は「フレームの中身が基準からずれた向き」 なので、センサのシフト(画素 (r, c) がシーンの c + dc を見る = 中身は −dc ずれる)とは符号が逆。
- L508 — ★Q = 2 は「折り返しが出るか」の境目。見える解像の得(系の MTF ≥ 0.1 の帯域)が尽きるのはもっと手前: sinc(0.5)·MTF(0.5Q) = 0.1 の Q*。F 11(Q = 1.75)は画素律速の判定でも得は 1.0 倍。
examples/poc_plateau_venue_lod2.py
- L124 — ★文献値との差は門にしない(正直に): 間引いた点群の主軸方向の外接幅は 562 × 298 × 244 m で、 文献の 535 × 294 × 209 m より 1〜17 % 大きい。主軸の取り方(点の主成分か慣性主軸か)と外接の取り方の 違いで、どちらが「正しい」かをこの例は決められない。比較の文には文献値(535 m)を使う。
examples/poc_pod_lighting.py
- L406 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_powder_grinding_ae.py
- L269 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_powder_scoop_pour.py
- L313 — ★2026-10-07: 共有ランナーでは同じ計算が手元の数倍かかる(poc_reproducible_icp で 6 s → 41〜57 s)。 CI(py3.10)で 5.33 s になり落ちた。主張は手元の 5 s、CI は 8 倍の枠で「桁が変わっていない」だけを見る。
- L316 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L503 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_print_registration.py
- L151 — 網点の線数 lpi。★わざと整数比を避けている: 1200/150 = 8.00 px にすると全部の網点が同じ小数位置に落ち、標本化の 位相が揃って合成器に人工物が出る(実測で重心が小数ずれごとに 1.4 px 跳ねた)。 実際のスキャンでも解像度が線数の整数倍になることはまずない。
- L405 — ★ 台帳の口は宣言 out 型に合わせて info を捨てるので
.raw を使う (fullseye/init.py のコメントに実測つきで書いてある落とし穴)。
- L855 — ★ FM 側は探索範囲を 絞らない(絞っても結果は変わらないが、 「AM の折り返しは探索範囲のせいだ」という言い逃れを塞ぐため)。
- L1242 — ★二段が壊れた点は、必ず粗がセルの半径を超えた点(包含関係を固定する)
- L1277 — ★2026-09-13: ‘lattice’ だけ例外を 1 つ許す。flyvision 族の
fly_hex_lattice(複眼の六角格子)が この語を含んで CI で鳴った(run 34751219513)。あれは網点の格子ではないので印刷の穴は 残ったまま —— 例外は名指しで 1 件に限り、それ以外が現れたら今までどおり鳴る。 「語で引く穴の固定」は、無関係の族が同じ語を使った瞬間に偽陽性になる、という実例。
- L1281 — ★2026-10-13: 縞に近づくハエの眼(poc_zebra_stripes_fly_eye)の
fly_vogel_lattice(フィボナッチ の複眼)と lattice_moire_peak(標本化格子のモアレの尖り)も同じ語を含む。どちらも複眼の 標本化格子で、網点の格子ではない —— 名指しで足し、印刷の穴は残ったまま。
- L1286 — ★2026-09-23: ‘halftone’ / ‘screen’ / ‘moire’ の 3 語は埋まった。npr 族の
halftone_screen(回転網点の合成)と halftone_moire_period(2 版のうなりの 周期と向きを閉形式で)が入り、この PoC が「入口が 1 つも無い」と書いていた うちの合成とモアレ予言はファサードから引ける。穴の記録は消さずに、埋まった 語を「在ることの検査」に裏返す —— 消すと「昔から在った」ことになる。 残っている穴は ‘rosette’ / ‘misregist’ / ‘lpi’ / ‘trapping’(版ずれの測定、 スクリーン角/線数の推定、トラッピング)で、そちらが印刷検査の本丸。
- L1330 — ★ 基準にも雑音を入れる —— 雑音ゼロの像だと star_detect が 「星 0 個」で ValueError になる(それはそれで正しい fail-closed)。
- L1353 — ★2026-09-08: この PoC の指摘を受けて op 側を直した。docstring に 「繰り返し構造には使えない」を測った数字つきで書き、投票の 2 番手の山 / 1 番手 を
vote_margin として返すようにした。 賛成率では区別できない 2 つを、この数なら区別できる。
examples/poc_print_warpage_risk.py
- L364 — ★生まれた層は「そのとき既に反っている面の上」に置かれる(要素誕生は 変形後の配置で行う)。ここを初期化し忘れると、後から生えた層だけ 変位ゼロのまま残り、列平均で測った反りが 1/4 になる (2026-09-07 に踏んだ)。力学(K と f)は公称格子上なので不変。
- L806 — ★首が丸ごと消える。部品が 2 つに分かれるので解いてはいけない。
examples/poc_pv_thermal_survey.py
- L381 — ★MOD_SHELTER は健全なのに風が当たらないモジュール。3 節でこれが 全体平均基準では「故障」に化ける。
- L583 — ★モジュール番号は番号ごとに面積比で決める。番号の平均を丸めると 境界の画素が隣の番号(や 0)に化け、モジュールごとの処理が壊れる。
- L812 — ★モジュール中央値の代償 —— モジュール丸ごとの異常に盲目
- L1270 — ★
apply_cmap は vmin/vmax を渡さないとその配列の min/maxで 正規化する(条件ごとに色の意味が変わってしまう)ので必ず渡す。
examples/poc_pxrd_phase_peel.py
-
| L185 — ★a の門 5e-5 の余裕(組み込み時 2026-10-06 に雑音の種を 12 通りずつ振って実測): 誤差は雑音でなく較正の系統で決まり、 この像(傾き 3°・向き −40°)では +3.0〜+4.1e-5(種 21 は +3.8e-5)。種による散らばりは ±0.5e-5 程度で、24 通りの最大は |
4.2e-5 |
。 種は固定なので結果は決定的。門を締めると系統の偏りに当たり、緩める理由も無いので 5e-5 のまま。 |
- L260 — ★40 s は手元(19-22 s)の 2 倍で決めていたが、CI の py3.10 の走者で 41.6 s に なり落ちた(2026-10-11、ほかの 13 門は全部 ok)。走者は手元の約 2 倍遅いので 3 倍の 60 s に。
- L262 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_real_coin_metrology.py
- L136 — ★数が合っていても、同じものを数えているとは限らない。円 1 個が成分 1 個に きっちり収まるか(1 対 1)を確かめる —— これをやらないと「24 = 24」は 偶然でも成立する(2 枚くっついた塊 1 個 + ごみ 1 個、でも 24)。
- L341 — ★2026-10-06: 題の「46 %」が固定文言で、実行の値(+0.40 で -50.41 %)から外れていた。実行の値を差し込む。
examples/poc_real_deblur_honesty.py
- L199 — ★守るのは「どれが勝つか」ではなく勝者が物差しごとに違うこと。 手法名を固定すると、実装が良くなっただけで落ちる門になる。
examples/poc_real_defect_floor.py
- L156 — 振幅の刻み。★これ自体がノブ。粗いと限界が同じ格子点に丸まって、 「σ が大きいほど差が開く」のような刻みが作った差を本物と誤読する (2026-09-09、34 段では σ=1.5 と σ=3.0 の中央値がどちらも 3.20 に丸まった)。
examples/poc_recycling_sorting.py
- L520 — ★掃引の前に、代数から予測を立てて印字する。
examples/poc_registration_basin.py
- L785 — ★利用者が「法線なら在るじゃないか」と
estimate_normals を明示的に渡した場合。 ここが穴の残りで、既定より 14 桁悪い。
- L965 — ★2026-09-06 に穴 1 が塞がった。この assert は塞がった状態を固定する 側へ書き換えてある(以前は
d_fixed < 1e-6 < d_default = 壊れている ことを固定していた)。壊れ方が戻ってきたらここが落ちる。
- L976 — ★2026-09-06 に穴 2 が塞がった。以前は
< 0.9 * len(ka)(壊れていることを 固定)だった。いまは既定のままで完全一致することを固定する。
examples/poc_reproducible_icp.py
- L39 — ★既定(図なし)の経路は CI の PoC の門そのもの。手元 6 s が CI で 41〜57 s(約 9 倍)になり「所要 ≤ 30 s」で落ちた (0.4.0、a9f7e765c)。既定は手元 2.5 s 以下に絞り、主張の重い版(20 万点 × 11 順、ICP の家族 5 本)は –full に移した。 記事・展示の数字は –full の実行から写している。
- L465 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L468 — ★GPU の測定(–full で GPU があるときだけ)の待ちは CPU 時間に入らない —— 門は CPU 側の計算量だけを見る。
examples/poc_rotation_invariance_audit.py
- L115 — ★HALCON 流の領域モーメント不変量。3-D 点群用の
moment_invariants とは 別物(名前だけで選ぶと (N,3) を要求されて落ちる)。
- L208 — ★相対ばらつきは分母がほぼ 0 だと意味を失う。Hu[1] は円に近い形では 真値がほぼ 0 なので、ここを黙って % で語ると「30 % ずれた」に化ける。
- L220 — ★予測が外れたところ。書いた時点では「灰を補間して二値化し直すほうが荒れる」と 思っていたが、周囲長まわりは逆だった。
- L262 — ★地がモノクロなので、輪郭は彩度のある色で描く。灰色には彩度が 無いので、彩度のある色はどの階調とも色相で区別がつく ―― 反転色より 確実で、しかも「これは重ねた線だ」と一目で判る。反転色が本領を 発揮するのは、地がカラーで「どの色を選んでも衝突しうる」とき。
examples/poc_safety_clearance.py
- L114 — ★胴はカプセル 2 本を並べて作る。1 本の円柱にすると断面が円になり、 肩(体幹中心から ±0.19 m)が胴の影から外れてしまう —— 実際の胴は幅 0.50 m / 奥行き 0.30 m の扁平な断面で、伸ばした腕は背後から見ると胴に隠れる。
- L126 — ★X0 と速度は「どの試行でも真の分離距離が正のまま(接触しない)」かつ 「危険な帯に十分な時間とどまる」ように選んである —— 速く歩かせると 危険な帯を数フレームで通り抜けてしまい、見落としを数える標本が足りない。
- L673 — ★遮蔽を入れたまま密度を振ると、遮蔽の偏り(+0.12 m)が全部の行に乗って 密度の効きが見えなくなる。要因を 1 つずつ止めるのが対照群の役目。
- L683 — ★雑音と間引きの引きが 1 回だと見落とし率が数 % 上下する。3 回まわして平均。
- L840 — ★行ごとにまとめて評価する(1 セルずつの Python ループだと 15000 回まわる)。
- L1079 — ★ボリューム op は (depth,row,col)。grid_coords は (nx,ny,nz) なので転置する。
examples/poc_sam_hybrid_bonding_voids.py
- L332 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_scan_to_bim_asbuilt.py
- L658 — ★trim を掛けると「よく合う点だけ」を選び続けて RMSE 0.13 mm の別解へ落ちる (実測: trim=0.9 で吸う角が 0.17 mrad、trim なしで 0.62 mrad)。 as-built 検査では欠陥そのものが大きい残差なので、trim は欠陥を捨てる。
- L950 — ★見出しの主張を 1 枚に: 無傷の天井が、合わせ方だけで傾いて見える
examples/poc_sea_ice_concentration.py
- L232 — 2. ★ゼロ点 vs 線形混合分解 # ————————————————————————— #
- L252 — 3. ★★塊の大きさ(周長)が偏りを決める # ————————————————————————— #
- L291 — 4. ★★密接度で偏りの符号が反転する(打ち消し点) # ————————————————————————— #
- L353 — 6. ★端成分が 5 % ずれたとき # ————————————————————————— #
- L380 — 7. ★★第 3 成分(薄氷) # ————————————————————————— #
- L490 — (b) spec_unmix は在った(★「無い」と書く前に 3 層引いた)
examples/poc_search_sweep_width.py
- L829 — ★形の効き方は捜索の型で違う。走査幅を揃えて、曲線の形だけを比べる。
- L869 — ★取りこぼし 1-P で描く。P そのものだと右上に貼りつき、凡例の箱に 隠れて見えない(実際に 1 度隠して気づいた)。図は「読めるか」を 見てから決める —— 数字が合っていても、隠れていれば伝わらない。
- L1089 — ★再現性の検査: §3 とは種もフレーム数も別なので、同じ条件でどれだけ動くか。
- L1266 — ★ゼロ点を上回っていること(誤検出率を揃えた上で)。倍率は控えめ —— 「ゼロ点でも 174 m 出る」ほうがこの節の所見なので、そこを固定する。
- L1272 — ★外した予測: 全体の背景を引くのはアフィン変換なので、ゼロ点と実質同じ
- L1286 — ★外した予測: 実測の p では平行捜索が C=1 で 1.000 に届かない
- L1290 — ★形は平行捜索にだけ効く: 走査幅を揃えると、ランダムは一致し平行は割れる
- L1293 — ★外した予測: 平らな曲線のほうが強いはずが、逆に弱かった(裾が長いため)
- L1296 — (6) ★W 2 倍 と t 2 倍 は等価
- L1304 — (8) ★見張り役: 誤検出は直下に集中する。閾値だけで W が大きく動く
- L1322 — ★穴を埋めた側の門(2026-09-08)。op_find に和文の段を足し、star_detect の docstring に分野中立の説明語を書いたので、和文で上位に出ることを 固定する。退行するとここが鳴る。
- L1327 — ★「点 検出」だけは今も出ない —— 「点」1 文字は cv_canny / frei_amp のような 輪郭 op の説明にも必ず出るので、同点が並んで押し出される。和文の段が 拾えるのは「2 文字以上の語が効く」場合だけ、という限界を隠さない。
examples/poc_segmentation_gauntlet.py
- L237 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L282 — ★表は世界ごとに 1 枚。examplefig.save_table は 1 セルごとに text_box を全画像に掛けるので、65 行 × 16 列の 1 枚は 100 秒を超えた (実測 104 s)。11 行 × 11 列 × 6 枚なら数秒で、読む側も世界ごとに手法を比べられる。
examples/poc_shape_from_polarization.py
- L296 — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_solar_el_inspection.py
- L366 — ★校正線も同じ撮像系(ぼけ)を通す。ぼかさずに貼った校正線は実クラック より 2.4 倍強く応答し、崖が太い側へ寄った(2026-09-07 に踏んだ)。
examples/poc_solar_limb_darkening.py
- L317 — 2. ★ゼロ点(50 % 法)vs 勾配最大 vs 減光モデル # ————————————————————————— #
- L367 — 3. ★★減光係数 u を振る —— 比例ではなく折れ曲がる # ————————————————————————— #
- L391 — ★対照群 —— ぼけを切ると、残るのは幾何(50 % 面の位置)だけ
- L427 — 4. ★★ぼけの効き方はしきい値で符号が変わる(打ち消し点) # ————————————————————————— #
- L488 — 5. ★黒点 —— 3 % の外れ点で半径が動く # ————————————————————————— #
examples/poc_spc.py
- L144 — ★MT 法。単位空間の MD² の平均はちょうど (n-1)/n(導出した恒等式)。 1.0 を固定する検査はどんな有限標本でも間違いになる。
examples/poc_star_astrometry.py
- L264 — 画像の合成(★ 穴: 指定座標に星を置く公開 op が fullseye に無い) # ————————————————————————- #
- L1243 — ★ 「1 回あたり小さい」と「総当たりで小さい」は別の主張。
- L1348 — ★ 「一様・孤立」の偏りが 0.0000 なのは当たり前 —— プレート解を その 24 個で当てたので、最小二乗が残差の平均を 0 にしている。 使わなかった星での誤差を見るには 1 個ずつ抜いて解き直す。
examples/poc_stockpile_volume.py
- L658 — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
- L863 — ★物差しで勝者が入れ替わる: 体積は水平底面、重心は平面当てはめ
- L879 — ★外した予測: 補間は過小ではなく過大
- L882 — ★相殺: 補間込みの外周だと誤差が小さく見え、見えた点だけだと戻る
- L891 — ★道具の穴。dem_viewshed が直ったらここが鳴る(それが目的)
- L893 — ★2026-09-08: この PoC の指摘で op を直したので、いまは見えるのが正しい。 自前の視線判定と一致し、閉形式にも近いことを固定する(また壊れたら鳴る)。
examples/poc_strain_history.py
- L507 — ★閉形式の予測。中央 = (w²-1)/24 x d²(速度)/dt²(平滑化のなまり)、 因果 = 遅れ (w-1)/2 ぶん過去の速度を返す。
- L578 — ★履歴そのものを重ねた図は作らない —— 真値・累積・直接が目では 区別できず(誤差は真値の 0.1〜3 %)、「よく合っています」に見えるだけの 図になる。測ったものが見える図だけを出す。
examples/poc_structure_4d_deterioration.py
- L349 — ★遮蔽は設計形状(
p_nom)で判定する。数 mm〜数十 mm の劣化で surface が自己遮蔽の箱の内側に入ると、欠損のいちばん深いところが まるごと欠測になり「深い欠損ほど見えない」という嘘の場面ができる (2026-09-07 に踏んだ: 欠損の谷 -21 mm の core が全部 NaN になった)。
- L437 — ★
fit_plane_3d の法線は符号が任意。真の外向きに合わせる(走査器側)。
- L507 — ★台帳経由は宣言 out 型(pose)しか返さないので
.raw で全部受ける。
- L696 — ★「密度が違うのが悪いなら揃えればよい」を実際に試す(voxel_grid_downsample)
- L1257 — ★観測できる情報量そのものを点群から数える(正規方程式の対角成分)
- L1299 — ★まず測り方そのものの床を取る —— 劣化も姿勢誤差も無しで 2 回測るだけ。
examples/poc_surface_roughness.py
- L270 — ★真値は 帯域を宣言したうえで 定義する。粗さ成分そのものではなく、 「λc で切ったあとの粗さ成分」が真値。ここを生の rough_true にすると、 正しい手順で測っても -23% ずれ、その 23% が標本化の誤差と混ざる。 帯域を含まない「粗さの真値」は存在しない —— これが 2 節の主張でもある。
examples/poc_swc_tree_truth.py
- L200 — ★門 4: fullseye の op が自前の計算と整数まで一致する(op の実例 + 第 2 実装)
- L209 — ★門 2: 3 次元 Sholl は回転で整数が 1 つも動かない
examples/poc_table_tennis_bounce.py
- L53 — ITTF の台の跳ね(30 cm → 約 23 cm)を満たす e と、その落下の衝突の速さ [km/h]。★空気抵抗を無視した √(23/30) = 0.876 では 上り下りの抵抗で 1.2 cm 足りない(21.8 cm)ので、main の最初に抵抗込みで解き直す(_calibrate_ittf)。
examples/poc_table_tennis_rally_loop.py
- L342 — ★送り合いの刻みは dt = 0.2 ms。刻みごとにコマを作ると 10 本で 2 万コマ超・数百 GB になり、 図づくりがメモリ逼迫で止められた(2026-10-01)。コマはシミュレーションの時刻で刻む: 1/2 速・25 fps = 0.02 s ごとに 1 コマ、軌跡は直近 0.3 s。コマは uint8 で持つ。
examples/poc_table_tennis_spin.py
- L49 — ★追跡カメラは予算に関係なく 240 fps。120 fps に落とすと標本が半分になり、回転の誤差が √2 倍(バック 0.9 → 10.9 %)、 コマ間で球が 1.6 cm 動くので跳ねの谷も浅く見えた(2026-09-30)。予算は長さの掃引の刻みだけで削る。
- L245 — 画像から見つけた跳ね(真値は使わない)。★z の局所最小のうち最も低いもの —— 欠けた検出が残ると空中に偽の 「跳ね」ができ、最初の谷を採るとその手前で軌跡を切ってしまう(バックスピンで 36 コマしか使えなかった)。 高さの閾値(台 + r + 1.5 cm)で選ぶ手は、コマ間で球が 1.6 cm 動く 120 fps で本物の谷を落とした
examples/poc_telecentric_metrology.py
- L113 — 狙い = iterative)。★2026-10-15 から門に使う: 手元に optiland が無いとき(CI)は、この記録値と telecentric.chief_ray_angle・raytrace.chief_ray(入射瞳が無限遠なら絞りを狙う)の両方を 2e-6 mm で照合する (記録は 6 桁に丸めてあるので丸めの幅 5e-7 mm を含む)。
- L1231 — ★リングごとに自由な楕円(5 自由度)を当てると、影で弧が 90〜180° しか見えない外側のリングは長半径が外挿で 膨らむ・縮む(2026-10-15 に元の解像度で見て分かった: 外側のリングで楕円が白い線から外れ、間隔が 246〜257 px/mm と ばらついた)。テレセン(正射影)なら傾いた板の同心円は「中心と形を共有する楕円の族」に写るので、族ごと当てる。 族の仮定そのもの(中心の共有)は (c) でリングごとに中心を解き直して確かめる。
examples/poc_tem_ctf_thon_rings.py
- L345 — 許容幅(★初回の実行で 400 Å の例が 12.5 % / 5.2° で旧の幅 10 % / 5° を外れ、広げた —— 記録として残す): 大きさは max(60 Å, 10 %)(実写 part2_001 で著者の 2 つの推定どうしが非点で 9 Å、この推定とは 190 Å 違う桁)、 向きは 8°(大きさの誤差 / 大きさ ≈ 0.12 rad = 7° の桁が、向きの決まりにくさの目安)。
examples/poc_template_tracking.py
- L93 — ★ 穴 (a): 相関マップを返す公開 op が無いので private を借りる。 第 0 章で公開 op
fs.op.ncc_locate と一致することを検算してから使う。
- L327 — ★ 穴 (d): 公開 op ならここで黙って [0,0,0] が返る。明示的に失敗を返す。
- L1241 — (2) ゼロ点には床がある —— 整数座標の量子化(★ 穴 b)
- L1271 — (9) ★ 主題: 信頼度は条件で得意・不得意が逆転する
- L1275 — ★ 得意な崖が逆である = どちらか一方を信頼度に選ぶことはできない
examples/poc_theorems_as_pictures.py
- L308 — ★手前側の辺を集めて、ひとつの座標系で一度に焼く。三角形を 1 枚ずつ 焼くと、呼び出しごとに自分の外接矩形へ正規化されて図が壊れる。
- L423 — ★判定は “is not a similarity” で行う。”similarit” だけで見ると op 名
ifs_similarity_dimension そのものに当たって必ず通る —— 最初それで書いており、しかも preset 名を間違えて(“fern”、正しくは “barnsley_fern”)未知 preset の拒否を見ていたのに OK が出ていた。
- L547 — ★図の書き出しが失敗したら、ここで拾う。見ないと「検査は全部 OK・でも図は 1 枚も出ていない」が黙って通る(examplefig は fail-soft で貯める)。
examples/poc_thermal_drift_metrology.py
- L560 — ★語で穴を固定すると、別の意味で同じ語を使う族が来た瞬間に鳴る。
gauge は 測定システム解析(msa_gauge_rr = ゲージ R&R)が入った時点で当たるように なった —— この repo で 4 度目の偽陽性なので、意味の合う語だけに絞る。
examples/poc_thermal_radiometry.py
- L522 — ★前向きは直接積分、逆は校正表。同じ表で往復させると誤差 0 が 自明に出てしまい、床を測ったことにならない。
- L543 — ★Case-0 が厳密に 0 なのは 350.0 K がたまたま表の節点に乗るから。 節点を外すと補間の誤差が見える —— 0 を床と呼ぶのは嘘になる。
- L772 — ★横軸は周囲からの上昇。T_obj のままだと発散が左端の 1 本の縦線に 潰れて、肝心の「どこから跳ねるか」が読めない。
- L782 — ★
plot_series は枠外の点を拒否する(枠に貼り付いて本物の データに見えるから)。発散する側は呼び手が先に切る。
- L836 — ★横軸は絶対の Δε。相対 Δε/ε で描くと 3 本が完全に重なる (§2 のとおり式から ε が消えるので)—— 図として何も言わない。
- L1169 — ★guard band に使うのは上側の張り出し。合格と言いたいのは 「真値が閾値より上でない」ことなので、区間の上端で切る。 下側 off[0] を使うと(分布が右に歪んでいる分だけ)浅く切ってしまう —— 1 度そう書いて、誤合格が減らないので気づいた。
- L1272 — ★同じ取り違えでも ε=0.10 の面では L_obj が負に落ちて例外になる。 つまり「止まるか静かに間違うか」は取り違えではなく場面で決まる。
- L1346 — ★発熱部は平らな台にする。山にすると「ボルトと周りが同じ温度」が 成り立たず、見かけの谷が放射率のせいなのか温度のせいなのか分けられない。
- L1392 — ★補正は偏りを消すが、雑音を 1/ε 倍にする。図(d)でボルトだけざらつく理由。
- L1464 — ★
op_find は語幹の部分一致で拾う。blackbody は 4 件返すが中身は cv_blackhat などのモルフォロジで、熱放射とは何の関係も無い。 件数を見て「在る」と読むと外す。先頭の名前まで見てから言う。
- L1614 — 3. ★外した予測: 絶対誤差は高温ほど大きい
- L1616 — ★物差しを変えても、放射率の誤差は上昇比で発散しない(Δε/ε で頭打ち)
- L1619 — ★発散するのは反射見かけ温度のほう(上昇が小さいほど跳ねる)
- L1632 — 6. ★★包含率。床(ρ=0)では RSS も MC も 95 %、相関を入れると RSS が落ちる
- L1636 — ★MC 側は 94.4〜94.6 % に落ち着く(95 % ぴったりではない)。区間の端は 40000 試行の百分位で決めているので標本誤差があり、現実には量子化も 混じっている。そこまで含めて「MC は当たる」と言う。
- L1652 — 7. ★取りこぼしは片側に寄る(対称な ±k·u が歪んだ分布を外す)
- L1656 — 8. ★★guard band: 誤合格は 無視 > RSS > MC、誤不合格はその逆
- L1676 — ★補正は偏りを消す代わりに雑音を 1/ε 倍にする(ε の比 9.5 に近い)
examples/poc_thermography_ndt.py
- L61 — ★観測時間は健全部の t* (6.8 s) より十分長く取る。短いと健全部の膝が 窓の外に出て、TSR が健全部を「窓の端の深さ」と答える(実測で 2.82 mm に張り付いた)。
- L126 — ★ここだけ近似。1 次元解に横拡散は入っていないので、時刻ごとに 拡散長 σ(t)=√(2αt) のガウスで面内をぼかす。物理のスケール則は 正しいが、境界での質量保存までは満たさない。
- L236 — TSR で t* を探す範囲。★端を除くのは飾りではない —— 高次多項式の 2 階微分は 端で必ず暴れる(Runge)。除かないと argmax が最初か最後のフレームに張り付き、 深さが窓端の 2 値に張り付く(実測、2026-09-06)。次数は 4〜11 を掃いて 8 で 決めた(4〜5 では 1.5 mm 以深が端に張り付き、8 以上は 9/11 と同じ答え)。
- L271 — ★格子の刻みで t* を丸めると、深さが階段状に量子化される(64 点だと 5 % 刻み)。 放物線を 3 点に当てて ln t のサブ格子位置まで出す。
- L329 — ★所見を固定する。ここは近似ゼロの検算なので、崩れたら実装が壊れている。
- L343 — ★推定器そのものの偏り。画像を一切通さず、厳密な 1 次元曲線に
tsr_depth を掛ける。ここで出る誤差が「多項式当てはめの床」で、 3 節以降のずれからこれを引いた分だけが横拡散・雑音の寄与。
- L361 — ★所見を固定する: 床はゼロではないが小さい。両側を押さえる —— ゼロになったら「画像を通さない曲線でも数 % ずれる」という 3 節の 読み替え(±5 % は床とほぼ同じ)が成り立たなくなり、大きくなったら 3 節以降のずれを横拡散のせいにできなくなる。
- L396 — ★所見を固定する。この 2 行が同時に成り立つことがこの節の主張そのもの。 (1) 16 個を 1 本の平均にまとめると、TSR は「常に 1.50 mm と答える」ゼロ点に負ける。
- L426 — ★所見を固定する。 (1) 直径が深さの 4 倍以上ある右下三角は数 % で当たる(1 節の床とほぼ同じ)。
- L457 — ★対照群: 横拡散を切った同じ場面。これで「横拡散のせい」と 「画素が足りない/マスクが取れないせい」を分けられる。片方だけ見て 物理のせいにするのが、この種の実験でいちばんよくある間違い。
- L504 — ★対照群の所見を固定する: 横拡散を切ると 16 個すべてが ±8 % に入る。 この 1 行が「壊れている原因は横拡散ただ 1 つで、画素の粗さでもマスクの 取り方でもない」の根拠。緩めると 3 節の結論が『解像度を上げれば直る』 という誤読に戻る。
- L514 — ★上の推論(窓の終わりの拡散長が効く)が正しいなら、窓を切れば直る。 仮説を立てたら、それが外れる形の実験を必ず 1 つ置く。 —————————————————————— #
- L535 — ★この PoC のいちばん重い所見を固定する ——「縦横比の限界」は物理ではなく 当てはめる時間窓の選び方だった。 (1) 窓 4 秒なら小さい 8 個すべてが ±20 % に入る(実測の最悪 -14 %)。
- L623 — ★所見を固定する: 加熱が一様なら生の 1 枚が最多で、TSR の 2 階微分は 1 個も出さない。「深さの推定には効くが検出には向かない」= 同じ道具が 両方に効くとは限らない、というこの節の主張そのもの。
- L670 — ★ランプの映り込み。欠陥と同じスケールの構造を持つのがこちら。
- L697 — ★所見を固定する。 (1) 壊れるのは (c) の欠陥と同じスケールのむらだけ。(b) のなだらかな 傾斜は生の 1 枚をほとんど壊さない —— ここが「予想が外れた」所なので、 (b) が (a) を割り込まないことを明示的に押さえる。
- L778 — ★既定のキューブにも NETD を入れる。雑音ゼロだと健全部の面内ばらつきが 厳密に 0 になり、SNR が 1e9 のような無意味な数になる(実測して直した)。
examples/poc_thin_film_reflectometry.py
- L92 — ★色名から色相への対応は私の選択(CSS の色は表の色より彩度が高い)—— 色相だけを比べる。
- L210 — ★ 実測で採点(公開データ、CC BY 4.0)—— この PoC の主役 # ————————————————————————— #
- L308 — ★フラット補正(2026-10-15、図を見たユーザーの指摘「Si 側が 2 段に分かれて見える」から): 写真は視野の中心が明るい 周辺減光を持つ(裸の Si は左端 0.238 → 中央寄り 0.263、SiO₂ は中央寄り 0.103 → 右端 0.095)。補正しないと、Si の 暗い側が「薄い膜」と読まれ(0 nm 付近は R が膜厚の 2 乗でしか下がらないので、数 % の明るさの差が 10〜17 nm に化ける)、 明るい側は 0 nm に張り付いて、2 段に見えた。減光を半径の 2 乗 V = c₀ + c₁ r² として裸の Si の側だけで当てはめ、 視野全体を割る。SiO₂ の側は当てはめに使っていないので、その明るさの傾きが消えるかが独立の検算になる。
- L437 — ★予言が外れた: 「裸の Si は無彩色(C* < 3)」と置いたら C* 6.6 だった。Si の反射率は 400 nm 0.49 → 800 nm 0.33 と 短波長ほど高いので、裸のウェハは青みの灰色に見える(実物のとおり)。門を所見の側に書き直した。
- L475 — ★境の直上でも FFT は最大 %.0f nm 外す(窓の DC の裾とフレネルの位相の分)—— 2 倍の厚さで 1 % 以内に入る。
examples/poc_timelapse_growth.py
- L472 — ★格子の位相を 5 通り振り、偏り(平均)と ばらつき(幅)を分けて数える。
- L610 — 2) ★Y 字 —— 合体する組の中心を通る行で体積を切る
examples/poc_traffic_counting.py
- L256 — ★画面の左右で切れている行は重心が引っ張られる。落とした版も測る。
examples/poc_tree_ring_dendro.py
- L229 — ★画素地図を斜めに読むと境界で番号が k, k+1, k, k+1 と震える(最近傍の階段)。 5 標本(1.25 px)未満の短い走りは直前の値に吸収する —— 放置すると真値の 境界が 1〜2 本増え、「年数が合う方向 18 + 合わない 13 = 31 > 24」になった。
- L336 — ★threshold=0 で全部取り、段の高さは自分で測る。measure_pos の amplitude (勾配ローブの両端差)は木目で勾配が単調でなくなると段の途中で止まり、 0.14 の段を 0.05 と返す(8 節で数える)。
- L345 — ★px へ戻す外縁半径は測った行のもの。扇形 15° 全体の中央値を使うと 偏心成長で外縁が扇形の中で 10 px 以上動くので外側の年輪が全部ずれる (最初そう書いて年輪 18〜35 を丸ごと落とした)。
- L543 — ★年数を間違えた方向でも幅の相関は高いか —— 年数と幅の相関は別の量
examples/poc_vanishing_detail_and_morphing_area.py
- L73 — 色。★赤と緑は対にしない
- L623 — 3. 消える距離は整数(束ね幅を縦に積む。★各行を正規化しない)
- L638 — ★消える行(f·k が整数)に左端で印を付ける
- L775 — ★見せる図は決め打ちの制御点で(検査のほうは乱数 4 通りで通してある)
- L851 — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_vegetation_cover.py
- L320 — ので、ここでは緑・赤の 2 バンドに落として解く。★道具の穴。
- L543 — ★対角線に載っているかどうかが「分数のまま答えられるか」そのもの。 二値手法の線は階段になり、混合画素の帯で対角線から大きく離れる。
- L755 — ★「数字だけ合っている」を絵で見せる。3 枚目と 2 枚目に共通の画素がほぼ無い のに、白い画素の数だけが釣り合っている。
- L953 — (7) ★PPI は雑音で壊れる —— 純画素が 6 割以上あっても葉を拾わない。 一方で雑音ゼロなら同じ場面で当てる = 崖の原因は純画素の不足ではない。
- L993 — (11) ★この PoC が見つけて fullseye 0.1.10 で直した穴。 3 つの大津が同じ入力に違う答えを返していた —— 同じ画像を 4095 倍 しただけで判定が otsu 13.34 pp / cv_otsu 13.92 pp ずれ、sk_otsu だけが アフィン不変だった。原因は
ops._otsu と backends._u8 の np.clip(v, 0, 1)(0..255 の float が全画素飽和して「全部前景」になる)。 いまは 3 つとも倍率で動かない。残っている cv_otsu の 0.5 pp は OpenCV が内部で 8 bit に量子化するためで、これは docstring どおりの挙動。 門は tests/test_value_range_saturation.py。
- L1007 — (12) ★道具の穴:spec_unmix は B=3(色画像)を拒否する = RGB を解く経路が無い
- L1013 — (12b) ★被覆率の数字だけが合っていて画素が 1 つも当たっていない場面が実在する。 この 1 行が「1 つの数字に丸めない」のいちばん強い根拠。
examples/poc_veiling_glare.py
- L229 — ★fullseye 側の突き合わせ: エアリー像 → psf_to_mtf が閉形式と合うか
examples/poc_vessel_network.py
- L263 — ★揺らぎは ぼけたあと に足す。先に足すと PSF が均してしまい、 しきい値の境界はきれいなままになる(最初そう書いていて、 振幅 0.35 まで上げてもヒゲが 1 本も出なかった)。
- L452 — 節 2-3. ★★ヒゲはどこから来るか / 刈るしきい値は解像度に依存する # ————————————————————————— #
- L560 — 節 4. ★★径の推定 —— 分岐の近くで必ず過大 # ————————————————————————— #
- L620 — 節 5. ★★Murray の指数 —— 径の 1 割が指数の 1 になる # ————————————————————————— #
- L751 — 節 6. ★交差の対照群 / 解像度で失われる枝 # ————————————————————————— #
- L890 — (c) ★skeleton_prune3d は「短い枝を刈る」ではなく「全部の枝を短くする」
- L903 — (d) ★fs.skeleton_nodes は docstring が「座標」と言うのに端点しか返さない
examples/poc_video_physics_consistency.py
- L175 — ★ 縁に触れた bbox の辺は車の縁でなく画像の縁。そのまま使うと位置が 0.36 m ずれて黙って軌跡に入る(2026-10-23 の敵対的レビュー、 発射条件の端 3000 本中 2 本)。label_extent は切り詰めを知らないので、ここで止める。
examples/poc_warehouse_flow.py
- L145 — ★「人待ち」4 件 x (7.5 + 徐行 2.5) と「通路の干渉」8 件 x (2.5 + 徐行 2.5) は どちらもゼロ点に 40.0 秒を足す —— わざと揃えてある。現実に一致するとは 限らないが、「同じ数字が違う原因から出る」ことは 1 例で示せる。
- L160 — ゼロ点の「止まっている」しきい値 [m/s]。★雑音の作る見かけの速さ (σ√2/Δt = 0.085 m/s @ Δt=0.25 秒)より十分上に置かないと、止まっている人を 動いていると誤判定してゼロ点が減る(0.15 m/s だと Δt=0.25 秒でゼロ点が 半分になり、「細かく撮るほど滞留が減る」という嘘の結論が出た)。
- L239 — ★どちらか 1 台でも見えれば見えるので、死角に入るのは全カメラが遮られる 高さ = 各カメラの限界の最大。ここを min にしていて予測が 0.5 m 外れた。
- L329 — ★並ぶ人の到着時刻は実際に作業が始まる時刻から決める(見積りで 決めたら 20 秒ずれて、待ちの柱が作業の柱と重ならなかった)。
- L342 — ★出会う場所は棚の列の真横でなければならない。棚と棚の間でない交差通路は 両側が開けていて空き幅が 1.9 m あり、「狭い通路」に分類されない(最初の 実装は主通路の高さで出会わせてしまい、10 件中 4 件が「その他」に落ちた)。
- L435 — ★入れ替え(swap)ではなく併合にしてある —— 入れ替えは「同じ柱の中で 遅く始まったほうが待ち」という時間の入れ子を壊さない(役が入れ替わるだけ で、両方の役が正しく埋まる)。壊れるのは 2 人が 1 人に見えたとき。
- L594 — ★止まっている芯だけを残す。柱は 2 人ぶんの足跡で 1.8 m あるので、 通り抜ける人の中心も 2〜3 フレーム柱の中に入る(実測でそれが 「1 人しか居ない干渉」を作り、10 件中 8 件を落とした)。 中央値から :data:
CORE_R 以内に居続けた最長の連なりを芯とする。
- L846 — ★複数人の成分で数えると「通路を 10 人が通った列」が厚くなって混ざるので、 同じ 1 人の中で「待っている間」と「歩いている間」を比べる。
- L1257 — 印の大きさ。★同じ棚前で「補充待ち」と「欠品」が起きるので、大きい印から 描いて小さい印を上に重ねる。同じ大きさで描くと後から描いたほうが前のを 完全に隠し、図の上では 5 件が 2 件に見えた。
examples/poc_water_level.py
- L346 — 2. ★ゼロ点 vs ホモグラフィ # ————————————————————————— #
- L389 — 3. ★アンカーの位置で符号が変わる # ————————————————————————— #
- L422 — 4. ★波立ち —— ロバストが効くのは外れ値があるときだけ # ————————————————————————— #
- L459 — 5. ★★反射 —— 系統的に低く出る # ————————————————————————— #
- L622 — (d) キャリパーは在った(★「無い」と書きかけて 3 層引いて見つけた)
examples/poc_web_roll_periodicity.py
- L123 — ★第1ニップと第2ニップの周長差はわざと 15.7 mm しかない(6 節の崖のため)。
- L158 — 6 節(崖)だけ試行数を上げる。★24 試行では報告率が 12000 mm で 100 %、 14000 mm で 88 % という非単調が出て、「検出の崖」の位置が小標本の揺らぎで 動いた(120 試行では 12000 mm が 93 % に落ち着き、100 % を保つのは 17000 mm 以上)。 崖の位置を主張する節だけは、床が揺れない試行数で測る。
- L253 — ★op は頂点を丸めずに返す(±0.5 を超えたら「そこは極大でない」という 情報)。この PoC は櫛の高調波ビンも評価するので、ここで明示的に丸める。
- L802 — ★床は 0 ではない。24 試行では最長 2 点が偶然 0 % になり「0 % を保つ最短の L」 という判定が通ってしまったが、120 試行では最長 20000 mm でも 2 % 残る。 床を先に測ってから、床の何倍で崖と呼ぶかを決める(0 % は判定に使わない)。
- L1057 — ★120 試行にしたら 100 % ちょうどではなくなった(97 / 98 %)。 24 試行の「100 %」は分母が小さかっただけ。床を見て 95 % に置く。
examples/poc_weld_bead_profile.py
- L696 — ★2026-10-13:
op_find("laser") は 0 件でなくなった —— coherent 族 (laser_line_coherent / speckle_field / triangulation_speckle_limit)が引っかかる。 だがあれは光条を描く側と、スペックルが決める誤差の床を返す閉形式で、 画像から列ごとの中心を取る op ではない。穴は残っている(語でなく族で固定する)。
- L700 — ★2026-10-15: op_find に docstring 全文の段(最低点 12)が加わり、引数の説明に “laser” と書いただけの 無関係な op も並ぶようになった。ここで固定したいのは「名前か 1 行目で laser を名乗る op」なので、その段は除く。
- L705 — ★2026-09-23:
op_find("stripe") は 0 件でなくなった —— wave 族の wave_fringe_period(「縞模様の画像から周期を測り返す」)が docstring で 引っかかる。だがあれは画像全体の 1 本の支配的な周期を返す op で、 ここで要るのは列ごとの輝線の中心をサブピクセルで取る op。穴は残っている。 語で穴を固定すると、別の意味で同じ語を使う族が来た瞬間に偽陽性になる (この repo で 3 度目: fly_hex_lattice / halftone_moire_period / これ)。
examples/poc_weld_bead_scan_angle.py
- L485 — ★候補は「母材面の高さに戻った点」なので、溝の外の平らな母材も 全部候補になる。内側 CHECK_IN mm に溶接金属(母材面から CHECK_DEV 以上の落ち込み)が在ることを確かめて初めてつま先と認める —— この門が無いと候補が母材へ滑り落ちて脚長が 1.7 mm 外へ飛ぶ。
- L489 — ★門の深さはいちばん深い溝より深く取ること。最初 -0.6 mm に したら、深さ 0.45 mm(垂直では 0.74 mm)の溝が門を通ってしまい、 16 断面のうち 1 本で 2.2 mm 外れた。
- L572 — ★生き残った断面だけの真値の平均。集計から何が抜けたかを見る。
- L999 — ★凸みだけ予測から外れた。原因はつま先の這い(τ が絶対値のしきい値だから)。
- L1193 — ★溝が角度とともに消えていく様子(母材面からの落ち込みで見る)
examples/poc_what_a_picture_cannot_check.py
- L280 — ★偏りの正体を探し当ててから書く。平面の推定が 1.88 と 真値 2 より低いのは、最初に疑った「点数が足りない」ではなかった (400 → 3,000 点で 1.8825 → 1.8709 とむしろ下がる)。正体は べき乗則を見る半径の窓で、既定は対距離の 1〜25 パーセンタイル —— 単位正方形ではその上端が箱の端に当たり、相関和が飽和して傾きが審う。 窓を小さい r 側に寄せると 2.05 まで上がる。
- L402 — ★平行移動フレームの効き目: まっすぐな区間を含む曲線でも半径が崩れない
- L480 — ★K の一致は必要条件にすぎない
- L630 — ★図の書き出しが失敗したら、ここで拾う。見ないと「検査は全部 OK・でも図は 1 枚も出ていない」が黙って通る(examplefig は fail-soft で貯める)。
examples/poc_worm_neurites_grow.py
- L111 — ★dist_to_root には coords に無い節点も入っている(1 匹目で 196 本中 54 本)。 座標のある節点だけに絞らないと最大値が食い違う(最大 12 倍)。
examples/poc_zernike_aberrations.py
- L85 — n <= 6 の 28 モード。★(n+1)(n+2)/2 = 28 は閉形式で数えられる
- L402 — 絵を作る道具 —— ★色は飾りでなく量に結びつける # ————————————————————————— #
- L588 — ★本物の op と突き合わせる —— 同じ仕様の 2 度目の実装。
fit_zernike は torch(grid_sample)で補間するので、CI の py3.10 / py3.12 には入っていない(大きさと時間のため py3.11 だけ)。 だから発見そのものは numpy の写しで立て、op があるときだけ照合する。
- L707 — ★同じ絵を線形補間で読むとどうなるか(章ごとの接尾辞 lin_)
- L838 — ★1 次か 2 次かは「収差を半分にしたときの比」で分かる(章ごとの接尾辞)
- L865 — ★帯は必ず書く。球面収差のハローは明るいので、同じ帯でも段数が変わる (実測: 無収差の 3.5-8.0 λ/D は線形 1 段、球面収差 0.30 波なら 6 段)。
- L1041 — ★検査で使った点像は瞳 96・格子 1024(1 画素 0.19 λ/D)で、絵としては 粗い。同じ無収差をもう一度、細かい刻みで描き直す(数は検査のもの)。
- L1298 — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/polarization_camera_pipeline.py
- L110 — ★雑音つきで回復した行列は coherency の最小固有値が僅かに負に出る(雑音 1e-4 → -1e-4 程度)。tol は雑音の水準で置く。tol を勘で小さくすると「非物理」に化ける。
examples/profile_shape_inspection.py
- L25 — ★repo 直下のモジュール(profileops)を import するので、チェックアウトから そのまま走らせても通るように repo 直下を先頭に置く。他の例と同じ作法。 これが無いと
py -3.11 examples/<name>.py が ModuleNotFoundError で落ちる (2026-09-09 実測: 走らせる門が無かった 83 本のうち、落ちたのはこの型の 2 本だけ)。
examples/representation_roundtrip.py
- L175 — (c) ガウシアン -> voxel の質量。★一度間違えた数字
examples/shape2d_morph_descriptor_tour.py
- L64 — ★EXTEND: 自分の輪郭抽出結果(
{"shape": (H,W), "cs": [ (N,2) (row,col), ... ]})に差し替える
examples/shapestat_landmark_tour.py
- L71 — ★EXTEND: 自分のランドマーク (N,3) を s に入れる(点の並びが対応していること)
- L123 — ★EXTEND: 自分の群 (K,N,3) を scrambled に入れる(位置・向き・大きさがばらばらでよい)
- L221 — ★EXTEND: 自分のランドマークを「左を全部、次に右を同じ順で」並べて lm に入れる
- L276 — ★EXTEND: surf を自分の面の点(メッシュ頂点・点群)、normals をその向き付き法線にする
- L299 — ★EXTEND: 自分の群 (K,N,3) に差し替える(点の並びが個体間で対応していること)
examples/voxel_labels_color.py
- L81 — 1) ★色の安定性 —— この族の存在理由 # —————————————————————— #
- L152 — 4) ★異方 spacing # —————————————————————— #
examples_3d/alpha_shape_topology.py
- L149 — ★判別的アサート: alpha shape は穴を保つ=軸プローブをほぼ内包しない。 null 手法(凸包)は内包率 ≈1 でこの条件に FAIL する(=判別的)。
examples_3d/ct_hand_radiograph.py
- L34 — 実際に呼んで確かめる。★2026-09-05 まで、この例は「azimuth=elevation=0 なら np.sum(axis=0) と一致」と書きながら一度も確かめていなかった。しかも op → example の索引が hasattr の文字列を呼び出しと誤認していたため、 「例が 1 つも無い op」が 100% カバレッジの中に隠れていた。
examples_3d/geodesic_dome.py
- L6 — ★この例の要点は絵ではなくオイラーの公式: V − E + F = 2 から、次数 5 の 頂点はどれだけ細分してもちょうど 12 個になる。11 個でも 13 個でも球には ならない。ここでは次数を 別実装の op(conngraph.graph_degree_table)に 数えさせて確かめる —— 自分で数え直して自分と一致しても、何も確かめたことに ならないため。 repo をそのまま clone した状態でも動くように、リポジトリ直下を import パスへ入れる。
- L48 — ★オイラーの公式の帰結。細分しても 12 から動かない。
examples_3d/geometry_metrology.py
- L186 — ★無限直線版との差を数字で出す(同じ 2 線分)
examples_3d/hull_bounds.py
- L237 — — パネル C: ★新規 min_enclosing_sphere(密着)vs 素朴球(過大)—
- L272 — ★(1) 新規 op — min_enclosing_sphere: 既知球で半径復元 + 全点内包 + ほぼ最小 ============================================================
- L296 — ★(2) 新規 op の beat-null — 非対称点群で素朴球より小さく・ほぼ最小・安全側 ============================================================
examples_3d/mesh_props.py
- L404 — ★巻き順を裏返すと体積の符号が反転する = 符号は向きの検査そのもの
examples_3d/metrics_eval.py
- L234 — ★最近傍距離が嘘をつくのは「変化ゼロで測り返しただけ」のとき。同じ斜面を別の 密度・別の位置で取り直すと、最近傍は面に沿って隣の点を掴むので点間隔ぶんの 偽の変化が出る。M3C2 は法線方向に射影するので、その成分は落ちる。 (この PoC を書く前の予想「C2C は法線シフトでも過大に出る」は外れた —— 平行な面を法線方向に動かすだけなら最近傍距離もほぼ真値。嘘が出るのは 面に沿った取り直しのほうだった。)
examples_3d/minimal_surfaces.py
- L6 — ★この例の要点は絵ではなく定義そのもの: 極小曲面とは「平均曲率 H が至るところ 0」の曲面である。既存の
vertex_curvature がまさにその H を測るので、 「これは極小曲面だ」という主張を、作り方を知らない op が採点する。 対照群として単位球(H = 1)と半径 1 の円柱(H = 0.5)を同じ手続きにかけ、 門が素通しでないことを示す。
- L12 — ★カテノイドとヘリコイドは等長なのでガウス曲率 K が一致するが、それは 必要条件にすぎない —— K が一致しても極小とは限らないので、門は H に置く。 repo をそのまま clone した状態でも動くように、リポジトリ直下を import パスへ入れる。
- L130 — ★平行移動フレームの効き目: まっすぐな区間を含む曲線でも半径が崩れない
examples_3d/sdf_csg.py
- L167 — ★罠:
res はスカラでも軸ごとのボクセル数なので、bounds が非等方だと ボクセルは立方体にならない(ここは x,y が 0.125、z が 0.0625)。体積を h**3 で出すとちょうど 2 倍ずれる —— 実際この例で 295.00 と出て 閉形式 148.03 に対し 99 % の誤差になり、下の assert が鳴いた。
examples_3d/space_carving.py
- L117 — ★
carve_look_at を使う(2026-09-08)。look_at と同じ実装だが、 公開層から引ける名前はこちら —— fs.look_at は render3d の gluLookAt 版(4x4・−Z 前方)という別物で、その M[:3,:3], M[:3,3] を渡すと全点がカメラ後方に落ち、例外を出さずに空の hull が返る。
examples_3d/structured_light_scan.py
- L122 — ★ 座標系の落とし穴:
look_at は gluLookAt 規約(カメラは -Z を向き +Y が上)で 姿勢を作るが、render_mesh はその Vc を (x, -y, -z) に直してから K を掛ける (= depth_to_points / K と同じ CV 規約、depth は +Z 前方)。三角測量は CV 規約の 側で閉じているので、姿勢も FLIP を掛けてから合成する。ここを飛ばすと投影機が カメラの背後を向き、深度は「もっともらしい大きさ」のまま全部間違う (最初の実行がまさにそれで、RMSE 78 mm = 零点と見分けがつかなかった)。
eyebrain.py
- L242 — ★fly_hex_resample と同じ向き: 画面の x = 方位角 az(右が正)、y = 仰角 el(上が正)。uv から組むと 像と眼の絵の左右が食い違う(2026-09-20 に実測: 縞を右へ動かすと柱の u が減った)。
fast.py
- L254 — ★uint8 の gaussian は 置かない。
cv2.GaussianBlur の 8U 経路は 8 bit 固定小数 のカーネルを使うので、float64 の core との差が 1.174/255(実測、この module の ゲート画像 6 枚 × PARITY_AB 5 点の最大)になり「1/255 まで一致」を満たさない。 box は 0.494/255、median / モルフォロジは 0.000/255 なのでそちらだけ載せる。 uint8 の高速 gaussian が要るなら「2/255 まで」という別の契約で明示的に足すこと。
- L294 — ★ここに載っているのは全て :func:
parity のゲートを通ったものだけ。 追加するときは「実装 → ゲートを回す → 通ったら載せる」の順を必ず守る。
- L320 — ★
edges_image(HALCON 名としては canny と同じ)は載せない。registry の その名前は backends_auto の skimage canny(本物の hysteresis つき)で、 core の canny とは別のアルゴリズム。不一致率 1.0(実測)。 ── HALCON 名の twin(registry に同一実装で別名登録されている op)────────── accel._TWIN_ALIASES と同じ発想。ゲートは registry のその名前の実装に 対して回すので、実装がずれていれば落ちて載らない。
- L372 — ★「観測した出力が {0,1} だったか」で判定してはいけない —— 連続 op でも定数画像 では出力が全 0 になり、二値と誤判定して基準が勝手に厳しくなる(実装中に踏んだ)。 判定は registry の 宣言された out_sort で行う。
- L403 — ★twin はどれも歴史的な規約(reflect / 正方形)しか実装していないので、
b が新しい選択肢を選んでいる間は core にそのまま落ちる。 速くはならないが、答えは 1 ビットも変わらない —— median の k>5 と同じ扱い。 ここを黙って無視すると「速いが違う」ができる(実測: parity が 11 件割れた)。
feat_fpfh.py
- L304 — ★2026-09-07: 姿勢の計算は numpy(FPFH も RANSAC も Kabsch も numpy)で、torch は 返り値を包むためだけに使われていた。そのせいで torch を入れない CI(py3.10 / 3.12)ではこの op が丸ごと ImportError になり、PoC が落ちていた。torch があれば これまでどおり Tensor を返し、無ければ同じ値の numpy を返す(値は不変)。
feat_shot.py
- L80 — ★2026-10-11: 平面上の点の λ3 は丸め屑(λ3/λ1 ~ 1e-17)。軸に沿った平面では 厳密に 0 で落ちるが、傾けた平面では屑が正になり「特徴の無い平面」から キーポイントが 203 個出ていた(回転不変の主張が崩れる)。床は λ1 に対する相対量で。
flyvision.py
- L217 — ★ The cap is on the product, not on either factor, because the accident it prevents is the cross term: a modest 900-ommatidium eye and a modest 512x512 image are each unremarkable and together are 236M float64 = 1.9 GB.
fourierdesc.py
- L296 — ★この族の既存 op(elliptic_fourier)は Kuhl-Giardina の実係数(a,b,c,d) # で、楕円 1 つ 1 つを表す。こちらは同じ輪郭を複素係数 c_k で見る —— # z(t) = Σ c_k exp(2πikt) と書けるので、各項が「回る腕」そのものになり、 # パーセバルで打ち切り誤差を描く前に予言できる。用途が違うので両方置く。 # ————————————————————————— #
- L396 — ★偶数点では添字 n/2 が k = +n/2 と k = -n/2 の同じ 1 つの係数である。 両方を並べるとエネルギーを 1 本ぶん多く数えてパーセバルが破れる (実測: n=8 で 1.17e-01、n=512 で 7.5e-03 ずれた)。numpy の
fft.fftfreq に合わせて k = -n/2 の側だけを出す。 最初の検査(正方形の輪郭)はこの係数がたまたま 0 に近くて通っていた —— 探針 1 枚では足りない、の実例。
fscript.py
- L1220 — ★しきい値は argmax ビンの「上端」(2026-09-26)。(k + 0.5)/256 は そのビンの中点で、argmax が指すのは背景の山を含むビンなので、同じ ビンに居る背景画素が前景へ漏れていた(背景 0.30 / 明部 0.90 の板で 4,096 px 全部が前景、期待 400)。
ops._otsu / accel._otsu / detect._otsu_mask と同じ式を 4 か所に別々に書いてあり、4 つとも 同じ誤りを持っていた —— docs/hardening/otsu-threshold-at-the-bin-midpoint.md。
- L1284 — ★2026-09-14: ここは
FsTypeError だけを捕まえていた。逆さの区間と未知の feature を契約どおり FsValueError(= FS_E_INVALID_ARG)にした結果、 fscript の利用者には Python の生の例外が漏れるようになっていた —— 例外の種類を増やしたら、それを言語境界で受けている場所を必ず一掃する ([[feedback_same_bug_class_recurs_check_siblings]])。
fslib.py
- L559 — ★2026-09-14: ここは長らく borderType 既定 =
BORDER_REFLECT_101 (d c b | a b c d — 境界の画素を重複させない折り返し)だった。numpy backend の ndi.gaussian_filter の既定は mode='reflect' = d c b a | a b c d (境界の上で折り返す)で、同じ「reflect」という語が別物を指す。 実測(512x512, sigma=1.0, 乱数): 内部は 4.6e-08 まで一致するのに、端の画素だけ 最大 0.13 = 値域の 13% ずれていた。内部しか見ない検査では原理的に出ない。 connection の 4/8 連結と同じクラスの欠陥(兄弟コードを一掃した 2 件目)。 契約は numpy 側(既存の進化レシピのオラクル)に合わせて BORDER_REFLECT。
- L615 — ★2026-09-14: ここは長らく
ndi.label(mask) = 4 連結の既定だった。 cv2 backend は connectedComponentsWithStats(..., 8, ...) で 8 連結なので、 同じ op が backend によって違う物体数を返していた —— 8x8 の市松模様で numpy 32 個 / cv2 1 個。レシピの答えが「どちらの backend が選ばれたか」で 変わるという、いちばん静かな壊れ方。C ABI を Rust で 2 度目に実装して 突き合わせたときに見つかった(fullseye_abi.h の fs_connection に 8 連結と明記した)。回帰は tests/test_fslib.py が backend 横断で見る。
- L632 — ★2026-09-14: ここは
(mask, 8, cv2.CV_32S) と位置引数で書いてあった。 読むと「8 連結を明示している」ように見えるが、cv2 5.0.0 で実測すると connectedComponentsWithStats(a, 4, CV_32S) も (a, 8, CV_32S) も同じ答え を返す —— 位置引数は connectivity として解釈されておらず、既定の 8 に たまたま一致していただけ。既定が変われば黙って 4 連結になる。 コードが主張している意図を API が守っていない形なので、キーワードで固定する。 (差分ファジングの変異解析で 4 連結を注入したのに一切検出されず、掘ったら 注入のほうが効いていなかった、という経路で見つかった。)
- L725 — ★契約 R-1(fullseye_abi.h): 失敗した演算子は「何も見つからなかった」演算子と 区別できなければならない。逆さの区間は呼び手の間違いであって、「空を寄こせ」 という正当な指定ではない —— 黙って空の Region を返すと、しきい値の計算を 間違えたレシピが「不良ゼロ」として通る。2026-09-14、同じ契約の Rust 実装が FS_E_INVALID_ARG を返すのにこちらは空を返す、という差分で見つかった。
- L780 — ★契約 R-1:
threshold で直したのと同じ欠陥が兄弟に残っていた。逆さの区間は 呼び手の間違いであって「空を寄こせ」という指定ではない —— 黙って 0 個を返すと、 面積の下限と上限を取り違えたレシピが「該当なし = 良品」として通る。 2026-09-14、Rust 実装が FS_E_INVALID_ARG を返すのにこちらは 0 個を返す差分で発見。
fsruntime.py
- L284 — ★判定レシピは、あらゆるプロファイル(産業用に限らない)で、厳選された fslib 由来の builtin のみを使える。それ以外の呼び出しは
fscript._call_registry_op → api.RT を通して解決される 650 op の進化レジストリ op であり、その _safe wrapper は fail-OPEN(op の失敗を握り潰して無害な「欠陥なし」の値を返す)。この面はレシピの演算子であってはならない —— studio / リファレンスのランタイムも部品を判定するため —— ので、それを使うレシピはロード時に拒否する(docs/FSCRIPT_DECISION.md 1.6b)。
fullseye/__init__.py
- L468 — ★2026-10-02: 「名前の無い非公開関数」の棚卸しで、op として振る舞うのに公開経路が 1 本も無かった 18 本。 どれも既存の型つき台帳の約束(台帳 = 実装モジュールの集合)に合わないので、facade(fs.<名前>)から出す。 門は tests/test_hidden_ops_exposed_2026_10_02.py(定理か第 2 実装)。名前>
- L511 — ★1-D 版は signal_ 接頭辞で出す。素の名前で出すと
fs.local_std(1-D)と fs.ledger.local_std(2-D)が別物を指す —— 既に lowpass がその状態になっており(facade=dsp / ledger=2-D)、 同じ罠を増やさない。次元をまたぐ同名は、呼ぶ側で見分けがつく形にする。
- L741 — ★ 宣言 out 型に合わせる adapter は、タプルを返す op の2 番目以降を 捨てる(
drizzle_resample の wht、piv_cross_correlate の info)。捨てられた側が必要なとき、台帳の入口からは届かなかった。 2026-09-06、超解像の PoC が flow, info = fs.ledger.piv_cross_correlate(...) と書いて (2,R,C) を第 1 軸で開き、dy の 2 行目を dx として使い、 ずれ推定を 0.12 → 0.74 画素にした(例外は出ない)。 .raw で素の返りに届く: fs.ledger.piv_cross_correlate.raw(a, b)。
- L1234 — ★字の検証・修正(glyph_*)。dir() でなく __all__ が一次情報なので ここに載せる —— dir は環境依存で、載せ忘れは全体スイートでしか出ない。
- L1321 — ★2026-09-20(GenSpark 第 50 報 N175 / N176):
import fullseye; fullseye.os が通っていた —— import に使った 道具(os / sys / warnings と future の annotations)は facade の名前ではない。tab 補完と dir() を汚さない。
fullseye/mcp/catalog.py
- L70 — ★
dim は docs/ops の族ディレクトリ名(2d / 3d / oned のほか optics / annotate … 31 種)で、厳密な次元ではない —— volume を取る registry op は 2d/3d/ の下にあり dim: 2d。 次元は in / out の sort から読む(2026-09-20、GenSpark 第 31 報 N109。族と次元の分離は 0.2.2)。
- L96 — ★2026-10-02: 区切り文字を “/” にそろえてから並べる。素の sorted() は Windows の “\“(0x5C)と Linux の “/”(0x2F)で順序が変わり、
segmentation/watershed/ と segmentation/watershed3d/ の 前後が入れ替わって OP_NOTES.json の鍵の順が OS ごとに違った(手元の regen は緑、CI の –check が赤)。
- L103 — ★frontmatter は閉じ線まで読む(2026-10-02): 先頭 1200 文字で切っていたら、examples: の行が 44 本に伸びた text_box の閉じ線が範囲の外に出て「op の無いノート」に見え、索引の op がノートから引けなくなった。
- L125 — ★5 層。最初は 4 層で組み、「索引にもレジストリにも facade にも無いノート」が 480 枚残った。残骸かと思ったら 480 / 480 が
fullseye.ledger で解決した (型付き台帳。レジストリでは tb_project、台帳では project のように接頭辞が 違う)。「無い」と言う前に全層を引く —— 4 層目まで引いて止めていたら、実在する 480 個の機能を残骸と呼んでいた。
- L311 — ★2026-09-20(GenSpark 第 41 報 N141): 「callable なら op」でクラス 41 個(Image / Pipeline / MissingBackendError / TcpChannel …)が facade 層に op として混ざり、
fullseye_search_ops の検索面を汚していた。クラスとモジュールは型・器であって op ではない。関数(生 / builtin / functools.partial)だけを op として数える。同じ報の「facade 表に無い 474 件」は halcon_facade_map.json(HALCON 対応表、鍵は camera.xxx の名前空間つき)との比較で、 残る 460 件は import fullseye で呼べる実関数 —— 表の目的が違うので設計のまま。
- L361 — ★同点の割り方は
api.find_op と同じにする: 別名を複数 op が共有するとき name == halcon の正典を先に。次に層が多い(実行もノートもある)方。 実測 2026-09-15: “gauss” で gauss_filter(正典)と gaussian が同点になり、 名前順だと _ < i で前者が先に来た —— 偶然そうなっていたのを規則にした。
fullseye/mcp/diagnose.py
- L87 — ★順序が答えを変える(2026-09-15 実測):
ones + inf は有限部の std が 0 なので 「定数」が先に当たり、0..715 の配列は 99.9 % が ≥ 1 なので「飽和」が先に当たった。 より根本的な異常を先に言う: 非有限 → 定数 → 範囲外 → 飽和 → 平坦。
- L109 — ★飽和・平坦は image / color だけ。region は 0/1 が契約なので「飽和」ではない —— リファクタで region を含めてしまい、
--demo で otsu の出力が「飽和」と判定されて 小図が昇格した(2026-09-15 実測)。region の定数(空 / 全面)は上で拾う。
fullseye/mcp/handles.py
- L51 — ★thumb_dir を渡されたときに作っていなかった(mkdtemp のときだけ存在する)。 小図の保存が FileNotFoundError で落ち、テスト 4 件で発覚(2026-09-15)。
- L156 — ★2026-10-11: 根の中の壊れた png・object 配列の npy は ValueError 等を HandleError に 写さず投げ、dispatch を抜けてサーバのループが死んでいた。読めない中身は理由つきで断る (-32602)。npy は pickle を決して許さない。
fullseye/mcp/server.py
- L508 — ★2026-10-11: Content-Length が無い / 0 のフレームで None(= EOF)を返し、サーバが 黙って終了していた。EOF は「ヘッダを 1 行も読めない」ときだけで、壊れたフレームは FramingError(→ -32700)にしてループを続ける。
- L1357 — ★bbox が無いときは glyphops.make_spec に任せる。版面が取れなければ items に bbox が 入らない = 黙って外れた箱で直すことは起きない。ここでは理由を付けて断る。
- L1630 — ★2026-10-11: find_ops は「既知の種別以外は拒否する」と書きながら typo を受け、 0 件を返していた。search_ops と同じ門を通す。
- L1777 — ★2026-10-11: params が配列 / 文字列、name が配列 / dict のとき、.get や辞書引きの AttributeError / TypeError が run_stdio_server のループまで抜け、サーバが死んでいた (後続の正しい要求にも返事が無い)。型は境界で検査して -32602、残りは最後の網で -32603。
- L1824 — ★2026-09-20(GenSpark 第 38 報 N135): 「2390 names」が op 数と読まれた —— 数えているのは op 名 + HALCON 別名。
fullseye/xlsxio.py
- L46 — ★ float64 に直してから [0,1] に clip すると uint8 の 0..255 が 0/1 の 2 値に潰れた
- L51 — ★ 切り捨ての int() だと 1000 px が step 3 で 334 px になり longest を守らない
- L68 — dict の表は key / value の 2 列(mdio と同じ)。★ list(dict) はキー文字列の 列になり、1 文字ずつのセルに綴られていた
fullseye_comm.py
- L393 — ★CRC は公表された検査値で裏を取る。CRC-16/MODBUS の諸元は
width=16 poly=0x8005 init=0xffff refin=true refout=true xorout=0x0000 check=0x4b37(CRC catalogue)—— check は ASCII "123456789" の CRC である。 自分で作った入力の往復だけで試すと、反射入力と反射出力を同時に取り違えた実装が 緑になる(自分で包んで自分で開けるので、向きの誤りが打ち消し合う)。 外の値と突き合わせて初めて、線の向こうの装置と話が通じることが言える。
- L641 — ★表は 1 つに畳む —— 同じ PDU 処理を RTU の装置役 (:class:
ModbusRtuLoopback)でも使う。2 つ書くと、FC を足した ときに片方だけ増える。
- L751 — ★
modbus-rtu は 2026-09-25 まで「名簿に載るだけ」の行で、開こうとすると 「pymodbus を入れて直接使え」と断っていた。だが RTU は Modbus TCP と同じ PDU を別の框で包んだものにすぎず、その PDU の組み立てと解釈は既にここに在って 単体試験も付いていた。足りなかったのは框(アドレス + CRC)と線の口だけで、 断り続ける理由は無かった —— 名簿は「持っていないもの」だけでなく、 「持っているのに繋いでいないもの」も隠す。
- L764 — ★断り文句が「install ‘None’」と言っていた。
cclink は pure-python の master が存在しないので pip 名も import 名も持たない —— そこを場合分けせずに 書式へ流し込んだ結果、open_channel("cclink") は 「install ‘None’ and use the None client directly」と答えていた。 入っていないものを名指しする口は、名指しできない相手で必ず崩れる。 2026-09-25、device.open_driver を足すときに同じ分岐を書いて気づいた(隣の 層を直したら、元の層を読み返すこと)。
- L771 — ★もう 1 つ: 相手が入っているときに「install しろ」と言っていた。入って いるのに入れろと言う案内は、読んだ人をそこで止める。
- L817 — ★同梱の顔ぶれをここで凍らせる(名簿を全部登録し終えた後)。これより前に 呼ぶと空を覚えてしまい、
unregister が同梱の protocol を消せてしまう。
g1_policy_bridge.py
- L33 — ★配布物にローカル絶対パスを焼き込まない(2026-09-05 の監査で、非公開の兄弟 プロジェクト名が PyPI の wheel に載っていた)。既定は環境変数で与える。 Unitree G1 のシーン XML。MuJoCo Menagerie の
unitree_g1/scene.xml を指す。
- L61 — ★セキュリティ境界。
pickle は load 中に任意の callable を呼べるので、 find_class を素通しにすると チェックポイントを開いただけでコードが走る。 RL のチェックポイントは他人から貰う前提の成果物なので、これは現実的な脅威。 (2026-09-05 実測: 素通し版は os.system / subprocess.Popen / builtins.eval をそのまま返し、load() 中に実際にファイルを作れた。) ここに載っているのは、brax PPO のチェックポイントが実際に参照する数値系だけ。 足りないものが出たらこのリストに足す(例外メッセージがモジュール名を出す)。
gicp.py
- L178 — ★2026-10-07 レビュー修正: 小角線形化 R ← (I+[ω]×)R は原点まわりの回転なので、原点から 遠い点群(オフセット 1e3 で回転誤差 20°)では回転と並進がほぼ縮退して誤った姿勢に落ちた。 target の外接箱の中心 c へ両点群を寄せて解き、t = t’ + c − R·c で世界へ戻す (外接箱の中心は点の順に依らない = reproducible=True のビット一致を保つ)。
glassmirror.py
- L44 — ★2026-10-15 から既定ではない(
source="table" で選んだときだけ使う)。実測の表との色差は 法線入射で Cu ΔE*ab 8.3 / Au 6.6 / Ag 2.7 / Cr 0.6 / Al 0.2 —— 銀は青が 0.91 に落ちて黄ばんで いた(実測では 0.98 でほぼ中性)。以前の図を同じ値で再現したいときのために残す。 それでも「銀はほぼ中性で最も明るい / 金と銅は 500 nm 付近で立ち上がる赤黄色 / アルミはやや暗いが平坦」という色の順序は正しく出る(テストで固定)。
- L324 — 多重反射の和は偏光ごとに取ってから平均する。★ 以前は Rs と Rp を先に平均して 1 本の R で和を取っていたので、斜め入射で透過率を過小評価した(air→1.5、 60° で 0.836 対 正しい 0.848)。垂直入射では Rs = Rp なので値は変わらない。
glyphops.py
- L44 — ★2026-09-18: ここまで all に無かった(api 側は名前で import していたので 気づけなかった)。一次情報は all なので、公開するものは全部書く。
- L308 — ★リングの内径は字のにじみの外に置く。にじみ(アンチエイリアスやぼけ)の 中を背景として数えると、地色と文字色の中間が混ざって多峰に見える —— 実測で、ぼけ σ=1.2 の合成看板が背景の集中度 0.52〜0.60 になり、 平坦な単色の地なのに「置換できない」と断った。内径は呼び出し側が
edge_transition_width から決められる。
- L324 — ★「同じ量子化ビンに入った割合」で集中度を測ってはいけない —— 実写では 最頻色がビンの境目にまたがって割合が半分になり、平坦な看板の地色まで 多峰と判定した(実測で前景の占有率 0.31〜0.64、閾値 0.5 では全滅)。 最頻色からの距離が許容幅に入る割合で測る。同じ実写で 0.87〜1.00、 合成した赤い縁取りでは 0.63 と、はっきり分かれる。
- L342 — ★縁取りは最頻色の占有率では捕まらない —— 縁が太ければ字のすぐ外は「縁の色一色」で 立派に単峰になる(実測で赤い縁取りを単峰と 判定した)。近いリングと遠いリングの色が 違うかで見る。違えば背景は 1 色では書けない。
- L456 — ★消す範囲もにじみの幅から決める。2 値マスクは字の芯しか覆わないので、 固定の 1 画素だけ広げて塗ると、旧字の灰色の縁が幽霊として残る (実測: 置換した字の周りに旧字の輪郭がうっすら見えた)。
- L462 — ★平均色で塗るだけでは継ぎ目が見える。地にはノイズと量子化のざらつきが あり、塗った面だけが滑らかだと矩形が浮く(実測: 置換した字の周りに はっきりした四角が出た)。地のばらつきも測って合わせる。
- L475 — ★触る必要のある画素だけに限る。塗った面の外は入力のまま残す —— でないと、消去した矩形の縁が地のざらつきと食い違って四角い継ぎ目が 見える(実測: 置換した字の周りにはっきりした枠が出た)。 境目は少しぼかして、切り替わりを見えなくする。
- L501 — ★極性は多数決で決めてはいけない。行に密着した帯では字が 57 % を占める ことがあり(実測 2026-09-17、合成の掲示の 1 行目)、「インクは少数派」と すると白黒が丸ごと反転して距離が 0.025 -> 0.121 に跳ねた。 外周は背景という事実で決める —— 字は縁まで届かない。
- L836 — ★大きさは行で 1 つに揃える。マスごとに元の字のインク幅へ合わせると、壊れた字の 広い/狭いをそのまま引き継いで字の大きさがばらつく(2026-09-18、縦書きの試作で ユーザー指摘)。CJK は正方なので、一辺 = min(行のインク高さ, マス幅の中央値)。
- L1031 — ★マスを少し広げて切り出し、その中で「このマスに属する成分」だけを マスクにする。マスちょうどで切ると、外周リングが隣の字のインクを 拾って「色が多峰」と誤判定し、直せるものまで断ってしまう (実測 2026-09-17: 壊れた 4 字のうち 3 字がこれで断られた)。 また隣の字のはみ出しが消し残り、置換後に旧字の切れ端が浮く。
- L1036 — ★上下左右に余白を付けて切り出し、その中で「このマスに属する成分」だけを マスクにする。bbox ちょうどで切ると、背景色を測る外周リングが 隣の字のインクと字の縁を拾い、「色が多峰」と誤判定して 直せるものまで断る(実測 2026-09-17: 壊れた 4 字のうち 3 字が これで断られ、背景色の占有率が 0.49〜0.57 に落ちていた)。 余白は画像そのものから取る —— 行の bbox は字に密着しているので、 bbox の中だけでは純粋な背景が手に入らない。
- L1101 — ★色が多峰(縁取り・影)で断ったマスがあると、インクのマスクに縁まで入って距離が 膨らむ(実測: 5 px の縁取りで無事な 4 字が全部「床の 2.5 倍」に出て unrelated に 化けた)。測れていない距離で誤字/別物を言わない。
- L1148 — ★2026-09-18: ここを「大津 + 外周で極性」に替えて退行した(既存 12 枚で 見逃し 0 -> 6、誤検出 4/14 -> 9/22)。出荷済み
_ink_mask と同じ規則でも、 1 マスに当てるのと画像全体に当てるのでは別物 —— 全体の大津は壁や板の 明暗で閾値が動き、字の縁を取り込む。固定の暗さ閾値に戻す。白字の看板は この経路では取れない(既知の穴として記録)。
- L1164 — ★枠 = 中身が薄く、大きく、他の成分(字)の外接箱よりずっと大きい成分。3 つ目の 条件は 2026-09-18 に足した: 無いと、小さな画像(280x432)で 96 px の「中」(外接箱 9216 px > 画像の 2 %、中身 0.3)が枠と見なされ、行が丸ごと消えた。PoC を育てた 1,000 px 級の画像では字が 2 % を超えないので見えなかった尺度依存。「画像の半分以上に 渡る」で切ると生成ポスター 10 枚で誤検出 5/8 → 7/8 に退行した(半分に届かない枠の 切れ端が残る)ので、字の大きさ(成分の外接箱の中央値)を物差しにする。
- L1180 — 行は水平投影の帯で取る。★成分をまとめる方法は使えない —— 漢字は部品に 分かれて出る(
電 は 3 つ)ので、重なりや中心距離で束ねると行間の狭い 看板で 2 行が 1 行に融け、逆に離れた部品が 3 行目になった(実測 6/12 枚)。
graphinv.py
- L793 — ★2026-10-07: kmax = 0 の個体(辺 0 本など)は「0-core = 全員」を最内殻にして全ノードを数えていた (三角形 2 個体 + 空 1 個体で appearances [3,3,3,1,1])。殻が無い個体は誰も含まない。
halcon_coverage.py
- L93 — ★2026-10-06: 正本は同梱の fullseye/data/(c5268029e で移した)。旧来の data/ だけを見ていたため、 facade の 600 本が黙って数えから落ち、HALCON 対応が 982 → 388 と出ていた(例外も警告も無し)。
honest_summary.py
- L34 — ★wheel には data/halcon_operators.json を同梱しない(MVTec のリファレンスの説明文を含むため。 名前だけは halcon_names_data として出荷している)。
fullseye coverage が FileNotFoundError で落ちていた (GenSpark 第 6 報 N5)ので、無いなら何が要るかと数字の在処を言って終える。
- L68 — ★機能ゲートに落ちた auto op を看板の数字から除外する —— 以前は [warn] 表示されるだけで数には入っており、ゲートが拒否する op で「機能ゲート済み」の parity 数を水増ししていた。
- L87 — ★2026-09-08: この行はこう書いてあった —— “= %d evolvable registry ops + %d n-ary capability ops (disjoint).” 実測すると 979 + 17 = 979、つまり n-ary の 17 本は
reg_counted の部分集合(nary_names - reg_counted は空)。 見出しの 979 は正しいのに、内訳の行だけが「足し算」に見え、読者が足すと 996 になる。数字が合っていても説明が嘘をつく形なので直した。 内訳が和として成り立つかは tests/test_honest_summary_arithmetic.py が毎回見る。
illusion.py
- L290 — ★周りの円は互いに重ならないように置く。n 個を半径 rs の環に並べるとき、 隣どうしの中心間距離は 2rssin(pi/n) なので rs > rr / sin(pi/n) が要る。 最初これを守らずに (rs=62, rr=46, n=6) と置いたら、周りの円が融合して 花のような 1 つの塊になった —— エビングハウス錯視になっていない。
imgevolve.py
- L48 — ★module / requires(2026-09-19): 「unknown operator」が backend 不足を隠していた (外部レビュー #1)。索引が出自と optional 依存を持てば、core 環境の
api._resolve が同梱の複製(fullseye/data/OP_INDEX.json)から不足 extra を 案内できる。requires は AST で静的に読むので、生成環境に依らず同じ値。
- L57 — ★握り潰さない(2026-09-06 の敵対的レビュー)。
imgops_nary は numpy と scipy しか要らない一次モジュールなので、import に失敗するのは「壊れた checkout」であって「その環境には無い機能」ではない。以前は except Exception: pass で、この関数が生成器と検査の両方を兼ねている ため、17 op が丸ごと消えた索引を CI が緑のまま公開できた。
- L81 — ★2026-10-24: IMREAD_COLOR / IMREAD_GRAYSCALE alone demote a 16-bit file to 8 bits (cv2 drops the low byte) and the result was then divided by 255. IMREAD_ANYDEPTH keeps the samples; scaling follows the decoded dtype.
- L158 — ★2026-09-20(GenSpark 第 37 報 N131): 台帳 op(
color_lut)と汎用アルゴリズム(quicksort)は索引に 載っているのに has が「unknown」と答えていた —— 発見面(索引)と判定面(registry + nary)が別だった。 索引(同梱複製)の台帳行と algo 層をここで引く。
- L356 — ★os.path.basename は実行 OS の区切りしか知らない —— Linux では
C:\\...\\fullseye.exe が丸ごと 1 要素になり 「fullseye で始まらない」と判定された(手元 Windows 緑・CI Linux 赤)。両方の区切りで最後の要素を取る。
- L363 — ★parity.main() は自分で sys.argv を読む —— サブコマンド名 “parity” が残っていると 「unrecognized arguments: parity」で落ちていた(GenSpark 第 6 報 N6)。accel / bench と同じく argv を差し替える。
- L401 — ★2026-10-18(外部レビュー 0.6.0 N228 の再現で見つけた): color 層は OpenCV が要る(extra
opencv)。 素の pip install fullseye では空が正しいのに、ここが無条件に assert していたので fullseye index が AssertionError で落ちていた。黙って空になるのを止めたいのは OpenCV が在るときだけ。
- L463 — ★2026-10-18(外部レビュー 0.6.0 N228): checkout の判定が「HERE に docs/ が在るか」だけだった。wheel の HERE は site-packages そのものなので、別のパッケージが site-packages/docs/ を置いていると、そこへ OP_INDEX.json を書きに行く(読み取り専用の環境では落ちる)。checkout にしか無い正本の組で判定する。
- L546 — ★2026-09-20(GenSpark 第 53 報 N187、再現): –seq 無しは空列を「ソートして」[] を印字し rc 0 だった。
- L655 — ★help の実行例(2026-09-19、GenSpark 第 6 報 N9 / K2): 配布物では console_script
fullseye が入口で、 py -3.11 imgevolve.py は checkout 専用の綴り。呼ばれ方に合わせて例文を書き換える。
- L665 — ★2026-10-18(外部レビュー 0.6.0 N217):
fullseye algo list に倣って fullseye ops list と打つと rc=2(unrecognized arguments)だった。list は既定の動作と同じなので、語として受けて同じものを出す。
imgforensics.py
- L192 — ★ complex は ComplexWarning だけで虚部を捨て、実部のハッシュを返していた。 文字列・object も同じく受け取らない
- L706 — ★2026-10-18: 受けるのは 2-D の uint8 だけ。float の [0,1] を渡しても古い Pillow は mode=”L” で生のバイト列を 読み替えて黙って通し(画素値は意味の無い数になる)、Pillow 13 で初めて “Invalid mode for data type” で落ちた。 試験 1 本がこの経路で無意味な入力を 1 か月使っていた。型を確かめてから渡す(mode は dtype から決まる)。
imgio.py
- L99 — ★判定は 2 つ(2026-09-08、同日中に直した)。最初は「CIE L* の折返しが 0 回」 だけで選んでいたが、
poc_colormap_readability が cividis は折返し 0 回 なのに色差の尾根を立てることを実測した。明度が単調でも、色差の刻みが不均一なら なめらかな場に無い境目が見える —— 片側の基準で「安全」と名乗っていた。 実測(512 段、隣接色差の max / median と、中央値の 1.6 倍を超える局所最大の数): ========== ========== ============== ========== マップ L* 折返し ΔE max/median 尾根の本数 ========== ========== ============== ========== gray 0 1.33 0 viridis 0 1.38 0 plasma 0 1.38 0 magma 0 1.48 0 inferno 0 1.50 0 cividis 0 2.23 1 turbo 1 1.78 1 ========== ========== ============== ========== cividis を外したのはこの repo の近似 LUT が粗いからで、公開されている cividis そのものの問題ではない(制御点 6 個は逐次マップの中で最少)。 色覚特性への配慮で選びたい向きには :data:CVD_SAFE を用意した。 tests/test_pseudocolour_family.py が両方の基準を毎回測る。
- L124 — 色覚特性(P/D 型)でも順序が読めるとされるマップ。★
cividis の近似 LUT は 制御点が 6 個で色差の刻みが粗く、:data:PERCEPTUAL_SAFE の基準は満たさない (実測 ΔE max/median 2.23)。制御点を増やせば両方に入れられる —— 一次情報の値を手で写すと誤記の前科があるので、出典を確認できるまで保留。
- L712 — ★2026-10-18(外部レビュー 0.6.0 N209): 順は save(path, arr)。逆に呼ぶと「path must be … got ndarray」で 止まってはいたが、逆順だとは言わなかった。配列が path に、文字列が arr に来たら、それを言う。
-
| L721 — ★2026-09-20(GenSpark 第 34 報 N120): PFM は float 専用の形式なのに、既定の 8 bit 経路が 0..255 の 値を float32 として書き、読むと 0..1 に clip されて別画像になっていた(往復 max |
Δ |
0.98)。 PFM の既定は float(無損失)。 |
- L915 — ★2026-09-20(GenSpark 第 18 報 N78): 無い・ディレクトリ・読めない、が全部同じ文だった。
imgmetrics.py
- L151 — ★2026-09-20(GenSpark 第 23 報 N92): 配列なしで呼ぶと空集合の pop(KeyError)/ 0-d の float() (TypeError)という内部の文が出ていた。
- L163 — ★2026-10-11: 符号付きの幅を最大値(int16 = 32767)にしていて、skimage の peak_signal_noise_ratio(data_range = iinfo.max - iinfo.min = 65535)と 6.02 dB ずれた。 幅は dtype が取りうる全範囲。符号なしは max - 0 で従来と同じ。
matappear.py
- L167 — ★ 0 次元(スカラ)を渡すと
r.shape[-1] が素の IndexError を投げていた (2026-09-04 の敵対的監査で摘発)。分光反射率は最低でも波長軸を持つ ―― スカラは「波長ごとの値」ではないので、番人で明示的に断る。
- L273 — ★ 範囲外は黙って clip せず拒否する(cos=5 が垂直入射、cos=-0.5 が全反射に化けていた)。 丸めの屑(1 + 1e-15 など)だけは許す。
- L349 — ★ 実際の格子は両側に回折する(溝が対称なら ±m の効率はほぼ同じ)。ここで ±両方を入れないと、光源と視線の位置関係によっては解が全部負になり、 「正の λ だけ残す」フィルタが全部落として真っ黒になる。実測: 溝に直交して 照らした CD(Δsin = −0.55)は m=+1,+2 が λ<0 で全消え、m=−2 の 440 nm が本命だった。
match3d.py
- L344 — ★2026-09-07: numpy の FFT に置き換えた。式は同じ(float32 の fftn → 位相のみ → ifftn の実部 → argmax)で、torch でやる必要がどこにも無かった。torch を入れない CI(py3.10 / 3.12)ではこの op が ImportError になり PoC が落ちていた。
-
| L1048 — ★2026-10-07 レビュー修正: 境界 voxel は占有側の 1 層なので、iso 面より平均 |
n |
₁/2 voxel 内側(勾配 n の向き = 高い値の側)にある(軸平行で 0.5、斜めで最大 0.87)。d が系統的に その分ずれていた。各 voxel を − |
n |
₁/2·n だけ iso 面側へ戻してから投票する。 実測(40³、真の法線、半 voxel ずらし 10 通り×表裏): 軸平行の平均誤差 ±0.5 → 0.000、 斜め面は投影の離散化で ±0.3 以内が残る。 |
-
| L1110 — ★2026-10-07 レビュー修正: 境界 voxel は占有側の 1 層で、iso 面より平均 |
n |
₁/2 voxel 内側(勾配 n の向き)にある。半径が明球で −0.6、暗球で +0.6 voxel 系統的にずれていた。 各 voxel を − |
n |
₁/2·n だけ iso 面へ戻してから投票する(明球・暗球どちらでも同じ式)。 実測(48³、半径 7〜13、中心を半 voxel 内で乱した球): 平均誤差 明球 −0.64 → +0.17 / 暗球 +0.57 → −0.15 voxel (残りは丸め投票と放物線補間の偏り)。 |
- L1794 — ★2026-09-07: 本体を numpy に書き換えた。この ICP は 最近傍探索が cKDTree、 姿勢の更新が 3x3 の SVD で、torch でやる仕事が 1 つも無いのに torch を 必須にしていた。torch を入れない CI(py3.10 / 3.12)で PoC 4 本が
ImportError: this operator needs the optional 'torch' backend で落ちて 発覚(手元には torch があるので気づけなかった —— 門は事故の起きる場所に 立てる、の実例)。数値は float64 の同じ式なので環境で結果が変わらない。 返り値の型は互換のため据え置き: torch があれば torch.Tensor、無ければ numpy.ndarray(値は同一)。device に “cpu” 以外を頼まれたら fail-closed。
- L2029 — ★2026-09-07: 本体を numpy に書き換えた。最近傍探索・6x6 の正規方程式・ Rodrigues のどれも CPU の小さい線形代数で、torch でやる必要が無かったのに 必須になっていた。torch を入れない CI(py3.10 / 3.12)で PoC が ImportError で落ちて発覚。式は同じ float64 なので結果は変わらない (torch 版との差は R/t で 0、RMSE で 0 を実測)。
- L2044 — ★2026-10-07 レビュー修正: 小角線形化 R ≈ I+[ω]× は「原点まわり」の回転。原点から遠い 点群(UTM 座標など、オフセット 1e3 で回転誤差 23°)ではてこの腕 p が巨大になり、 回転と並進の自由度がほぼ縮退して Gauss-Newton が誤った姿勢へ収束していた。 dst の外接箱の中心 c へ両点群を寄せてから解き、最後に t = t’ + c − R·c で戻す。 外接箱の中心は点の順に依らない(reproducible=True のビット一致を保つ)。
-
| L2915 — ★2026-10-07 レビュー修正: 未中心化の |
p |
² は原点から遠い点群(オフセット 1e6)で桁落ちし 半径が 7.5e5 も狂った。重心へ寄せて解き、中心を戻す(数学的には同じ解)。 |
- L3069 — ★2026-09-07: 輪が画像の外にあるなら fail-closed。
r_in/r_out は 画素単位なので、mm のまま渡すと視野の外を読み、例外なしに全部 0 が返る (poc_pipe_wall_loss が真っ黒な図を 1 枚出して発覚)。中心から画像の四隅 までの最大距離より内側の半径が 1 つも無ければ、返るのは空以外にありえない。
- L3080 — ★2026-09-07: grid_sample(bilinear, align_corners=True, zeros padding)を scipy の map_coordinates(order=1, mode=”constant”, cval=0)に置き換えた —— 同じ双線形補間で、torch を入れない CI(py3.10 / 3.12)でも走る。 実測差は最大 6.0e-06(値域 0..1 の乱数画像。float32 と float64 の丸めぶん)。
- L3129 — ★2026-09-07: polar_unwrap と同じ理由で map_coordinates に置き換え(双線形・ 範囲外 0)。torch 不在でも走る。実測差は最大 7.6e-06。
- L3260 — ★2026-10-07: 瞳の中心・半径を外から渡せるように(既定は従来どおり)。
- L3474 — ★2026-09-07: affine_grid + grid_sample(align_corners=False, zeros padding)を numpy の座標計算 + scipy の map_coordinates(order=1)に置き換えた。torch は 双線形の再標本化にしか使われておらず、torch を入れない環境(CI の py3.10 / 3.12)でこの op が ImportError になっていた。規約はそのまま写した: 出力ボクセル (d,h,w) の正規化座標は ((i+0.5)/N)2-1、回転後に (g+1)/2N-0.5 で入力の画素座標へ戻す(align_corners=False の定義)。 grid の最終軸は (x, y, z) = (W, H, D) の順。torch 版との実測差は最大 7.6e-06。
materials.py
- L977 — ★X 線の列の op 4 本の台帳は
opstomography の spectral_xray(dualxray と同じ族)。materials.__all__ は opsoptics の matprop 台帳と 1 対 1(tests/test_materials.py)なので、ここには足さない —— 足すと matprop の登録と食い違い、統合で他の作業(電子線の列)と同じ行を取り合う。
- L1146 — ★引き先は「NIST の化合物の表の名前」か「化学式」だけ。化学式を名前として引き直すと、化学式と 同じ名前のレコード(BI4GE3O12、CDWO4)が自分自身に戻って無限に再帰する(2026-10-23 に実際に踏んだ)。
mathestimation.py
- L90 — ★床(eps)は q がちょうど 0 の所だけに掛ける。最初は q 全体を np.maximum(q, eps) で床上げしていて、 1e-49 のような小さな q が 1e-12 に持ち上がり p より大きくなって、KL(p‖p) が −3e-10(負!)になった (KL ≥ 0 の門で 2026-10-03 に捕まえた)。
- L256 — ★2026-10-07: ±inf は欠測(NaN)と区別する。以前は黙って欠測扱いで更新を飛ばしていた。
- L365 — ★2026-10-07: acos は π の近くで桁落ち(π−1.5e-6 で ω の誤差 4e-4 rad)→ 角は atan2(sinθ, cosθ)、 π の近くの軸は対称部 (R+Rᵀ)/2 = cosθ I + (1−cosθ) a aᵀ の最大対角の列から、符号は歪対称部から取る。
mathgeometry.py
- L228 — ★最初は発散を np.gradient(中心差分)で取り、Poisson を 5 点 Laplacian で解いていた —— 2 つが互いの随伴でなく、 縁で発散の総和も釣り合わず、隅で距離が真値の 0.52 倍に縮んだ(2026-10-03)。同じ G から両方を作ると Poisson は「勾配が X に最も近い φ」の最小二乗そのものになり、縁(断熱)でも無矛盾になる。
- L251 — ★熱の段は直接法で解く: u は距離とともに e^{−r/h} で 1e-30 まで落ち、遠くの勾配の「向き」はその極小値の 相対精度に乗っている。CG は絶対誤差 ~1e-12 で止まり、極小値を塗りつぶして遠くの向きを壊した (3-D で誤差 0.045 → 0.279、2026-10-03)。定数のずれが無害な Poisson の段だけ CG にする。
- L307 — ★2026-10-07: 面に使われない頂点が 1 個あると M と L にその行が 0 で入り、熱の段が特異 → 全頂点 NaN (513 頂点で例外なし)。始点と繋がらない成分は φ が任意の定数(実測 0.755)で有限に見えた。 始点を含む連結成分だけで解き、残り(未使用・非連結)は inf にする(geodesic_heat_grid と同じ約束)。
- L356 — ★2026-10-07: 始点が別々の成分にあると φ の定数は成分ごとに任意 → 成分ごとに始点で 0 に合わせる
mathnumerics.py
- L258 — ★2026-10-07: 重みを差の直接の積で作ると、Chebyshev 1200 点や区間 [0, 1e-4] で 積が 0 / inf に飛び全点 NaN になっていた。重みは共通の定数倍を除いて決まるので、 対数で和を取り最大で正規化してから exp する(符号は別に数える)。
- L425 — ★2026-10-11(台帳契約の門): 係数表でない table({pre, post} など)を渡すと生の KeyError: ‘coeffs’ が漏れていた。何が足りないかを名指しして拒否する(fail-closed)。
- L441 — ★2026-10-07: list も格子扱いしていたので、d 点 x d 次元の点列 [[x, y], [x, y]] が ndarray なら点ごと、list なら外積格子と、同じ数値で答えが変わっていた。格子は tuple のみ (文書の呼び方
(gx, gy) は tuple)、list は ndarray と同じく点 (M, d) として読む。
mathops.py
- L114 — 定理が門になる図(2026-09-23)。★
MATHOPS(台帳が読む一覧)と __all__ (import * の公開面)は別物で、両方に書かないと片方だけ通る。
- L1734 — ★既存の cplx_* は閉曲線を点列で持つ層(積分・巻き数・ローラン・等角写像)。# ここで足すのは領域の層 —— 値の場・位相彩色・ニュートンの吸引域・ # 脱出時間・翼まわりのポテンシャル流。新しい語は 1 つも作らない # (cimage / rgbimage / labels2d / mask / roots / signal はすべて既存)。 # 真値は「使った式」ではなく、偏角の原理・Cayley の定理・主カージオイドの # 閉形式内部判定・c=0 のジュリア集合(単位円板)・そして既存 op である # cplx_winding_number / cplx_cr_residual / cplx_joukowski / poly_roots。 # ————————————————————————— #
- L2206 — ★もう一方の臨界点 -b は円の内側になければならない。外に出ると dz/dzeta = 0 が流れの領域に現れ、そこで速度が発散する(翼でなく尖りが 2 つある図形になる)。
-
| L2319 — ★どれも「きれいな図」だが、採ったのはきれいだからではなく、 正しさを定理が言えるからである。数学の図はきれいなので、合って いるかを誰も確かめない —— だから絵の外に真値を置く: circle_packing_apollonian デカルトの円定理(厳密な代数等式)+ 整数充填 ford_circles 接するのは |
ps - qr |
= 1 のときに限る(整数で厳密) phyllotaxis_pattern 隣の番号差がフィボナッチ数(黄金角のときだけ) ifs_fractal モランの式 sum r^d = 1 と、既存 fractal_dimension space_filling_curve 4^n 点をちょうど 1 回ずつ・隣は必ず距離 1 相棒(neighbour_index_gaps / ifs_similarity_dimension / curve_locality)は 主張を数にする側で、これが無いと「それらしい絵」しか残らない。 ————————————————————————- # |
- L2432 — ★四つ組の最後が「直前に生まれた円」。それを落とす反射は親をもう一度 作るので、種の四つ組だけ 4 方向、以降は 3 方向に進む。ここを間違えると depth 3 で 56 個のはずが 88 個になった(実測。一意な円は 56 のままなので、 絵は正しく見えるが同じ円を何度も描き、以降の段が指数的に太る)。
- L2773 — ★2026-10-07: 縮小しない写像(r >= 1)を黙って通すと二分法が上端 8.0 に張り付き (r=1.2 の 2 枚で 7.99999…)、恒等写像 1 枚では 0 を返していた。Moran の式は 全写像が縮小(r < 1)のときだけ意味を持つので、ここで明示的に拒否する。
- L2782 — ★2026-10-07: 写像の数が多いと解が 8 を超えうる —— 上端を広げてから二分する。
- L2850 — ★ムーア曲線 = ヒルベルト曲線 4 本を輪に閉じたもの。四分割の向きと進む方向は 総当たり(8 対称 x 反転、4096 通り)で「継ぎ目 3 か所と折り返しが全部距離 1」を 満たす 32 解を出し、その 1 つを固定した。手で置くと隣接条件が静かに壊れる (最初の実装は隣接 False・閉 False のまま、絵としては正しく見えていた)。
- L2956 — ★クラドニ図形は「板」ではなく膜の解である。よく見る coscos - coscos は ヘルムホルツ方程式 + ノイマン境界の膜のモードで、実際のクラドニ板は 重調和方程式に従う別物。砂が節線に集まる絵は同じでも周波数比は合わない。 ここでは膜と明記し、膜の真値(閉形式の固有値・ベッセル零点)だけで採点する。 干渉と回折の真値は既存 op(grating_wavelengths / fraunhofer_pattern)。 ————————————————————————- #
- L3046 — ★2026-10-07: 矩形は [0,1] x 0,aspect。以前は y を [0,1] で取りつつ n pi y/aspect を 使っていたので、aspect != 1 で y=1 の辺が境界条件(Dirichlet なら 0)を破っていた。
- L3054 — ★2026-10-07: Dirichlet(sin x sin)は m=0 か n=0 で恒等的に 0 —— 全ゼロの場を 「固有モード」として返していた。拒否する。
- L3059 — ★2026-10-07: 組合せ (m,n)-(n,m) の 2 項は aspect != 1 だと固有値が pi2 (m2 + n2/a2) と pi2 (n2 + m2/a2) で異なり、和は固有モードでない。
- L3128 — ★2026-10-07: 以前は「集めた数が c+8 を超えたら止める」で、低い次数(m=0..2)の 高い零点ばかり集めて m>=3 の低い固有値(j’{3,1}**2 = 17.65 …)を落としていた。 j’{m,1} は m について単調増加なので、次の次数の最初の零点が、集めた中の c 番目を 超えた時点で打ち切れば取りこぼしは無い。
- L3327 — ★真値は公表値か閉形式だけ: 線形系は expm(At)x0 が厳密解で刻み半分に すると誤差が 1/16(4 次)、Lorenz のリアプノフ指数の和はトレース恒等式 により厳密に -(sigma+1+beta)、ロジスティック写像の周期倍分岐は 3 と 1+sqrt6、 相関次元は円 1・カントール log2/log3。絵では何も確かめられない。
- L3331 — ★関数(callable)を引数に取らない —— 型付き台帳は入力を sort で登録し、 連鎖ファザーがデータから引数を組むので callable は載らない。系は族名か係数配列。 ————————————————————————- #
- L3515 — ★
table は列名 -> 1-D 配列。状態を (S, n) のまま 1 列に入れると型の嘘に なるので、成分ごとの列に開く(x0, x1, … と時刻 t)。
- L3860 — ★上限は 60 パーセンタイルにしていたが、有界な集合では大きい r で C(r) が 飽和して傾きが下がる(充填した正方形で 1.83、真値 2.0)。飽和の 手前に寄せる。下限は近傍の離散化(雑音の床)を避ける。
measuring1d.py
- L375 — ★空の表は名指しで拒否する(2026-10-12 の空入力の方針 A)。空 list を空 list で返すと、 測定が 1 件も取れなかったことが mm 換算の後ろで見えなくなる。
- L624 — ★ここを「もう片端が次数 3 以上」と書いていた最初の版は、実測で 一度も発火しなかった: ヒゲの根元が枝の端点クラスタと 26 近傍で 融合して次数 2 になる配置が普通にあり、その場合に素通りしていた (「刈った」と報告しながら 0 本という、いちばん静かな失敗)。
mesh.py
- L410 — ★ match the whole line: a comment that merely mentions end_header used to end the header there and shift the binary body (silent garbage).
- L655 — ★ A comma is a column separator only when it is the ONLY one on the line. “1,5 2,5 3,5” (decimal commas, European locale) used to be re-split into 6 columns and read as xyz + colour (silently wrong).
meshio_opt.py
- L452 — ONCE from all three. ★ Per-channel, a 16-bit orange scene whose blue stays <= 255 (in 16-bit units) had blue divided by 255 -> 0.78 instead of 0.003.
metrics3d.py
- L373 — ★2026-10-07 レビュー修正: md=None(軸方向は無制限)で球の半径を r にしていたため、 実際は「半径 r の球」で切り取っていた(面が法線方向に r 以上動くと両側が揃わず nan)。 無制限の円筒は球で絞れないので、全点を候補にして軸・半径で判定する。
motionio.py
- L137 — ★ 値域(ptp)最大の単調列を時刻にすると、左→右に掃く縁の x(0..239 px)が 秒単位の t(0..0.1)に勝って x と t が入れ替わった(2026-10-07)。 x・y は画素座標なので整数値。時刻は「整数でない単調列」を優先し、 決まらなければ推測せず拒否する(見出しを付ければ名前で読める)。
occupancy.py
- L230 — ★2026-09-07:
res は軸ごとを受けるようにした(長さ 3 も可)。立方限定だと 鳥瞰格子(薄い z × 広い xy)のような扁平な体積で、要らない軸まで同じ刻みを 強いられる(poc_bev_sensor_fusion の実測: 409.6 万ボクセルのうち使うのは 8.1 %)。 同じ族の grid_coords は最初から軸ごとの res を受けていた —— 入口と出口で 契約の広さが違うのを合わせた。スカラを渡す既存の呼び手は不変。
- L340 — ★2026-09-07:
res は軸ごとを受けるようにした(長さ 3 も可)。それまでは int(res) で立方格子だけを許しており、esdf が長さ 3 の異方 voxel_size を 受け付けるのに、その出力を world 座標で引くこちらが立方限定という片側だけ狭い 契約になっていた。CT の薄い接合層 (30,180,180) のような格子でそのまま詰まる (poc_ct_void_morphology で実測)。スカラを渡す既存の呼び手は不変。
octscan.py
- L1238 — ★窓の端で振幅が下り坂のところは、0 で埋めた外側との段差が「極大」に見える → 元の振幅で極大のものだけ
op_probe.py
- L42 — ★2026-09-17:
feature を足した。戻りの橋 feature_to_img が入るまで、 2-D 台帳に feature を入力に取る op が 1 本も無かったので代表値も要らな かった。門(knob_liveness / probe_ledger / op_contracts)は 3 本とも 「測れない op が居る」と正しく落ちてこの穴を教えた。
opassist.py
- L56 — ★2026-10-23: カメラ校正(calib / caltab / fit_transform、21 op)。実装は 2026-08 から あり試験も 30 本超あったのに、台帳が無いので op ノートが 1 枚も無く、fs.ledger / OP_INDEX.json / op_find(“caltab”) のどこからも引けなかった(fs.<名前> は 21 中 1)。 新語なし(points / pose / matrix / table / contour / image2d)。名前>
- L77 — ★2026-09-08: ops1d(dsp 16 + funct1d 23)は登録済みなのに、docs にも op_run / op_assist / op_find にも出ていなかった —— 「登録した」と 「引ける」は別。opdocs に足したら、この門が引けない側を鳴らした。
- L318 — ★ 設計(2026-09-04、ユーザー「色々なコンテナ型は扱えるほうが良いけど、統一感も 大事です」): 最初は
kind に “seq” や “matrix” を混ぜていた ―― つまり値の型 (数値か整数か選択肢か)と容器の形(1 個かベクトルか行列か)が 1 つの欄で 競合していた。UI から見ると「int の 3 ベクトル」が表現できず、行列だけ構造が seq キーの下にあるなど、扱いがばらける。ここを直交させ、kind は値型だけ、 容器は常に container に入れる形へ統一した。スカラも例外にしない ({"form": "scalar", "shape": ()})ので、UI は分岐を 1 本に書ける。
- L452 — ★ 最長一致。短い順に見ると
sigma_per_mm が _mm に当たって “mm” になる (実際は 1/mm)。単位を間違えると UI の数字が黙って別物になる。
- L535 — ★2026-09-20(GenSpark 第 15 報 N71):
write_wav(path, x, rate) は in=[“signal”] なので、 第 1 引数の path に signal が割り当てられ、op_run("write_wav") が配列をファイル名として 開こうとしていた。パス名の引数は、宣言 sort が “file” のときだけデータ(読む側)で、 それ以外は書き先のパラメータ —— データ型は次の引数へ送る。
- L568 — ★ ここが要点: 既定値が tuple で与えられていない引数がある。
center=None(省略可の (row,col))、必須の trans(3 ベクトル)、 k_cam(3x3 行列)…… 既定値だけを見ると「数値 1 個」に見えてしまい、 UI が spin box を 1 個出して破綻する。名前で構造を補う。
- L782 — ★一様乱数の行列にしない —— 成分・モジュラリティ・rich club は構造が無いと 「どのノブでも同じ数」になり、押して動いても意味のある絵にならない。
- L786 — llmcore(2026-09-24): ★一様乱数にしない —— どの行も似た向きになり、 注意の重みが全行ほぼ一様になって「押しても何も起きない」種になる。 滑らかな画像を 8x8 パッチに切ると、近い場所が近い向きを向く。
- L802 — ★ 実測で判明:
prism_min_deviation_deg の波長入力に 0..1 の汎用 signal を渡すと 「波長は正の値」で弾かれ、サンプルが動かない op になっていた。単位が分かる なら、その量として妥当な範囲を種にする方が「押せば動く」に近い。
- L995 — 和文(CJK)の連なり。★
_WORD_RE は [a-z0-9]+ なので、日本語のクエリは 語が 1 つも取れない(_WORD_RE.findall("点 検出") == [])。語幹の段が 死に、部分一致は空白ごと含む文字列を探すので、和文の複数語クエリは構造的に 必ず 0 件だった —— docstring の大半が日本語で、6 言語を配っている製品で。 2026-09-08 に poc_search_sweep_width が踏んで判明(op_find("点 検出") / ("スポット 検出") / ("小さい目標") がいずれも 0 件で、副画素重心つきの 点目標検出は star_detect しか無いのに和文から辿り着けなかった)。
- L1048 — 語幹一致とみなす共通接頭辞の長さ。★4 にすると “median”/”medial” や “contrast”/”contour” が繋がってしまい、5 で切ると “correlation”/”correlate”(8)・”segmentation”/”segment”(7)・ “rotation”/”rotate”(5)・”gaussian”/”gauss”(5) は拾えて、上の 2 組は拾わない。
- L1058 — 共通接頭辞の後ろに許す語尾。★接頭辞の長さだけで判定すると “median”/”medial” が繋がる(共通 “media” が 5 文字ある)。語尾が 屈折語尾らしいかどうかを見ると、”correlation”/”correlate”(ion / e)は 通り、”median”/”medial”(n / l)と “corner”/”cornea”(r / a)は落ちる。
- L1154 — ★床。無い状態だと “zzz-nothing-matches” が
histogram_match を返す (“matches” が match_* に語幹一致するため)。当たった語の重みが クエリ全体の 15 % に満たなければ「当たっていない」とみなす。 実測: “digital image correlation” は 0.19(通す)、 “zzz-nothing-matches” は 0.10(落とす)。
- L1294 — ★欧文の段(2026-10-15): 欧文のクエリは 1 行目の doc までしか見ておらず、引数の説明にだけ 出る語が 0 件だった —— “orthometric”(標高)は dem_height_frame_convert の frm / to にしか 書かれておらず、op_find(“ortho”) は名前に ortho を含む doe_orthogonal_array(直交表)しか 返さなかった。docstring 全文の部分一致を、どの段より低い点(12)で最後に拾う。
- L1335 — ★2026-09-19(GenSpark N2):
fullseye.apply([x, y], "add_image") で動くのに、 op_names() にも op_find() にも載っていなかった(op_names は 1 入力のレジストリだけ、 op_find は台帳 + レジストリだけを見ていた)。呼べるものは探せなければならない。
- L1364 — ★2026-10-18(外部レビュー 0.6.0 の一次検証): op_find(“sgm”) が 0 件で、外部 AI は「SGM は無い」と結論した。 実際には
fullseye.disparity_sgm(Hirschmüller の SGM、census の費用 + 経路集約)が 0.1 系から在り、 fullseye.stereo の族ごとファサードにだけ在る —— 台帳・2-D レジストリ・n-ary のどれにも載らないので、 探す側からは見えなかった([[feedback_search_all_tiers_before_declaring_a_gap]] と同じ型)。 名前と docstring の 1 行目で、他の層より 1 点低く拾う(同名なら op 表の行が勝つ)。
- L1392 — ★2026-09-20: 何で当たったかを
match に(exact = 名前の完全一致 / name = 名前の部分一致 / stem = 語幹 /
- L1463 — ★2026-09-20(GenSpark 第 55 報 N200): op_run(img, “gaussian”) が
unhashable type: 'numpy.ndarray'、 op_run(“gaussian”, img) が「not in any ledger」で終わり、registry op は apply で走ることを言わなかった。
- L1483 — ★2026-09-20(GenSpark 第 20 報 N87): 種を作れない型(mesh / lab / matrix …)は None のまま 関数に渡り、IndexError / AttributeError / AxisError が利用者に届いていた(11 op)。 呼ばずに、どの入力を渡せばよいかを言う。
- L1496 — ★2026-09-20(N71): データ引数が署名の先頭に無い op(write_wav(path, x))は名前で渡す —— 位置で渡すと 配列が path に入る。データ引数の名前は param_spec が知っている。
- L1506 — ★2026-09-20(GenSpark 第 34 報 N122、再現): 入力を一部だけ渡すと(blend_mode(base) で top 無し)Python の生の 「missing 1 required positional argument」が届いていた。0 個のときは上で種を作って言うのに、1 個以上のときは 検査が無かった。必須のデータ引数が位置でも名前でも来ていなければ、期待する形を 1 文で言う。
- L1524 — ★2026-09-20(N87): 自動の数値サンプル(1.0)が座標や行列を要する引数に合わないと、op の中の IndexError がそのまま利用者に届いていた(scene_box の center_mm 等)。自動値が原因なら言う。
ops.py
- L339 — ★勾配は片側差分の大きい方で取る。
np.gradient の中心差分は 1 画素で 立ち上がる段差を 2 画素に広げてしまい(段差の頂点で 0.5 しか出ない)、 理想の段差が幅 2.00 と報告される —— 測る道具が理想ケースで 2 倍を返す。 片側差分なら段差で 1.0、傾斜 m の斜面でも m となり、どちらも正しい。
- L637 — ★相対床だけでは足りない: 一様面 + 丸め屑では値域そのものが屑なので、 相対床も屑まで下がってしまう。絶対床 1e-5(画像は [0,1] 契約)を併せる。
- L713 — ★一様な面では勾配が丸め屑しか残らず、
arctan2 はその屑の符号で任意の角度を 返す —— 明るさを 0.01 変えただけで向きが一斉に変わる。絶対値の床では画像の 明るさに依存してしまうので、必ず相対量で切る。
- L817 — ★膨張は前景をはみ出す。連続の世界では半径 r の円は収まっているが、離散の 円板で膨らませると境界の外の画素まで塗る —— 実測で前景 197 画素の円に 対し外へ 48 画素(24%)漏れ、そのせいで粒度分布の生存率が 1.0 を超えた。 太さは前景の量なので、必ず前景で切る。
- L1010 — ★各画素には「入った時点で属していた山」の persistence を入れる。 ここで find(i)(= 最終的な根)を引くと、全画素が最後に残った 1 つの山の値に なってしまう —— 実測で高さ 1.0 / 0.6 / 0.3 の 3 つの山が全部 1.000 になった。
- L1017 — ★画像の最小値そのものの台地(たいていは背景)は 0 にする。そこは最後に 処理されて全体最大の山に吸収されるので、放っておくと背景一面が最大値に なって地図が読めない(実測で背景が 1.000 になった)。閾値を新たに選ぶのでは なく「最小値ちょうど」だけを落とすので、閾値フリーの性質は保たれる。
- L1109 — ★
m / n**2 ではなく (m + 0.5) / n**2。前者は値が {0, 1/4, 1/2, 3/4} と なって平均が 0.375 にしかならず、ディザ全体が暗い側へ偏る(1 ビットの傾斜で 平均が 0.031 ずれるのを実測した)。閾値は刻みの真ん中に並べる。
- L1298 — ★歴史的な挙動を
b <= 0.5 の帯に置く。これらの op の b は 2026-09-17 まで 「未使用」で、保存済みの進化プログラムが持つ b の値は事実上ばらばらに散って いる。新しい選択肢を上半分だけに割り当てれば、およそ半数の既存プログラムは 1 ビットも結果が変わらない(全域に割り当てると全部変わる)。 b <= 0.5 が旧実装とビット一致することは tests/test_knob_b_options.py が固定する。 ————————————————————————— #
- L1312 — ★境目は 0.5 を含めて歴史側に置く。0.5 は「まん中」として既定値に使われて いて(api.apply の既定、studio の中央、保存済みプログラムの初期値)、ここを 新しい側に入れると既定のまま呼んだだけで答えが変わる。実測で gaussian と その HALCON 別名の一致検査まで割れた。
- L1420 — ★しきい値は argmax ビンの「上端」で取る(2026-09-26)。中点で取ると、 argmax が指すのは背景の山を含むビンなので、その中点より上に居る背景画素 自身が前景に入る。背景 0.30 / 明部 0.90 の板では 400 px の答えが 4,096 px (全画素)になり、例外も警告も出なかった —— skimage と OpenCV は同じ絵で 400 を返す。ビンの上端で切れば argmax ビンの画素は全部背景側に落ちる。 試験の入力に必ず雑音が載っていたため 30 年物の門が全部通していた (docs/hardening/otsu-threshold-at-the-bin-midpoint.md)。
- L1547 — ★2026-10-07: 0 画素の面積率は 0/0(np.mean が NaN を返し、guard が黙って置き換えていた)
- L1687 — ★端は端の値で埋める。以前は
np.convolve(x, k, "same") で、 これは両端の w 点をゼロと平均する —— 輪郭の始点と終点が 原点 (0,0) の方向へ最大 50 px 以上引きずられ、輪郭 140 本ぶんの 赤い筋が左上へ収束する図になった(2026-09-06、op ごとの図を初めて 作ったときに発見。数値テストでは平均ずれ 0.3 px で見えなかった)。
- L2283 — ★pickle は名前で(2026-09-19 外部レビュー N5):
fn は backend_safe._safe のクロージャで pickle できず、Op を丸ごと multiprocessing / joblib に渡すと PicklingError で止まっていた(Pipeline は名前を持つので通る、という非対称)。 復元先は復元する側の環境の登録: backend が入っていない環境で戻すと KeyError(不足 extra の案内つき)になり、黙って別の実装にはならない。
- L2456 — ★2026-09-19 の外部レビュー(#1): scikit-image 無しの環境で
sk_canny を呼ぶと 「unknown operator」になり、存在しないのか backend が入っていないのかを 区別できなかった。fn は backend_safe._safe に包まれて __module__ を失う ので、登録の側で出自を残す(後勝ち = REGISTRY の重複解消と同じ規則)。 imgevolve.py index がこれを module / requires として索引に書き、 api._resolve が未登録の名前を引かれたときに索引から不足 extra を案内する。
- L2465 — ★pyproject の optional-dependencies と食い違うと案内が嘘になるので
tests/test_usability_review_2026_09_19.py が突き合わせる。
- L2752 — ★2026-10-07: 複素の sort は sanitize(実 sort 向けの規約で実部だけを返す)を通さない。 以前は tb_angular_spectrum_propagate / tb_cx_apply_transfer_function / tb_fmcw_window_apply が cimage / beatcube を名乗りながら float64 を返していた(虚部を黙って捨てる = 位相が消える)。 backends_bridge の橋は同じ理由で既に素通しにしていた —— その規約をこちらにも揃える。
- L2767 — ★ネイティブ側が退化入力でプロセスごと落ちる op の台帳(2026-09-05)。
guard は Python の例外しか捕まえられない。C/C++ の中で境界の外へ書き込まれたら そこで終わりで、利用者のパイプラインごと消える —— fail-soft の最悪の破れ方。 入口で弾く以外に手が無いので、理由つきでここに載せて登録時に関門を掛ける。 プラットフォームで挙動が違うのがこの台帳の存在理由。下の 3 本は Linux(Ubuntu 24.04 / Python 3.12 / PyPI の wheel)では落ちるが、 Windows では同じ入力で 1 件も再現しなかった。ネイティブのビルドが違えば 境界の壊れ方も違うということなので、「この種類の入力なら大丈夫」という 細かい線引きは信用できない —— 退化入力はまとめて拒否する。 直したら消す、ではなく上流が直ったことを確認できたら消す(こちらは 自分のコードではないので、消す条件が違う)。
ops1d.py
- L117 — ★2026-10-11(台帳契約の門): read_wav / read_audio は (x, rate) を返すのに宣言は signal で、adapter が無かった(io 族は連鎖ファザーの目録から外れていて、誰も 型を確かめていなかった)。resample と同じく本体(x)を取り出す。rate が要るなら
fs.ledger.read_wav.raw(path) か dsp.read_wav(どちらも (x, rate) のまま)。
ops3d.py
- L437 — ★ out は image2d ではなく rgbimage(2026-09-02 実測)。docstring も 実装も「RGB (size, size, 3) float [0,1]」で、この行だけが 2-D の 輝度画像を名乗っていた。mesh の種を入れて初めてこの op が実行され、 型述語が「declared ‘image2d’ but returned ndarray(512,512,3)」と TYPEMISS を出して顕在化した(それまでは (V,F) を 2 位置引数に割る 形のせいで一度も実行されていなかった)。他の render_* 3 op (ambient_occlusion / cast_shadow / supersample_mesh)は実測どおり 2-D なので image2d のままでよい ― 嘘だったのはここ 1 行だけ。
- L460 — ★どれだけ細分しても次数 5 の頂点はちょうど 12 個。これは V - E + F = 2 の帰結であって実装の都合ではない(11 個でも 13 個でも 球にならない)。mesh_subdivide は任意メッシュの細分で、正多面体から の構成は持っていなかった。入力を取らない生成 op。
-
L466 — ★極小曲面と掃引(2026-09-23)。極小曲面は平均曲率 H が至るところ 0 の 曲面で、既存 vertex_curvature がまさにそれを測る —— 「これは極小曲面だ」 という主張を、作り方を知らない op が採点する。カテノイドとヘリコイドは 等長なのでガウス曲率 K が一致するが、それは必要条件にすぎない(門に するのは H)。実測 |
H |
中央値 0.0001 に対し、対照群の単位球 1.00004・ 半径 1 の円柱 0.50000。 |
- L476 — ★これは節面近似であって厳密な三重周期極小曲面ではない。残差は 隠さず docstring に書く(主曲率スケールの 1 % 程度)。
- L562 — ★新しい sort は作らない: ノード表と枝表は「単位も意味も違う 2 つの表」で、 タプルで返して adapter に
r[0] と書くと 枝表を黙って捨てる (pose_error / m3c2_distance で繰り返した失敗の型)。1 つの dict に 両方を入れれば宣言 ‘table’ が実返りと一致し、捨てるものが無い。
- L717 — ★2026-09-08 追加。それまで彫刻用の姿勢ヘルパ(visualhull.look_at)は どの公開層からも引けず、同名の render3d.look_at(gluLookAt・−Z 前方)を 掴むと 例外なく空の hull になった(poc_livestock_body_volume)。
- L738 — ★ out は image2d ではなく keypoints(2026-09-15 実測)。実返りは 像面上の (N,2) 画素座標で、入力 (160,3) に対し (160,2) が出る —— 画像ではない。同じ型の嘘を “render” 節の
project_points で 2026-09-02 に既に直しているのに(「旧宣言 ‘image2d’ は型の嘘で、 pnp3d 側の ‘image2d’ 宣言と噛み合って PnP を壊していた」)、 この 1 行だけが兄弟一掃から取り残されていた。 例外にならないのは _sort_ok が image に ndim == 2 しか求めず、 (N,2) が「幅 2 の画像」として黙って通るから。値域も画素座標 (実測 16.0 .. 47.9)で [0,1] ではなく、image を名乗る限り 下流の閾値 op に渡ると意味を失う。
- L828 — ★ 保留していた理由(a)「points 候補リストが短くなり既存 champion を黙って 書き換える」は、backends_typed.TYPE_TO_SORT で coordgrid → points へ畳む ことで消えている: 2-D 橋の tb_sphere_sdf / tb_box_sdf には INPUT_ADAPTERS._points_to_grid が付いていて 点群から座標場を実際に作って いるので、あちらの “points” 宣言は嘘ではない(実測: (64,3) を渡すと (16,16,16) が返る = 生きている)。嘘だったのは 3-D 台帳の側だけだった。
- L991 — ★ axis=1。
pairs の正典は (N,2)(消費側 6 op が (2,N) を名指しで 拒否することを実測)。述語が lambda v: True だった間、ここは (2,n) を 作っており「どの消費側も受け取れない形」を宣言型として名乗っていた
- L1029 — ★ position の正典は [z, y, x] の 3 成分。多数決ではなく消費側を実行 して決めた: refine_translation_lk / refine_lm は 4 成分を渡すと “init_pos must have exactly 3 components [z, y, x] (got 4)” で fail-closed する(実測)。生成器も (8.0, 8.0, 8.0) の 3 成分。ところが match_* 系は docstring どおり [score, d, h, w] の 4 成分を返しており、宣言 out が “position” のまま流すと後段の精緻化 op が全滅する = 型の嘘。 score 自体は正直な情報なので関数側は削らず(get() は 4 成分のまま)、 台帳の型を名乗る call() 側で座標だけを取り出す(project_points と同じ扱い)。
opsacoustics.py
- L195 — ★新しい型の語は作らない。積層・A スキャン・C スキャンは kind の印つきの dict(table)で、 印の無い table は消費する 5 op がすべて ValueError で拒む —— 別の族の table を積層として 黙って読む経路が無い。
- L198 — ★A スキャンを素の signal にしない理由: 超音波で測る量は時刻(深さ = 往復時間)で、 素の 1-D 配列は時刻の原点(表面エコーの手前の窓の始まり)と rate を失う。上の rate の 注記と同じ「例外も NaN も無しに深さが狂う」経路になるので、t と rate を同じ dict に 入れて流通させる(dict の
rf を取り出して acoustics の op に渡すのは呼び手の明示的な行為)。
- L202 — ★C スキャンの RF の立方体(画素 × 時刻)は返さない: 返すのはゲートの中で読んだ像だけ (振幅・位相・同相・符号つき山・到達時刻)。立方体を image / volume として流せば 「時間の軸を空間の軸として」読む経路ができる(混ぜると黙って嘘をつく)。
- L205 — ★接合面の地図は既存の labels2d(整数ラベル = 積層の種類)。2 入力なので 2-D の橋は 架からず、1 入力の op の in はすべて table か無し(TYPE_TO_SORT に無い)。
opsastrostack.py
- L85 — ★ 代わりに 生の (N,H,W) ndarray を明示的に拒否した。3-D 配列は video (T,H,W) / voxel (D,H,W) / histcube (H,W,T) / zscan のどれもが 同じ構造検査を通り、取り違えても例外にならず「もっともらしく間違った 合成結果」が返る —— photon 族が histcube を voxel から分けたのと まったく同じ危険である。ただしここでは型を増やすのではなく 「list であること」を要求することで同じ防御を得た。list(volume) と 書いた時点で、呼ぶ側が「先頭軸はフレーム軸だ」と宣言したことになる。 * image2d —— 合成結果、drizzle の出力、単一フレーム。どれも 2-D の float64 で、既存の 2-D op(フィルタ・閾値・morphology・psf_to_mtf)が 意味を保ったまま使える。非負でもない(κ-σ 合成の残差やスプライン 補間の負の縁が出る)ので counts を名乗るのは逆に嘘になる。 * keypoints ——
star_detect の返りは (N, 2) の (row, col)。 TYPE_CHECKS の keypoints は「(N,3) または任意の 2-D 配列」なので そのまま該当し、psf_fit / aperture_photometry が食う。
-
L101 — ★ ここは pairs ではない: pairs の正典は reprconv 側の 6 op が決めた 「(x, y) の対」で、こちらは画像座標の (row, col) であり fit_transform / mosaic と同じ規約。混ぜると行と列が入れ替わる (features.match_keypoints が (x,y) を返すのに fit_transform が (row,col) を要求する、というこの repo 既知の罠と同じ形)。 keypoints を名乗れば、少なくとも「画像上の点」という約束は共有される。 * indices —— lucky_select が返す採用フレームの添字(1-D int)。 既存語彙そのもの。[frames[i] for i in idx] で images に戻る。 * measurement —— noise_sigma は実スカラ 1 つ。 * matrix —— frame_align の (3,3) 同次変換。transforms / fit_transform / mosaic が扱っているのと同じ物で、専用語を作る理由が無い。 * table —— dict / list of dict(品質、PSF 当てはめ、測光)。 TYPE_CHECKS の table は list |
dict なのでどちらも該当。 分けなかったことの代償(honest): images プールに天体でない画像列が 入ると、frame_align は星が見つからず ValueError で止まる。これは fail-closed なので「発見ゼロ」ではなく「到達したが正しく拒否した」だが、 連鎖ファザーから見ると align 系 2 op が CONTRACT にしかならない可能性がある。 photon 族が counts を分けた理由(7/17 が一度も実行されない)と同じ症状が 出うるので、もし実測でそうなったら、そのときは「点像を含む画像列」を 別プールにする判断が正当化される —— 先回りして型を増やすことはしない (型は「混ぜると嘘になる」証拠が出てから増やす、が本 repo の順序)。 |
opsconngraph.py
- L66 — 作る —— シナプス表から隣接行列へ、帰無モデル、二値化。★カテゴリ名は docs/ops/conngraph// に なる: "build" は .gitignore の build/ に当たり、ノート 3 枚が commit されず CI だけ赤になった(2026-09-20)
opsdem.py
- L35 — ★ 正直な限界:
depth プールにはカメラの透視投影による深度も入りうる。 透視深度は 1 px が地上で何メートルかが深さとともに変わるので、一定の cell_size を当てた傾斜はもっともらしく間違う。ではなぜ型を 分けないか —— これは型の取り違えではなく cell_size の与え方の 誤りと同じ種類の誤りで、cell_size は既に必須引数(既定値を置か ない)にしてある。型を増やしても正射でない深度は防げず(述語は 「2-D の実数配列」までしか見られない)、代わりに種を持つ op が 1 つも 無い dem プールができて 13 op すべてが永久に未実行になる。 防げないものを型で防いだことにするより、必須引数と docstring で明示し、 ファザーには実際に走らせるほうを採った。 * dem_fill_sinks の出力だけ depth —— 窪地を埋めた結果はまだ 標高格子で、そのまま dem_flow_direction へ入る。ここを image2d と宣言すると族内の連鎖(埋める → 流す)が型で切れる。 * dem_flow_direction は labels —— 返りは int8 の 0-7 と -1(流出先 なし)で、順序に意味が無い符号である。mask を名乗ると二値の ように扱われ、image2d を名乗ると 3 と 4 の平均に意味があることに なってしまう。labels の述語(整数 dtype の 1-3 次元)にそのまま該当。 * dem_stream_network は二値だが image2d —— 中身は 0.0/1.0 に加えて 欠測の nan を持つ float64 で、mask の述語(bool か整数 dtype)を 満たさない。bool にすると「河道でない」と「そもそも値が無い」が 区別できなくなるので、型のほうを実装に合わせた。 * 残りはすべて image2d —— 傾斜[度]・方位[度]・曲率[1/m]・陰影[0,1]・ 起伏[m]・地平線仰角[度]・天空率[0,1]・可視[0/1]。どれも 2-D の実数場で、 既存の 2-D op(平滑化・閾値・morphology・疑似カラー・図注)が意味を 保ったまま使える。値域は [0,1] とは限らないが、それは astrostack の合成結果と同じ立場で、image2d は輝度の約束では なく「2-D の実数場」の約束としてこの repo では使われている。 カテゴリ → [(op 名, module, [入力種別], 出力種別)]
opsflyvision.py
- L64 — ★ 重みは公開しない:
fly_hex_resample の個眼×画素の重み行列は functools.lru_cache で内部にだけ保持し、op の入出力型には現さない —— 出すと「画素座標系に依存する巨大な派生物」が型プールを汚し、下流の 2-D op が それを画像と取り違えて黙って処理してしまう(zscan を video に渡すと通る、と 同じ事故の型)。出さないことでこの取り違えを構造的に不可能にする。
opsgraph.py
- L35 — ★比べられる数字はヌルで割った比だけ。素の個数は規模で決まる。
- L44 — ★matrix の束を images に載せない —— 画像を渡すと全画素 > 0 で「全結合が全員に在る」 というもっともらしい嘘を返す。table なら他 op の表を渡しても op が断る。
opsimgforensics.py
- L206 — ★
phash の述語で dtype を見ることが本体である。ndim == 1 だけだと 既存の signal と完全に重なり、分けた意味が無くなる。
- L208 — ★
fingerprint の述語は image2d と 形では区別できない。ゼロ平均性で 切るしかなく、それは実行時の統計的な当て推量なので、述語も同じ弱さを持つ (だから型で分けている)。この弱さを述語のコメントに残しておくこと。
- L224 — ★
fingerprint の種は 必ず sensor_fingerprint を通して作ること。 rng.standard_normal((H, W)) を直接置くと、それは指紋ではなく白色雑音で、 照合は常に「無相関」を返す = 検査面が増えたつもりで増えない。
- L227 — ★
images の種は 同じ shape で 2 枚以上。1 枚だと sensor_fingerprint が fail-closed し続けて一度も走らない。
- L242 — ★
jpeg_ghost_quality の qualities=None は「40..95 step 5 の 12 本」を 仮定するので、images の種が 12 本でないと必ず ValueError になる。 これは意図した fail-closed(添字と品質がずれた地図を返さない)なので、 ファザー側で本数を合わせる。
- L246 — ★
watermark_* の bits は容量(LL の 8x8 ブロック数)以下でなければ ならない。64x64 の image2d + level 1 の LL は 32x32 = 16 ブロック。
opsinterferometry.py
- L96 — ★ 既存
signal に相乗りさせなかったのは実測の結果である。最初は 「csi_signal_simulate ([] -> signal) が本物の干渉信号をプールへ注ぐから 到達できる」と判断したが、その配線で連鎖ファザーを回すと 600 連鎖(300x長さ6 + 300x長さ8)で csi_peak_position と chromatic_confocal_height が 1 度も実行されなかった(記録は CONTRACT が 7 件のみ)。原因は signal 種が負値を持つ正弦波で、 入口 op が同じ連鎖で先に引かれる確率が低いこと。opsphoton が counts で 踏んだ罠とまったく同じで、fail-closed が完璧に効いた結果として 「発見ゼロ」が頑健さに見える。sweep を専用プールにした同条件の 再測定では 9 op すべてが実行された。 2 種を混ぜても取り違えが黙って通らないことは、それぞれ専用の判別で 担保してある(どちらも閉形式で測った閾値): - スペクトルを csi_peak_position に渡す → carrier_tolerance。 干渉信号は搬送波が 2/λ(Nyquist の 0.333)に立つが、共焦点ピークは 0.010。実測で 1000 倍の単位誤りも同じ検査が捕まえる。 - 干渉信号を chromatic_confocal_height に渡す → max_carrier_fraction。共焦点応答の AC 成分は低周波だけ(実測 0.010 / 0.010 / 0.015)、干渉信号は 0.333。 入口 = csi_signal_simulate / chromatic_confocal_simulate(どちらも 引数なしで産む)、出口 = csi_envelope (-> signal) と 2 つの measurement op。
opsmath.py
- L97 — ★閉形式の内部判定。脱出時間の図に「ここは絶対に出ない」を重ねられる。
-
| L102 — ★定理が門になる図(2026-09-23)。数学の図はきれいなので、合っているかを 誰も確かめない —— ここに入れるのは絵の外に真値があるものだけ。 デカルトの円定理 / |
ps - qr |
= 1 / フィボナッチの斜列 / モランの式 / 4^n 点をちょうど 1 回ずつ。相棒の 3 本は「主張を数にする」側で、 これが無いと「それらしい絵」しか残らない。 |
- L108 — ★型は
pairs(N,2)。points は (N,3) の 3 次元点で、 最初そちらで登録して型契約の門に捕まった —— 名前が似ているので 取り違えやすい(門が無ければ「もっともらしく間違った」宣言が残った)。
- L123 — ★波動(2026-09-23)。クラドニ図形は「板」ではなく膜の解 —— 板は重調和 方程式に従う別物で、砂が節線に集まる絵は同じでも周波数比は合わない。膜と 明記して、膜の閉形式(矩形は pi^2(m^2/a^2 + n^2/b^2)、円はベッセルの零点) だけで採点する。干渉と回折の真値は既存 op(grating_wavelengths / fraunhofer_pattern)が独立に持っている。
- L140 — ★力学系(2026-09-23)。真値は公表値か閉形式だけ: 線形系は expm(At)x0 が 厳密解で刻み半分なら誤差 1/16(4 次)、Lorenz のリアプノフ指数の和は トレース恒等式で厳密に -(sigma+1+beta)、ロジスティックの周期倍分岐は 3 と 1+sqrt6、相関次元は円 1・カントール log2/log3。絵では何も確かめられない。
opsoptics.py
- L232 — ★真値が閉形式で外部参照が要らない: 恒等フィルタ → 180 度回転、 (i2πf)^n → n 階微分(ガウシアンの微分は閉じた式)、渦位相板の 巻き数が整数。fourier_plane_filter は入力を取らない生成器で、 four_f_filter が場と透過関数を受ける(cimage 2 つ)。
- L243 — ★ pupil_blur は「画像 × カーネル」の一般畳み込み(filters_freq.convol_fft) ではない —— PSF の標本間隔 λN/oversample を検出器ピッチへ面積積分して から畳む、その単位合わせが本体。だから PSF を作る側に置く。
- L304 — ★ normals(点群の (N,3) 法線)ではなく normalmap。両者は形は似ているが、 (N,3) を渡すと _normal_map が ValueError で弾く。ここを normals と申告すると 「点群の法線を渡してよい」という嘘になり、連鎖ファザーは毎回 CONTRACT で 終わってこの族を一度も実行しない(= 発見ゼロに化ける)。
- L407 — ★trace_rays は登録しない: 台帳の trace_rays は optscene が持ち、正準名 lens_trace_rays は窓口(facade)の 別名として予約済み(opnames.FACADE_ALIASES)で、台帳に置くと test_op_names_phase1 の衝突の門が赤になる。 台帳からは ray_bundle / noncoaxial_trace で同じ追跡に届く。refractive_index は別の作業が中を直しているので この回は登録しない(既定の媒質が要る)。
- L538 — ★新しい型の語は作らない(位相も image2d、統計は table)。
- L539 — ★2-D の橋(tb_*)は架からない: 1 入力の op は speckle_statistics だけで、その in の image2d は sort
image(_NEW_SORTS の外)、out の table は sort に写らない (2026-10-13 に backends_typed.build の条件で確かめて決めた。_OP_BRIDGE_SKIP 不要)。
- L543 — ★材料は名前(別名可)かレコード dict で受ける。波長曲線はすべて pairs(λ [nm], 値)= 光源・QE・ ライトガイドの曲線と同じ形(像 = 光源 × 光学系 × 対象 × QE の波長積分へ渡す)。全部が引数だけで 描く側(画像を受けない)なので 2-D の橋は架けない(_OP_BRIDGE_SKIP)。
- L574 — ★曲線は materials と同じ pairs(λ [nm], 値)。像の明るさ = ∫ 光源 × 光学系・対象 × QE dλ を spectral_product で 1 本ずつ掛けて spectral_integral で積む。QE を掛ける前に energy_to_photons。 画像を受けないので 2-D の橋は架けない(_OP_BRIDGE_SKIP)。
- L597 — ★膜も基板も材料表(materials)の鍵で指定する。画像(分光の帯域画像)を受ける map も表を返すので 2-D の橋は架けない。
- L605 — ★レンズの処方(raytrace)と硝材の分散(materials)→ 波長ごとの焦点位置の較正表 → 戻りスペクトル → ピーク → 高さ・透明板の厚さ。観察対象(透明板・金属)の反射率も同じ材料表から。画像を受けないので 2-D の橋は架けない。
- L616 — ★画像を受ける op の in は image2d(橋の外)、引数だけの op は表 / 曲線を返す側なので 2-D の橋は架けない。
- L631 — ★fail-closed: 扱えない面の種類・座標変換面・r² の非球面項・別名でしか表に無い硝材は拒否、近似は allow_partial で明示したときだけ(結果に approximate=True)。画像を受けないので 2-D の橋は架けない(_OP_BRIDGE_SKIP)。
- L640 — ★fail-closed: 無い面・未知の欄・lens_system が拒否する値は ValueError。基の系は書き換えない。
- L648 — ★fail-closed: 矩形窓は参照の周期が整数のときだけ(そうでなければ拒否し、窓の宣言 hann を促す)、ナイキスト以上・1 周期未満は拒否。 法線の復元は影の無い画素だけ有効(他は NaN と valid = False)。雑音の模擬は種を明示。
- L661 — merit を再実装しない。★fail-closed: カタログに許容距離内の近傍が無いモデル硝材・無効な始点・未知の merit 欄は ValueError。
- L667 — lensopt の変数・LM をそのまま使い、硝材を変数にできる(離散の外側ループ)。★fail-closed: 未知のオペランド・足りない/余計な引数・ 範囲外の添字・有限でない値・重みが全部 0 の表は ValueError。
- L677 — 追跡の前に毎回解き直される(傍らの数値は解いた値)。★fail-closed: 未知の種類・循環したピックアップ・絞りを動かす厚みの解・ 軸上の主光線の解・根の無い F/# の解・collimate しない afocal は ValueError。
-
| L690 — ★fail-closed: 収束しない屈折は NaN と converged = False、表の外の波長・未知の水の種類・ |
g |
>= 1・n <= 1 は拒否。 波のスペクトルは Pierson-Moskowitz(1964)/ JONSWAP(1973)、水の吸収は Pope & Fry(1997)、散乱の位相関数は Petzold(1972)。 |
- L704 — Kolb, Mitchell & Hanrahan (1995)。幾何光学のみ(回折なし)。★fail-closed: 射出瞳が無限遠の系・非有限の入力・範囲外の波長/照明の表・ 軸対称でない系への点光源(前方追跡で回す)は ValueError。ケラレ/全反射の光線は NaN と vignetted = True で返す。
- L760 — ★fail-closed: 非有限の高さ・波頭より浅い底・下を向かない光・n <= 1・充填率の範囲外・定数画像・両クラスのない欠陥マスクは拒否。 濡れ面は Lekner & Dorf(1988)、水中画像は watermedia(Akkaynak & Treibitz 2018)、瓶は 2 次元の断面の光線追跡。
- L771 — ★格子の式 mλ = d(sin α + sin β) と Czerny–Turner の幾何から、角分散・分解能 mN・帯域の幅(スリットの像 ⊗ 画素 ⊗ 回折)・smile / keystone(3 次元の格子の式)・高次の重なりまで。chromconf の spectrometer_fwhm_nm と spectralrad の band_fwhm_nm を、スリット・格子・焦点距離・画素から実体化する。画像を受けないので 2-D の橋は 架からない(table は sort に写らず、spectrum は 2 入力)。
- L782 — ★LP モードは特性方程式の数値解(遮断 = Bessel の零点)。画像を受けないので 2-D の橋は架けない。
-
| L792 — ★縞はずれを M = p_m/ |
Δp |
倍(ウェハが動く)/ p_w/ |
Δp |
倍(マスクが動く)に拡大する。差動の 2 対で共通の誤差を消す。 |
- L803 — ★暗視野は縞の可視度の比(試料あり / なし)で、画素より小さい構造の小角散乱を測る。散乱角の広がりへは公表式で換算。
- L815 — 読み戻す。★新しい型の語は作らない: 図は印つきの dict(table)で、印の無い table は書き出しの op が ValueError で拒む。SVG / DXF は既存の text(文字列)、画像は rgbimage。
- L845 — 高さで変わる倍率・ケラレ・ぼけを実光線で。★光線は入射瞳でなく絞りを狙う(入射瞳が無限遠でも動く)。
- L864 — ★1 画素 4 枚 = 各画素で R・G・B(偽色が消える、解像はそのまま)/ 半画素 = 折り返しが消える(開口の MTF は上がらない)。
- L873 — ★新しい型の語は作らない。干渉スペクトル・A スキャン・B スキャンの束は kind の印つきの dict(table)で渡し、 印の違う table は消費する op がすべて ValueError で拒む(oct_interferogram / oct_bscan_spectra / oct_ascan / oct_bscan の 4 種)—— 別の族の table を黙って読む経路が無い。B スキャンの画像だけは image2d(dB)で出し、 界面を辿る op は装置の出力の図(実画像)も同じ image2d で受ける。
- L893 — ★距離は周期 c/(2f) の剰余。高い f ほど細かいが折り返す / 多重反射・縁の混合・高調波・背景光で壊れる。
- L904 — 高 NA の複素像。★新しい型の語は作らない。像の組は kind=”fp_stack” の印つきの table、復元は kind=”fp_result” で、 fp_reconstruct は印の違う table を ValueError で拒む。撮像の入口は振幅と位相の image2d、装置の像の組は volume と 照明の方向余弦 2 本の signal。
- L933 — ★新しい型の語は作らない。曖昧な法線の集合(候補 2 本 / 4 本)を normalmap と 区別するために新 sort を作るかを考えたが、集合は
kind == "sfp_candidates" の dict(= table)で返す: (K,H,W,3) を normalmap と申告すると法線を食う op(積分・ 陰影)に 4 本重ねの配列が渡るが、table なら normalmap の枠には入らず、逆に sfp_disambiguate は印の無い table を ValueError で拒む —— 混ぜても黙って嘘を 返す経路が無いので、語彙を増やす理由が無い(2026-10-13 に確かめて決めた)。
- L939 — ★2-D の橋(tb_*)は架からない: 1 入力の op の in は image2d(sort image、_NEW_SORTS の外) か normalmap / polsweep / table(TYPE_TO_SORT に無い)。_OP_BRIDGE_SKIP 不要。
- L969 — ★新しい型の語は作らない。断面と輸送行列は kind の印つきの dict(table)で渡し、印の無い table は消費する 5 op がすべて ValueError で拒む —— 別の族の table を幾何として黙って 読む経路が無い。パターンと画像は既存の images(2-D 画像の list、fringe の位相シフトと同じ)。
- L972 — ★縞と ToF は 1 つの族(このカテゴリ)にまとめ、sort は分けない。物理は同じ「経路ごとの フェーザの和の偏角」で、op の入出力はどちらも名前つきの値の dict(table)—— 縞は bias [rad] と height_error、ToF は depth / bias [m] と鍵の名前も単位も違い、位置で 並んだ配列を取り違えて渡す経路が無い(混ぜても黙って嘘を返さない)ので語彙を増やす理由が無い。
- L976 — ★2-D の橋(tb_*)は架からない: 1 入力の op の in は table / images(TYPE_TO_SORT に無い)。
- L993 — ★新しい型の語は作らない。パッチの組・解・描画の結果は kind の印つきの dict(table)で、印の無い table は消費する op が ValueError で拒む。多角形は points((V, 3))、放射は signal((N,))。
- L995 — ★2-D の橋(tb_*)は架からない: 1 入力の op の in は table(TYPE_TO_SORT に無い)。
opsphoton.py
- L85 — ★ なお counts は 1-D の float64 配列そのものなので、dsp / funct1d を「呼ぶ」ことは何も妨げられない(型語彙は連鎖ファザーの pool 分離で あって、Python の呼び出し可能性ではない)。逆向きの橋 = signal を 非負化して counts にする経路は下の「橋」注記を参照。 * countrate — SPAD の計数レート列(Hz)(1-D、非負)。counts と同じ 「非負の 1-D」だが、別の量なので別プールにした。理由は 2 つあり、 どちらも実測に基づく: (a) 単位が 7 桁違う。counts プールの値域は 0-250 カウント程度で、 これを spad_deadtime_apply(dead_time_ns=50) に渡すと 250 Hz x 50 ns = 1.25e-5 → 恒等写像に限りなく近い値が 例外なく返る。op は「到達」しても、デッドタイムの物理(飽和、 1/tau の fail-closed、麻痺型の非単射性)は一度も踏まれない。 これは histcube を voxel に相乗りさせたときと同じ 「もっともらしく間違った通過」で、CONTRACT も TYPEMISS も出ない。 (b) 物理が違う。デッドタイムは検出器のレート流に効くのであって、 TCSPC の時間 bin ヒストグラムに bin ごとに掛かるものではない (ヒストグラムに対する正しい歪みモデルは Coates = tcspc_coates_correct)。同じ語彙にすると、進化探索が 「ヒストグラムにデッドタイム補正を掛ける」という物理的に誤った 連鎖を正当な型接続として学習してしまう。 countrate は apply <-> correct の 2 op しか持たない狭い sortである ことを承知のうえで分けている(jones が 2 op、stokes が 3 op なのと同格)。 ただしこの 2 op は互いに厳密逆なので、プール内で往復不変量が回る。 * histcube — 画素ごとの到達時刻ヒストグラム立方体 (H, W, T)、時間軸が 最後。既存の
voxel は「3-D 配列」で TYPE_CHECKS も ndim == 3 だけ なので構造上は通ってしまう。しかし voxel は (D, H, W) の空間格子で、 軸の意味が違う: (D,H,W) のボリュームを histcube として渡すと dtof_cube_depth は W を時間軸と読み、例外ではなく「もっともらしく 間違った深度マップ」を返す(実測: 一様ボリュームで全画素 0.0075 m)。 なお flat な histcube は dtof_cube_depth 側でも empty 判定して黙って 通さない(二重防御)。 橋(狭い sort への対策、実装は未了 = 親の判断待ち): signal -> counts の橋になりうるのは「任意の実数 1-D を非負の光子レート プロファイルとみなして Poisson 標本化する」op(photon_sample の 1-D 版)。 負値の扱いを明示引数にすれば黙った整流にならず規律を破らない。 既存の非負出力 1-D op(funct1d.abs_funct_1d は実測 min 0.0023、 dsp.envelope は実測 min 0.749 で、どちらも非負が保証される)は、その橋が 在れば signal -> counts の自然な前段になる。詳細は報告を参照。
opspiv.py
- L25 — * ★
flow2d を新設した。既存の flow_dense は述語が ndim == 4 and shape[0] == 3(3-D シーンフロー)で、2-D の (2, h, w) はそもそも該当しない。名前を借りると台帳が 「3 成分を返す」と宣言しながら 2 成分を返すことになり、宣言が嘘になる。 型を増やすときの本 repo の条件(「種を持つ op が無ければ永久に未実行に なる」)は満たしている: 生成が 7 op(cross_correlate / multipass / deform_pass / ensemble_correlate / replace_outliers / to_velocity / sample_at_windows)、消費が 13 op(場の量 8・可視化 2・検定 2・評価 3 の重なりを含む)で、族の中で生成と消費が閉じている。
- L35 — ★ 出口(
visualise の 5 op)を必ず持たせている —— 作れるが見られない 型は、連鎖の途中で行き止まりになり「狭い sort」を生む。 両方向の fail-closed も実測で確認済み: reprconv.flow_magnitude に 2-D フローを渡すと ValueError(「(3, D, H, W) を取る」と名指しで拒否)、 piv_vorticity に 3-D シーンフローを渡すと ValueError。 * 入力の画像対は image2d —— 粒子画像は 2-D の実数場そのもので、 既存の 2-D op(平滑化・閾値・背景差し引き・図注)が意味を保ったまま 使える。輝度が [0,1] に収まる保証は無いが、それは astrostack の 合成結果と同じ立場。 * piv_outlier_mask は mask —— bool の 2-D で述語どおり。 dem_stream_network が nan を持つために mask を名乗れなかったのとは 違い、こちらは欠測を True(外れ値)側に畳んであるので bool で閉じる。 * 統計は table(dict)。piv_error_stats / piv_peak_locking。 * 速度への変換 piv_to_velocity の出力も flow2d —— 単位が px/frame から m/s に変わるが型は同じ。ここは正直に書いておく: 型では単位を守れない。だから両方のスケールを必須引数にしてある (demops の cell_size と同じ判断)。単位を型で分ける案も検討したが、 m/s を作る op が 1 本しか無く、消費する op が 1 本も無い型になる ——「証拠が出てから増やす」の順序に反するので採らなかった。
opsprintpath.py
- L54 — ★様式化(2026-09-23)。「きれいな絵」を返す op ではなく、保った量と捨てた 量を数で返す op にする —— 既存の NPR ライブラリは絵しか返さない。真値は モアレ周期の予言(描く前に分かる)、被覆率 w/d の閉形式、既知の縞の向き、 Lloyd の単調減少(既存 stipple_energy が測る)、セル平均の L2 最適性。 点描の 6 op と同じ族に入れたのは、どちらも「濃淡を離散的な墨に落とす」 同じ問題で、入口も出口も同じ語彙(image2d / pairs)だから。
opsrangedoppler.py
- L108 — ★訂正の記録: 本モジュールの初稿は「real では速度の符号が失われる」と 書いていたが、それは誤りだった(レンジ軸だけの 1-D 実信号では 正しいが、2 軸そろうと符号は保持される)。テストが先に破れて発覚した。 実際に失われるのは「対のどちらが本物か」と、振幅の半分と、 一意測距範囲の半分である。
_as_beat_cube が dtype 段階で拒否し、 直し方(解析信号を明示的に作る)を名指しする。 ————————————————————————– 狭い sort にしないための入口と出口(実測済みの教訓への対処) ————————————————————————– 本 repo は 2 つの罠を実際に踏んでいる: ① 産む op が無い型は永久に到達不能 (score が 434 op 中ただ 1 件の blocked だった件)、② 既存プールに相乗り させると毎回 fail-closed で弾かれ「発見ゼロ」に見える(photon 族 7/17 が 未実行だった件)。beatcube は両方に手当てしてある: 入口(beatcube を産む op) : fmcw_beat_simulate(引数のみ、入力型なし) fmcw_window_apply(beatcube -> beatcube) 出口(既存 sort へ戻る op) : range_doppler_map -> image2d(最大プール) fmcw_range_profile -> signal beamform_delay_sum -> signal beamform_doa -> table 入口が「引数だけの源」である点は tcspc_simulate(入力型なし -> counts)と 同じ形なので、連鎖ファザーには counts と同様に 専用の生成器が要る (親への申し送り事項。生成器の実体は報告に実行確認済みで載せてある)。 出口は image2d と signal という本 repo で最大級のプール 2 つに落ちるので、 jones(2 op)や countrate(2 op)のような閉じた狭い sort にはならない。
opsreprconv.py
- L257 — ★
flow は 1 つの述語では書けない。密 (3,D,H,W) と散在 (N,3) が同じ型名で 同居しているため、両方を通す述語にすると何も守らず、片方に決めると既存の 4 op のうちどれかが必ず TYPEMISS になる。分けるのが正しい(video を voxel から分けたのと同じ判断)が、それは既存 op の宣言を書き換える作業で 本モジュールの担当外なので、ここでは提案だけ置く。
opsspc.py
- L91 — ★単位空間の MD² の平均は ちょうど (n-1)/n(導出、当てはめではない)。 教科書の「単位空間の距離は平均 1」を有限標本で正確に言い直したもので、 1.0 を固定する試験はどんな標本でも間違い、(n-1)/n は全部で正しい。
- L120 — ★新しい型の語は作らない。曲線(大きさの格子・POD・下限)も表の列として返す。
- L121 — ★2-D の橋(tb_*)は架からない: 出力の table は backends_typed.TYPE_TO_SORT に 写らないので _OP_BRIDGE_SKIP に入れる必要も無い(2026-10-12 に確認して決めた)。
opsspecular.py
- L160 — ★出力は既存の語彙(images / normalmap / image2d / table)だけ。法線マップは photometric と同じ規約なので integrate_normals(高さ)・render_shaded へ無改造で流れる。装置の幾何は table(rig)で、他の op は rig= で受ける(既定の装置なら省略可)。順方向は高さ場(image2d)→ 縞の鏡像(images)。
opstomography.py
-
| L141 — この台帳に置く。★出力は既存の語彙だけ: スペクトルと μ/ρ(E) は pairs、チャネル・線質・CRLB は table、 チャネルの像と基底の厚みは images (C |
B, H, W)、R 値と実効 Z は image2d。 |
opsvolcolor.py
- L63 — ★ ただし既存
labels 述語は ndim >= 1 で 2-D のラベル画像と 3-D の ラベルボリュームが同居している。本モジュールの 11 op は 2-D を渡されると 全部 ValueError になる(fail-closed)ので、取り違えが黙って通ることは 無い。危険なのは逆で、2-D の種しか無いプールでは 1 度も実行されないまま 「発見ゼロ」に見える —— opsphoton が counts で踏んだ罠と同じ形である。 配線側で 3-D ラベル種を必ず注ぐこと(下の「親が配線するとき」参照)。 * voxel — vol_label_overlay が重ねる元のグレーボリューム、および vol_label_color_flicker が受ける 2 値ボリューム。どちらも (D,H,W) の 既存 voxel 語彙そのもので、新語を作る理由が無い。 * rgbimage — 断面と投影の返り (H,W,3)。既存の rgbimage 消費 op(鏡面分離・ 色変換・保存)がそのまま意味を持って使える。ここが rgbvolume 語彙の出口 なので、新語彙が袋小路にならない。 * matrix — vol_label_palette の返り (n+1, 3)。2-D の実行列そのもの。 * table — 形状統計 / 凡例 / ちらつき測定 / 色付きメッシュの集合。
- L77 — ★ 「色付きメッシュの集合」に新語彙を作らなかったのは実測の結果である。 最初は
colormeshes を足すつもりだったが、既存の table 消費 op を全部 洗って vol_labels_to_meshes の返りを渡したところ(2026-09-02 実測、 ops3d / ops1d / opsmath / opsoptics / opslightfield / opsphoton / opsacoustics / opsinterferometry / opscadmap を横断)、table を食う op は 3 件(abcd_matrix / wavefront_stats / istft)しかなく、3 件とも ValueError で fail-closedだった。つまり「混ぜると黙って間違う」条件を 満たさない。満たさないものに語彙を足すと、消費者ゼロの新語彙 = 袋小路が 1 つ増えるだけである(docs/OP_COMBINATION_MATRIX.md の判断基準)。 なお個々のメッシュを mesh sort として下流へ流したいときは [(m["vertices"], m["faces"]) for m in result] と剥がす —— 色を 捨てる操作なので、adapter で暗黙にはやらない。 ————————————————————————– 新語彙 1 つと、その理由(実測に基づく) ————————————————————————– * rgbvolume — (D, H, W, 3) の色付きボリューム。既存 lightfield の述語は ndim == 4 だけなので、色ボリュームは lightfield を完全に満たす。 実測(2026-09-02、(8, 16, 16, 3) の色ボリュームを lightfield の op へ): - lf_refocus / lf_subaperture / lf_epi / lf_depth_from_focus の 4 op が例外も NaN も出さず (16, 3) の有限な結果を返す (それぞれ「再フォーカス像」「部分開口像」「EPI」「深度」を名乗る)。 z 軸を角度軸 V、y 軸を角度軸 U として読んだ、意味の無い有限値である。 - lf_all_in_focus だけは引数不足で TypeError(型の話ではない)。 逆向き(ライトフィールドを vol_label_slice_rgb へ)は shape[3] != 3 で fail-closed する。安全なのは片側だけなので、実行時チェックには頼れない。 zscan を video から分けたのと同じ判断。 入口 = vol_colorize_labels (labels -> rgbvolume) と vol_label_overlay (voxel + labels -> rgbvolume)、出口 = vol_label_slice_rgb / vol_label_mpr_rgb (-> rgbimage)。産む 2・食う 2 で袋小路にならない。
optdraw.py
- L677 — ★入射瞳が無限遠(物体側テレセン)では近軸の F 値 = EFL / 入射瞳径 が 0 になる —— 意味の無い「F/0.00」を書かない
- L911 — ★上面図は第三角法で側面図と横軸 y を共有するので、センサーの長辺(像の横 = 世界の x)は縦に描かれる。 向きを取り違えないよう、軸の矢印と名前を描く(+X が上)。
optics.py
-
L871 — ★奇数次の微分は奇関数。偶数長の fftfreq はナイキストの -1/2 だけを 持ち対の +1/2 が無いので、そこを残すと実の場の「微分」に虚部が出た (実測 max |
Im |
0.34)。hilbert_x と同じくそのビンを 0 にする。 |
- L887 — ★補集合はここで作る。
1 - lowpass を呼び出し側に作らせると、 境界の扱いが 2 通りに分かれて lowpass + highpass = 1 が崩れる。
- L892 — ★ナイキストのビンを 0 にする。
fftfreq は偶数長で -1/2 だけを 返し、対になる +1/2 が無いので、そこを残すと片側位相が奇対称を 厳密に満たさない(実測: 残差 1.6e-09 → 0 にすると 2.3e-16)。 離散ヒルベルト変換で標準的な扱いで、scipy.signal.hilbert も同じ。
- L2767 — ★縁はモザイクのまま鏡映で 2 画素広げてから抜く。広げ幅が偶数で
reflect (縁の画素を重ねない鏡映)なら 2x2 の位相が保たれる。マスク後の面を伸ばすと 未計測の 0 が縁に写り、一様な場でも縁が暗くなった(実測 16 画素)。
optscene.py
- L2349 — σ = 0.42·λN(Airy 強度の最良ガウス近似)。★ 以前は 0.42·(1.22λN) で 22 % 太かった
- L2749 — ★2026-10-11(台帳契約の門): lens_spec() は image_circle_mm を None で持つ(鍵は在る) ので
.get(.., 0.0) が None を返し、float(None) の生の TypeError が漏れていた —— 下の「image_circle_mm が無い」の ValueError に届いていなかった。
ozakimm.py
- L341 — ★2026-10-07: 行・列の最大値で 2 の冪に先に正規化してからノルムを取る(1e-200 × 1e200 で 二乗がアンダー/オーバーフローし 0 を返していた)。2 の冪の倍率は正確なので通常域の結果はビット同一。
pcseg.py
- L489 — ★
full_matrices=True(既定)は (N, N) の U を確保して捨てる。 2026-09-06 実測: 20000 点で 3.73 s / 3.2 GB、full_matrices=False なら 0.876 ms(4263 倍)で Vt はビット一致。10 万点なら 80 GB で落ちる。 同型が pcseg.fit_plane / measure / ops / camera / pnp3d にもあった (すべて U を捨てている)。静的な門は tests/test_svd_full_matrices.py。
perpetual.py
- L115 — 密度の配色(暗い紺 → 橙 → 生成り)。★赤と緑は対にしない
- L149 — ★
np.add.at は同じことをするが桁違いに遅い(散らばった加算)。 1 次元に畳んで bincount で積むと CI の予算に収まる。
- L315 — ★色を黒でいた時間に結びつける。途中で通っただけのマスと、早くから 黒いままのマスが同じ濃さになるのが「白黒の点」の正体だった。 高速道路は最後にできるので薄く、最初の混沌は濃く出る。
- L326 — ★構図 —— 蟻が触った範囲は盤の一部しかない(既定では 1/3 ほど)。 埋まった範囲の外接箱で切り出さないと、絵の大半が余白になる。
- L341 — ★切り出すと 100 画素角ほどになる。最近傍で伸ばす —— これはセル オートマトンなので、補間すると存在しない中間値を作ってしまう。
- L364 — ★外接箱で枠を使い切る(外接円だと三角形が上下に余白を残す)
- L376 — ★密度をそのまま色に —— 双一次で積み、asinh で暗部を伸ばす
- L470 — ★★平方根には枝が 2 つあり、片方は「親 3 円に接しない円」を返す。 最初は主値だけを使っていて、絵の左上に外円の外へ逃げる円の鎖が 出た —— 絵としては「フラクタルっぽい」ので、見ただけでは欠陥と 分からない。接することを数で確かめて枝を選ぶ。
- L491 — 持ち上げる。★「順位で正規化すれば配り直される」と読んだが外れで、 極小円が多数派なので大きい円が全部下端に潰れ、前より悪くなった。
- L560 — ★点群の外接箱で枠を使い切る(式の定数で決め打ちにしない)
- L582 — ★正規化する前の速さ。色と太さをこれに結びつける(飾りでなく量)。
- L636 — ★色は濃度 v に結びつける(単調な配色なので順位が保たれる)
- L877 — ★二項係数そのものを積むと C(62,31)*31 が int64 を黙って溢れる。 要るのは偶奇だけなので、リュカの定理の帰結 「C(n,k) が奇 ⟺ (n & k) == k」を使う(桁あふれの余地が無い)。
- L897 — ★向きの符号は回転の規約で変わる。定理が言うのは「周期 104 で同じ斜めの 変位を繰り返す」ことなので、そちらを門にする(大きさは縦横とも 2)。
- L904 — ★高速道路は正味で 104 歩あたりちょうど 12 マス黒を増やす(実測で整数)。 最初は「104 歩で 52 マス」と書いたが実測 0.114/歩 と合わず、測り直して 12/104 = 0.11538 だった。周期の中で塗っては消すので、正味はずっと少ない。
- L921 — ★★描いた円が本当に接しているか。平方根の枝を選び損ねると、 絵としては「フラクタルっぽい」まま外へ逃げる鎖が出る(実際に出した)。
photometric.py
-
L98 — ★2026-10-02: 以前は np.sign(nz) * 1e-6 + 1e-12 で、nz がちょうど 0(真横を向く法線)のとき np.sign(0) = 0 になり分母が 1e-12 → p = -1e12 を返していた(±1e-6 で抑えるつもりが効かない)。 0 は正の側に寄せる。真横の法線の勾配は本来無限大で、ここでは |
p |
, |
q |
≤ 1e6 に抑えた値になる。 |
pipeline3d.py
-
L45 — ★2026-10-02: 以前は符号なし距離 distance_point_plane( |
d |
)で PV = max |
d |
− min |
d |
を出しており、 平面の両側に散る点では PV を桁で過小に報告した(±h の 2 層で真の 2h·cosθ = 0.0188 に対し 0.0020)。 平面度の PV は符号つき残差の山と谷の差。RMS は 2 乗なので元から正しかった。 |
pivops.py
- L506 — ★ 相関の峰が立たない窓(テクスチャが無い・全面一様)は nan を返す —— 0 を返さないのは「動いていない」と「分からない」を混ぜないため。 だが何割が nan なのかは返り値からしか分からず、
flow.mean() が nan になって初めて気づく形だった(2026-09-06)。ここで数える。 実測: 一様な背景に 16x16 の四角だけの画像では 98 窓中 16 窓しか 有限にならない(0.163)。全面テクスチャなら 1.000。
pnp3d.py
- L241 — ★2026-10-07 レビュー修正: 旧式は回転ブロックに -[Xc]x(= t も回す更新の微分)を使い、 実際の更新(t は回さない)と食い違っていた。初期値が良いほど収束が線形に遅くなり、 30 反復で最小に届かないことがあった(重心中心化した DLT 初期値で 50 反復要した)。
- L309 — ★2026-10-07 レビュー修正: 世界原点から遠い点群(オフセット 1e4、画素ノイズ 0.5 px)で DLT の脱正規化 M = T2⁻¹·Pn·T3 の並進列が桁落ちし、t が壊れた初期値から LM が 回転誤差 175° の別解へ落ちていた。入口で重心 c を引いて解き、最後に t − R·c で戻す (Xc = R(X − c) + t’ = R X + (t’ − R c))。
polish.py
- L435 — ★2026-10-05 chain_fuzz の 2 回目の発見(ttc_from_scale → raster_wipe_area): 面積の 4 項が有限でも、N 本の和(N·single)と 一筆の y 座標((i − (N−1)/2)·pitch)はまだ溢れうる。区切りの NaN 以外に非有限が出たら黙って返さない
pose_quat.py
- L190 — ★2026-10-07 レビュー修正: ry = ±90°(ジンバルロック)では R[2,1], R[2,2], R[1,0], R[0,0] が どれも丸め屑になり、rx, rz を屑の atan2 で決めていた(ry=90° ちょうどで行列の往復誤差 0.16)。 cos(ry) = hypot(R[0,0], R[1,0]) が √ε 未満なら rx と rz は和/差しか決まらないので rx = 0 に 固定し、rz を残りの成分から取る(R[0,1] = −sin rz, R[1,1] = cos rz が ±90° の両方で成り立つ)。
- L291 — ★2026-10-07 レビュー修正: 符号を w の正負で揃えると、w≈0 をまたぐ組(yaw +179° と −179°)が 反対の半球に分かれ、平均が恒等(0°)に潰れた。最初の四元数を基準に、内積が負のものを反転する。
-
| L425 — ★2026-10-07 レビュー修正: 回転が無い(純並進)と sin(θ/2)=0 で割れず、旧実装は 軸 0・並進 0 を返して並進を丸ごと失った。qr = ±1 なら qd = ±(0, t/2) なので t = 2·sign(w)·qd[1:]、軸 = t/ |
t |
、d = |
t |
(並進も無ければ軸 0・d 0)。 |
ppf.py
- L126 — ★ 素の PCA 法線は符号が任意で、回転すると 4 割の点で裏返る。PPF の 特徴は法線どうしの角度なので、裏返れば鍵が変わる。実測(400 点、 z 軸まわり): 素の法線だと鍵の一致率が 0/37/90/143 度で 100 / 73.6 / 69.4 / 67.2 %、向き付き法線なら すべて 100 %。
pointcloud.fpfh が踏んでいたのと同じ穴で、同じ日に一緒に直した。
printpath.py
- L45 — 様式化(npr、2026-09-23)。★test_printpath の門が
set(OPSPRINTPATH) == set(__all__) - {定数} を要求するので、 台帳とここの両方に書く必要がある。
- L185 — ★2026-10-07: 行番号 N123 とチェックサム *71 を外す(外さないと N が命令に見え、その行の移動が黙って落ちた)
- L195 — ★2026-10-07: G の無い座標だけの行(modal な移動)などは黙って捨てず拒否する
- L209 — ★2026-10-07: 以前は黙って無視され、直後の G91 の相対量が絶対座標として読まれていた 軸は数値なしでも書ける(
G28 X Y)ので、数値つきの語でなく文字そのものを見る
- L231 — ★2026-10-07: 始点未定の軸への相対移動は未定のまま(以前は相対量を絶対座標として読んだ)
- L717 — ★ペンプロッタの経路と 3D プリンタの経路は同じ対象(順に回る線分の列)で、 # 出口も同じ(contours_to_gcode → gcode_write / gcode_time_estimate)。 # だから族を新しく立てず、ここに stroke カテゴリとして足す。 # 参考: Kaplan & Bosch, “TSP Art”, Computational Aesthetics 2005。 # ————————————————————————— # 点描の距離。”euclidean” 以外は将来。
- L818 — ★画素ごとの最近傍をKD 木で引く。以前は各反復で (画素 x 点) の距離行列を まるごと作っていたので、202x300 の絵に 9,000 点を置くだけで 60,600 x 9,000 = 5.5 億要素(4.4 GB 相当)を 18 回組み直していた —— 手元で 101 秒、共有ランナーでは PoC の実行門(1 本 600 秒)に迫る。KD 木は厳密に同じ最近傍を返すので答えは 変わらない(同距離の並びだけは実装依存になるため、種を固定した回帰検査を置く)。
- L1034 — ★被覆率で塗る。整数画素の円板で塗っていたときはペン幅が階段になり (0.5 / 1.0 / 1.5 px がインク率 0.1900 で一致し、2.0 で 0.4853 へ跳ねた)、 「目標の濃さに合うペン幅」を解くことができなかった。画素中心から標本までの 距離で被覆率を出すと、ペン幅が連続なノブになる。
- L1076 — ★2026-10-07: 反射の詰め物を手で切ると r ≥ 辺の長さで足りず出力が縮んだ((8, 12), σ=3 → (4, 12))。 np.pad の reflect は繰り返し反射するので形が保たれる(r < 辺の長さでは従来と同じ値)
- L1086 — ★「きれいな絵」を返す op ではなく、保った量と捨てた量を数で返す op にする。 既存の NPR ライブラリは絵しか返さない —— 差はそこ。真値はモアレ周期の予言、 被覆率 w/d の閉形式、既知の縞の向き、Lloyd の単調減少(既存 stipple_energy が 測る)、セル平均が L2 最適であること。 ————————————————————————- #
- L1297 — ★ストロークを構造に沿わせるなら、縞の周波数ベクトルはその 直交方向に向ける(線は周波数ベクトルに直交に走る)。 この 90 度を入れ忘れていて、docstring は「沿う」と書きながら 実装は「横切る」だった —— 既知の角度の縞を渡す門で掴んだ (2026-09-23)。絵を見るだけではどちらも「それらしい線」に見える。
problems.py
- L147 — ★決定的な大域シャッフル(基点を固定し、train/holdout/locked が同じ置換を索引する)を、seed の役割で鍵付けした 3 つの互いに素な帯に分ける(evolve.run は train=seed·holdout=seed+10000·locked=seed+20000 を引くので、seed//10000 mod 3 が帯を選ぶ)。旧来の
off = seed % pool は、pool が 10000 を割り切るときは常に 3 つの窓を同じフレームへ潰していた —— train↔holdout↔locked の沈黙のリークで、train に過適合した champion が「純粋な holdout で手作りに勝った」ように見えていた。純粋な 3 分割には pool >= 3n が要る。それより小さい pool では綺麗な holdout を作れないので、黙ってリークするより拒否する。
profileops.py
- L270 — ★ 最初は「曲率が大きいほう」で書いて、NACA 2412 で後縁を前縁と判定した。 3 点円の曲率は、上下面がほぼ接する後縁で前縁の丸みより大きく出る —— 「前縁は丸い」という直観が、輪郭上の 3 点で測ると逆転する。
- L277 — ★ 後縁が開いていると、最遠 2 点は後縁の角の片方を拾って弦が傾く。 隙間の中点に取り直してから、前縁を「その中点から最も遠い点」に決める。 これをやらないと対称翼でもキャンバーが後縁の半隙間ぶん出る(実測 0.001257)。
- L643 — ★ 合わせる前に同じ取り方で取り直す。弦の枠(とくに後縁の中点)は点の 置き方にわずかに依存するので、生の輪郭と取り直した輪郭を突き合わせると、 同一の形でも 0.02 度の回転と 7.8e-4 の並進が入る —— それがそのまま 偏差の床(実測 rms 6.05e-4)になっていた。比べるものは同じ土俵に載せる。
- L654 — ★ 点対点ではなく点対折れ線で測る。等弧長に取り直しても両者の位相は 一致しないので、対応を番号で取ると位相のずれがそのまま偏差になる (実測: 同じ形を自分と比べて rms 6.05e-4 —— 検出したい欠陥と同じ桁)。
pxrd.py
-
| L976 — ★2026-10-07: 補正で割った値 v = I / c の分散は I / c² = |
v |
/ c(補正を σ に通さないと 2θ=55° で σ を 2.3 倍小さく見積もった) |
raster.py
- L222 — ★ /iinfo.max put a signed image in [-1, 1] (int16 -32768 -> -1.00003)
- L280 — ★2026-10-24: imageio (Pillow) returns a 16-bit RGB/RGBA/gray+alpha PNG as uint8 without an error. Read the declared depth from the IHDR and, when it is > 8, try the depth-keeping reader (OpenCV IMREAD_UNCHANGED) first.
raytrace.py
-
| L925 — ★2026-10-18(lensfile の第 2 実装との照合で発覚): 以前は「 |
t |
の小さい方」を選んでいた。光線が前の面から 出て、球の z 範囲の中から始まる(R < 0 の面が長い空気間隔の後にある望遠型など)と、後ろ側の球面 (t < 0)を拾い、全光線が「けられ」に化けていた(R = −14.5 の面の 26 mm 手前から y = 3 の光線が NaN)。 物理的な交点は頂点を含む葉 —— sag の式の枝で (1+k)·c·z = 1 − √(1 − (1+k)c²r²) ≤ 1 —— の上にある。 その葉の上の根だけを候補にし、両方が乗るとき(双曲面など)に |
t |
の小さい方を取る。 |
- L1226 — ★2026-10-14: 以前は bfl(無限遠の物体の焦点)を使い、有限物体でも像面を無限遠の焦点に置いていた (700 mm の物体で像は 51.39 mm なのに 47.71 mm、W20 −18 波の偽のぼけ)。近軸の像距離は無限遠なら bfl と同じ。
- L1240 — ★2026-10-15: 像面とほぼ平行・逆向きに進む光線は像面に届かない —— 無効にする。以前は傾いた鏡(tilt 45°)の後で D_z ≈ 1e-17 の光線が巨大な有限の点になり、spot_stats が rms 3.4e18 mm・n_vignetted 0 を返した (傾きは「その面だけ」の摂動で、光軸は折れない。折り返しは raytrace3d の fold_mirror で組む)。
raytrace3d.py
- L652 — ★光線が像面とほぼ平行・逆向き(像面の +z へ進まない)なら像面に届かない —— 無効にする。 以前の raytrace は傾いた鏡の後で D_z ≈ 1e-17 の光線を巨大な有限の点(rms 3e18 mm)として有効に数えた。
- L657 — ★局所座標は傾いた像面そのものの基底で取る(以前は傾けない座標系へ射影し、傾けた向きが cos θ’ 倍に縮んでいた)
realdata.py
- L38 — ★公開する図に使ってよいのは
public の列が真のものだけ。 研究・教育目的の引用付き利用に留めるものは cite を持つ。
- L97 — ★skimage は同梱の部分集合しか持っておらず、残りは実行時に pooch で取りに行く。取りに行けないものはこの repo では使わない (PoC が回線に依存すると、落ちた理由が実装かネットワークか 分からなくなる)。
render3d.py
- L1946 — ★極小曲面は平均曲率 H が至るところ 0 の曲面。既存
vertex_curvature が まさにそれを測るので、「これは極小曲面だ」という主張を、作り方を知らない op
- L1948 — が採点する。★カテノイドとヘリコイドは等長なのでガウス曲率 K が一致するが、 それは必要条件にすぎない —— 門にするのは H のほう。 ————————————————————————- #
- L2153 — ★marching cubes は面積 0 の三角形を出す(格子点をちょうど通る等値面で、 2 頂点が同じ位置に来る)。曲率 op はそれを正しく拒否するので、ここで落とす —— 黙って渡すと「曲率が定義できない」と下流で落ち、原因がここだと分からない。
- L2215 — ★平行移動フレームで掃く(フレネ枠を使わない —— 直線部で法線が定義できず、 変曲点で従法線が反転して管がねじれる)。真値は、円を中心線にすると トーラスになり体積 2 pi^2 R r^2・表面積 4 pi^2 R r が解析解であること。 ————————————————————————- #
reprconv.py
- L149 — ★ 整数 dtype への変換は キャストの前に 生の値を検査する。 敵対的検査で見つけた穴(2026-09-02):
np.asarray(nan, dtype=int64) は 例外を出さず INT_MIN を返し、キャスト後は dtype.kind == 'i' なので 下の非有限検査を素通りする。3.7 のような非整数も黙って 3 に切り詰まる —— 添字が 1 ずれた結果が、例外もなく返る。まさに変換 op の嘘そのもの。
- L1076 — ★ 実バグの回帰点。最初ここを
np.maximum(sigma, finfo.tiny) にしていた。 重複点で sigma = 2.2e-308 になり、gaussians_to_voxel の sigma ** 3 が アンダーフローで 0 になって 0 除算 -> NaN。 「0 を避けた」つもりが、下流で NaN を生む値に置き換えていた (例外も出ないまま体積の一部が NaN になる = 黙って間違う典型)。 重複点は「間隔が測れない」のだから、番兵で埋めずに fail-closed にする。
residue.py
- L336 — ★2026-10-07: [lo, hi) に候補が 1 つも無い標本は範囲外の値・score -inf・margin 2.0(最大の確信)を 返していた → 値と score は NaN、margin 0(residue_fault_locate の「決められない = NaN」と同じ約束)。
- L614 — ★2026-10-07: 範囲内に候補が無い画素は margin 0(= valid にしない)。値は warp 用に有限のまま残す。
-
| L698 — ★2026-10-07: refine 後に |
d |
が探索範囲 max_disp を越えた画素は黙って切らず valid=False にする。 |
roughness.py
- L55 — ★規格の文面どおりの ±λc/2(= 2.67 σ)は裾の 0.8 % を落とし、カットオフでの透過率を 0.5 でなく 0.5095 にする(2026-10-18 に実測して直した。α の定数も標本化の正規化も正しく、 原因は打ち切りだけだった)。4 σ まで取ると λc で 0.5 に 1e-4 台まで合う。
- L978 — ★2 は入れない: 局所二次の中心値の等価核は
G(u)(3/2 - u²/(2σ²)) になり、透過率が (1+x)exp(-x), x = ln2 (λc f)² へ変わって λc で 85 % になる(= 規格のカットオフ定義と 食い違う)。次数 0/1 の内部は同じ核なので、カットオフの意味が保たれる。
rust/fullseye_core/examples/python_ctypes.py
- L42 — ★第 5 引数 fs_dtype_t。2026-09-14 までヘッダにだけ在って実装と FFI 宣言に 無かった引数。ctypes は引数の数を検査しないので、抜けても黙って動く。
sample_data.py
- L147 — ★入れた理由: 展示 111-113 で「合成は自分が知っている壊れ方しか作れない」 (実写 6 本で 9 件の不具合が出た前例)ことが改めて出た。PoC はオフラインで 閉じたまま、実データに差し替える入口だけを台帳に置く。 commercial=”check” 以上は源のページを読んでから使うこと。
scale.py
- L54 — ★2026-09-17: 検査のタイル幅を 64/16 だけから 60/12 も見るように広げたら、 tile_safe と宣言されていた 168 本のうち 16 本が割れた。64 も 16 も 8 の 倍数なので、周期 8 の処理と、たまたま境界が穴に掛からない領域処理が すり抜けていた。以下はそのとき測って落ちたもの(誤差は 60/12 での実測)。
- L86 — ★2026-09-17: 走査長平滑化は隙間を最大 65 画素まで埋めるので、 標準タイラーの halo より広い。60/12 のタイルで 0.2613 ずれた(実測)。
- L89 — ★2026-09-17: 局所の二峰性は窓が最大 41 画素、傾き補正は角度を画像全体から 1 つ決める。どちらもタイルごとに測ると別の答えになる(実測 1.0000)。
- L185 — ★名前つきの理由はカテゴリの分岐より先に引く。category が先に返してしまうと、 幾何カテゴリの op はすべて「cv2 の座標上限」と説明されてしまい、実際の理由 (deskew なら「角度は画像全体から 1 つ決まる」)に辿り着けない。この辞書に 載っているのは実測で非タイル可と分かった op だけなので、載せた op 以外の 分類は 1 件も変わらない(2026-09-17 に 925 op 全数で確認)。
scene_registry.py
- L19 — ★配布物にローカル絶対パスを焼き込まない。ここは自分のマシンの作業物を指していた ので、他人が pip install した環境では黙って落ちる(しかも「場面が無い」ではなく 「その場面だけ静かに欠ける」形で)。環境変数で受け、未設定ならその場面を登録しない = 在ると偽らない。
loco_mujoco は入っていれば自分で在り処を知っているので探す。
sdf_ops.py
- L346 — ★足した理由は実測:
poc_dfm_thickness_overhang と poc_cad_scan_deviation が # 「機械部品は円筒穴・面取り・フィレットでできているのに、プリミティブが球と # 直方体しか無いので CSG で組めない」と報告し、両方とも面ごとの解析式を自前で # 書いていた。ここにある 4 つはすべて閉形式で厳密(外側は最近表面までの # ユークリッド距離、内側は最近面までの負値)なので、真値を持つ合成部品を # CSG だけで組めるようになる。 # ————————————————————————— #
segcompare.py
- L216 — ★2026-10-07: 43*0.1/0.1 = 42.99999999999999 → floor で 1 voxel 手前に落ちた(spacing 0.1 で 1000 個中 47 個)。 整数のごく近く(相対 1e-9)は整数に寄せてから floor
sensitivity.py
- L396 — ★2026-10-15: 生きた列(影響ゼロでない列)が 1 本以下なら、組み合わせが 1 つも無いので交絡は定義上ない (以前は max_subset の範囲 2..2 に 1 が入って ValueError で落ちた。simcal で σ = 0 のボケの列が 0 になって踏んだ)。
- L418 — ★大きさの等しい項の順と符号の基準は丸めの屑で決めない(simcal._fmt_combo と同じ、2026-10-15 に CI の Linux でだけ順が入れ替わった)。1e-6 で丸めて比べ、同点は宣言順。
shapestats.py
- L557 — ★2026-10-07 レビュー修正: 中点がほぼ一直線(2 番目の広がりが 1 番目の 1e-3 未満) または一点だと、面は直線まわりに決まらず vt[-1] は雑音で決まる(真の面から 90 度 ずれうる)。中点の面の法線が左→右の平均ベクトルと 60 度以上食い違う場合も、鏡映面と して左右の対と矛盾する。どちらも左→右の平均ベクトルの、中点の主方向に直交する成分を 法線にする(面の位置は従来どおり中点の重心)。それも決まらなければ ValueError。
simcal.py
-
| L938 — ★同じ大きさの項(利得 × 照明のように |
e |
が等しい組)の順と「主の項」は、丸めの屑で決めない。 argmax / argsort は 1e-16 の差で入れ替わり、Windows では “illum^1 * gain^1”、CI の Linux では “gain^1 * illum^1” になった(2026-10-15)。大きさを 1e-6 の相対で丸めて比べ、同点は宣言順。 |
-
| L967 — ★重みは自然な座標(e· |
列 |
)なので、単位の違う項が混ざると指数が大きくなりうる(8 次の多項式の係数と利得: 2026-10-18 に exp が溢れた)。対数のまま ln_product も返し、積は溢れたら inf / 0 にする(落とさない)。 |
spc.py
- L426 — ★管理図と工程能力は「工程のばらつき」を見るが、その数字は測定のばらつきを 含んだままである。ゲージ R&R は総変動を「部品差」と「測る行為の差」に分け、 後者が前者を食っていないかを見る —— 工程能力の前に来るべき検査で、ここが 抜けていると「工程が暴れている」と読んだものが実は測定器だったという取り違えが 起きる。GUM は同じ問いを 1 回の測定について立て、成分ごとの不確かさを 合成する。どちらも閉形式で、照合できる恒等式を持つ。 =========================================================================== #
- L733 — ★どのモデルで出した数字かを必ず載せる(黙って切り替えない)
- L1042 — ★★破綻は警告でなく構造で返す。感度係数がすべて 0 になると、入力に 不確かさがあるのに合成不確かさが 0 になる —— 規格の比較損失の例 (
dY = X1^2 + X2^2 を x_i = 0 で評価)がまさにこれで、 c_i = 2 x_i = 0 だから 1 次近似は「不確かさゼロ」と答える。数式としては 正しいが測定の主張としては嘘で、モンテカルロは同じ状況で u = 50e-6 を返す。0 を返すこと自体は止めない(それが伝播則の答えなので)が、 guf_valid=False と invalid_reasons=["stationary_point"] を結果に 同伴させる。警告にすると握りつぶされ、呼んだ側は「測定が完璧だった」と読む。
- L1051 — ★この検出条件そのものは本実装の判断であって、規格が列挙したものではない。 規格が定めるのは線形モデルの 3 条件(Welch-Satterthwaite の適用可否 / 有限自由度の入力が独立であること / 出力分布が正規または t で近似できること)と 非線形モデルの 5 条件(最良推定値の近傍で連続微分可能 / 適切な次数の全微分で 成立 / 高次項に関わる入力が独立 / その分布が正規 / 落とした高次項が無視できる) で、「感度が全部 0」「区間が定義域を出る」という判定手順は書かれていない。 ここで実装したのは、その条件が破れたときに観測される形のほうである —— 停留点は高次項が支配する特殊例、負側への張り出しは正規近似の破綻の現れ。
- L1062 — ★停留点 = 不確かさのある入力の 1 次感度がすべて0(高次項が支配する)。 感度が非 0 なのに分散が 0 なのは、相関による厳密な打ち消し (X1 = X2 で Y = X1 - X2)で、u = 0 が正しい答え —— 妥当として note を付ける。
- L1073 — ★破綻は警告でなく構造で返す(警告は握りつぶされる/ログに消える)
- L1104 — ★ NaN は
nu <= 0 をすり抜け、下の isfinite で「無限大」扱いになっていた (dof=[4, nan] で nu_eff 16 = 自由度を水増しし k を小さく)。欠測は拒否する。
- L1121 — ★規格は「nu_eff が整数でなければ次に小さい整数へ切り捨ててから t を引く」 ことを要求する(安全側に倒すため)。16.64 のまま引くと k = 2.1132、 切り捨てて 16 で引くと 2.1199 —— 公表例題の 2.12 は後者。0.3 % の差だが、 拡張不確かさは報告書に載る数字なので規格どおりに倒す。切り捨て前の値も
dof_effective に残す(どこで丸めたかが見えないと追えない)。
- L1151 — ★区間が定義域を出たら、それは測定の主張でなく近似の破綻。 比較損失(二乗の和)は構成上非負なのに、規格の例題では伝播則の 95 % 区間が [-96, +296]e-6 と負側へ張り出す。伝播則は出力を正規と見なすので 境界を知らない —— 知っているのは呼ぶ側だけなので、境界を渡されたときに 限って検査する(既定で勝手に 0 を下限と仮定はしない)。
- L1530 — ★”no spread” is not “std == 0.0”. A column holding one repeated value leaves rounding dust behind: 4.2 stored 200 times gives std = 1.3e-14, not zero (measured). Dividing by that dust amplifies it into a distance of nonsense, and the absolute test never fires. Put the floor at the relative scale of the column, below which a spread cannot be represented in the data itself.
- L1562 — ★ std = 1 alone does NOT make a flat feature “contribute nothing”: a new observation that leaves the flat value is scored in raw units, so the same physical data in mm vs um gave MD 1.73 vs 1732 (2026-10-07 review). Zero its row and column of the inverse correlation instead — then its z drops out of z’ R^-1 z whatever the new value is.
- L1673 — ★A unit space given in part is the dangerous case: the missing piece would be silently estimated from the very data under test, so a drifted batch would score itself as normal. Refuse instead.
specops.py
- L811 — ★これは染色と撮像系の両方に依存する値で、万能の定数ではない —— 自前のスライドで定量するなら、単染色のスライドを撮って :func:
stain_vectors_from_patches で測り直すこと。
- L843 — ★3 本目は「残り」。2 本だけだと 2x3 で逆行列が無く、擬似逆を使うと 残差が黙って 2 本へ配られる。直交な 3 本目を立てて、行き場のない 密度をそこに集める(= あとで残差として読める)。
spectralrad.py
- L576 — ★既定の溶融石英(SILICA、Malitson の分散式)は材料表に k が無く、厚さは効かない —— 内部の吸収を入れたいなら k を持つ硝材の名前と厚さを渡す(材料表の glass の類)。
studio.py
- L349 — ★2026-10-03: GIF を QPixmap で読むと 1 コマ目しか出なかった(例の図の 1/4 は掃引 GIF)。QMovie で回す。
- L358 — ★図そのものを右クリック(ユーザー 2026-09-06:「図で表示したものを 右クリックしてクリップボードにコピーできるといいね」)。この repo の Studio UI 規約 —— 表示系は右クリックからも一通りできること。 下のボタン列と同じことができる(どちらか一方にしない)。
- L1550 — ★2026-10-03: (2, h, w) を “color” と判定し、描けずに前の画像が残っていた。
-
| L1560 — ★2026-10-03: 複素数は虚部を黙って捨てた min/max を出していた。 |
z |
で数える |
- L1583 — ★2026-10-03: dict は中身に関係なく「輪郭 0 本」と表示していた。台帳の op(~1,700 本)の大半は {“distance”: …, “t”: …} のような表を返すので、全部「輪郭 0 本」に見えていた。 輪郭(
cs を持つ)以外は表として、欄ごとに何が入っているかを出す。
- L1594 — ★2026-10-03: 空の配列は「先頭の値」を取りに行って IndexError、4 次元以上は先頭の 1 値を スカラーとして見せていた(台帳の op を Studio から走らせて踏んだ)。
- L2187 — ★ヘルプの「開けるファイル」表の正本(2026-10-03、ユーザー指摘「ヘルプにも機能として書いておいたほうがいい」)。 各行 = (分類キー, 何で開くか, 拡張子, 補足)。文字列は英語 =
tr のキー。拡張子は上の定数から引くので 定数に足せば表にも出る。表から漏れた拡張子・分類と違う行は tests/test_studio_dragdrop_formats.py の門が落とす。
- L6430 — ★2026-10-21: 走っている/終わりかけの実行ワーカーを静止させてから閉じる。QThread が 走ったまま親ごと破棄されると Qt は abort し、CI では「全件合格のあと exit 134」になる。
- L6987 — ★順位(2026-09-19、GenSpark 第 10 報 N17): 「canny」で先頭に edges_color(説明文に canny を含む)が 来て、Enter で挿入する op を取り違えやすかった。名前の完全一致 → 前方一致 → 名前に含む → HALCON 名 → 説明文だけ、の順に並べる(同順位は登録順のまま)。
- L9254 — ★fallback は画面に出す(2026-09-19、GenSpark 第 10 報 N16): グレー画像に edges_color(color 入力)を Run once すると、ライブラリは台帳に記録して sort の既定値を返すが、GUI は「ran … once」としか 言わなかった。結果の窓には既定値が映っているので、それを結果だと思わせてはいけない。
- L10327 — ★図の受け皿。例は
examplefig 経由でここへ PNG を書く。環境変数を 渡さない実行(CLI)では 1 枚も書かれないので、ギャラリーから 走らせたときだけ絵が出る(例の数値と速度は変わらない)。
- L10483 — ★図の受け皿。例は
examplefig 経由でここへ PNG を書く。環境変数を 渡さない実行(CLI)では 1 枚も書かれないので、ギャラリーから 走らせたときだけ絵が出る(例の数値と速度は変わらない)。
- L11360 — ★実行キー(F5 / Ctrl+Return / Ctrl+R)は「いま書いてあるものを走らせる」(2026-09-19、GenSpark 第 8 報 N13): Program に未適用の編集があるのに実行キーを押すと古いパイプラインが走り、画面は 「● unapplied edits」のまま何も変わらなかった(Xvfb + xdotool の実測、s8 → s9 が同一画面)。 先に Apply し、Apply が通らなければ(構文エラー等は Program の状態表示に出る)走らせない。
- L12260 — ★パスで渡すと sim_source は拡張子 .xml の時だけファイルと読み、.urdf / .mjcf はXML の文字列と 取り違えて「XML parse error」になった(2026-10-03 のテストで発見)。モデルはここでパスから作る。
- L12333 — ★2026-10-03: 3DGS の学習結果(.ply に f_dc/opacity、または .splat)は、以前は普通の点群として 色無しで開いていた。ガウスの中心を 0 次の球面調和の色で出す(不透明度 5% 未満は落とす)。 楕円体の描画ではなく中心の点 —— 形を見る用(splat の見た目そのものは gs_render)。
- L12336 — ★2026-10-03(ユーザー「Physical AI で使われるデータ形式も読んで表示」): glTF / LAS・LAZ / MJCF・URDF。 読み手は既存(meshio_opt / sim_source)で、依存は任意(無ければ pip の名前つきで断る)。
- L13825 — ★2026-10-03(ユーザー「画像をドラッグ・アンド・ドロップして見れる」「Python スクリプトも D&D で開ける方が便利」): 以前は 1 本目しか見ず、.py は「未対応」だった。種類ごとに全部さばく: 画像 1 枚 = 入力として読む(従来どおり)、2 枚以上やフォルダ = 画像ビューアで並べる、 .py = Python エディタのタブ、.json = パイプライン。
- L13844 — ★モデル + qpos 軌跡 (T, nq) を一緒に落とすと再生(nq が 3 や 6 だと点群と見分けがつかないので、 モデルと一緒に落とされた .npy は形に関係なく軌跡として読む)
- L14886 — ★2026-09-20(GenSpark 第 43 報 N154):
fullseye-studio --help が表示の無い Linux で SIGABRT。QApplication を作る前に –help / –version を答え、表示が無ければ Qt を起こさず 1 文で止まる(abort は説明にならない)。
studio_result.py
- L48 — ★2026-10-04: bool の配列(占有格子など、台帳の op が返す)は np.round が bool へ書き戻せず落ちた —— bool はそのまま二値
superquadric.py
- L182 — ★2026-10-07: 0 点の平均残差は 0/0(NaN を guard が置き換えていた)
tacsim.py
- L385 — ★既定の探索半径は窓の縁まで(双線形 ±0.5 px の余白に 2 px)。2026-10-05 までは窓の半分の半分(0.5 × 縁までの距離)で 打ち切っていて、201 px の窓では 50 px で止まり、半径 61 px の実機の接触を 49 px と答えた(tacscalib の門 12: −12.9 px)。 tacsim の合成(256 px・Hertz)は接触が窓の 1/4 より内側なので、直しても結果は 1 桁も変わらない。
- L422 — ★2026-10-07: 窓の端までの距離は中心から測る(原点 = 窓の中心と仮定していて、X・Y・中心を +8 mm ずらすと δ が 11 % 縮んだ)
- L506 — ★2026-10-07: a0 が 20 % 超ずれると黄金分割が区間の端 0.8·a0 / 1.2·a0 をそのまま返していた。端に張り付いたら その端を新しい a0 にして画素の選び(縁の除外の輪)ごとやり直す。8 回で内側に収まらなければ ValueError
tests/conftest.py
- L28 — ★Studio の設定をセッション全体で使い捨て ini へ逃がす。 # ————————————————————————— #
QSettings("Fullseye", "Studio") はネイティブ格納庫(Windows ならレジストリ HKCU\Software\Fullseye\Studio)に書く。隔離を個々のテストファイルに置いて いたので、置き忘れたファイルから利用者の実レジストリが汚れていた。 2026-09-05 の監査で実害を確認: recent_files 10 件のうち 8 件が pytest の 一時パス、system\operator_timeout_ms などの実値も残っていた。 (隔離は 3 ファイル中 2 つにしかなく、test_studio_params.py が素通しだった。) 個別に足すのをやめ、セッション autouse でここに 1 つだけ置く。 環境変数は studio._settings() が見る唯一の入口なので、これで全テストが覆われる。
- L44 — ★optional backend が要るテストの宣言。 # ————————————————————————— # CI の注記には長らく「torch/kornia は入れない(対応テストは graceful skip)」と 書いてあったが、2026-09-05 の実測でそれは事実ではなかった —— 対象テストは skip せず
ImportError: this operator needs the optional 'torch' backend で 落ちていた(14 件)。注記だけがあって、それを機械で確かめる仕組みが無かった。 ここで宣言を 1 つの入口にまとめる。狙いは 両方向: * backend が無い環境 → skip(注記を事実にする) * backend が在るはずの環境 → skip を許さず失敗させる (FULLSEYE_REQUIRE_OPTIONAL=1。CI の py3.11 ジョブがこれを立てる) 片方向だけだと、本物の回帰が静かに skip へ化ける (feedback_failsoft_hides_permanently_dead_ops と同じ形)。
- L192 — ★2026-09-14 追加。ここまで探針バンクは 6 sort しか無く、901 op のうち 151 本 (16.8 %)が契約ゲート 3 本(例外を投げない / 非有限を出さない / 決定的)を 一度も実行されていなかった ——
PROBELESS_OPS_BUDGET = 151 というラチェットで 本数だけ凍結し、「本来の直しは BANKS を全 in_sort へ広げること」と自分で書いて あった。その本来の直しをここで入れる。 形の出どころは推測ではない: backends_bridge._EMPTY_OF が 12 sort すべての 正準の最小値を宣言しており(そこが sort の定義そのもの)、problems.py の _points_stack / _signal_stack などが実データの作り方を持っている。 各バンクは既存の作法に合わせ、普通の値・定数 0・定数 1・退化形を混ぜる (定数と退化形が「走った」と「意味のある出力」を分ける —— [[feedback_ran_is_not_meaningful_output]])。 ————————————————————————— #
- L215 — ★点群は連結なものと非連結なものの両方を置く。
tb_geodesic_distances が 不達を inf で表すのは契約どおりで、ops.NONFINITE_IS_MEANINGFUL に 「1.0 に潰すと『届かない』が『近い』に化ける」と宣言済み。 ここで一度 normal をわざと連結にして有限性ゲートを緑にしかけたが、 それは欠陥を隠す方向だった —— 直すべきは門が台帳を見ていないこと。 normal は橋でつないだ現実的な形、two_clusters は非連結を撃つ探針。
- L282 — ★特異行列は必ず置く。 一度ここから外しかけたが、それは誤りだった ——
tb_mat_cond が特異行列で inf を返すのは契約どおりで、ops.py の NONFINITE_IS_MEANINGFUL に「厳密に特異な行列は s_min=0 なので inf が 正しい答え。有限に潰すと『十分に良条件』と読めてしまう」と既に宣言済み だった。落ちていたのは op ではなく、有限性ゲートがその台帳を見ていない こと。探針を削って緑にするのは、欠陥を隠す行為。 (同じ註に 2026-09-05 の教訓が書いてある ——「自分の probe では特異行列を 作っていなかったので tb_mat_cond を取りこぼした」。探針から外すのは その取りこぼしをわざと再現することになる。)
- L400 — ★新規(2026-09-14): ここまで探針が無く、契約ゲートを一度も通っていなかった 5 sort = 101 op。残る 6 sort(video / qimage / cimage / lightfield / beatcube = 50 op)は形が複素・4-D で退化形の設計に手間が要るため、 一度に全部入れて切り分け不能にしないよう次の段で足す。
- L408 — ★第 3 段(2026-09-17): 戻りの橋
feature_to_img が入るまで、feature を 入力に取る op は 1 本も無かった(作る op は 125 本ある)。門が「探針の 無い op が 1 本に増えた」と正しく落ちて教えた。
- L453 — ★2026-10-07: ここに
return があり、上の docstring(sort 既定の帯を捨てない) に反して override のある 10 op は sort 既定の帯を一度も通っていなかった。 sort 既定は「拒否が明示の fail-closed で記録される」ことの検査として通す (test_op_contracts.KNOWN_FALLS_BACK_ON_EDGE に by-design として載る)。
tests/test_abi_apply.py
- L78 — ★target dir は 別に切る。最初は
target/release(既定)に建ててそこから直接ロードして いたが、同じプロセスで後に走る test_rust_abi_parity.py が cargo build --release (feature なし)で同じ DLL を書き換えようとし、ロード済みでロックされているので ビルドに失敗 → 36 件が黙って SKIP になった([[feedback_zero_findings_may_mean_never_executed]])。 建てる場所を分け、ロードは tmp へのコピーから行う。
- L49 — ★このパーサは「タグから最初の
; まで」を宣言とみなす。だからタグと 宣言のあいだに ; を含む散文があると、宣言が見つからず collection 中に 死ぬ —— そして pytest はファイル 1 つの collection エラーで スイート全体を中断する(2026-09-14 実測: Interrupted: 1 error during collection で 12,000 件が 1 件も走らず、それでも runner の exit code は 0)。 [[feedback_test_import_kills_collection]] と同じ族なので、何が悪くて どう直すかをここで言う。黙って「malformed」とだけ言うと、壊した本人が ヘッダの書式規則に気づけない。
- L234 — ★2026-09-14:
FsValueError を足した。それまで例外は 2 種しか無く、 種の違う失敗が同じ status に潰れていた —— 逆さの区間は契約では FS_E_INVALID_ARG なのに FsTypeError(= FS_E_TYPE)を投げていた。 差分テストが「どちらも拒否した」までしか見ていなかったので素通りした。
tests/test_abi_signatures_match.py
- L82 — ★
[A] + [B] * 3 のような式で書かれた argtypes がある。最初この形を 数えられず fs_measure_all を「1 引数」と誤読して門が 3 件赤になった —— 門のパーサが弱いのを実装の欠陥と読まない。 行末までを 1 宣言として 取り、[...] の各塊の要素数に * N の倍数を掛けて合計する。
- L180 — ★
cl に .h を直接渡してはいけない —— MSVC は拡張子で言語を決めるので 「ソースファイルの種類は認識できません」と警告だけ出して rc=0 を返す。 検査が 1 行も走っていないのに緑になる、最悪の形 ([[feedback_ran_is_not_meaningful_output]]。2026-09-14 に実際そう読みかけた)。 #include する小さな .c / .cpp を作って /Zs(構文検査のみ)を掛ける。
- L190 — ★引用は 1 段も挟まない。
subprocess にリストで渡すと Python が 引数を再クォートし、内側の " が \" に化けて cmd に届く (実測のエラー: '\"C:\Program Files...\vcvars64.bat\"' は認識されて いません)。バッチファイルに書き出して、それを叩くのが確実。
tests/test_acquire_contract.py
- L45 — ★「開く実装が在る」と「入っていないときに何を入れればよいか言う」は別。 上の門は opener の存在を見るが、SDK が無い機械で呼ばれたときに何と言うかは 見ていなかった。2026-09-25 に接続の 3 層(protocol / image source / driver)を 揃えたとき、
comm は cclink に「install ‘None’」と言い、device は 9 driver に 入口すら持っていなかった。同じ問いに答える層は、同じ約束をすること。
- L166 — 16.003663…**。★「16 倍」と書いて落ちた —— 器の幅と有効ビットの比は 2^4 ではなく (2^16-1)/(2^12-1) で、1 桁目から違う。
- L300 — ★「次は ## デバイス制御」と決め打ちしていたため、あいだに節を 1 つ足した だけでその表の行まで backend 行として読んでしまった(2026-09-24)。 節の終わりは次の見出しであって、特定の見出しの名前ではない。
- L323 — ★「見つける」は「開く」とは別の問い。1 列にまとめていたせいで、 開けるのに一覧に出てこない zed / kinect が表では ✓ のままだった (2026-09-25)。列の中身は AST から数えた実際の分岐と突き合わせる。
- L437 — ★ここまでの門は「acquire が持っている綴り」からしか数えていない。規格の全数を 分母に置くと、そもそも知らない形式が見つかる —— 実際これで 10 bit 非詰めの Bayer 4 形式が丸ごと抜けていた(2026-09-24)。台帳は EMVA が無償公開している 「GenICam Pixel Format Names and Values」の単板 59 形式。
- L484 — ★最初ここに「詰め形式は容器 = 有効」と書いて、この門に捕まった。実際は 2 通りある: (a) 10/12/14 bit の非詰めが 16 bit 容器に入る場合と、 (b) grouped(GigE Vision 1.x の
Packed)の 10 bit が 12 bit に 入る場合 —— 2 画素 = 3 バイトなので 1 画素あたり 12 bit になる。 真の lsb packed(p)だけが容器 = 有効。
- L516 — ★機能名はベンダの名前ではなく規格の名前なので、1 本の語彙表で GenTL を出す 全ベンダを覆える。だからこの層は「どのベンダの SDK を入れたか」と無関係に 検査できる —— 模擬ノードマップで足りる。実機が無いことは言い訳にならない。
- L678 — ★SDK のバッファを指したまま返すと、次の 1 枚が前の 1 枚を書き換える。 例外は出ない —— 絵だけが入れ替わるので、連写を保存して初めて気づく。 実機が要る経路なので実行では確かめられない。ソースで確かめる。
- L716 — ★複製が要らない backend と、その理由。黙って外さない。
- L772 — ★SDK を採点したのと同じ物差しで自分も採点する。違う物差しで測った数を 並べると「SDK より厚い」が意味を失う。しかも自己申告にしない —— 各軸が どの入口で満たされているかを実在する名前で名指しし、門がそれを引く。
- L821 — ★列挙軸の一番大きな穴はここだった。
_enumerate("genicam") は [] を返していて、 GenTL を出す全ベンダを覆える唯一の経路だけが列挙できない状態だった。 GenTL 1.6 が「プロデューサのインストーラは GENICAM_GENTL{32/64}_PATH に自分を 足す」と決めているので、こちらはその変数を読めばよく、ベンダごとの表は要らない。 実機も SDK も無しで検査できる —— 変数と .cti という名前のファイルがあればよい。
- L875 — ★
__all__ は「何を公開したか」の一次情報(dir() は環境で変わる)。だから 本体が増えたのに __all__ が増えない、という遅れは静かに起きる —— 実際に 2026-09-25 まで 7 つ足りていなかった(追記のつもりが当たっていなかった)。 門は台帳側でなく本体側から数える。
- L947 — ★
opencv backend が開くのは UVC の装置。その規格が制御の名前と、いくつかは 単位まで決めている。単位が SFNC と違うので、換算を往復で確かめる —— 100 倍の係数を書き忘れても例外は出ず、露光だけが狂う。
- L1162 — ★門そのものを呼んで、本当に落ちることを確かめる(式の真似ではなく)。
tests/test_annotate_bold_italic.py
- L59 — ★重ね打ちは横にだけ太る。上下に太る縁取りだと和文のふところが埋まる (2026-09-09 実測: 11pt の「量 値 面積」が黒い塊になった)。
tests/test_aoi.py
- L145 — ★平均は保たれない(被写体と感度に相関があるとずれる)。実測 8.9 %。
tests/test_api.py
- L226 — ★台帳をまるごと外すと「層が現れない」で落ちる —— この門が見張る事故そのもの。
tests/test_astrostack.py
- L1053 — ★2026-09-08: 3 つ目の戻り値 vote_margin(2 番手の山 / 1 番手)が増えた。 星野なら山は 1 つなので小さいはず —— それもここで固定する。
tests/test_backends_typed.py
- L71 — ★2026-10-07:
or True で無効化されていた。実測 936 op / 重複 0 —— 主張は成り立つので門に戻す
tests/test_backends_typed_liveness.py
- L57 — ★この 1 本については記録が 3 つあった —— ここ、
gen_op_figures.DOMAIN_MISMATCH、 そして op 自身の 0/60 という実測。それでも「登録されているのに一度も走らない」状態は 続いていた。知っていることと、判定に使っていることは別(KNOWN_ISSUES §42)。
- L129 — ★2026-10-07: 探針を作れず
_live_report が検査せずに飛ばす tb_* op の台帳 {op: 理由}。 以前は skipped を返すだけで誰も見ておらず、探針の無い op は生死の検査を黙って抜けた。
- L725 — ★2026-10-07: 例外で抜けた組は検査していない —— 何組を実際に見たかに下限を置く (実測 159 op × 5 入力 = 795 組、例外 0)。
tests/test_blob2d.py
- L443 — ★物体が 3 つとも別の形であること。同じ形を並べた種だと circularity も holes も全部同じ値になり、「どのノブでも同じ数を返す op」を見逃す。
tests/test_caltab.py
- L121 — ★ゲートが発火するかは環境依存なので主張しない。値が隠されず返ることだけ見る。
tests/test_capabilities.py
- L167 — ★2026-09-24 に見つけた穴: 既存の門は frontmatter の
ops: に書いた名前が実在 するかは見るが、本文のコードは一度も実行していなかった。だから measure_pos(img, row=32, col0=0, col1=127)(実際の引数は測定線ハンドル)、 fs.frame_align([a, b])(実際は (reference, frame) の 2 引数)、 fs.ledger.blob_count(mask)(blob_count は台帳ではなく 2-D の進化 op)が 3 本とも走らないまま出荷されていた。名前の実在と呼び方の正しさは別物で、 前者だけの門は後者に構造的に盲目([[feedback_registered_only_gates_miss_unregistered]])。 走らないことが正しい例もある —— 利用者自身の写真や校正板の角点が要るもの。 それは理由つきで名指しする。名指しの無いものが 1 本でも落ちたら赤。 「ファイルが無いから仕方ない」を既定にすると、呼び方の誤りがそこに紛れる。
- L183 — ★2026-09-25:
io は例のなかで fs.open_driver("io-memory") から開く ようにしたので、免除の理由はロット画像だけに縮んだ。
tests/test_chain_type_contracts.py
- L222 — だけなので、格子も積分時間も最小で足りる。★二重スリットは「縞が 3 本 入らない」と fail-closed するので、スクリーンの幅と分離を検証済みの 組み合わせ(550 nm / 200 um / 200 mm / 5 um 画素)で渡す。
tests/test_ci_wheel_check_paths.py
- L68 — ★returncode は見ない。この検査の対象は引数の解決であって、 wheel の中身ではない。中身の判定は環境に依存する —— 実測 2026-09-05: PYTHONPATH でソースを見せている環境だと、スクリプトが repo 直下を sys.path から外す仕様のせいで一部モジュールが import できず NG になる (pip install した環境では起きない)。ここで returncode を見ていたため、 Linux でこの検査が「パス解決の問題」に見える形で落ちていた。
tests/test_collection_sizes.py
- L65 — ★OPS3D は {op 名: メタデータ dict} の平坦な表。
sum(len(v) for v in values()) と数えると各 op のメタデータのキー数の総和(2,492)になり、意味の無い 数字を台帳に刻むところだった(2026-09-08、書く前に構造を見て気づいた)。
- L85 — ★2026-09-25 追加: 通信の名簿(
comm.protocols)は数えていたのに、 駆動の名簿は数えていなかった。接続の 3 層(protocol / image source / driver)のうち 1 つだけ見ていない状態で、 driver が 1 行消えても誰も気づかない。
- L91 — ★2026-09-08 追加: 説明を貯める 2 つの台帳。説明ほど静かに減るので ここで数える(docs/CAPABILITIES.md と docs/HARDENING.md の元)。
tests/test_comm.py
- L135 — ★1 本だけ見る門は、1 本だけしか守らない。 ここには長いあいだ
test_cataloged_protocol_gives_install_hint が在り、ethernet-ip の断り文句 1 本だけを見ていた。その陰で cclink は 「install ‘None’ and use the None client directly」と答えていた —— pip 名も import 名も持たない 1 行が、場合分けの外に落ちていたからである ([[feedback_one_probe_input_is_not_coverage]])。全数で見る。
- L141 — ★「相手が居ない」は「扉が無い」ではない(device 側で先に踏んだ): native な protocol は本当に繋ぎに行くので、
OSError は扉が在る証拠として通す。
- L209 — ★捕まえられない例外は、無いのと同じ。
fullseye.open_channel は facade に 在るのに、それが投げる CommError は 2026-09-25 まで facade に無く、利用者は 内部モジュール名 comm を import しないと except に書けなかった。 1 つずつ足すのではなくクラスごと閉じる —— __all__ が公開の一次情報で、 そこに在って facade に無い名前は、書いた本人しか使えない。
- L214 — ★免除は理由つきで名指しする。
comm.register(protocol の登録)を facade に 出したら、既に在った fullseye.register(点群のレジストレーション op)を 上書きした —— 出荷していれば利用者の点群処理が静かに別物になっていた (2026-09-25、既存の例の門が捕まえた)。同名は譲らず、内部名で使う。
tests/test_connectivity_doc.py
- L96 — ★ここは長いあいだ
あり(= その lib が import できるか)の欄で、 機械ごとに違うので門が見られなかった —— 誰も検査しない欄が表に 1 列在る状態だった(しかも中身は kind == native の写しで、pyserial を 入れた機械では嘘になる)。2026-09-25 に「実装」(Fullseye 自身が開けるか) へ替えた。版で決まるので、どの機械でも同じ答えになる。
- L168 — ★入口の名前は実装の台帳から引く。表に手で書いた名前が古くなると、 「証拠が消えた対応済み」になる。
- L213 — ★門を壊して確かめる —— 「通るだけの門」と「何も見ていない門」は区別できない。 (節, 壊し方, 期待する文言)。壊すのは表の側で、判定は本物の関数を呼ぶ。
- L222 — ★実際に踏んだ形 —— 名簿には載るが開けない driver を「開ける」と書く。
- L352 — ★名簿が「在る」と言うのと、開けるのは別の問いだった。2026-09-25 まで
capabilities() の available 1 欄が両方を兼ねており、dynamixel_sdk を入れた 機械では available: True なのに open_driver("dynamixel") は「その SDK を直接 使え」と断った —— 読んだ人は「対応済み」と受け取る。acquire は既に implemented / available を分けて持っていたので、先に正しかった層の語に 合わせた。ここではその欄が実際の口の振る舞いと一致することを見る。
- L73 — ★2026-10-07: 0 サイズ入力で本体が NaN/Inf を出し、guard が記録して置き換えている op。
test_no_op_returns_a_non_finite_value_for_an_empty_input は guard 越しの戻り値だけを 見ていたので、置き換え後の有限値しか見えず、この 16 op の 0/0 を一度も捕まえていなかった (docstring の「0 除算の検出器」は空振りしていた)。台帳(source=output)で数える。 いずれも空配列の縮約(平均・比・最大)を素直に書いた形 —— 明示の拒否にするのが筋(bug-suspect)。
- L78 — ★2026-10-07 同日に 16 → 0。内訳: 9 op(area_frac / gray_histo_abs / intensity / sk_blur_effect / hx_estimate_* 4 本 / tb_superquadric_residual)は本体の 0/0 を明示の ValueError に、 残る tb_* 7 本は本体は既に正しく拒否していて、橋の後始末
backends_typed._fallback が 空配列の平均 = NaN を返していた(空なら 0.0 に直した)。器は残す —— 次に見つけたらここへ。
- L89 — ★スカラに「0 要素」は無い(2026-09-17、戻りの橋
feature_to_img で feature が初めて入力になったときに気づいた)。この門が探している のは 0/0 なので、空配列の代わりに分母を 0 にする値 0.0 を渡す。
- L147 — ★2026-10-07: 例外で抜けた op は戻り値を検査していない —— 母数が黙って縮まないよう下限を置く
- L208 — ★2026-10-07: 例外で抜けた組は検査していない —— 下限(実測 1738 / 1738)
- L244 — ★2026-10-07: 母数の下限。注意 —— guard は FloatingPointError も握って fallback にする (実測 36 op)ので、ここの FloatingPointError 枝には guard 越しでは来ない。 0/0 が外へ出る op は test_no_op_returns_a_non_finite_value_for_an_empty_input の KNOWN_NONFINITE_ON_EMPTY_INPUT(台帳の source=output)が捕まえる。
- L306 — ★2026-10-07: 以前は呼ぶ前に数えていたので、全 op が例外で抜けても n > 700 で緑だった
- L315 — ★ここが厄介なのは、このテストが守っている不具合は Windows では再現しないこと。 2026-09-05 実測: Linux(Ubuntu 24.04 / py3.12 / PyPI wheel)で 3 op が退化入力に 対して SIGSEGV。同じ入力を Windows に流しても 1 件も落ちなかった。 だから「ローカルが緑」は根拠にならず、台帳が正しく効いているかを 両方の環境で確かめられる形にしておく必要がある。 ————————————————————————— #
- L322 — ★
ops.NATIVE_CRASHES_ON_DEGENERATE の対照。本体と 1:1 で一致していなければ ならない。片方だけ変えると落ちる —— 本体から消すのも、本体に足すのも、 ここを同時に書き換える(= 人が意図を確認する)ことを要求する。 なぜ対照が要るか: 門の変異テスト(2026-09-05)で、本体から cv_cc_count を消しても 「台帳の op はみな関門を持つ」を見るテストはそのまま通った。台帳から消えた op は ループの対象からも消えるので、検査経路ごと無くなる。守っている SIGSEGV は Linux 専用で、Windows では偶然まともな値が返るから最後の砦も働かない。 独立した情報源(このセット)との等価だけが、両方向を Windows でも捕まえる。 test_the_two_nonfinite_ledgers_agree と同じ形。
tests/test_demops.py
- L440 — ★ 返りは常に (N, 3)。スカラを渡しても (3,) ではなく (1, 3) になる —— 台帳が points = (N, 3) と宣言しているため(2026-09-06、ファザーの TYPEMISS で食い違いが露見して実装を宣言に合わせた)。
- L755 — ★ 旧日本測地系に近い 3 パラメータでは、同じ緯度経度が地上で数百 m 動く
tests/test_derived_headlines_2026_10_07.py
- L58 — ★2026-10-07(CI で判明): registry の op 数は入っている backend で変わる(py3.10/3.12 の CI は 910)。 見出し(上)は同梱の名前表だけで決まるので常に照合し、registry 行は完全な registry の環境でだけ照合する。
tests/test_device_open_driver.py
- L36 — ★「相手が居ない」は「扉が無い」ではない。 この門を最初に書いたとき、
io-modbus が ConnectionRefusedError で落ちて 1 件挙がった —— が、それは 「PLC に届く口が在って、線の先に誰も居なかった」ということで、口が無いのとは 正反対である。だから「この install が実際に開ける driver」からの OSError は通す。一緒くたにすると、門は CI に PLC を繋げと要求し始める —— 繋がりようの ない要求をする門は、やがて外される。
- L83 — ★pip も import 名も持たない driver は名簿に無い(在れば、その行が 「何も分からない行」なので、ここで落ちてよい)。
tests/test_device_register_driver.py
- L135 — ★台帳の門は
len(device.drivers()) を数える —— 登録は runtime でそこに 入るので、後片付けを忘れた試験が 1 本あるだけで台帳の門が落ちる (しかも落ちるのは別のファイルなので、原因が遠くなる)。
- L142 — ★★数だけ見る門は差し替えに盲目。
dynamixel を自前のもので置き換えても 行は 12 のままなので、台帳の門は緑のまま通る。中身(何が implemented か) まで見て初めて、登録が残っていないと言える。
tests/test_docs_index_numbers.py
- L37 — ★op 集合は環境で変わる(Linux CI は torch/kornia/mahotas/xfeatures2d が無く 859 op、手元は 885)。手元で生成した文書と生きたレジストリを比べる検査は 満杯の環境でだけ意味を持つ —— test_opdocs と同じ規約で、揃っていなければ skip(理由に欠けている backend 名が出る)。2026-09-07 の CI で 22 件が これで落ちた。環境に依らない検査(ファイルの実在・中身の量・図の実在)は そのまま走る。
tests/test_docs_index_reachable.py
- L42 — ★op 集合は環境で変わる(Linux CI は torch/kornia/mahotas/xfeatures2d が無く 859 op、手元は 885)。手元で生成した文書と生きたレジストリを比べる検査は 満杯の環境でだけ意味を持つ —— test_opdocs と同じ規約で、揃っていなければ skip(理由に欠けている backend 名が出る)。2026-09-07 の CI で 22 件が これで落ちた。環境に依らない検査(ファイルの実在・中身の量・図の実在)は そのまま走る。
- L80 — ★Markdown 記法だけ見ると足りない。
docs/GALLERY.md は表の中で <img src="..."> を 14 か所使っており、素朴な ]( の走査では 1 つも 見えない(Codex の敵対的レビューで判明、2026-09-06)。生の HTML も見る。
- L189 — ★マーカーの重複を許すと、古い表がもう 1 つ残ったまま緑になる。 生成器は最初の start〜end しか書き換えないので、2 つ目は永久に古いまま 公開され続ける(Codex の敵対的レビュー、2026-09-06)。
- L210 — ★「20 行あって 4 つの次元名が見える」で通していたが、それでは数百 op 落ちても緑になる(Codex の敵対的レビュー、2026-09-06)。次元ごとの 実数と 1 つ残らず突き合わせる。
- L249 — ★どこが違うかを出す。出さないと、全体スイートでだけ落ちる ような順序依存(レジストリ汚染など)を追えない。
- L312 — ★件数と名前だけでは、型の契約(in_sort/out_sort)・カテゴリ・HALCON 対応・ tier が丸ごと古いまま緑になる(Codex の敵対的レビュー、2026-09-06)。 RAG は型が繋がる op を選ぶのに in_sort/out_sort を読むので、そこが古いと 繋がらない鎖を自信満々に提案する。中身ごと突き合わせる。
- L400 — ★日本語版だけを見ていた門を 6 言語に広げた(2026-09-16)。
local_std を足した ときに ja/en/ko/tw/zh が 1,947 のまま落ちたが、de は落ちなかった —— ドイツ語の桁区切りはピリオドで 1.947 と書くため、"{:,}" では一致も 不一致も見えない。門が 1 言語にしか立っていないと、他の 5 言語は黙って腐る。
- L467 — ★生成物が「中身か」を見る —— 一致だけ見る門は、両方が空でも緑になる # ————————————————————————— # 2026-09-06 の実測。下回ったら落ちる(上げるのは自由)。
tests/test_docs_no_local_paths.py
- L36 — ★区切りは 1 つとも 2 つとも書かれる —— JSON の中では区切りが二重になる。 一重の形だけ見ていたので 2026-09-25 に二重の形を丸ごと見落とした (最大の漏れが公開 JSON の 164 か所だった)。
- L39 — ★ここに綴りの例を書かないこと。この門は自分のコメントも読むので、 例として書いたパスがそのまま違反になる(実際に一度そうなった)。
- L41 — ★
e:\n のようなエスケープ列と LaTeX の q:\, は道ではない —— 区切りの次が n/r/t で語が続かないもの、道に使えない文字で始まるものは外す。
tests/test_dsp.py
- L341 — ★最大は高調波: period / (1/f_max_bin) が整数の近くに来る
- L371 — ★どれも閉形式の真値を持つので、「動いた」でなく「理論値と合う」で検査する。 ————————————————————————— #
tests/test_dualxray.py
- L178 — ★探針で見つけた: Pb 50 mm の e^{-130} を正規化して「ふつうのスペクトル」を返していた
tests/test_dynsys.py
- L112 — ★残差の正体は burn-in 。短い burn での誤差は 3 倍以上大きい。
- L123 — ★r の列を1 本だけ選ぶ。横に幅を持たせると、隣の r の不動点が 別の柝に見えて r = 2.9 でも「3 本」になる(一度それで誤判定した)。
- L66 — ★mesh_to_voxel は points_to_voxel が optional の torch を要る。CI には torch が無いので 拒否の確認(上)だけ走らせ、通常入力の実行は torch のある環境に限る。
tests/test_example_names_do_not_shadow.py
- L46 — ★2026-10-07(同日): 範囲を 2 つ広げる。 # ————————————————————————— #
tests/test_example_scripts_run.py
- L48 — ★2026-09-09、この門を入れた最初の CI で 7 本が py3.12 で落ちた(py3.11 は緑)。 CI は意図的に py3.11 だけ torch / kornia / mahotas / opencv-contrib を入れ、 他の版では入れない。テスト側には
requires_backend という宣言の仕組みが既に あったのに、例を走らせる門にはそれが無かった —— 仕組みがあることと、 全経路が通っていることは別。 gallery2d_* は「その族の op を全部動かす」ギャラリーなので、契約そのものが どの backend が入っているかに依存する(op 名を直書きしてレジストリと突き合わせ、 1 つでも欠けると「OPS に余分」で落ちる)。だから族ごと宣言する。残り 2 本は torch を直に使う(fit_zernike / match_logpolar_z)。 完全環境(CI の py3.11、FULLSEYE_REQUIRE_OPTIONAL=1)では skip が失敗に なるので、宣言の付け過ぎも付け忘れも両方向で落ちる。
- L87 — ★PYTHONPATH を渡さない(この門の要点)。利用者は環境変数を設定しない。
- L126 — ★2026-10-07: 以前は全例を走らせていた。session fixture はセッションごと(CI のシャードごと・ xdist のワーカーごと)に作られるので、CI では 4 シャード × 3 版 = 12 回、全例を走らせていた (シャードあたり 21〜41 分、run 37474292595)。手元の -n 6 では 6 ワーカーがそれぞれ全例を WORKERS 並列で回し、最大 48 本が同時に走って単独 207 秒の quickstart が 600 秒を超えていた。 いまは (1) xdist のワーカーでは引かれた 1 本だけを走らせ、並列は xdist に任せる (2) それ以外(CI のシャード)では、このセッションに残ったテストの分だけをまとめて並列に走らせる。
tests/test_fallback_names_identify_the_op.py
- L60 — ★2026-10-07: 台帳は 256 件の環状バッファ。溢れると
fallbacks() は新しい 256 件しか返さず、 下の「名前が潰れていない」「実在の op 名」は一部だけを見て緑になる(実測 186 件・溢れ 0)。
tests/test_features_do_not_saturate_2026_09_26.py
- L82 — ★族は6 つ。対称な矩形だけだと、対称性で消える特徴(奇数次モーメント)や 穴を数える特徴(オイラー数)が原理的に動かず、「潰れている」と区別できない。
- L93 — ★どの族でも一定で、それが正しい op。理由つきで名指しし、下の試験が 「本当にまだ一定か」を確かめる —— 動くようになったら外させられる。
tests/test_fix_op_name_and_range_2026_09_02.py
- L75 — ★2026-10-07: [0,1] を外れるが、まだ
ops.UNIT_RANGE_IS_NOT_THE_CONTRACT にも載らず 正規化もされていない image op(所有者の判断待ち)。conftest.inputs_for が override の ある op にも sort 既定の帯を返すようにして見つかった。
- L78 — ★2026-10-07 同日に空になった:
tb_normals_to_egi(拡張ガウス像の計数、最大 48)は橋の出口で 総数で割って割合([0,1]、和 1)にした(backends_typed._egi_counts_to_fraction。公開関数 reprconv.normals_to_egi は計数のまま)。器は残す —— 次に見つけたらここへ。
tests/test_flyvision.py
- L328 — ★ The MTF identity is a small-footprint approximation and is NOT claimed
- L329 — ★ far from the optical axis: at ~35 deg elevation the measured transfer
- L330 — ★ already departs from exp(-…) by more than the on-axis tolerance. This
- L331 — ★ assert pins that hole so a future “curvature-corrected” resample has a
- L332 — ★ failing test to turn green rather than a silent regression to argue about.
tests/test_four_f_2026_09_26.py
- L202 — ★ナイキストのビンを 0 にしたので、この対称性は 1e-16 台で成り立つ
- L288 — この一覧に門がある種類。★
FOURIER_PLANE_KINDS に足したらここも足す。
- L383 — ★2026-10-07: 以前は finally で
sys.path.pop(0) していたが、読み込んだ PoC 自身が repo 直下を 先頭に足すので、pop で消えるのはrepo 直下の方で、examples/ がワーカーの終わりまで先頭に残った (event_camera の取り違えと同じ型の漏れ)。丸ごと保存して戻す。
tests/test_fslib.py
- L330 — backend 横断の一致 —— ★2026-09-14 に実際に壊れていたところ ————————————————————————— #
tests/test_fullseye_3dgs.py
- L78 — ★道具の有無と資産の有無は別。ここは mujoco の有無だけを見ていたので、 Menagerie が無い環境では
scene_registry.resolve() が返す None を掴んで TypeError になった。同ファイルの test_scene_resolution_via_registry は 既に資産の skip を持っており、作法が兄弟に適用されていなかった。
tests/test_gaits.py
- L99 — ★2026-09-14: ここは
resolve() の戻りを検査せず spec["xml"] を引いていた。 scene_registry が実在しない場面に None を返す設計(資産が無い環境では 正しい振る舞い)なので、資産チェックアウトが無いと TypeError で落ちる。 同じファイル群の test_fullseye_3dgs.py は既にこの skip 作法を持っていた —— 作法が兄弟に適用されていなかった ([[feedback_same_bug_class_recurs_check_siblings]])。
tests/test_gen_poc_viewer.py
- L366 — ★2026-10-30: 運動拡大の掃引は振幅を 40 倍にしても指標が 3.93 -> 3.97 で平らだった(64 px 用の読み出しを 160 px の動画に当てていた)。つまみを動かしても絵も指標も変わらないビューアは偽物なので止める。
tests/test_generative.py
- L66 — ★ head を変えると画布の幅も変わる(矢羽根の置き場が要る)ので、 2 枚を直接重ねることはできない。軸の長さで比べる。
- L84 — ★ std() は平均を引くので、定数でも 1 ulp 残る(実測 5.6e-17)。 「全部同じ値」を厳密に言うなら ptp(最大 − 最小)。
- L111 — ★ ptp なら厳密。本物の辺があれば 0.85 前後になる量なので、門は十分厳しい。
- L132 — ★許容を 1 つにまとめない。閉形式で厳密に出るものと、再帰で誤差が積もる ものを同じ物差しで見ると、どちらかの門が甘くなる。接触だけは深さ 5 の 再帰の末端なので相対 1e-5(実測 9.2e-07)。
tests/test_glassmirror.py
- L91 — ★直感と逆だった: 「銅は金より赤い」と思って cu[2] < au[2] を書いたら落ちた。 公開値でも Au の R(450 nm) ≈ 0.40 に対し Cu ≈ 0.56 で、青は銅の方が多い (= 金の方が飽和した黄色)。表ではなくこちらの思い込みが誤りだった。
- L175 — ★ 波長を第 1 引数にした理由(台帳の「先頭がデータ」規約)。配列を頂角へ 渡すと以前は素の TypeError が出ていた。
tests/test_glyphops.py
- L256 — ★bbox は描いた後のインクから取る。PIL の text() は書体の ascent 分だけ 下げて描くので、指定した座標をそのまま bbox にすると字が縦にはみ出し、 無事な字まで「遠い」と出る(実測 0.058〜0.110、床 0.058)。
- L348 — ★ここで検査するのは 閉形式で言い切れること だけにしてある。 端から端まで(受理率・誤検出)の証拠は repo の外の実写 12 枚で取った (repo の外に置いた実写一式、正本 = glyph コーパスの curated/140)。 合成の場面を 1 枚こしらえて「動いた」と言うのはやめた —— 候補の生成は 局所標準偏差の分位点で切るので背景がざらついていることを要求し、四隅の 精密化は背景の勾配が小さいことを要求する。実写はその両方を満たすが、 素朴な合成(一様乱数の背景)はどちらか片方しか満たせず、合成で緑にすると 「合成に合わせた実装」になってしまう。
- L483 — ★比(中央値 ÷ 床)は環境で動く(Windows 3 書体 1.90 / CI noto-cjk 2.45)ので、 境にしないし、ここでも値を断言しない。載っていることだけ見る。
tests/test_graphinv.py
- L248 — 非正方の画像は形の検査で止まる。★正方の画像は重み行列と区別できない(全画素 > 0 なら 全結合として数える)—— 入力が配線であることは呼び手の責任で、op は形しか確かめられない
tests/test_halcon_named_shape_factors_2026_09_26.py
- L277 — ★同名なのに HALCON と別の量を返すもの。直す予定のものだけをここに書き、 「本当にまだ違う」ことを下の試験が確かめる(直ったら台帳から外させる)。
- L280 — ★2026-09-26:
elliptic_axis と diameter_region はここから外れた —— ユーザー 判断で「寸法を持つ特徴も HALCON と同じ画素値で返す」と決まり、量もスケールも 合わせたため(docs/KNOWN_ISSUES.md §51 は解決)。台帳を空にしても門は残す: 次に「まだ合わせていないもの」が出たとき、ここに名指しで載せる場所が要る。
tests/test_honest_summary_arithmetic.py
- L41 — 「無ければ理由を言って skip」にする —— ★2026-09-08 の CI がここで赤に なった: 手元にあるものを CI にも在ると思い込むと、手元だけ緑になる (
feedback_gate_computed_a_verdict_then_discarded_it と同じ型)。
tests/test_imgforensics.py
- L1064 — ★2026-10-18: 以前は float の [0,1] をそのまま渡し、古い Pillow がバイト列を読み替えて黙って通していた (Pillow 13 で発覚)。本物の 8 bit に直してから JPEG を通す。
tests/test_kendama_combo.py
- L21 — ★2026-10-02: 以前は examples/ を sys.path の先頭に入れっぱなしにしていた。同じ xdist ワーカーで後から
import event_camera した test_sensor_sims が、ルートの event_camera.py でなく同名の examples/event_camera.py(デモ)を拾い run_event_demo が無いと落ちた(ワーカーへの振り分け次第で出る)。 PoC はファイルから直接読み、sys.path を汚さない。
tests/test_knob_b_options.py
- L41 — 歴史側で試す点。★0.5 を含める —— 0.5 は「まん中」として既定値に使われて いる(
api.apply の既定、studio の中央、保存済みプログラムの初期値)ので、 ここが新しい側に落ちると既定のまま呼んだだけで答えが変わる。 最初 b < 0.5 で切ったら、gaussian と HALCON 別名の一致検査まで割れた。
tests/test_ledger_contracts.py
- L55 — ★同日の 2 回目: 探針側の builder(
ledger_contracts.probe_builders)で 2,055 / CI 相当 2,019 に上がったので床も上げた(床を据え置くと、builder が黙って外れても気づけない)。
- L61 — ★空入力(h)と効かないノブ(f)の探針は同じ 1 回の探針に相乗りさせる (引数と結果を使い回す)。別モジュールで回し直すとスイートが 50 s 余分にかかる。
- L419 — ★2026-10-12 方針 A: 黙って値を返す op(zz_gap_silent)と生の例外(zz_gap_raw)も門になった。 「空なら空」と書いて値を返す op・書かずに ValueError で断る op は通る
tests/test_llmcore.py
- L48 — ★許容差を入れない。-inf の exp は厳密に 0 になる。
tests/test_mathops.py
- L518 — tier1 16 + complex 18 + construct 8 + wave 6 + dynsys 6。★ここは op を 足すたびに動く行なので、足した理由を残しておく(35 = 複素平面の 面 8 op、43 = 定理が門になる図 8 op、55 = 波動 6 + 力学系 6、59 = LU/QR/Cholesky/一般の固有値)。
- L1109 — ★極は標本に乗れないので偶数格子で(零点と違って値が数にならない)
- L1485 — ★数学の図はきれいなので、合っているかを誰も確かめない。ここでは絵を一度も 見ずに、定理と既存 opだけで合否を決める。 ————————————————————————— #
- L1563 — ★円は (p/q, 1/(2q^2)) に載っているので、接触は 2 次元の距離で見る。 x の差だけで測ると 0/1 と 1/9 のような組を「接していない」と読む (距離 0.1111 対 半径和 0.5062)—— 最初これで落ちた。
- L1683 — ★ムーア曲線は閉じている(最後から最初に戻れる)。ヒルベルトは閉じない。
tests/test_mcp_images.py
- L331 — ★最初
ones + inf にしていて、有限部が定数なので免除 op でも「定数」判定になり 落ちた —— それは診断器が正しい。確かめたいのは「免除 op なら非有限を異常と 言わない」だけなので、有限部に変化のある入力にする。
tests/test_mcp_server.py
- L160 — ★引数名を
name にしていて _call(4, "fullseye_op_help", name="gaussian") が TypeError になり、subprocess の実 stdio 往復が 1 度も走らないまま 23 件が緑だった(2026-09-15)。走らなかった検査は無いのと同じ。
- L208 — ★最初
gaussian が先頭と決めつけて落ちた。gauss_filter と gaussian は同じ HALCON 別名を共有する別 op で、api.find_op は name == halcon の正典を優先する。 検索もその規約に揃えたので、正典が先頭・gaussian が上位に居ることを見る。
- L421 — ★以前の被験者は台帳経由で索引に入ったこと(= 索引が台帳を数えている)も見る
- L452 — ★2026-09-17 に
b は「未使用」から端の扱いを選ぶつまみになった。 ノートがその意味と歴史側の帯を両方書いていることを固定する —— どちらか片方だけだと、保存済みプログラムを読む人が挙動を誤解する。
- L494 — ★同日実測: 4 層で 480 枚が「どこにも無いノート」に見えたが、5 層目(ledger)で 480 / 480 が解決した。ここが 0 でなくなったら、まず引き忘れた層を疑うこと ([[feedback_search_all_tiers_before_declaring_a_gap]])。ノートの残骸と決めつけない。
tests/test_mcp_wheel.py
- L215 — ★数を直書きしない。9 本目(fullseye_fix_text)を足したとき、この門は CI の core ジョブでしか走らず、手元のスイートは緑のまま CI だけ赤になった(2026-09-18)。 正本は checkout の TOOLS —— wheel が同じ集合を名乗ることを見る。
- L225 — ★順位を 3 位までに固定していた門は、新しい op(gauss_quadrature、2026-10-03)が「gauss」に正しく当たっただけで CI の core ジョブ(ここでしか走らない)を赤にした。見たいのは「2-D レジストリの op が索引の層から出る」こと。
tests/test_meshres.py
- L107 — ★2026-10-07: ここにあった
abs(pc_density(P[inner])["nonuniformity"] - 1) < 1e-9 or True は or True で常に真だった。実測 1.9121 —— 内側だけを切り出すと、その部分集合自身の縁で 近傍殻が欠けるので一様にはならない(主張そのものが誤り)。上の spacing の検査が本題なので削除。
tests/test_msa.py
- L80 — ★この恒等式は交互作用を残すモデルの性質なので、モデルを明示して問う。 既定の “auto” は規格の手順に従って交互作用を誤差へ畳むことがあり、そのとき EV^2 は「升目ごとの分散の平均」ではなく「畳んだあとの平均平方」になる。 (この門は実際にその切替を捕まえた —— 既定を変えた瞬間に落ちた)
- L91 — ★★連鎖ファザーが
msa_anova_table の NONFINITE を実検出した(2026-09-23)。 正しい対処は「この op の非有限を許す」ではなく「どこに出るかを宣言する」 こと —— 丸ごと許すと二度と鳴らない門になり、将来 0 除算や自由度計算の誤りで 部品行や測定者行に NaN が漏れても捕まえられなくなる。 残差の F / p —— F = MS/MS_error の分母そのものなので検定できない 全体の F / p / ms —— 平方和の合計行で、検定対象の効果ではない 交互作用(測定者 1 人)—— df = (p-1)(o-1) が 0 で推定量が存在しない
- L525 — ★表の脚注が「α = 0.05 で判定」と書いているので、表の再現を名乗る門は その α を明示して通す(既定 0.25 の妥当性とは別の話)。この例題では F = 0.434 がどちらの α でも非有意なので、結果はどちらでも同じ。
- L794 — ★区間の端は標本の分位点なので 1/sqrt(n) で揺れる。実測(種 8 本): n=200,000 で標準偏差 10.0 / n=1,000,000 で 4.2。偏りではないので、n を 決めた上で揺れの 3 倍で採る(「小さい」ではなく「この n ならこの幅」)。
- L814 — ★境界を渡さなければ検査しない(勝手に 0 を下限と仮定しない)
- L863 — ★端点は位置の揺れを拾うので、幅でも別に見る(こちらは sd 0.0035)
- L887 — ★許容は測った揺れから取る。n=1,000,000 の半幅の標準偏差は種 12 本で 0.0035(位置は 0.0146)。1 本の種に 2 sigma を当てて落とすのは 3 度目の 同じ誤りなので、4 sigma = 0.014 で採る。
tests/test_no_local_paths_in_shipped_code.py
- L40 — ★2026-09-14 追加: MSVC の標準インストール先。
fullseye_3dgs._find_cl_dir() が cl.exe を探すための候補として持っている。これは「私のマシンの作業物を 指している」のではなく「Visual Studio インストーラが決める場所」なので、 環境変数に追い出しても他人の環境で当たりやすくはならない(むしろ探索が 効かなくなる)。glob で実在を確かめてから使い、無ければ None を返す作りに なっていることを確認済み。 ※ _WIN_ABS は空白入りの語を 2 つ目までしか拾わないので、切り出される断片は C:\Program Files\Microsoft までになる。許可文字列は実際に切り出される形に 合わせる —— 正規表現の結果を見ずに「あるべき文字列」を書いて外した(2026-09-14)。
tests/test_op_contract_property.py
- L32 — ★hypothesis が無い環境ではこの 1 ファイルの import 失敗が全体を止める —— pytest は collection error で残りを走らせずに中断する(2026-09-05、CI が 2 分で 死んでテストが 1 件も走らなかった)。skip に落として他を巻き込まない。
tests/test_op_contracts.py
- L53 — ★2026-09-14 実測: 901 op 中 151 本(16.8 %) がこの状態で、空ループを 1 周 しただけで緑を返していた —— 「門が判定を計算した直後に捨てる」の親戚で、 こちらは 判定を一度も計算しない。まず skip で見えるようにし、
test_probeless_ops_do_not_grow で本数を台帳に固定する(減る分には通る)。
- L57 — ★2026-09-14: 本来の直しを入れて 151 → 0 にした。 上に「本来の直しは
conftest.BANKS を全 in_sort へ広げること」と自分で書いておきながら、 ラチェットで本数を凍結したまま 9 日が過ぎていた —— 台帳は免罪符になりやすい ([[feedback_never_weaken_the_probe_to_get_green]])。 足したのは 11 sort: points(56) / signal(27) / video(16) / qimage(11) / cimage(9) / counts(8) / lightfield(8) / rgbimage(6) / matrix(4) / beatcube(4) / keypoints(2) = 151 op。形は推測ではなく backends_bridge._EMPTY_OF (12 sort すべての正準の最小値)と problems.py の入力生成器から取った。 これで 901 op すべてが 3 つの契約ゲートを実際に通る。 0 になった以上、このラチェットの役目は「増えたら落とす」に変わった。 新しい in_sort を足した人は conftest.BANKS に探針も足すこと —— 足さないと その op たちは「登録されているのに一度も実行されない」状態に戻る。
- L78 — ★2026-10-07: 契約電池で
backend_safe.guard の fallback に落ちる op の台帳 {op: (分類, 落ちる入力名の集合, 理由)}。 上の 3 契約(例外なし・有限・決定的)は op.fn をguard 越しに呼ぶ。guard は例外を 握って sort の既定値を返し、非有限の出力は置き換えてから返す —— だから op 本体が 例外を投げても NaN を出しても、assert の時点では「例外なし・有限・決定的」に見えていた (2026-10-07 実測: 936 op 中 46 op が電池のどこかで黙って fallback、うち 8 op は 疑わしい欠陥。inputs_for が sort 既定の帯を返すようにしてさらに 10 op)。 今は guard の台帳(backend_safe.mark / events_since)を見て、ここに無い (op, 入力)で劣化が記録されたら赤にする。台帳の op が電池のどこでも落ちなくなったら それも赤(直ったら行を消す)。入力名の集合は「これ以上増えない」上限として使う。
- L201 — ★2026-10-24: kornia 0.9 未満の環境でだけ 全入力で理由つきで断る op。
xkor_clahe: 0.8 以前の equalize_clahe は OpenCV の CLAHE と最大 0.46 ずれ、0.9 で直った (backends_kornia._clahe)。CI は最新の kornia を入れるので、そこでは上の台帳どおり tiny4 だけが 落ちる。古い kornia では「その拒否文で落ちた」入力だけを許す —— ほかの理由の劣化は従来どおり赤。 (2026-10-24 に xkor_dog / xkor_laplacian の tiny4 を台帳から消した: 鏡映を自前で足すようにして 4x4 でも走る。tests/test_kornia_version_drift_2026_10_24.py)
- L223 — ★2026-10-07: 宣言した out_sort の形を守っていない op(
test_op_honours_declared_sort の else 枝 = points/signal/matrix/video/qimage/cimage/… の 120 op を新たに検査して見つかった)。 (2026-10-07 同日に 3 op を直して空になった: 複素の sort を名乗る tb_angular_spectrum_propagate / tb_cx_apply_transfer_function / tb_fmcw_window_apply が、ops._wrap_unguarded の guard で実部だけにされ float64 を返していた。表は器として残す —— 次に見つかった違反の置き場。)
- L243 — ★2026-10-07(CI で判明): optional backend が無い環境の ImportError は「劣化」ではなく 「この環境では走らない」—— requires_backend と同じく skip(py3.11 の完全環境では失敗にする)。
- L279 — ★2026-10-07: 全体実行でだけ fallback する op(単独・同じファイル群では再現しない)。 KNOWN_FALLS_BACK_ON_EDGE は「必ず落ちる」の完全一致なので、ここに載せたものは「落ちてもよい・ 落ちなくてもよい」として扱う —— 門を黙らせるのでなく、原因不明であることを名指しで残す置き場。 sk_gabor: -n 6 の全体スイートで tiny4 @ (a=0, b=0) の出力 16 画素中 8 画素が NaN(1 回観測)。 単独・test_fix_gabor_dc / test_studio_params / test_fix_op_name_and_range / test_api_device と 同じプロセスでは毎回有限。前に走った何かが残す大域状態が疑わしい(未特定、見直し台帳に載せた)。
- L325 — ★guard 越しでは「例外なし」は自明に真 —— 劣化の台帳で本当に走ったかを見る
- L338 — ★非有限がその op の意味を運んでいるものは、この門の対象外。判断は ここで持たず
ops.NONFINITE_IS_MEANINGFUL を単一の正本として引く (test_backends_typed_liveness.KNOWN_NONFINITE_BY_CONTRACT が同じ表の 写しで、一致は別の検査が見ている。3 つ目の写しを作らない)。 2026-09-14: 探針バンクを 6 sort 広げたとき、ここで tb_mat_cond(特異行列の 条件数 = inf)と tb_geodesic_distances(不達 = inf)が落ちた。一度 探針から特異行列と非連結点群を外して緑にしかけたが、それは誤り —— 台帳は「inf が正しい答え」と既に宣言しており、落ちていたのは門がその 台帳を見ていないことだった。探針を削って緑にするのは欠陥を隠す行為で、 しかも同じ台帳の註に「自分の probe では特異行列を作っていなかったので tb_mat_cond を取りこぼした」という 2026-09-05 の教訓が書いてある。
- L366 — ★guard は非有限の出力を置き換えてから返す(source=output で台帳に残る)。 上の assert は置き換え後を見ているので、台帳の側で「置き換えが起きていない」を確かめる。
- L388 — ★fallback の値は自明に決定的 —— 比べたのが op 本体の出力であることを台帳で確かめる
- L446 — ★2026-10-07: ここに else が無く、points/signal/matrix/video/qimage/cimage/counts/ keypoints/rgbimage/beatcube/lightfield/any の 120 op は何も検査されずに緑だった。 形の契約の正本は backends_typed._sort_ok(進化の橋の出口と同じ表)。複素の sort は dtype も見る(backends_bridge._COMPLEX_SORTS)。
tests/test_op_descriptions.py
- L258 — ★2026-10-11: 台帳・n-ary・facade(fullseye.all)にも同じ規則を広げる # ————————————————————————— # 変異探針で、上の検査は ops.REGISTRY しか見ておらず、台帳 op・n-ary op・facade の関数は 説明を消してもどの門も鳴らないと分かった。既存の欠けは docs/LEDGER_GAP_DEBT.json の “description” に固定し、増えたら落ち、直ったら台帳から消す(縮むしかない)。
tests/test_op_discovery.py
- L247 — ★2026-09-17 に 3 -> 5。1-D の局所標準偏差と mu 則圧伸を足したため。 新しい 2 件は 1-D 実装に 2-D を渡すと ValueError で鳴る(既存の
lowpass と同じ、正しい向き)。危ないのは逆で、下でその 1 つを固定する。
- L262 — ★フォールバックの警告は op ごとに 1 回だけ。同じワーカーで先に別の試験が fs.op.lowpass の フォールバックを起こしていると、ここで警告が来ず落ちた(2026-10-01、-n 6 の全体スイートだけで再現・単独では緑)。 試験の順序に依存しないよう、1 回目の警告をもう一度出せる状態に戻してから見る。
-
| L272 — ★素通しですらない: フォールバックは画像の契約 [0,1] へ切り詰めて返す。 負の半分が 0 になった信号は「フィルタした信号」に見えるので、 これは黙って嘘をつく。max |
差 |
= 1.0、最小値 -1.0 -> 0.0。 |
tests/test_op_example_coverage.py
- L58 — ★母集団を「配布物の側」から数える ratchet(2026-09-06) # ————————————————————————— # 2026-09-06 の実測。この数より悪くしないための歯止めで、目標値ではない。 台帳 op 1,002 本のうち例索引に入っているのは 349 本しかなく、上の 2 本の 「100 %」は母集団が 3 層のうち 2 層しか無いために成り立っていた。 経緯と族別の内訳 = docs/KNOWN_ISSUES.md §38。
- L32 — ★op 集合は環境で変わる(Linux CI は torch/kornia/mahotas/xfeatures2d が無く 859 op、手元は 885)。手元で生成した文書と生きたレジストリを比べる検査は 満杯の環境でだけ意味を持つ —— test_opdocs と同じ規約で、揃っていなければ skip(理由に欠けている backend 名が出る)。2026-09-07 の CI で 22 件が これで落ちた。環境に依らない検査(ファイルの実在・中身の量・図の実在)は そのまま走る。
- L203 — ★2026-09-08: 第三者バックエンドの版に依存する op は台帳から外して数える。 この台帳は「図を作った環境」で書かれ、「テストを走らせる環境」で検証される。 cv2 の実装は版で変わるので、手元(opencv 5.0)で効かないつまみが CI (opencv-contrib 4.x)では効く —— 実測で
xcv_grabcut の b がそれだった。 台帳が主張してよいのはどの環境でも成り立つことだけ。版に依存する分は 主張しない(嘘の台帳を持つより、狭くて正しい台帳のほうがよい)。
- L363 — ★optional backend(torch 等)が無い環境では、その op は「走らせられない」のであって「壊れている」のではない。 97 本おきの抜き取りは登録簿が増減するたびにずれるので、torch の要る op に当たる/当たらないが環境で変わる (2026-09-29: op が 2 本増えて tb_points_to_voxel に当たり、torch の無い py3.10 / 3.12 のシャードだけ赤)。 飛ばした本数は数えて、実際に走った本数で門を立てる。
tests/test_op_probe_ledger.py
- L76 — ★2026-09-08 に足した。それまでこの門は image / region / color / volume の 4 つに しか入力を作っておらず、
contour 65 / points 57 / signal 26 / video 16 … 217 op(レジストリ 901 本の 24 %)を “uncallable” として素通りさせていた。 「門が正しい場所に立っている」ことと「門が全部を通す」ことは別 —— 広げた初回に tb_angle_3points が探針では一度も走れないこと(登録は points→feature なのに 実体は 3 本のベクトルを取る)が出た。
- L85 — ★2026-09-17: 戻りの橋
feature_to_img で feature が初めて 入力になった(作る op は 125 本あったが受ける op がゼロ だった)。この門は「探針を作れず一度も走らせていない op」を 数えるので、sort を足したらここにも足す。
- L197 — ★2026-09-08 の CI(py3.10 / py3.12、torch なし)がここで赤になった —— 探針を全 sort に広げた初回に、torch を要る op(
tb_points_to_voxel)へ 初めて到達したため。「壊れている」と「この環境に無い」は別の判定で、 混ぜると環境差が実装のバグに化ける。満杯の環境 (FULLSEYE_REQUIRE_OPTIONAL=1)では従来どおり失敗にする。
tests/test_opdocs.py
- L212 — ★2026-09-03: 全 backend の _safe が backend_safe.guard に集約されたので、 qualname の文字列一致ではなく guard が立てる構造化マーカーで判定する (guard は qualname にも “_safe(…)” を残すが、そちらは表示用)。
- L769 — ★2026-10-12: 図が無い理由(
gen_op_figures.DOMAIN_MISMATCH の値)も T() を通すので、その表の原文もキーとして正しい
- L885 — ★2026-10-12: 本文の訳が 2,212 本そろい、実データに「本文だけ未訳」の op が無くなった (以前はここで実在の頁を 1 枚選んでいた → StopIteration)。将来 op を足した瞬間に通る道なので、 本文の訳を 1 本だけ外した状態で生成器を直接呼んで固定する(test_notice_when_nothing_is_translated と同じ作法)。
- L1238 — ★見つからなかった理由:
ops.REGISTRY(899)と 2-D ノート(899)は一致するので、 レジストリ側から数える限り「欠落ゼロ」に見える。一度そう結論して間違えた。 だからこの門は tier をまたぐ索引の側から数える (memory: feedback_search_all_tiers_before_declaring_a_gap)。 ————————————————————————— #
tests/test_optdraw.py
- L285 — ★2026-10-15 から鏡は折り返した系の断面図(noncoaxial_drawing)に、接合レンズは組図になった(拒否しない)
tests/test_packaging_foundation.py
- L158 — ★2026-09-07: 手元の wheel に sample_sources_ai が 42 MB 乗っていた(96 MB)。 原因は古い build/lib/ のキャッシュ(package-data から外す前の残骸が詰め直される)。 設定を読む検査では捕まらない事故なので、wheel 実物の側を tools/ci_wheel_check.py (unshipped_present)と ci.yml のサイズ上限が見る。ディレクトリも package の外へ 移した(tools/fops_article/)。ここでは除外の明示を要求する(保険)。
tests/test_pivops.py
- L621 — ★名前レベルの
PARAM_HINTS だけを見ると門がファザーより狭くなる。 chain_fuzz._bind_args は op 名で狙い撃つ OP_PARAM_HINTS も見るので、 ここでも両方を見る(2026-09-06: dic の window / method を OP_PARAM_HINTS に置いたら、実際には束縛できているのにここだけ落ちた)。
tests/test_poc_scripts_run.py
- L57 — ★2026-09-08: 固定 6 をやめて CPU 数に合わせる。共有ランナー(2〜4 vCPU)では 6 並列が 1 本ずつを遅くするだけで総時間が縮まらず、PoC が 84 本に増えたところで ジョブごと pytest の 900 秒 timeout に落ちた(py3.10 / 3.12)。手元(12 コア)は これまでどおり 6 以上で回る。
- L73 — ★
PYTHONPATH は渡さない(2026-09-09)。長らく PYTHONPATH=<repo> を 渡していたが、それは利用者がしない設定で、門が事故の起きる場所から 1 歩ずれる ことを意味していた —— 同じ盲点で examples/piv_flow_from_particles.py などが 「チェックアウトからそのまま走らせると ModuleNotFoundError」のまま残っていた (あちらは走らせる門すら無かったので気づかれなかった。test_example_scripts_run.py)。 PoC 側は 116 本中 108 本が自分で repo 直下を sys.path に足しており、残り 8 本は fullseye しか import しないので、外しても全数が通る(実測済み)。
- L87 — ★stdin は /dev/null(2026-10-23)。渡さないと子は親(xdist の worker)の stdin = execnet の パイプを継ぐ。worker が死んだあとも子がそのパイプを握り、controller が「node down」の後に 固まる形になりうる(手元で torch+libiomp5md の子が消えないゾンビになった日に疑った経路。 再現はしなかったが、子に親の制御パイプを継がせる理由は無い)。
- L96 — ★失敗時は stdout の末尾も返す。PoC は所見と「どの検査が落ちたか」を stdout に印字して SystemExit(1) するので、stderr だけだと空のまま 「exit 1」しか分からない(2026-09-07 の CI、py3.10 の poc_ct_fidelity)。
- L99 — ★stdout は 4000 文字残す。1200 だと章の後ろだけが見えて、前半で 落ちた検査の実測値が CI から読めない(2026-09-24、poc_endless_zoom の 10 番目が落ちたとき「NG が残っている(10 番目)」しか分からなかった)。
- L108 — ★2026-09-07: ここは長らく 0 を返していた ので、下の
assert code == 0 を素通りしていた —— 合否を計算した直後に 捨てる門(実測: PASS を一度も印字しない PoC が 3 本 —— poc_dic_strain / poc_photoelasticity / poc_thermography_ndt)。 -2 を返して落ちるようにする。
- L140 — ★2026-10-07: 以前は全本を走らせていた。session fixture はセッションごと(CI のシャードごと・ xdist のワーカーごと)に作られるので、CI では 4 シャード × 3 版 = 12 回、全本を走らせていた (シャードあたり 21〜41 分、run 37474292595)。手元の -n 6 では 6 ワーカーがそれぞれ全本を WORKERS 並列で回し、最大 48 本が同時に走って単独 286 秒の PoC が 600 秒を超えていた。 いまは (1) xdist のワーカーでは引かれた 1 本だけを走らせ、並列は xdist に任せる (2) それ以外(CI のシャード)では、このセッションに残ったテストの分だけをまとめて並列に走らせる。
- L156 — ★この門は 84 本の PoC をまとめて 1 回走らせる(session fixture)。その時間は 最初のテストに計上されるので、pyproject の既定 timeout(900 秒)では共有ランナーで 落ちる。ここだけ広げる —— 既定を緩めると他のテストのハング検出まで鈍る。
tests/test_printpath.py
- L332 — ★頂点より少ない標本は既定で拒否(長さが縮んで濃淡の再現が壊れる)
- L369 — ★完全な係数列で呼ぶ(打ち切ると尾のエネルギーが分からず予言が下界になる)。 parametrisation は “index” —— stroke_resample_closed がすでに弧長で 打ち直しているので、ここで “arclength” を選ぶと op が内部でもう 1 度 打ち直して別の輪郭の係数になる(弧長の打ち直しは冪等でない)。
- L454 — ★目標の濃さに合うペン幅を閉形式で解くと、偏りが桁で縮む
tests/test_profileops.py
- L206 — ★2026-10-07:
or True を外した。実測 none=-0.003086 < rigid=-0.001662 < 0.5*none=-0.001543
tests/test_public_reachability.py
- L76 — ★2026-09-14: この 13 本は 2026-09-05 から wheel に入っていなかったもので、 py-modules へ足した結果ここに現れた。演算子としては
unified._3DGS_OPS が _lazy_call(モジュール名, 関数名) で文字列から登録しているので、利用者には fullseye.vision.gsplat.<名前> 経由で届く(2026-10-02 訂正: fullseye.op.<名前> は存在しない。 unified registry を公開経路として数えたら 17 モジュールが島でなくなり行を消した)。 ここに残る 1〜6 本は各モジュールのデモ入口(render_*_gif など)で、op ではなく絵を作る側。だから内部専用に置く。 —— 「配布から消えていた」を直すと「公開経路から見えない」が現れる、という 二段構えだった([[feedback_registered_only_gates_miss_unregistered]])。
- L85 — ★2026-10-02: py-modules の数え漏れ(68 → 408 本)と facade 経路の数え忘れを直して初めて見えた 9 本。 内部の道具(CLI・ヘルプ書庫・n-ary の組立て・Studio の索引・標本データの取得・大画像の実行補助)、 api が別名で包むもの(mesh_decimate → mesh_decimate_preserving)、fs.. でだけ届くもの (pipeline3d の合成 op 6 本 —— 2026-10-02 に fs.<名前> から出して行を消した)。 (watershed3d の 3 本は 2026-10-02 に台帳 opssegmentation の watershed3d へ載せて行を消した。)名前>
- L98 — ★2026-09-15: 33 行すべてが公開経路(fullseye.<名前> / .ledger / .op)に届くように なっており、2 番目の検査が「この表から行を消すこと」と 33 件を挙げた。 消した 33: transforms / mosaic / fit_transform / tools_geom / matrix / shapematch / objmodel3d / matching3d / matching / calib / caltab / calibration3d / contours_xld / contours_xld2 / image_channels / filters_freq / filters_flow / regions_setops / regions_gen / region_morph / morph_minkowski / segmentation / image_gen / image_paint / misc_vision / imgops_nary / scattered / inspection / pipeline3d / watershed3d / mesh_decimate / sample_data / scale。 表は空でも残す —— 「出すべきなのに出ていない」ものが次に現れたときの器。名前>
- L120 — ★2026-10-02: コメント行の
[[feedback_...]] で非貪欲の \] が止まり、py-modules 407 本のうち 68 本しか数えていなかった(339 本が門に映らない)。コメントを剥いでから囲みを取る。
- L130 — ★2026-10-07: optional 依存が無いと import できない出荷モジュール
{module: 許す欠落依存}。 以前は except Exception: continue でどんな import 失敗も母数から黙って外していた —— 壊れたモジュールは「不可視の関数」の数にも島の検査にも入らず、ラチェットはむしろ緑に寄る。 ここに無いモジュールの import 失敗、ここにあっても別の理由の失敗は赤。
- L164 — ★2026-10-02: 4 つ目の公開経路 = 知覚 facade(fullseye.vision.<群>.<関数>、halcon_facade_map.json の "module.func" が実体)。HALCON 章の実装(segmentation.py 等)はここからだけ届いていた。 py-modules の数え漏れ(68 → 408 本)を直した途端に 35 モジュールが「見えない」と出たが、 その多くは facade 経由で届く。利用者が呼べる経路は全部数える。関数>群>
- L172 — ★2026-10-02: 5 つ目の公開経路 = unified registry(
fs.vision.<名前空間>.<op>)。3DGS などの op は 文字列 “module.func” から _lazy_call で登録され、facade map にも台帳にも名前が出ない (sugar_mesh・tsdf_mesh・route_planning 等)。”module.func” 形の module 欄だけを数える (fs.apply('x') のような呼び出し式は関数名ではない)。
tests/test_pxrd.py
-
| L246 — ★a の門 5e-5 の余裕(組み込み時 2026-10-06 に雑音の種を 12 通りずつ振って実測): 誤差は雑音でなく較正の系統で決まり、 この像(傾き 5°・向き 30°)では −2.7〜−4.2e-5(種 6 は −3.2e-5)。種による散らばりは ±0.5e-5 程度で、24 通りの最大は |
4.2e-5 |
。 種は固定なので結果は決定的。門を締めると系統の偏りに当たり、緩める理由も無いので 5e-5 のまま。 |
tests/test_rag_by_ops.py
- L48 — ★問題集は文脈の表と同じ書き手が同じ日に書いた —— 独立な評価ではないので、床は「後戻りしない」ことだけを言う。
tests/test_raster.py
- L26 — ★素の import だと不在環境で収集ごと中断する(2026-09-05 実測)。
tests/test_raytrace3d.py
- L276 — ★2026-10-15: 傾いた鏡(摂動)の後で像面と平行に進む光線を、以前は rms 3.4e18 mm の有効な点として数えた
tests/test_roughness_robust.py
- L75 — ★α は op の定数を読まず、ここで ln2/π から作り直す(両辺に同じ入力を渡す門は無効)
tests/test_runner_scratch_families.py
- L38 — ★宣言された家族。key = “."、値 = 守り方の説明。 ここに無い関数が ``_bind_args`` を呼んでいたら、この門は落ちる。
tests/test_rust_abi_parity.py
- L402 — ★契約では FS_E_INVALID_ARG(引数が定義域の外)であって FS_E_TYPE ではない。
FsValueError を足すまでは両方 FsTypeError で、Rust が 1 を返すのに Python は 2 相当を投げる、という状態コードの食い違いが残っていた。
tests/test_sample_data.py
- L125 — ★台帳は前からあったのに、人が読む
docs/ops/SAMPLES.md には出ていなかった (2026-09-16)。表の列は id / 種別 / アクセス / URL だけで、ライセンスと商用可否は ソースを読まないと分からなかった —— 看板(「DL URL / ライセンス」)と中身がずれて いた。出す側を直したので、ここでは台帳が空欄を作らないことを固定する。 ————————————————————————— #
tests/test_scale.py
- L63 — ★d: 穴がタイル境界を跨ぐ画像。これが無いと領域 op(fill_holes / select_shape / fill_up …)がタイル分割で壊れることを検出できない —— b の穴(70:90)はどのタイルにも収まっているので、埋めた結果が一致して しまう。2026-09-17 にこの探針を足して、tile_safe と宣言されていた 6 本が誤差 1.0(全く別の結果)で割れることが分かった。 穴は 45..95 にとり、tile=64 の境界(64)と tile=60 の境界(60)の両方を跨ぐ。
- L71 — ★e: 細かい周期を持つ画像。変換ドメイン(ウェーブレット)・非局所平均・ LBP はここで初めて割れる。乱数でなく決まった模様にしてあるのは、 乱数だと対称性の破れが隠れるため。
- L77 — ★f: 小さな粒と穴が多数ある画像。面積で選ぶ op(remove_small_holes / select_shape / diameter_opening)は、粒がタイル境界で切られて面積が変わる ことでしか壊れない —— 大きな構造しか無い探針では 0.0 のまま通る。 種を固定してあるので実行ごとに同じ(乱数そのものを検査対象にはしない)。
- L81 — ★種は 2 つ持つ。1 つの種は「構造の 1 標本」でしかない ——
xsk2_isotropic_close は種 0 と 7 で誤差 1.0(全く別の結果)、種 1 と 20260917 では 0.0 だった。半分の種で割れる op を「タイル安全」と呼ばない ために、当たり外れのある探針は複数枚そろえる。
- L92 — (tile, halo) の組。★64/16 だけで測ってはいけない —— どちらも 8 の倍数なので、 8x8 の周期を持つ処理(順序ディザの Bayer 行列など)はタイルの位相がそろって たまたま一致する。実測で
dither_ordered は 64/16 で誤差 0.0000、60/12 でも 50/10 でも 37/7 でも 0.1429 だった。整列していない幅を必ず 1 つ混ぜる。 これを入れた 2026-09-17 に、tile_safe と宣言された 168 本のうち 16 本が 割れることが分かった(fill_holes など 6 本は誤差 1.0 = 全く別の結果)。 3 組目 (50, 8) はハローが狭い設定。「支持長がハローを超えるか」で決まる op(ウェーブレット再構成・大きな構造要素のモルフォロジー)は、広いハローでは たまたま一致するので、狭い側も試さないと分類が甘くなる。halo は利用者が選ぶ値 なので、「ある halo でだけ安全」は tile_safe と呼べない。
tests/test_scale_law_2026_09_26.py
- L46 — 宣言表 —— 成分ごとの尺度指数。★新しい op を足したらここにも書く(完全性を門で見る) ————————————————————————— # 周囲長を経由する量は、ラスタ化の偏りで p が厳密に出ない(docs/KNOWN_ISSUES.md §50)。 そこだけ許容差を広げ、理由を名前で残す。
- L86 — ★HALCON の同名演算子は正規化しない中心モーメントを返すので、本来は p=4 / 5 / 8 になる。この repo は 1 スカラーへ合成する際に Hu の正規化 不変量を使っており p=0 である(docs/KNOWN_ISSUES.md §52、巡 13 で直す)。 ここは あるべき値を書き、直るまで strict xfail で開いたままにする —— 免除台帳に「例外」として畳み込むと、直ったことに誰も気づけない。
- L101 — ★§52 が直るまで落ちる 3 本。
strict=True なので、直った瞬間に「予期せぬ成功」で 落ちてこの表を直せと言ってくる(黙って通り続ける免除にしない)。
tests/test_segcompare.py
- L120 — ★最初は逆に読んで赤になった —— 名前は閉形式の門(半分に割ると split が m/N)で固定してある
- L126 — ★scikit-image の precision は正解側の対で割っている(コードは truth x test の表の行和)= こちらの recall。docstring は「test の対で割る」と書くので、名前が入れ替わっている。 F 値は対称なので誤差そのものは一致する。
tests/test_segmentation_halcon.py
- L496 — ★2026-10-02: 同じ台帳に score(segeval)/world(segworld)のカテゴリが足された。HALCON の 9 本は 4 カテゴリの中にちょうど 9 本、他のカテゴリの op は segmentation.py の物ではない。
- L499 — ★2026-10-18(統合 8 第 2 波): 同じ「classify」カテゴリに cropweed の Fisher 判別 2 本が入った。HALCON 章の 9 本は 実体が segmentation.py の物なので、module で絞る(カテゴリ名だけで数えると汎用の判別が混ざる)。
tests/test_shapestats.py
- L196 — ★ 面を自由にすると、片側の一様な広がりは丸ごと吸われる(実測 4.9e-35)。 中点が半分だけ動き、面もそこへ動くので、左右差として残らない。これは この定義の限界であって不具合ではない —— 見たいなら面を外から与えるか、 正中線上のランドマーク(midline)を足すこと。
tests/test_simcal.py
-
| L104 — n^1 * d^~1(位相 4 pi n d / lambda)。★d の指数が 1 から外れるのは Fresnel の項(n だけに効く)の分。 2026-10-18 に決まる組の重みを e/ |
列 |
→ e· |
列 |
に直した(下の test_g2determined_combination_weights…)ので 0.94 → 1.07 に動いた。どちらも 1 の近くなので、この門は直す前も後も通る幅にしてある(向きの検査は下の門)。 |
- L339 — ★種は乱数を引かない(探針の種は型名の順に同じ乱数列から作られる)
tests/test_spc.py
- L237 — ★台帳 opsspc は 2026-10-12 から 2 モジュール(spc と pod)を載せる。比べるのは 「spc モジュールの op」どうし —— pod 側の一致は tests/test_pod.py が見る。
- L247 — ★真値は導出した恒等式と既存 op。当てはめた数字を固定しない。 単位空間の MD² の平均はちょうど (n-1)/n で、教科書の「平均 1」を有限標本で 正確に言い直したもの。1.0 を固定する試験はどんな標本でも間違いになる。
- L320 — ★この列の std は 0 ではない。4.2 を 200 個並べただけで丸め屑が 1.3e-14 残る(実測)。
std == 0.0 で判定していた最初の版はここを取りこぼし、 その屑で割った距離が意味を失っていた。屑が在ることを門に書いておく —— 絶対判定に戻したらこの行が落ちる。
tests/test_specularity.py
-
L790 — ★2026-10-07: ここにあった max|a - 7b| < 7e-12 or True は or True で常に真だった。 実測 max |
a - 7b |
= 4.91(b は 1.4e-16)—— 画像だけを 7 倍してアルベドを据え置くのはモデル違反で、 残差は 7 倍の線形にはならない(主張そのものが誤り)。成り立つ向き = 「線形ではない」を測った値で固定する。 正しい線形性の形は下の c の検査。 |
tests/test_studio.py
- L948 — ★
setDefaultFormat は引数なしコンストラクタにしか効かず、Studio の QSettings("Fullseye", "Studio") はレジストリ固定だった —— この fixture は 何も隔離していなかった(2026-09-05、レジストリに pytest のパスが残っていた)。 本体側の入口 studio._settings() を環境変数で ini に向ける。
- L2066 — ★
QSettings("Fullseye", "Studio") を直に組むと隔離を迂回して利用者の レジストリに書く(2026-09-05 の監査で実害を確認)。設定入口は 1 つに保つ。
- L89 — ★UI 言語はプロセス全体の状態(studio._UI_LANG)。切り替えたまま返すと、同じ worker で後に走る test_studio_result_preview の note が hi / ko になって落ちる(CI shard 5、2026-10-25)。teardown で戻す。
tests/test_studio_ledger_runner.py
- L129 — ★2026-10-13: 抜き取りを「名前の SHA-1 の小さい順に 60 本」にした。等間隔の抜き取り (names[::len//60])は、前の方に op が 8 本足されただけで 60 本がまるごとずれ、 見本で走る数が 26 → 17 に落ちて門が鳴った(偏光の 8 op は 1 本も抜き取りに入っていない = 窓の欠陥ではなく抜き取りの揺れ)。名前の指紋で選べば、op を足しても既存の 60 本は 新しい名前が指紋の上位に割り込むときしか変わらない。この抜き取りの実測は 60 本中 22 本。
- L143 — ★返り値が None の op(tid2013_root はデータの置き場が無ければ None を返す)は、窓でも 「kind: none」で out = None になる。例外が出たかでなく値が返ったかで比べる (2026-10-05: 台帳が 63 本増えて抜き取りの 60 本がずれ、tid2013_root が入って鳴った)。
tests/test_studio_logic.py
- L22 — ★旧 setDefaultFormat 方式は Studio の QSettings(org, app) に効かなかった。 本体の入口 studio._settings() を ini に向ける(session 全体)。
tests/test_studio_ops_browser.py
- L11 — ★素の import だと matplotlib 不在の環境で収集ごと中断する (pytest は 1 本の import 失敗で残り全部を走らせない)。2026-09-05 実測。
tests/test_telecentric.py
- L38 — ★2026-10-15 まで raytrace.chief_ray は入射瞳を狙い、物体側テレセンでは ValueError で止まった。 いまは入射瞳が無限遠なら絞りを狙う —— この層の主光線と同じ像の高さになること。
tests/test_threshold_polarity_2026_09_26.py
- L35 — しきい値「方法」の名前。★op 名から拾うので、新しく足した方法も自動で門に入る (免除台帳に名前を書かない限り)。綴りで探す門は綴りが違うものを見逃すので、 説明文も一緒に見る。
- L43 — ★暗い側が答えで正しい op。理由つきで名指しする —— 台帳が黙って腐らないよう、 下の試験が「本当にまだ暗い側なのか」を確かめる。
tests/test_trust_block.py
- L151 — ★2026-10-12: ここは長らく
release=True(厳密一致)で呼んでいて、docstring の 「普段は 行 ≤ 索引」と食い違っていた。0.6.0 の後に op を 1 本でも足すと(pod 5 op) 凍結済みの 0.6.0 の行は直せないので、どの commit でも必ず赤になる門だった。 厳密一致はリリース直前に tools/gen_trust_block.py --release-check で見る (その意味は下の grown / shrunk の対で固定してある)。
- L159 — ★2026-10-18: 先に索引を版の行とぴったり揃えてから 1 本足す。揃えずに足すと「厳密一致で 何件落ちるか」が、リリース後にどの層が増えたかで変わる(ops3d の op は 2-D 橋 tb_* も 生むので registry も 1 増え、2 件のはずが 3 件になった —— 門ではなく数え方の偶然)。
tests/test_vacuous_assertions.py
- L62 — ★他の試験の docstring に
\* 等が在ると ast.parse が DeprecationWarning を出す。数えるだけの処理なので黙らせる (門の出力に無関係な警告を 84 ファイル分足さない)。
- L95 — ★書き下した列(
for img in (v, w))は、中身が何であれ空にならない。 中の名前が「呼び出しの戻り」でも、周る回数は 2 と決まっている。
tests/test_videostream.py
-
| L319 — ★Collins (VSAM 2000): 両方とも現フレーム基準。2026-09-05 までこのテストは 連続ペア |
f[t-1]-f[t-2] |
を期待していて、実装の誤りを仕様として固定していた (等速で動く一様な物体で常に全ゼロ —— 下の回帰テスト)。 |
tests/test_volops.py
- L384 — ★2026-10-07:
or True を外した(実測: マスク外で vol と違う 7783 画素はすべて 0)
- L567 — ★これらは「HALCON がボクセル型を持たない」ことを理由に足した族なので、正しさの 根拠は幾何が保証する真値しかない。だから全部、真値の分かる形(球・立方体・ トーラス・既知 sigma の白色雑音)で検査する。 ————————————————————————— #
tests/test_wave.py
- L85 — ★J’_0 の零点と比べると合わない —— 取り違えを門で固定する
tests/test_wingpoc_gallery.py
- L172 — ★英語側は展示数を指す句に限定する。英語の数詞は散文に普通に出るので (two separate numbers / two opposite kinds)、広く拾うと誤検知だらけになり、 誤検知だらけの門は消される。日本語の「N 点」は展示を数える言い方なので広いまま。
- L252 — ★入れ替える 2 件は受入日が違うものを選ぶ。同じ日の 2 件を入れ替えても 何も壊れないので、それで「捕まえた」と言うと破壊試験が嘘になる。
textregion.py
- L92 — ★幅 1 のストローク(2026-09-27 実測: size 16 のフォントは縦の連が 1 px で、行の再現率が 雑音に依らず 0 % だった)。境界画素の 1 歩先が既に地なら、その画素だけの幅 1。 勾配は 1 px の棒では消えて向きが定まらないので、勾配を使わず 4 近傍で決める: 上下がともに地、または左右がともに地なら、その画素の幅は 1。
- L103 — ★2026-10-30: 「出来れば全 PoC を載せたい」。初版は 80 本で切っていた。台帳の PoC は手書きの見どころか この一括のどちらかに必ず載る —— 載らない PoC があれば理由(図が無い・数が無い・分類の無い翼)ごと止める。
- L45 — ★カタログ・ヒント・アダプタは出荷モジュール
typed_catalog が正本(2026-09-05)。 以前はここに住んでいて、backends_typed が tools/ を sys.path に足して読んでいた —— その結果 wheel では tb_* 143 op が黙って消えていた。向きを逆にした。
- L284 — llmcore(2026-09-24): tokens は画像パッチを種にする。★一様乱数だと どの行も似た向きになり、注意の重みが全行ほぼ一様になって「走ったが 意味のある出力でない」側に落ちる。滑らかな画像を 8x8 で切ると、 近い場所のパッチが近い向きを向く = 注意が構造を持つ。
- L305 — 事象の位置(点過程)—— point_spectrum の入口。★一様乱数だけにしない: 周期成分が無いと「周期を見つける op」の意味のある挙動を一度も踏まないので、 周期 17.0 の列に 12 個の無関係な事象を混ぜた構造データを種にする (乱数だけの試験は構造の欠陥を隠す、というこの repo の規律)。
- L503 — ★rng を 1 つも引かない —— 探針(ledger_contracts)は種を型名の順に同じ乱数列から作るので、 ここで乱数を引くと型名が後ろの種(image2d / matrix / signal …)が全部ずれ、他族の op の判定が 動く(2026-10-15 に実測: 無関係な 6 op が「拒否」に、11 個のノブの判定が入れ替わった)。
- L508 — ★design と同じく rng を 1 つも引かない(種は型名の順に同じ乱数列から作られる)。模型の観測は simcal の内側の固定の種(20261015)で作るので決定的。
- L813 — ★2026-10-13: TYPE_CHECKS[“pose”] は (R, t, info) の 3 つ組も pose として通す (register_spin / register_shot / register_cpd_rigid / icp …)。ここで 2 つに 展開すると、その組が引かれた連鎖で ValueError(seed 3_000_0xx、縞に近づく ハエの眼の 5 op を足して抽選がずれた回で露見)。先頭 2 つだけ取る。
- L946 — ★ 非有限が混じった点群は KD 木の構築そのものが生の ValueError で落ちる (scipy: “data must be finite”)。プールは NONFINITE を記録したうえで値を 残す設計なので、汚れた点群がここへ来るのは想定内 —— 建てる側が防ぐ。 2026-09-06 に実際に踏んだ: 新しい族が増えて連鎖の歩き方が変わり、 seed 3_000_0xx でこの経路に当たってファザー自身が停止した(op の欠陥では なく道具の欠陥。束縛できない入力は例外ではなくスキップが約束)。
- L1298 — ★単位空間は渡さない(渡すなら 3 つ全部)。渡さない形は「データ自身から 作る」訓練時の呼び方で、ファザーが最も広く回せる。
- L6930 — ★2026-10-18: 窓 3 つ + 厚さ 0 から始まる勾配。窓の番号(low / high)のノブは窓が 3 つないと どの値も同じ 2 窓を指し、min_log(素通しに近い画素を拒否する下限)は L が 0.01〜0.04 の画素が 無いと効かない —— 効く入力を渡す(効かないノブを台帳に載せない)。 窓は 120 kV で 20 / 40 / 60 keV(隣り合う狭い窓 20〜35 / 35〜55 では Cr と Mn の R が逆転し、 effective_z_map が単調でないとして拒否する —— それは op の正しい拒否で、ノブの検査にならない)。
- L7140 — ★obs2 の 2 点目は台車 0 の終点から (−0.15, 1.0) ずらした所: 射影の角 0.1 → 0.2 rad で終点と点の順が入れ替わり、 組紐語が変わる(角が「効かないノブ」に見えない入力。類が同じかは角に依らない —— それは門が別に見る)。
- L8120 — ★2026-10-11: file = 書き出したファイルのパス(write_wav の返り、read_wav の入力)。 述語が無いあいだ、write_wav が None を返しても誰も気づかなかった。
- L8242 — ★ 2026-09-02 まで
lambda v: True だった = 述語が「有る」と数えられている ぶん、無いより悪い(点検スクリプトも「述語あり」に数えてしまう)。実測で None / 42 / 文字列 / dict まで通していた。 正典は消費側 6 op(reprconv の pairs_to_signal / pairs_to_image2d / pairs_to_table / angles_to_normals / shape_index_to_curvature / polar_to_cscalar)を全部実行して決めた: 6 op とも上の 2 形だけを受け、 それ以外は “pairs: must be (N, 2) or a 2-tuple of equal-length 1-D arrays” で名指しの fail-closed になる(実測)。(2,N) は受けないので、 2-tuple を np.stack で (2,N) に潰していた adapter 3 件は axis=1 へ直した。 長さの違う 2 本(histogram の counts/edges)も「対」ではないので弾く。
- L8374 — ★ 「2 要素ちょうど」は pose(
len >= 2 で info を許す)とわざと違う。 実測 2026-09-02: mesh を 1 引数で受ける既存 consumer 4 件 (face_normals / vertex_normals / mesh_area / vertex_curvature)は 3-tuple に対して “mesh must be a 2-element tuple (vertices, faces)” を 送出し、cadmap の _mesh と render3d._mesh_arrays も 2 要素しか受けない。 つまり この repo の mesh sort の正典は 2-tuple で、余分な要素は 「情報が多い」のではなく下流が全滅する型の嘘になる。唯一の例外だった voxel_to_mesh((v, f, n) を返す)は ops3d.RESULT_ADAPTERS で正典の 並びを取り出すようにした(gicp / vol_label と同じ扱い)。
- L8583 — ★2026-10-11:
system キーに最適化後の処方(同じ object_mm = inf)
- L8585 — ★2026-10-15: 絞りと像面の前の面は平面(R = inf、lens_system の規約どおり)
- L8587 — ★2026-10-15: 図の values に処方の平面の R = inf と、無焦点の EFL / BFL = inf、 分散の無い媒質の ν_d = inf を写す(lens_system の規約どおり)
- L8590 — ★2026-10-15: 非共軸の系(raytrace3d)は面の R = inf・物体の inf を記録に持ち、 ゴーストの表・光線の束は「届かない光線 = NaN」(trace_rays と同じ規約)、 図の values にも平面の R = inf を写す。opd_samples は瞳の外 = NaN、 with_wavelength は処方(object_mm = inf)をそのまま返す。
- L8597 — ★2026-10-19: 照準 / ケラレ係数を設定した処方もそのまま返す(R = inf、object_mm = inf)
- L8599 — ★2026-10-18: .zmx から読んだ処方(lensfile)は lens_system そのもの(物体が無限遠 なら object_mm = inf、平面の R = inf、ファイル側の面の表の DISZ = INFINITY)
- L8602 — ★2026-10-19: 構成ごとに解決した処方も lens_system そのもの(R = inf、object_mm = inf)
- L8604 — ★2026-10-19: 硝材置換・大域探索は処方(R = inf)を入れ子で返す
- L8606 — ★2026-10-19: 最適化後の処方(R = inf)を返す
- L8608 — ★2026-10-20: 解を解いた・解を外した・afocal の・像面を曲げた処方(R = inf、object_mm = inf)と、 その解の一覧(R = inf の行)を返す
- L8631 — ★2026-10-11(tests/test_ledger_contracts.py が初めて全台帳 op を呼んで挙げた分のうち、 docstring が非有限を名指ししているもの)。どれも「無い・測れない・届かない」を 0 で埋めず nan / inf で言う設計で、実際に非有限だった欄と docstring の欄が一致する ことを 1 本ずつ確かめた。docstring に書かれていない非有限(world_camera の depth の inf など)は載せていない —— 台帳の負債(docs/LEDGER_CONTRACT_DEBT.json)に残る。
- L8755 — ★2026-10-07: プロセスごとに分ける。固定名だと xdist の別ワーカーが同じ捨て場を共有し、片方の テストが「中身を消してから、何か落ちたことを確かめる」間に相手が消す/書く(Windows では開いている ファイルの unlink が PermissionError)。
- L456 — ★探針が作る
text は "ラベル 73" のように相対パスとしても成立する。 台帳でパス引数を text と宣言している書き込み op にそれが渡ると、op は素直に cwd へ書く —— cwd は repo 直下である。ファザー側(chain_fuzz.run_chain) には 2026-09-23 から捨て場が在ったが、採掘側のここには無かったので 2026-09-25 に repo 直下へ xlsx が 2 本生まれた。仕組みが在ることと、 全部の経路がそこを通ることは別([[feedback_count_wrapper_families_not_mechanisms]])。
- L25 — ★このスクリプト自身の置き場所を sys.path から外す。 Python はスクリプトの ディレクトリを sys.path[0] に載せるので、checkout の
tools/ から起動すると wheel 側の venv でも tools/ 配下(非同梱の chain_fuzz 等)が import できてしまい、 「wheel に無いものが見える」状態で数えることになる。2026-09-05 のレビューで、 この門が tb_* 143 op の欠落を見逃していたのはまさにこれ。 併せて cwd も空の一時ディレクトリへ移す(cwd が checkout だと同じことが起きる)。
- L34 — ★cwd を移す前に元の cwd を覚え、以後すべての引数パスをここへ解決する。 2026-09-05 実測: preflight は絶対パスで渡すので手元では通り、ci.yml は相対パスで 渡すので dump が一時 dir に書き捨てられ、compare が FileNotFoundError で落ちた —— 門が本番の呼び出し経路では一度も比較を実行していなかった。 「門は事故の起きる場所に立てる」の 3 度目。呼ぶ側を直すのではなく、 相対パスで呼ばれても正しく動くようにして、この型ごと閉じる。
- L139 — ★2026-09-08: editable 側も見る。それまで
a["failed_backends"] は 集めるだけで誰も読んでいなかった —— 同じ回に examplefig の図の失敗と 同じ型の穴として摘発した。editable の venv は optional 依存が多いので、 版の食い違いで backend が import に失敗しうる。そのとき wheel 側は 「依存が無いから最初から居ない」だけで失敗を記録せず、この比較は緑のまま 通ってしまう。落ちた backend の op はレジストリから黙って消える。
- L92 — ★ここは 2 度間違えられる。ファザーの
run_chain は (1) 入力型 any を「常に揃っている」として扱い(プールから任意に引く)、 (2) OP_ARG_BUILDERS に登録された op は引数を自前で組み立てる。 この 2 つを数えないと、実際には毎回走っている op を「構造的に到達不能」と 報告してしまう(実際に fuse_to_voxel / register_cross で誤報した)。 到達可能性は「型だけ」では決まらない ―― 到達経路の一部はコードの側にある。
- L89 — ★2026-09-14 追加。45,000 ケースを 3 秒で「食い違いなし」と言われたとき、 信じるのではなく自分が printf で挙げた「踏んでいない座標」を足す。 一致したときこそ探針を疑う([[feedback_one_probe_input_is_not_coverage]])。
- L185 — ★2026-09-14: ここは長らく値域だけを振って画素は 0..1 のままだった。相対しきい値は 値域を通して解決されるので、値域 (100,300) では絶対値 100〜300 と比べられ、 100% が空になっていた(実測: (100,300) は 780/780 が 0 画素、全体でも 63% が 物体 0 個)。4000 ケースが 0.6 秒で「食い違いなし」だったのは頑健だからではなく、 connection も measure_all もほとんど踏んでいなかったから ([[feedback_zero_findings_may_mean_never_executed]])。値域を名乗らせるなら 画素もその値域で描く。
- L198 — ★しきい値は画像に実在する値から引く。独立に引いていたときは 41% が 「選択 0 画素」で、物体が 2 個以上あるのは 14% だけだった ——
connection の 分岐(斜め接触・入れ子・多数)をほとんど踏んでいない。乱数で撒くと空ばかりに なるのは、しきい値も探針の一部だから ([[feedback_one_probe_input_is_not_coverage]]: 探針は入力画像だけではない)。 2 割は「当てずっぽう」のまま残す —— 空・全面・範囲外という端も要る。
- L236 — ★R-3 の相対→絶対の写像と画像の形。契約の関数なのに観測していなかった。
- L265 — ★
fs_region_runs は契約が「領域表現の唯一の窓」と呼ぶもの。それを 観測していなかった —— 面積と本数が合っていても、run の切り方が違えば run-length と dense mask は別物として振る舞う(隣接 run を結合するか、 行内の並びは昇順か)。観測していない性質はケース数では出ない。
- L295 — ★並びそのものを観測する。
sorted して比べていたので、物体の順序を逆にする 変異が 3,000 ケースで 1 件も殺せなかった(2026-09-14 の変異解析)。契約は 「最初の run の (row, col) 昇順」と明記しているのに、門がどこにも無かった —— 観測していないものは、どれだけケースを撒いても出てこない。
- L337 — ★R-3 の相対→絶対の写像そのものを観測する(契約
fs_image_absolute)。
- L351 — ★種別を捨てない。ここは長らく固定値 1 だったので、
_status_of を 書いて compare にコード比較まで足したのに、Python 側が常に 1 を 名乗るせいで状態コードの食い違いが構造的に出なかった(変異 m8 が 3,000 ケースで殺せなかった正体)。観測を足したつもりで足しきれて いない、という [[feedback_gate_computed_a_verdict_then_discarded_it]] の型。
- L381 — ★コードの値まで見る。「どちらも拒否した」で止めていたので、 契約が FS_E_INVALID_ARG(1)と決めている所で Python が FS_E_TYPE(2) 相当を投げていても素通りしていた(2026-09-14 に実際そうだった)。
- L390 — ★許容差は値域に対する相対で取る。絶対値で 1e-5 と決めていたら、 値域 (100,300) の画像で 1.04e-05 の差が「食い違い」として報告された —— が、切り分けると Rust vs scipy は float64 のままなら 8.53e-14、 float32 を経由した途端 1.04e-05。つまり
fslib の astype(np.float32) の丸めで、欠陥ではなく私の測り方の欠陥だった(値域比で見ると どの値域でも一様に 1.4〜5.2e-08 = float32 の相対精度)。 [[feedback_second_instance_artifact_not_physics]] と同じ型 —— 驚く結果は物理(実装の違い)で説明する前に道具を疑う。
tools/gen_blas_article_figs.py
- L93 — ★1 スレッドが最速だった範囲を半透明で敷く。線を隠さないよう先に置き、 alpha を低く保つ(帯そのものが主張しすぎると、線の比較が読みにくくなる)。
- L69 — ★「描く」= 機械に線を引かせる層(2026-09-22 追加)。「見せる」が人に見せる ための絵なのに対して、こちらはペンプロッタ・レーザー・刺繍のように 線でしか描けない機械への変換で、出口が G-code になる。
- L75 — 区分の英語名。★英語版でも見出しだけ日本語のままだった(実測 7 行)—— 中身は
title_en / _summary_en で訳してあるのに、見出しを訳し忘れていて 「切り替えたのに日本語が混ざる」の典型になっていた。ここに無い区分は 原文のまま出す(勝手に訳を作らない)。
- L91 — ★レシピ欄がまだ無い能力(理由つきで名指し、免除は縮める側)。 レシピ欄は 2026-09-15 に当時の 16 件 + 新設 8 件 = 24 件へ付けた(ブランチ rag/recipes-and-help)。そのブランチが本線に入らないまま 1 か月が過ぎ、その間に 足された能力 32 件には欄が無い。2026-10-15 に移植したとき、その分の連鎖・限界・ 実寸校正を確かめずに書き足すことはしなかった(型の門は通っても、限界と校正の文が 実測でなくなる)。欄を埋めたらここから消す —— 消し忘れは :func:
load_all が落とす。
- L132 — ★型付きの連鎖で書けない能力(ファサードの API で、(画像, a, b) の op ではない)。上の「後で書く」 とは理由が違う: 推奨パイプラインの各段は OP_INDEX の in/out の sort で型検査されるが、ここは 仕様(辞書)を書き出す関数で、画像の連鎖の途中に置けない。限界は本文の「向かない」に書いた。
- L48 — ★対訳表は op ドキュメントとは別ファイルにする。
opdocs.T を使うと 引いた原文が opdocs.SEEN_STRINGS に載り、既存の「枠の対訳に穴がある」門が 604 件すべてを穴として数えて CI が落ちる —— あの門は「枠の文言は必ず 5 言語 そろえる」ための門で、こちらは「訳せた順に増やす」性質のものだから、 同じ表に混ぜると片方の規律がもう片方を壊す。
- L82 — 1 塊 = ★ を含む行から始まり、同じ字下げで続く
# コメント行の連なり。 Sphinx 風の #: コメントも拾う。# と空白だけを剥ぐと先頭に : が
- L84 — 残り、生成物に「: ★…」と出る(実際に出た)。
: もここで剥ぐ。
- L128 — 次の ★ が来たら別の塊として切る(1 塊 1 主張に保つ)。
- L220 — ★印は訳さず
_(ja)_ に固定する。言語ごとに訳すと機械が数えられない —— tools/i18n_status.py が「印の無い日本語」を数える道具なので、 印が言語ごとに変わると 593 行が「隠れた日本語」に化ける(実際に化けた)。 ja は言語コードで、読み手にも「これは日本語」と伝わる。
- L253 — ★2026-10-07: 言語版の目次 INDEX..md もノートではない(以前は 5 本を数えて 3089 本を 3094 本と書いていた)
- L281 — ★ノートの集合は台帳から取る(ファイルを数え上げない)。 2026-09-06 の敵対的レビュー(Codex)で、ファイルを glob して stem を 数える版が
docs/ops/SAMPLES.md(op ノートではない)を 1 本混ぜており、 索引は 1,842、RAG ガイドは 1,843 と食い違う数を同時に公開していた。 ノートは records から 1:1 で生成されるので、records の名前が「ノートの ある名前」の定義そのもの。ファイルとの一致は tests/test_docs_index_reachable.py が別に見る(消えた/余った を検出)。
- L291 — ★
dir(fullseye) ではなく __all__。dir はモジュール属性(os / sys / warnings / annotations)を含み、しかも他のテストが import した後は 1 つ増える(1094 → 1095)ので、全体スイートでだけドリフト門が落ちた (2026-09-06)。公開面はファサードが __all__ で宣言している 1,091 名。
- L340 — ★索引は人だけでなく AI の検索面でもある(2026-09-06 のユーザーの指摘 「索引って RAG としても使われる部分だよね?」)。op ノートは AI コーディング 支援の検索コーパスを兼ねるので、機械が読む入口を索引に明示する。 半分しか無いものを「全 op」と書くと、RAG は残り半分について自信満々に 間違える —— だから
_honest() の実測行はこの節から外さない。
- L498 — ★2026-09-14: 長らく かな だけを見ていたので、「Studio 北極星」「実測記録」 のように 漢字だけで書かれた題に印が付かなかった —— 非日本語版の読者は それを英語の題だと思ってクリックする(印を付けないのは「読めない」という 事実を隠すことで、無訳より悪い、というのがこの関数の趣旨そのもの)。 題は常に日本語版ファイルから取る(
_doc_title(rel))ので、漢字を足しても 中国語の題を誤って日本語と呼ぶことは起きない。
- L518 — ★2026-10-11: 訳文ファイル(
X.zh.md など)の題はその言語で書かれている。以前は 日本語版と同じく漢字で判定して (ja) を付けていたので、中国語版の索引で中国語の文書が 「読めない日本語」と表示されていた。印はファイルの言語で付け、自分の言語なら付けない。
- L529 — ★2026-10-11: 日本語の原文にこの言語の訳があるなら、訳の題と訳へのリンクを先に出す (以前は英訳があっても英語版の索引が日本語の題と日本語版へのリンクしか出さず、 読める版があることが索引から分からなかった)。原文が日本語であることの印は残す。
- L690 — ★Qiita 投稿用の frontmatter(— で挟んだ YAML)は題ではない。中の
title: 行は 下の走査では見出しにも読み飛ばし対象にも当たらず、そのまま索引の見出しになって しまう(「title: ‘…’」と並ぶ)。挟まれた範囲ごと読み飛ばす。
- L94 — ★status=fixed なのに門が無いのは通さない —— 直したという記録だけが 残って再発を止められない状態を、この台帳自身が作らないため。
- L196 — ★リンク先(
docs/hardening/*.md)は日本語で書かれている。英題に 差し替えるのは嘘になるので、題はそのまま出して (ja) を添える —— 非日本語版の読者に要るのは「訳された題」ではなく「これは読めない」 という事実。印は tools/i18n_status.py が数える形に固定する。
- L41 — ★ここは「ただの定数」ではない: 線積分 p = Σ μ·Δx が 10 を超えると exp(-p) が 光子数 1 を割り、対数が飽和して p が頭打ちになる(photon starvation)。 最初の版は μ を 0.55–1.0「/画素」で置いてしまい、p が 30 に達して復元 μ が 50–84% 低く出た。零点(単純逆投影)の方が Dice で勝ってしまい、そこで気づいた。
- L166 — ★材質ごとの数字は 再現率(recall)。「その材質のラベル内で拾えた割合」であって Dice ではない(ラベルの外に出た偽陽性を数えないので、Dice と名乗ると必ず 1.0 に 近づく)。全体の取りこぼし/拾いすぎは下の precision / recall で別に出す。
- L65 — ★ 巻き順は外向き。逆にすると法線が内を向き、render_beauty が 例外を出さずに真っ黒を返す(最初の版がそれで、薄膜の球だけ黒かった)。
- L84 — ★2026-10-03: 運転の系列の集大成と「開かれた運転基盤」のために足した 2 分野。テーマ表は製造の表と分ける (共通の 1 枚に足すと、運転の「digital twin」が製造の予知保全の op に、製造の「reconstruction」が 3DGS に当たる)。
- L288 — ★2026-10-15: 実験計画・応答曲面・品質工学・感度解析(opsmultivar)。鍵は製造のクラスタ名に実際に出る語 (射出成形の「optimization」、加工の「optimization」「prediction」)—— 工程条件の最適化と予測は、文献では 直交表・応答曲面・感度解析で回す領域。
- L306 — ★2026-10-15: sim-to-real 較正(opssimcal)。鍵はクラスタ名に実際に出る語(慣性センサ・力覚の「calibration」、 鍛造・交通・レーダの「simulation」「modeling」)—— シミュレーションを実物に合わせる・センサを較正する領域。
- L320 — ★2026-10-15: 収束型の演算(opsconverge)。鍵はクラスタ名・葉の名前に実際に出る語(有限要素の「finite」= 格子の収束の検証、 霧・散乱・光線の輸送の「fog」「scattering」「transport」= 多重散乱のモンテカルロ、描画の「rendering」= 相互反射を収束まで)。
- L389 — ★2026-10-15: 10 月に足した op の系列(研磨・粉体・粉末 X 線)は、既存のテーマの語に当たらず文献層から 1 本も 指されていなかった。語はクラスタ名に実際に出るものだけを置く(当たらない語は当てない)。
- L535 — ★2026-10-03: corpus2skill は葉へ写すときに Authors / Date / URL の行を落とす(元の papers/*.md には在る)。 その結果、出荷した文献層の代表論文がすべて「— (n.d.)」になり、「新しい順」も日付なしで並んでいた。 葉の Source: が指す元ファイルから、欠けた欄だけを補う(元のパスは読むだけで、出力には書かない)。
- L651 — ★2026-10-15: ここはテーマごとに先頭 8 本で黙って切っていた。表の後ろに足した op(10 月の研磨・材料表・ ファイバ・触覚・peg-in-hole …)は対応表に在るのに文献層のどこにも出ず、表に書いたことが嘘になっていた (2026-10-15 時点の表 251 op のうち 21 本。うち 3 本は SPC のテーマの鍵がどのクラスタ名にも当たらなかった分)。 テーマは多くても 17 本なので全部出し、当たらないテーマは INDEX に名指しする(dead_themes)。
- L101 — ★2026-10-15: 上の TIO2 はルチル単結晶の常光線だけ(430 nm から・k なし)。成膜した TiO2 は非晶質か アナターゼが多く n が低い —— 膜の計算はこちらを名指しする(非公開の膜の PoC で、ルチルの n で膜を 解くと傾いた面の膜厚の偏りが小さく出ることを確認)。
- L145 — ★光収率の幅(
light_yield_range_photons_per_mev、2026-10-24): 文献の値のばらつきが「何の違い」から来るかを 読んだ材料だけに (下限, 上限) を入れる(CdWO4 と LYSO)。それ以外は None(幅が無いのではなく、確かめていない)。 CdWO4 の 7,800〜15,800 という低い値の多くは、減衰 13 µs に対して整形時間が短い(1 µs では光の 2〜3 割しか 拾わない)ことと、光電子数 phe/MeV(光検出器の QE と光の集め方を掛けた後)を光子数 ph/MeV と混ぜたことによる。 こうした値は幅に入れない —— 幅は「絶対値として測った値」どうしの違いだけにする。
- L151 — ★発光の形(
emission_components、2026-10-24): 室温・X 線/γ 線励起で FWHM を数値で書いた一次文献は 見つからなかった。幅は全部、一次文献の図から読み取った値で、成分ごとに digitized_from_figure の印を付ける。 1 成分 = 中心 [nm]・FWHM eV・積分の重み・測定配置(surface = 励起した面から出る光 / thick_crystal_transmission = 厚い結晶の中を通って出てくる光)・励起の種類(xray / gamma / uv)・ 出典。ガウスはエネルギー軸の形(Ce³⁺・自己束縛励起子の帯はエネルギーで対称)で、波長軸へは消費側 (dualxray.scintillator_sensor_qe)がヤコビアン hc/λ² を掛けて移す。同じ測定配置の成分の重みの和は 1。
- L157 — ★
center_nm はエネルギー軸の中心(hc/E_c)。波長軸の山はヤコビアンで数 nm 短波長に出る(BGO 480 → 468 nm)。 図の「極大」は波長軸で読んだ値なので、厳密には中心をやや長波長に置くべきかもしれない —— 差は Q̄ で 1.4 % 以内 (2026-10-24 に計算)で、調査で承認された値(中心 = 公表の極大)をそのまま使う。 幅の分からない材料(CsI:Tl / NaI:Tl)は None のまま —— 消費側は発光の極大の 1 本の線として扱い、そう 返り値に書く(幅を推測で入れない)。実測の発光スペクトルがあれば emission_spectrum= で渡す (CsI:Tl は 2.25 / 2.55 eV の 2 帯だと分かっているが、幅と強度比を確かめられなかった)。
- L539 — ★k だけを取る区間(n は次の出典のまま)。2026-10-15: RII の Hale & Querry の水は NIR を 0.2 µm おきにしか持たず、1.45 / 1.94 µm の吸収帯を線形補間で 1/3 に潰していた。n は滑らか なので Hale のまま、k だけ Segelstein 1981(同じ研究室の続き、細かい刻み)から取る。
- L105 — 任意キー。ここに無いキーは拒む(fail-closed)。★所属・勤務先・製品名の欄は 意図して持たない —— 報告者に求めない情報は、台帳に置く場所も作らない。
- L313 — ★これは下界。
tests/ に op 名が literal で現れるかしか見ていないので、 台帳を舐めて全 op を回す掃引型の試験(for name in ledger: ...)は数えない。 「試験が無い」ではなく「名指しの試験が無い」と読むこと。
- L335 — ★報告が付いた行にだけ鍵を足す(空の台帳で出力を動かさない)。 repo 内の判定は別の鍵に残す —— 1 つの段に畳まない。
- L265 — ★fail-closed: op の一覧は台帳の本体。ここを「(section failed)」の 1 行で済ませると カタログが黙って空になる(pip だけの利用者の RAG はこのファイルしか持たない)。
- L90 — ★2026-09-17: 戻りの橋
feature_to_img で feature が初めて入力に なった。1 段で image -> feature を作れる op(intensity = 平均輝度)を 前置きにする。これが無いと図が「型が届かない」に落ちる。
- L99 — ★2026-09-17:
deskew は「傾いていないものは動かさない」op なので、合成の 標準入力(canonical_image)に掛けると in と out が同じ絵になり、図が 何も語らなくなっていた(実測: 標準入力 8 枚のうち 5 枚で恒等、図は恒等の 方)。走ったことと意味のある出力が出たことは別 —— 先に 7.0 度 傾けてから 渡す(rotate_img の角度は -45 + 90a なので a=0.5778 が +7.0 度)。
- L115 — ★2026-09-08: この表に居た
tb_angle_3points と tb_indices_to_labels は、 「図の定義域の外」ではなく 橋に載せてはいけない op だった。前者は 3 本の ベクトルを取るので点群 1 本では呼べず、後者は 1-D を返すのに宣言 out が labels(→ volume = ndim 3)。どちらも登録されたまま一度も走ったことが無く、 fail-soft がもっともらしい値を返していた。backends_typed._OP_BRIDGE_SKIP へ 移し、この表からは外した —— 図が出ないことの記録は在ったのに、走れないこと 自体の記録がどこにも無かった(門が 2 つあって、片方だけが気づいていた)。
- L124 — ★2026-09-13: op が evolute 検証を得て厳格化。ECEF は地球表面(中心から ~6.4M m)の 座標を要るが、画像由来の合成点は原点付近で必ず楕円体の evolute 内に落ちるため 正しく拒否される(実データでは動く。合成入力では図を作れない恒久的な定義域ミスマッチ)。
- L127 — ★2026-10-04: 主点を 0.5 画素ずらすだけの橋(CARLA ↔ Fullseye の内部パラメータ)。3×3 で焦点距離が正の K しか受けず、 汎用の合成 matrix は fail-closed で拒否される(op_probe の探針 K では走る —— tests/test_backends_typed_liveness.py)。
- L140 — ★2026-09-07(ユーザー指示「1 枚に纏める必要はない。段階的なもの・条件が複数 あるものは分けて出す」「物によっては疑似カラーのほうが分かりやすい」「複雑なものは アニメーション GIF でも」)。主図
<op>.png に加えて、 <op>.a.jpg / <op>.b.jpg — つまみを 0.1 / 0.5 / 0.9 に振った 3 枚(出力が 変わるときだけ。変わらなければ manifest に理由) <op>.chain.jpg — 前置き op がある op の段階図(画像 → 中間 → 出力) <op>.gif — 出力が動画 / ライトフィールド / 体積のとき、フレーム / 視点 / スライスを順に見せる(静止画 <op>.png が完成形で GIF は追加。Studio の QTextBrowser は 1 コマ目を出す) 疑似カラーは量の場(距離・位相・向き・深度・曲率 …)の出力にだけ掛け、 キャプションに (viridis) と書く。フィルタ系はグレーのまま(色が変わる op に 見せない)。
- L756 — ★「走った」と「意味のある出力が出た」は別(2026-09-07、ユーザー 指摘「out が真っ黒なのはなんだ?」)。空配列を「図あり」に数えると 黒い板が図になる。空は空と記録し、ノートに理由を書く。
tools/gen_view2026_pages.py
- L181 — ★2026-10-30: 2 つの展示の日本語が 10/27 から「???…」のまま載っていた(× と − も全言語で ? に)。 文字コードの往復で失われた文字は ? か U+FFFD になる。どちらも訳として通さない。
- L592 — ★2026-09-02: highpass / bandpass_image は「0 を 0.5 に写した [0,1]」を 返す規約になった。以前は符号つき配列を image と称して返しており、 保存・段間 clip で負の半分 (画素の約 50%) が無言で 0 に潰れていた。 直ったことを推測でなく実測で残す: 最小値と負画素の割合。
- L727 — ★2026-09-02: estimate_noise は σ の単位で返るようになった (以前は σ>=0.08 で 1.0 に張り付き、3 倍違う σ に同じ値を返していた)。 直線 y=x を並べて「返り値が σ そのものか」を目で確かめられるようにする。
- L840 — ★_panel_grid のラベルは折り返さず、幅を超えると隣とぶつかって読めなく なる (tile 262px / font 19-17px なので 1 行 ≈ 全角 12 文字が限度)。 倍率の意味は表題と副題に逃がし、パネルには短い名前と数字だけ置く。
- L1184 — ★2026-09-02:
area_center は名前どおり (面積比, 行, 列) の 3 成分を返す ようになった (それまでは面積比 1 スカラだけで、中心を返していなかった)。
- L1186 — ★2026-09-26 から 3 成分とも画素(面積 [画素数], 行 [px], 列 [px])。 それまでは [0,1] 正規化で、ここで ×(H-1) / ×(W-1) して画素に戻していた (2026-10-15 に直すまで、画素の値をさらに (H-1) 倍していた)。返した中心を 絵に打って、返り値が本当に中心であることを見て分かる形にする。
- L1713 — ★1 点ずつ apply_cmap を呼ぶと、その 1 点の中で正規化されて全部同じ色になる。 0..1 を張った LUT を 1 回だけ作り、そこから引く。
- L1951 — ★2026-09-02: gabor はカーネルの L1 ノルムで割る固定スケールになり、 op を跨いで比べられる絶対値を返すようになった。それまでは 「その画像での最大絶対値」で割っていたので、向きごとに別の除数で 割ることになり、応答の大小そのもの = 向きの識別力が潰れていた。 その代わり返り値は [0,1] のうち下端の狭い範囲 (この 3 模様では平均 0.007〜0.030) に収まるので、そのまま貼ると 3 枚とも真っ黒になる。 絵は 1〜99%tile で伸長して見せ、ラベルの数字は伸長前の実測値を出す (freq_sweep の highpass パネルと同じ約束)。
- L2066 — ★2026-09-02: 3 op は別実装になった。以前は 3 つとも geom “zoom” に相乗りで 相互の最大差が 0.0 / 4.9e-14(= 同一)、しかも 3 つとも b が死んでいた。 いまは zoom_image_factor=縦横 2 倍率 / zoom_image_size=目標サイズ / rescale_img=等方倍率 + 補間次数。キャンバス shape はどれも入力のまま。
- L3878 — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L411 — ★ 雑音は :func:
astrostack.noise_sigma(背景の頑健 σ)で測る。 「真値との残差 RMS」を使うとPSF のずれまで残差に入る —— この実験は わざとフレームごとに FWHM を変えているので、選び方を変えると合成後の PSF が変わり、残差が増えたのが雑音のせいなのか像が変わったせいなのか 区別できなくなる(実測でその値は 25.2 -> 61.3 と動いたが、その大半は 雑音ではなかった)。背景 σ は星の形に依らない。
- L471 — ★ 「最大差」は単一フレームでは動かない —— 再現率が 1 未満である限り、 見逃した 1 画素が最大値をそのまま押さえてしまうから。何画素が正解から 大きく外れたままかと外れの総量なら、除去の効き目がそのまま出る。
- L713 — ★ 原寸で並べると「2 個検出した」が目では確かめられない(44x44 の 中で 1.6 画素の対は数画素の塊にしかならない)。検出器の言い分だけを 信じさせる図にしないため、対の周りを同じ物理範囲だけ切って拡大する。
- L844 — ★ 誤差図は符号ではなく大きさを塗る。最初の版は発散配色で塗って いたが、この実験の誤差は常に正なので「正 = right の青」になり、 壊れている状態が「正しい」色で塗られるという逆の意味になった。 ここで読者に伝えたいのは向きではなく「どれだけ間違っているか」なので、 wrong の 1 色で濃さだけを変える(色だけに意味を載せないよう、 記号と数値も併記する)。
- L1417 — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L573 — 5. ★表現をまたいで一周(変換の連鎖こそが嘘の出る場所) # ————————————————————————— #
- L599 — ★「殻であって立体ではない」を 最大値投影で言ってはいけない —— MIP は奥行き方向の最大値なので、薄い殻でも中が詰まって見える(実際に一度 そう描いて「体積 5768 -> 殻 5608」というほとんど差の無い数字を出しかけた)。 中身が残っているかは 中心断面 と 内部の充填率 で言う。
- L862 — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L2065 — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L896 — ★バーが張る像面の実寸。1.0 mm にしていたとき 208 標本 / mm = Nyquist 104 cyc/mm となり、200 cyc/mm のバーが 8 cyc/mm の太縞に化けていた (図が自分でエイリアスしていた)。0.25 mm なら 832 標本/mm、最高周波数 200 cyc/mm でも 1 周期 4.16 画素で足りる。
- L1151 — ★2 つの量を 1 枚の図に重ねると、尺度の取り方しだいで 2 本の曲線が 偶然ぴったり重なる(最初の版がまさにそうで、「独立な 2 軸」という主張の 真逆に見えていた)。尺度をいじって離すのは誤魔化しなので、パネルを縦に 分ける — 図の構造そのものが「別の軸だ」と言う。
- L1299 — ★ピークは行全体から取る。以前は
line[c - s : c + s + 1] と 書いていて、s が c を超えると 開始が負のインデックスになり、 Python が末尾 56 画素だけを切り出して 0.6167 を「ピーク」として返して いた(実際の最大は 0.9834)。正規化が崩れて曲線が 1.0 で頭打ちになり、 dip/peak も 1.9x Rayleigh で 0.0067 と誤って出ていた。
- L1581 — ★「ぼけ 1 画素以内」の範囲は格子から拾わない。掃引の刻みは 3.9 mm で、 被写界深度は 0.74 mm しかないので、格子には 1 点も入らない(最初の版は そこで min() が空になって落ちた)。二分法で境界そのものを解く。
- L1600 — ★誇張倍率は 縦の画素/mm ÷ 横の画素/mm。最初の版は逆数を書いていて、 8 倍に伸ばした図に「0.13 倍」と表示していた(読者に真逆を伝える)。
- L2090 — ★上下 2 段に分ける。1 枚に重ねると、単位の違う 2 本(画素数と検出率)が 同じ縦軸に乗っているように読めてしまう(実際そう見えていた)。
- L2776 — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L52 — 総合案内。★既存の Qiita 枠がこのファイルを指しているので、名前を変えない ―― 外部リンク・LGTM・ストックはこの URL に付いている。館の入口に充てるのが筋。
- L150 — 1 展示に出す静止画の追加枚数。★2 枚固定をやめる(2026-09-24)
- L405 — ★見出しは収蔵番号。順路番号(何番目か)は出さない —— 展示を 1 つ挟むだけで 以降が全部ずれ、記事を分けるたびに番号が動くため(2026-09-25)。
- L433 — ★追加の静止画。説明は 1 文に切る(枚数を増やすのが目的で、詳しい 説明は主図と 2 枚目が持っている)。2026-09-24 に 2 枚固定をやめた。
- L459 — ★展示に載るのは 1 本あたり 2 枚ほど。PoC は中央値 6 枚・最大 25 枚 作っているので、残りへの道を必ず出す(2026-09-24、ユーザー指摘 「生成した数百枚はどこにあるのか記事からは分からない」)。
- L484 — ★解説板の「この部屋の {n} 点」は生成で埋める。手書きの数は腐る ―― 10 翼中 9 翼が展示 53 点の頃の数を名乗ったままだった(産業検査は 10 と 書いて実際 27、2026-09-25)。例外は出ず、門も赤くならない。
.format は使わない(解説板に別の波括弧が在ると壊れるため)。
- L533 — 棟の目次。★展示数は毎回数えて出す(手で書くと必ず古くなる)。
- L539 — 目次に出す短い翼名。★区切りは ` / ` —— 翼名そのものに「・」が入るので (寸法・形状計測 / 医用・生物 / 色・分離)、「・」で繋ぐと境目が読めなくなる。
- L645 — ★
external の部(手書きの数学記事)は描かない。index は案内なので上で出した。
- L2611 — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L219 — ★2026-10-18(外部レビュー 0.6.0 N220 の一次検証): 以前は
--all-region が大域の _REGION_MODE を 立てるだけだったので、--all-image --all-region を 1 回で回すと画像の op まで二値の探針で測り、 別々に回すと 2 回目の --json が 1 回目を上書きした。結果、op_knob.json は region -> region の 87 op を一度も載せておらず(461 / 567)、9-16 以降に足した image -> image の 19 op も未計測のまま だった。二値の探針は op ごとに、入力の型(索引の in_sort)が region のときだけ使う。
- L657 — ★効かないノブを台帳に足して黙らせない(2026-10-23): 既定の入力では効かない 3 本は、効く入力で探る。 fp_design の境の許容は NA_obj = 0.12 で軸の 2 番目の LED(NA 0.1135・0.1267、差 0.0065)が許容の 2 倍の内側に入る。
- L949 — ★探針の 32×32 だと目盛の文字幅が書体で変わり、手元(Windows の書体)は右に 3 px はみ出して 拒否・CI(代替書体)は収まって通る —— 環境で判定が割れた(2026-10-11)。余白を取って両方で通す。
- L430 — ★2026-10-14: 絶対許容差 1e-12 は、出力が 1e-21 の桁(重力波のひずみ
chirp_newtonian)だと どのノブも「変化なし」にする。出力の最大絶対値が 1 より小さいときは、その大きさで許容差を縮める (1 以上の出力では以前と同じ)。
- L42 — ★ここを持たなかったあいだ、:func:
_called が (op 名 × example) の全組合せで :func:_strip_prose を呼び、そのたびに ast.parse + tokenize でソース全体を 解析し直していた。実測 2026-09-05: 2-D 881 op × 73 本 + 3-D 347 op × 118 本 + ledger 494 op × 73 本 = 約 14 万回のフルパースで、opdocs.py md 1 回に 10 分かかっていた(toc も html も同じ索引を作り直すのでフル再生成は 30 分級)。 散文落としはソースごとに 1 回あれば足りる ―― op 名に依存しないので。
- L142 — ★2026-09-08: ops1d(dsp 16 + funct1d 23)は登録済みなのに docs/ops に 1 枚もノートを持っていなかった —— OP_CATALOG には出るのに、op ごとの ノート(型契約・罠・関連 op)が無いので RAG コーパスから丸ごと欠けていた。
poc_web_roll_periodicity が dsp に 2 本足したときに気づいた。
- L919 — ★2026-09-23 の実測: 1 回 7〜11 秒かかるこの関数を、
gen_docs_index_ops が 6 言語 x 3 ブロックで 18 回呼んでおり、test_the_generated_blocks_are_current だけで 129 秒使っていた(スイート 2,301 秒の 5.6 %)。答えは ops.REGISTRY と docs/ から決まり、1 プロセスの中で動かない。 前提は「同じプロセスの中では台帳とノートが変わらない」。生成器は regen_all.py が別プロセスで呼ぶので跨がない。プロセス内でノートを 書き換えてから読み直す側は _records_cache_clear() を呼ぶこと (呼ばないと古い答えが返る —— 黙って古い値を返すのが一番たちが悪いので、 ここに明記しておく)。
- L981 — ★n-ary(多入力)層。2026-09-09 まで 17 op がノートを 1 枚も持っていなかった (
add_image sub_image bit_and reduce_domain union2 …)。OP_INDEX.json には tier=nary で載るのに docs/ops/ に無いので、RAG コーパスからは 永久に引けない状態だった。見落とした理由もはっきりしている: ここが ops.REGISTRY だけを歩いていて、ops.REGISTRY(899)と 2-D ノート(899)は 一致するので「欠落ゼロ」に見えた。層をまたいで数えて初めて出る (memory: feedback_search_all_tiers_before_declaring_a_gap)。 握り潰さない —— imgops_nary は numpy/scipy しか要らない一次モジュールで、 import に失敗するのは「壊れた checkout」であって「その環境に無い機能」ではない (imgevolve._all_ops が同じ理由で except を外している)。
- L1023 — ★2026-09-07:
OPS3D[...]["doc"] は登録時に docstring の 1 行目だけ を切り出したもの(ops3d._build)。ノートの「使い方」にそれを使うと、 実装が何段落書いていても 1 行に化ける —— 「使い方が 1 行の op 494 本」 の 3-D ぶんはこの切り詰めが原因だった(docstring 自体は長い op が多数)。 台帳 dim と同じく関数の docstring を丸ごと読む。
- L1046 — ★橋渡し op(
tb_<name>)は台帳の <name> と実装が同一で、例は台帳名で 書かれる。2026-09-06 まで 147 本が「例ゼロ」だったが、それは同じ実装を 呼ぶ例が別名で存在するのを数えていなかっただけ。台帳側の例を継承し、 ノートには「元 op の例」と明記する(嘘にならないように)。
- L1104 — ★2026-10-12: 2-D の例索引(
op_example_index._op_names_2d)は ops.REGISTRY から identity と 橋渡し op(category typed)を外し、n-ary 層(imgops_nary)はそもそも数えない。そのため この 3 種のノートは、examples/ に fullseye.apply([x1, x2], "add_image") や fullseye.apply(F, "tb_cx_ifft") と名指しで呼ぶ例があっても「(まだありません)」のままだった (n-ary 17 本・identity・元 op の例を継承できない tb_cx_* 7 本)。カバレッジの門の母集団は変えず、 ノートの案内だけ同じ呼び出し検出(_index_for)で名前を直接引く。
- L1282 — ★n-ary(多入力)op は
fullseye.apply では呼べない —— あれは 1 画像 モデル。ここに 1 画像の呼び方を書くと、ノートが嘘をつく(この ノートの唯一の仕事は「どう呼ぶか」なので、それは無いより悪い)。 公開経路は fullseye.FullseyeGraph。
- L1301 — ★2026-09-07: 公開経路を先に書く。ここは実装モジュールの直 import しか 書いておらず、利用者が実際に使う
fullseye.ledger.<名> が出ていなかった (2-D 以外の 1,244 op すべて)。PoC が繰り返し「fs.<名> に無い」と報告して いたのは、名前が無いことではなく**入口が書かれていないこと**の問題だった。名>
- L1752 — ★入口は 6 言語で出す(2026-09-09)。葉(Studio の op ヘルプ)は 6 言語 10,191 ページあるのに、そこへ導く索引が日本語だけだった —— 訳は 在るのに辿り着けない、という形の欠落。枠の文言は
T() に載せるので、 対訳の穴は既存の門(test_chrome_translation_table_has_no_holes)が見る。
- L1792 — ★2026-10-15: 族の名前だけでは中身が分からない。
drive(694)は研磨(polish)・粉末 X 線回折 (pxrd)・触覚(tac*)・peg-in-hole を抱え、optics は材料表(matprop)・ファイバ(fiber)・ センサーの特性(sensorchar)を抱える —— 族名で選ぶ読み手は、それらを開かずに「無い」と言う。 入口でカテゴリ名を全部見せる(名前は識別子なので訳さない。各カテゴリはその族の INDEX の節)。
- L1803 — ★2026-09-15: 用途から引く索引(docs/CAPABILITIES.md)へここから送る。文書だけを 渡した AI が 1 回目に見つけられなかったのは、この目次にも AI_RAG_GUIDE にも 導線が無かったから。
- L1812 — ★ここは長く
2d/guides/ だけを指していて、光学・PIV・トモグラフィ等 30 ファミリのガイドへ読み手を一度も送っていなかった(2026-09-09 修正)。
- L1970 — コードスパン。★
…(RST / docstring の二重バッククォート)を … より先に試す。 2026-10-07 まで ([^]+) だけで、p measures … p が「 の 2 文字目と次の の 1 文字目」で組まれ、コードと散文が**反転して**表示されていた(英語版 3,153 枚中 約 2,800 枚)。前に付いた RST ロール(:func:x など)は飲み込み、対象名だけをコードで出す (733 枚で :func:` が生で見えていた)。
- L2139 — ★置き換えは描画時と同じ退避記号で(空白にすると
**raises `ValueError`** の閉じの 直前が空白になって太字の組が外れず、英字にすると **name**`(a)` の閉じの直後が 英字になって外れない —— どちらも「閉じていない」と誤判定して次の箇条書きを飲み込んだ)。
- L2841 — ★2026-09-20: 生成を終えたあと、インタプリタの終了処理(fullseye が引き込む mediapipe の shutdown dispatcher)で 30〜60 分固まり、regen_all の連鎖がその間止まった(2 度実測、CPU 0)。 出力は全部書き終えているので、flush してから os._exit で確定させる。
- L121 — ★
build/lib に前回の staging コピーが残っていると、setuptools はそれを そのまま wheel に詰める(2026-09-05 実測: py-modules から外したモジュールが wheel に入ったままで、門の変異テストが通ってしまった)。release.yml が clean checkout から建てる理由と同じ。ここでも建てる前に必ず捨てる。
- L233 — ★2026-10-18: スクリプトは一時 dir に置くので、
import fullseye は editable install(本線の 作業ツリー)を読んでいた —— worktree で出すリリースを検査したつもりで、別の版を見ていた。 PYTHONPATH でこの ROOT を先頭に置き、点検する対象 = 出すツリーにする。
- L319 — ★全出力は repo の外に残す。repo 直下に置くと「余計なファイル」を見る門に 当たりうるし、木が汚れて「凍った木で 1 回」という証拠の条件が崩れる。
- L362 — ★
--only suite を --full 無しで呼ぶと 0 項目になり、以前は 「すべて PASS」と言って rc=0 で帰っていた(2026-09-05 レビューで実測)。 何も検査していないのに通す門は、無い門より悪い。
- L20 — # 選び方(★ここが肝)
- L55 — ★
__all__ と list_ops は入れない。どの族のテストにも出てくる語なので 392 本中 107 本を選んでしまい、そのうえ肝心の探針の門(test_op_probe_ledger)は その語を持たないので取り逃す(2026-09-23 実測)。広く取れば安全、ではない —— 選ぶ語は「その帳簿を読んでいる」ことの証拠でなければならない。
tools/qiita_post_poc.py
- L100 — 既定で投稿する記事の種類。★手書きの
external は名指ししたときだけ扱う —— 引数無しの 一括投稿が、生成物でない記事(数学の回など)を巻き込まないようにする。
- L49 — ★最上流。
auto_specs_data.py は backends_auto が registry を組む入力(wheel 同梱の data/auto_specs/*.json の複製)なので、registry を読む下流すべてより先に回す。 2026-10-07 まで tools/ の外にあって鎖にも表にも無かった(差分は無かったが、 spec を足して回し忘れても誰も気づけなかった)。
- L54 — ★
tools/ の外にある唯一の生成物。だから取りこぼしていた —— 生成器を tools/*.py で探す限り、これは永久に見つからない。
- L56 — ★2026-10-15: 16 番目から 2 番目へ上げた。入力は registry だけ(他の段の生成物を 読まない)なのに、gen_capabilities_index と gen_trust_block がこれを先に読んでいた —— op を足すマージで索引に本線側を取ると、古い索引に新しい op が無くて止まる (統合作業で
imgevolve.py index を手で先に回して回避していた)。順序は 下の OUTPUTS / READS から order_violations() が検査する。
- L73 — ★展示館より先に回す —— 生成器は見出しに収蔵番号を出すので、 未発行の展示が 1 つでもあると BuildError で止まる。
- L88 — ★これも
tools/ の外。2026-09-20 まで鎖に無く、docs/OPERATORS.md が 885 op / 47 分類(2026-09-06 の値)のまま置き去りだった(GenSpark 第 53 報と ユーザー指摘)。生成器が鎖に無い生成物は、必ず古びる。
- L92 — ★2026-10-07: 以下 3 本も
tools/ の外にあり、列挙が tools/*.py しか見ていなかったので 鎖にも表にも無かった。どれも registry とコミット済みの入力だけから決まり、2 回 回してバイト一致・各 3 秒(実測)。置き去りの実例: EXAMPLES.md は「67-op」、REFERENCES.md は「153 operators」、 OP_DISPOSITION.json は implemented 324(実際 405)のままだった。
- L100 — ★2026-10-15:
--md が無く、何も書いていなかった(要約を標準出力に出すだけ)。 docs/CONVERSION_MATRIX.md は 2026-09-02 の「型 59 / 変換ペア 164」のまま古び、 –check は「書かない段」を drift として見られないので 6 週間通っていた。 いまは trace_problems() が「宣言した出力に触れもしない段」を拒む。
- L108 — ★2026-10-15: 13 番目から最後の方へ下げた。docmap が docs/.md の題を読むので、 題を持つ生成物(OPERATORS / REFERENCES / EXAMPLES / EXAMPLES_3D / SENSOR_PLAYBOOK / CONVERSION_MATRIX / DESIGN_NOTES)を書く 7 段すべてより後でなければならない —— 以前はその 7 段より前にあり、題が変わると 2 回回さないと揃わなかった。 文献層の本体はコーパスが要る(EXCLUDED)が、「op ノート N 本」の件数は docs/ops を数えれば直せる。 docs/ops を書く opdocs の後、題を読む docmap(gen_docs_index_ops)の前。
- L308 — * ★そして危険: 生成直後の記事は画像を相対パスで書く。公開版は
raw.githubusercontent.com の絶対 URL に直したもの(Qiita は相対パスだと 画像が出ない —— memory feedback_qiita_svg_path_and_cache)。生成器だけを 回すと、その絶対 URL が 42 行ぶん巻き戻る。回すなら記事の公開手順まで 通しでやること。 除外はファイル名で書く。散文でまとめると(「wing*_gallery の 10 本」) 機械で照合できず、下の unclassified() が働かない。
- L675 — ★2026-10-07: 印も探す場所も狭すぎた。初版は
open(..,"w") / write_text / savefig / json.dump だけを tools/*.py(直下のみ)で探していたので、 * repo 直下の生成器が 1 本も見えなかった —— samples.py(docs/EXAMPLES.md が 「67-op」のまま)、references.py(「153 operators」)、dispositions.py、 lib_coverage.py(885 op のまま)、honest_summary.py …。imgevolve.py と catalog.py だけが手で足されていた —— 手で足す方式は、足し忘れを拾えない。 * 画像の書き手が 1 本も釣れなかった —— PIL の .save、imageio の mimwrite、write_bytes、Fullseye 自身の write_video / save_gif …。 gen_banner の PNG は「731 2-D + 265 3-D」と書いたまま古びている。 * tools/impl2/ など下の階層も見ていなかった(docs/op_*.json の台帳)。 印を広げれば門・デモ・ライブラリも釣れる。それは構わない —— 釣れたものは全部 上の表に理由つきで載せる(印は緩めない)。
- L690 — ★2026-10-25: まだ狭かった。
pv.write_viewer( / fs.write_viewer( で HTML を書く生成器 (tools/build_view2026_viewers.py、題材の枝の tools/build_*_anim3d.py)がどの表にも 載っていなかった。同じ洗い出しで open(.., "wb")("w" しか見ていなかった)と shutil.copy* / copytree / move も足した。印ごとに「その印でしか釣れない実在の 生成器」を tests/test_regen_all.py が要求する(印を消せば落ちる)。
- L738 — ★
tools/ の外にある生成物。tools/*.py を歩くだけでは永久に見つからない 位置にあり、実際 docs/OP_INDEX.json を取りこぼしていた。
torch_lazy.py
- L69 — ★2026-09-20(GenSpark 第 24・25 報 N94): torch が入っているのに「install with」だけが出て、 導入すれば直ると誤って案内していた。入っているのに import で落ちたなら、その理由を言う。
treemorph.py
- L217 — ★殻の中点に置く((k - 1/2) * top / n)。上端を top ちょうどにすると最も遠い節点が 殻の上に乗り、回転で 1 ulp 動いただけで「内側/外側」が反転して交点が 1 -> 0 になった (回転不変の門が捕まえた)。
typed_catalog.py
- L242 — ★打ち直しは入力の頂点数より少ない標本を拒否する(角を切って線が短くなり、 濃淡の再現が壊れるため)。探針より確実に多い数を渡す。
- L252 — ★2026-10-07: 一時ファイル名にはプロセス番号を入れる(固定名だと xdist の別ワーカーが同じファイルを 同時に書き直し、読む側が壊れた zip や途中の G-code を掴む)。 printpath(2026-09-21)。読む op のパスは、その場で書いた小さな本物のファイルにする(無いパスは CONTRACT で 永久に走らない)。書く op のパスは一時ディレクトリ。z は種の mesh(単位立方体あたり)に当たる高さ。
- L323 — ★ 既定値そのものが重い件は別扱い —— docstring に費用表を書き、 docs/KNOWN_ISSUES.md に「解いていない」として残した。ここで軽くするのは 検査を通すためであって、遅さを隠すためではない。 fourier_smooth(points, keep) の keep は既定が無い必須引数。束縛できないと 「引数が組めない」で永久にスキップされ、カバレッジ表には未到達として しか出ない(2026-09-06 の初回計測で 13 op 中この 1 本だけ落ちた)。 表面粗さ。制約は 2dx <= lambda_lo < lambda_hi <= ndx / 0<hurst<1 / sq>0 / n>=8。 サブピクセル計測。測定線の生成 op は入力を取らないので全引数にヒントが要る。
- L388 — ★ここを入れないと surface_params は毎回 fail-closed で拒否され、 カバレッジ 1 数字では「呼べた」に見えて実体は未実行になる。
- L561 — して探針の値が読みやすいようにする。★既定の weight=”phat” は band が必須(0.5.0、 全白色化は帯域の限られた信号で外れる)。rate=1.0 なので band は cycles/標本で全帯域を明示。
- L578 — ★法線は軸に平行にしない。軸平行だと距離場が 1 軸にしか変化せず、 図の生成器が作る「スライスを並べた GIF」が 1 コマに潰れる(2026-09-08 実測)。 傾けた法線なら全スライスが変わる。長さは効かない(op が正規化する)ので、 正規化していないベクトルを渡してその仕様も見せる。
- L650 — ★32x32 は chain_fuzz の cimage プール(32x32)に合わせた値。進化の橋 (backends_typed)はこれを使わず、呼び出しのたびにスペクトルと同じ形の H を作る (backends_typed.CALL_TIME_ARGS。固定形だと他の大きさの画像で必ず拒否された、2026-10-07)。
unified.py
- L559 — ★2026-09-20(GenSpark 第 53 報 N181): dict / list を registry の鍵にして unhashable で落ちていた
verify_auto.py
- L74 — ★
match は 1 次元ベクトル(ops._ncc_locate と同じ形)。1 スカラー では表せない組(面積+重心、楕円の 3 指標 …)を運ぶために在る。 この枝が無かったので、下の「image / region = 2 次元」に落ちて ndim=1 で弾かれていた —— 正しく作られた op が「実装されていない」 と数えられ、HALCON 対応数が静かに 1 本少なかった。
video.py
- L228 — ★2026-10-24: imageio (Pillow) decodes a 16-bit RGB/RGBA PNG to uint8 and the uint16 request then stretched those 8 bits (off by up to 237/65535). A still PNG declaring > 8 bits goes through raster.read_raster (OpenCV, or refused).
visionlab.py
- L53 — ★
float("50") は成功するので、float() を通すだけでは文字列が ミリメートルとして通り抜ける。visiondesign 側は弾くが、ここで先に float 化してしまうと その検証に届く前に数値になってしまう (敵対的検証で実測: VisionSystem(focal_mm=”50”) が通った)。 器の側でも同じ規律を持つ。
visualhull.py
- L127 — ★点が 1 つ残らず カメラ後方 = ほぼ確実に姿勢の規約違い(2026-09-08、 poc_livestock_body_volume が踏んだ)。この関数は OpenCV 規約(+Z 前方)を 要求するが、公開層で
look_at の名を持つのは render3d の gluLookAt 版 (−Z 前方の 4x4)。その M[:3,:3], M[:3,3] を渡すと全 voxel が後方判定に なり、例外なく空のシルエットが返って空の hull になる。黙って空を返すと 「彫り切った」と見分けが付かないので、ここだけは声を上げる(有効な場面 —— 物体が画角の後ろにある —— もあるので raise ではなく警告に留める)。
volops.py
- L1201 — ★半径は刻みの整数倍に落とす。EDT は離散球の中心で半径より少し大きい値を返すので (半径 4 の球で ~4.12)、生の最大値から刻むと直径が系統的に +0.1 ほど大きく出る。
- L1214 — ★膨張は前景をはみ出す(離散の球で膨らませるため)。実測で 24% 漏れ、粒度分布の 生存率が 1.0 を超えた。太さは前景の量なので必ず前景で切る。
- L1313 — ★最大厚さの次の刻みまで伸ばす。ここで止めると一番太い特徴の質量が 一度も消えず、分布から丸ごと落ちる(実測: 体積の 71% が欠け、平均径が 18.0 のところ 15.1 になった)。
- L1333 — ★一様なブロックでは勾配が丸め屑しか残らず、固有値分解はその屑から任意の向きを 返す。絶対値の床は輝度スケールに依存するので、必ず相対量で切る。
world_render.py
- L69 — ★
resolve() は実在しない場面に None を返す(資産が無い環境では正しい)。 検査せずに spec["xml"] を引くと TypeError: 'NoneType' object is not subscriptable という、原因を何も語らない例外になる —— 呼び手には 「何が無いのか」と「どう直すのか」を返す。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.