Fullseye 設計判斷集(由原始碼中的 ★ 註解產生)
日本語 · English · 简体中文 · 繁體中文 · 한국어 · Deutsch
本倉庫把「為什麼是這樣」寫在原始碼註解裡。其中標了 ★ 的是真正管用的部分——量出來的結論、踩過的坑、這樣做的理由。本頁由它們機械彙集而成,正本在原始碼一側,因此兩者不會走樣。
翻譯進度:612 / 1571 條。未翻譯的條目照原文(日文)顯示——悄悄回退到原文會看著像已翻譯,所以沒譯就明說沒譯。
accel.py
- L296 (ja) — ★CPU 側(ops._otsu)と同じくビンの上端で切る(2026-09-26)。 中点で切ると argmax ビンの背景画素が前景に混ざる。ここを直し忘れると 同じ絵で CPU と GPU の答えが割れる(test_fast_parity が門)。
- L688 (ja) — ★2026-10-02: HALCON 名は
local_max(画素精度のマスク)。以前は local_max_sub_pix と書いていた。
- L812 (ja) — interior 差の判定閾値。★2026-09-20(GenSpark 第 32・33 報 N116): 0.0002 の差に “exact” と出て、 語が実測と矛盾していた —— 判定は閾値で決まるので、語に閾値を添える。
accel_match.py
- L170 — ★視窗必須比範本大,否則完全重疊的位置數會變為零 → r = T//2 + f(粗誤差) + win。
acoustics.py
- L1173 — ★
med == 0 一律當作 inf 處理——連 peak 也為 0 時(靜音、頻帶內什麼都沒有)也報告「無限突出的峰」。正如 docstring 所述,這兩個數本是對「即使什麼都沒有也會回傳峰頻率」的誠實性指標,卻偏偏朝最會說謊的方向擺動。0/0 的答案是 0.0。(2026-09-05:在 Linux / numpy 2.5.2 上暴露。舊版只是濾波殘差略有殘留使 med > 0,缺陷一直就在。)
- L1181 — ★全域中位數在收窄頻帶時會顛倒順序(純雜訊 11375 對真正的缺陷 9433。2026-09-06 實測,見 _local_prominence 的表)。做與頻寬無關的判定時用這個。既有的兩個保持含義不變而保留——同名而內容改變,比增加一個更危險。
- L1789 — ★
med == 0 一律當作 inf 處理——連 peak 也為 0 時(靜音、頻帶內什麼都沒有)也報告「無限突出的峰」。正如 docstring 所述,這兩個數本是對「即使什麼都沒有也會回傳峰頻率」的誠實性指標,卻偏偏朝最會說謊的方向擺動。0/0 的答案是 0.0。(2026-09-05:在 Linux / numpy 2.5.2 上暴露。舊版只是濾波殘差略有殘留使 med > 0,缺陷一直就在。)
- L2597 (ja) — ★fail-closed(2026-10-06): 全帯域の PHAT は帯域の限られた信号で黙って外す。
acquire.py
- L70 (ja) — ★公開面は本体から数える(
tests/test_acquire_contract.py の門が AST で 読み、ここと突き合わせる)。dir() は環境で変わるので一次情報はこちら。 2026-09-25 まで 7 つ足りていなかった —— 追記のつもりが当たっていなかった。
- L96 (ja) — ★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 (ja) — ★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 (ja) — ★
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 (ja) — ★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 (ja) — ★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 (ja) — ★
as_numpy_ndarray() はフレームのバッファをそのまま指す (vmbpy 同梱の例が「同じメモリを使う」と書いている)。vmbpy の取得は フレームを再キューしてバッファを使い回すので、複製しないと 次の 1 枚が前の 1 枚を書き換える —— 例外は出ず、絵だけが入れ替わる。
- L1425 (ja) — ★以前はここが [] を返していた。GenTL を出す全ベンダを覆える唯一の経路 だけが列挙できない、という穴だった。プロデューサは GenTL 1.6 の GENICAM_GENTL{32,64}_PATH に自分を登録するので、こちらはそれを読む。
- L1450 (ja) — ★同一性は
id。serial_number は Windows では取得できず既定 0 のまま 返るので、鍵にすると全機が同じ鍵になる(Stereolabs API reference)。
- L1459 (ja) — ★
camera_state の既定は NOT_AVAILABLE ―― 一覧に出ても塞がっている ことがある。黙って落とさず状態を添える(在るが使えない、は発見である)。 CAMERA_STATE の全メンバーは公表文書から裏が取れなかったので、 文書が名指しする NOT_AVAILABLE とだけ突き合わせる。
- L1471 (ja) — ★pyk4a は台数しか教えてくれないので、シリアルを読むには開くしかない (pyk4a の example/devices.py)。だから列挙そのものが装置を触る ―― 必ず閉じ、開けなかった機は落とさずに「在るが開けない」として返す。
annotate.py
- L3105 — ★標點(。、)本應不旋轉而是靠向右上,但這裡不靠——與其默默近似做不到的事,不如寫進 docstring 留存。直排中靠向右上的字(標點)。橫排時位於字左下的點,直排時來到右上——排版之道是移動位置而非旋轉。Windows 的
@ 前綴字型(GDI 按 face 名選擇的直排字面)在字型側做了這件事。Pillow 以檔案路徑開啟字型,搆不到 @ 字面,HarfBuzz 的 direction="ttb" 也會因是否安裝 Raqm 而結果不同(本機 Pillow 12.3.0 的 features.check("raqm") 為 False)。遵循選擇跨平台一致者的方針,這裡用合成來靠位。
aoi.py
- L441 (ja) — ★積の向きが符号を決める。
fb * conj(fa) の山は「moving が reference に対してどれだけずれているか」に立つ(逆にすると符号が反転し、残差を測る ときに逆向きへ戻してしまうので、完全に一致する対でも残差が 1 を超える)。
api.py
- L170 (ja) — ★2026-10-02: 合成パイプライン 6 本を fs.<名前> から出す。以前は ``fs.pipeline3d.`` でしか届かず、 公開経路の門では「1 本も届かない島」として _INTERNAL に置かれていた。import 自体は torch が無くても 通る(torch_lazy)。torch を要るのは呼んだときの FPFH / ICP の側だけ。名前>
- L882 (ja) — ★名前はすべて glyph_ で始める。1-D / 2-D / 3-D でレジストリが分かれている repo なので、接頭辞の無い名前は公開経路ごとに別物を指す事故を起こす。
- L898 (ja) — ★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 (ja) — ★2026-10-02: 「名前の無い非公開関数」の棚卸しで、op として振る舞うのに公開経路が 1 本も無かった 18 本。 どれも既存の型つき台帳の約束(台帳 = 実装モジュールの集合)に合わないので、facade(fs.<名前>)から出す。 門は tests/test_hidden_ops_exposed_2026_10_02.py(定理か第 2 実装)。名前>
- L1678 (ja) — ★空・空白だけの名前は「無い」(2026-09-20、GenSpark N27): 多くの op は halcon 別名が “” なので、
name == halcon の一致で “” が lowpass に解決し、保存したパイプラインに空名が混ざると 別の op が黙って走っていた。名前の照合はこの先で行うので、ここで先に切る。
- L1681 (ja) — ★2026-10-11: このコメントと判定が docstring より前にあったので、関数に docstring が 無かった(
find_op.__doc__ が None)。説明の門(台帳・facade 版)が拾った。
- L1697 (ja) — ★大小文字とハイフンだけ違う名前は同じ op(2026-09-20、GenSpark N50): HALCON のリファレンスは GAUSS_FILTER のように大文字で書かれることが多く、
GAUSS_FILTER / Gauss-Filter が unknown だった。 正規化して 1 度だけ引き直す(元の綴りに一致が無いときだけなので、既存の解決は変わらない)。
- L1766 (ja) — ★2026-09-20(GenSpark 第 35 報 N124): 台帳 op の名前を apply に渡すと「unknown operator」と言い、 op_names() を案内していた(そこにも無い)。索引は tier を知っているので、正しい入口を言う。
- L2066 (ja) — ★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 度 -> 每通道 27.86 度,零點 29.14 度)。倒向哪一邊是合約的決定,所以這裡不改動任何一個預設數值,僅在
on_error="raise" 時拒絕,預設則記入台帳使其可見。詳情與選項見 docs/KNOWN_ISSUES.md。
- L2385 (ja) — ★2026-09-20(GenSpark 第 26 報 N97): 素の str / dict / スカラーは ndarray でないのでここを素通りし、 既定の fallback 方針では入力がそのまま返っていた(
apply("abc", "gaussian") == "abc")。 raster を取る op には、配列にしてから同じ検査を掛ける。list / tuple は数値の入れ子として下で配列化される。
- L2421 (ja) — ★float16 / float32 → float64 の昇格は無損失(値も範囲も変わらない)なので記録しない(2026-09-20、 GenSpark N29): float16 は scipy.ndimage が扱えず op が RuntimeError → fallback で入力のコピーが 返っていた。float32 は op が float32 で走り float32 を返していた(契約は float64)。
- L2692 (ja) — ★2026-10-18(外部レビュー 0.6.0 N224): 以前の文は「got name=ndarray」だけで、受け取った image 側 (op 名の文字列)を言わず、規約の説明と食い違って読めた。受け取った 2 つと、直した呼び方を言う。
- L2813 (ja) — ★形状不一致(2026-09-19 外部レビュー #13): ラスタ同士の n-ary で形が違うと numpy の 「could not be broadcast」がそのまま台帳に残り、既定の方針では第 1 入力が そのまま返る(sort として妥当な fallback)。返り値の形だけ見た利用者には 「(32,32)+(32,16) が (32,32) で成功した」と映った。何が要るかを文で言う。
- L2817 (ja) — ★ただし第 2 入力がマスク(畳み込みの核)の op は形が違って当然 —— 3×3 のマスクを 画像と同じ大きさに埋めないと呼べない、では入口として壊れている(2026-10-12、例の 付与で発見)。核を取る op だけ名指しで外す。
- L3126 (ja) — ★2026-09-20(GenSpark 第 15・16 報 N67): 4 op の入口の関門(ops.NATIVE_CRASHES_ON_DEGENERATE)は 効いているのに、その事実は ops.py の中にしか無く、registry を使う側からは見えなかった。 行に載せる(None = 関門なし。理由の文がそのまま値)。
- L3130 (ja) — ★2026-09-20(GenSpark 第 20 報 N84): 同じ HALCON 別名を複数の op が名乗る(cv_ / sk_ の移植と コアの実装)。どれが走るかは find_op の規則(完全一致 → name == halcon → _ALIAS_CANONICAL)で 決まっていて曖昧ではないが、その事実が行に無かった。halcon_peers = 同じ別名を名乗る他の op。
- L3251 (ja) — ★2026-09-20(GenSpark 第 24 報 N95): 綴り違いの sort が黙って 0 行だった(「該当なし」と区別できない)。
- L3261 (ja) — ★台帳には入力ゼロの op(カタログを返すだけ)が在り
in_sort が None になる。 生の None を並べ替えの鍵に混ぜると TypeError で落ちる —— レジストリと n-ary だけ だった頃は None が現れなかったので、この鍵は 2026-09-25 まで壊れずに済んでいた。
astrostack.py
- L157 — ★假設檢定:我們預測「只要能裝進一條快取行(64B)就不值得搬移」,但猜錯了。float32 的臨界點在 K≈17-19,接近 64B(K=16),但 float64 的實際臨界點是 K≈23-25(約 200B),而預測是 K=8。決定它的是元素個數而非位元組數 —— 每個元素的取出開銷佔主導。數量少時搬移反而更慢(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 還有另一條路徑,即整數 DN 下 MAD 塌縮的情況(σ=0.5 等效的實拍為 0.0)。對不平坦的影像回傳空並非保守的答案,而是錯誤的答案;實際上植入 200x200 整數幀的 2 個點目標被回傳為 0 個。於是分開路徑:平坦則回傳空(沒有星),不平坦則拒絕。
- L1106 (ja) — ★ 画像の外の中心は「flux 0・area 0・snr inf」を黙って返していた —— 拒否する。 画像の縁で欠けた開口は計算はできるが flux が系統的に少ないので
truncated で印を付ける(area_px は欠けた後の面積)。
- L1344 (ja) — 残差の sigma で下支えする。★ 以前は +inf に置き換えていたので 何も落とさず、宇宙線がそのまま平均に入った。
- L1702 (ja) — 束ねた sigma で下支えする。★ 以前は中央値画像の空間 MAD を使っていたが、 平坦な整数データではそれも 0 になり床が 1e-12 —— 読み出し雑音の +1 DN が 全部「宇宙線」になった(32x32x9 枚で真の宇宙線 1 に対し 871 画素)。
- L1743 — ★平手時選擇原始票數更多的 bin。3x3 平滑從真峰的左右兩側看都得到相同的和,所以只用平滑值取 argmax 可能選中「峰旁邊的空 bin」—— 實測正是如此:真實位移 (-0.087, +0.996) 的 7 + 4 票在 bin 邊界被一分為二,而其中心偏了一個 bin 變成0 票(frame_align 誤以為「沒有重疊」而 fail-closed)。1e-6 的權重遠小於平滑值的步長(1/9),所以在真有差異時不會改變排序。
- L1766 — ★2026-09-08:同時回傳第二高峰的高度。星野只有一個峰,但重複結構(網點、光柵、織物)中,等高的峰會沿格矢方向平移排列,無論選哪個都會「全體贊成」= inlier_ratio 變成 1.00。贊成率並不是「答案正確的機率」,所以用另一個數來給出是否只有一個峰(0 = 單峰,接近 1 = 還有其他等價候選)。
backend_safe.py
- L212 (ja) — ★2026-09-20(GenSpark 第 44 報 N158): 環状バッファは黙って古い方を捨てる。捨てた数を数えないと、
fallbacks() が 256 件しか返さない理由が利用者から見えない(counts と件数が合わない)。
- L490 (ja) — ★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 (ja) — ★2026-10-18(0.7.0 の preflight の退化スイープ): 複素の sort を名乗る op でも、入力が実数の NaN / Inf だと実数の配列を返すことがある(3 op とも float64 の NaN を返した)。複素の時だけ埋めていたので、 その実数の非有限がそのまま外へ出ていた。実数でも複素数でも、非有限は記録したうえで 0 で埋める。
- L580 — ★feature op 回傳的是 numpy 純量而非 ndarray,所以上面的分支從未見到它: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 檔案(各有私有的 _safe)都向同一處報告——在此之前,24 個 wrapper 族中只有本模組會記錄任何東西。下面的名字作為供從此處匯入的呼叫方與測試使用的薄別名保留。
- 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 (ja) — ★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 (ja) — ★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 (ja) — ★HALCON の
eccentricity は3 値を返す演算子である(Anisometry / Bulkiness / StructureFactor)。2026-09-26 まで、この op は skimage の離心率 sqrt(1-(b/a)²) という 3 つのどれでもない量を返していた。 3 つとも無次元なので、そのまま返して HALCON と数が合う。円なら (1, 1, 0)。
- L174 (ja) — ★寸法を持つ特徴は HALCON と同じ画素値で返す(2026-09-26、ユーザー判断)。 それまでは画像サイズで割って [0,1] に収めていた(「解像度に依らない」規約)。 HALCON のレシピを移してきた人にとっては、正規化も式の違いと同じだけ「数が 合わない」原因になる。正規化が要るなら利用者が割れるが、割った値から画素数を 復元することはできない —— 情報を捨てない側に倒す。docs/KNOWN_ISSUES.md §51。
- L292 (ja) — ★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)那樣「想用背景色填充框外」的用途,直接用並不合適(這是已知的設計判斷而非 bug — 詳情與取捨見
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 (ja) — ★画素で返す(2026-09-26、ユーザー判断)。それまでは 3 成分とも 画像サイズで割って [0,1] に収めていた(「解像度に依らない」規約)が、 同名は同じ数を取る方に倒した —— 正規化は利用者が割れるが、割った値 から画素数は復元できない。docs/KNOWN_ISSUES.md §51。 [0] 面積(画素数)、[1] 重心の行、[2] 重心の列。 領域が空のときは面積ゼロ・中心は画像中心(fail-soft)。
- L1119 (ja) — ★3 成分を返す op は、空でも 3 成分を返す(スカラーに落ちると 受け取る側の形が入力で変わる)。円の値 (1, 1, 0) を既定にする。
- L1132 (ja) — ★頭打ちを外し、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 (ja) — ★HALCON は同じ 1 次・2 次モーメントを持つ矩形との差で測る。 以前は軸平行の外接矩形との比(skimage の extent)だったので、 同じ長方形を 30 度回しただけで 1.000 が 0.359 に落ちていた (HALCON は 0.998 のまま)。docs/hardening/halcon-named-shape-factors.md
- L1155 (ja) — ★HALCON の roundness は
1 - σ/μ(重心→輪郭距離の平均と標準偏差)。 以前は 4A/(π·長軸²) という別の量で、16x64 の矩形で 0.239 対 0.577 と食い違っていた。
- L1161 (ja) — ★量もスケールも違っていた(2026-09-26)。等面積円の直径を画像サイズで 割っていたが、HALCON の Diameter は輪郭 2 点間の最大距離(画素)。 30x70 の矩形で 0.2585 対 74.85。おまけに輪郭版
diameter_xld は最大弦を 返していたので、双子どうしで 5.6 倍食い違っていた。
- L1169 (ja) — ★HALCON の
elliptic_axis は (Ra, Rb, Phi) を返す。 ここが返して いたのは Anisometry(= Ra/Rb、別の演算子 eccentricity の出力)を 10 で割ったものだった —— 名前が約束している量ではない。
- L1174 (ja) — ★画素で返す(2026-09-26)。頭打ちも外れる —— 厚みが画像の長辺の半分を 超える領域は、それまで全部 1.0 だった。
- L1178 (ja) — ★画素で返す(2026-09-26)。HALCON の
contlength は輪郭長(画素)。
- L1183 (ja) — ★頭打ちを外した(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 (ja) — ★頭打ちを外した(2026-09-26)。細長い形(幅 4・長さ 80 以上)で モーメント特徴が全部 1.0 になり、形が違うのに同じ数が返って いた。値域 [0,1] は feature の契約ではない。 docs/hardening/features-saturated-at-one.md
- L1249 (ja) — ★2026-10-07: 0 画素の平均・標準偏差は 0/0(NaN を guard が置き換えていた)
- L1345 (ja) — ★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 (ja) — ★画素で返す(2026-09-26)。HALCON の
area_center_xld は (Area, Row, Column, PointOrder)。面積と重心を画素で返す (PointOrder は向きの印なので返していない —— §51)。
- L1440 (ja) — ★region 版と同じ HALCON の式。重心は囲まれた面積の重心を使う (点の平均ではない —— 点が密な側に寄ってしまう)。
- L1446 (ja) — ★region 版と同じ欠陥がここにも在った(
/10 + 頭打ち)。 直した op の双子を見落とすと、穴が半分残る。
- L1465 (ja) — ★画素で返す + 最小外接円ではなく最大弦(2026-09-26)。 領域版
diameter_region と同じ量になる。
- L1470 (ja) — ★HALCON は最小外接矩形ではなく同じモーメントを持つ矩形で測る。 輪郭を一度ラスタ化して region 版と同じ式に載せる(差の面積を 直接測るため)。
- L1476 (ja) — ★領域版と同じ頭打ちが輪郭版にも在った(2026-09-26)。 直した op の双子を見落とすと、穴が半分残る。
- L1484 (ja) — ★region 版と同じ HALCON の 3 値。Ra, Rb は囲まれた面積の幾何 モーメントから導く ——
cv2.fitEllipse は輪郭「点」への 最小二乗当てはめで、細長い形では大きく外れる(実測: 4x80 の 棒で Anisometry 39.1 対 20.65)。HALCON の定義は前者。
- L1500 (ja) — ★elliptic_axis: HALCON は (Ra, Rb, Phi)。fitEllipse は直径を返すので 半径にし、角は列(x)軸から反時計回りのラジアンに直す。
- L1502 (ja) — ★
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 度,所以現有結果一個 bit 都不會變。是否有效取決於 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:這兩個共享
{"kind": "zoom"},因此是完全相同的實作,而且兩者都沒有用 b(實測:同一輸入的最大差 0.0,b=0 與 b=1 之差 0.0)。在 HALCON 中 factor 版取兩個倍率,size 版取目標尺寸,是不同的東西,所以拆分 kind,讓實態與名稱相符。
- L1833 — ★2026-09-02:舊規格是 out_sort=feature / metric=”area”,實體是
np.mean(mask) = 在影像中所占的面積比。由於 HALCON 的 area_center 是回傳 (Area, Row, Column) 的 op,存在雙重不一致:(1) 不回傳中心 (2) 面積是比率而非像素數(= 依賴解析度)。單個純量無法滿足這個名字,所以像 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 (ja) — ★定数列で軸が潰れると
axes_transform は ValueError を投げる(傾きが 無限大になるため、向こうの仕様)。潰れた軸だけここで開く —— 定数列は 「描けない」のではなく「真ん中に水平線 1 本」が正しい絵。
backends_decomp.py
- L142 — ★把 BLAS 的執行緒上限在迴圈外只施加一次。這裡是把限制在 work_max=64 的方陣最多 SVD 60 次的地方,佔用本 repo 分解時間的大半(一次套件 30.7 秒 / 分解合計 31.4 秒,svd 23,987 次 = 98%)。64x64 的 SVD 用 24 執行緒比 1 執行緒慢 3.9 倍 —— 因為分解中的 GEMM 太小,同步開銷超過計算量(表見 fsthreads 的 docstring)。每次都包裹會把機制的 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 (ja) — ★ 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 (ja) — ★探針は 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 (ja) — ★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 (ja) — ★2026-10-07: 空入力を op が正しく拒否した後、ここが空配列の平均 = NaN を返して いた(8 op。外側の guard が置き換えるので有限に見え、台帳にだけ source=output で 残っていた)。拒否の後始末が 0/0 を作らないよう、空なら 0.0。
- L570 (ja) — ★本当に効く r_lo / r_hi(半径の窓)だが、後者は既定が None で「データから決める」 意味なので、正の数値既定を要求する橋の選定には載らない。嘘のノブを 1 本足すより a だけを配線して b を『未使用』と書くほうが正しい。
- L588 (ja) — ★2026-10-07: 相対スケールの端が定義域の外へ出ていた 2 本(契約電池で、端の knob が 全入力で拒否されていた)。両端は a=0.5 の値が相対スケールと同じになるよう選んだ (window 10 / k 3)—— 既定の挙動と図の主図は動かない。整数の既定を持つ引数は
_make_runner が整数に丸めて渡す。
- L594 (ja) — ★2026-10-18: points_render の不透明度は (0, 1] —— 既定 1.0 の相対スケールは a > 0.5 で 1 を超えて拒否。 足跡の半径は 0.5〜4 画素(a=0.5 で 2.25)。
- L607 (ja) — ★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 (ja) — ★cleandoc で共通の字下げを外してから継ぐ(2026-10-11)。.strip() だけだと 1 行目以外が 4 字下げのまま残り、 字下げの無い橋渡し文を後ろに足すため後段の cleandoc も最小字下げ 0 と見て外さない → docs/ops の Markdown で空行の後の本文がコードブロックとして表示されていた(tb_ 146 本)。
- L886 — ★在 2026-09-05 之前透過操作 sys.path 讀取
tools/chain_fuzz(未隨附)。在 wheel 中會失敗,而下面的 build() 悄悄回傳 [],所以 tb_* 143 個 op 消失了。
ballistics.py
- L309 (ja) — ★減衰つき(Levenberg–Marquardt)。素の Gauss–Newton は軌跡が短い(曲がりが雑音に埋もれる)と ω の方向が ほぼ不定になり、1 歩で 1e7 rad/s へ飛んだ(2026-09-30、PoC ㉔ の 10〜45 コマ)。費用が下がる歩だけ受け入れる。
- L804 (ja) — ★ dt が標本間隔を超えると模型は標本の間で区分線形になり、C_d と推力が別の値に化けるのに例外も NaN も出ない (30 fps の同じ軌跡で dt = 0.5 s にすると C_d 0.33 → 3.1、2026-10-23 の敵対的レビュー)。歩数の上限は ms で渡した t を止める。
- L965 (ja) — ★ 残差が離散化の床にあるなら 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 — ★僅當兩個條件同時滿足時:存在畸變,以及視點間板子橫向移動。只要滿足其一,門就按設計鳴響(切分見 tests/test_calib.py 的 3 條)。而實際的校正會話是手持移動板子拍攝的,所以兩者必然同時滿足。也不是提高閾值就能解決 —— 有畸變時,完全退化 1.92e-06 與傾斜 2 度 4.42e-06 之差只有 2.3 倍,畫不出分界線。因此:* 閾值保持不變(對已去畸變的點能正確生效)* 把比值本身作為
orientation_rank_ratio 回傳 * 讓實際攔截的後段門說出「請傾斜板子」(下)。無法修復,那就把判斷材料交給使用者。
caltab.py
- L256 — ★這個門抓不到的東西:對單張平面靶標的內參誤差(尤其是 fx/fy 之比)。單個平面的 homography 只對內參施加兩個約束(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 (ja) — ★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 (ja) — ★2026-10-07: 非零の向きつきグラフに閉路(自己ループ含む)が無ければ W は冪零 = 半径はちょうど 0。 ARPACK は冪零(Jordan 塊)で擬スペクトルの縁を返す(鎖 500 個で 0.366、層状 DAG で 3.6e-5 → reservoir_from_graph が 0 を拒否せず 2.5 万倍に拡大した)。残差では見分けられないので構造で判定する。
- L365 (ja) — ★2026-10-07: 強連結成分で並べ替えると W はブロック三角 → 固有値は対角ブロックの和集合。 既約な非負ブロックなら Perron 根に ARPACK が確実に届く(冪零な DAG 部分は 0 に寄与)。
- L727 (ja) — ★ 軸ごとに [0,1] へ伸ばすと(成分が横一列のとき)縦だけ 3 倍に伸びて 成分内の距離が成分間より大きくなる —— 全体は一様に縮める。
- L1077 (ja) — ★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%,但「一個單元匯聚全體的 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 由 fuzzer 的 TYPEMISS 暴露。加入 6 個地心座標 op 後沒有跑 fuzzer)。若想保持格子形式的 (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)。只有等號外側才是「法線唯一確定」的區域(2/3 次冪非負,所以符號取 |
z |
)。 |
- L988 (ja) — ★ 鎖の残り。ECEF ↔ 測地座標 は在ったが、その先(ジオイド高・標高・datum・ENU) # が無く、能力ノート docs/capabilities/geodetic-frames.md に「どれも未実装。 # GNSS が返すのは楕円体高で地図が使うのは標高、取り違えると日本付近で 30〜40 m # 静かにずれる」と自分で書いてあった。ここを閉じる。 # ————————————————————————— # :func:
dem_height_frame_convert が受ける高さの基準。
detect.py
- L60 (ja) — ★しきい値は argmax ビンの上端(2026-09-26、ops._otsu と同じ直し)。 中点だと argmax ビン(背景の山を含む)の画素が前景に入り、平らな板で 全画素が 1 つの対象として返っていた。
device.py
- L62 (ja) — ★
available は「SDK が入っている」であって「Fullseye から開ける」ではない。 2026-09-25 まで名簿はこの 2 つを 1 つの欄で答えていた —— dynamixel_sdk を入れた 機械で available は True になるのに、open_driver("dynamixel") は「その SDK を 直接使え」と断る。読んだ人は「対応済み」と受け取る。 implemented は環境に依らない(この版に一級のアダプタが在るか)ので、表にも 書けるし、どの機械でも同じ門で見られる。「いま開けるか」は implemented and available。
- L68 (ja) — ★欄の名前は自分で決めていない ——
acquire は既にこの区別を持っていた (implemented = opener が在る / available = SDK が在る、「the two are different questions」と註まで在る)。同じ問いに 3 層が別々の語で答えると、 読む側は毎回学び直す。先に正しかった層の語に合わせる。
- L105 (ja) — ★名簿の綴りと構築子の綴りが違っていた。 名簿(
capabilities())は io-modbus と名乗るのに、構築子は DigitalIO("modbus") を取る —— つまり表を読んでそのまま渡すと ValueError になっていた。名簿を 印刷しておきながら、その綴りで呼べないのは名簿の側の不備である。
- L161 (ja) — ★名簿に 12 載せて、扉が 3 つしか無かった(2026-09-25)。
capabilities() は I-O・サーボ・ロボット・ROS を名乗るのに、開ける口が在ったのは :class:DigitalIO の 3 backend だけで、残り 9 には入口が 1 つも無かった —— 名簿を読んだ人が、そこから何かを始める方法が無い。隣の層(comm)は 同じ問いに既に答えていたので、これは機能の不在ではなく片側の入口だけが 塞がれていた型である。開けないものにも「何を入れればよいか」を返す。
- L189 (ja) — ★PyPI に無い SDK(ベンダ配布の wheel)は「pip install None」と言わせない。
drivehumanoid.py
- L375 (ja) — ★ユーザー案(2026-10-03)「あらかじめ物体ごとの描画をマスク付きで作っておく」。精細なメッシュを向き × 位相ごとに 一度だけ描き(色・マスク・深度のずれ)、毎コマは縮めて貼り、世界の深度と比べて前後を決める。見た目は精細なまま、 1 体の費用は貼る画素の数だけ。近似は 2 つ(門で大きさを測る): (1) 方位を n_yaw 段に丸める、(2) 事前描画は水平に 遠くから見た像なので、カメラが高い・近いときの透視の違いを無視する。
driveinf.py
- L209 (ja) — ★道の帯は step ごとに切る: 描画器(render3d)は頂点が 1 つでもカメラの後ろにある三角形を捨てるので、100 m 級の 1 枚の帯は車載カメラから丸ごと消えた(2026-10-01)
driveworld.py
- L615 (ja) — ★2026-10-07: 置いた高さ z を物体に残す(残さないと world_move が元の z を外せず、z=2 で置いて z=2 へ動かすと底が 4 になった)
dualxray.py
- L218 (ja) — ★2026-10-15 探針で見つけた: Pb 50 mm でも e^{-130} は 0 にならず、正規化すると「ほぼ何も通らない」スペクトルが ふつうの顔で返っていた。透過が 1e-12 を切ったら値を返さず拒否する。
- L956 (ja) — ★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 (ja) — ★backend が入っていないだけの名前は「unknown」でなく不足 extra を言う(api._resolve と同じ門、2026-09-19)
- L243 (ja) — ★op 名は文字列でなければならない(2026-09-20): 以前は str() で何でも名前にしていたので、 {“op”: “gaussian”} が “{‘op’: ‘gaussian’}” という op 名になり、run で unknown operator になっていた。 名前の規則は stage_name の 1 本(diagnose_stages / unified.Pipeline と共有)。
- L274 (ja) — ★2026-09-20(GenSpark 第 30 報 N107): {“stages”: None} が 0 段のエンジンになり、run が入力をそのまま 返していた(壊れた設定が「成功」)。[] は文書どおり恒等、None / 数値は設定の壊れ。
- L280 (ja) — ★2026-09-20(GenSpark 第 30 報 N107 の ‘x’ の行): 文字列は 1 文字ずつ段になっていた。from_ops と同じ ops 文字列。
- L372 (ja) — ★範囲外は断る(2026-09-20、GenSpark N40): –upto 9 / -1 が黙って全段 / 0 段になっていた
evis_fullseye_bridge.py
- L152 (ja) — ★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 (ja) — ★ego_camera(モデル自身の目)でも eye パネルを出す。ここを ego>=0 だけで見ていたので、 ハエの複眼から描いたのに複眼の絵がコマに入らなかった(2026-09-14 実測)。
- L180 (ja) — ★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 (ja) — ★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 (ja) — 書いた図の 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,但在其中會逐幀正規化,所以全為 0 的幀和全為 1 的幀會出同樣的顏色(2026-09-09 被測試抓到)。只有顯式傳入值域,尺度才會統一為一個。
- L482 — ★Pillow 會把與前一幀完全相同的幀摺疊為一幀(那部分時間會加到前一幀的顯示時間上,所以動作速度不變)。寫完後計數,若與傳入的數不同就在台帳裡兩者都留下 —— 以免把嘴上說「72 幀的 GIF」而內容只有 40 幀的情況悄悄放過。
- L650 — ★2026-09-08:面板小時標題放不下,
annotate_figure_grid(正確地)拒絕,於是有一張圖悄悄消失了。29×19 的 core 格子或 24×24 的縮小圖在 PoC 裡很常見,可錯誤卻說「把標題縮短」—— 實際的修法是「把面板放大」。兩位負責人獨立地掉進同一個坑(有過看板的 scene 圖消失一張的例子),所以不讓每個呼叫者各自寫放大,而在這裡只做一次最近鄰放大。用最近鄰是為了在放大時不造出值(插值會在圖上產生並不存在的中間值,偽彩會說謊)。
- L767 (ja) — ★2026-10-03: 下の余白を 16 px 広げた。軸名の帯(左下)が x 軸の目盛りの数字に重なって 「0.5」や「20」を隠していた(transforms_tour の図で踏んだ。全部の save_plot に効く)。
- L779 (ja) — ★2026-10-21: 棒を 1 本ずつ別の系列にした図(色を棒ごとに変えるため)は、系列の中に x が 1 つしか なく plot_series が間隔を知れないので、棒が描画域の 70 % の幅になり隣と重なった(製造公差 PoC の 歩留まりの対比図で目視)。棒の x を全系列から集め、その最小間隔(棒が 1 本しかなければ目盛りの 間隔)を画素に直して、1 点の系列にだけ bar_width として渡す。複数点の系列は従来どおり自分の間隔。
- L811 (ja) — ★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 並不是「因為小所以快」,而是一個正因為小才使多執行緒反而吃虧的尺寸。在迴圈外放置一次(若每次迭代都包裹,就要把限流機制本身的開銷付 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,當 h 超過「較低山峰的凸起(16 - 鞍部 10.07 = 5.93)」時,兩個種子就會融合為一。blob_seeds 以殘差 > 0 作為種子,故殘差 = min(h, 凸起) > 0 恆成立,較低山峰的種子不會在該 h 處消失。融合發生在 h 超過「較高山峰 - 鞍部(22 - 10.07 = 11.93)」時——它所參照的山峰正好相反。
examples/coherence_scanning.py
- L166 — 6) ★ 與相移法的對照 # —————————————————————— #
examples/dem_geodesy_tour.py
- L49 — ★若不把儲存庫根目錄加入路徑,就找不到
demops(本例不 import fullseye,因此路徑掛鉤不生效)。
- L61 — ★EXTEND: 替換為你自己圖磚的西北角(此處在東京附近)。
- L131 — ★誠實的分解:Bowring 的單次迭代在橢球面上為 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(本例不 import fullseye,因此路徑掛鉤不生效)。
- L59 — ★EXTEND: 單元尺寸 [m]。真實資料用 dem_cell_size_webmercator(zoom, 緯度) 求得。
- L158 — ★誠實的觀察:當斜面中途存在缺測時,其正北的鄰元即便是 outlet 也不落向缺測,而是流向西南(有有限落差的方向)。實作是「僅當別無下降去處時才落向缺測」,比 docstring 的「允許流向缺測」更窄。此處僅列印,不 assert。
examples/example_inner_diameter_mm.py
- L67 (ja) — 穴(暗い側)を前景に。★面積の大小では決めない —— 穴と地の面積がほぼ同じだと 取り違える(R=100 px の的で地の側を「穴」と取った、2026-10-15)。輝度で決める。
- L71 (ja) — area_center は (面積 [px²], 行 [px], 列 [px])。★2026-09-26 に正規化 [0,1] から HALCON と同じ画素値に変わった(ecdaf14637)。
examples/gallery2d_color_artistic.py
- L224 (ja) — ★向きも見る(2026-09-26)。ここまでの確認は「二値」「自明解でない」だけで、 どちらの向きでも通っていた —— 実際この op は兄弟の補集合を返していた (docs/hardening/itk-threshold-ops-returned-the-dark-side.md)。明るい画素の 方が region に入ることを、入力そのものと突き合わせて確かめる。
examples/gallery2d_edges.py
- L217 (ja) — ★null を破るのは「雑音の扱い」: 素の衝撃は雑音を構造に化かすので、 段差が真値を超える。超えたら鮮鋭化ではなく増幅である。
examples/gallery2d_features.py
- L270 (ja) — ★返り値は bits/16 なので 16 倍して読む。上限は画素数で決まる —— 連続値の 画像では最小の刻みが ~1/N になるので推定は log2(N) 付近で頭打ちになり、 16 には届かない(256x256 = 65536 画素で 16 前後、128x128 では 13.7 と実測)。 「測れない線」を画素数から先に引いておくための注意書きで、門もそう書く。
examples/gallery2d_morphology.py
- L228 (ja) — ★背景の 1 点だけでは足りない —— 前景の外に 1 画素も漏れていないことを 全数で見る。離散の円板で膨らませると境界の外まで塗ってしまい、最初の実装は 前景 197 画素の円に対して外へ 48 画素(24%)漏らしていた。中心の値は正しい ままなので、中心だけ見る検査では捕まらない。
- L240 (ja) — ★閾値を選ばない op なので、検証も「閾値を選ばずに 3 つの山を同時に当てる」 形にする。高さ 1.0 / 0.6 / 0.3 の山を置いて、そのまま返るかを見る。
examples/gallery2d_texture_freq.py
- L305 (ja) — ★窓は
_k(a) が決める —— a=0.5 は 7x7(5x5 ではない)。ここを取り違えると 閉形式の定数がずれて、正しい実装が落ちる(実際に一度落とした)。
examples/gallery_illusion_invariants.py
- L231 (ja) — ★docstring は (−2, −2) と書くが、この盤(行・列、上向きで出発・白で右)では (+2, −2)。 定理が言うのは「周期 104 で同じ斜めの 2 マス」で、符号は回転の規約で変わる(perpetual.py の自己検査と同じ読み)。
examples/gallery_nary_image_algebra.py
- L117 (ja) — ★公開の入口
fullseye.apply は n-ary の 2 入力に「同じ形」を要求する(3×3 のマスクは形の不一致で拒まれる)。 画像と同じ大きさのゼロ配列の中央(scipy の原点 = N // 2)に置けば、同じマスクとして働く。
examples/gallery_openvx_spec_values.py
- L39 (ja) — 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 (ja) — ★数字は構成で変わる。どの構成で測ったかを必ず併記する —— 併記しないと 説明文が別の実行の数字を引いたまま残る(2026-09-26 にこの例で踏んだ)。
- L199 (ja) — ★(1, N) のまま渡すと four_f_filter が「2x2 未満」で断る。 場と同じ格子に広げる —— 断ってくれる op のおかげで気づけた。
- L217 (ja) — ★図・動画は opt-in。既定で出さないのは、CI が図の生成時間を払わないため。
examples/piv_flow_from_particles.py
- L27 — ★由於要 import repo 根目錄下的模組(pivops),把 repo 根目錄放到最前,使其從 checkout 直接執行即可通過。與其他範例相同的做法。沒有它,
py -3.11 examples/<name>.py 會因 ModuleNotFoundError 而失敗(2026-09-09 實測:在缺少執行門的 83 本中,失敗的僅此類型的 2 本)。
examples/poc_active_contours.py
- L258 (ja) — ★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 以閉式返回的一次係數量,會原封不動地變成偽傾倒與偽平面內偏擺。
- L555 — ★向閉式傳入包含被鼓脹吸收的部分(§6)的有效傾倒。若不包含,則僅 f=0 的單點偏差 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 (ja) — ★合否にするのは厳密に数えられる側だけ。(QK^T)V は 2T^2 d + 2T^2 d 回、 Q(K^T V) は 2Td^2 + 2Td^2 回の積和なので、比は 厳密に T/d である。 これは機械に依らない整数の主張で、交差点が T == d にあることの中身でもある。
- L563 (ja) — ★門 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 — ★不在公開路徑上的處理:體素空間的 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 (ja) — ★デューティ 50 % の矩形格子は偶数次が消える —— 矩形波のフーリエ係数が 偶数調波でちょうど 0 になるからで、これは実装の都合ではない閉形式の事実。 最初「±1, ±2 が立つ」と期待して NG にした: 期待が誤っていた(op は正しい)。 偶数次が「消えていること」まで見るので、山の位置だけを見るより強い門になる。
- L535 (ja) — ★図の書き出しが失敗したら、ここで拾う。見ないと「検査は全部 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 (ja) — ★穴が塞がったので、所見を「無い」から「規約が 1 画素ずれる」に書き換える。
examples/poc_bump_coplanarity.py
- L147 — ★真實的低階缺陷(die-attach 空洞 = 中央平緩下沉)。故意不做成嚴格的二次——若為二次,擬合按定義會吸收 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 — ★不要把單次執行的差異讀作「起效了」 —— 變動種子並與離散度比較
- L1357 — ★缺口一旦被填補就會觸發的 assert。它確實在 2026-09-07 觸發,於是重寫了這一行:在收到「無法建構圓柱孔、倒角與圓角」的意見後,加入了 plane / cylinder / torus / capsule。意見改變了工具,所以留下記錄後繼續前進。
- L1379 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
examples/poc_calipers_under_illusion.py
- L141 (ja) — ★はじめ図説に「半幅を変えると採用点の数が変わる」と書いたが、生成された 本文を読むと 4 通りとも 41 点だった。書いたことがデータと違ったので 直し、「変わらない」ほうを門にした。証拠の数が動く例は第 5 章のツェルナー。
- L150 (ja) — (b) ★探針 1 枚では足りない —- ずらし量 × 探索半幅の格子で全数を見る 最初は shift=0.25 だけで試して「測定器は決して動かない」と書いた。 格子で見ると 0.125 と 0.375 でだけ 0.14 度傾く。既定に見える 0.25 は、たまたま外れない側だった。
- L266 (ja) — 外れた組み合わせを絵の上に描き戻す。★全体図では 8 px の飛びが潰れて 見えないので、目地の帯の周りだけを等倍で切り出す。
- L365 (ja) — ★測定線は軸そのものの上にある。そのまま塗ると被写体が消えるので、 指示線だけ 12 px 上へ逃がして描く(測っている行は軸の行のまま)。
- L476 (ja) — ★中心の座標は推測せず 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 誤差卻相差一個數量級以上
- 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)。不過它是門面函式,而非登錄表中的 op(因為它不是固定的 (影像, a, b) 形式)。
examples/poc_cell_counting.py
- L68 (ja) — ★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(距離變換)。影像中只要有一個大細胞,就會抬高整幅影像的 h 下限(由 op 規格造成的耦合)。
- L1048 — ★這個 PoC 的標題。在偏差曲線穿過 0 的位置,分割誤差並不是一個谷。
- L1337 — ★過度合併與漏檢是兩回事 —— 即使黏連也並未「消失」
- L1365 — ★最優 h 隨密度變化(在偏差準則或一對一準則中必有其一會變化)
- L1368 — (5) ★確實存在計數正確但分割全錯的點:偏差不到 3 %,但仍殘留大量分割誤差,一對一對應也遠離最佳。
- L1394 — ★可指定的最小 h 隨尺寸比一同上升(由工具規格造成的尺度耦合)
- L1434 — (10) ★用機器確認工具的缺口「仍然存在」(一旦修好就會失敗 = 好的失敗方式)(a) 進化 op 的距離變換按最大值正規化
examples/poc_change_detection_misreg.py
- L947 — ★一張圖:殘餘偏移 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 (ja) — ★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 (ja) — ★「そのまま渡すと厳密に 2」が言えるのは 2 次以下の多項式のときだけ (中心差分がそこまで厳密だから)。一般の正則場では 2 から同じ床の分 だけ引かれる —— 実測 2 − 4.89e-05 に対し正則側の床は 2.06e-04 で同じ桁。 だから「2 に十分近い」ではなく「2 とのずれが床と同じ桁」を門にする。
examples/poc_compound_eye.py
- L271 (ja) — ★実測(2026-10-11): 雑音だけの利得は N=49 で 7.05(√49=7.00)、周縁 8px 除外で 全体利得 7.19、床は外周 4 画素にだけ載り k>=4 で 1e-15 の丸め屑。 → 第 2 章の飽和(5.33)は重ねの原理ではなく縁(像の外から画素を借りる帯)の誤差。
- L402 (ja) — ★PoC の門(tests/test_poc_scripts_run.py)は exit 0 に加えて “PASS” の印字を 要求する(合否を計算したのに捨てる門を防ぐ規約)。以前は “OK:” と書いていて、 台帳に登録した瞬間に「exit 0 だが PASS を印字していない」で落ちた。
examples/poc_connectome_across_decades.py
- L147 (ja) — ★2 匹の平均(半整数)を丸めると偶数丸めで奇数/偶数のギザギザが出る —— 合計(整数)で数える
examples/poc_connectome_motor_bottleneck.py
- L328 (ja) — ★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 (ja) — ★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 的標題。可以用眼睛看到 FBP 與零點 A(水平線)和零點 B 相交的地方。橫軸是投影數(左側稀疏)。橫軸取 log —— 相交發生在稀疏一側(12~45 條),線性軸下會擠到左端,關鍵處讀不出來。
- L407 — ★2026-09-06 已填補。以前固定的是損壞行為 =「檢測器加倍會使質量虧損改善 2 倍以上」。現在固定兩點:(1) 質量本來就是守恆的 (2) 不隨檢測器數量變化(因為 n_detectors 是檢測器的寬度,而非取樣的精細度,所以只要目標能容納,增加的部分只是多出空 bin)。
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 (ja) — ★座標の約束: 格子の行 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(本例不 import fullseye,因此路徑掛鉤不生效)。
- L76 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
examples/poc_dense_bubble_count.py
- L748 (ja) — ★最初は「相対 3 % 以内」と書いて、真値 30 個で 1 個ずれた 0.033 で落ちた —— 言いたかったのは 「誤っても 1 個ぶん」なので、個数の差で書き直した(2026-10-18)。真値は画面の外に出た細胞も 数えているので、1 個の差の一部は op でなく真値の規約の側にある(どれかは区別していない)。
- L751 (ja) — ★2 回目: 1 個ぶんでも足りなかった(最大 2 個、600 枚の全数で)。ずれの大きさは印字に残し、 門は「自信をもった誤りの件数」だけにする —— 合わせ直すたびに門を緩めるのは門ではないので、 ここで止める。
- L846 (ja) — ★記録(門ではない): 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 — ★不要只在「T/h 為整數」的點上掃掠 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 — ★用從基準影像確定的單一常數進行正規化。若按每幅影像的最大值來除,只要形變使最大值稍有移動,整體亮度就會改變,從而給假設亮度不變的估計器(Lucas-Kanade / Horn-Schunck)疊加無關的誤差。
- L211 — ★固定所見:由於形變不是插值而是斑點的重繪,整數移位應當嚴格一致。若此處崩潰,則第 2 節及以後的「真值」將不再是真值,也就分不清測量的是估計器還是我們自己的插值器。
- L247 — ★固定所見:三者都必須以數量級取勝於僅回答「沒有移動」的零點。哪怕有一個跌破 10 倍,該估計器在此場景下就不堪用。
- L282 — ★固定所見。(1)piv 的偏差在掃掠全域內都小於 lk / hs。※「小一個數量級」只在第 2 節 u=0.37 的單點成立(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 µε 的三成。
- L438 — ★在均勻梯度(ε 關於 x 為一次)下不會變鈍 —— 因為對稱窗的最小二乘會嚴格返回一次函數的斜率。要看到窗的效果,需要帶曲率的應變場。切口尖端的應變集中正是如此,因此植入高斯形的集中。
- L484 — ★固定所見。(1)lk 的峰值隨窗寬單調下降(正是空間解析度的極限)。
- L522 — ★只切一個角來計數,會隨窗的取法變動 2 倍。使用全部窗的平均。
- L577 — ★固定所見:把斑點加粗後偏差單調減小。第 3 節看到的 lk 偏差並非只是估計器的性質,散斑的取樣不足占了一半。若此處不再單調,「0.01 px」主張的依據便會崩掉一根。
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 是否可信 —— 對抗性地只把一個點向外移動。
- L1553 — ★2026-09-06「被埋沒」的狀態得到解決。以前是
n_reach == 0(固定其到達不了)。現在固定其能夠到達。
examples/poc_document_scan.py
- L271 — ★直接把 sobel_dir 作用於二值遮罩,會把梯度方向量化到 0/90 度,一點一票的帶方向 Hough 就會坍縮到那兩條線上(實測:4 條線中有 2 條正好是 0.00 / 90.00 度)。先模糊再測方向。
- L389 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_driving_decisions.py
- L247 (ja) — ★2026-10-03 まで縞が x に 10 m 長く y に並んでいた(90° 回っていた、ユーザー指摘)。下の門が向きを確かめる。
examples/poc_driving_endless_map.py
- L329 (ja) — 追従カメラ: 車の 7 m 後ろ・3 m 上から、車の 25 m 先を見る(★頂点がカメラの後ろにある三角形は描かれないので、 カメラを車の真上に置くと足元の地面に穴が開く)
- L337 (ja) — ★描画器は頂点が 1 つでもカメラの後ろにある三角形を捨てるので、足元に穴(空の色)が開く。地平線より下なのに何も 当たらなかった画素だけを地面の色で埋める(第 6 回の env_render と同じ扱い。見た目だけで、門には使わない)
examples/poc_em_second_opinion.py
- L115 (ja) — ★面積で揃える: 仕込んだ融合は「min_area 以上の 2 ラベルの和」なので必ず大きい。負例をそのまま 使うと「大きいラベル = 怪しい」だけで AUC が出てしまう(最初の実測: 弦 0.86 に対し面積だけで 0.87)。 負例は正例と同じ下限(2 × merge_area)以上の成分に限り、基準の「面積だけ」も同じ集合で測る。
examples/poc_emva1288_in_camera_processing.py
- L430 (ja) — ★壁時計でなく CPU 時間で掛ける: スイートが PoC を 6 本並べて走らせると、単独 31 秒が壁時計 115 秒になった(2026-10-13 の全量)。 この PoC が自分で使う計算量を見るのが目的なので、他のプロセスの混み具合で揺れない量にする。
examples/poc_endless_zoom_and_turning_solids.py
- L75 (ja) — 深さの巡回に使う色。★赤と緑は対にしない(意味が見る人で反転するため)
- L303 (ja) — ★主張は整数で置く。埋まった箱の数が 6 ズームとも同じ整数列である ことが「ズームしても同じ集合を見ている」そのもので、整数だから 環境に依らない。
- L310 (ja) — ★次元のほうは最小二乗を通るので機械精度でしか主張しない。
sd == 0.0 と書いていた時期があり、CI で落ちた —— 6 つとも 6 桁まで 同じ値なのに std != 0 で、degrade の記録も 0 件だった。同じ整数列を 渡しても BLAS の並列化で lstsq の最下位ビットが揺れる。 それは「ズームで次元が動く」ことではない。
- L412 (ja) — ★ここで最初の予言を外した。「2 パーセントの床は marching cubes の面取りの せい」と読んだが、距離を伸ばすと厳密な立方体も同じところまで落ちた —— 床の正体は透視投影だった。面取りのぶんは別の量(最大/最小の比)に出る。
- L630 (ja) — ★op が静かに degrade していないか。
fs.op.* は backend_safe.guard 越しで、 例外が出ても「sort 妥当な別の値」を返す —— 厳密な等式の検査だけが落ちて、 原因が症状から離れる。degrade していたらここで名指しする。
- L645 (ja) — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_eye_to_brain.py
- L60 (ja) — ★背側から見るだけだと、像の左右(方位角)は soma の y 軸 = 奥行きに写り、応答の移動が見えない (2026-09-20 に実測: 縞を動かしても同じ場所が光って見えた)。背側と側面の 2 方向を並べる。
- L139 (ja) — ★2 値の縞では 1 ビットでも相関 0.99 で量子化の効き目が測れない(実測)。背景 0.5 に +0.3 の 滑らかな縞(σ = 6 px)= 低コントラストの像で、ビット数が信号を潰す条件にする。
- L162 (ja) — ★実測(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 的名字,但把 (cos2θ, sin2θ) 傳給 colorize_flow 就能得到二倍角的循環 LUT(見末尾「工具的漏洞」(f))。
- L693 — ★存在「coherence」這個名字,但那是訊號處理中的雙訊號相干性(另一回事)。
- L724 — (e) ★同一族的兩個在輸入檢查上不一致。
examples/poc_fly_optomotor_steering.py
- L503 (ja) — ★2026-10-06: 6 系列に配色の役が 5 つしかなく、motor right が HS left と同じ色だった。 層ごとに 1 色、左 = 実線・右 = 破線にする。
examples/poc_fly_vision.py
- L623 (ja) — ★ラミナ段(DC 落とし)を省くと相関が落ちる、を固定する。落ちなくなったら fly_emd_response の側で DC が消えている(仕様変更)なので、この対照を見直す。
- L650 (ja) — ★PoC の門(tests/test_poc_scripts_run.py)は exit 0 に加えて “PASS” の印字を 要求する(合否を計算したのに捨てる門を防ぐ規約)。
examples/poc_focus_stacking.py
- L176 (ja) — 絞り。★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 的標題。最強檢測器的曲線,只按一次儲存按鈕就跌到對角線(乃至更低)。
- L677 — (4) ★漏洞 (a):op 的 argmin 讀出,對再儲存過的影像實質上是常數圖。AUC 恰好為 0.5 = 與隨機無法區分。
- L704 — (9) ★漏洞 (b):8 像素格。僅當差為 8 的倍數時才猜中(無再儲存)。
- L52 (ja) — 色。★赤と緑は対にしない
- L355 (ja) — ★変数名は章ごとに分ける(あとの章の best に上書きされて、図の説明が 別の章の数字を出していた)
- L370 (ja) — ★図が主題を映しているか。x, y だけで描くと zw 面の回転が消える。 実際にそれで 2 つの GIF がバイト単位で同一になっていた。
- L403 (ja) — ★marching-cubes 系と同じく巻きが内向きなので絶対値を取る
- L425 (ja) — ★B との差が「断面の角数に依らない」= 2 つの誤差が独立に分かれている証拠
- L559 (ja) — ★x, y だけを描くと zw 面の回転が消える。一般の向きで見る。
- L651 (ja) — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_fourier_ptychography.py
- L239 (ja) — ★明視野と暗視野の境に LED が乗る構成(ピッチ 7 mm・距離 70 mm、照明 NA 0.0995)は外し、境の章で別に見せる
- L390 (ja) — ★高さだけの線(振幅は一様)では、full(384 画素)で 2 本の初期値が 0.098 違って拒否された(差は照明 NA 0.2〜0.3 の 帯に集まる。暗視野の露光を 4 倍にしても 0.092)。散乱の弱い物体の高い周波数は、k の丸めの模型の誤差に埋もれる。
- L581 (ja) — ★実データでは瞳を画素ごとに自由に推定する(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 — ★第二個(才是真正關鍵的)閉式。視線由兩端的 h 連成,所以 N 的線性部分在視線和地面上疊加量相同而抵消。剩下的是 N 偏離弦的量 = |
N’’ |
d^2 / 8。此處 N’’ 為 2C(cos^2θ - sin^2θ),所以 |
N’’ |
<= 2C。 |
- L1120 (ja) — §10 穴。★2026-09-08 にこの節は「geoid / enu / datum は 0 件」を門にした。 2026-09-22 にその門が鳴った(埋まったから)—— 門を消さずに、まだ空いている 語幹へ付け替える。閉じた側は「何が閉じたか」を名前で固定する。
- L1124 (ja) — ★2026-10-15: material_xray_attenuation(X 線の減衰)の “att-enu-ation” が語幹 enu に当たる。 測地の ENU ではなく単語の一部 —— 同じ文字列の別の意味として名前で固定する。
- L1126 (ja) — ★2026-10-19: water_attenuation(水の減衰)も同じ。
- L1128 (ja) — ★2026-10-05: granular の datum_tilt_check(粉体の山の基準面の傾きの警報)が語幹 datum に当たる。 測地成果ではなく「高さ図の基準面」の意味 —— 同じ語の別の意味として名前で固定する。
- L1138 (ja) — ★
ortho は逆向きの教訓: op 名に ortho を含むものは 0 件のままだが、 能力は dem_height_frame_convert(frm/to に “orthometric”)で在る。 件数で「在る」と言ってはいけないのと同じくらい、名前で「無い」と言ってもいけない。
- L1141 (ja) — ★2026-10-15: 語幹 “ortho” は名前で実験計画の直交表の op(orthogonal、別の語)に 当たるようになった。門が問うているのは「標高(orthometric)の op」なので、検索語を正確にする。 あわせて検索側の穴も塞いだ: 欧文のクエリは 1 行目の doc までしか見ておらず、”orthometric” は dem_height_frame_convert の引数の説明にしか無いので 0 件だった(opassist.find に docstring 全文の段)。
- L1152 — ★
vertical 即使 op_find 回傳了數量,內容也沒有一條相關(如 boundary_vertices 的詞幹匹配)—— 不能靠數量就說「存在」。
examples/poc_glyph_typo_detection.py
- L40 (ja) — 壊す位置(行, 列)。★真値はここで決まる。
- L158 (ja) — ★統計は画像の全マスをまとめて取る —— 閾値をその形で導いたから。 行ごとに取ると、4 字の行では四分位が粗すぎて 0.48〜0.59 に跳ね、 正しい版面を自分で断ってしまう(実測)。導出と適用で統計を変えない。
- L210 (ja) — ★マスを少し広げて切り出し、その中で「このマスに属する成分」 だけをマスクにする。隣の字がマスの縁からはみ出していると、 マスちょうどで切ったときにその分が消し残り、置換後に 旧字の切れ端が浮いて見える(実測)。
- L287 (ja) — ★床は「同じ字なのに絵が違う」量。書体が 2 本以上あるならその散らばりで測るのが 実態に近いが、素の Linux には CJK が 1 本しか入らないことがある (実測: CI は fonts-noto-cjk だけで、この PoC が丸ごと skip して落ちた)。 1 本しか無いときは、ぼけ・線幅・わずかな回転・再標本化という既知の妨害で 同じ字を揺らして床を作る。測っているものが違うので、名前も表示も分ける。
- L355 (ja) — ★合成に対する主張を固定する(真値は自分で植えたので厳密に測れる)。 ここが割れたら、穴が塞がったか本当に壊れたかのどちらかで、 assert を消して通すのはどちらでもない。
- L364 (ja) — ★環境に依存する量を 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 (ja) — ★これは note 080 で退けた「順位で判定する」とは別物 —— 判定は今も床で行い、 ここで固定するのは分離しているという性質だけ。
- L403 (ja) — ★書体 1 本の環境では主張を弱める。妨害から作った床は書体の散らばりより 狭く(実測 0.0258 対 0.0581)、撮り方の違いだけで無事な字まで超えてしまう (実測 7 本中 5 本)。この環境では言えないことを言わないのが正しく、 閾値を緩めて通すのは測定を捨てるのと同じ。CI には CJK を 2 本入れてある。
examples/poc_good_sample_variation_model.py
- L286 (ja) — ★地の模様が弱いと、汚れた 3 枚の傷が位相相関の山を引っ張り、0.65 px の「ずれ」として拒否された (実測。拒否は正しい振る舞い —— 汚れた良品は位置合わせも汚す)。ここは帯の比較なので模様を強くする。
examples/poc_granular_heap_repose.py
- L357 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L408 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_graph_hierarchy_segmentation.py
- L369 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_grating_interferometry.py
- L323 (ja) — ★正直な限界: 段差の縁の 1 画素だけが π を超える板(平らな背景の隣)は、折り返しが見えずに通る
examples/poc_gravitational_lens_invariants.py
- L77 (ja) — 色。★赤と緑は対にしない
-
| L129 (ja) — ★縁の幅は像面の画素で測る。光源面の距離をそのまま使うと、倍率の 大きいところで縁が細く見え、面積が系統的にずれる(実測 2.1% → 0.2%)。 d は光源面の量なので、像面での変化率 |
∇d |
で割って像面の単位に直す。 |
- L242 (ja) — ★はじめ「暗い像が小さくなる u = 1.5 がいちばん苦しい」と読んで外した。 実測ではどの解像度でも u = 0.3(焦線に近い側)が最悪で、u = 1.5 の 暗い像は n=3201 でも 209 画素ある。苦しいのは「像が小さい」ほうではなく 「像が引き伸ばされて細い弧になる」ほうだった。
- L531 (ja) — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_hyperspectral_foreign_matter.py
- L105 (ja) — 見た目の色(線形 RGB の反射率)。★同じ色にしたのは設計(この PoC の問いそのもの: 色を合わせた異物)。 皮つきアーモンドの茶色に、殻・木片・茶色に着色した樹脂片を ±3 % で合わせた。黒い樹脂だけは黒い。
- L418 (ja) — ★実データの破片は暗い(反射率の中央値 0.07)ので、生の反射率の SAM は足し算のベースラインに負ける(下で数える)。 連続体除去(
spec_continuum_removal、上側の凸包で割る)の帯の深さ 1 − R/包絡 を特徴にする。
- L466 (ja) — ★外の真値の検査 1: 別の撮影の基準試料(Training/PP・PE・PET の 11x11)をライブラリにして、試験の場面の PP / PET / PE を分ける
- L482 (ja) — ★外の真値の検査 2: この PoC の材料表の物理(吸収帯 + Kubelka–Munk)をライブラリにする
- L944 (ja) — 幾何平均(間が空いていれば余裕の真ん中)。★初版は q_k だけで決め、試験のトレイで粒径・含水率の端の仁を 丸ごと排出した(画素の分位点は仁の「個体」のばらつきを数えていない、2026-10-15 に図で見つけた)。
- L1038 (ja) — ★クラスごとに同じ画素数で選ぶ: Fisher の Sb = Σ n_k (μ_k − μ)² は画素の多いクラス(ベルト・仁)に 引っ張られ、少ない樹脂片どうし(PE と PP)を分ける帯域を選ばなくなる(2026-10-15 の初回で実測)。
- L1050 (ja) — ★log 反射率で選ぶ: 画素ごとの明るさ(陰影)は全帯に共通の足し算になり、多変量の J はその方向を クラス内のばらつきとして割り引く(1 帯域だけでは明るさと材質を分けられない —— k = 1 が弱いのはそのため)
examples/poc_illusions_and_perpetual_drawing.py
- L60 (ja) — ★ここは以前「錯視の図で測る側を採点する」章だった。だが並んでいた検査は 自分で置いた定数を読み返すだけで、間に変換が 1 つも無かった —— 厳密に水平に引いた目地が水平だ、平坦に塗ったマスが平坦だ、同値に置いた 2 パッチが同値だ。錯視は人間の知覚の性質なので、測る側が騙される理由が そもそも無い。同義反復なので落とした(2026-09-24、指摘を受けて)。 残したのは 1 件だけ —— 素朴な長さ計測が実際に外すこと。これは 知覚ではなくアルゴリズムの偏りの話なので、中身がある。
- L95 (ja) — ★外した予言 —— 「矢羽根が長いほど偏りも大きい」と読んだが違った。
- L103 (ja) — ★錯視の絵(カフェウォール・チェッカー・カニッツァ・フレーザー・ エビングハウス)は直線と矩形を引いているだけで、この箱の力を 何も示していない。2026-09-24 の指摘を受けて主図から降ろした。 残すのは、測る側の偏りが見える 1 枚だけ。
- L144 (ja) — ★閉形式で厳密に出るものと、再帰で誤差が積もるものを同じ物差しで見ない。
- L167 (ja) — ★最初は「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 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L292 (ja) — ★この 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 (ja) — ★2026-10-18: residue_crt の錨を Wang–Xia 2010(IV-A 節)どおりに直した後は、最尤の復号と同等になる。 修正前(最も長い周期 = 16 MHz を常に錨にした)は 0.556 / 0.407 と大きく誤っていた。差の許容は 最尤の 10 % + 標本 5 個(誤りの少ない条件で数個の入れ替わりを許す)。
examples/poc_kendama.py
- L112 (ja) — ★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 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_larval_connectome_reservoir.py
- L43 (ja) — ★CI(2 コア)では full の設定が 600 秒の枠を超えて -1(timeout)になった(2026-09-20、run 35501201432)。 FULLSEYE_POC_BUDGET=reduced(CI では既定)で標本・格子・seed を減らす。展示の数字は full の実測で、 reduced は「同じ経路が走る」ことの証拠に留める(先頭に BUDGET: を印字)。
- L207 (ja) — 5. 図(FULLSEYE_FIGURE_DIR があるときだけ)。★2,952² の隣接行列をそのまま描くと 1.3 % の点で一色になり、 Fiedler 配置は重い裾の次数分布で 1 点に潰れる(2026-09-20 に実際にそうなった)。升に集約し、対照と並べる。
examples/poc_laser_line_speckle_floor.py
- L349 (ja) — ★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 (ja) — ★2026-10-21: 棒の縦軸は 0 から(自動範囲は最小値の少し下から始まり、差を 10 倍に見せていた)。
examples/poc_lidar_terrain_change.py
- L425 — ★無法測量的 core 面積完全不計入土方量。也回傳按有效率反除後的值 —— 不反除就會把「悄悄缺失的土方量」當成正確值。
- L713 — ★接近真值的數字未必「正確」—— 把方向相反的兩個誤差分開計數
- L842 — ★有效 core 太少時,LoD 不算作「已測量」(2 個點的標準差能算出數字但沒有意義)。
- L845 — ★若在此處抽稀,C2C 就會去測「抽稀後的點間距」,密度依賴隨之消失(最初寫成統一到 6000 點時,任何密度下都成了恆定的 0.42 m)。
- L965 — — ★ 對齊掉多少,變化就消失多少 ————————————– #
- L1329 (ja) — ★座標の約束: 格子の行 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 次項)
examples/poc_machine_condition_fusion.py
- L184 — (聯軸器, 軸承A, 軸承B, 整機) 的發熱 [W]。★正常、不平衡、鬆動是故意做成相同的 —— 從原理上無法用熱區分的 3 種模式。
- L202 — ★和軸承一樣熱。不同的只有擴散範圍(兩個軸承 + 整機)。
- L1028 — ★2026-09-08:這裡原本自己手寫了 numpy 的 rfft —— 因為讀到「台帳裡沒有單邊幅值譜的入口」,但
fs.spectrum 一直都在(只是沒在台帳裡出現)。這是只看一層就斷定「沒有」的例子,故改為使用 op 的寫法。
- L1162 — ★2026-09-08:這裡原本寫著「台帳裡沒有 spectrum」,但
fs.spectrum 從一開始就在(dsp 的 1-D 層)。缺的只有「在台帳(fs.ledger)裡出現」和「每個 op 的筆記」;這個 PoC 只查了一層就斷定「沒有」,自己手寫了 numpy 的 rfft。現在把 ops1d 接入台帳後,兩邊都能查到。
examples/poc_malecns_activity_wave.py
- L241 (ja) — ★同じ瞬間を 3 方向から(2026-09-20、ユーザー「いくつかの方向から発火状態を見れると良い」): 上段コネクトーム、下段 shuffle
examples/poc_material_optical_library.py
- L111 (ja) — ★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 (ja) — ★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 (ja) — ★★看板は一目で読めるものにする。濃淡の地図は情報としては正しいが 読者には「色のついた雑音」で、何の図か分からない。ゲージ R&R の古典的な 見せ方 —— 部品ごとに測定値を縦に並べる —— なら、10 個の塊が縦に離れて いるのが部品差、各塊の太さが測る行為のばらつき、と目で読める。
- L211 (ja) — ★「全部内側のはず」と書いたら 1 升はみ出した。実データのほうが正しい —— 規格の例題はわざと 1 点だけ管理外にしてある(範囲図の読み方を示すため)。
- L466 (ja) — ★2 点を結んだ直線では「7.3 % 違う」としか言えない。交互作用の強さを 掃引すると、いつモデル選択が効いていつ効かないのかが曲線で見える。
- L661 (ja) — ★★規格の「t 表を引く直前に切り捨てる」は、滑らかな t(ν) に対する階段。 実装が踏んだ欠陥(切り捨てずに引いた)が、そのまま曲線と階段の差になる。
- L684 (ja) — ★3 点の散布では「向きが逆」が読み取れない。相関係数を掃引すると、 2 本の曲線が無相関の水平線を反対側で横切るのが見える。
- L756 (ja) — ★★その 150 は乱数ではなく閉形式で出る: X1²+X2² は u²χ²₂ = 平均 2u² の 指数分布なので、上側 95 % 点は 2u² ln 20。公表値と小数 1 桁まで合う。
- L771 (ja) — ★★閉形式が絵になる場所。x1 = x2 = 0 では X1^2 + X2^2 は u^2 chi^2_2、 すなわち平均 2u^2 の指数分布。95 % 点は 2 u^2 ln 20 で閉形式。
- L837 (ja) — ★★半幅を 3 本の水平線で並べても「なぜ違うのか」は見えない。密度を 重ねると、正規近似の裾が実際より厚いことが絵で分かる。
- L849 (ja) — ★区間は水平の線分で描く(plot_series は非有限を拒むので 「NaN で区切って 2 本の縦線」は使えない。読みやすくもある)
- L912 (ja) — ★窓は3 段階すべてが入るように取る。伝播則の下端が 0 を超えるのは x1 > 2 k u = 0.0196 なので、そこまで届かない窓だと「追いつく」が見えない。
- L922 (ja) — ★各コマで最大値に正規化する。絶対密度のままだと、指数(原点で 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 (ja) — ★2026-09-23: 語の網を (“notch”, “destripe”, “mura”) に狭めた。npr 族が入って ‘moire’ と ‘periodic’ が引っかかるようになったが、
halftone_moire_period は うなりの周期を予言する op であって落とす op ではない —— 穴は残っている。 「語で引く穴の固定」は、別の意味で同じ語を使う族が来た瞬間に偽陽性になる (この PoC は (a) で fly_hex_lattice の例を既に書いている)。穴の主張は 語でなく「何ができないか」で書くこと: ここで無いのは「特定の (fx, fy) を 落とす」op であって、「モアレという語を含む op」ではない。
- L636 (ja) — ★2026-09-23: “moire” はここから外した —— この PoC が「族の名前か docstring に入れておけ」と書いた提案がそのまま実装され、
halftone_moire_period が 引けるようになったため。穴の記録は埋まったら埋まったと書く(消さない): 消すと「昔から在った」ことになり、何が効いたのかが記録から落ちる。
- L640 (ja) — ★元の判定は「名前にその語を持つ op が返らないこと」(docstring 一致は数えない)。
op_find は docstring も語幹も拾うので、素の == [] にすると edge_alias_energy のような無関係の族で必ず鳴る(一度そう書いて落ちた)。
- L646 (ja) — ★2026-10-13:
lattice_moire_peak(flyvision、標本化格子がナイキストを超えた模様から作る モアレの尖り = ピーク/背景中央値)も引けるようになった。網点の 2 版のうなりとは別の モアレ(格子×周期面)で、ディスプレイ・メッシュ・織物の検査カメラ側の語。
- L649 (ja) — ★2026-10-15: 位置合わせのモアレ 8 op(moirealign、
moire_*)が加わった —— ピッチの僅かに違う 2 枚の格子の 縞の位相から nm のずれを読む側で、網点のうなり(画質の欠陥)とは逆にモアレを測りに使う語。
- L651 (ja) — ★2026-10-15: op_find に docstring 全文の段(最低点 12)が加わり、本文で「モアレ」に触れるだけの op (fly_vogel_lattice・halftone_screen・sampling_alias_distance)も並ぶ。名乗る op だけを数える。
examples/poc_multibeam_bathymetry.py
- L359 (ja) — ★走時を使い切った光線は cosθ が層の途中の値のまま残り、後ろの層で dt_full が 負になりうる。負の dt は rem を「生き返らせ」光線を進めてしまう(実データの 152 節点のキャストで 57 度・0.13 s が 110 m → 493 m になった)ので 0 で止める。
- L544 — 合成回波的部分角數目。★把它設為 61 時,在 70 度處相鄰部分角的到達時間相差 330 µs,超過脈衝寬 64 µs,於是包絡變成梳齒,幅度檢測會拾取其中一個齒(檢測偏差為 -1131 µs)。用直方圖建構到達時間的密度並與脈衝卷積更正確。
- L572 — ★不要把下限裁到 0 —— 正下方波束會只剩一側,照亮的帶寬減半(曾以腳印減半的形式踩過一次坑)。
- L729 — ★把橫軸除以該波束自身的回波長度。以原始 µs 疊加會讓 70 度(21 ms)獨佔座標軸,使正下方與 45 度擠成一條豎線。
- L732 — ★
plot_series 會拒絕 xlim 之外的點(因為它們貼在邊框上,看著像真資料)。裁剪是呼叫方的職責,故先裁剪。
- L1151 — ★不要看重疊的正中間 —— 那裡兩條測線的擺角相同,誤差疊加量相同而差為零。要取整個帶內的最大值。
- L1222 — ★縱軸取高度(= −深度)。直接用深度繪製會上下顛倒,使「微笑」形狀看起來像「愁眉」。
- L1293 — ★縱軸為 −深度。直接用深度繪製會得到海面在下、海底在上的顛倒圖。
- L1327 — ★
op_find 以詞幹部分匹配來命中,所以即便數量不為 0,內容也可能無關(“footprint” → sk_median_disk)。要看到最上層的名字再說「沒有」。
- L1383 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
- L1974 (ja) — ★左右に分ける: 音速の取り違えは θ について偶(左右対称)。ロールの小さな 取付偏りや参照格子の左右の食い違いは奇(D tanθ δ)。中心対称な階級なので k と n−1−k が鏡像。偶部で崖を測り、奇部は両解で同じか(= 音速でない)を見る。
- L2231 — ★全路徑的懸崖比預測更靠前。差異來自幅度檢測的偏差(閉式中沒有的量)
examples/poc_nuclei_ploidy.py
- L686 — ★確實存在方向相反的兩個失誤相互抵消、偽裝成「與真值完全一致」的列
examples/poc_one_stroke_epicycles.py
- L209 (ja) — ★線画なので灰色のまま出す。(H,W) を渡すと save_gif が疑似カラーに 塗って黄緑の絵になる(実測)—— 強度そのものを見せる図では色は邪魔。
- L246 (ja) — ★env は examplefig が 呼ばれるたびに読むので、ここで入れれば効く (import 時に固定されていたら –out が黙って無視される、の回避)。
- L267 (ja) — ★2026-10-06: 図の見出しが「photograph (NASA AS11-45-6709)」のまま北斎を描いていた(前の題材の名残)。 出典は入力から決める(–image で自分の写真を渡したときに北斎と名乗らない)。
- L418 (ja) — ★この絵では既定のペン幅 1.0 px がたまたまほぼ当たっており(偏り -0.0031)、 解いた幅 0.900 px のほうが偏りは大きい(-0.0294)。閉形式が当てるのは 偏りではなくインク率なので、門はそちらに置く —— 偏りで門を作ると 「元から合っていた絵」で落ちる(実測でそうなった)。
- L422 (ja) — ★偏りで門を作ると「元から合っていた絵」で落ちる(この絵では既定 1.0 px の 偏りが -0.0031 と既にほぼ 0 で、解いた 0.903 px のほうが偏りは大きい)。 閉形式が当てるのはインク率で、線が重なるぶん実測は必ず下回る —— 門はその向きと大きさに置く。
- L457 (ja) — ★ナイキストを満たしているかを先に測る。等弧長の打ち直しは、標本間隔が 線分より粗いと角を切って線そのものが短くなる —— フーリエに載せる前の 段階で情報が落ちるので、ここを見ないと「予言が当たった」の土台が崩れる。
- L523 (ja) — ★図を出さない設定のときは組む前にやめる(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 — ★只用一個種子時,這條曲線的起伏就只是波動。用 4 個種子把均值和離散度分開後,再說它「越過」了。
- L428 — ★對照組 —— 只把既未融合也未斷裂的團塊,與該團塊所成像的那個粒子本身一對一地比對。若真值一側用全部粒子,「越大的粒子越容易融合」這種選取偏差就會混入,與取樣偏差無法區分(起初就是這麼寫的,弄錯了)。
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 倍裝進一張圖,縱軸取 log10 比值。0 表示「正好是真值」。若保持線性,向下的偏差會被壓扁而看不見。
- L792 — ★疊加原始 MSD 時,4Dτ 的直線支配一切,看不出差異。改用除以真值的比值後,偏離 1.0 的方式(=損壞方式)就能從形狀上讀出。
examples/poc_periodic_video_boundary.py
- L137 (ja) — 第 2 章 ★空の出力は、等変性の門を素通りする # ————————————————————————— #
- L267 (ja) — 第 4 章 ★汚れるフレームは集合として閉形式で予言できる # ————————————————————————— #
- L296 (ja) — ★汚れが先頭側だけで末尾側に無いこと = 窓が後方(因果的)である証拠
- L457 (ja) — ★この 1 行が要る。門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見ており、落とすと exit -2(門が付ける合成コード、 意味は「exit 0 だが PASS を印字していない」)で赤になる。
examples/poc_phase_measuring_deflectometry.py
- L496 (ja) — ★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 的 bug。
- L181 — ★也固定應力場本身的驗算。若積分得到的力與載荷不一致,就不是「真值」;中心值應在代數上等同於閉式 8P/(πDh)。
- L207 — ★固定零點的水平。之後所有的「◯倍」都以這 1.09 MPa 作分母,所以此處一動,比較的含義就變了。
- L231 — ★固定所見:從單張暗場圖只讀整數條紋的樸素方法,連零點的 2 倍都贏不了。因為解析度被 fσ/h = 1.78 MPa 的步長所限。與第 4 節相移(誤差降到機器精度)的對比是本 PoC 的骨架。
- L286 — ★因為在零雜訊下從同一強度公式反解,θ 應嚴格還原(從 4 張平面偏振求 4θ 的代數本身就是逆映射)。
- L308 — ★固定所見。(1) 一致率超過 95 %,但達不到 100 %。其餘是被 (δ,θ) ↔ (-δ,θ+90°) 二義性翻轉符號的像素,單波長單次測量原理上無法消除。就把「既非幾乎吻合,也非完全吻合」這個所見原樣固定下來。
- 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)。相機的位元深度與雜訊一樣重要。
examples/poc_pigment_unmixing.py
- L860 — ★「不要歸結為一個數字」的根據本身。同一行中 1.000 與 0.013 並列。
- L1082 — ★把沒能取勝這件事也留在圖裡。沒有任何一條復原落在零點線以下。
examples/poc_pipe_wall_loss.py
- L423 — ★健全區要選「沒有任何缺陷落入的 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 (ja) — drizzle(既存 op、面積保存の別実装)で独立に合わせる。★drizzle の shifts は「フレームの中身が基準からずれた向き」 なので、センサのシフト(画素 (r, c) がシーンの c + dc を見る = 中身は −dc ずれる)とは符号が逆。
- L508 (ja) — ★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 (ja) — ★文献値との差は門にしない(正直に): 間引いた点群の主軸方向の外接幅は 562 × 298 × 244 m で、 文献の 535 × 294 × 209 m より 1〜17 % 大きい。主軸の取り方(点の主成分か慣性主軸か)と外接の取り方の 違いで、どちらが「正しい」かをこの例は決められない。比較の文には文献値(535 m)を使う。
examples/poc_pod_lighting.py
- L406 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_powder_grinding_ae.py
- L269 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_powder_scoop_pour.py
- L313 (ja) — ★2026-10-07: 共有ランナーでは同じ計算が手元の数倍かかる(poc_reproducible_icp で 6 s → 41〜57 s)。 CI(py3.10)で 5.33 s になり落ちた。主張は手元の 5 s、CI は 8 倍の枠で「桁が変わっていない」だけを見る。
- L316 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L503 (ja) — ★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 (ja) — ★2026-09-13: ‘lattice’ だけ例外を 1 つ許す。flyvision 族の
fly_hex_lattice(複眼の六角格子)が この語を含んで CI で鳴った(run 34751219513)。あれは網点の格子ではないので印刷の穴は 残ったまま —— 例外は名指しで 1 件に限り、それ以外が現れたら今までどおり鳴る。 「語で引く穴の固定」は、無関係の族が同じ語を使った瞬間に偽陽性になる、という実例。
- L1281 (ja) — ★2026-10-13: 縞に近づくハエの眼(poc_zebra_stripes_fly_eye)の
fly_vogel_lattice(フィボナッチ の複眼)と lattice_moire_peak(標本化格子のモアレの尖り)も同じ語を含む。どちらも複眼の 標本化格子で、網点の格子ではない —— 名指しで足し、印刷の穴は残ったまま。
- L1286 (ja) — ★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 中帶實測數字寫明「不能用於重複結構」,並讓它把投票的第二高峰 / 最高峰作為
vote_margin 返回。用贊成率無法區分的兩者,用這個數就能區分。
examples/poc_print_warpage_risk.py
- L364 — ★新生成的層被放在「當時已經翹曲的面上」(單元的誕生在變形後的構型中進行)。若忘了在此初始化,只有後長出的層保持零位移,用列平均測得的翹曲變成 1/4(2026-09-07 踩過)。力學(K 與 f)在公稱格子上,故不變。
- L806 — ★頸部整個消失。部件會分成兩塊,所以不能求解。
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 (ja) — ★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 (ja) — ★40 s は手元(19-22 s)の 2 倍で決めていたが、CI の py3.10 の走者で 41.6 s に なり落ちた(2026-10-11、ほかの 13 門は全部 ok)。走者は手元の約 2 倍遅いので 3 倍の 60 s に。
- L262 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_real_coin_metrology.py
- L136 — ★即使數目相符,也未必數的是同一樣東西。要確認 1 個圓恰好落入 1 個成分(一對一)—— 不做這一步,「24 = 24」也會碰巧成立(1 個兩片黏連的團塊 + 1 個雜點,仍是 24)。
- L341 (ja) — ★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 — ★缺口 1 已於 2026-09-06 封堵。此 assert 已改寫為固定已封堵的狀態一側(以前固定的是損壞狀態:
d_fixed < 1e-6 < d_default = 已損壞)。若損壞方式回歸,這裡會失敗。
- L976 — ★缺口 2 已於 2026-09-06 封堵。以前是
< 0.9 * len(ka)(固定損壞狀態)。現在固定的是保持預設即可完全一致。
examples/poc_reproducible_icp.py
- L39 (ja) — ★既定(図なし)の経路は 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 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L468 (ja) — ★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 — ★軀幹由並排放置兩個膠囊體構成。若用單個圓柱體,截面會變成圓形,肩部(距軀幹中心 ±0.19 m)會脫離軀幹的陰影——真實軀幹的截面是寬 0.50 m / 深 0.30 m 的扁平形狀,伸出的手臂從背後看會被軀幹遮住。
- L126 — ★X0 與速度經過挑選,使得「每次試驗中真實分離距離始終為正(不接觸)」且「在危險帶停留足夠長的時間」——若讓其快走,會在數幀內穿過危險帶,用於統計漏檢的樣本就不夠。
- L673 — ★若在保留遮擋的情況下改變密度,遮擋偏差(+0.12 m)會疊加到每一行上,使密度的影響看不出來。逐個關閉因素正是對照組的作用。
- L683 — ★雜訊與抽稀只抽一次時,漏檢率會上下波動幾個 %。跑 3 次取平均。
- L840 — ★按行批量評估(逐個儲存格的 Python 迴圈會跑 15000 次)。
- L1079 — ★體積 op 是 (depth,row,col)。grid_coords 是 (nx,ny,nz),所以要轉置。
examples/poc_sam_hybrid_bonding_voids.py
- L332 (ja) — ★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 — ★把標題主張放進一張圖:完好無損的天花板,僅因對齊方式就顯得傾斜
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 本身,會貼在右上角、被圖例框擋住而看不見(實際上就曾被擋住一次才察覺)。圖要先看「是否讀得出來」再定——即使數字正確,被擋住就傳達不了。
- L1089 — ★可重現性檢查:由於種子和幀數都與 §3 不同,看在相同條件下會變動多少。
- L1266 — ★要超過零基準(在假陽性率對齊的前提下)。增益是保守的——「即便零基準也能達到 174 m」才是本節的發現,因此固定的是這一點。
- L1272 — ★落空的預測:減去整體背景是仿射變換,因此實質上等同於零基準
- L1286 — ★落空的預測:在實測的 p 下,平行搜尋在 C=1 時達不到 1.000
- L1290 — ★形狀只對平行搜尋有效:統一掃描寬度後,隨機一致而平行分裂
- L1293 — ★落空的預測:本以為平坦的曲線更強,結果反而更弱(因為拖尾長)
- L1296 — (6) ★W 加倍 與 t 加倍 等價
- L1304 — (8) ★看守者:誤檢集中在正下方。僅憑閾值 W 就會大幅變動
- L1322 — ★填補缺口一側的門(2026-09-08)。由於給 op_find 加了日文段,並在 star_detect 的 docstring 中寫了領域中立的描述詞,因此固定在日文查詢中能排在前列。若退化,這裡會報警。
- L1327 — ★唯獨「點 檢測」至今仍不出現——單字「點」也必然出現在 cv_canny / frei_amp 這類輪廓 op 的說明中,因此同分並列把它擠了出去。不掩蓋這一侷限:日文段只有在「兩字及以上的詞起作用」時才拾取得到。
examples/poc_segmentation_gauntlet.py
- L237 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L282 (ja) — ★表は世界ごとに 1 枚。examplefig.save_table は 1 セルごとに text_box を全画像に掛けるので、65 行 × 16 列の 1 枚は 100 秒を超えた (実測 104 s)。11 行 × 11 列 × 6 枚なら数秒で、読む側も世界ごとに手法を比べられる。
examples/poc_shape_from_polarization.py
- L296 (ja) — ★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 (ja) — ★MT 法。単位空間の MD² の平均はちょうど (n-1)/n(導出した恒等式)。 1.0 を固定する検査はどんな有限標本でも間違いになる。
examples/poc_star_astrometry.py
- L264 — 圖像合成(★ 缺口:fullseye 中沒有在指定座標放置星點的公開 op) # ————————————————————————- #
- L1243 — ★ 「每次小」和「總體小」是不同的主張。
- L1348 — ★「均勻·孤立」的偏差為 0.0000 是理所當然的 —— 板解正是用那 24 個擬合的,所以最小二乘讓殘差的均值為 0。要看未使用的星上的誤差,需逐個剔除後重新求解。
examples/poc_stockpile_volume.py
- L658 (ja) — ★座標の約束: 格子の行 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 — ★先取量測方法本身的地板 —— 無劣化、無姿態誤差,只測兩次。
examples/poc_surface_roughness.py
- L270 — ★真值要 在宣告頻帶之後 定義。真值不是粗糙度成分本身,而是「用 λc 截取之後的粗糙度成分」。若這裡用原始的 rough_true,即使按正確步驟量測也會偏 -23%,那 23% 會與取樣誤差混在一起。不含頻帶的「粗糙度真值」並不存在 —— 這也是第 2 節的主張。
examples/poc_swc_tree_truth.py
- L200 (ja) — ★門 4: fullseye の op が自前の計算と整数まで一致する(op の実例 + 第 2 実装)
- L209 (ja) — ★門 2: 3 次元 Sholl は回転で整数が 1 つも動かない
examples/poc_table_tennis_bounce.py
- L53 (ja) — 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 (ja) — ★送り合いの刻みは 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 (ja) — ★追跡カメラは予算に関係なく 240 fps。120 fps に落とすと標本が半分になり、回転の誤差が √2 倍(バック 0.9 → 10.9 %)、 コマ間で球が 1.6 cm 動くので跳ねの谷も浅く見えた(2026-09-30)。予算は長さの掃引の刻みだけで削る。
- L245 (ja) — 画像から見つけた跳ね(真値は使わない)。★z の局所最小のうち最も低いもの —— 欠けた検出が残ると空中に偽の 「跳ね」ができ、最初の谷を採るとその手前で軌跡を切ってしまう(バックスピンで 36 コマしか使えなかった)。 高さの閾値(台 + r + 1.5 cm)で選ぶ手は、コマ間で球が 1.6 cm 動く 120 fps で本物の谷を落とした
examples/poc_telecentric_metrology.py
- L113 (ja) — 狙い = iterative)。★2026-10-15 から門に使う: 手元に optiland が無いとき(CI)は、この記録値と telecentric.chief_ray_angle・raytrace.chief_ray(入射瞳が無限遠なら絞りを狙う)の両方を 2e-6 mm で照合する (記録は 6 桁に丸めてあるので丸めの幅 5e-7 mm を含む)。
- L1231 (ja) — ★リングごとに自由な楕円(5 自由度)を当てると、影で弧が 90〜180° しか見えない外側のリングは長半径が外挿で 膨らむ・縮む(2026-10-15 に元の解像度で見て分かった: 外側のリングで楕円が白い線から外れ、間隔が 246〜257 px/mm と ばらついた)。テレセン(正射影)なら傾いた板の同心円は「中心と形を共有する楕円の族」に写るので、族ごと当てる。 族の仮定そのもの(中心の共有)は (c) でリングごとに中心を解き直して確かめる。
examples/poc_tem_ctf_thon_rings.py
- L345 (ja) — 許容幅(★初回の実行で 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 (ja) — ★手前側の辺を集めて、ひとつの座標系で一度に焼く。三角形を 1 枚ずつ 焼くと、呼び出しごとに自分の外接矩形へ正規化されて図が壊れる。
- L423 (ja) — ★判定は “is not a similarity” で行う。”similarit” だけで見ると op 名
ifs_similarity_dimension そのものに当たって必ず通る —— 最初それで書いており、しかも preset 名を間違えて(“fern”、正しくは “barnsley_fern”)未知 preset の拒否を見ていたのに OK が出ていた。
- L547 (ja) — ★図の書き出しが失敗したら、ここで拾う。見ないと「検査は全部 OK・でも図は 1 枚も出ていない」が黙って通る(examplefig は fail-soft で貯める)。
examples/poc_thermal_drift_metrology.py
- L560 (ja) — ★語で穴を固定すると、別の意味で同じ語を使う族が来た瞬間に鳴る。
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,發散會塌縮成左端的一條豎線,讀不出關鍵的「從哪裡開始跳」。
- L782 — ★
plot_series 會拒絕框外的點(因為它們會貼在框上,看起來像真實資料)。發散的一側由呼叫方先行裁掉。
- L836 — ★橫軸是絕對的 Δε。若用相對 Δε/ε 作圖,三條會完全重合(因為如 §2 所述 ε 從式中消去)—— 作為圖什麼也說不出。
- L1169 — ★guard band 用的是上側的伸出。因為我們想判為合格的是「真值不在閾值之上」,所以在區間的上端裁切。若用下側 off[0],會裁得過淺(分布右偏多少就淺多少)—— 曾這樣寫過一次,因誤合格沒有減少才察覺。
- 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 — ★僅此處為近似。由於一維解不含橫向擴散,故在每個時刻以擴散長 σ(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 行就是「壞掉的原因只有橫向擴散一個,既不是像素粗糙也不是取遮罩的方式」的依據。放鬆它,第 3 節的結論就會退回到『提高解析度就能修復』的誤讀。
- L514 — ★如果上面的推理(視窗末端的擴散長度起作用)正確,那麼截斷視窗就能修復。立下假設後,務必安排 1 個能證偽它的實驗。 —————————————————————— #
- L535 — ★固定這個 PoC 最重的所見 ——「縱橫比的極限」不是物理,而是擬合時間視窗的選法。(1) 視窗 4 秒時,8 個小的全部落入 ±20 %(實測最差 -14 %)。
- L623 — ★固定所見:若加熱均勻,原始單幀檢出最多,而 TSR 的 2 階導數一個也檢不出。「對深度估計有效但不適合檢測」= 同一工具未必對兩者都有效,正是本節的主張本身。
- L670 — ★燈的映入。帶有與缺陷同尺度結構的正是這一個。
- L697 — ★固定所見。(1) 會破壞它的只有 (c) 的與缺陷同尺度的不均勻。(b) 的平緩傾斜幾乎不破壞原始單幀 —— 這裡正是「預料落空」之處,所以明確確認 (b) 不低於 (a)。
- L778 — ★也給預設的 cube 加入 NETD。雜訊為零時,健全區的面內起伏嚴格為 0,SNR 會變成 1e9 這樣無意義的數(實測後修正)。
examples/poc_thin_film_reflectometry.py
- L92 (ja) — ★色名から色相への対応は私の選択(CSS の色は表の色より彩度が高い)—— 色相だけを比べる。
- L210 (ja) — ★ 実測で採点(公開データ、CC BY 4.0)—— この PoC の主役 # ————————————————————————— #
- L308 (ja) — ★フラット補正(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 (ja) — ★予言が外れた: 「裸の Si は無彩色(C* < 3)」と置いたら C* 6.6 だった。Si の反射率は 400 nm 0.49 → 800 nm 0.33 と 短波長ほど高いので、裸のウェハは青みの灰色に見える(実物のとおり)。門を所見の側に書き直した。
- L475 (ja) — ★境の直上でも 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 (ja) — 色。★赤と緑は対にしない
- L623 (ja) — 3. 消える距離は整数(束ね幅を縦に積む。★各行を正規化しない)
- L638 (ja) — ★消える行(f·k が整数)に左端で印を付ける
- L775 (ja) — ★見せる図は決め打ちの制御点で(検査のほうは乱数 4 通りで通してある)
- L851 (ja) — ★門 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 中修復的漏洞。三個 Otsu 對同一輸入返回了不同答案 —— 僅把同一影像乘以 4095,判定就偏移了 otsu 13.34 pp / cv_otsu 13.92 pp,只有 sk_otsu 是仿射不變的。原因是
ops._otsu 和 backends._u8 中的 np.clip(v, 0, 1)(0..255 的 float 會使全部像素飽和而變成「全部前景」)。現在三者都不隨倍率而變。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 個數字」最強的依據。
examples/poc_veiling_glare.py
- L229 — ★fullseye 側的核對:艾里斑 → psf_to_mtf 是否與閉式一致
examples/poc_vessel_network.py
- L263 — ★漲落要在模糊之後加。先加的話 PSF 會把它抹平,閾值邊界仍保持乾淨(最初就那麼寫,即使把振幅提高到 0.35 也一根毛刺都沒出現)。
- 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 (ja) — ★ 縁に触れた 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)—— 交換不會破壞「在同一根柱中,較晚開始的一方是等待方」這一時間嵌套(只是角色互換,兩個角色都被正確填入)。會被破壞的是當兩個人看起來像一個人時。
- L594 — ★只保留靜止的芯。柱由兩人份的足跡構成,有 1.8 m,因此穿行者的中心也會有 2〜3 幀落入柱內(實測中這製造出「只有一個人的干涉」,10 件中落掉了 8 件)。將持續停留在距中位數 :data:
CORE_R 以內的最長連續段作為芯。
- L846 — ★按多人成分來計數會使「通道上有 10 人通過的列」變厚而混雜,所以在同一個人內部比較「等待期間」與「行走期間」。
- L1257 — 標記的大小。★由於在同一貨架前會發生「等待補貨」與「缺貨」,所以從大的標記開始畫,把小的標記疊在上面。若以相同大小繪製,後畫的會完全遮住先畫的,圖上 5 件看起來只有 2 件。
examples/poc_water_level.py
- L346 — 2. ★零點 vs 單應性 # ————————————————————————— #
- L389 — 3. ★符號會隨錨點(anchor)的位置而改變 # ————————————————————————— #
- L422 — 4. ★波動 —— 穩健(robust)只在存在離群值時才有效 # ————————————————————————— #
- L459 — 5. ★★反射 —— 系統性地偏低 # ————————————————————————— #
- L622 — (d) 卡尺(caliper)是存在的(★正要寫「沒有」時,翻了 3 層後找到了)
examples/poc_web_roll_periodicity.py
- L123 — ★第 1 nip 與第 2 nip 的周長差故意只有 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 也評估梳狀的諧波 bin,所以在這裡顯式取整。
- 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 (ja) — ★2026-10-13:
op_find("laser") は 0 件でなくなった —— coherent 族 (laser_line_coherent / speckle_field / triangulation_speckle_limit)が引っかかる。 だがあれは光条を描く側と、スペックルが決める誤差の床を返す閉形式で、 画像から列ごとの中心を取る op ではない。穴は残っている(語でなく族で固定する)。
- L700 (ja) — ★2026-10-15: op_find に docstring 全文の段(最低点 12)が加わり、引数の説明に “laser” と書いただけの 無関係な op も並ぶようになった。ここで固定したいのは「名前か 1 行目で laser を名乗る op」なので、その段は除く。
- L705 (ja) — ★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 (ja) — ★偏りの正体を探し当ててから書く。平面の推定が 1.88 と 真値 2 より低いのは、最初に疑った「点数が足りない」ではなかった (400 → 3,000 点で 1.8825 → 1.8709 とむしろ下がる)。正体は べき乗則を見る半径の窓で、既定は対距離の 1〜25 パーセンタイル —— 単位正方形ではその上端が箱の端に当たり、相関和が飽和して傾きが審う。 窓を小さい r 側に寄せると 2.05 まで上がる。
- L402 (ja) — ★平行移動フレームの効き目: まっすぐな区間を含む曲線でも半径が崩れない
- L480 (ja) — ★K の一致は必要条件にすぎない
- L630 (ja) — ★図の書き出しが失敗したら、ここで拾う。見ないと「検査は全部 OK・でも図は 1 枚も出ていない」が黙って通る(examplefig は fail-soft で貯める)。
examples/poc_worm_neurites_grow.py
- L111 (ja) — ★dist_to_root には coords に無い節点も入っている(1 匹目で 196 本中 54 本)。 座標のある節点だけに絞らないと最大値が食い違う(最大 12 倍)。
examples/poc_zernike_aberrations.py
- L85 (ja) — n <= 6 の 28 モード。★(n+1)(n+2)/2 = 28 は閉形式で数えられる
- L402 (ja) — 絵を作る道具 —— ★色は飾りでなく量に結びつける # ————————————————————————— #
- L588 (ja) — ★本物の op と突き合わせる —— 同じ仕様の 2 度目の実装。
fit_zernike は torch(grid_sample)で補間するので、CI の py3.10 / py3.12 には入っていない(大きさと時間のため py3.11 だけ)。 だから発見そのものは numpy の写しで立て、op があるときだけ照合する。
- L707 (ja) — ★同じ絵を線形補間で読むとどうなるか(章ごとの接尾辞 lin_)
- L838 (ja) — ★1 次か 2 次かは「収差を半分にしたときの比」で分かる(章ごとの接尾辞)
- L865 (ja) — ★帯は必ず書く。球面収差のハローは明るいので、同じ帯でも段数が変わる (実測: 無収差の 3.5-8.0 λ/D は線形 1 段、球面収差 0.30 波なら 6 段)。
- L1041 (ja) — ★検査で使った点像は瞳 96・格子 1024(1 画素 0.19 λ/D)で、絵としては 粗い。同じ無収差をもう一度、細かい刻みで描き直す(数は検査のもの)。
- L1298 (ja) — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/polarization_camera_pipeline.py
- L110 (ja) — ★雑音つきで回復した行列は coherency の最小固有値が僅かに負に出る(雑音 1e-4 → -1e-4 程度)。tol は雑音の水準で置く。tol を勘で小さくすると「非物理」に化ける。
examples/profile_shape_inspection.py
- L25 — ★由於要 import repo 根目錄下的模組(profileops),把 repo 根目錄放在最前,使其從 checkout 直接執行也能通過。與其他範例做法相同。沒有它,
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 的字串誤認作呼叫,「一個範例都沒有的 op」被隱藏在 100% 覆蓋率之中。
examples_3d/geodesic_dome.py
- L6 (ja) — ★この例の要点は絵ではなくオイラーの公式: V − E + F = 2 から、次数 5 の 頂点はどれだけ細分してもちょうど 12 個になる。11 個でも 13 個でも球には ならない。ここでは次数を 別実装の op(conngraph.graph_degree_table)に 数えさせて確かめる —— 自分で数え直して自分と一致しても、何も確かめたことに ならないため。 repo をそのまま clone した状態でも動くように、リポジトリ直下を import パスへ入れる。
- L48 (ja) — ★オイラーの公式の帰結。細分しても 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 (ja) — ★この例の要点は絵ではなく定義そのもの: 極小曲面とは「平均曲率 H が至るところ 0」の曲面である。既存の
vertex_curvature がまさにその H を測るので、 「これは極小曲面だ」という主張を、作り方を知らない op が採点する。 対照群として単位球(H = 1)と半径 1 の円柱(H = 0.5)を同じ手続きにかけ、 門が素通しでないことを示す。
- L12 (ja) — ★カテノイドとヘリコイドは等長なのでガウス曲率 K が一致するが、それは 必要条件にすぎない —— K が一致しても極小とは限らないので、門は H に置く。 repo をそのまま clone した状態でも動くように、リポジトリ直下を import パスへ入れる。
- L130 (ja) — ★平行移動フレームの効き目: まっすぐな区間を含む曲線でも半径が崩れない
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 再合成。跳過這一步,投影器就會朝向相機背後,而 depth 會保持在「看似合理的量級」卻全部錯誤(第一次執行正是如此:RMSE 78 mm = 與零點無法區分)。
eyebrain.py
- L242 (ja) — ★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 張門圖 x 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 (ja) — ★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 (ja) — ★2026-10-11: 平面上の点の λ3 は丸め屑(λ3/λ1 ~ 1e-17)。軸に沿った平面では 厳密に 0 で落ちるが、傾けた平面では屑が正になり「特徴の無い平面」から キーポイントが 203 個出ていた(回転不変の主張が崩れる)。床は λ1 に対する相対量で。
flyvision.py
- L217 (ja) — ★ 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 (ja) — ★この族の既存 op(elliptic_fourier)は Kuhl-Giardina の実係数(a,b,c,d) # で、楕円 1 つ 1 つを表す。こちらは同じ輪郭を複素係数 c_k で見る —— # z(t) = Σ c_k exp(2πikt) と書けるので、各項が「回る腕」そのものになり、 # パーセバルで打ち切り誤差を描く前に予言できる。用途が違うので両方置く。 # ————————————————————————— #
- L396 (ja) — ★偶数点では添字 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 (ja) — ★しきい値は 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 (ja) — ★2026-09-14: ここは
FsTypeError だけを捕まえていた。逆さの区間と未知の feature を契約どおり FsValueError(= FS_E_INVALID_ARG)にした結果、 fscript の利用者には Python の生の例外が漏れるようになっていた —— 例外の種類を増やしたら、それを言語境界で受けている場所を必ず一掃する ([[feedback_same_bug_class_recurs_check_siblings]])。
fslib.py
- L559 (ja) — ★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 (ja) — ★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 (ja) — ★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 (ja) — ★契約 R-1(fullseye_abi.h): 失敗した演算子は「何も見つからなかった」演算子と 区別できなければならない。逆さの区間は呼び手の間違いであって、「空を寄こせ」 という正当な指定ではない —— 黙って空の Region を返すと、しきい値の計算を 間違えたレシピが「不良ゼロ」として通る。2026-09-14、同じ契約の Rust 実装が FS_E_INVALID_ARG を返すのにこちらは空を返す、という差分で見つかった。
- L780 (ja) — ★契約 R-1:
threshold で直したのと同じ欠陥が兄弟に残っていた。逆さの区間は 呼び手の間違いであって「空を寄こせ」という指定ではない —— 黙って 0 個を返すと、 面積の下限と上限を取り違えたレシピが「該当なし = 良品」として通る。 2026-09-14、Rust 実装が FS_E_INVALID_ARG を返すのにこちらは 0 個を返す差分で発見。
fsruntime.py
- L284 — ★判定 recipe 在每一種 profile(不限於工業)下都只能使用精選的、以 fslib 為後端的 builtin。其他任何呼叫都是透過
fscript._call_registry_op → api.RT 解析的 650-op 進化註冊表 op,其 _safe wrapper 是 fail-OPEN(吞掉 op 失敗並回傳無害的「無缺陷」值)。這個面絕不能作為 recipe 的算子——studio / 參考執行時也會判定部件——所以使用它的 recipe 在載入時被拒絕(docs/FSCRIPT_DECISION.md 1.6b)。
fullseye/__init__.py
- L468 (ja) — ★2026-10-02: 「名前の無い非公開関数」の棚卸しで、op として振る舞うのに公開経路が 1 本も無かった 18 本。 どれも既存の型つき台帳の約束(台帳 = 実装モジュールの集合)に合わないので、facade(fs.<名前>)から出す。 門は tests/test_hidden_ops_exposed_2026_10_02.py(定理か第 2 実装)。名前>
- L511 (ja) — ★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(...),沿第 1 軸拆開 (2,R,C),把 dy 的第 2 列當作 dx 使用,使偏移估計從 0.12 -> 0.74 像素(不拋例外)。用 .raw 可搆到原始回傳:fs.ledger.piv_cross_correlate.raw(a, b)。
- L1234 (ja) — ★字の検証・修正(glyph_*)。dir() でなく __all__ が一次情報なので ここに載せる —— dir は環境依存で、載せ忘れは全体スイートでしか出ない。
- L1321 (ja) — ★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 (ja) — ★
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 (ja) — ★2026-10-02: 区切り文字を “/” にそろえてから並べる。素の sorted() は Windows の “\“(0x5C)と Linux の “/”(0x2F)で順序が変わり、
segmentation/watershed/ と segmentation/watershed3d/ の 前後が入れ替わって OP_NOTES.json の鍵の順が OS ごとに違った(手元の regen は緑、CI の –check が赤)。
- L103 (ja) — ★frontmatter は閉じ線まで読む(2026-10-02): 先頭 1200 文字で切っていたら、examples: の行が 44 本に伸びた text_box の閉じ線が範囲の外に出て「op の無いノート」に見え、索引の op がノートから引けなくなった。
- L125 (ja) — ★5 層。最初は 4 層で組み、「索引にもレジストリにも facade にも無いノート」が 480 枚残った。残骸かと思ったら 480 / 480 が
fullseye.ledger で解決した (型付き台帳。レジストリでは tb_project、台帳では project のように接頭辞が 違う)。「無い」と言う前に全層を引く —— 4 層目まで引いて止めていたら、実在する 480 個の機能を残骸と呼んでいた。
- L311 (ja) — ★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 (ja) — ★同点の割り方は
api.find_op と同じにする: 別名を複数 op が共有するとき name == halcon の正典を先に。次に層が多い(実行もノートもある)方。 実測 2026-09-15: “gauss” で gauss_filter(正典)と gaussian が同点になり、 名前順だと _ < i で前者が先に来た —— 偶然そうなっていたのを規則にした。
fullseye/mcp/diagnose.py
- L87 (ja) — ★順序が答えを変える(2026-09-15 実測):
ones + inf は有限部の std が 0 なので 「定数」が先に当たり、0..715 の配列は 99.9 % が ≥ 1 なので「飽和」が先に当たった。 より根本的な異常を先に言う: 非有限 → 定数 → 範囲外 → 飽和 → 平坦。
- L109 (ja) — ★飽和・平坦は image / color だけ。region は 0/1 が契約なので「飽和」ではない —— リファクタで region を含めてしまい、
--demo で otsu の出力が「飽和」と判定されて 小図が昇格した(2026-09-15 実測)。region の定数(空 / 全面)は上で拾う。
fullseye/mcp/handles.py
- L51 (ja) — ★thumb_dir を渡されたときに作っていなかった(mkdtemp のときだけ存在する)。 小図の保存が FileNotFoundError で落ち、テスト 4 件で発覚(2026-09-15)。
- L156 (ja) — ★2026-10-11: 根の中の壊れた png・object 配列の npy は ValueError 等を HandleError に 写さず投げ、dispatch を抜けてサーバのループが死んでいた。読めない中身は理由つきで断る (-32602)。npy は pickle を決して許さない。
fullseye/mcp/server.py
- L508 (ja) — ★2026-10-11: Content-Length が無い / 0 のフレームで None(= EOF)を返し、サーバが 黙って終了していた。EOF は「ヘッダを 1 行も読めない」ときだけで、壊れたフレームは FramingError(→ -32700)にしてループを続ける。
- L1357 (ja) — ★bbox が無いときは glyphops.make_spec に任せる。版面が取れなければ items に bbox が 入らない = 黙って外れた箱で直すことは起きない。ここでは理由を付けて断る。
- L1630 (ja) — ★2026-10-11: find_ops は「既知の種別以外は拒否する」と書きながら typo を受け、 0 件を返していた。search_ops と同じ門を通す。
- L1777 (ja) — ★2026-10-11: params が配列 / 文字列、name が配列 / dict のとき、.get や辞書引きの AttributeError / TypeError が run_stdio_server のループまで抜け、サーバが死んでいた (後続の正しい要求にも返事が無い)。型は境界で検査して -32602、残りは最後の網で -32603。
- L1824 (ja) — ★2026-09-20(GenSpark 第 38 報 N135): 「2390 names」が op 数と読まれた —— 数えているのは op 名 + HALCON 別名。
fullseye/xlsxio.py
- L46 (ja) — ★ float64 に直してから [0,1] に clip すると uint8 の 0..255 が 0/1 の 2 値に潰れた
- L51 (ja) — ★ 切り捨ての int() だと 1000 px が step 3 で 334 px になり longest を守らない
- L68 (ja) — dict の表は key / value の 2 列(mdio と同じ)。★ list(dict) はキー文字列の 列になり、1 文字ずつのセルに綴られていた
fullseye_comm.py
- L393 (ja) — ★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 (ja) — ★表は 1 つに畳む —— 同じ PDU 処理を RTU の装置役 (:class:
ModbusRtuLoopback)でも使う。2 つ書くと、FC を足した ときに片方だけ増える。
- L751 (ja) — ★
modbus-rtu は 2026-09-25 まで「名簿に載るだけ」の行で、開こうとすると 「pymodbus を入れて直接使え」と断っていた。だが RTU は Modbus TCP と同じ PDU を別の框で包んだものにすぎず、その PDU の組み立てと解釈は既にここに在って 単体試験も付いていた。足りなかったのは框(アドレス + CRC)と線の口だけで、 断り続ける理由は無かった —— 名簿は「持っていないもの」だけでなく、 「持っているのに繋いでいないもの」も隠す。
- L764 (ja) — ★断り文句が「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 (ja) — ★もう 1 つ: 相手が入っているときに「install しろ」と言っていた。入って いるのに入れろと言う案内は、読んだ人をそこで止める。
- L817 (ja) — ★同梱の顔ぶれをここで凍らせる(名簿を全部登録し終えた後)。これより前に 呼ぶと空を覚えてしまい、
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 (ja) — ★2026-10-07 レビュー修正: 小角線形化 R ← (I+[ω]×)R は原点まわりの回転なので、原点から 遠い点群(オフセット 1e3 で回転誤差 20°)では回転と並進がほぼ縮退して誤った姿勢に落ちた。 target の外接箱の中心 c へ両点群を寄せて解き、t = t’ + c − R·c で世界へ戻す (外接箱の中心は点の順に依らない = reproducible=True のビット一致を保つ)。
glassmirror.py
- L44 (ja) — ★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 (ja) — 多重反射の和は偏光ごとに取ってから平均する。★ 以前は Rs と Rp を先に平均して 1 本の R で和を取っていたので、斜め入射で透過率を過小評価した(air→1.5、 60° で 0.836 対 正しい 0.848)。垂直入射では Rs = Rp なので値は変わらない。
glyphops.py
- L44 (ja) — ★2026-09-18: ここまで all に無かった(api 側は名前で import していたので 気づけなかった)。一次情報は all なので、公開するものは全部書く。
- L308 (ja) — ★リングの内径は字のにじみの外に置く。にじみ(アンチエイリアスやぼけ)の 中を背景として数えると、地色と文字色の中間が混ざって多峰に見える —— 実測で、ぼけ σ=1.2 の合成看板が背景の集中度 0.52〜0.60 になり、 平坦な単色の地なのに「置換できない」と断った。内径は呼び出し側が
edge_transition_width から決められる。
- L324 (ja) — ★「同じ量子化ビンに入った割合」で集中度を測ってはいけない —— 実写では 最頻色がビンの境目にまたがって割合が半分になり、平坦な看板の地色まで 多峰と判定した(実測で前景の占有率 0.31〜0.64、閾値 0.5 では全滅)。 最頻色からの距離が許容幅に入る割合で測る。同じ実写で 0.87〜1.00、 合成した赤い縁取りでは 0.63 と、はっきり分かれる。
- L342 (ja) — ★縁取りは最頻色の占有率では捕まらない —— 縁が太ければ字のすぐ外は「縁の色一色」で 立派に単峰になる(実測で赤い縁取りを単峰と 判定した)。近いリングと遠いリングの色が 違うかで見る。違えば背景は 1 色では書けない。
- L456 (ja) — ★消す範囲もにじみの幅から決める。2 値マスクは字の芯しか覆わないので、 固定の 1 画素だけ広げて塗ると、旧字の灰色の縁が幽霊として残る (実測: 置換した字の周りに旧字の輪郭がうっすら見えた)。
- L462 (ja) — ★平均色で塗るだけでは継ぎ目が見える。地にはノイズと量子化のざらつきが あり、塗った面だけが滑らかだと矩形が浮く(実測: 置換した字の周りに はっきりした四角が出た)。地のばらつきも測って合わせる。
- L475 (ja) — ★触る必要のある画素だけに限る。塗った面の外は入力のまま残す —— でないと、消去した矩形の縁が地のざらつきと食い違って四角い継ぎ目が 見える(実測: 置換した字の周りにはっきりした枠が出た)。 境目は少しぼかして、切り替わりを見えなくする。
- L501 (ja) — ★極性は多数決で決めてはいけない。行に密着した帯では字が 57 % を占める ことがあり(実測 2026-09-17、合成の掲示の 1 行目)、「インクは少数派」と すると白黒が丸ごと反転して距離が 0.025 -> 0.121 に跳ねた。 外周は背景という事実で決める —— 字は縁まで届かない。
- L836 (ja) — ★大きさは行で 1 つに揃える。マスごとに元の字のインク幅へ合わせると、壊れた字の 広い/狭いをそのまま引き継いで字の大きさがばらつく(2026-09-18、縦書きの試作で ユーザー指摘)。CJK は正方なので、一辺 = min(行のインク高さ, マス幅の中央値)。
- L1031 (ja) — ★マスを少し広げて切り出し、その中で「このマスに属する成分」だけを マスクにする。マスちょうどで切ると、外周リングが隣の字のインクを 拾って「色が多峰」と誤判定し、直せるものまで断ってしまう (実測 2026-09-17: 壊れた 4 字のうち 3 字がこれで断られた)。 また隣の字のはみ出しが消し残り、置換後に旧字の切れ端が浮く。
- L1036 (ja) — ★上下左右に余白を付けて切り出し、その中で「このマスに属する成分」だけを マスクにする。bbox ちょうどで切ると、背景色を測る外周リングが 隣の字のインクと字の縁を拾い、「色が多峰」と誤判定して 直せるものまで断る(実測 2026-09-17: 壊れた 4 字のうち 3 字が これで断られ、背景色の占有率が 0.49〜0.57 に落ちていた)。 余白は画像そのものから取る —— 行の bbox は字に密着しているので、 bbox の中だけでは純粋な背景が手に入らない。
- L1101 (ja) — ★色が多峰(縁取り・影)で断ったマスがあると、インクのマスクに縁まで入って距離が 膨らむ(実測: 5 px の縁取りで無事な 4 字が全部「床の 2.5 倍」に出て unrelated に 化けた)。測れていない距離で誤字/別物を言わない。
- L1148 (ja) — ★2026-09-18: ここを「大津 + 外周で極性」に替えて退行した(既存 12 枚で 見逃し 0 -> 6、誤検出 4/14 -> 9/22)。出荷済み
_ink_mask と同じ規則でも、 1 マスに当てるのと画像全体に当てるのでは別物 —— 全体の大津は壁や板の 明暗で閾値が動き、字の縁を取り込む。固定の暗さ閾値に戻す。白字の看板は この経路では取れない(既知の穴として記録)。
- L1164 (ja) — ★枠 = 中身が薄く、大きく、他の成分(字)の外接箱よりずっと大きい成分。3 つ目の 条件は 2026-09-18 に足した: 無いと、小さな画像(280x432)で 96 px の「中」(外接箱 9216 px > 画像の 2 %、中身 0.3)が枠と見なされ、行が丸ごと消えた。PoC を育てた 1,000 px 級の画像では字が 2 % を超えないので見えなかった尺度依存。「画像の半分以上に 渡る」で切ると生成ポスター 10 枚で誤検出 5/8 → 7/8 に退行した(半分に届かない枠の 切れ端が残る)ので、字の大きさ(成分の外接箱の中央値)を物差しにする。
- L1180 (ja) — 行は水平投影の帯で取る。★成分をまとめる方法は使えない —— 漢字は部品に 分かれて出る(
電 は 3 つ)ので、重なりや中心距離で束ねると行間の狭い 看板で 2 行が 1 行に融け、逆に離れた部品が 3 行目になった(実測 6/12 枚)。
graphinv.py
- L793 (ja) — ★2026-10-07: kmax = 0 の個体(辺 0 本など)は「0-core = 全員」を最内殻にして全ノードを数えていた (三角形 2 個体 + 空 1 個体で appearances [3,3,3,1,1])。殻が無い個体は誰も含まない。
halcon_coverage.py
- L93 (ja) — ★2026-10-06: 正本は同梱の fullseye/data/(c5268029e で移した)。旧来の data/ だけを見ていたため、 facade の 600 本が黙って数えから落ち、HALCON 対応が 982 → 388 と出ていた(例外も警告も無し)。
honest_summary.py
- L34 (ja) — ★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 (ja) — ★周りの円は互いに重ならないように置く。n 個を半径 rs の環に並べるとき、 隣どうしの中心間距離は 2rssin(pi/n) なので rs > rr / sin(pi/n) が要る。 最初これを守らずに (rs=62, rr=46, n=6) と置いたら、周りの円が融合して 花のような 1 つの塊になった —— エビングハウス錯視になっていない。
imgevolve.py
- L48 (ja) — ★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 的一級 module,因此 import 失敗意味著「損壞的 checkout」,而非「該環境沒有的功能」。以前是 except Exception: pass,又因為這個函數同時兼任生成器和檢查器,CI 可以在保持綠色的情況下發布一個整整消失了 17 個 op 的索引。
- L81 (ja) — ★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 (ja) — ★2026-09-20(GenSpark 第 37 報 N131): 台帳 op(
color_lut)と汎用アルゴリズム(quicksort)は索引に 載っているのに has が「unknown」と答えていた —— 発見面(索引)と判定面(registry + nary)が別だった。 索引(同梱複製)の台帳行と algo 層をここで引く。
- L356 (ja) — ★os.path.basename は実行 OS の区切りしか知らない —— Linux では
C:\\...\\fullseye.exe が丸ごと 1 要素になり 「fullseye で始まらない」と判定された(手元 Windows 緑・CI Linux 赤)。両方の区切りで最後の要素を取る。
- L363 (ja) — ★parity.main() は自分で sys.argv を読む —— サブコマンド名 “parity” が残っていると 「unrecognized arguments: parity」で落ちていた(GenSpark 第 6 報 N6)。accel / bench と同じく argv を差し替える。
- L401 (ja) — ★2026-10-18(外部レビュー 0.6.0 N228 の再現で見つけた): color 層は OpenCV が要る(extra
opencv)。 素の pip install fullseye では空が正しいのに、ここが無条件に assert していたので fullseye index が AssertionError で落ちていた。黙って空になるのを止めたいのは OpenCV が在るときだけ。
- L463 (ja) — ★2026-10-18(外部レビュー 0.6.0 N228): checkout の判定が「HERE に docs/ が在るか」だけだった。wheel の HERE は site-packages そのものなので、別のパッケージが site-packages/docs/ を置いていると、そこへ OP_INDEX.json を書きに行く(読み取り専用の環境では落ちる)。checkout にしか無い正本の組で判定する。
- L546 (ja) — ★2026-09-20(GenSpark 第 53 報 N187、再現): –seq 無しは空列を「ソートして」[] を印字し rc 0 だった。
- L655 (ja) — ★help の実行例(2026-09-19、GenSpark 第 6 報 N9 / K2): 配布物では console_script
fullseye が入口で、 py -3.11 imgevolve.py は checkout 専用の綴り。呼ばれ方に合わせて例文を書き換える。
- L665 (ja) — ★2026-10-18(外部レビュー 0.6.0 N217):
fullseye algo list に倣って fullseye ops list と打つと rc=2(unrecognized arguments)だった。list は既定の動作と同じなので、語として受けて同じものを出す。
imgforensics.py
- L192 (ja) — ★ complex は ComplexWarning だけで虚部を捨て、実部のハッシュを返していた。 文字列・object も同じく受け取らない
- L706 (ja) — ★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 — ★判定有兩個(2026-09-08,當天內已修正)。最初只用「CIE L* 的折返為 0 次」來選,但
poc_colormap_readability 實測到 cividis 折返 0 次卻立起了色差的脊。即便明度單調,若色差步進不均勻,平滑的場中也會看見不存在的分界 – 它以片面的基準自稱「安全」。實測(512 級,相鄰色差的 max / median,以及超過中位數 1.6 倍的局部最大的個數): ========== ========== ============== ========== 映射 / L* 折返 / dE 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 的基準(實測 dE max/median 2.23)。增加控制點即可同時進入兩者 – 由於手抄一手資料的數值有筆誤的前科,故在能核實出處前暫緩。
- L712 (ja) — ★2026-10-18(外部レビュー 0.6.0 N209): 順は save(path, arr)。逆に呼ぶと「path must be … got ndarray」で 止まってはいたが、逆順だとは言わなかった。配列が path に、文字列が arr に来たら、それを言う。
-
| L721 (ja) — ★2026-09-20(GenSpark 第 34 報 N120): PFM は float 専用の形式なのに、既定の 8 bit 経路が 0..255 の 値を float32 として書き、読むと 0..1 に clip されて別画像になっていた(往復 max |
Δ |
0.98)。 PFM の既定は float(無損失)。 |
- L915 (ja) — ★2026-09-20(GenSpark 第 18 報 N78): 無い・ディレクトリ・読めない、が全部同じ文だった。
imgmetrics.py
- L151 (ja) — ★2026-09-20(GenSpark 第 23 報 N92): 配列なしで呼ぶと空集合の pop(KeyError)/ 0-d の float() (TypeError)という内部の文が出ていた。
- L163 (ja) — ★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 (ja) — ★ 範囲外は黙って clip せず拒否する(cos=5 が垂直入射、cos=-0.5 が全反射に化けていた)。 丸めの屑(1 + 1e-15 など)だけは許す。
- L349 — ★真實光柵會向兩側繞射(若溝槽對稱,+/-m 的效率幾乎相同)。此處若不把 +/- 兩側都放進去,則視光源與視線的位置關係,解可能全為負,「只保留正 lambda」的濾波器就會全部丟棄而漆黑一片。實測:與溝槽正交照射的 CD(delta-sin = -0.55),m=+1,+2 在 lambda<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 (ja) — ★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 (ja) — ★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,卻把 torch 設為必需。在不裝 torch 的 CI(py3.10 / 3.12)上,4 個 PoC 以
ImportError: this operator needs the optional 'torch' backend 落敗而暴露(本地有 torch 所以沒能察覺 – 「門要立在事故發生的地方」的實例)。數值是相同的 float64 式,因此結果不因環境而變。回傳型別為相容而保留:有 torch 則 torch.Tensor,沒有則 numpy.ndarray(數值相同)。若請求 “cpu” 以外的 device 則 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 (ja) — ★2026-10-07 レビュー修正: 小角線形化 R ≈ I+[ω]× は「原点まわり」の回転。原点から遠い 点群(UTM 座標など、オフセット 1e3 で回転誤差 23°)ではてこの腕 p が巨大になり、 回転と並進の自由度がほぼ縮退して Gauss-Newton が誤った姿勢へ収束していた。 dst の外接箱の中心 c へ両点群を寄せてから解き、最後に t = t’ + c − R·c で戻す。 外接箱の中心は点の順に依らない(reproducible=True のビット一致を保つ)。
-
| L2915 (ja) — ★2026-10-07 レビュー修正: 未中心化の |
p |
² は原点から遠い点群(オフセット 1e6)で桁落ちし 半径が 7.5e5 も狂った。重心へ寄せて解き、中心を戻す(数学的には同じ解)。 |
- L3069 — ★2026-09-07:若環在影像之外則 fail-closed。
r_in/r_out 以像素為單位,故若按 mm 傳入,會讀到視野之外,並無例外地回傳全部 0(在 poc_pipe_wall_loss 輸出一張漆黑的圖後暴露)。若沒有一個半徑小於從中心到影像四角的最大距離,則回傳值只可能為空。
- 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 (ja) — ★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 (ja) — ★X 線の列の op 4 本の台帳は
opstomography の spectral_xray(dualxray と同じ族)。materials.__all__ は opsoptics の matprop 台帳と 1 対 1(tests/test_materials.py)なので、ここには足さない —— 足すと matprop の登録と食い違い、統合で他の作業(電子線の列)と同じ行を取り合う。
- L1146 (ja) — ★引き先は「NIST の化合物の表の名前」か「化学式」だけ。化学式を名前として引き直すと、化学式と 同じ名前のレコード(BI4GE3O12、CDWO4)が自分自身に戻って無限に再帰する(2026-10-23 に実際に踏んだ)。
mathestimation.py
- L90 (ja) — ★床(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 (ja) — ★2026-10-07: ±inf は欠測(NaN)と区別する。以前は黙って欠測扱いで更新を飛ばしていた。
- L365 (ja) — ★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 (ja) — ★最初は発散を np.gradient(中心差分)で取り、Poisson を 5 点 Laplacian で解いていた —— 2 つが互いの随伴でなく、 縁で発散の総和も釣り合わず、隅で距離が真値の 0.52 倍に縮んだ(2026-10-03)。同じ G から両方を作ると Poisson は「勾配が X に最も近い φ」の最小二乗そのものになり、縁(断熱)でも無矛盾になる。
- L251 (ja) — ★熱の段は直接法で解く: u は距離とともに e^{−r/h} で 1e-30 まで落ち、遠くの勾配の「向き」はその極小値の 相対精度に乗っている。CG は絶対誤差 ~1e-12 で止まり、極小値を塗りつぶして遠くの向きを壊した (3-D で誤差 0.045 → 0.279、2026-10-03)。定数のずれが無害な Poisson の段だけ CG にする。
- L307 (ja) — ★2026-10-07: 面に使われない頂点が 1 個あると M と L にその行が 0 で入り、熱の段が特異 → 全頂点 NaN (513 頂点で例外なし)。始点と繋がらない成分は φ が任意の定数(実測 0.755)で有限に見えた。 始点を含む連結成分だけで解き、残り(未使用・非連結)は inf にする(geodesic_heat_grid と同じ約束)。
- L356 (ja) — ★2026-10-07: 始点が別々の成分にあると φ の定数は成分ごとに任意 → 成分ごとに始点で 0 に合わせる
mathnumerics.py
- L258 (ja) — ★2026-10-07: 重みを差の直接の積で作ると、Chebyshev 1200 点や区間 [0, 1e-4] で 積が 0 / inf に飛び全点 NaN になっていた。重みは共通の定数倍を除いて決まるので、 対数で和を取り最大で正規化してから exp する(符号は別に数える)。
- L425 (ja) — ★2026-10-11(台帳契約の門): 係数表でない table({pre, post} など)を渡すと生の KeyError: ‘coeffs’ が漏れていた。何が足りないかを名指しして拒否する(fail-closed)。
- L441 (ja) — ★2026-10-07: list も格子扱いしていたので、d 点 x d 次元の点列 [[x, y], [x, y]] が ndarray なら点ごと、list なら外積格子と、同じ数値で答えが変わっていた。格子は tuple のみ (文書の呼び方
(gx, gy) は tuple)、list は ndarray と同じく点 (M, d) として読む。
mathops.py
- L114 (ja) — 定理が門になる図(2026-09-23)。★
MATHOPS(台帳が読む一覧)と __all__ (import * の公開面)は別物で、両方に書かないと片方だけ通る。
- L1734 (ja) — ★既存の cplx_* は閉曲線を点列で持つ層(積分・巻き数・ローラン・等角写像)。# ここで足すのは領域の層 —— 値の場・位相彩色・ニュートンの吸引域・ # 脱出時間・翼まわりのポテンシャル流。新しい語は 1 つも作らない # (cimage / rgbimage / labels2d / mask / roots / signal はすべて既存)。 # 真値は「使った式」ではなく、偏角の原理・Cayley の定理・主カージオイドの # 閉形式内部判定・c=0 のジュリア集合(単位円板)・そして既存 op である # cplx_winding_number / cplx_cr_residual / cplx_joukowski / poly_roots。 # ————————————————————————— #
- L2206 (ja) — ★もう一方の臨界点 -b は円の内側になければならない。外に出ると dz/dzeta = 0 が流れの領域に現れ、そこで速度が発散する(翼でなく尖りが 2 つある図形になる)。
-
| L2319 (ja) — ★どれも「きれいな図」だが、採ったのはきれいだからではなく、 正しさを定理が言えるからである。数学の図はきれいなので、合って いるかを誰も確かめない —— だから絵の外に真値を置く: 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 (ja) — ★四つ組の最後が「直前に生まれた円」。それを落とす反射は親をもう一度 作るので、種の四つ組だけ 4 方向、以降は 3 方向に進む。ここを間違えると depth 3 で 56 個のはずが 88 個になった(実測。一意な円は 56 のままなので、 絵は正しく見えるが同じ円を何度も描き、以降の段が指数的に太る)。
- L2773 (ja) — ★2026-10-07: 縮小しない写像(r >= 1)を黙って通すと二分法が上端 8.0 に張り付き (r=1.2 の 2 枚で 7.99999…)、恒等写像 1 枚では 0 を返していた。Moran の式は 全写像が縮小(r < 1)のときだけ意味を持つので、ここで明示的に拒否する。
- L2782 (ja) — ★2026-10-07: 写像の数が多いと解が 8 を超えうる —— 上端を広げてから二分する。
- L2850 (ja) — ★ムーア曲線 = ヒルベルト曲線 4 本を輪に閉じたもの。四分割の向きと進む方向は 総当たり(8 対称 x 反転、4096 通り)で「継ぎ目 3 か所と折り返しが全部距離 1」を 満たす 32 解を出し、その 1 つを固定した。手で置くと隣接条件が静かに壊れる (最初の実装は隣接 False・閉 False のまま、絵としては正しく見えていた)。
- L2956 (ja) — ★クラドニ図形は「板」ではなく膜の解である。よく見る coscos - coscos は ヘルムホルツ方程式 + ノイマン境界の膜のモードで、実際のクラドニ板は 重調和方程式に従う別物。砂が節線に集まる絵は同じでも周波数比は合わない。 ここでは膜と明記し、膜の真値(閉形式の固有値・ベッセル零点)だけで採点する。 干渉と回折の真値は既存 op(grating_wavelengths / fraunhofer_pattern)。 ————————————————————————- #
- L3046 (ja) — ★2026-10-07: 矩形は [0,1] x 0,aspect。以前は y を [0,1] で取りつつ n pi y/aspect を 使っていたので、aspect != 1 で y=1 の辺が境界条件(Dirichlet なら 0)を破っていた。
- L3054 (ja) — ★2026-10-07: Dirichlet(sin x sin)は m=0 か n=0 で恒等的に 0 —— 全ゼロの場を 「固有モード」として返していた。拒否する。
- L3059 (ja) — ★2026-10-07: 組合せ (m,n)-(n,m) の 2 項は aspect != 1 だと固有値が pi2 (m2 + n2/a2) と pi2 (n2 + m2/a2) で異なり、和は固有モードでない。
- L3128 (ja) — ★2026-10-07: 以前は「集めた数が c+8 を超えたら止める」で、低い次数(m=0..2)の 高い零点ばかり集めて m>=3 の低い固有値(j’{3,1}**2 = 17.65 …)を落としていた。 j’{m,1} は m について単調増加なので、次の次数の最初の零点が、集めた中の c 番目を 超えた時点で打ち切れば取りこぼしは無い。
- L3327 (ja) — ★真値は公表値か閉形式だけ: 線形系は expm(At)x0 が厳密解で刻み半分に すると誤差が 1/16(4 次)、Lorenz のリアプノフ指数の和はトレース恒等式 により厳密に -(sigma+1+beta)、ロジスティック写像の周期倍分岐は 3 と 1+sqrt6、 相関次元は円 1・カントール log2/log3。絵では何も確かめられない。
- L3331 (ja) — ★関数(callable)を引数に取らない —— 型付き台帳は入力を sort で登録し、 連鎖ファザーがデータから引数を組むので callable は載らない。系は族名か係数配列。 ————————————————————————- #
- L3515 (ja) — ★
table は列名 -> 1-D 配列。状態を (S, n) のまま 1 列に入れると型の嘘に なるので、成分ごとの列に開く(x0, x1, … と時刻 t)。
- L3860 (ja) — ★上限は 60 パーセンタイルにしていたが、有界な集合では大きい r で C(r) が 飽和して傾きが下がる(充填した正方形で 1.83、真値 2.0)。飽和の 手前に寄せる。下限は近傍の離散化(雑音の床)を避ける。
measuring1d.py
- L375 (ja) — ★空の表は名指しで拒否する(2026-10-12 の空入力の方針 A)。空 list を空 list で返すと、 測定が 1 件も取れなかったことが mm 換算の後ろで見えなくなる。
- L624 (ja) — ★ここを「もう片端が次数 3 以上」と書いていた最初の版は、実測で 一度も発火しなかった: ヒゲの根元が枝の端点クラスタと 26 近傍で 融合して次数 2 になる配置が普通にあり、その場合に素通りしていた (「刈った」と報告しながら 0 本という、いちばん静かな失敗)。
mesh.py
- L410 (ja) — ★ 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 (ja) — ★ 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 (ja) — 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 (ja) — ★2026-10-07 レビュー修正: md=None(軸方向は無制限)で球の半径を r にしていたため、 実際は「半径 r の球」で切り取っていた(面が法線方向に r 以上動くと両側が揃わず nan)。 無制限の円筒は球で絞れないので、全点を候補にして軸・半径で判定する。
motionio.py
- L137 (ja) — ★ 値域(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 x 寬 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 (ja) — ★窓の端で振幅が下り坂のところは、0 で埋めた外側との段差が「極大」に見える → 元の振幅で極大のものだけ
op_probe.py
- L42 (ja) — ★2026-09-17:
feature を足した。戻りの橋 feature_to_img が入るまで、 2-D 台帳に feature を入力に取る op が 1 本も無かったので代表値も要らな かった。門(knob_liveness / probe_ledger / op_contracts)は 3 本とも 「測れない op が居る」と正しく落ちてこの穴を教えた。
opassist.py
- L56 (ja) — ★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 個、向量還是矩陣)在同一個欄位裡相互競爭。從 UI 看,「int 的 3 向量」無法表達,而唯獨矩陣的結構位於 seq 鍵之下,處理各不相同。將此處正交化,kind 只放值類型,容器一律放入 container。純量也不作例外({"form": "scalar", "shape": ()}),因此 UI 可以把分支寫成一條。
- L452 — ★最長匹配。若按從短到長看,
sigma_per_mm 會命中 _mm 而變成 “mm”(實際是 1/mm)。單位一錯,UI 的數字就會悄悄變成別的東西。
- L535 (ja) — ★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 矩陣)… 只看預設值就會看成「一個數值」,UI 便只出一個 spin box 而崩潰。用名字補足結構。
- L782 (ja) — ★一様乱数の行列にしない —— 成分・モジュラリティ・rich club は構造が無いと 「どのノブでも同じ数」になり、押して動いても意味のある絵にならない。
- L786 (ja) — llmcore(2026-09-24): ★一様乱数にしない —— どの行も似た向きになり、 注意の重みが全行ほぼ一様になって「押しても何も起きない」種になる。 滑らかな画像を 8x8 パッチに切ると、近い場所が近い向きを向く。
- L802 — ★實測發現:向
prism_min_deviation_deg 的波長輸入傳入 0..1 的通用 signal,會被「波長須為正值」拒絕,變成一個範例跑不動的 op。若已知單位,以該量的合理範圍作種,更接近「一按就動」。
- L995 — 日文(CJK)的連綴。★
_WORD_RE 為 [a-z0-9]+,因此日語查詢一個詞都取不到(對日語輸入而言 _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) 能被拾取,而上述兩組不會。
- L1058 — 公共前綴之後允許的詞尾。★僅憑前綴長度判定會把 “median”/”medial” 連起來(共有 5 個字元的 “media”)。看詞尾是否像屈折詞尾,則 “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 (ja) — ★欧文の段(2026-10-15): 欧文のクエリは 1 行目の doc までしか見ておらず、引数の説明にだけ 出る語が 0 件だった —— “orthometric”(標高)は dem_height_frame_convert の frm / to にしか 書かれておらず、op_find(“ortho”) は名前に ortho を含む doe_orthogonal_array(直交表)しか 返さなかった。docstring 全文の部分一致を、どの段より低い点(12)で最後に拾う。
- L1335 (ja) — ★2026-09-19(GenSpark N2):
fullseye.apply([x, y], "add_image") で動くのに、 op_names() にも op_find() にも載っていなかった(op_names は 1 入力のレジストリだけ、 op_find は台帳 + レジストリだけを見ていた)。呼べるものは探せなければならない。
- L1364 (ja) — ★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 (ja) — ★2026-09-20: 何で当たったかを
match に(exact = 名前の完全一致 / name = 名前の部分一致 / stem = 語幹 /
- L1463 (ja) — ★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 (ja) — ★2026-09-20(GenSpark 第 20 報 N87): 種を作れない型(mesh / lab / matrix …)は None のまま 関数に渡り、IndexError / AttributeError / AxisError が利用者に届いていた(11 op)。 呼ばずに、どの入力を渡せばよいかを言う。
- L1496 (ja) — ★2026-09-20(N71): データ引数が署名の先頭に無い op(write_wav(path, x))は名前で渡す —— 位置で渡すと 配列が path に入る。データ引数の名前は param_spec が知っている。
- L1506 (ja) — ★2026-09-20(GenSpark 第 34 報 N122、再現): 入力を一部だけ渡すと(blend_mode(base) で top 無し)Python の生の 「missing 1 required positional argument」が届いていた。0 個のときは上で種を作って言うのに、1 個以上のときは 検査が無かった。必須のデータ引数が位置でも名前でも来ていなければ、期待する形を 1 文で言う。
- L1524 (ja) — ★2026-09-20(N87): 自動の数値サンプル(1.0)が座標や行列を要する引数に合わないと、op の中の IndexError がそのまま利用者に届いていた(scene_box の center_mm 等)。自動値が原因なら言う。
ops.py
- L339 (ja) — ★勾配は片側差分の大きい方で取る。
np.gradient の中心差分は 1 画素で 立ち上がる段差を 2 画素に広げてしまい(段差の頂点で 0.5 しか出ない)、 理想の段差が幅 2.00 と報告される —— 測る道具が理想ケースで 2 倍を返す。 片側差分なら段差で 1.0、傾斜 m の斜面でも m となり、どちらも正しい。
- L637 (ja) — ★相対床だけでは足りない: 一様面 + 丸め屑では値域そのものが屑なので、 相対床も屑まで下がってしまう。絶対床 1e-5(画像は [0,1] 契約)を併せる。
- L713 (ja) — ★一様な面では勾配が丸め屑しか残らず、
arctan2 はその屑の符号で任意の角度を 返す —— 明るさを 0.01 変えただけで向きが一斉に変わる。絶対値の床では画像の 明るさに依存してしまうので、必ず相対量で切る。
- L817 (ja) — ★膨張は前景をはみ出す。連続の世界では半径 r の円は収まっているが、離散の 円板で膨らませると境界の外の画素まで塗る —— 実測で前景 197 画素の円に 対し外へ 48 画素(24%)漏れ、そのせいで粒度分布の生存率が 1.0 を超えた。 太さは前景の量なので、必ず前景で切る。
- L1010 (ja) — ★各画素には「入った時点で属していた山」の persistence を入れる。 ここで find(i)(= 最終的な根)を引くと、全画素が最後に残った 1 つの山の値に なってしまう —— 実測で高さ 1.0 / 0.6 / 0.3 の 3 つの山が全部 1.000 になった。
- L1017 (ja) — ★画像の最小値そのものの台地(たいていは背景)は 0 にする。そこは最後に 処理されて全体最大の山に吸収されるので、放っておくと背景一面が最大値に なって地図が読めない(実測で背景が 1.000 になった)。閾値を新たに選ぶのでは なく「最小値ちょうど」だけを落とすので、閾値フリーの性質は保たれる。
- L1109 (ja) — ★
m / n**2 ではなく (m + 0.5) / n**2。前者は値が {0, 1/4, 1/2, 3/4} と なって平均が 0.375 にしかならず、ディザ全体が暗い側へ偏る(1 ビットの傾斜で 平均が 0.031 ずれるのを実測した)。閾値は刻みの真ん中に並べる。
- L1298 (ja) — ★歴史的な挙動を
b <= 0.5 の帯に置く。これらの op の b は 2026-09-17 まで 「未使用」で、保存済みの進化プログラムが持つ b の値は事実上ばらばらに散って いる。新しい選択肢を上半分だけに割り当てれば、およそ半数の既存プログラムは 1 ビットも結果が変わらない(全域に割り当てると全部変わる)。 b <= 0.5 が旧実装とビット一致することは tests/test_knob_b_options.py が固定する。 ————————————————————————— #
- L1312 (ja) — ★境目は 0.5 を含めて歴史側に置く。0.5 は「まん中」として既定値に使われて いて(api.apply の既定、studio の中央、保存済みプログラムの初期値)、ここを 新しい側に入れると既定のまま呼んだだけで答えが変わる。実測で gaussian と その HALCON 別名の一致検査まで割れた。
- L1420 (ja) — ★しきい値は 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 (ja) — ★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 (ja) — ★pickle は名前で(2026-09-19 外部レビュー N5):
fn は backend_safe._safe のクロージャで pickle できず、Op を丸ごと multiprocessing / joblib に渡すと PicklingError で止まっていた(Pipeline は名前を持つので通る、という非対称)。 復元先は復元する側の環境の登録: backend が入っていない環境で戻すと KeyError(不足 extra の案内つき)になり、黙って別の実装にはならない。
- L2456 (ja) — ★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 (ja) — ★pyproject の optional-dependencies と食い違うと案内が嘘になるので
tests/test_usability_review_2026_09_19.py が突き合わせる。
- L2752 (ja) — ★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 上以相同輸入一件都未重現。原生建置不同,邊界的破壞方式也不同,所以「這類輸入就沒事」的精細劃線不可信 – 對退化輸入一律拒絕。不是「修好就刪」,而是在能確認上游已修復後再刪(這不是我們自己的程式碼,故刪除條件不同)。
ops1d.py
- L117 (ja) — ★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 才被執行,型別謂詞以 TYPEMISS「declared ‘image2d’ but returned ndarray(512,512,3)」將其暴露(在此之前,因把 (V,F) 拆成 2 個位置參數的形式,它一次都沒被執行過)。其餘 3 個 render_* op(ambient_occlusion / cast_shadow / supersample_mesh)如實測為 2-D,故保持 image2d 即可 – 撒謊的僅此一行。
- L460 (ja) — ★どれだけ細分しても次数 5 の頂点はちょうど 12 個。これは V - E + F = 2 の帰結であって実装の都合ではない(11 個でも 13 個でも 球にならない)。mesh_subdivide は任意メッシュの細分で、正多面体から の構成は持っていなかった。入力を取らない生成 op。
-
L466 (ja) — ★極小曲面と掃引(2026-09-23)。極小曲面は平均曲率 H が至るところ 0 の 曲面で、既存 vertex_curvature がまさにそれを測る —— 「これは極小曲面だ」 という主張を、作り方を知らない op が採点する。カテノイドとヘリコイドは 等長なのでガウス曲率 K が一致するが、それは必要条件にすぎない(門に するのは H)。実測 |
H |
中央値 0.0001 に対し、対照群の単位球 1.00004・ 半径 1 の円柱 0.50000。 |
- L476 (ja) — ★これは節面近似であって厳密な三重周期極小曲面ではない。残差は 隠さず docstring に書く(主曲率スケールの 1 % 程度)。
- L562 (ja) — ★新しい 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 (ja) — ★ 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 (ja) — ★新しい型の語は作らない。積層・A スキャン・C スキャンは kind の印つきの dict(table)で、 印の無い table は消費する 5 op がすべて ValueError で拒む —— 別の族の table を積層として 黙って読む経路が無い。
- L198 (ja) — ★A スキャンを素の signal にしない理由: 超音波で測る量は時刻(深さ = 往復時間)で、 素の 1-D 配列は時刻の原点(表面エコーの手前の窓の始まり)と rate を失う。上の rate の 注記と同じ「例外も NaN も無しに深さが狂う」経路になるので、t と rate を同じ dict に 入れて流通させる(dict の
rf を取り出して acoustics の op に渡すのは呼び手の明示的な行為)。
- L202 (ja) — ★C スキャンの RF の立方体(画素 × 時刻)は返さない: 返すのはゲートの中で読んだ像だけ (振幅・位相・同相・符号つき山・到達時刻)。立方体を image / volume として流せば 「時間の軸を空間の軸として」読む経路ができる(混ぜると黙って嘘をつく)。
- L205 (ja) — ★接合面の地図は既存の labels2d(整数ラベル = 積層の種類)。2 入力なので 2-D の橋は 架からず、1 入力の op の in はすべて table か無し(TYPE_TO_SORT に無い)。
opsastrostack.py
- L85 — ★ 作為替代,我們明確拒絕原始的 (N,H,W) ndarray。無論是 video (T,H,W) / voxel (D,H,W) / histcube (H,W,T) / zscan,3-D 陣列都能通過同一結構檢查,即使弄錯也不會拋異常,而是返回一個「看似合理卻錯誤的合成結果」——這與 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 是同一規約。混用會導致列與行互換(與本 repo 已知的陷阱同形:features.match_keypoints 返回 (x,y),而 fit_transform 要求 (row,col))。自稱 keypoints 至少能共享「圖像上的點」這一約定。 * indices —— lucky_select 返回的採用幀的索引(1-D int)。就是既有詞彙本身。[frames[i] for i in idx] 即可還原為 images。 * measurement —— noise_sigma 是單個實純量。 * 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,所以不是「發現為零」,而是「到達了但被正確拒絕」,但從鏈式 fuzzer 的角度看,align 系的 2 個 op 可能只淪為 CONTRACT。由於會出現與 photon 族分離 counts 的原因相同的症狀(7/17 從未被執行),若實測確實如此,那時將「含點像的圖像序列」另立一池的判斷才被正當化——不預先增加類型(在本 repo,順序是:只有在出現「混用會變成謊言」的證據之後才增加類型)。 |
opsconngraph.py
- L66 (ja) — 作る —— シナプス表から隣接行列へ、帰無モデル、二値化。★カテゴリ名は 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 持有種子的 dem 池,使全部 13 個 op 永久未被執行。與其假裝用類型防住了防不住的東西,不如用必需參數與 docstring 明示,並選擇在 fuzzer 中真正運行它。 * 只有 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 —— 內容是 float64,除 0.0/1.0 外還帶有缺測的 nan,不滿足 mask 謂詞(bool 或整數 dtype)。若設為 bool,則「非河道」與「本就無值」將無法區分,故讓類型遷就實作。 * 其餘全部為 image2d —— 坡度[度]、坡向[度]、曲率[1/m]、山體陰影[0,1]、起伏[m]、地平線仰角[度]、天空可視因子[0,1]、可視[0/1]。均為 2-D 的實數場,現有的 2-D op(平滑、閾值、morphology、偽彩色、圖注)可保持語義不變地使用。值域未必是 [0,1],但這與 astrostack 的合成結果處境相同:在本 repo,image2d 並非亮度的約定,而是「2-D 的實數場」的約定。類別 → [(op 名, module, [輸入類別], 輸出類別)]
opsflyvision.py
- L64 (ja) — ★ 重みは公開しない:
fly_hex_resample の個眼×画素の重み行列は functools.lru_cache で内部にだけ保持し、op の入出力型には現さない —— 出すと「画素座標系に依存する巨大な派生物」が型プールを汚し、下流の 2-D op が それを画像と取り違えて黙って処理してしまう(zscan を video に渡すと通る、と 同じ事故の型)。出さないことでこの取り違えを構造的に不可能にする。
opsgraph.py
- L35 (ja) — ★比べられる数字はヌルで割った比だけ。素の個数は規模で決まる。
- L44 (ja) — ★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 步長 5 的 12 個」,所以若 images 的種子不是 12 張,必然拋 ValueError。這是有意的 fail-closed(不返回索引與品質錯位的圖),故請在 fuzzer 側對齊張數。
- L246 — ★
watermark_* 的 bits 必須不超過容量(LL 的 8x8 塊數)。64x64 的 image2d + level 1 的 LL 為 32x32 = 16 塊。
opsinterferometry.py
- L96 — ★ 未搭載到既有
signal 上,是實測的結果。最初判斷「csi_signal_simulate ([] -> signal) 會把真正的干涉訊號注入池中,故可到達」,但用該配線跑鏈式 fuzzer 時,在 600 條鏈(300x長度6 + 300x長度8)中 csi_peak_position 與 chromatic_confocal_height 一次也沒有被執行(記錄僅有 7 條 CONTRACT)。原因是 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 (ja) — ★閉形式の内部判定。脱出時間の図に「ここは絶対に出ない」を重ねられる。
-
| L102 (ja) — ★定理が門になる図(2026-09-23)。数学の図はきれいなので、合っているかを 誰も確かめない —— ここに入れるのは絵の外に真値があるものだけ。 デカルトの円定理 / |
ps - qr |
= 1 / フィボナッチの斜列 / モランの式 / 4^n 点をちょうど 1 回ずつ。相棒の 3 本は「主張を数にする」側で、 これが無いと「それらしい絵」しか残らない。 |
- L108 (ja) — ★型は
pairs(N,2)。points は (N,3) の 3 次元点で、 最初そちらで登録して型契約の門に捕まった —— 名前が似ているので 取り違えやすい(門が無ければ「もっともらしく間違った」宣言が残った)。
- L123 (ja) — ★波動(2026-09-23)。クラドニ図形は「板」ではなく膜の解 —— 板は重調和 方程式に従う別物で、砂が節線に集まる絵は同じでも周波数比は合わない。膜と 明記して、膜の閉形式(矩形は pi^2(m^2/a^2 + n^2/b^2)、円はベッセルの零点) だけで採点する。干渉と回折の真値は既存 op(grating_wavelengths / fraunhofer_pattern)が独立に持っている。
- L140 (ja) — ★力学系(2026-09-23)。真値は公表値か閉形式だけ: 線形系は expm(At)x0 が 厳密解で刻み半分なら誤差 1/16(4 次)、Lorenz のリアプノフ指数の和は トレース恒等式で厳密に -(sigma+1+beta)、ロジスティックの周期倍分岐は 3 と 1+sqrt6、相関次元は円 1・カントール log2/log3。絵では何も確かめられない。
opsoptics.py
- L232 (ja) — ★真値が閉形式で外部参照が要らない: 恒等フィルタ → 180 度回転、 (i2πf)^n → n 階微分(ガウシアンの微分は閉じた式)、渦位相板の 巻き数が整数。fourier_plane_filter は入力を取らない生成器で、 four_f_filter が場と透過関数を受ける(cimage 2 つ)。
- L243 (ja) — ★ pupil_blur は「画像 × カーネル」の一般畳み込み(filters_freq.convol_fft) ではない —— PSF の標本間隔 λN/oversample を検出器ピッチへ面積積分して から畳む、その単位合わせが本体。だから PSF を作る側に置く。
- L304 — ★ 不是 normals(點雲的 (N,3) 法線),而是 normalmap。二者形狀相似,但傳入 (N,3) 會被 _normal_map 以 ValueError 拒絕。此處若宣告為 normals,便是「可以傳入點雲法線」的謊言,鏈式 fuzzer 每次都會以 CONTRACT 結束,從而一次也不執行此族(=化為發現為零)。
- L407 (ja) — ★trace_rays は登録しない: 台帳の trace_rays は optscene が持ち、正準名 lens_trace_rays は窓口(facade)の 別名として予約済み(opnames.FACADE_ALIASES)で、台帳に置くと test_op_names_phase1 の衝突の門が赤になる。 台帳からは ray_bundle / noncoaxial_trace で同じ追跡に届く。refractive_index は別の作業が中を直しているので この回は登録しない(既定の媒質が要る)。
- L538 (ja) — ★新しい型の語は作らない(位相も image2d、統計は table)。
- L539 (ja) — ★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 (ja) — ★材料は名前(別名可)かレコード dict で受ける。波長曲線はすべて pairs(λ [nm], 値)= 光源・QE・ ライトガイドの曲線と同じ形(像 = 光源 × 光学系 × 対象 × QE の波長積分へ渡す)。全部が引数だけで 描く側(画像を受けない)なので 2-D の橋は架けない(_OP_BRIDGE_SKIP)。
- L574 (ja) — ★曲線は materials と同じ pairs(λ [nm], 値)。像の明るさ = ∫ 光源 × 光学系・対象 × QE dλ を spectral_product で 1 本ずつ掛けて spectral_integral で積む。QE を掛ける前に energy_to_photons。 画像を受けないので 2-D の橋は架けない(_OP_BRIDGE_SKIP)。
- L597 (ja) — ★膜も基板も材料表(materials)の鍵で指定する。画像(分光の帯域画像)を受ける map も表を返すので 2-D の橋は架けない。
- L605 (ja) — ★レンズの処方(raytrace)と硝材の分散(materials)→ 波長ごとの焦点位置の較正表 → 戻りスペクトル → ピーク → 高さ・透明板の厚さ。観察対象(透明板・金属)の反射率も同じ材料表から。画像を受けないので 2-D の橋は架けない。
- L616 (ja) — ★画像を受ける op の in は image2d(橋の外)、引数だけの op は表 / 曲線を返す側なので 2-D の橋は架けない。
- L631 (ja) — ★fail-closed: 扱えない面の種類・座標変換面・r² の非球面項・別名でしか表に無い硝材は拒否、近似は allow_partial で明示したときだけ(結果に approximate=True)。画像を受けないので 2-D の橋は架けない(_OP_BRIDGE_SKIP)。
- L640 (ja) — ★fail-closed: 無い面・未知の欄・lens_system が拒否する値は ValueError。基の系は書き換えない。
- L648 (ja) — ★fail-closed: 矩形窓は参照の周期が整数のときだけ(そうでなければ拒否し、窓の宣言 hann を促す)、ナイキスト以上・1 周期未満は拒否。 法線の復元は影の無い画素だけ有効(他は NaN と valid = False)。雑音の模擬は種を明示。
- L661 (ja) — merit を再実装しない。★fail-closed: カタログに許容距離内の近傍が無いモデル硝材・無効な始点・未知の merit 欄は ValueError。
- L667 (ja) — lensopt の変数・LM をそのまま使い、硝材を変数にできる(離散の外側ループ)。★fail-closed: 未知のオペランド・足りない/余計な引数・ 範囲外の添字・有限でない値・重みが全部 0 の表は ValueError。
- L677 (ja) — 追跡の前に毎回解き直される(傍らの数値は解いた値)。★fail-closed: 未知の種類・循環したピックアップ・絞りを動かす厚みの解・ 軸上の主光線の解・根の無い F/# の解・collimate しない afocal は ValueError。
-
| L690 (ja) — ★fail-closed: 収束しない屈折は NaN と converged = False、表の外の波長・未知の水の種類・ |
g |
>= 1・n <= 1 は拒否。 波のスペクトルは Pierson-Moskowitz(1964)/ JONSWAP(1973)、水の吸収は Pope & Fry(1997)、散乱の位相関数は Petzold(1972)。 |
- L704 (ja) — Kolb, Mitchell & Hanrahan (1995)。幾何光学のみ(回折なし)。★fail-closed: 射出瞳が無限遠の系・非有限の入力・範囲外の波長/照明の表・ 軸対称でない系への点光源(前方追跡で回す)は ValueError。ケラレ/全反射の光線は NaN と vignetted = True で返す。
- L760 (ja) — ★fail-closed: 非有限の高さ・波頭より浅い底・下を向かない光・n <= 1・充填率の範囲外・定数画像・両クラスのない欠陥マスクは拒否。 濡れ面は Lekner & Dorf(1988)、水中画像は watermedia(Akkaynak & Treibitz 2018)、瓶は 2 次元の断面の光線追跡。
- L771 (ja) — ★格子の式 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 (ja) — ★LP モードは特性方程式の数値解(遮断 = Bessel の零点)。画像を受けないので 2-D の橋は架けない。
-
| L792 (ja) — ★縞はずれを M = p_m/ |
Δp |
倍(ウェハが動く)/ p_w/ |
Δp |
倍(マスクが動く)に拡大する。差動の 2 対で共通の誤差を消す。 |
- L803 (ja) — ★暗視野は縞の可視度の比(試料あり / なし)で、画素より小さい構造の小角散乱を測る。散乱角の広がりへは公表式で換算。
- L815 (ja) — 読み戻す。★新しい型の語は作らない: 図は印つきの dict(table)で、印の無い table は書き出しの op が ValueError で拒む。SVG / DXF は既存の text(文字列)、画像は rgbimage。
- L845 (ja) — 高さで変わる倍率・ケラレ・ぼけを実光線で。★光線は入射瞳でなく絞りを狙う(入射瞳が無限遠でも動く)。
- L864 (ja) — ★1 画素 4 枚 = 各画素で R・G・B(偽色が消える、解像はそのまま)/ 半画素 = 折り返しが消える(開口の MTF は上がらない)。
- L873 (ja) — ★新しい型の語は作らない。干渉スペクトル・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 (ja) — ★距離は周期 c/(2f) の剰余。高い f ほど細かいが折り返す / 多重反射・縁の混合・高調波・背景光で壊れる。
- L904 (ja) — 高 NA の複素像。★新しい型の語は作らない。像の組は kind=”fp_stack” の印つきの table、復元は kind=”fp_result” で、 fp_reconstruct は印の違う table を ValueError で拒む。撮像の入口は振幅と位相の image2d、装置の像の組は volume と 照明の方向余弦 2 本の signal。
- L933 (ja) — ★新しい型の語は作らない。曖昧な法線の集合(候補 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 (ja) — ★2-D の橋(tb_*)は架からない: 1 入力の op の in は image2d(sort image、_NEW_SORTS の外) か normalmap / polsweep / table(TYPE_TO_SORT に無い)。_OP_BRIDGE_SKIP 不要。
- L969 (ja) — ★新しい型の語は作らない。断面と輸送行列は kind の印つきの dict(table)で渡し、印の無い table は消費する 5 op がすべて ValueError で拒む —— 別の族の table を幾何として黙って 読む経路が無い。パターンと画像は既存の images(2-D 画像の list、fringe の位相シフトと同じ)。
- L972 (ja) — ★縞と ToF は 1 つの族(このカテゴリ)にまとめ、sort は分けない。物理は同じ「経路ごとの フェーザの和の偏角」で、op の入出力はどちらも名前つきの値の dict(table)—— 縞は bias [rad] と height_error、ToF は depth / bias [m] と鍵の名前も単位も違い、位置で 並んだ配列を取り違えて渡す経路が無い(混ぜても黙って嘘を返さない)ので語彙を増やす理由が無い。
- L976 (ja) — ★2-D の橋(tb_*)は架からない: 1 入力の op の in は table / images(TYPE_TO_SORT に無い)。
- L993 (ja) — ★新しい型の語は作らない。パッチの組・解・描画の結果は kind の印つきの dict(table)で、印の無い table は消費する op が ValueError で拒む。多角形は points((V, 3))、放射は signal((N,))。
- L995 (ja) — ★2-D の橋(tb_*)は架からない: 1 入力の op の in は table(TYPE_TO_SORT に無い)。
opsphoton.py
- L85 — ★ 需注意:由於 counts 是 1-D 的 float64 陣列本身,所以「呼叫」dsp / funct1d 毫無妨礙(類型詞彙是為鏈式 fuzzer 的 pool 分離,而非 Python 的可呼叫性)。反向橋 = 將 signal 非負化為 counts 的路徑,參見下方的「橋」註記。 * countrate —— SPAD 的計數率序列(Hz)(1-D,非負)。與 counts 同為「非負的 1-D」,但是不同的量,故另立一池。理由有兩點,都基於實測:(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)。此外,扁平的 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 也已實測確認:把 2-D 流傳給 reprconv.flow_magnitude 會拋 ValueError(點名以「取 (3, D, H, W)」拒絕),把 3-D 場景流傳給 piv_vorticity 會拋 ValueError。 * 輸入的圖像對是 image2d —— 粒子圖像本身就是 2-D 的實數場,現有的 2-D op(平滑、閾值、背景差、圖注)可保持語義不變地使用。不保證亮度落在 [0,1],但這與 astrostack 的合成結果處境相同。 * piv_outlier_mask 是 mask —— bool 的 2-D,與謂詞一致。與因帶 nan 而無法自稱 mask 的 dem_stream_network 不同,這裡已把缺測摺疊到 True(外點)一側,故以 bool 閉合。 * 統計是 table(dict)。piv_error_stats / piv_peak_locking。 * 轉速度的 piv_to_velocity 的輸出也是 flow2d —— 單位從 px/frame 變為 m/s 但類型相同。此處誠實寫明:類型守不住單位。故把兩種尺度都設為必需參數(與 demops 的 cell_size 同一判斷)。也曾考慮按單位分類型,但那會成為只有 1 個 op 生成 m/s、無一 op 消費的類型——違反「出證據後再增加」的順序,故未採納。
opsprintpath.py
- L54 (ja) — ★様式化(2026-09-23)。「きれいな絵」を返す op ではなく、保った量と捨てた 量を数で返す op にする —— 既存の NPR ライブラリは絵しか返さない。真値は モアレ周期の予言(描く前に分かる)、被覆率 w/d の閉形式、既知の縞の向き、 Lloyd の単調減少(既存 stipple_energy が測る)、セル平均の L2 最適性。 点描の 6 op と同じ族に入れたのは、どちらも「濃淡を離散的な墨に落とす」 同じ問題で、入口も出口も同じ語彙(image2d / pairs)だから。
opsrangedoppler.py
- L108 — ★ 訂正的記錄:本模組初稿寫作「在 real 中速度的符號會遺失」,但那是錯的(僅對只有距離軸的 1-D 實訊號成立,兩軸齊全後符號會被保留)。測試先破而發覺。真正遺失的是「一對中哪一個是真的」、振幅的一半,以及無模糊測距範圍的一半。
_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)同形,故鏈式 fuzzer 需要與 counts 相同的專用生成器(對親的交辦事項;生成器的實體已在報告中經執行確認載明)。出口落入 image2d 與 signal,是本 repo 最大級的 2 個池,故不會成為 jones(2 op)或 countrate(2 op)那樣閉合的狹窄 sort。
opsreprconv.py
- L257 — ★
flow 無法用單一謂詞寫就。因密 (3,D,H,W) 與散在 (N,3) 同名共存,若謂詞同時放行兩者則什麼都守不住,若定於一方則既有 4 op 中必有其一成為 TYPEMISS。分離才是正確的(與將 video 從 voxel 分離同一判斷),但那是改寫既有 op 宣告的工作,超出本模組職責,故此處僅留提案。
opsspc.py
- L91 (ja) — ★単位空間の MD² の平均は ちょうど (n-1)/n(導出、当てはめではない)。 教科書の「単位空間の距離は平均 1」を有限標本で正確に言い直したもので、 1.0 を固定する試験はどんな標本でも間違い、(n-1)/n は全部で正しい。
- L120 (ja) — ★新しい型の語は作らない。曲線(大きさの格子・POD・下限)も表の列として返す。
- L121 (ja) — ★2-D の橋(tb_*)は架からない: 出力の table は backends_typed.TYPE_TO_SORT に 写らないので _OP_BRIDGE_SKIP に入れる必要も無い(2026-10-12 に確認して決めた)。
opsspecular.py
- L160 (ja) — ★出力は既存の語彙(images / normalmap / image2d / table)だけ。法線マップは photometric と同じ規約なので integrate_normals(高さ)・render_shaded へ無改造で流れる。装置の幾何は table(rig)で、他の op は rig= で受ける(既定の装置なら省略可)。順方向は高さ場(image2d)→ 縞の鏡像(images)。
opstomography.py
-
| L141 (ja) — この台帳に置く。★出力は既存の語彙だけ: スペクトルと μ/ρ(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 種子的池中,會在一次也不執行的情況下看起來像「發現為零」—— 與 opsphoton 在 counts 上踩過的陷阱同形。配線側務必注入 3-D 標籤種子(參見下方「親配線時」)。 * voxel —— vol_label_overlay 疊加的原灰度體積,以及 vol_label_color_flicker 接收的二值體積。二者都是 (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。即不滿足「混用會悄然出錯」的條件。給不滿足者添詞,只會多出一個消費者為零的新詞彙 = 多一個死胡同(docs/OP_COMBINATION_MATRIX.md 的判斷基準)。此外,若想把單個網格作為 mesh sort 流向下游,用 [(m["vertices"], m["faces"]) for m in result] 剝出 —— 因這是丟棄顏色的操作,故不在 adapter 中隱式進行。 ————————————————————————– 一個新詞彙及其理由(基於實測) ————————————————————————– * 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 (ja) — ★入射瞳が無限遠(物体側テレセン)では近軸の F 値 = EFL / 入射瞳径 が 0 になる —— 意味の無い「F/0.00」を書かない
- L911 (ja) — ★上面図は第三角法で側面図と横軸 y を共有するので、センサーの長辺(像の横 = 世界の x)は縦に描かれる。 向きを取り違えないよう、軸の矢印と名前を描く(+X が上)。
optics.py
-
L871 (ja) — ★奇数次の微分は奇関数。偶数長の fftfreq はナイキストの -1/2 だけを 持ち対の +1/2 が無いので、そこを残すと実の場の「微分」に虚部が出た (実測 max |
Im |
0.34)。hilbert_x と同じくそのビンを 0 にする。 |
- L887 (ja) — ★補集合はここで作る。
1 - lowpass を呼び出し側に作らせると、 境界の扱いが 2 通りに分かれて lowpass + highpass = 1 が崩れる。
- L892 (ja) — ★ナイキストのビンを 0 にする。
fftfreq は偶数長で -1/2 だけを 返し、対になる +1/2 が無いので、そこを残すと片側位相が奇対称を 厳密に満たさない(実測: 残差 1.6e-09 → 0 にすると 2.3e-16)。 離散ヒルベルト変換で標準的な扱いで、scipy.signal.hilbert も同じ。
- L2767 (ja) — ★縁はモザイクのまま鏡映で 2 画素広げてから抜く。広げ幅が偶数で
reflect (縁の画素を重ねない鏡映)なら 2x2 の位相が保たれる。マスク後の面を伸ばすと 未計測の 0 が縁に写り、一様な場でも縁が暗くなった(実測 16 画素)。
optscene.py
- L2349 (ja) — σ = 0.42·λN(Airy 強度の最良ガウス近似)。★ 以前は 0.42·(1.22λN) で 22 % 太かった
- L2749 (ja) — ★2026-10-11(台帳契約の門): lens_spec() は image_circle_mm を None で持つ(鍵は在る) ので
.get(.., 0.0) が None を返し、float(None) の生の TypeError が漏れていた —— 下の「image_circle_mm が無い」の ValueError に届いていなかった。
ozakimm.py
- L341 (ja) — ★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 (ja) — 密度の配色(暗い紺 → 橙 → 生成り)。★赤と緑は対にしない
- L149 (ja) — ★
np.add.at は同じことをするが桁違いに遅い(散らばった加算)。 1 次元に畳んで bincount で積むと CI の予算に収まる。
- L315 (ja) — ★色を黒でいた時間に結びつける。途中で通っただけのマスと、早くから 黒いままのマスが同じ濃さになるのが「白黒の点」の正体だった。 高速道路は最後にできるので薄く、最初の混沌は濃く出る。
- L326 (ja) — ★構図 —— 蟻が触った範囲は盤の一部しかない(既定では 1/3 ほど)。 埋まった範囲の外接箱で切り出さないと、絵の大半が余白になる。
- L341 (ja) — ★切り出すと 100 画素角ほどになる。最近傍で伸ばす —— これはセル オートマトンなので、補間すると存在しない中間値を作ってしまう。
- L364 (ja) — ★外接箱で枠を使い切る(外接円だと三角形が上下に余白を残す)
- L376 (ja) — ★密度をそのまま色に —— 双一次で積み、asinh で暗部を伸ばす
- L470 (ja) — ★★平方根には枝が 2 つあり、片方は「親 3 円に接しない円」を返す。 最初は主値だけを使っていて、絵の左上に外円の外へ逃げる円の鎖が 出た —— 絵としては「フラクタルっぽい」ので、見ただけでは欠陥と 分からない。接することを数で確かめて枝を選ぶ。
- L491 (ja) — 持ち上げる。★「順位で正規化すれば配り直される」と読んだが外れで、 極小円が多数派なので大きい円が全部下端に潰れ、前より悪くなった。
- L560 (ja) — ★点群の外接箱で枠を使い切る(式の定数で決め打ちにしない)
- L582 (ja) — ★正規化する前の速さ。色と太さをこれに結びつける(飾りでなく量)。
- L636 (ja) — ★色は濃度 v に結びつける(単調な配色なので順位が保たれる)
- L877 (ja) — ★二項係数そのものを積むと C(62,31)*31 が int64 を黙って溢れる。 要るのは偶奇だけなので、リュカの定理の帰結 「C(n,k) が奇 ⟺ (n & k) == k」を使う(桁あふれの余地が無い)。
- L897 (ja) — ★向きの符号は回転の規約で変わる。定理が言うのは「周期 104 で同じ斜めの 変位を繰り返す」ことなので、そちらを門にする(大きさは縦横とも 2)。
- L904 (ja) — ★高速道路は正味で 104 歩あたりちょうど 12 マス黒を増やす(実測で整数)。 最初は「104 歩で 52 マス」と書いたが実測 0.114/歩 と合わず、測り直して 12/104 = 0.11538 だった。周期の中で塗っては消すので、正味はずっと少ない。
- L921 (ja) — ★★描いた円が本当に接しているか。平方根の枝を選び損ねると、 絵としては「フラクタルっぽい」まま外へ逃げる鎖が出る(実際に出した)。
photometric.py
-
L98 (ja) — ★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 (ja) — ★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 (ja) — ★2026-10-07 レビュー修正: 旧式は回転ブロックに -[Xc]x(= t も回す更新の微分)を使い、 実際の更新(t は回さない)と食い違っていた。初期値が良いほど収束が線形に遅くなり、 30 反復で最小に届かないことがあった(重心中心化した DLT 初期値で 50 反復要した)。
- L309 (ja) — ★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 (ja) — ★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 (ja) — ★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 (ja) — ★2026-10-07 レビュー修正: 符号を w の正負で揃えると、w≈0 をまたぐ組(yaw +179° と −179°)が 反対の半球に分かれ、平均が恒等(0°)に潰れた。最初の四元数を基準に、内積が負のものを反転する。
-
| L425 (ja) — ★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 法線符號任意,旋轉後有四成的點會翻轉。由於 PPF 的特徵是法線之間的角度,翻轉則鍵會改變。實測(400 點,繞 z 軸):用素樸法線時鍵的一致率在 0/37/90/143 度為 100 / 73.6 / 69.4 / 67.2 %,用定向法線則全部 100 %。與
pointcloud.fpfh 踩過的同一個洞,在同一天一併修好。
printpath.py
- L45 (ja) — 様式化(npr、2026-09-23)。★test_printpath の門が
set(OPSPRINTPATH) == set(__all__) - {定数} を要求するので、 台帳とここの両方に書く必要がある。
- L185 (ja) — ★2026-10-07: 行番号 N123 とチェックサム *71 を外す(外さないと N が命令に見え、その行の移動が黙って落ちた)
- L195 (ja) — ★2026-10-07: G の無い座標だけの行(modal な移動)などは黙って捨てず拒否する
- L209 (ja) — ★2026-10-07: 以前は黙って無視され、直後の G91 の相対量が絶対座標として読まれていた 軸は数値なしでも書ける(
G28 X Y)ので、数値つきの語でなく文字そのものを見る
- L231 (ja) — ★2026-10-07: 始点未定の軸への相対移動は未定のまま(以前は相対量を絶対座標として読んだ)
- L717 (ja) — ★ペンプロッタの経路と 3D プリンタの経路は同じ対象(順に回る線分の列)で、 # 出口も同じ(contours_to_gcode → gcode_write / gcode_time_estimate)。 # だから族を新しく立てず、ここに stroke カテゴリとして足す。 # 参考: Kaplan & Bosch, “TSP Art”, Computational Aesthetics 2005。 # ————————————————————————— # 点描の距離。”euclidean” 以外は将来。
- L818 (ja) — ★画素ごとの最近傍をKD 木で引く。以前は各反復で (画素 x 点) の距離行列を まるごと作っていたので、202x300 の絵に 9,000 点を置くだけで 60,600 x 9,000 = 5.5 億要素(4.4 GB 相当)を 18 回組み直していた —— 手元で 101 秒、共有ランナーでは PoC の実行門(1 本 600 秒)に迫る。KD 木は厳密に同じ最近傍を返すので答えは 変わらない(同距離の並びだけは実装依存になるため、種を固定した回帰検査を置く)。
- L1034 (ja) — ★被覆率で塗る。整数画素の円板で塗っていたときはペン幅が階段になり (0.5 / 1.0 / 1.5 px がインク率 0.1900 で一致し、2.0 で 0.4853 へ跳ねた)、 「目標の濃さに合うペン幅」を解くことができなかった。画素中心から標本までの 距離で被覆率を出すと、ペン幅が連続なノブになる。
- L1076 (ja) — ★2026-10-07: 反射の詰め物を手で切ると r ≥ 辺の長さで足りず出力が縮んだ((8, 12), σ=3 → (4, 12))。 np.pad の reflect は繰り返し反射するので形が保たれる(r < 辺の長さでは従来と同じ値)
- L1086 (ja) — ★「きれいな絵」を返す op ではなく、保った量と捨てた量を数で返す op にする。 既存の NPR ライブラリは絵しか返さない —— 差はそこ。真値はモアレ周期の予言、 被覆率 w/d の閉形式、既知の縞の向き、Lloyd の単調減少(既存 stipple_energy が 測る)、セル平均が L2 最適であること。 ————————————————————————- #
- L1297 (ja) — ★ストロークを構造に沿わせるなら、縞の周波数ベクトルはその 直交方向に向ける(線は周波数ベクトルに直交に走る)。 この 90 度を入れ忘れていて、docstring は「沿う」と書きながら 実装は「横切る」だった —— 既知の角度の縞を渡す門で掴んだ (2026-09-23)。絵を見るだけではどちらも「それらしい線」に見える。
problems.py
- L147 — ★一個確定性的全域洗牌(基點固定,因此 train/holdout/locked 索引同一個置換),按 seed 的角色分成三個互不相交的帶(evolve.run 取 train=seed、holdout=seed+10000、locked=seed+20000,於是 seed//10000 mod 3 選出帶)。舊的
off = seed % pool 在 pool 整除 10000 時總是把三個視窗塌縮到同一批影格——一個靜默的 train↔holdout↔locked 洩漏,使過擬合 train 的 champion 看起來「在純 holdout 上勝過手工」。純粹的三分需要 pool >= 3n;更小的 pool 無法給出乾淨的 holdout,所以我們拒絕而非靜默洩漏。
profileops.py
- L270 — ★ 最初寫作「曲率較大的一側」,在 NACA 2412 上把後緣判成了前緣。三點圓的曲率,在上下面幾乎相切的後緣處會比前緣的圓度更大——「前緣是圓的」這一直覺,用輪廓上的 3 點來測時會逆轉。
- L277 — ★ 後緣張開時,最遠的 2 點會拾取後緣的某一角而使弦傾斜。改在縫隙的中點重取,再把前緣定為「離該中點最遠的點」。不這樣做,即使對稱翼也會出現相當於後緣半縫隙的彎度(實測 0.001257)。
- L643 — ★ 比對前用同一取法重取。弦的框架(尤其是後緣中點)會略依賴點的放置方式,故把生輪廓與重取輪廓相互對照時,即使同一形狀也會引入 0.02 度的旋轉與 7.8e-4 的平移——這本身就成了偏差的地板(實測 rms 6.05e-4)。要比較的東西須置於同一擂台。
- L654 — ★ 不作點對點,而作點對折線測量。即便按等弧長重取,兩者的相位也不一致,故若以編號取對應,則相位錯移會直接成為偏差(實測:拿同一形狀與自身比,rms 為 6.05e-4——與想檢測的缺陷同一數量級)。
pxrd.py
-
| L976 (ja) — ★2026-10-07: 補正で割った値 v = I / c の分散は I / c² = |
v |
/ c(補正を σ に通さないと 2θ=55° で σ を 2.3 倍小さく見積もった) |
raster.py
- L222 (ja) — ★ /iinfo.max put a signed image in [-1, 1] (int16 -32768 -> -1.00003)
- L280 (ja) — ★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 (ja) — ★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 (ja) — ★2026-10-14: 以前は bfl(無限遠の物体の焦点)を使い、有限物体でも像面を無限遠の焦点に置いていた (700 mm の物体で像は 51.39 mm なのに 47.71 mm、W20 −18 波の偽のぼけ)。近軸の像距離は無限遠なら bfl と同じ。
- L1240 (ja) — ★2026-10-15: 像面とほぼ平行・逆向きに進む光線は像面に届かない —— 無効にする。以前は傾いた鏡(tilt 45°)の後で D_z ≈ 1e-17 の光線が巨大な有限の点になり、spot_stats が rms 3.4e18 mm・n_vignetted 0 を返した (傾きは「その面だけ」の摂動で、光軸は折れない。折り返しは raytrace3d の fold_mirror で組む)。
raytrace3d.py
- L652 (ja) — ★光線が像面とほぼ平行・逆向き(像面の +z へ進まない)なら像面に届かない —— 無効にする。 以前の raytrace は傾いた鏡の後で D_z ≈ 1e-17 の光線を巨大な有限の点(rms 3e18 mm)として有効に数えた。
- L657 (ja) — ★局所座標は傾いた像面そのものの基底で取る(以前は傾けない座標系へ射影し、傾けた向きが cos θ’ 倍に縮んでいた)
realdata.py
- L38 — ★ 只有
public 列為真者,方可用於公開發布的圖。僅限研究、教育目的且需註明引用者,帶有 cite。
- L97 — ★ skimage 只持有隨附的子集,其餘在執行時經 pooch 去取。取不到的在本 repo 中不使用(PoC 若依賴網路,出問題時便分不清是實作還是網路所致)。
render3d.py
- L1946 (ja) — ★極小曲面は平均曲率 H が至るところ 0 の曲面。既存
vertex_curvature が まさにそれを測るので、「これは極小曲面だ」という主張を、作り方を知らない op
- L1948 (ja) — が採点する。★カテノイドとヘリコイドは等長なのでガウス曲率 K が一致するが、 それは必要条件にすぎない —— 門にするのは H のほう。 ————————————————————————- #
- L2153 (ja) — ★marching cubes は面積 0 の三角形を出す(格子点をちょうど通る等値面で、 2 頂点が同じ位置に来る)。曲率 op はそれを正しく拒否するので、ここで落とす —— 黙って渡すと「曲率が定義できない」と下流で落ち、原因がここだと分からない。
- L2215 (ja) — ★平行移動フレームで掃く(フレネ枠を使わない —— 直線部で法線が定義できず、 変曲点で従法線が反転して管がねじれる)。真値は、円を中心線にすると トーラスになり体積 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 — ★ 真實 bug 的回歸點。最初此處為
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 (ja) — ★2026-10-07: [lo, hi) に候補が 1 つも無い標本は範囲外の値・score -inf・margin 2.0(最大の確信)を 返していた → 値と score は NaN、margin 0(residue_fault_locate の「決められない = NaN」と同じ約束)。
- L614 (ja) — ★2026-10-07: 範囲内に候補が無い画素は margin 0(= valid にしない)。値は warp 用に有限のまま残す。
-
| L698 (ja) — ★2026-10-07: refine 後に |
d |
が探索範囲 max_disp を越えた画素は黙って切らず valid=False にする。 |
roughness.py
- L55 (ja) — ★規格の文面どおりの ±λc/2(= 2.67 σ)は裾の 0.8 % を落とし、カットオフでの透過率を 0.5 でなく 0.5095 にする(2026-10-18 に実測して直した。α の定数も標本化の正規化も正しく、 原因は打ち切りだけだった)。4 σ まで取ると λc で 0.5 に 1e-4 台まで合う。
- L978 (ja) — ★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 (ja) — ★第 5 引数 fs_dtype_t。2026-09-14 までヘッダにだけ在って実装と FFI 宣言に 無かった引数。ctypes は引数の数を検査しないので、抜けても黙って動く。
sample_data.py
- L147 — ★ 加入的理由:在展示 111-113 中再次出現「合成只能造出自己已知的壞法」(有 6 張實拍出現 9 件不良的前例)。PoC 保持離線閉合,只把替換為實數據的入口置於台帳。commercial=”check” 及以上者,須先讀源的頁面再用。
scale.py
- L54 (ja) — ★2026-09-17: 検査のタイル幅を 64/16 だけから 60/12 も見るように広げたら、 tile_safe と宣言されていた 168 本のうち 16 本が割れた。64 も 16 も 8 の 倍数なので、周期 8 の処理と、たまたま境界が穴に掛からない領域処理が すり抜けていた。以下はそのとき測って落ちたもの(誤差は 60/12 での実測)。
- L86 (ja) — ★2026-09-17: 走査長平滑化は隙間を最大 65 画素まで埋めるので、 標準タイラーの halo より広い。60/12 のタイルで 0.2613 ずれた(実測)。
- L89 (ja) — ★2026-09-17: 局所の二峰性は窓が最大 41 画素、傾き補正は角度を画像全体から 1 つ決める。どちらもタイルごとに測ると別の答えになる(実測 1.0000)。
- L185 (ja) — ★名前つきの理由はカテゴリの分岐より先に引く。category が先に返してしまうと、 幾何カテゴリの op はすべて「cv2 の座標上限」と説明されてしまい、実際の理由 (deskew なら「角度は画像全体から 1 つ決まる」)に辿り着けない。この辞書に 載っているのは実測で非タイル可と分かった op だけなので、載せた op 以外の 分類は 1 件も変わらない(2026-09-17 に 925 op 全数で確認)。
scene_registry.py
- L19 (ja) — ★配布物にローカル絶対パスを焼き込まない。ここは自分のマシンの作業物を指していた ので、他人が pip install した環境では黙って落ちる(しかも「場面が無い」ではなく 「その場面だけ静かに欠ける」形で)。環境変数で受け、未設定ならその場面を登録しない = 在ると偽らない。
loco_mujoco は入っていれば自分で在り処を知っているので探す。
sdf_ops.py
- L346 — ★ 加入的理由基於實測:
poc_dfm_thickness_overhang 與 poc_cad_scan_deviation 報告稱 # 「機械部件由圓柱孔、倒角、圓角構成,但基元只有球與 # 長方體,故無法用 CSG 拼裝」,兩者都各自手寫了逐面的解析式。此處的 4 個全部為閉式且嚴格(外側為到最近表面的 # 歐氏距離,內側為到最近面的負值),故此後可僅用 CSG 拼出帶真值的合成部件。 # ————————————————————————— #
segcompare.py
- L216 (ja) — ★2026-10-07: 43*0.1/0.1 = 42.99999999999999 → floor で 1 voxel 手前に落ちた(spacing 0.1 で 1000 個中 47 個)。 整数のごく近く(相対 1e-9)は整数に寄せてから floor
sensitivity.py
- L396 (ja) — ★2026-10-15: 生きた列(影響ゼロでない列)が 1 本以下なら、組み合わせが 1 つも無いので交絡は定義上ない (以前は max_subset の範囲 2..2 に 1 が入って ValueError で落ちた。simcal で σ = 0 のボケの列が 0 になって踏んだ)。
- L418 (ja) — ★大きさの等しい項の順と符号の基準は丸めの屑で決めない(simcal._fmt_combo と同じ、2026-10-15 に CI の Linux でだけ順が入れ替わった)。1e-6 で丸めて比べ、同点は宣言順。
shapestats.py
- L557 (ja) — ★2026-10-07 レビュー修正: 中点がほぼ一直線(2 番目の広がりが 1 番目の 1e-3 未満) または一点だと、面は直線まわりに決まらず vt[-1] は雑音で決まる(真の面から 90 度 ずれうる)。中点の面の法線が左→右の平均ベクトルと 60 度以上食い違う場合も、鏡映面と して左右の対と矛盾する。どちらも左→右の平均ベクトルの、中点の主方向に直交する成分を 法線にする(面の位置は従来どおり中点の重心)。それも決まらなければ ValueError。
simcal.py
-
| L938 (ja) — ★同じ大きさの項(利得 × 照明のように |
e |
が等しい組)の順と「主の項」は、丸めの屑で決めない。 argmax / argsort は 1e-16 の差で入れ替わり、Windows では “illum^1 * gain^1”、CI の Linux では “gain^1 * illum^1” になった(2026-10-15)。大きさを 1e-6 の相対で丸めて比べ、同点は宣言順。 |
-
| L967 (ja) — ★重みは自然な座標(e· |
列 |
)なので、単位の違う項が混ざると指数が大きくなりうる(8 次の多項式の係数と利得: 2026-10-18 に exp が溢れた)。対数のまま ln_product も返し、積は溢れたら inf / 0 にする(落とさない)。 |
spc.py
- L426 (ja) — ★管理図と工程能力は「工程のばらつき」を見るが、その数字は測定のばらつきを 含んだままである。ゲージ R&R は総変動を「部品差」と「測る行為の差」に分け、 後者が前者を食っていないかを見る —— 工程能力の前に来るべき検査で、ここが 抜けていると「工程が暴れている」と読んだものが実は測定器だったという取り違えが 起きる。GUM は同じ問いを 1 回の測定について立て、成分ごとの不確かさを 合成する。どちらも閉形式で、照合できる恒等式を持つ。 =========================================================================== #
- L733 (ja) — ★どのモデルで出した数字かを必ず載せる(黙って切り替えない)
- L1042 (ja) — ★★破綻は警告でなく構造で返す。感度係数がすべて 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 (ja) — ★この検出条件そのものは本実装の判断であって、規格が列挙したものではない。 規格が定めるのは線形モデルの 3 条件(Welch-Satterthwaite の適用可否 / 有限自由度の入力が独立であること / 出力分布が正規または t で近似できること)と 非線形モデルの 5 条件(最良推定値の近傍で連続微分可能 / 適切な次数の全微分で 成立 / 高次項に関わる入力が独立 / その分布が正規 / 落とした高次項が無視できる) で、「感度が全部 0」「区間が定義域を出る」という判定手順は書かれていない。 ここで実装したのは、その条件が破れたときに観測される形のほうである —— 停留点は高次項が支配する特殊例、負側への張り出しは正規近似の破綻の現れ。
- L1062 (ja) — ★停留点 = 不確かさのある入力の 1 次感度がすべて0(高次項が支配する)。 感度が非 0 なのに分散が 0 なのは、相関による厳密な打ち消し (X1 = X2 で Y = X1 - X2)で、u = 0 が正しい答え —— 妥当として note を付ける。
- L1073 (ja) — ★破綻は警告でなく構造で返す(警告は握りつぶされる/ログに消える)
- L1104 (ja) — ★ NaN は
nu <= 0 をすり抜け、下の isfinite で「無限大」扱いになっていた (dof=[4, nan] で nu_eff 16 = 自由度を水増しし k を小さく)。欠測は拒否する。
- L1121 (ja) — ★規格は「nu_eff が整数でなければ次に小さい整数へ切り捨ててから t を引く」 ことを要求する(安全側に倒すため)。16.64 のまま引くと k = 2.1132、 切り捨てて 16 で引くと 2.1199 —— 公表例題の 2.12 は後者。0.3 % の差だが、 拡張不確かさは報告書に載る数字なので規格どおりに倒す。切り捨て前の値も
dof_effective に残す(どこで丸めたかが見えないと追えない)。
- L1151 (ja) — ★区間が定義域を出たら、それは測定の主張でなく近似の破綻。 比較損失(二乗の和)は構成上非負なのに、規格の例題では伝播則の 95 % 区間が [-96, +296]e-6 と負側へ張り出す。伝播則は出力を正規と見なすので 境界を知らない —— 知っているのは呼ぶ側だけなので、境界を渡されたときに 限って検査する(既定で勝手に 0 を下限と仮定はしない)。
- L1530 (ja) — ★”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 (ja) — ★ 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 (ja) — ★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 (ja) — ★既定の溶融石英(SILICA、Malitson の分散式)は材料表に k が無く、厚さは効かない —— 内部の吸収を入れたいなら k を持つ硝材の名前と厚さを渡す(材料表の glass の類)。
studio.py
- L349 (ja) — ★2026-10-03: GIF を QPixmap で読むと 1 コマ目しか出なかった(例の図の 1/4 は掃引 GIF)。QMovie で回す。
- L358 — ★ 直接右鍵點擊圖本身(使用者 2026-09-06:「若能右鍵把作為圖顯示的東西複製到剪貼簿就好了」)。這是本 repo 的 Studio UI 規約——顯示系也須能從右鍵完成一整套。可與下方按鈕列做同樣的事(不要二者取其一)。
- L1550 (ja) — ★2026-10-03: (2, h, w) を “color” と判定し、描けずに前の画像が残っていた。
-
| L1560 (ja) — ★2026-10-03: 複素数は虚部を黙って捨てた min/max を出していた。 |
z |
で数える |
- L1583 (ja) — ★2026-10-03: dict は中身に関係なく「輪郭 0 本」と表示していた。台帳の op(~1,700 本)の大半は {“distance”: …, “t”: …} のような表を返すので、全部「輪郭 0 本」に見えていた。 輪郭(
cs を持つ)以外は表として、欄ごとに何が入っているかを出す。
- L1594 (ja) — ★2026-10-03: 空の配列は「先頭の値」を取りに行って IndexError、4 次元以上は先頭の 1 値を スカラーとして見せていた(台帳の op を Studio から走らせて踏んだ)。
- L2187 (ja) — ★ヘルプの「開けるファイル」表の正本(2026-10-03、ユーザー指摘「ヘルプにも機能として書いておいたほうがいい」)。 各行 = (分類キー, 何で開くか, 拡張子, 補足)。文字列は英語 =
tr のキー。拡張子は上の定数から引くので 定数に足せば表にも出る。表から漏れた拡張子・分類と違う行は tests/test_studio_dragdrop_formats.py の門が落とす。
- L6430 (ja) — ★2026-10-21: 走っている/終わりかけの実行ワーカーを静止させてから閉じる。QThread が 走ったまま親ごと破棄されると Qt は abort し、CI では「全件合格のあと exit 134」になる。
- L6987 (ja) — ★順位(2026-09-19、GenSpark 第 10 報 N17): 「canny」で先頭に edges_color(説明文に canny を含む)が 来て、Enter で挿入する op を取り違えやすかった。名前の完全一致 → 前方一致 → 名前に含む → HALCON 名 → 説明文だけ、の順に並べる(同順位は登録順のまま)。
- L9254 (ja) — ★fallback は画面に出す(2026-09-19、GenSpark 第 10 報 N16): グレー画像に edges_color(color 入力)を Run once すると、ライブラリは台帳に記録して sort の既定値を返すが、GUI は「ran … once」としか 言わなかった。結果の窓には既定値が映っているので、それを結果だと思わせてはいけない。
- L10327 — ★ 圖的承接盤。範例經
examplefig 往此處寫 PNG。不傳環境變數的執行(CLI)中一張都不寫,故只有從畫廊執行時才出圖(範例的數值與速度不變)。
- L10483 — ★ 圖的承接盤。範例經
examplefig 往此處寫 PNG。不傳環境變數的執行(CLI)中一張都不寫,故只有從畫廊執行時才出圖(範例的數值與速度不變)。
- L11360 (ja) — ★実行キー(F5 / Ctrl+Return / Ctrl+R)は「いま書いてあるものを走らせる」(2026-09-19、GenSpark 第 8 報 N13): Program に未適用の編集があるのに実行キーを押すと古いパイプラインが走り、画面は 「● unapplied edits」のまま何も変わらなかった(Xvfb + xdotool の実測、s8 → s9 が同一画面)。 先に Apply し、Apply が通らなければ(構文エラー等は Program の状態表示に出る)走らせない。
- L12260 (ja) — ★パスで渡すと sim_source は拡張子 .xml の時だけファイルと読み、.urdf / .mjcf はXML の文字列と 取り違えて「XML parse error」になった(2026-10-03 のテストで発見)。モデルはここでパスから作る。
- L12333 (ja) — ★2026-10-03: 3DGS の学習結果(.ply に f_dc/opacity、または .splat)は、以前は普通の点群として 色無しで開いていた。ガウスの中心を 0 次の球面調和の色で出す(不透明度 5% 未満は落とす)。 楕円体の描画ではなく中心の点 —— 形を見る用(splat の見た目そのものは gs_render)。
- L12336 (ja) — ★2026-10-03(ユーザー「Physical AI で使われるデータ形式も読んで表示」): glTF / LAS・LAZ / MJCF・URDF。 読み手は既存(meshio_opt / sim_source)で、依存は任意(無ければ pip の名前つきで断る)。
- L13825 (ja) — ★2026-10-03(ユーザー「画像をドラッグ・アンド・ドロップして見れる」「Python スクリプトも D&D で開ける方が便利」): 以前は 1 本目しか見ず、.py は「未対応」だった。種類ごとに全部さばく: 画像 1 枚 = 入力として読む(従来どおり)、2 枚以上やフォルダ = 画像ビューアで並べる、 .py = Python エディタのタブ、.json = パイプライン。
- L13844 (ja) — ★モデル + qpos 軌跡 (T, nq) を一緒に落とすと再生(nq が 3 や 6 だと点群と見分けがつかないので、 モデルと一緒に落とされた .npy は形に関係なく軌跡として読む)
- L14886 (ja) — ★2026-09-20(GenSpark 第 43 報 N154):
fullseye-studio --help が表示の無い Linux で SIGABRT。QApplication を作る前に –help / –version を答え、表示が無ければ Qt を起こさず 1 文で止まる(abort は説明にならない)。
studio_result.py
- L48 (ja) — ★2026-10-04: bool の配列(占有格子など、台帳の op が返す)は np.round が bool へ書き戻せず落ちた —— bool はそのまま二値
superquadric.py
- L182 (ja) — ★2026-10-07: 0 点の平均残差は 0/0(NaN を guard が置き換えていた)
tacsim.py
- L385 (ja) — ★既定の探索半径は窓の縁まで(双線形 ±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 (ja) — ★2026-10-07: 窓の端までの距離は中心から測る(原点 = 窓の中心と仮定していて、X・Y・中心を +8 mm ずらすと δ が 11 % 縮んだ)
- L506 (ja) — ★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 的稽核確認了實害:10 個 recent_files 中有 8 個是 pytest 的暫時路徑,system\operator_timeout_ms 等實值也殘留著。(隔離只在 3 個檔案中的 2 個裡,test_studio_params.py 是素通的。)不再逐個添加,而是作為工作階段 autouse 在此只放一個。環境變數是 studio._settings() 唯一查看的入口,故此舉覆蓋全部測試。
- L44 — ★ 需要 optional backend 的測試的宣告。 # ————————————————————————— # CI 的註記長期寫著「不安裝 torch/kornia(對應測試 graceful skip)」,但 2026-09-05 的實測顯示那並非事實——目標測試並未 skip,而是以
ImportError: this operator needs the optional 'torch' backend 失敗(14 件)。只有註記,卻沒有用機器核實它的機制。此處把宣告匯入單一入口。目標是雙向:* 無 backend 的環境 → skip(讓註記成為事實)* 理應有 backend 的環境 → 不許 skip,令其失敗(FULLSEYE_REQUIRE_OPTIONAL=1。CI 的 py3.11 作業會立起它)只有單向時,真正的回歸會悄然化為 skip(與 feedback_failsoft_hides_permanently_dead_ops 同形)。
- L192 (ja) — ★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 (ja) — ★点群は連結なものと非連結なものの両方を置く。
tb_geodesic_distances が 不達を inf で表すのは契約どおりで、ops.NONFINITE_IS_MEANINGFUL に 「1.0 に潰すと『届かない』が『近い』に化ける」と宣言済み。 ここで一度 normal をわざと連結にして有限性ゲートを緑にしかけたが、 それは欠陥を隠す方向だった —— 直すべきは門が台帳を見ていないこと。 normal は橋でつないだ現実的な形、two_clusters は非連結を撃つ探針。
- L282 (ja) — ★特異行列は必ず置く。 一度ここから外しかけたが、それは誤りだった ——
tb_mat_cond が特異行列で inf を返すのは契約どおりで、ops.py の NONFINITE_IS_MEANINGFUL に「厳密に特異な行列は s_min=0 なので inf が 正しい答え。有限に潰すと『十分に良条件』と読めてしまう」と既に宣言済み だった。落ちていたのは op ではなく、有限性ゲートがその台帳を見ていない こと。探針を削って緑にするのは、欠陥を隠す行為。 (同じ註に 2026-09-05 の教訓が書いてある ——「自分の probe では特異行列を 作っていなかったので tb_mat_cond を取りこぼした」。探針から外すのは その取りこぼしをわざと再現することになる。)
- L400 (ja) — ★新規(2026-09-14): ここまで探針が無く、契約ゲートを一度も通っていなかった 5 sort = 101 op。残る 6 sort(video / qimage / cimage / lightfield / beatcube = 50 op)は形が複素・4-D で退化形の設計に手間が要るため、 一度に全部入れて切り分け不能にしないよう次の段で足す。
- L408 (ja) — ★第 3 段(2026-09-17): 戻りの橋
feature_to_img が入るまで、feature を 入力に取る op は 1 本も無かった(作る op は 125 本ある)。門が「探針の 無い op が 1 本に増えた」と正しく落ちて教えた。
- L453 (ja) — ★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 (ja) — ★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 (ja) — ★このパーサは「タグから最初の
; まで」を宣言とみなす。だからタグと 宣言のあいだに ; を含む散文があると、宣言が見つからず 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 (ja) — ★2026-09-14:
FsValueError を足した。それまで例外は 2 種しか無く、 種の違う失敗が同じ status に潰れていた —— 逆さの区間は契約では FS_E_INVALID_ARG なのに FsTypeError(= FS_E_TYPE)を投げていた。 差分テストが「どちらも拒否した」までしか見ていなかったので素通りした。
tests/test_abi_signatures_match.py
- L82 (ja) — ★
[A] + [B] * 3 のような式で書かれた argtypes がある。最初この形を 数えられず fs_measure_all を「1 引数」と誤読して門が 3 件赤になった —— 門のパーサが弱いのを実装の欠陥と読まない。 行末までを 1 宣言として 取り、[...] の各塊の要素数に * N の倍数を掛けて合計する。
- L180 (ja) — ★
cl に .h を直接渡してはいけない —— MSVC は拡張子で言語を決めるので 「ソースファイルの種類は認識できません」と警告だけ出して rc=0 を返す。 検査が 1 行も走っていないのに緑になる、最悪の形 ([[feedback_ran_is_not_meaningful_output]]。2026-09-14 に実際そう読みかけた)。 #include する小さな .c / .cpp を作って /Zs(構文検査のみ)を掛ける。
- L190 (ja) — ★引用は 1 段も挟まない。
subprocess にリストで渡すと Python が 引数を再クォートし、内側の " が \" に化けて cmd に届く (実測のエラー: '\"C:\Program Files...\vcvars64.bat\"' は認識されて いません)。バッチファイルに書き出して、それを叩くのが確実。
tests/test_acquire_contract.py
- L45 (ja) — ★「開く実装が在る」と「入っていないときに何を入れればよいか言う」は別。 上の門は opener の存在を見るが、SDK が無い機械で呼ばれたときに何と言うかは 見ていなかった。2026-09-25 に接続の 3 層(protocol / image source / driver)を 揃えたとき、
comm は cclink に「install ‘None’」と言い、device は 9 driver に 入口すら持っていなかった。同じ問いに答える層は、同じ約束をすること。
- L166 (ja) — 16.003663…**。★「16 倍」と書いて落ちた —— 器の幅と有効ビットの比は 2^4 ではなく (2^16-1)/(2^12-1) で、1 桁目から違う。
- L300 (ja) — ★「次は ## デバイス制御」と決め打ちしていたため、あいだに節を 1 つ足した だけでその表の行まで backend 行として読んでしまった(2026-09-24)。 節の終わりは次の見出しであって、特定の見出しの名前ではない。
- L323 (ja) — ★「見つける」は「開く」とは別の問い。1 列にまとめていたせいで、 開けるのに一覧に出てこない zed / kinect が表では ✓ のままだった (2026-09-25)。列の中身は AST から数えた実際の分岐と突き合わせる。
- L437 (ja) — ★ここまでの門は「acquire が持っている綴り」からしか数えていない。規格の全数を 分母に置くと、そもそも知らない形式が見つかる —— 実際これで 10 bit 非詰めの Bayer 4 形式が丸ごと抜けていた(2026-09-24)。台帳は EMVA が無償公開している 「GenICam Pixel Format Names and Values」の単板 59 形式。
- L484 (ja) — ★最初ここに「詰め形式は容器 = 有効」と書いて、この門に捕まった。実際は 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 (ja) — ★機能名はベンダの名前ではなく規格の名前なので、1 本の語彙表で GenTL を出す 全ベンダを覆える。だからこの層は「どのベンダの SDK を入れたか」と無関係に 検査できる —— 模擬ノードマップで足りる。実機が無いことは言い訳にならない。
- L678 (ja) — ★SDK のバッファを指したまま返すと、次の 1 枚が前の 1 枚を書き換える。 例外は出ない —— 絵だけが入れ替わるので、連写を保存して初めて気づく。 実機が要る経路なので実行では確かめられない。ソースで確かめる。
- L716 (ja) — ★複製が要らない backend と、その理由。黙って外さない。
- L772 (ja) — ★SDK を採点したのと同じ物差しで自分も採点する。違う物差しで測った数を 並べると「SDK より厚い」が意味を失う。しかも自己申告にしない —— 各軸が どの入口で満たされているかを実在する名前で名指しし、門がそれを引く。
- L821 (ja) — ★列挙軸の一番大きな穴はここだった。
_enumerate("genicam") は [] を返していて、 GenTL を出す全ベンダを覆える唯一の経路だけが列挙できない状態だった。 GenTL 1.6 が「プロデューサのインストーラは GENICAM_GENTL{32/64}_PATH に自分を 足す」と決めているので、こちらはその変数を読めばよく、ベンダごとの表は要らない。 実機も SDK も無しで検査できる —— 変数と .cti という名前のファイルがあればよい。
- L875 (ja) — ★
__all__ は「何を公開したか」の一次情報(dir() は環境で変わる)。だから 本体が増えたのに __all__ が増えない、という遅れは静かに起きる —— 実際に 2026-09-25 まで 7 つ足りていなかった(追記のつもりが当たっていなかった)。 門は台帳側でなく本体側から数える。
- L947 (ja) — ★
opencv backend が開くのは UVC の装置。その規格が制御の名前と、いくつかは 単位まで決めている。単位が SFNC と違うので、換算を往復で確かめる —— 100 倍の係数を書き忘れても例外は出ず、露光だけが狂う。
- L1162 (ja) — ★門そのものを呼んで、本当に落ちることを確かめる(式の真似ではなく)。
tests/test_annotate_bold_italic.py
- L59 — ★ 疊打只會橫向變粗。上下變粗的描邊會把和文字的內白填滿(2026-09-09 實測:11pt 的「量 值 面積」變成了黑塊)。
tests/test_aoi.py
- L145 (ja) — ★平均は保たれない(被写体と感度に相関があるとずれる)。実測 8.9 %。
tests/test_api.py
- L226 (ja) — ★台帳をまるごと外すと「層が現れない」で落ちる —— この門が見張る事故そのもの。
tests/test_astrostack.py
- L1053 — ★ 2026-09-08:新增了第 3 個返回值 vote_margin(第 2 高的峰 / 第 1 高)。若為星野,峰只有一個,故應當小——這一點也在此固定。
tests/test_backends_typed.py
- L71 (ja) — ★2026-10-07:
or True で無効化されていた。実測 936 op / 重複 0 —— 主張は成り立つので門に戻す
tests/test_backends_typed_liveness.py
- L57 — ★ 就這一件而言,記錄有3 處——此處、
gen_op_figures.DOMAIN_MISMATCH,以及 op 自身 0/60 的實測。即便如此,「已註冊卻一次也不運行」的狀態仍在持續。知道某事與在判定中使用它是兩回事(KNOWN_ISSUES §42)。
- L129 (ja) — ★2026-10-07: 探針を作れず
_live_report が検査せずに飛ばす tb_* op の台帳 {op: 理由}。 以前は skipped を返すだけで誰も見ておらず、探針の無い op は生死の検査を黙って抜けた。
- L725 (ja) — ★2026-10-07: 例外で抜けた組は検査していない —— 何組を実際に見たかに下限を置く (実測 159 op × 5 入力 = 795 組、例外 0)。
tests/test_blob2d.py
- L443 — ★三個物體必須都是不同的形狀。把相同形狀排列起來的種子會讓 circularity 和 holes 都返回相同的值,因而漏掉「無論轉哪個旋鈕都返回相同數值的 op」。
tests/test_caltab.py
- L121 — ★閘門是否觸發依賴於環境,所以不作斷言。只檢查值未被隱藏地返回。
tests/test_capabilities.py
- L167 (ja) — ★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 (ja) — ★2026-09-25:
io は例のなかで fs.open_driver("io-memory") から開く ようにしたので、免除の理由はロット画像だけに縮んだ。
tests/test_chain_type_contracts.py
- L222 (ja) — だけなので、格子も積分時間も最小で足りる。★二重スリットは「縞が 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 (ja) — ★2026-09-25 追加: 通信の名簿(
comm.protocols)は数えていたのに、 駆動の名簿は数えていなかった。接続の 3 層(protocol / image source / driver)のうち 1 つだけ見ていない状態で、 driver が 1 行消えても誰も気づかない。
- L91 — ★2026-09-08 新增:兩個用於累積說明的台賬。說明最容易悄悄減少,所以在這裡計數(docs/CAPABILITIES.md 與 docs/HARDENING.md 的來源)。
tests/test_comm.py
- L135 (ja) — ★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 (ja) — ★「相手が居ない」は「扉が無い」ではない(device 側で先に踏んだ): native な protocol は本当に繋ぎに行くので、
OSError は扉が在る証拠として通す。
- L209 (ja) — ★捕まえられない例外は、無いのと同じ。
fullseye.open_channel は facade に 在るのに、それが投げる CommError は 2026-09-25 まで facade に無く、利用者は 内部モジュール名 comm を import しないと except に書けなかった。 1 つずつ足すのではなくクラスごと閉じる —— __all__ が公開の一次情報で、 そこに在って facade に無い名前は、書いた本人しか使えない。
- L214 (ja) — ★免除は理由つきで名指しする。
comm.register(protocol の登録)を facade に 出したら、既に在った fullseye.register(点群のレジストレーション op)を 上書きした —— 出荷していれば利用者の点群処理が静かに別物になっていた (2026-09-25、既存の例の門が捕まえた)。同名は譲らず、内部名で使う。
tests/test_connectivity_doc.py
- L96 (ja) — ★ここは長いあいだ
あり(= その lib が import できるか)の欄で、 機械ごとに違うので門が見られなかった —— 誰も検査しない欄が表に 1 列在る状態だった(しかも中身は kind == native の写しで、pyserial を 入れた機械では嘘になる)。2026-09-25 に「実装」(Fullseye 自身が開けるか) へ替えた。版で決まるので、どの機械でも同じ答えになる。
- L168 (ja) — ★入口の名前は実装の台帳から引く。表に手で書いた名前が古くなると、 「証拠が消えた対応済み」になる。
- L213 (ja) — ★門を壊して確かめる —— 「通るだけの門」と「何も見ていない門」は区別できない。 (節, 壊し方, 期待する文言)。壊すのは表の側で、判定は本物の関数を呼ぶ。
- L222 (ja) — ★実際に踏んだ形 —— 名簿には載るが開けない driver を「開ける」と書く。
- L352 (ja) — ★名簿が「在る」と言うのと、開けるのは別の問いだった。2026-09-25 まで
capabilities() の available 1 欄が両方を兼ねており、dynamixel_sdk を入れた 機械では available: True なのに open_driver("dynamixel") は「その SDK を直接 使え」と断った —— 読んだ人は「対応済み」と受け取る。acquire は既に implemented / available を分けて持っていたので、先に正しかった層の語に 合わせた。ここではその欄が実際の口の振る舞いと一致することを見る。
- L73 (ja) — ★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 (ja) — ★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 (ja) — ★スカラに「0 要素」は無い(2026-09-17、戻りの橋
feature_to_img で feature が初めて入力になったときに気づいた)。この門が探している のは 0/0 なので、空配列の代わりに分母を 0 にする値 0.0 を渡す。
- L147 (ja) — ★2026-10-07: 例外で抜けた op は戻り値を検査していない —— 母数が黙って縮まないよう下限を置く
- L208 (ja) — ★2026-10-07: 例外で抜けた組は検査していない —— 下限(実測 1738 / 1738)
- L244 (ja) — ★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 (ja) — ★2026-10-07: 以前は呼ぶ前に数えていたので、全 op が例外で抜けても n > 700 で緑だった
- L315 — ★這裡棘手的是,這個測試所守護的缺陷在 Windows 上不會重現。實測 2026-09-05:在 Linux(Ubuntu 24.04 / py3.12 / PyPI wheel)上 3 個 op 對退化輸入 SIGSEGV。把相同的輸入送到 Windows 上一個也沒崩潰。所以「本地是綠的」不能作為依據,必須保持在一種能在兩個環境上驗證台賬是否正確生效的形式。 ————————————————————————— #
- 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)。即使傳入純量,得到的也是 (1, 3) 而非 (3,) —— 因為台賬聲明 points = (N, 3)(2026-09-06,fuzzer 的 TYPEMISS 暴露了不一致,於是把實作對齊到聲明)。
- L755 (ja) — ★ 旧日本測地系に近い 3 パラメータでは、同じ緯度経度が地上で数百 m 動く
tests/test_derived_headlines_2026_10_07.py
- L58 (ja) — ★2026-10-07(CI で判明): registry の op 数は入っている backend で変わる(py3.10/3.12 の CI は 910)。 見出し(上)は同梱の名前表だけで決まるので常に照合し、registry 行は完全な registry の環境でだけ照合する。
tests/test_device_open_driver.py
- L36 (ja) — ★「相手が居ない」は「扉が無い」ではない。 この門を最初に書いたとき、
io-modbus が ConnectionRefusedError で落ちて 1 件挙がった —— が、それは 「PLC に届く口が在って、線の先に誰も居なかった」ということで、口が無いのとは 正反対である。だから「この install が実際に開ける driver」からの OSError は通す。一緒くたにすると、門は CI に PLC を繋げと要求し始める —— 繋がりようの ない要求をする門は、やがて外される。
- L83 (ja) — ★pip も import 名も持たない driver は名簿に無い(在れば、その行が 「何も分からない行」なので、ここで落ちてよい)。
tests/test_device_register_driver.py
- L135 (ja) — ★台帳の門は
len(device.drivers()) を数える —— 登録は runtime でそこに 入るので、後片付けを忘れた試験が 1 本あるだけで台帳の門が落ちる (しかも落ちるのは別のファイルなので、原因が遠くなる)。
- L142 (ja) — ★★数だけ見る門は差し替えに盲目。
dynamixel を自前のもので置き換えても 行は 12 のままなので、台帳の門は緑のまま通る。中身(何が implemented か) まで見て初めて、登録が残っていないと言える。
tests/test_docs_index_numbers.py
- L37 — ★op 集合隨環境變化(Linux CI 沒有 torch/kornia/mahotas/xfeatures2d,共 859 op;本地是 885)。把本地生成的文件與活的 registry 比對的檢查,只有在滿配環境下才有意義 —— 與 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)。把本地生成的文件與活的 registry 比對的檢查,只有在滿配環境下才有意義 —— 與 test_opdocs 相同的約定,未齊全就 skip(原因裡會給出缺少的 backend 名)。在 2026-09-07 的 CI 上,有 22 項在這裡落敗。與環境無關的檢查(檔案的存在、內容的量、圖的存在)照常運行。
- L80 — ★只看 Markdown 語法是不夠的。
docs/GALLERY.md 在表格中有 14 處使用 <img src="...">,樸素地掃描 ]( 一個也看不到(在 Codex 的對抗性審查中發現,2026-09-06)。也要看原始 HTML。
- L189 — ★允許標記重複,就會讓一個舊表格殘留下來卻依然變綠。生成器只改寫第一個 start–end,所以第二個會永遠保持舊的並持續被發布(Codex 的對抗性審查,2026-09-06)。
- L210 — ★以前用「有 20 行且能看到 4 個維度名」就通過,但那樣即使掉了幾百個 op 也會變綠(Codex 的對抗性審查,2026-09-06)。要與每個維度的實數一個不落地核對。
- L249 — ★輸出差異在哪裡。不輸出的話,就無法追蹤那種只在整套測試裡才落敗的順序依賴問題(如 registry 污染)。
- L312 — ★只有件數和名字,型別契約(in_sort/out_sort)、類別、HALCON 對應、tier 都會保持陳舊卻變綠(Codex 的對抗性審查,2026-09-06)。RAG 會讀 in_sort/out_sort 來挑選型別能連接的 op,所以那裡陳舊就會自信滿滿地提出連不上的鏈。要連內容一起核對。
- L400 (ja) — ★日本語版だけを見ていた門を 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 (ja) — ★区切りは 1 つとも 2 つとも書かれる —— JSON の中では区切りが二重になる。 一重の形だけ見ていたので 2026-09-25 に二重の形を丸ごと見落とした (最大の漏れが公開 JSON の 164 か所だった)。
- L39 (ja) — ★ここに綴りの例を書かないこと。この門は自分のコメントも読むので、 例として書いたパスがそのまま違反になる(実際に一度そうなった)。
- L41 (ja) — ★
e:\n のようなエスケープ列と LaTeX の q:\, は道ではない —— 区切りの次が n/r/t で語が続かないもの、道に使えない文字で始まるものは外す。
tests/test_dsp.py
- L341 — ★最大值是諧波:period / (1/f_max_bin) 落在整數附近
- L371 (ja) — ★どれも閉形式の真値を持つので、「動いた」でなく「理論値と合う」で検査する。 ————————————————————————— #
tests/test_dualxray.py
- L178 (ja) — ★探針で見つけた: Pb 50 mm の e^{-130} を正規化して「ふつうのスペクトル」を返していた
tests/test_dynsys.py
- L112 (ja) — ★残差の正体は burn-in 。短い burn での誤差は 3 倍以上大きい。
- L123 (ja) — ★r の列を1 本だけ選ぶ。横に幅を持たせると、隣の r の不動点が 別の柝に見えて r = 2.9 でも「3 本」になる(一度それで誤判定した)。
- L66 (ja) — ★mesh_to_voxel は points_to_voxel が optional の torch を要る。CI には torch が無いので 拒否の確認(上)だけ走らせ、通常入力の実行は torch のある環境に限る。
tests/test_example_names_do_not_shadow.py
- L46 (ja) — ★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 名並與 registry 核對,缺一個就以「OPS 裡多餘」落敗)。所以按族宣告。剩下 2 個直接用 torch(fit_zernike / match_logpolar_z)。在滿配環境(CI 的 py3.11,FULLSEYE_REQUIRE_OPTIONAL=1)裡 skip 會變成失敗,所以宣告過多和漏宣告兩個方向都會落敗。
- L87 — ★不傳 PYTHONPATH(這個門的要點)。使用者不會設置環境變數。
- L126 (ja) — ★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 (ja) — ★2026-10-07: 台帳は 256 件の環状バッファ。溢れると
fallbacks() は新しい 256 件しか返さず、 下の「名前が潰れていない」「実在の op 名」は一部だけを見て緑になる(実測 186 件・溢れ 0)。
tests/test_features_do_not_saturate_2026_09_26.py
- L82 (ja) — ★族は6 つ。対称な矩形だけだと、対称性で消える特徴(奇数次モーメント)や 穴を数える特徴(オイラー数)が原理的に動かず、「潰れている」と区別できない。
- L93 (ja) — ★どの族でも一定で、それが正しい op。理由つきで名指しし、下の試験が 「本当にまだ一定か」を確かめる —— 動くようになったら外させられる。
tests/test_fix_op_name_and_range_2026_09_02.py
- L75 (ja) — ★2026-10-07: [0,1] を外れるが、まだ
ops.UNIT_RANGE_IS_NOT_THE_CONTRACT にも載らず 正規化もされていない image op(所有者の判断待ち)。conftest.inputs_for が override の ある op にも sort 既定の帯を返すようにして見つかった。
- L78 (ja) — ★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 (ja) — ★ The MTF identity is a small-footprint approximation and is NOT claimed
- L329 (ja) — ★ far from the optical axis: at ~35 deg elevation the measured transfer
- L330 (ja) — ★ already departs from exp(-…) by more than the on-axis tolerance. This
- L331 (ja) — ★ assert pins that hole so a future “curvature-corrected” resample has a
- L332 (ja) — ★ failing test to turn green rather than a silent regression to argue about.
tests/test_four_f_2026_09_26.py
- L202 (ja) — ★ナイキストのビンを 0 にしたので、この対称性は 1e-16 台で成り立つ
- L288 (ja) — この一覧に門がある種類。★
FOURIER_PLANE_KINDS に足したらここも足す。
- L383 (ja) — ★2026-10-07: 以前は finally で
sys.path.pop(0) していたが、読み込んだ PoC 自身が repo 直下を 先頭に足すので、pop で消えるのはrepo 直下の方で、examples/ がワーカーの終わりまで先頭に残った (event_camera の取り違えと同じ型の漏れ)。丸ごと保存して戻す。
tests/test_fslib.py
- L330 (ja) — backend 横断の一致 —— ★2026-09-14 に実際に壊れていたところ ————————————————————————— #
tests/test_fullseye_3dgs.py
- L78 (ja) — ★道具の有無と資産の有無は別。ここは mujoco の有無だけを見ていたので、 Menagerie が無い環境では
scene_registry.resolve() が返す None を掴んで TypeError になった。同ファイルの test_scene_resolution_via_registry は 既に資産の skip を持っており、作法が兄弟に適用されていなかった。
tests/test_gaits.py
- L99 (ja) — ★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 (ja) — ★2026-10-30: 運動拡大の掃引は振幅を 40 倍にしても指標が 3.93 -> 3.97 で平らだった(64 px 用の読み出しを 160 px の動画に当てていた)。つまみを動かしても絵も指標も変わらないビューアは偽物なので止める。
tests/test_generative.py
- L66 (ja) — ★ head を変えると画布の幅も変わる(矢羽根の置き場が要る)ので、 2 枚を直接重ねることはできない。軸の長さで比べる。
- L84 (ja) — ★ std() は平均を引くので、定数でも 1 ulp 残る(実測 5.6e-17)。 「全部同じ値」を厳密に言うなら ptp(最大 − 最小)。
- L111 (ja) — ★ ptp なら厳密。本物の辺があれば 0.85 前後になる量なので、門は十分厳しい。
- L132 (ja) — ★許容を 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 (ja) — ★bbox は描いた後のインクから取る。PIL の text() は書体の ascent 分だけ 下げて描くので、指定した座標をそのまま bbox にすると字が縦にはみ出し、 無事な字まで「遠い」と出る(実測 0.058〜0.110、床 0.058)。
- L348 (ja) — ★ここで検査するのは 閉形式で言い切れること だけにしてある。 端から端まで(受理率・誤検出)の証拠は repo の外の実写 12 枚で取った (repo の外に置いた実写一式、正本 = glyph コーパスの curated/140)。 合成の場面を 1 枚こしらえて「動いた」と言うのはやめた —— 候補の生成は 局所標準偏差の分位点で切るので背景がざらついていることを要求し、四隅の 精密化は背景の勾配が小さいことを要求する。実写はその両方を満たすが、 素朴な合成(一様乱数の背景)はどちらか片方しか満たせず、合成で緑にすると 「合成に合わせた実装」になってしまう。
- L483 (ja) — ★比(中央値 ÷ 床)は環境で動く(Windows 3 書体 1.90 / CI noto-cjk 2.45)ので、 境にしないし、ここでも値を断言しない。載っていることだけ見る。
tests/test_graphinv.py
- L248 (ja) — 非正方の画像は形の検査で止まる。★正方の画像は重み行列と区別できない(全画素 > 0 なら 全結合として数える)—— 入力が配線であることは呼び手の責任で、op は形しか確かめられない
tests/test_halcon_named_shape_factors_2026_09_26.py
- L277 (ja) — ★同名なのに HALCON と別の量を返すもの。直す予定のものだけをここに書き、 「本当にまだ違う」ことを下の試験が確かめる(直ったら台帳から外させる)。
- L280 (ja) — ★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 (ja) — ★2026-10-18: 以前は float の [0,1] をそのまま渡し、古い Pillow がバイト列を読み替えて黙って通していた (Pillow 13 で発覚)。本物の 8 bit に直してから JPEG を通す。
tests/test_kendama_combo.py
- L21 (ja) — ★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 (ja) — 歴史側で試す点。★0.5 を含める —— 0.5 は「まん中」として既定値に使われて いる(
api.apply の既定、studio の中央、保存済みプログラムの初期値)ので、 ここが新しい側に落ちると既定のまま呼んだだけで答えが変わる。 最初 b < 0.5 で切ったら、gaussian と HALCON 別名の一致検査まで割れた。
tests/test_ledger_contracts.py
- L55 (ja) — ★同日の 2 回目: 探針側の builder(
ledger_contracts.probe_builders)で 2,055 / CI 相当 2,019 に上がったので床も上げた(床を据え置くと、builder が黙って外れても気づけない)。
- L61 (ja) — ★空入力(h)と効かないノブ(f)の探針は同じ 1 回の探針に相乗りさせる (引数と結果を使い回す)。別モジュールで回し直すとスイートが 50 s 余分にかかる。
- L419 (ja) — ★2026-10-12 方針 A: 黙って値を返す op(zz_gap_silent)と生の例外(zz_gap_raw)も門になった。 「空なら空」と書いて値を返す op・書かずに ValueError で断る op は通る
tests/test_llmcore.py
- L48 (ja) — ★許容差を入れない。-inf の exp は厳密に 0 になる。
tests/test_mathops.py
- L518 (ja) — 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 (ja) — ★極は標本に乗れないので偶数格子で(零点と違って値が数にならない)
- L1485 (ja) — ★数学の図はきれいなので、合っているかを誰も確かめない。ここでは絵を一度も 見ずに、定理と既存 opだけで合否を決める。 ————————————————————————— #
- L1563 (ja) — ★円は (p/q, 1/(2q^2)) に載っているので、接触は 2 次元の距離で見る。 x の差だけで測ると 0/1 と 1/9 のような組を「接していない」と読む (距離 0.1111 対 半径和 0.5062)—— 最初これで落ちた。
- L1683 (ja) — ★ムーア曲線は閉じている(最後から最初に戻れる)。ヒルベルトは閉じない。
tests/test_mcp_images.py
- L331 (ja) — ★最初
ones + inf にしていて、有限部が定数なので免除 op でも「定数」判定になり 落ちた —— それは診断器が正しい。確かめたいのは「免除 op なら非有限を異常と 言わない」だけなので、有限部に変化のある入力にする。
tests/test_mcp_server.py
- L160 (ja) — ★引数名を
name にしていて _call(4, "fullseye_op_help", name="gaussian") が TypeError になり、subprocess の実 stdio 往復が 1 度も走らないまま 23 件が緑だった(2026-09-15)。走らなかった検査は無いのと同じ。
- L208 (ja) — ★最初
gaussian が先頭と決めつけて落ちた。gauss_filter と gaussian は同じ HALCON 別名を共有する別 op で、api.find_op は name == halcon の正典を優先する。 検索もその規約に揃えたので、正典が先頭・gaussian が上位に居ることを見る。
- L421 (ja) — ★以前の被験者は台帳経由で索引に入ったこと(= 索引が台帳を数えている)も見る
- L452 (ja) — ★2026-09-17 に
b は「未使用」から端の扱いを選ぶつまみになった。 ノートがその意味と歴史側の帯を両方書いていることを固定する —— どちらか片方だけだと、保存済みプログラムを読む人が挙動を誤解する。
- L494 (ja) — ★同日実測: 4 層で 480 枚が「どこにも無いノート」に見えたが、5 層目(ledger)で 480 / 480 が解決した。ここが 0 でなくなったら、まず引き忘れた層を疑うこと ([[feedback_search_all_tiers_before_declaring_a_gap]])。ノートの残骸と決めつけない。
tests/test_mcp_wheel.py
- L215 (ja) — ★数を直書きしない。9 本目(fullseye_fix_text)を足したとき、この門は CI の core ジョブでしか走らず、手元のスイートは緑のまま CI だけ赤になった(2026-09-18)。 正本は checkout の TOOLS —— wheel が同じ集合を名乗ることを見る。
- L225 (ja) — ★順位を 3 位までに固定していた門は、新しい op(gauss_quadrature、2026-10-03)が「gauss」に正しく当たっただけで CI の core ジョブ(ここでしか走らない)を赤にした。見たいのは「2-D レジストリの op が索引の層から出る」こと。
tests/test_meshres.py
- L107 (ja) — ★2026-10-07: ここにあった
abs(pc_density(P[inner])["nonuniformity"] - 1) < 1e-9 or True は or True で常に真だった。実測 1.9121 —— 内側だけを切り出すと、その部分集合自身の縁で 近傍殻が欠けるので一様にはならない(主張そのものが誤り)。上の spacing の検査が本題なので削除。
tests/test_msa.py
- L80 (ja) — ★この恒等式は交互作用を残すモデルの性質なので、モデルを明示して問う。 既定の “auto” は規格の手順に従って交互作用を誤差へ畳むことがあり、そのとき EV^2 は「升目ごとの分散の平均」ではなく「畳んだあとの平均平方」になる。 (この門は実際にその切替を捕まえた —— 既定を変えた瞬間に落ちた)
- L91 (ja) — ★★連鎖ファザーが
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 (ja) — ★表の脚注が「α = 0.05 で判定」と書いているので、表の再現を名乗る門は その α を明示して通す(既定 0.25 の妥当性とは別の話)。この例題では F = 0.434 がどちらの α でも非有意なので、結果はどちらでも同じ。
- L794 (ja) — ★区間の端は標本の分位点なので 1/sqrt(n) で揺れる。実測(種 8 本): n=200,000 で標準偏差 10.0 / n=1,000,000 で 4.2。偏りではないので、n を 決めた上で揺れの 3 倍で採る(「小さい」ではなく「この n ならこの幅」)。
- L814 (ja) — ★境界を渡さなければ検査しない(勝手に 0 を下限と仮定しない)
- L863 (ja) — ★端点は位置の揺れを拾うので、幅でも別に見る(こちらは sd 0.0035)
- L887 (ja) — ★許容は測った揺れから取る。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 (ja) — ★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 的環境裡,這一個檔案的 import 失敗會讓整體停下 —— pytest 會因 collection error 中斷,不再跑剩下的(2026-09-05,CI 在 2 分鐘內死掉,一個測試也沒跑)。降為 skip,別把別的也拖下水。
tests/test_op_contracts.py
- L53 (ja) — ★2026-09-14 実測: 901 op 中 151 本(16.8 %) がこの状態で、空ループを 1 周 しただけで緑を返していた —— 「門が判定を計算した直後に捨てる」の親戚で、 こちらは 判定を一度も計算しない。まず skip で見えるようにし、
test_probeless_ops_do_not_grow で本数を台帳に固定する(減る分には通る)。
- L57 (ja) — ★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 (ja) — ★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 (ja) — ★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 (ja) — ★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 (ja) — ★2026-10-07(CI で判明): optional backend が無い環境の ImportError は「劣化」ではなく 「この環境では走らない」—— requires_backend と同じく skip(py3.11 の完全環境では失敗にする)。
- L279 (ja) — ★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 (ja) — ★guard 越しでは「例外なし」は自明に真 —— 劣化の台帳で本当に走ったかを見る
- L338 (ja) — ★非有限がその 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 (ja) — ★guard は非有限の出力を置き換えてから返す(source=output で台帳に残る)。 上の assert は置き換え後を見ているので、台帳の側で「置き換えが起きていない」を確かめる。
- L388 (ja) — ★fallback の値は自明に決定的 —— 比べたのが op 本体の出力であることを台帳で確かめる
- L446 (ja) — ★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 (ja) — ★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 (ja) — ★2026-09-17 に 3 -> 5。1-D の局所標準偏差と mu 則圧伸を足したため。 新しい 2 件は 1-D 実装に 2-D を渡すと ValueError で鳴る(既存の
lowpass と同じ、正しい向き)。危ないのは逆で、下でその 1 つを固定する。
- L262 (ja) — ★フォールバックの警告は 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 的實測。這是「不讓它比這個數更差」的止動,而非目標值。台賬 1,002 個 op 中,進入範例索引的只有 349 個,上面那兩個「100 %」之所以成立,是因為母集合三層裡只有兩層。經過與按族的分解 = docs/KNOWN_ISSUES.md §38。
- L32 — ★op 集合隨環境變化(Linux CI 沒有 torch/kornia/mahotas/xfeatures2d,共 859 op;本地是 885)。把本地生成的文件與活的 registry 比對的檢查,只有在滿配環境下才有意義 —— 與 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 (ja) — ★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(registry 901 個的 24 %)作為 “uncallable” 素通。「門站在正確的位置」和「門把全部都通過」是兩回事 —— 拓寬的第一次就暴露出 tb_angle_3points 在探針下一次也跑不起來(註冊是 points->feature,實體卻取 3 個向量)。
- L85 (ja) — ★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)。「壞了」和「這個環境裡沒有」是不同的判定,混在一起就會把環境差異當成實作的 bug。在滿配環境(FULLSEYE_REQUIRE_OPTIONAL=1)裡照舊按失敗處理。
tests/test_opdocs.py
- L212 — ★2026-09-03:由於所有 backend 的 _safe 都匯聚到了 backend_safe.guard,所以按 guard 立起的結構化標記來判定,而不是按 qualname 的字串匹配(guard 也會在 qualname 裡留下 “_safe(…)”,但那是給顯示用的)。
- L769 (ja) — ★2026-10-12: 図が無い理由(
gen_op_figures.DOMAIN_MISMATCH の値)も T() を通すので、その表の原文もキーとして正しい
- L885 (ja) — ★2026-10-12: 本文の訳が 2,212 本そろい、実データに「本文だけ未訳」の op が無くなった (以前はここで実在の頁を 1 枚選んでいた → StopIteration)。将来 op を足した瞬間に通る道なので、 本文の訳を 1 本だけ外した状態で生成器を直接呼んで固定する(test_notice_when_nothing_is_translated と同じ作法)。
- L1238 — ★沒找到的原因:
ops.REGISTRY(899)與 2-D 筆記(899)一致,所以只要從 registry 一側計數就會看起來「零缺失」。曾經這樣下結論並搞錯了。所以這個門從跨 tier 的索引一側計數(memory: feedback_search_all_tiers_before_declaring_a_gap)。 ————————————————————————— #
tests/test_optdraw.py
- L285 (ja) — ★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 移除前的殘骸被重新打包進去)。這是讀設定的檢查抓不到的事故,所以由 tools/ci_wheel_check.py(unshipped_present)與 ci.yml 的大小上限去看 wheel 實物。目錄也被移到了 package 外(tools/fops_article/)。這裡要求明示排除(作為保險)。
tests/test_pivops.py
- L621 — ★只看名字級別的
PARAM_HINTS,會讓門比 fuzzer 更窄。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 數。在共享 runner(2–4 vCPU)上,6 路平行只會把每一條拖慢,總時間並不縮短,等 PoC 增到 84 個時,每個 job 都撞上了 pytest 的 900 秒 timeout(py3.10 / 3.12)。本地(12 核)照舊以 6 或以上運行。
- L73 — ★
PYTHONPATH 不傳(2026-09-09)。長期以來一直傳 PYTHONPATH=<repo>,但那是使用者不會做的設置,意味著門離事故發生的地方偏了一步 —— 由於同樣的盲點,examples/piv_flow_from_particles.py 等一直停留在「從 checkout 直接運行就 ModuleNotFoundError」(那一側連運行的門都沒有,所以沒被察覺。test_example_scripts_run.py)。PoC 一側 116 個裡有 108 個自己把 repo 根目錄加進 sys.path,剩下 8 個只 import fullseye,所以去掉後全數通過(已實測)。
- L87 (ja) — ★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 (ja) — ★stdout は 4000 文字残す。1200 だと章の後ろだけが見えて、前半で 落ちた検査の実測値が CI から読めない(2026-09-24、poc_endless_zoom の 10 番目が落ちたとき「NG が残っている(10 番目)」しか分からなかった)。
- L108 — ★2026-09-07:這裡長期返回 0,從而素通了下面的
assert code == 0 —— 一個剛算完合否就丟棄的門(實測:有 3 個 PoC 從不列印 PASS —— poc_dic_strain / poc_photoelasticity / poc_thermography_ndt)。改為返回 -2 讓它落敗。
- L140 (ja) — ★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 一次性集中運行(session fixture)。這段時間會計到第一個測試上,所以 pyproject 的預設 timeout(900 秒)在共享 runner 上會落敗。只在這裡放寬 —— 放寬預設會連帶鈍化其他測試的掛起檢測。
tests/test_printpath.py
- L332 (ja) — ★頂点より少ない標本は既定で拒否(長さが縮んで濃淡の再現が壊れる)
- L369 (ja) — ★完全な係数列で呼ぶ(打ち切ると尾のエネルギーが分からず予言が下界になる)。 parametrisation は “index” —— stroke_resample_closed がすでに弧長で 打ち直しているので、ここで “arclength” を選ぶと op が内部でもう 1 度 打ち直して別の輪郭の係数になる(弧長の打ち直しは冪等でない)。
- L454 (ja) — ★目標の濃さに合うペン幅を閉形式で解くと、偏りが桁で縮む
tests/test_profileops.py
- L206 (ja) — ★2026-10-07:
or True を外した。実測 none=-0.003086 < rigid=-0.001662 < 0.5*none=-0.001543
tests/test_public_reachability.py
- L76 (ja) — ★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 (ja) — ★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 (ja) — ★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 (ja) — ★2026-10-02: コメント行の
[[feedback_...]] で非貪欲の \] が止まり、py-modules 407 本のうち 68 本しか数えていなかった(339 本が門に映らない)。コメントを剥いでから囲みを取る。
- L130 (ja) — ★2026-10-07: optional 依存が無いと import できない出荷モジュール
{module: 許す欠落依存}。 以前は except Exception: continue でどんな import 失敗も母数から黙って外していた —— 壊れたモジュールは「不可視の関数」の数にも島の検査にも入らず、ラチェットはむしろ緑に寄る。 ここに無いモジュールの import 失敗、ここにあっても別の理由の失敗は赤。
- L164 (ja) — ★2026-10-02: 4 つ目の公開経路 = 知覚 facade(fullseye.vision.<群>.<関数>、halcon_facade_map.json の "module.func" が実体)。HALCON 章の実装(segmentation.py 等)はここからだけ届いていた。 py-modules の数え漏れ(68 → 408 本)を直した途端に 35 モジュールが「見えない」と出たが、 その多くは facade 経由で届く。利用者が呼べる経路は全部数える。関数>群>
- L172 (ja) — ★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 (ja) — ★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 (ja) — ★問題集は文脈の表と同じ書き手が同じ日に書いた —— 独立な評価ではないので、床は「後戻りしない」ことだけを言う。
tests/test_raster.py
- L26 — ★裸的 import 在缺失該項的環境裡會中斷整個收集(實測 2026-09-05)。
tests/test_raytrace3d.py
- L276 (ja) — ★2026-10-15: 傾いた鏡(摂動)の後で像面と平行に進む光線を、以前は rms 3.4e18 mm の有効な点として数えた
tests/test_roughness_robust.py
- L75 (ja) — ★α は op の定数を読まず、ここで ln2/π から作り直す(両辺に同じ入力を渡す門は無効)
tests/test_runner_scratch_families.py
- L38 (ja) — ★宣言された家族。key = “."、値 = 守り方の説明。 ここに無い関数が ``_bind_args`` を呼んでいたら、この門は落ちる。
tests/test_rust_abi_parity.py
- L402 (ja) — ★契約では FS_E_INVALID_ARG(引数が定義域の外)であって FS_E_TYPE ではない。
FsValueError を足すまでは両方 FsTypeError で、Rust が 1 を返すのに Python は 2 相当を投げる、という状態コードの食い違いが残っていた。
tests/test_sample_data.py
- L125 (ja) — ★台帳は前からあったのに、人が読む
docs/ops/SAMPLES.md には出ていなかった (2026-09-16)。表の列は id / 種別 / アクセス / URL だけで、ライセンスと商用可否は ソースを読まないと分からなかった —— 看板(「DL URL / ライセンス」)と中身がずれて いた。出す側を直したので、ここでは台帳が空欄を作らないことを固定する。 ————————————————————————— #
tests/test_scale.py
- L63 (ja) — ★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 (ja) — ★e: 細かい周期を持つ画像。変換ドメイン(ウェーブレット)・非局所平均・ LBP はここで初めて割れる。乱数でなく決まった模様にしてあるのは、 乱数だと対称性の破れが隠れるため。
- L77 (ja) — ★f: 小さな粒と穴が多数ある画像。面積で選ぶ op(remove_small_holes / select_shape / diameter_opening)は、粒がタイル境界で切られて面積が変わる ことでしか壊れない —— 大きな構造しか無い探針では 0.0 のまま通る。 種を固定してあるので実行ごとに同じ(乱数そのものを検査対象にはしない)。
- L81 (ja) — ★種は 2 つ持つ。1 つの種は「構造の 1 標本」でしかない ——
xsk2_isotropic_close は種 0 と 7 で誤差 1.0(全く別の結果)、種 1 と 20260917 では 0.0 だった。半分の種で割れる op を「タイル安全」と呼ばない ために、当たり外れのある探針は複数枚そろえる。
- L92 (ja) — (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 (ja) — 宣言表 —— 成分ごとの尺度指数。★新しい op を足したらここにも書く(完全性を門で見る) ————————————————————————— # 周囲長を経由する量は、ラスタ化の偏りで p が厳密に出ない(docs/KNOWN_ISSUES.md §50)。 そこだけ許容差を広げ、理由を名前で残す。
- L86 (ja) — ★HALCON の同名演算子は正規化しない中心モーメントを返すので、本来は p=4 / 5 / 8 になる。この repo は 1 スカラーへ合成する際に Hu の正規化 不変量を使っており p=0 である(docs/KNOWN_ISSUES.md §52、巡 13 で直す)。 ここは あるべき値を書き、直るまで strict xfail で開いたままにする —— 免除台帳に「例外」として畳み込むと、直ったことに誰も気づけない。
- L101 (ja) — ★§52 が直るまで落ちる 3 本。
strict=True なので、直った瞬間に「予期せぬ成功」で 落ちてこの表を直せと言ってくる(黙って通り続ける免除にしない)。
tests/test_segcompare.py
- L120 (ja) — ★最初は逆に読んで赤になった —— 名前は閉形式の門(半分に割ると split が m/N)で固定してある
- L126 (ja) — ★scikit-image の precision は正解側の対で割っている(コードは truth x test の表の行和)= こちらの recall。docstring は「test の対で割る」と書くので、名前が入れ替わっている。 F 値は対称なので誤差そのものは一致する。
tests/test_segmentation_halcon.py
- L496 (ja) — ★2026-10-02: 同じ台帳に score(segeval)/world(segworld)のカテゴリが足された。HALCON の 9 本は 4 カテゴリの中にちょうど 9 本、他のカテゴリの op は segmentation.py の物ではない。
- L499 (ja) — ★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 (ja) — 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 (ja) — ★種は乱数を引かない(探針の種は型名の順に同じ乱数列から作られる)
tests/test_spc.py
- L237 (ja) — ★台帳 opsspc は 2026-10-12 から 2 モジュール(spc と pod)を載せる。比べるのは 「spc モジュールの op」どうし —— pod 側の一致は tests/test_pod.py が見る。
- L247 (ja) — ★真値は導出した恒等式と既存 op。当てはめた数字を固定しない。 単位空間の MD² の平均はちょうど (n-1)/n で、教科書の「平均 1」を有限標本で 正確に言い直したもの。1.0 を固定する試験はどんな標本でも間違いになる。
- L320 (ja) — ★この列の std は 0 ではない。4.2 を 200 個並べただけで丸め屑が 1.3e-14 残る(実測)。
std == 0.0 で判定していた最初の版はここを取りこぼし、 その屑で割った距離が意味を失っていた。屑が在ることを門に書いておく —— 絶対判定に戻したらこの行が落ちる。
tests/test_specularity.py
-
L790 (ja) — ★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") 固定指向 registry —— 這個 fixture 什麼都沒隔離(2026-09-05,registry 裡殘留了 pytest 的路徑)。用環境變數把本體一側的入口 studio._settings() 指向 ini。
- L2066 — ★直接建構
QSettings("Fullseye", "Studio") 會繞過隔離,寫入使用者的登錄檔(2026-09-05 的稽核確認了實際危害)。設定入口保持為一個。
- L89 (ja) — ★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 (ja) — ★2026-10-13: 抜き取りを「名前の SHA-1 の小さい順に 60 本」にした。等間隔の抜き取り (names[::len//60])は、前の方に op が 8 本足されただけで 60 本がまるごとずれ、 見本で走る数が 26 → 17 に落ちて門が鳴った(偏光の 8 op は 1 本も抜き取りに入っていない = 窓の欠陥ではなく抜き取りの揺れ)。名前の指紋で選べば、op を足しても既存の 60 本は 新しい名前が指紋の上位に割り込むときしか変わらない。この抜き取りの実測は 60 本中 22 本。
- L143 (ja) — ★返り値が 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 因一次 import 失敗就不再執行其餘全部)。2026-09-05 實測。
tests/test_telecentric.py
- L38 (ja) — ★2026-10-15 まで raytrace.chief_ray は入射瞳を狙い、物体側テレセンでは ValueError で止まった。 いまは入射瞳が無限遠なら絞りを狙う —— この層の主光線と同じ像の高さになること。
tests/test_threshold_polarity_2026_09_26.py
- L35 (ja) — しきい値「方法」の名前。★op 名から拾うので、新しく足した方法も自動で門に入る (免除台帳に名前を書かない限り)。綴りで探す門は綴りが違うものを見逃すので、 説明文も一緒に見る。
- L43 (ja) — ★暗い側が答えで正しい op。理由つきで名指しする —— 台帳が黙って腐らないよう、 下の試験が「本当にまだ暗い側なのか」を確かめる。
tests/test_trust_block.py
- L151 (ja) — ★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 (ja) — ★2026-10-18: 先に索引を版の行とぴったり揃えてから 1 本足す。揃えずに足すと「厳密一致で 何件落ちるか」が、リリース後にどの層が増えたかで変わる(ops3d の op は 2-D 橋 tb_* も 生むので registry も 1 増え、2 件のはずが 3 件になった —— 門ではなく数え方の偶然)。
tests/test_vacuous_assertions.py
- L62 (ja) — ★他の試験の docstring に
\* 等が在ると ast.parse が DeprecationWarning を出す。数えるだけの処理なので黙らせる (門の出力に無関係な警告を 84 ファイル分足さない)。
- L95 (ja) — ★書き下した列(
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 (ja) — ★2026-10-07:
or True を外した(実測: マスク外で vol と違う 7783 画素はすべて 0)
- L567 (ja) — ★これらは「HALCON がボクセル型を持たない」ことを理由に足した族なので、正しさの 根拠は幾何が保証する真値しかない。だから全部、真値の分かる形(球・立方体・ トーラス・既知 sigma の白色雑音)で検査する。 ————————————————————————— #
tests/test_wave.py
- L85 (ja) — ★J’_0 の零点と比べると合わない —— 取り違えを門で固定する
tests/test_wingpoc_gallery.py
- L172 (ja) — ★英語側は展示数を指す句に限定する。英語の数詞は散文に普通に出るので (two separate numbers / two opposite kinds)、広く拾うと誤検知だらけになり、 誤検知だらけの門は消される。日本語の「N 点」は展示を数える言い方なので広いまま。
- L252 (ja) — ★入れ替える 2 件は受入日が違うものを選ぶ。同じ日の 2 件を入れ替えても 何も壊れないので、それで「捕まえた」と言うと破壊試験が嘘になる。
textregion.py
- L92 (ja) — ★幅 1 のストローク(2026-09-27 実測: size 16 のフォントは縦の連が 1 px で、行の再現率が 雑音に依らず 0 % だった)。境界画素の 1 歩先が既に地なら、その画素だけの幅 1。 勾配は 1 px の棒では消えて向きが定まらないので、勾配を使わず 4 近傍で決める: 上下がともに地、または左右がともに地なら、その画素の幅は 1。
- L103 (ja) — ★2026-10-30: 「出来れば全 PoC を載せたい」。初版は 80 本で切っていた。台帳の PoC は手書きの見どころか この一括のどちらかに必ず載る —— 載らない PoC があれば理由(図が無い・数が無い・分類の無い翼)ごと止める。
- L45 — ★目錄、提示和轉接器以出貨模組
typed_catalog 為正本(2026-09-05)。以前它們住在這裡,backends_typed 把 tools/ 加進 sys.path 來讀取 – 結果在 wheel 中 tb_* 143 op 悄然消失。把方向反了過來。
- L284 (ja) — llmcore(2026-09-24): tokens は画像パッチを種にする。★一様乱数だと どの行も似た向きになり、注意の重みが全行ほぼ一様になって「走ったが 意味のある出力でない」側に落ちる。滑らかな画像を 8x8 で切ると、 近い場所のパッチが近い向きを向く = 注意が構造を持つ。
- L305 — 事件位置(點過程)– point_spectrum 的入口。★不要只用均勻隨機:沒有週期成分就一次也不會觸及「尋找週期的 op」的有意義行為,所以用把 12 個無關事件混入週期 17.0 序列的結構化資料作種子(隨機-only 的測試會隱藏結構缺陷,是本 repo 的規律)。
- L503 (ja) — ★rng を 1 つも引かない —— 探針(ledger_contracts)は種を型名の順に同じ乱数列から作るので、 ここで乱数を引くと型名が後ろの種(image2d / matrix / signal …)が全部ずれ、他族の op の判定が 動く(2026-10-15 に実測: 無関係な 6 op が「拒否」に、11 個のノブの判定が入れ替わった)。
- L508 (ja) — ★design と同じく rng を 1 つも引かない(種は型名の順に同じ乱数列から作られる)。模型の観測は simcal の内側の固定の種(20261015)で作るので決定的。
- L813 (ja) — ★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 命中這條路徑,fuzzer 自身停止了(不是 op 的缺陷而是工具的缺陷。無法綁定的輸入約定為跳過而非拋出例外)。
- L1298 (ja) — ★単位空間は渡さない(渡すなら 3 つ全部)。渡さない形は「データ自身から 作る」訓練時の呼び方で、ファザーが最も広く回せる。
- L6930 (ja) — ★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 (ja) — ★obs2 の 2 点目は台車 0 の終点から (−0.15, 1.0) ずらした所: 射影の角 0.1 → 0.2 rad で終点と点の順が入れ替わり、 組紐語が変わる(角が「効かないノブ」に見えない入力。類が同じかは角に依らない —— それは門が別に見る)。
- L8120 (ja) — ★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 都只接受上面兩種形狀,其餘的都以 “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) 的 3 個 adapter 改成了 axis=1。長度不同的兩條(histogram 的 counts/edges)也不是「對」,予以拒絕。
- L8374 — ★「恰好 2 個元素」與 pose(用
len >= 2 允許 info)是刻意不同的。實測 2026-09-02:把 mesh 作為單個引數接收的 4 個既有 consumer(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 (ja) — ★2026-10-11:
system キーに最適化後の処方(同じ object_mm = inf)
- L8585 (ja) — ★2026-10-15: 絞りと像面の前の面は平面(R = inf、lens_system の規約どおり)
- L8587 (ja) — ★2026-10-15: 図の values に処方の平面の R = inf と、無焦点の EFL / BFL = inf、 分散の無い媒質の ν_d = inf を写す(lens_system の規約どおり)
- L8590 (ja) — ★2026-10-15: 非共軸の系(raytrace3d)は面の R = inf・物体の inf を記録に持ち、 ゴーストの表・光線の束は「届かない光線 = NaN」(trace_rays と同じ規約)、 図の values にも平面の R = inf を写す。opd_samples は瞳の外 = NaN、 with_wavelength は処方(object_mm = inf)をそのまま返す。
- L8597 (ja) — ★2026-10-19: 照準 / ケラレ係数を設定した処方もそのまま返す(R = inf、object_mm = inf)
- L8599 (ja) — ★2026-10-18: .zmx から読んだ処方(lensfile)は lens_system そのもの(物体が無限遠 なら object_mm = inf、平面の R = inf、ファイル側の面の表の DISZ = INFINITY)
- L8602 (ja) — ★2026-10-19: 構成ごとに解決した処方も lens_system そのもの(R = inf、object_mm = inf)
- L8604 (ja) — ★2026-10-19: 硝材置換・大域探索は処方(R = inf)を入れ子で返す
- L8606 (ja) — ★2026-10-19: 最適化後の処方(R = inf)を返す
- L8608 (ja) — ★2026-10-20: 解を解いた・解を外した・afocal の・像面を曲げた処方(R = inf、object_mm = inf)と、 その解の一覧(R = inf の行)を返す
- L8631 (ja) — ★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 (ja) — ★2026-10-07: プロセスごとに分ける。固定名だと xdist の別ワーカーが同じ捨て場を共有し、片方の テストが「中身を消してから、何か落ちたことを確かめる」間に相手が消す/書く(Windows では開いている ファイルの unlink が PermissionError)。
- L456 (ja) — ★探針が作る
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 中也能 import 到 tools/ 下(未隨附的 chain_fuzz 等),於是就在「能看到 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 — ★這裡會犯兩次錯。fuzzer 的
run_chain(1)把輸入型 any 當作「總是齊備」(從池中任意抽取),(2)在 OP_ARG_BUILDERS 中註冊的 op 自行組建引數。不把這兩點算進去,就會把實際上每次都在執行的 op 報告為「結構上不可達」(實際上對 fuse_to_voxel / register_cross 誤報了)。可達性不是由「只看型」決定的 – 一部分可達路徑在程式碼這一側。
- L89 (ja) — ★2026-09-14 追加。45,000 ケースを 3 秒で「食い違いなし」と言われたとき、 信じるのではなく自分が printf で挙げた「踏んでいない座標」を足す。 一致したときこそ探針を疑う([[feedback_one_probe_input_is_not_coverage]])。
- L185 (ja) — ★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 (ja) — ★しきい値は画像に実在する値から引く。独立に引いていたときは 41% が 「選択 0 画素」で、物体が 2 個以上あるのは 14% だけだった ——
connection の 分岐(斜め接触・入れ子・多数)をほとんど踏んでいない。乱数で撒くと空ばかりに なるのは、しきい値も探針の一部だから ([[feedback_one_probe_input_is_not_coverage]]: 探針は入力画像だけではない)。 2 割は「当てずっぽう」のまま残す —— 空・全面・範囲外という端も要る。
- L236 (ja) — ★R-3 の相対→絶対の写像と画像の形。契約の関数なのに観測していなかった。
- L265 (ja) — ★
fs_region_runs は契約が「領域表現の唯一の窓」と呼ぶもの。それを 観測していなかった —— 面積と本数が合っていても、run の切り方が違えば run-length と dense mask は別物として振る舞う(隣接 run を結合するか、 行内の並びは昇順か)。観測していない性質はケース数では出ない。
- L295 (ja) — ★並びそのものを観測する。
sorted して比べていたので、物体の順序を逆にする 変異が 3,000 ケースで 1 件も殺せなかった(2026-09-14 の変異解析)。契約は 「最初の run の (row, col) 昇順」と明記しているのに、門がどこにも無かった —— 観測していないものは、どれだけケースを撒いても出てこない。
- L337 (ja) — ★R-3 の相対→絶対の写像そのものを観測する(契約
fs_image_absolute)。
- L351 (ja) — ★種別を捨てない。ここは長らく固定値 1 だったので、
_status_of を 書いて compare にコード比較まで足したのに、Python 側が常に 1 を 名乗るせいで状態コードの食い違いが構造的に出なかった(変異 m8 が 3,000 ケースで殺せなかった正体)。観測を足したつもりで足しきれて いない、という [[feedback_gate_computed_a_verdict_then_discarded_it]] の型。
- L381 (ja) — ★コードの値まで見る。「どちらも拒否した」で止めていたので、 契約が FS_E_INVALID_ARG(1)と決めている所で Python が FS_E_TYPE(2) 相当を投げていても素通りしていた(2026-09-14 に実際そうだった)。
- L390 (ja) — ★許容差は値域に対する相対で取る。絶対値で 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 (ja) — ★「描く」= 機械に線を引かせる層(2026-09-22 追加)。「見せる」が人に見せる ための絵なのに対して、こちらはペンプロッタ・レーザー・刺繍のように 線でしか描けない機械への変換で、出口が G-code になる。
- L75 — 分類的英文名。★即使在英文版中也只有標題還是日文(實測 7 行)– 內文用
title_en / _summary_en 翻譯過了,卻忘了翻譯標題,成了「切換了卻混著日文」的典型。此處沒有的分類照原文輸出(不擅自造譯)。
- L91 (ja) — ★レシピ欄がまだ無い能力(理由つきで名指し、免除は縮める側)。 レシピ欄は 2026-09-15 に当時の 16 件 + 新設 8 件 = 24 件へ付けた(ブランチ rag/recipes-and-help)。そのブランチが本線に入らないまま 1 か月が過ぎ、その間に 足された能力 32 件には欄が無い。2026-10-15 に移植したとき、その分の連鎖・限界・ 実寸校正を確かめずに書き足すことはしなかった(型の門は通っても、限界と校正の文が 実測でなくなる)。欄を埋めたらここから消す —— 消し忘れは :func:
load_all が落とす。
- L132 (ja) — ★型付きの連鎖で書けない能力(ファサードの API で、(画像, a, b) の op ではない)。上の「後で書く」 とは理由が違う: 推奨パイプラインの各段は OP_INDEX の in/out の sort で型検査されるが、ここは 仕様(辞書)を書き出す関数で、画像の連鎖の途中に置けない。限界は本文の「向かない」に書いた。
- L48 — ★對照表放在與運算子文件不同的檔案裡。若用
opdocs.T,取用的原文會進入 opdocs.SEEN_STRINGS,現有的「框架譯文有缺口」門就會把這 604 條全部算作缺口而使 CI 變紅——那道門是為了讓框架文案在五種語言上齊全,而這裡是「譯到哪算哪」的性質。混在同一張表裡,會讓一邊的規矩毀掉另一邊。
- L82 — ★一塊 = 從含有 ★ 的行開始、以相同縮排接續的
# 註解行的連續。也拾取 Sphinx 風的 #: 註解。只剝掉 # 和空白,開頭會留下一個 :
- L84 — 殘下來,產物裡就會出現「: ★…」(實際出現過)。
: 也在這裡剝掉。
- L128 — ★下一個 ★ 到來時切成另一塊(保持一塊一個主張)。
- L220 — ★不翻譯標記,固定為
_(ja)_。按語言翻譯它會讓機器無法計數 – tools/i18n_status.py 是數「沒有標記的日文」的工具,所以標記若隨語言變化,593 行就會變成「隱藏的日文」(實際變了)。ja 是語言代碼,也向讀者傳達「這是日文」。
- L253 (ja) — ★2026-10-07: 言語版の目次 INDEX..md もノートではない(以前は 5 本を数えて 3089 本を 3094 本と書いていた)
- L281 — ★筆記的集合從台帳取(不去列舉檔案)。2026-09-06 的對抗式複查(Codex)中,glob 檔案並數 stem 的版本混入了一個
docs/ops/SAMPLES.md(不是 op 筆記),於是索引是 1,842、RAG 指南是 1,843,同時公開了互相矛盾的數字。筆記從 records 以 1:1 生成,所以 records 裡的名字就是「有筆記的名字」的定義本身。與檔案的一致由 tests/test_docs_index_reachable.py 另行檢查(偵測消失/多餘)。
- L291 — ★用
__all__ 而非 dir(fullseye)。dir 包含模組屬性(os / sys / warnings / annotations),而且在別的測試 import 之後會增加一個(1094 → 1095),所以漂移門只在整套件裡失敗(2026-09-06)。公開面是門面在 __all__ 中宣告的 1,091 個名字。
- L340 — ★索引不只是給人的,也是 AI 的檢索面(2026-09-06 使用者的指出「索引也是被當作 RAG 使用的部分吧?」)。op 筆記兼作 AI 編碼輔助的檢索語料,所以在索引裡明示機器讀取的入口。把只有一半的東西寫成「全部 op」,RAG 就會對剩下的一半自信滿滿地弄錯 – 所以
_honest() 的實測行不從本節移除。
- L498 (ja) — ★2026-09-14: 長らく かな だけを見ていたので、「Studio 北極星」「実測記録」 のように 漢字だけで書かれた題に印が付かなかった —— 非日本語版の読者は それを英語の題だと思ってクリックする(印を付けないのは「読めない」という 事実を隠すことで、無訳より悪い、というのがこの関数の趣旨そのもの)。 題は常に日本語版ファイルから取る(
_doc_title(rel))ので、漢字を足しても 中国語の題を誤って日本語と呼ぶことは起きない。
- L518 (ja) — ★2026-10-11: 訳文ファイル(
X.zh.md など)の題はその言語で書かれている。以前は 日本語版と同じく漢字で判定して (ja) を付けていたので、中国語版の索引で中国語の文書が 「読めない日本語」と表示されていた。印はファイルの言語で付け、自分の言語なら付けない。
- L529 (ja) — ★2026-10-11: 日本語の原文にこの言語の訳があるなら、訳の題と訳へのリンクを先に出す (以前は英訳があっても英語版の索引が日本語の題と日本語版へのリンクしか出さず、 読める版があることが索引から分からなかった)。原文が日本語であることの印は残す。
- L690 (ja) — ★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 (ja) — ★2026-10-03: 運転の系列の集大成と「開かれた運転基盤」のために足した 2 分野。テーマ表は製造の表と分ける (共通の 1 枚に足すと、運転の「digital twin」が製造の予知保全の op に、製造の「reconstruction」が 3DGS に当たる)。
- L288 (ja) — ★2026-10-15: 実験計画・応答曲面・品質工学・感度解析(opsmultivar)。鍵は製造のクラスタ名に実際に出る語 (射出成形の「optimization」、加工の「optimization」「prediction」)—— 工程条件の最適化と予測は、文献では 直交表・応答曲面・感度解析で回す領域。
- L306 (ja) — ★2026-10-15: sim-to-real 較正(opssimcal)。鍵はクラスタ名に実際に出る語(慣性センサ・力覚の「calibration」、 鍛造・交通・レーダの「simulation」「modeling」)—— シミュレーションを実物に合わせる・センサを較正する領域。
- L320 (ja) — ★2026-10-15: 収束型の演算(opsconverge)。鍵はクラスタ名・葉の名前に実際に出る語(有限要素の「finite」= 格子の収束の検証、 霧・散乱・光線の輸送の「fog」「scattering」「transport」= 多重散乱のモンテカルロ、描画の「rendering」= 相互反射を収束まで)。
- L389 (ja) — ★2026-10-15: 10 月に足した op の系列(研磨・粉体・粉末 X 線)は、既存のテーマの語に当たらず文献層から 1 本も 指されていなかった。語はクラスタ名に実際に出るものだけを置く(当たらない語は当てない)。
- L535 (ja) — ★2026-10-03: corpus2skill は葉へ写すときに Authors / Date / URL の行を落とす(元の papers/*.md には在る)。 その結果、出荷した文献層の代表論文がすべて「— (n.d.)」になり、「新しい順」も日付なしで並んでいた。 葉の Source: が指す元ファイルから、欠けた欄だけを補う(元のパスは読むだけで、出力には書かない)。
- L651 (ja) — ★2026-10-15: ここはテーマごとに先頭 8 本で黙って切っていた。表の後ろに足した op(10 月の研磨・材料表・ ファイバ・触覚・peg-in-hole …)は対応表に在るのに文献層のどこにも出ず、表に書いたことが嘘になっていた (2026-10-15 時点の表 251 op のうち 21 本。うち 3 本は SPC のテーマの鍵がどのクラスタ名にも当たらなかった分)。 テーマは多くても 17 本なので全部出し、当たらないテーマは INDEX に名指しする(dead_themes)。
- L101 (ja) — ★2026-10-15: 上の TIO2 はルチル単結晶の常光線だけ(430 nm から・k なし)。成膜した TiO2 は非晶質か アナターゼが多く n が低い —— 膜の計算はこちらを名指しする(非公開の膜の PoC で、ルチルの n で膜を 解くと傾いた面の膜厚の偏りが小さく出ることを確認)。
- L145 (ja) — ★光収率の幅(
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 (ja) — ★発光の形(
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 (ja) — ★
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 (ja) — ★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 (ja) — 任意キー。ここに無いキーは拒む(fail-closed)。★所属・勤務先・製品名の欄は 意図して持たない —— 報告者に求めない情報は、台帳に置く場所も作らない。
- L313 — ★這是下界。因為它只看 op 名是否在
tests/ 中以 literal 出現,所以掃台帳跑遍全部 op 的掃掠型測試(for name in ledger: ...)不計入。要讀作「沒有指名的測試」而非「沒有測試」。
- L335 (ja) — ★報告が付いた行にだけ鍵を足す(空の台帳で出力を動かさない)。 repo 内の判定は別の鍵に残す —— 1 つの段に畳まない。
- L265 (ja) — ★fail-closed: op の一覧は台帳の本体。ここを「(section failed)」の 1 行で済ませると カタログが黙って空になる(pip だけの利用者の RAG はこのファイルしか持たない)。
- L90 (ja) — ★2026-09-17: 戻りの橋
feature_to_img で feature が初めて入力に なった。1 段で image -> feature を作れる op(intensity = 平均輝度)を 前置きにする。これが無いと図が「型が届かない」に落ちる。
- L99 (ja) — ★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-D,卻把宣告的 out 定為 labels(→ volume = ndim 3)。兩者都保持註冊著卻一次也沒執行過,fail-soft 回傳著貌似合理的值。移到 backends_typed._OP_BRIDGE_SKIP,並從這張表裡移除 – 有「出不了圖」的記錄,卻在任何地方都沒有「無法執行」本身的記錄(有兩道門,只有一道察覺到了)。
- L124 (ja) — ★2026-09-13: op が evolute 検証を得て厳格化。ECEF は地球表面(中心から ~6.4M m)の 座標を要るが、画像由来の合成点は原点付近で必ず楕円体の evolute 内に落ちるため 正しく拒否される(実データでは動く。合成入力では図を作れない恒久的な定義域ミスマッチ)。
- L127 (ja) — ★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(使用者指示「不必彙總成一張。分階段的、有多個條件的分開出」「有些東西用偽彩色更好懂」「複雜的甚至可以用動畫 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 (ja) — ★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,所以一行 ≈ 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 — ★逐點呼叫 apply_cmap 的話,會在那一個點之內正規化,於是全都變成同一種顏色。只做一次張開 0..1 的 LUT,從中查取。
- 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 (ja) — ★台帳に残すパスは 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 的單一顏色改變濃淡(為了不讓含義只由顏色承載,同時並列標注符號和數值)。
- L1417 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L573 — 5. ★跨越各種表示走一圈(變換的連鎖正是謊言出現之處) # ————————————————————————— #
- L599 — ★ “是殼而非實體” 不可用最大值投影來斷言 —— MIP 取的是深度方向的最大值,所以即便是薄殼內部也看起來是填滿的(實際上曾經那樣畫過,差點給出”體積 5768 -> 殼 5608”這種幾乎無差別的數字)。內部是否殘留,用中心斷面和內部填充率來說明。
- L862 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L2065 (ja) — ★台帳に残すパスは 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,一個週期也有 4.16 像素,足夠了。
- L1151 — ★ 把兩個量疊在一張圖上,取決於尺度的取法,兩條曲線可能偶然完全重合(最初的版本正是如此,看起來與”兩個獨立軸”的主張完全相反)。調尺度把它們拉開是矇混,所以把面板縱向分開——圖的結構本身就說”這是不同的軸”。
- 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,所以格點上一點都落不進(最初的版本就因 min() 變空而崩潰)。用二分法直接求邊界本身。
- L1600 — ★ 誇張倍率是 縱向 像素/mm ÷ 橫向 像素/mm。最初的版本寫成了倒數,在拉伸了 8 倍的圖上顯示”0.13 倍”(向讀者傳達了完全相反的資訊)。
- L2090 — ★ 分成上下兩欄。疊在一張圖上時,單位不同的兩條線(像素數與偵測率)會被讀成落在同一縱軸上(實際上看起來正是如此)。
- L2776 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L52 (ja) — 総合案内。★既存の Qiita 枠がこのファイルを指しているので、名前を変えない ―― 外部リンク・LGTM・ストックはこの URL に付いている。館の入口に充てるのが筋。
- L150 (ja) — 1 展示に出す静止画の追加枚数。★2 枚固定をやめる(2026-09-24)
- L405 (ja) — ★見出しは収蔵番号。順路番号(何番目か)は出さない —— 展示を 1 つ挟むだけで 以降が全部ずれ、記事を分けるたびに番号が動くため(2026-09-25)。
- L433 (ja) — ★追加の静止画。説明は 1 文に切る(枚数を増やすのが目的で、詳しい 説明は主図と 2 枚目が持っている)。2026-09-24 に 2 枚固定をやめた。
- L459 (ja) — ★展示に載るのは 1 本あたり 2 枚ほど。PoC は中央値 6 枚・最大 25 枚 作っているので、残りへの道を必ず出す(2026-09-24、ユーザー指摘 「生成した数百枚はどこにあるのか記事からは分からない」)。
- L484 (ja) — ★解説板の「この部屋の {n} 点」は生成で埋める。手書きの数は腐る ―― 10 翼中 9 翼が展示 53 点の頃の数を名乗ったままだった(産業検査は 10 と 書いて実際 27、2026-09-25)。例外は出ず、門も赤くならない。
.format は使わない(解説板に別の波括弧が在ると壊れるため)。
- L533 (ja) — 棟の目次。★展示数は毎回数えて出す(手で書くと必ず古くなる)。
- L539 (ja) — 目次に出す短い翼名。★区切りは ` / ` —— 翼名そのものに「・」が入るので (寸法・形状計測 / 医用・生物 / 色・分離)、「・」で繋ぐと境目が読めなくなる。
- L645 (ja) — ★
external の部(手書きの数学記事)は描かない。index は案内なので上で出した。
- L2611 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L219 (ja) — ★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 (ja) — ★効かないノブを台帳に足して黙らせない(2026-10-23): 既定の入力では効かない 3 本は、効く入力で探る。 fp_design の境の許容は NA_obj = 0.12 で軸の 2 番目の LED(NA 0.1135・0.1267、差 0.0065)が許容の 2 倍の内側に入る。
- L949 (ja) — ★探針の 32×32 だと目盛の文字幅が書体で変わり、手元(Windows の書体)は右に 3 px はみ出して 拒否・CI(代替書体)は収まって通る —— 環境で判定が割れた(2026-10-11)。余白を取って両方で通す。
- L430 (ja) — ★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 要花 10 分鐘(toc 和 html 也重建同一索引,所以完整再生成是 30 分鐘級)。散文剝離每個原始碼一次就夠了 —— 因為它不依賴 op 名。
- L142 — ★2026-09-08: ops1d(dsp 16 + funct1d 23)雖已註冊,卻 在 docs/ops 下沒有一張筆記 —— 它出現在 OP_CATALOG 中,但因為沒有每個 op 的筆記(型別契約、陷阱、相關 op),從 RAG 語料庫中整個缺失。是在
poc_web_roll_periodicity 給 dsp 添了 2 個時發現的。
- L919 (ja) — ★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 元(多輸入)層。到 2026-09-09 為止有 17 個運算子連一份說明都沒有(
add_image、sub_image、bit_and、reduce_domain、union2…)。它們以 tier=nary 出現在 OP_INDEX.json,但 docs/ops/ 下沒有說明,因此永遠無法從 RAG 語料中檢索到。漏掉的原因很清楚:這裡只走訪 ops.REGISTRY,而 ops.REGISTRY(899)與 2-D 說明數(899)相等,從註冊表一側數就顯得毫無缺漏。只有跨層去數才會暴露。
- L1023 — ★2026-09-07:
OPS3D[...]["doc"] 是註冊時只切出 docstring 的第 1 行的產物(ops3d._build)。在筆記的”用法”裡用它,無論實作寫了幾段都會變成一行 —— “用法只有一行的 op 494 本”中的 3-D 部分正是這個截斷造成的(docstring 本身很長的 op 很多)。和臺帳 dim 一樣,把函式的 docstring 整個讀進來。
- L1046 — ★ 橋接 op(
tb_<name>)與臺帳的 <name> 實作相同,範例以臺帳名書寫。到 2026-09-06 為止有 147 本是”零範例”,但那只是沒有數到以別名存在、呼叫同一實作的範例而已。繼承臺帳一側的範例,並在筆記中明確寫上”原 op 的範例”(以免說謊)。
- L1104 (ja) — ★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 元運算子無法透過
fullseye.apply 呼叫——那是單張影像的模型。在這裡寫單圖的呼叫方式會讓說明說謊:說明唯一的職責就是告訴別人怎麼呼叫,所以錯誤的呼叫方式比沒有更糟。公開入口是 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 (ja) — ★2026-10-15: 族の名前だけでは中身が分からない。
drive(694)は研磨(polish)・粉末 X 線回折 (pxrd)・触覚(tac*)・peg-in-hole を抱え、optics は材料表(matprop)・ファイバ(fiber)・ センサーの特性(sensorchar)を抱える —— 族名で選ぶ読み手は、それらを開かずに「無い」と言う。 入口でカテゴリ名を全部見せる(名前は識別子なので訳さない。各カテゴリはその族の INDEX の節)。
- L1803 (ja) — ★2026-09-15: 用途から引く索引(docs/CAPABILITIES.md)へここから送る。文書だけを 渡した AI が 1 回目に見つけられなかったのは、この目次にも AI_RAG_GUIDE にも 導線が無かったから。
- L1812 — ★ 這裡長期只指向
2d/guides/,從未把讀者引向光學、PIV、斷層成像等 30 個族的指南(2026-09-09 修正)。
- L1970 (ja) — コードスパン。★
…(RST / docstring の二重バッククォート)を … より先に試す。 2026-10-07 まで ([^]+) だけで、p measures … p が「 の 2 文字目と次の の 1 文字目」で組まれ、コードと散文が**反転して**表示されていた(英語版 3,153 枚中 約 2,800 枚)。前に付いた RST ロール(:func:x など)は飲み込み、対象名だけをコードで出す (733 枚で :func:` が生で見えていた)。
- L2139 (ja) — ★置き換えは描画時と同じ退避記号で(空白にすると
**raises `ValueError`** の閉じの 直前が空白になって太字の組が外れず、英字にすると **name**`(a)` の閉じの直後が 英字になって外れない —— どちらも「閉じていない」と誤判定して次の箇条書きを飲み込んだ)。
- L2841 (ja) — ★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 (ja) — ★2026-10-18: スクリプトは一時 dir に置くので、
import fullseye は editable install(本線の 作業ツリー)を読んでいた —— worktree で出すリリースを検査したつもりで、別の版を見ていた。 PYTHONPATH でこの ROOT を先頭に置き、点検する対象 = 出すツリーにする。
- L319 (ja) — ★全出力は repo の外に残す。repo 直下に置くと「余計なファイル」を見る門に 当たりうるし、木が汚れて「凍った木で 1 回」という証拠の条件が崩れる。
- L362 — ★ 不帶
--full 呼叫 --only suite 會得到 0 個項目,以前會說”全部 PASS”並以 rc=0 返回(2026-09-05 評審中實測)。什麼都沒檢查卻放行的門,比沒有門更糟。
- L20 (ja) — # 選び方(★ここが肝)
- L55 (ja) — ★
__all__ と list_ops は入れない。どの族のテストにも出てくる語なので 392 本中 107 本を選んでしまい、そのうえ肝心の探針の門(test_op_probe_ledger)は その語を持たないので取り逃す(2026-09-23 実測)。広く取れば安全、ではない —— 選ぶ語は「その帳簿を読んでいる」ことの証拠でなければならない。
tools/qiita_post_poc.py
- L100 (ja) — 既定で投稿する記事の種類。★手書きの
external は名指ししたときだけ扱う —— 引数無しの 一括投稿が、生成物でない記事(数学の回など)を巻き込まないようにする。
- L49 (ja) — ★最上流。
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 (ja) — ★展示館より先に回す —— 生成器は見出しに収蔵番号を出すので、 未発行の展示が 1 つでもあると BuildError で止まる。
- L88 (ja) — ★これも
tools/ の外。2026-09-20 まで鎖に無く、docs/OPERATORS.md が 885 op / 47 分類(2026-09-06 の値)のまま置き去りだった(GenSpark 第 53 報と ユーザー指摘)。生成器が鎖に無い生成物は、必ず古びる。
- L92 (ja) — ★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 (ja) — ★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 (ja) — ★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 (ja) — ★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 (ja) — ★2026-09-20(GenSpark 第 24・25 報 N94): torch が入っているのに「install with」だけが出て、 導入すれば直ると誤って案内していた。入っているのに import で落ちたなら、その理由を言う。
treemorph.py
- L217 (ja) — ★殻の中点に置く((k - 1/2) * top / n)。上端を top ちょうどにすると最も遠い節点が 殻の上に乗り、回転で 1 ulp 動いただけで「内側/外側」が反転して交点が 1 -> 0 になった (回転不変の門が捕まえた)。
typed_catalog.py
- L242 (ja) — ★打ち直しは入力の頂点数より少ない標本を拒否する(角を切って線が短くなり、 濃淡の再現が壊れるため)。探針より確実に多い数を渡す。
- L252 (ja) — ★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 被拒絕,單看覆蓋率這一個數字像是”能呼叫”,實際卻從未執行。
- L561 (ja) — して探針の値が読みやすいようにする。★既定の weight=”phat” は band が必須(0.5.0、 全白色化は帯域の限られた信号で外れる)。rate=1.0 なので band は cycles/標本で全帯域を明示。
- L578 — ★ 法線不要平行於軸。若與軸平行,距離場只沿一個軸變化,圖的生成器做的”堆疊切片的 GIF”會塌成一幀(2026-09-08 實測)。傾斜的法線則所有切片都會變化。長度不起作用(op 會正規化),所以傳入未正規化的向量,把這個規格也展示出來。
- L650 (ja) — ★32x32 は chain_fuzz の cimage プール(32x32)に合わせた値。進化の橋 (backends_typed)はこれを使わず、呼び出しのたびにスペクトルと同じ形の H を作る (backends_typed.CALL_TIME_ARGS。固定形だと他の大きさの画像で必ず拒否された、2026-10-07)。
unified.py
- L559 (ja) — ★2026-09-20(GenSpark 第 53 報 N181): dict / list を registry の鍵にして unhashable で落ちていた
verify_auto.py
- L74 (ja) — ★
match は 1 次元ベクトル(ops._ncc_locate と同じ形)。1 スカラー では表せない組(面積+重心、楕円の 3 指標 …)を運ぶために在る。 この枝が無かったので、下の「image / region = 2 次元」に落ちて ndim=1 で弾かれていた —— 正しく作られた op が「実装されていない」 と数えられ、HALCON 対応数が静かに 1 本少なかった。
video.py
- L228 (ja) — ★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 — ★ 一個不剩地所有點都在相機後方 = 幾乎肯定是姿態的規約不符(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 (ja) — ★半径は刻みの整数倍に落とす。EDT は離散球の中心で半径より少し大きい値を返すので (半径 4 の球で ~4.12)、生の最大値から刻むと直径が系統的に +0.1 ほど大きく出る。
- L1214 (ja) — ★膨張は前景をはみ出す(離散の球で膨らませるため)。実測で 24% 漏れ、粒度分布の 生存率が 1.0 を超えた。太さは前景の量なので必ず前景で切る。
- L1313 (ja) — ★最大厚さの次の刻みまで伸ばす。ここで止めると一番太い特徴の質量が 一度も消えず、分布から丸ごと落ちる(実測: 体積の 71% が欠け、平均径が 18.0 のところ 15.1 になった)。
- L1333 (ja) — ★一様なブロックでは勾配が丸め屑しか残らず、固有値分解はその屑から任意の向きを 返す。絶対値の床は輝度スケールに依存するので、必ず相対量で切る。
world_render.py
- L69 (ja) — ★
resolve() は実在しない場面に None を返す(資産が無い環境では正しい)。 検査せずに spec["xml"] を引くと TypeError: 'NoneType' object is not subscriptable という、原因を何も語らない例外になる —— 呼び手には 「何が無いのか」と「どう直すのか」を返す。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.