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 — ★창은 템플릿보다 커야 하며, 그렇지 않으면 완전 겹침 위치 수가 0이 된다 → 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=8 에 비해 실제로는 K≈23-25(약 200B)다. 바이트 수가 아니라 요소 수로 결정된다 —— 요소당 인출 비용이 지배한다. 개수가 적을 때 옮기면 오히려 느려서(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 경계에서 둘로 나뉘고, 게다가 중심이 1 bin 어긋나 0 표가 되었다(frame_align 이 「겹치지 않는다」고 잘못 fail-closed 했다). 1e-6 의 가중치는 평활값의 눈금(1/9)보다 훨씬 작으므로, 실제로 차이가 있을 때의 순위는 바꾸지 않는다.
- L1766 — ★2026-09-08: 2 등 봉우리의 높이도 반환한다. 성야라면 봉우리는 하나지만, 반복 구조(망점·격자·직물)에서는 격자 벡터만큼 어긋난 곳에 같은 높이의 봉우리가 늘어서, 그 어느 것을 골라도 「모두가 찬성한다」= 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 는 ndarray 가 아니라 numpy 스칼라를 반환하므로 위 분기는 한 번도 그것을 보지 못했다: NaN/Inf 측정값(예를 들어 퇴화 프레임에 대한 sk_blur_effect 내부의 0/0)이 api.apply 에서 그대로 흘러나갔다. 비유한 스칼라도 sort 폴백으로 씻어내어, 선언한 “유한·sort 로 유효” 보증이 feature/contour 스칼라에도 실제로 성립하도록 한다.
backends.py
- L23 — ★
_safe 폴백은 최후의 수단이며 죽은 op 를 감출 수 있다. out_sort==”image” 에서는 backend_safe.fallback 이 클립한 입력을 반환하므로, 어떤 입력에도 라이브러리 호출이 예외를 던지는 wrapper 가 진화 / difftest / coverage 에는 실패가 아니라 “동작하는 항등 op” 로 보인다. 실행 시 견고성은 유지하지만 열화는 검출 가능하게 해 두었다: 삼켜버린 예외는 모두 공유 폴백 대장에 기록하고, strict 모드에서는 대신 다시 던진다. 2026-09-02: 대장 / strict 스위치를 backend_safe 로 내려서, 다른 23 개 backend 파일(각자 private 한 _safe 를 가짐)이 같은 곳으로 보고하도록 했다 —— 그 전에는 24 개 wrapper 족 중 이 모듈만이 무언가를 기록했다. 아래 이름들은 여기서 import 하는 호출자와 테스트를 위한 얇은 별칭으로 남긴다.
- L819 — LBP 의 부호화. ★2026-09-08 까지
b 는 실제로 아무것도 하지 않았고, method 는 'default'(회전 불변이 아님)에 고정되어 있었다. 실촬영 텍스처(brick / grass / gravel)로 측정하면, 이방성 소재에서는 회전으로 움직이는 양이 소재 간 거리의 9.64 배가 되고, 'uniform' 으로 바꾸면 1.72 배까지 내려간다(examples/poc_real_texture_invariance.py). 고를 수 없으면 낮출 방법이 없으므로 b 를 할당했다. 임계값 표로 만든 것은 같은 축에서 분기가 늘어날 때의 규약이다(중첩 if 로 하지 않는다). b=0.5(기본)은 종전대로 'default'.
- L1035 — ★cv2 에 bool 배열을 넘기면
cv2.Laplacian 이 힙을 손상시켜, 이후의 무관한 op 에서 프로세스가 죽는다(2026-09-05 Fable 리뷰, Windows 에서 100 회 안에 SIGSEGV 를 직접 재현, exit 127). facade 는 dtype 을 계약에 맞추지만, op.fn 직접 경로(테스트·coverage·진화 루프)는 그대로 통과했다. 족의 입구에서 float64 로 맞춘다.
backends_auto.py
- L60 (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)처럼 「프레임 밖을 배경색으로 채우고 싶은」 용도에는 그대로는 맞지 않는다(알려진 설계 판단이며 버그가 아님 — 자세한 내용과 구분은
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 도만이므로 기존 결과는 1 비트도 바뀌지 않는다. 효과가 있는지는 a(동시발생 거리)에 따라 달라진다(poc_real_texture_invariance 6 절, 실촬영 3 소재): 등방성 소재에는 중단 거리에서 효과가 있고, 이방성 brick 에는 거리 4 에서만 효과가 있다(진폭/분해능 3.13 -> 1.54). 거리 1 에서 brick 는
- L1560 — 오히려 악화(0.30 -> 0.56). ★근본 원인은 거리를 늘리면 분해능 자체가 0.0328 -> 0.0122 로 붕괴하는 것.
- L1760 — ★2026-09-02: 이 둘은
{"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 로 억제한 정방 행렬을 최대 60 회 SVD 하는 곳으로, 이 repo 에서 분해 시간의 대부분을 쓴다(스위트 1 회에 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 까지
tools/chain_fuzz(비동봉)를 sys.path 조작으로 읽고 있었다. 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 에 퍼저의 TYPEMISS 로 드러남. 지심 좌표 6 op 를 추가한 뒤 퍼저를 돌리지 않았다). 격자 그대로 (H, W, 3) 이 필요할 때는 :func:dem_geocentric_grid 를 쓴다.
-
| L807 — ★축폐선의 안쪽은 측지 위도가 유일하지 않다 -> 조용히 범위 밖의 위도를 반환하지 않고 거부한다. 타원 x²/a² + z²/b² = 1 의 축폐선은 (a·x)^(2/3) + (b·z)^(2/3) = (a²-b²)^(2/3). 등호의 바깥쪽만이 「법선이 하나로 정해지는」 영역(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 라면 “낮은 쪽 봉우리의 솟음(16 - 잘록 10.07 = 5.93)”을 h 가 넘는 순간 씨앗이 하나로 융합된다. blob_seeds 는 잔차 > 0 을 씨앗으로 삼으므로 잔차 = min(h, 솟음) > 0 이 항상 성립하여, 낮은 봉우리의 씨앗은 그 h 에서 사라지지 않는다. 융합되는 것은 “높은 쪽 봉우리 - 잘록(22 - 10.07 = 11.93)”을 h 가 넘을 때 —— 참조하는 봉우리가 반대다.
examples/coherence_scanning.py
- L166 — 6) ★ 위상 이동법과의 대조 # —————————————————————— #
examples/dem_geodesy_tour.py
- L49 — ★리포지토리 최상위를 경로에 넣어 두지 않으면
demops 를 찾지 못한다(이 예제는 fullseye 를 import 하지 않으므로 경로 훅이 작동하지 않는다).
- L61 — ★EXTEND: 자신의 타일의 북서쪽 모서리로 교체한다(여기는 도쿄 부근).
- L131 — ★정직한 내역: Bowring 의 1 회 반복은 타원체면에서 1e-9 m 이지만, 높이가 올라갈수록 오차가 커진다(실측 8848 m 에서 8e-7 m, 20 km 에서 4e-6 m). docstring 의 “1e-12 도 / 1e-7 m”는 지표 부근의 값이며 성층권 높이에서는 성립하지 않는다. 지형(표고 < 9 km) 용도에서는 1e-6 m 이고, 여기서는 1e-5 m 를 임계값으로 한다.
- L160 — ★EXTEND: dem 을 실데이터로 교체한다(행 0 이 북쪽). 여기는 이미 알려진 경사면.
examples/dem_terrain_analysis_tour.py
- L46 — ★리포지토리 최상위를 경로에 넣어 두지 않으면
demops 를 찾지 못한다(이 예제는 fullseye 를 import 하지 않으므로 경로 훅이 작동하지 않는다).
- L59 — ★EXTEND: 셀 치수 [m]. 실데이터에서는 dem_cell_size_webmercator(zoom, 위도) 로 구한다.
- L158 — ★정직한 관찰: 경사면 도중에 결측이 있을 때, 그 북쪽 이웃은 outlet 이라도 결측으로 떨어지지 않고 남서(유한한 낙차가 있는 방향)로 간다. 구현은 “달리 내려갈 곳이 없을 때만 결측으로”이며, docstring 의 “결측으로 향하는 흐름을 허용”보다 좁다. 여기서는 출력만 하고 assert 하지 않는다.
examples/example_inner_diameter_mm.py
- L67 (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 — ★repo 최상위의 모듈(pivops)을 import 하므로, 체크아웃에서 그대로 실행해도 통과하도록 repo 최상위를 맨 앞에 둔다. 다른 예제와 같은 방식. 이것이 없으면
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 가 폐형식으로 1 차 계수로 반환하는 양이, 그대로 거짓 기울어짐과 거짓 평면 내 흔들림이 된다.
- L555 — ★폐형식에는 부풀음에 흡수된 몫(§6)을 넣은 실효 기울어짐을 넘긴다. 넣지 않으면 f=0 의 1 점만 1.2 mrad 어긋나 예측이 빗나간 것처럼 보인다.
- L660 — ★잡음만의 바닥. 부풀음이 0 인 벽에서 같은 방식으로 읽으면 이것이 나온다.
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 — ★공개 경로에 없는 처리: voxel 공간의 6 근방 인접 그래프. fullseye 는 3-D 의 # 연결 성분(vol_label)도 거리 변환(vol_distance_transform)도 갖지만, # “공극을 통과하는 경로”를 다루는 입구(측지 거리·수송)는 없다. # ————————————————————————— #
- L258 — ★64 voxel 의 슬라이스를 그대로 넘기면 패널 폭이 64 px 밖에 안 되어, 제목 글자가 들어가지 못하고 그림째로 실패한다(examplefig 는 말없이 포기하지 않는다).
- L279 — ★고상을 0 인 채로 두면 log10(소산) 이 음이므로 고상이 가장 밝게 칠해진다(2026-09-08 에 한 번 그렇게 나왔다). 고상은 공극의 하위 2 % 에 맞춘다.
examples/poc_beam_modal_video.py
- L629 — ★충돌: fps 48.5 에서는 조명의 앨리어싱이 f_1 = 3.00 Hz 에 정확히 얹힌다
examples/poc_beats_fringes_and_screens.py
- L237 (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 보이드 = 중앙이 완만하게 가라앉음). 일부러 엄밀한 2 차로 하지 않는다 —— 2 차로 하면 당김이 정의상 100 % 흡수해 버려 “얼마나 흡수되는가”라는 물음이 자명해진다.
-
| L306 — ★±SPEC_UM 로 clip 한 뒤 넘긴다. examplefig 의 발산 색 배합은 패널마다 max |
v |
로 정규화하므로, clip 하지 않으면 3 장의 색 의미가 맞지 않는다. |
- L445 — 6. ★과도한 차감의 해 —— 진짜 저차 불량을 흡수한다 # ————————————————————————— #
- L540 — (e) ★대장을 거친 surface_form_error 는 PV 의 float 만 반환한다
examples/poc_cad_scan_deviation.py
- L434 — ★대장의 out 어댑터가 dict 를 (R, t) 로 잘라내므로 rmse 는 도달하지 않는다
- L897 — 제 6 장: ★결함이 정합을 끌어당긴다 —— 강체 6 차원으로의 투영으로 예측한다 # ————————————————————————— #
- L1103 — ★결함을 넣지 않는다 —— 넣으면 제 6 장의 datum 어긋남(0.107 mm)이 점 이동의 밑받침이 되어 “초기 각도로 깨진 양”과 섞인다.
- L1256 — ★참값이 0 인 대조군에서 “%”를 내면 0 나누기로 의미 없는 거대한 수가 된다. 면적은 mm^2 그대로 나열하고, %는 참값이 의미를 가질 때만 덧붙인다.
- L1267 — ★1 회 실행의 차이를 “효과가 있었다”로 읽지 않는다 —— 씨앗을 바꿔 흩어짐과 비교한다
- L1357 — ★구멍이 메워지면 울리는 assert. 실제로 2026-09-07 에 울렸고, 이 줄을 다시 썼다: “원통 구멍·모따기·필렛을 구성할 수 없다”는 지적을 받아 plane / cylinder / torus / capsule 이 추가되었다. 지적이 도구를 바꿨으니 기록을 남기고 앞으로 나아간다.
- L1379 (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 는 밀도에 따라 움직인다(편향 기준이나 1대1 기준 중 어느 한쪽에서는 반드시 움직인다)
- L1368 — (5) ★계수는 맞는데 분할이 전부 틀린 점이 실재한다: 편향이 3 % 미만인데도 분할 오류가 많이 남고, 1 대 1 대응도 최선에서 멀다.
- 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 의 표제. 영점 A(수평선)와 영점 B 에 FBP 가 교차하는 곳이 눈에 보인다. 가로축은 투영 수(왼쪽이 성기다). 가로축은 log —— 교차가 일어나는 것은 성긴 쪽(12〜45 개)이며, 선형 축이면 왼쪽 끝에 뭉개져 핵심 부분을 읽을 수 없다.
- L407 — ★2026-09-06 에 메워졌다. 이전에는 “검출기를 배로 하면 질량 결손이 2 배 이상 개선된다” = 고장 난 것을 고정하고 있었다. 지금은 두 가지를 고정한다: (1) 질량이 애초에 보존된다 (2) 검출기 수로는 움직이지 않는다(n_detectors 는 검출기의 폭이지 표본화의 세밀함이 아니므로, 대상이 들어가 있으면 늘린 만큼은 빈 빈이 늘 뿐).
examples/poc_ct_void_morphology.py
- L233 — ★다이 점유로 대용하면, 거친 복셀에서 두께 50 µm 의 다이가 복셀 중심 사이에 떨어져 기준 자체가 사라진다(60 µm·위상 2/3 에서 실제로 0 개가 되었다).
- L558 — ★전부 nan(어느 위상에서도 측정할 수 없었다)을 np.nanmean 에 넘기면 경고가 나온다. “측정할 수 없었다”는 평균의 대상이 아니므로, 여기서 명시적으로 nan 으로 한다.
- L634 — ★nan(측정할 수 없었던 점)은 떨어뜨리고 그린다 —— 꺾은선 op 는 비유한 값을 거부한다.
- L808 — ★구멍이 메워지면 울린다. 2026-09-07 에 울려 이 절을 다시 썼다 —— “esdf 는 길이 3 의 voxel_size 를 받는데, 그 출력을 그리는 쪽이 정육면체 한정”이라는 지적을 받아, query_distance(와 occupancy_grid)가 축별 res 를 받게 되었다.
- L878 (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 를 찾지 못한다(이 예제는 fullseye 를 import 하지 않으므로 경로 훅이 작동하지 않는다).
- 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 — ★h를 “T/h가 정수”가 되는 점에서만 스윕하면 안 된다. 정수비에서는 점유 복셀 수가 정확히 T/h 개가 되어 오차 0.000 mm가 나열되어 “양자화는 일어나지 않는다”처럼 보인다(2026-09-07에 한 번 그렇게 썼다). h는 연속으로 스윕한다.
- L705 — ★정확히 45도의 경사 방향은 넣지 않는다 —— 판 뒷면 2349.7 mm^2가 자신도 임계값에 달라붙어 “어느 방향이 좋은가” 표가 단차 이야기에 점령당한다.
- L824 — ★구멍이 막히면 울리는 assert. 2026-09-07에 울려서 이 줄을 다시 썼다 —— “면별 면적이 없다”는 지적을 받아 face_areas / mesh_volume / boundary_vertices가 추가되었다. 막혔음을 기록하고 앞으로 나아간다.
examples/poc_dic_strain.py
- L104 — ★정규화는 기준 영상에서 정한 하나의 상수로 수행한다. 영상마다의 최댓값으로 나누면 변형으로 최댓값이 조금만 움직여도 전체 밝기가 바뀌어, 휘도 불변을 가정하는 추정기(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 µε의 3할.
- L438 — ★균일 기울기(ε가 x의 1차)에서는 둔해지지 않는다 —— 대칭 창의 최소제곱은 1차 함수의 기울기를 엄밀하게 반환하기 때문. 창의 효과를 보려면 곡률이 있는 변형장이 필요하다. 노치 선단의 변형 집중이 바로 그것이므로 가우스 형태의 집중을 심는다.
- 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 — ★2값 마스크에 직접 sobel_dir을 적용하면 기울기 방향이 0/90도로 양자화되어, 1점 1표의 방향 있는 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의 이름은 없지만, colorize_flow에 (cos2θ, sin2θ)를 넘기면 2배각의 순환 LUT가 된다(끝의 “도구의 구멍” (f)).
- L693 — ★”coherence”라는 이름은 있지만, 그것은 신호 처리의 2신호 코히런스(다른 것).
- 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 배가 된다(잔차는 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 — ★겹침의 한가운데를 보아서는 안 된다 —— 그곳은 두 측선 모두 같은 흔들림 각도라서 오차가 같은 만큼 실려 차이가 0 이 된다. 띠 전체에서 최댓값을 취한다.
- 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인 하물에도 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 — ★대조군 —— 융합도 분리도 되지 않은 덩어리만을 그 덩어리가 찍고 있는 입자 그 자체와 1대1로 대조한다. 참값 쪽을 전체 입자로 하면 “큰 입자일수록 융합하기 쉽다”는 선택 편향이 섞여 표본화 편향과 구별할 수 없게 된다(처음에 그렇게 썼다가 잘못 짚었다).
examples/poc_particle_tracking.py
- L702 — ★반환값은 마스크가 아니라 (N, 3)의 (z, y, x) 좌표(2-D의
local_max / sk_local_maxima는 이미지를 반환하므로 계열 안에서 제각각. 10절의 구멍 (g)). 처음에 count_nonzero로 세다가 자릿수를 틀렸다.
- L777 — ★위로 3.4배·아래로 0.93배를 한 장에 담으므로 세로축은 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의 버그다.
- L181 — ★응력장 그 자체의 검산도 고정한다. 적분한 힘이 하중과 일치하지 않으면 “참값”이 아니며, 중심값은 닫힌 형식 8P/(πDh)와 대수적으로 같아야 한다.
- L207 — ★영점 수준을 고정한다. 이후의 “◯배”는 모두 이 1.09 MPa를 분모로 하므로, 여기가 움직이면 비교의 의미가 바뀐다.
- L231 — ★소견을 고정한다: 암시야 1장에서 정수 줄무늬만 읽는 소박한 절차는 영점을 2배도 이기지 못한다. 분해능이 fσ/h = 1.78 MPa의 간격에 율속되기 때문. 4절의 위상 시프트(오차가 기계 정밀도까지 떨어진다)와의 대비가 이 PoC의 골격.
- L286 — ★잡음 제로로 같은 강도식에서 역산하므로 θ는 엄밀하게 돌아와야 한다(4장의 평면 편광에서 4θ를 내는 대수가 그대로 역사상이 된다).
- L308 — ★소견을 고정한다. (1) 일치율은 95 %를 넘지만 100 %가 되지는 않는다. 나머지는 (δ,θ) ↔ (-δ,θ+90°)의 이중성으로 부호가 반전된 화소로, 1파장 1회 측정으로는 원리적으로 없앨 수 없다. “거의 맞는다”도 “완전히 맞는다”도 아니라는 소견을 그대로 고정한다.
- L371 — ★소견을 고정한다. (1) 편광 감소는 없다(Stokes 크기가 엄밀히 1). 변조가 떨어지는 것은 광량이 아니라 위상의 감도 쪽이라는 5절 주장의 근거.
- L377 — (2) ★★실측은 “마스크를 넘기면 고쳐진다”는 소박한 기대의 반대를 말하고 있다: 마스크 없음 97.0 % / 표본화 부족을 제외하면 97.1 % / 저변조까지 제외하면 81.9 %. 저변조 화소를 빼면 영역이 분단되고 skimage의 unwrap이 섬마다 다른 2π 오프셋을 고르기 때문. “둘 다 마스크로 제외할 수 있다”는 예보로는 옳지만 처방으로는 틀렸다. 실측 쪽을 고정해 둔다.
- L442 — ★소견을 고정한다. (1) 잡음도 양자화도 없으면 명시야/암시야의 비에서 δ는 엄밀하게 돌아온다.
- L445 — (2) ★8 bit 양자화 “만”의 오차가 잡음 σ=0.002만의 오차와 같은 오더(실측 0.00277 vs 0.00305). 카메라의 bit 깊이는 잡음과 같은 무게로 작용한다.
examples/poc_pigment_unmixing.py
- L860 — ★”하나의 숫자로 뭉뚱그리지 않는다”의 근거 그 자체. 같은 행 안에서 1.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 — ★2단이 무너진 점은 반드시 coarse가 셀 반경을 넘은 점(포함 관계를 고정한다)
- 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에 “반복 구조에는 쓸 수 없다”를 측정한 숫자와 함께 적고, 투표의 2위 봉우리 / 1위를
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개에 정확히 들어가는지(1대1)를 확인한다 —— 이걸 하지 않으면 “24 = 24”는 우연히도 성립한다(2개가 붙은 덩어리 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 — ★2026-09-06 에 구멍 1 이 막혔다. 이 assert 는 막힌 상태를 고정하는 쪽으로 다시 썼다(이전에는
d_fixed < 1e-6 < d_default = 망가진 상태를 고정했다). 망가진 방식이 돌아오면 여기서 실패한다.
- L976 — ★2026-09-06 에 구멍 2 가 막혔다. 이전에는
< 0.9 * len(ka)(망가진 상태를 고정)였다. 지금은 기본값 그대로 완전 일치한다는 것을 고정한다.
examples/poc_reproducible_icp.py
- L39 (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 — ★몸통은 캡슐 2 개를 나란히 놓아 만든다. 원기둥 1 개로 하면 단면이 원이 되어 어깨(몸통 중심에서 ±0.19 m)가 몸통의 그림자에서 벗어난다 – 실제 몸통은 폭 0.50 m / 깊이 0.30 m 의 납작한 단면이며, 뻗은 팔은 뒤에서 보면 몸통에 가려진다.
- L126 — ★X0 와 속도는 “어떤 시행에서도 참 분리 거리가 양수로 유지되고(접촉하지 않고)” “위험 대역에 충분한 시간 머무르도록” 골라 두었다 – 빨리 걷게 하면 위험 대역을 몇 프레임 만에 지나쳐 놓침을 세는 표본이 부족하다.
- L673 — ★가림을 넣은 채 밀도를 흔들면, 가림 편향(+0.12 m)이 모든 행에 실려 밀도의 효과가 보이지 않게 된다. 요인을 하나씩 끄는 것이 대조군의 역할이다.
- L683 — ★잡음과 솎아냄의 추출이 1 회면 놓침률이 몇 % 오르내린다. 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 2 배 와 t 2 배 는 등가
- 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 — 이미지 합성(★ 구멍: 지정 좌표에 별을 놓는 공개 op 가 fullseye 에 없다) # ————————————————————————- #
- L1243 — ★ “1 회당 작다”와 “전수로 작다”는 별개의 주장이다.
- 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 — ★먼저 측정 방식 자체의 바닥을 취한다 —— 열화도 자세 오차도 없이 2회 측정할 뿐.
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 — ★여기만 근사. 1차원 해에는 횡확산이 들어 있지 않으므로 시각마다 확산 길이 σ(t)=√(2αt)의 가우시안으로 면내를 흐린다. 물리의 스케일 법칙은 옳지만, 경계에서의 질량 보존까지는 만족하지 않는다.
- L236 — TSR로 t*를 찾는 범위. ★양 끝을 제외하는 것은 장식이 아니다 —— 고차 다항식의 2계 미분은 끝에서 반드시 발산한다(Runge). 제외하지 않으면 argmax가 첫 또는 마지막 프레임에 붙고, 깊이가 창 끝의 2개 값에 붙는다(실측, 2026-09-06). 차수는 4–11을 훑어 8로 정했다(4–5에서는 1.5 mm 이심이 끝에 붙고, 8 이상은 9/11과 같은 답).
- L271 — ★t*를 격자 간격으로 반올림하면 깊이가 계단 모양으로 양자화된다(64점이면 5 % 간격). 포물선을 3점에 맞춰 ln t의 서브격자 위치까지 구한다.
- L329 — ★소견을 고정한다. 여기는 근사 제로의 검산이므로, 무너지면 구현이 깨진 것이다.
- L343 — ★추정기 자체의 편향. 이미지를 전혀 거치지 않고 엄밀한 1차원 곡선에
tsr_depth를 적용한다. 여기서 나오는 오차가 「다항식 피팅의 바닥」이며, 3절 이후의 편차에서 이를 뺀 만큼만 횡확산·잡음의 기여다.
- L361 — ★소견을 고정한다: 바닥은 제로는 아니지만 작다. 양쪽을 눌러둔다 —— 제로가 되면 「이미지를 거치지 않는 곡선도 수 % 어긋난다」는 3절의 재해석(±5 %는 바닥과 거의 같다)이 성립하지 않게 되고, 커지면 3절 이후의 어긋남을 횡확산 탓으로 돌릴 수 없게 된다.
- L396 — ★소견을 고정한다. 이 2줄이 동시에 성립하는 것이 이 절의 주장 그 자체다. (1) 16개를 1개의 평균으로 묶으면 TSR은 「항상 1.50 mm라고 답하는」 제로점에 진다.
- L426 — ★소견을 고정한다. (1) 지름이 깊이의 4배 이상인 우하단 삼각형은 수 % 이내로 맞는다(1절의 바닥과 거의 같다).
- L457 — ★대조군: 횡확산을 끈 같은 장면. 이로써 「횡확산 탓」과 「화소가 부족/마스크를 얻지 못한 탓」을 구분할 수 있다. 한쪽만 보고 물리 탓으로 돌리는 것이 이런 종류의 실험에서 가장 흔한 실수다.
- L504 — ★대조군의 소견을 고정한다: 횡확산을 끄면 16개 모두 ±8 %에 들어간다. 이 1줄이 「망가진 원인은 횡확산 단 하나이며, 화소의 거칠기도 마스크를 얻는 방식도 아니다」의 근거다. 느슨하게 하면 3절의 결론이 ‘해상도를 높이면 고쳐진다’는 오독으로 되돌아간다.
- L514 — ★위의 추론(창 끝의 확산 길이가 효과를 낸다)이 옳다면 창을 자르면 고쳐진다. 가설을 세웠으면 그것이 틀어지는 형태의 실험을 반드시 1개 둔다. —————————————————————— #
- L535 — ★이 PoC의 가장 무거운 소견을 고정한다 ——「종횡비의 한계」는 물리가 아니라 맞추는 시간 창의 선택 방법이었다. (1) 창 4초면 작은 8개 모두가 ±20 %에 들어간다(실측 최악 -14 %).
- L623 — ★소견을 고정한다: 가열이 균일하면 생 1장이 가장 많이 검출하고, TSR의 2계 미분은 하나도 내지 못한다. 「깊이 추정에는 효과가 있지만 검출에는 적합하지 않다」= 같은 도구가 둘 다에 효과적이라고 할 수 없다는, 이 절의 주장 그 자체다.
- L670 — ★램프의 반사. 결함과 같은 스케일의 구조를 가진 것이 이쪽이다.
- L697 — ★소견을 고정한다. (1) 망가뜨리는 것은 (c)의 결함과 같은 스케일의 얼룩뿐이다. (b)의 완만한 경사는 생 1장을 거의 망가뜨리지 않는다 —— 여기가 「예상이 빗나간」 지점이므로, (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에서 고친 구멍. 3개의 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줄이 「하나의 숫자로 뭉뚱그리지 않는다」의 가장 강한 근거다.
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. ★앵커의 위치에 따라 부호가 바뀜다 # ————————————————————————— #
- L422 — 4. ★물결 —— 로버스트가 효과 있는 것은 이상치가 있을 때뿐 # ————————————————————————— #
- L459 — 5. ★★반사 —— 계통적으로 낮게 나온다 # ————————————————————————— #
- L622 — (d) 캘리퍼는 있었다(★「없다」고 쓰려다 3 계층을 뒤져 찾았다)
examples/poc_web_roll_periodicity.py
- L123 — ★제 1 닙과 제 2 닙의 둘레 차이는 일부러 15.7 mm 밖에 안 된다(6 절의 절벽 때문).
- L158 — 6 절(절벽)만 시행 횟수를 올린다. ★24 시행에서는 보고율이 12000 mm 에서 100 %, 14000 mm 에서 88 % 라는 비단조가 나와, 「검출의 절벽」 위치가 소표본의 흔들림으로 움직였다(120 시행에서는 12000 mm 가 93 % 로 안정되고, 100 % 를 유지하는 것은 17000 mm 이상). 절벽 위치를 주장하는 절만은, 바닥이 흔들리지 않는 시행 횟수로 측정한다.
- L253 — ★op 는 정점을 반올림하지 않고 반환한다(±0.5 를 넘으면 「거기는 극대가 아니다」라는 정보). 이 PoC 는 빗의 고조파 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 이상 내려앉음)이 있는지 확인해야 비로소 토(toe)로 인정한다 —— 이 문이 없으면 후보가 모재로 미끄러져 각장이 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 — ★repo 바로 아래의 모듈(profileops)을 import 하므로, 체크아웃에서 그대로 실행해도 통과하도록 repo 루트를 맨 앞에 둔다. 다른 예제와 같은 방식. 이것이 없으면
py -3.11 examples/<name>.py 가 ModuleNotFoundError 로 떨어진다(2026-09-09 실측: 실행하는 문이 없던 83 개 중, 떨어진 것은 이 유형의 2 개뿐).
examples/representation_roundtrip.py
- L175 — (c) 가우시안 -> voxel 의 질량. ★한 번 틀렸던 숫자
examples/shape2d_morph_descriptor_tour.py
- L64 — ★EXTEND: 자신의 윤곽 추출 결과(
{"shape": (H,W), "cs": [ (N,2) (row,col), ... ]})로 교체한다
examples/shapestat_landmark_tour.py
- L71 — ★EXTEND: 자신의 랜드마크 (N,3) 를 s 에 넣는다(점의 배열이 대응할 것)
- L123 — ★EXTEND: 자신의 군 (K,N,3) 를 scrambled 에 넣는다(위치·방향·크기가 제각각이어도 된다)
- L221 — ★EXTEND: 자신의 랜드마크를 「왼쪽을 전부, 다음에 오른쪽을 같은 순서로」 나열해 lm 에 넣는다
- L276 — ★EXTEND: surf 를 자신의 면의 점(메시 정점·점군), normals 를 그 방향이 있는 법선으로 한다
- L299 — ★EXTEND: 자신의 군 (K,N,3) 으로 교체한다(점의 배열이 개체 간에 대응할 것)
examples/voxel_labels_color.py
- L81 — 1) ★색의 안정성 —— 이 족의 존재 이유 # —————————————————————— #
- L152 — 4) ★이방성 spacing # —————————————————————— #
examples_3d/alpha_shape_topology.py
- L149 — ★판별적 assert: 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 는 모든 프로파일(산업용에 국한되지 않음)에서 엄선된 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). 버려진 쪽이 필요할 때, 대장(ledger)의 입구에서는 닿지 않았다. 2026-09-06, 초해상 PoC 가 flow, info = fs.ledger.piv_cross_correlate(...) 라고 써서 (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 만 필요한 일차 모듈이므로, import 실패는 ‘망가진 checkout’ 이지 ‘그 환경에 없는 기능’이 아니다. 이전에는 except Exception: pass 였고, 이 함수가 생성기와 검사기를 겸하고 있기 때문에, 17 op 가 통째로 사라진 색인을 CI 가 초록인 채로 공개할 수 있었다.
- 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 — ★판정은 2 개(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)에서 PoC 4 개가
ImportError: this operator needs the optional 'torch' backend 로 떨어져 발각(수중에는 torch 가 있어 알아차리지 못했다 – ‘문은 사고가 일어나는 곳에 세운다’의 실례). 수치는 float64 의 같은 식이므로 환경에 따라 결과가 변하지 않는다. 반환 타입은 호환을 위해 그대로: torch 가 있으면 torch.Tensor, 없으면 numpy.ndarray(값은 동일). device 로 “cpu” 이외를 요청받으면 fail-closed.
- L2029 — ★2026-09-07: 본체를 numpy 로 다시 썼다. 최근접 탐색·6x6 의 정규방정식·Rodrigues 어느 것도 CPU 의 작은 선형대수라 torch 가 필요 없는데도 필수로 되어 있었다. torch 를 넣지 않은 CI(py3.10 / 3.12)에서 PoC 가 ImportError 로 떨어져 발각. 식은 같은 float64 이므로 결과는 변하지 않는다(torch 버전과의 차이는 R/t 에서 0, RMSE 에서 0 을 실측).
- L2044 (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 행렬)… 기본값만 보면 ‘숫자 1 개’로 보여, 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) 는 잡히고 위의 2 쌍은 잡지 않는다.
- L1058 — 공통 접두사 뒤에 허용하는 어미. ★접두사 길이만으로 판정하면 “median”/”medial” 이 이어진다(공통 “media” 가 5 글자 있다). 어미가 굴절 어미다운지를 보면, “correlation”/”correlate”(ion / e)는 통과하고, “median”/”medial”(n / l)과 “corner”/”cornea”(r / a)는 떨어진다.
- L1154 — ★바닥. 없으면 “zzz-nothing-matches” 가
histogram_match 를 반환한다(“matches” 가 match_* 에 어간 일치하기 때문). 맞은 단어의 가중치가 쿼리 전체의 15 % 에 못 미치면 ‘맞지 않음’으로 간주한다. 실측: “digital image correlation” 은 0.19(통과), “zzz-nothing-matches” 는 0.10(탈락).
- L1294 (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,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 에서는 같은 입력으로 1 건도 재현되지 않았다. 네이티브 빌드가 다르면 경계의 깨지는 방식도 다르다는 뜻이므로, ‘이런 종류의 입력이면 괜찮다’는 세밀한 선긋기는 믿을 수 없다 – 퇴화 입력은 통째로 거부한다. 고치면 지운다가 아니라 상류가 고쳐진 것을 확인할 수 있으면 지운다(이것은 우리 코드가 아니므로, 지우는 조건이 다르다).
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 개의 위치 인자로 나누는 형태 탓에 한 번도 실행되지 않았다). 다른 render_* 3 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를 명시적으로 거부했다. 3-D 배열은 video (T,H,W) / voxel (D,H,W) / histcube (H,W,T) / zscan 어느 것이든 동일한 구조 검사를 통과하므로, 잘못 넣어도 예외가 나지 않고 “그럴듯하게 틀린 합성 결과”를 반환한다 —— photon 족이 histcube를 voxel에서 분리한 것과 완전히 같은 위험이다. 다만 여기서는 타입을 늘리는 것이 아니라 “list일 것”을 요구함으로써 같은 방어를 얻었다. list(volume)라고 쓴 순간, 호출하는 쪽이 “선두 축이 프레임 축이다”라고 선언한 것이 된다. * image2d —— 합성 결과, drizzle 출력, 단일 프레임. 모두 2-D float64로, 기존 2-D op(필터·임계값·morphology·psf_to_mtf)가 의미를 유지한 채 쓸 수 있다. 비음수도 아니며(κ-σ 합성의 잔차나 스플라인 보간의 음의 가장자리가 나타난다), counts를 자칭하는 것은 오히려 거짓이 된다. * keypoints ——
star_detect의 반환값은 (N, 2)의 (row, col)이다. TYPE_CHECKS의 keypoints는 “(N,3) 또는 임의의 2-D 배열”이므로 그대로 해당되어 psf_fit / aperture_photometry가 소비한다.
-
L101 — ★ 여기는 pairs가 아니다: pairs의 정전은 reprconv 쪽의 6개 op가 정한 “(x, y)의 쌍”이고, 이쪽은 이미지 좌표의 (row, col)로 fit_transform / mosaic와 같은 규약이다. 섞으면 행과 열이 뒤바뀐다(features.match_keypoints가 (x,y)를 반환하는데 fit_transform이 (row,col)을 요구하는, 이 repo에 알려진 함정과 같은 형태). keypoints를 자칭하면 적어도 “이미지 위의 점”이라는 약속은 공유된다. * indices —— lucky_select가 반환하는 채택 프레임의 인덱스(1-D int). 기존 어휘 그 자체. [frames[i] for i in idx]로 images로 되돌린다. * measurement —— noise_sigma는 실수 스칼라 하나. * matrix —— frame_align의 (3,3) 동차 변환. transforms / fit_transform / mosaic가 다루는 것과 같은 것이라 전용어를 만들 이유가 없다. * table —— dict / list of dict(품질, PSF 피팅, 측광). TYPE_CHECKS의 table은 list |
dict이므로 둘 다 해당된다. 분리하지 않은 대가(honest): images 풀에 천체가 아닌 이미지 열이 들어오면 frame_align은 별을 찾지 못해 ValueError로 멈춘다. 이것은 fail-closed이므로 “발견 제로”가 아니라 “도달했지만 올바르게 거부했다”이지만, 연쇄 퍼저 관점에서는 align 계열 2 op가 CONTRACT에 그칠 가능성이 있다. photon 족이 counts를 분리한 이유(7/17이 한 번도 실행되지 않음)와 같은 증상이 나올 수 있으므로, 만약 실측에서 그러하다면 그때는 “점상을 포함한 이미지 열”을 별도 풀로 두는 판단이 정당화된다 —— 미리 타입을 늘리지는 않는다(타입은 “섞으면 거짓이 된다”는 증거가 나온 뒤에 늘린다, 가 이 repo의 순서다). |
opsconngraph.py
- L66 (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으로 명시하고 퍼저에서 실제로 실행하는 쪽을 택했다. * dem_fill_sinks의 출력만 depth —— 웅덩이를 메운 결과는 여전히 표고 격자이며 그대로 dem_flow_direction으로 들어간다. 여기를 image2d로 선언하면 족 내의 연쇄(메움 → 흐름)가 타입으로 끊긴다. * dem_flow_direction은 labels —— 반환은 int8의 0-7과 -1(유출 방향 없음)로, 순서에 의미가 없는 부호다. mask를 자칭하면 이진으로 취급되고, image2d를 자칭하면 3과 4의 평균에 의미가 생겨버린다. labels 술어(정수 dtype, 1-3차원)에 그대로 해당된다. * dem_stream_network는 이진이지만 image2d —— 내용은 0.0/1.0에 더해 결측의 nan을 가진 float64로, mask 술어(bool 또는 정수 dtype)를 만족하지 않는다. bool로 하면 “하도가 아님”과 “애초에 값이 없음”을 구별할 수 없으므로, 타입을 구현에 맞췄다. * 나머지는 모두 image2d —— 경사[도]·방위[도]·곡률[1/m]·음영기복[0,1]·기복[m]·지평선 고도각[도]·천공률[0,1]·가시[0/1]. 모두 2-D 실수 장으로, 기존 2-D op(평활화·임계값·morphology·의사 컬러·도판 주석)가 의미를 유지한 채 쓸 수 있다. 값역이 [0,1]이라는 보장은 없지만, 그것은 astrostack의 합성 결과와 같은 처지로, image2d는 이 repo에서 휘도의 약속이 아니라 “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 step 5의 12개”를 가정하므로, images의 시드가 12장이 아니면 반드시 ValueError가 된다. 이는 의도한 fail-closed(인덱스와 품질이 어긋난 맵을 반환하지 않음)이므로, 퍼저 쪽에서 장수를 맞출 것.
- L246 — ★
watermark_*의 bits는 용량(LL의 8x8 블록 수) 이하여야 한다. 64x64 image2d + level 1의 LL은 32x32 = 16 블록.
opsinterferometry.py
- L96 — ★ 기존
signal에 얹지 않은 것은 실측의 결과다. 처음에는 “csi_signal_simulate ([] -> signal)가 진짜 간섭 신호를 풀에 부으므로 도달할 수 있다”고 판단했으나, 그 배선으로 연쇄 퍼저를 돌리자 600 연쇄(300x길이6 + 300x길이8)에서 csi_peak_position과 chromatic_confocal_height가 한 번도 실행되지 않았다(기록은 CONTRACT 7건뿐). 원인은 signal 시드가 음수를 가진 정현파여서, 입구 op가 같은 연쇄에서 먼저 뽑힐 확률이 낮기 때문이다. opsphoton이 counts에서 밟은 함정과 완전히 같으며, fail-closed가 완벽히 작동한 결과로 “발견 제로”가 견고함처럼 보인다. sweep을 전용 풀로 한 동일 조건 재측정에서는 9개 op 전부가 실행되었다. 2개 타입을 섞어도 잘못 넣은 것이 조용히 통과하지 않음은 각각 전용 판별로 보장되어 있다(둘 다 폐형식으로 측정한 임계값): - 스펙트럼을 csi_peak_position에 넘김 → carrier_tolerance. 간섭 신호는 반송파가 2/λ(Nyquist의 0.333)에 서지만, 공초점 피크는 0.010이다. 실측에서 1000배의 단위 오류도 같은 검사가 잡는다. - 간섭 신호를 chromatic_confocal_height에 넘김 → max_carrier_fraction. 공초점 응답의 AC 성분은 저주파뿐(실측 0.010 / 0.010 / 0.015), 간섭 신호는 0.333이다. 입구 = csi_signal_simulate / chromatic_confocal_simulate(둘 다 인자 없이 생성), 출구 = csi_envelope (-> signal)와 2개의 measurement op.
opsmath.py
- L97 (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로 신고하면 “점군의 법선을 넘겨도 된다”는 거짓이 되고, 연쇄 퍼저는 매번 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를 “호출”하는 것은 전혀 막히지 않는다(타입 어휘는 연쇄 퍼저의 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도 실측으로 확인됨: reprconv.flow_magnitude에 2-D 플로우를 넘기면 ValueError(“(3, D, H, W)를 취함”이라고 명시적으로 거부), piv_vorticity에 3-D 씬 플로우를 넘기면 ValueError. * 입력 이미지 쌍은 image2d —— 입자 이미지는 2-D 실수 장 그 자체로, 기존 2-D op(평활화·임계값·배경 차감·도판 주석)가 의미를 유지한 채 쓸 수 있다. 휘도가 [0,1]에 들어간다는 보장은 없지만, 그것은 astrostack의 합성 결과와 같은 처지다. * piv_outlier_mask는 mask —— bool의 2-D로 술어대로. 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와 같은 판단). 단위를 타입으로 분리하는 안도 검토했으나, m/s를 만드는 op가 하나뿐이고 소비하는 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 실신호에서는 옳지만, 2축이 갖춰지면 부호는 보존된다). 테스트가 먼저 깨져 드러났다. 실제로 사라지는 것은 “쌍 중 어느 쪽이 진짜인가”와 진폭의 절반, 그리고 비모호 측거 범위의 절반이다.
_as_beat_cube가 dtype 단계에서 거부하고, 고치는 법(해석 신호를 명시적으로 만듦)을 명시한다. ————————————————————————– 좁은 sort로 만들지 않기 위한 입구와 출구(실측한 교훈에 대한 대처) ————————————————————————– 본 repo는 실제로 2개의 함정을 밟았다: ① 낳는 op가 없는 타입은 영구히 도달 불가(score가 434 op 중 유일한 1건 blocked였던 건), ② 기존 풀에 얹으면 매번 fail-closed로 튕겨 “발견 제로”처럼 보임(photon 족 7/17이 미실행이었던 건). beatcube는 양쪽 모두에 손을 써 두었다: 입구(beatcube를 낳는 op) : fmcw_beat_simulate(인자만, 입력 타입 없음) fmcw_window_apply(beatcube -> beatcube) 출구(기존 sort로 돌아가는 op) : range_doppler_map -> image2d(최대 풀) fmcw_range_profile -> signal beamform_delay_sum -> signal beamform_doa -> table 입구가 “인자만의 원천”인 점은 tcspc_simulate(입력 타입 없음 -> counts)와 같은 형태이므로, 연쇄 퍼저에는 counts와 마찬가지로 전용 생성기가 필요하다(부모에게 넘기는 사항; 생성기의 실체는 실행 확인되어 보고에 실려 있다). 출구는 image2d와 signal이라는 본 repo에서 최대급의 풀 2개로 떨어지므로, jones(2 op)나 countrate(2 op)와 같은 닫힌 좁은 sort가 되지 않는다.
opsreprconv.py
- L257 — ★
flow는 하나의 술어로는 쓸 수 없다. 밀 (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 법선은 부호가 임의여서, 회전하면 40%의 점에서 뒤집힌다. 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 에서 수작업을 이긴” 것처럼 보이게 했다. 순수한 3-분할에는 pool >= 3n 이 필요하다. 그보다 작은 pool 은 깨끗한 holdout 을 낼 수 없으므로, 조용히 누출하기보다 거부한다.
profileops.py
- L270 — ★ 처음에는 “곡률이 큰 쪽”으로 써서, NACA 2412에서 뒷전을 앞전으로 판정했다. 3점 원의 곡률은 상하면이 거의 맞닿는 뒷전에서 앞전의 둥그스름함보다 크게 나온다 —— “앞전은 둥글다”는 직관이, 윤곽 위의 3점으로 재면 역전된다.
- L277 — ★ 뒷전이 열려 있으면 가장 먼 2점이 뒷전의 모서리 한쪽을 집어 현이 기운다. 틈의 중점에서 다시 잡은 뒤, 앞전을 “그 중점에서 가장 먼 점”으로 정한다. 이를 하지 않으면 대칭 날개에서도 뒷전의 반 틈만큼 캠버가 나온다(실측 0.001257).
- L643 — ★ 맞추기 전에 같은 방식으로 다시 잡는다. 현의 틀(특히 뒷전 중점)은 점을 놓는 방식에 미묘하게 의존하므로, 생 윤곽과 다시 잡은 윤곽을 맞대면 동일한 형상이라도 0.02도의 회전과 7.8e-4의 병진이 들어간다 —— 그것이 그대로 편차의 바닥(실측 rms 6.05e-4)이 되었다. 비교할 것은 같은 무대에 올린다.
- L654 — ★ 점 대 점이 아니라 점 대 꺾은선으로 잰다. 등호장으로 다시 잡아도 둘의 위상은 일치하지 않으므로, 대응을 번호로 잡으면 위상 어긋남이 그대로 편차가 된다(실측: 같은 형상을 자신과 비교해 rms 6.05e-4 —— 검출하려는 결함과 같은 자릿수).
pxrd.py
-
| L976 (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 — ★ 실제 버그의 회귀점. 처음에는 여기가
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 — ★ 세 번째는 “나머지”다. 두 개만이면 2x3이라 역행렬이 없고, 유사역을 쓰면 잔차가 조용히 두 개로 분배된다. 직교하는 세 번째를 세워, 갈 곳 없는 밀도를 거기에 모은다(= 나중에 잔차로 읽을 수 있다).
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의 감사에서 실해를 확인: recent_files 10건 중 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: 세 번째 반환값 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). 스칼라를 넘겨도 (3,) 가 아니라 (1, 3) 가 된다 —— 대장이 points = (N, 3) 으로 선언하기 때문(2026-09-06, 퍼저의 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). 로컬에서 생성한 문서와 살아 있는 레지스트리를 비교하는 검사는 가득 찬 환경에서만 의미가 있다 —— test_opdocs 와 같은 규약으로, 갖춰지지 않으면 skip(이유에 빠진 backend 이름이 나온다). 2026-09-07 의 CI 에서 22 건이 여기서 실패했다. 환경에 의존하지 않는 검사(파일의 실재·내용의 양·그림의 실재)는 그대로 실행된다.
tests/test_docs_index_reachable.py
- L42 — ★op 집합은 환경에 따라 달라진다(Linux CI 는 torch/kornia/mahotas/xfeatures2d 가 없어 859 op, 로컬은 885). 로컬에서 생성한 문서와 살아 있는 레지스트리를 비교하는 검사는 가득 찬 환경에서만 의미가 있다 —— test_opdocs 와 같은 규약으로, 갖춰지지 않으면 skip(이유에 빠진 backend 이름이 나온다). 2026-09-07 의 CI 에서 22 건이 여기서 실패했다. 환경에 의존하지 않는 검사(파일의 실재·내용의 양·그림의 실재)는 그대로 실행된다.
- L80 — ★Markdown 문법만 보면 부족하다.
docs/GALLERY.md 는 표 안에서 <img src="..."> 를 14 군데 쓰고 있어, 소박한 ]( 스캔으로는 하나도 보이지 않는다(Codex 의 적대적 리뷰에서 판명, 2026-09-06). 생 HTML 도 본다.
- L189 — ★마커의 중복을 허용하면, 오래된 표가 하나 남은 채로도 초록이 된다. 생성기는 첫 start–end 만 고쳐 쓰므로, 두 번째는 영원히 오래된 채로 계속 공개된다(Codex 의 적대적 리뷰, 2026-09-06).
- L210 — ★예전에는 「20 줄이 있고 4 개의 차원 이름이 보인다」로 통과시켰지만, 그러면 수백 op 가 빠져도 초록이 된다(Codex 의 적대적 리뷰, 2026-09-06). 차원별 실수와 하나도 빠짐없이 맞춘다.
- L249 — ★어디가 다른지 출력한다. 출력하지 않으면, 전체 스위트에서만 실패하는 순서 의존(레지스트리 오염 등)을 쫓을 수 없다.
- L312 — ★건수와 이름만으로는, 타입 계약(in_sort/out_sort)·카테고리·HALCON 대응·tier 가 통째로 낡은 채 초록이 된다(Codex 의 적대적 리뷰, 2026-09-06). RAG 는 타입이 이어지는 op 를 고르려고 in_sort/out_sort 를 읽으므로, 거기가 낡으면 이어지지 않는 사슬을 자신만만하게 제안한다. 내용까지 맞춘다.
- 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 이름을 직접 적어 레지스트리와 맞추고, 하나라도 빠지면 「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 의 실측. 「이 수보다 나빠지지 않게」 하기 위한 멈춤쇠이지 목표값이 아니다. 대장 op 1,002 개 중 예제 색인에 든 것은 349 개뿐이고, 위의 두 「100 %」는 모집단이 3 층 중 2 층밖에 없어 성립했다. 경위와 계열별 내역 = docs/KNOWN_ISSUES.md §38.
- L32 — ★op 집합은 환경에 따라 달라진다(Linux CI 는 torch/kornia/mahotas/xfeatures2d 가 없어 859 op, 로컬은 885). 로컬에서 생성한 문서와 살아 있는 레지스트리를 비교하는 검사는 가득 찬 환경에서만 의미가 있다 —— test_opdocs 와 같은 규약으로, 갖춰지지 않으면 skip(이유에 빠진 backend 이름이 나온다). 2026-09-07 의 CI 에서 22 건이 여기서 실패했다. 환경에 의존하지 않는 검사(파일의 실재·내용의 양·그림의 실재)는 그대로 실행된다.
- L203 — ★2026-09-08: 제 3 자 백엔드의 버전에 의존하는 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(레지스트리 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)에 처음 도달했기 때문이다. 「고장 났다」와 「이 환경에 없다」는 다른 판정이며, 섞으면 환경 차이가 구현의 버그로 둔갑한다. 가득 찬 환경(FULLSEYE_REQUIRE_OPTIONAL=1)에서는 종전대로 실패로 처리한다.
tests/test_opdocs.py
- L212 — ★2026-09-03: 모든 backend 의 _safe 가 backend_safe.guard 로 통합되었으므로, qualname 의 문자열 일치가 아니라 guard 가 세우는 구조화 마커로 판정한다(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)가 일치하므로, 레지스트리 쪽에서 세는 한 「누락 제로」로 보인다. 한 번 그렇게 결론짓고 틀렸다. 그래서 이 게이트는 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 에서 빼기 전의 잔해가 다시 채워진다). 설정을 읽는 검사로는 잡히지 않는 사고이므로, wheel 실물 쪽을 tools/ci_wheel_check.py(unshipped_present)와 ci.yml 의 크기 상한이 본다. 디렉터리도 package 밖으로 옮겼다(tools/fops_article/). 여기서는 제외의 명시를 요구한다(보험).
tests/test_pivops.py
- L621 — ★이름 수준의
PARAM_HINTS 만 보면 게이트가 퍼저보다 좁아진다. chain_fuzz._bind_args 는 op 이름으로 겨냥하는 OP_PARAM_HINTS 도 보므로, 여기서도 양쪽을 본다(2026-09-06: dic 의 window / method 를 OP_PARAM_HINTS 에 넣었더니, 실제로는 바인딩되는데 여기서만 실패했다).
tests/test_poc_scripts_run.py
- L57 — ★2026-09-08: 고정 6 을 그만두고 CPU 수에 맞춘다. 공유 러너(2–4 vCPU)에서는 6 병렬이 각각을 느리게 할 뿐 총 시간이 줄지 않고, PoC 가 84 개로 늘어난 시점에 작업마다 pytest 의 900 초 timeout 에 걸렸다(py3.10 / 3.12). 로컬(12 코어)은 종전대로 6 이상으로 돈다.
- L73 — ★
PYTHONPATH 는 넘기지 않는다(2026-09-09). 오랫동안 PYTHONPATH=<repo> 를 넘겨 왔지만, 그것은 사용자가 하지 않는 설정이고, 게이트가 사고가 일어나는 곳에서 한 걸음 어긋나 있음을 뜻했다 —— 같은 맹점으로 examples/piv_flow_from_particles.py 등이 「체크아웃에서 그대로 실행하면 ModuleNotFoundError」인 채로 남아 있었다(그쪽은 실행하는 게이트조차 없어 눈치채지 못했다. test_example_scripts_run.py). PoC 쪽은 116 개 중 108 개가 스스로 repo 최상위를 sys.path 에 더하고 있고, 남은 8 개는 fullseye 만 import 하므로, 빼도 전부 통과한다(실측).
- 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 을 그냥 통과시켰다 —— 합불을 계산한 직후에 버리는 게이트(실측: PASS 를 한 번도 찍지 않는 PoC 가 3 개 —— 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 초)으로는 공유 러너에서 실패한다. 여기만 넓힌다 —— 기본을 풀면 다른 테스트의 행 감지까지 둔해진다.
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") 는 레지스트리에 고정되어 있었다 —— 이 fixture 는 아무것도 격리하지 않았다(2026-09-05, 레지스트리에 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] |
를 기대했고, 구현의 오류를 사양으로 고정하고 있었다(등속으로 움직이는 균일한 물체에서 항상 전부 0 – 아래의 회귀 테스트). |
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」의 의미 있는 동작을 한 번도 밟지 않으므로, 주기 17.0 의 열에 12 개의 무관한 사건을 섞은 구조 데이터를 씨앗으로 삼는다(난수만의 시험은 구조적 결함을 숨긴다는 이 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 모두 위의 2 형만 받고, 그 외는 “pairs: must be (N, 2) or a 2-tuple of equal-length 1-D arrays” 로 명시적 fail-closed 가 된다(실측). (2,N) 는 받지 않으므로, 2-tuple 을 np.stack 으로 (2,N) 으로 눌러버리던 adapter 3 건은 axis=1 로 고쳤다. 길이가 다른 2 개(histogram 의 counts/edges)도 「쌍」이 아니므로 걸러낸다.
- L8374 — ★「정확히 2 요소」는 pose(
len >= 2 로 info 를 허용)와 의도적으로 다르다. 실측 2026-09-02: mesh 를 1 인자로 받는 기존 consumer 4 건(face_normals / vertex_normals / mesh_area / vertex_curvature)은 3-tuple 에 대해 “mesh must be a 2-element tuple (vertices, faces)” 를 내보내고, cadmap 의 _mesh 와 render3d._mesh_arrays 도 2 요소만 받는다. 즉 이 repo 의 mesh sort 정본은 2-tuple 이며, 여분의 요소는 「정보가 많은」것이 아니라 하류가 전멸하는 타입의 거짓말이 된다. 유일한 예외였던 voxel_to_mesh((v, f, n) 을 반환)는 ops3d.RESULT_ADAPTERS 에서 정본의 배열을 꺼내도록 했다(gicp / vol_label 과 같은 취급).
- L8583 (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 에서도 tools/ 아래(비동봉 chain_fuzz 등)를 import 할 수 있게 되어, 「wheel 에 없는 것이 보이는」상태로 세게 된다. 2026-09-05 의 리뷰에서 이 문이 tb_* 143 op 의 누락을 놓쳤던 것은 바로 이것이다. 아울러 cwd 도 빈 임시 디렉터리로 옮긴다(cwd 가 checkout 이면 같은 일이 일어난다).
- L34 — ★cwd 를 옮기기 전에 원래 cwd 를 기억하고, 이후 모든 인자 경로를 여기로 해결한다. 2026-09-05 실측: preflight 는 절대 경로로 넘기므로 로컬에서는 통과하고, ci.yml 은 상대 경로로 넘기므로 dump 가 임시 dir 에 버려지고 compare 가 FileNotFoundError 로 죽었다 – 문이 실제 호출 경로에서는 한 번도 비교를 실행하지 않았다. 「문은 사고가 일어나는 곳에 세운다」의 3 번째. 호출하는 쪽을 고치는 것이 아니라, 상대 경로로 호출되어도 올바르게 동작하게 하여 이 유형째로 닫는다.
- L139 — ★2026-09-08: editable 쪽도 본다. 그때까지
a["failed_backends"] 는 모으기만 하고 아무도 읽지 않았다 – 같은 회차에 examplefig 의 그림 실패와 같은 유형의 구멍으로 적발했다. editable 의 venv 는 optional 의존이 많으므로, 버전 불일치로 backend 가 import 에 실패할 수 있다. 그때 wheel 쪽은 「의존이 없으니 처음부터 없다」일 뿐 실패를 기록하지 않고, 이 비교는 초록인 채 통과해 버린다. 떨어진 backend 의 op 는 레지스트리에서 조용히 사라진다.
- L92 — ★여기는 두 번 틀릴 수 있다. 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 — ★대역표는 op 문서와 별도의 파일에 둔다.
opdocs.T 를 쓰면 조회한 원문이 opdocs.SEEN_STRINGS 에 실려, 기존의 「프레임 대역에 구멍이 있다」 게이트가 604 건 전부를 구멍으로 세어 CI 가 빨개진다 — 그 게이트는 「프레임 문구는 반드시 5 개 언어를 갖춘다」를 위한 것이고, 이쪽은 「번역되는 대로 늘린다」는 성질이다. 같은 표에 섞으면 한쪽의 규율이 다른 쪽을 망친다.
- 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 개 섞어, 색인은 1,842, RAG 가이드는 1,843 으로 서로 어긋나는 수를 동시에 공개하고 있었다. 노트는 records 에서 1:1 로 생성되므로, records 의 이름이 「노트가 있는 이름」의 정의 그 자체. 파일과의 일치는 tests/test_docs_index_reachable.py 가 별도로 본다(사라진/남는 것을 검출).
- L291 — ★
dir(fullseye) 가 아니라 __all__. dir 은 모듈 속성(os / sys / warnings / annotations)을 포함하고, 게다가 다른 테스트가 import 한 뒤에는 하나 늘어나므로(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 — ★이것은 하계.
tests/ 에 op 이름이 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 개로는 부를 수 없고, 후자는 1-D 를 반환하는데 선언 out 이 labels(→ volume = ndim 3). 둘 다 등록된 채 한 번도 실행된 적이 없고, fail-soft 가 그럴듯한 값을 반환하고 있었다. backends_typed._OP_BRIDGE_SKIP 로 옮기고, 이 표에서는 뺐다 – 그림이 나오지 않는다는 기록은 있었는데, 실행할 수 없다는 것 자체의 기록이 어디에도 없었다(문이 2 개 있었고, 한쪽만 알아챘다).
- 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 는 첫 프레임을 낸다). 의사 컬러는 양의 장(거리·위상·방향·깊이·곡률 …)의 출력에만 걸고, 캡션에 (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 라도 1 주기가 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 — ★ 위아래 2 단으로 나눈다. 한 장에 겹치면 단위가 다른 두 선(픽셀 수와 검출률)이 같은 세로축에 얹혀 있는 것처럼 읽혀 버린다(실제로 그렇게 보였다).
- 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 1 회에 10 분이 걸렸다(toc 도 html 도 같은 색인을 다시 만들므로 전체 재생성은 30 분급). 산문 제거는 소스마다 1 회면 충분하다 —— 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-ary(다입력) 계층. 2026-09-09 까지 17 개 오퍼레이터가 노트를 한 장도 갖고 있지 않았다(
add_image, sub_image, bit_and, reduce_domain, union2 …). OP_INDEX.json 에는 tier=nary 로 실리지만 docs/ops/ 에 노트가 없어 RAG 코퍼스에서는 영영 찾을 수 없었다. 놓친 이유는 분명하다: 여기서 ops.REGISTRY 만 훑었고, ops.REGISTRY(899)와 2-D 노트 수(899)가 일치하므로 레지스트리 쪽에서 세면 「누락 없음」으로 보인다. 계층을 가로질러 세어야 비로소 드러난다.
- L1023 — ★2026-09-07:
OPS3D[...]["doc"] 는 등록 시 docstring 의 첫 줄만 잘라낸 것(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-ary 오퍼레이터는
fullseye.apply 로 호출할 수 없다 — 그것은 이미지 1 장 모델이다. 여기에 1 장짜리 호출 형태를 적으면 노트가 거짓말을 한다. 이 노트의 유일한 일이 「어떻게 부르는가」이므로, 동작하지 않는 호출 형태는 없느니만 못하다. 공개 경로는 fullseye.FullseyeGraph.
- L1301 — ★2026-09-07: 공개 경로를 먼저 쓴다. 여기는 구현 모듈의 직접 import 만 쓰여 있어서 사용자가 실제로 쓰는
fullseye.ledger.<이름> 이 나와 있지 않았다(2-D 이외의 1,244 op 전부). PoC 가 반복해서 “fs.<이름> 에 없다"고 보고한 것은 이름이 없는 것이 아니라 **입구가 쓰여 있지 않다는** 문제였다.이름>
- L1752 — ★ 입구는 6 개 언어로 낸다(2026-09-09). 잎(Studio 의 op 도움말)은 6 개 언어 10,191 페이지가 있는데도 거기로 이끄는 색인이 일본어뿐이었다 —— 번역은 있는데 다다를 수 없다는 형태의 결락. 틀의 문구는
T() 에 싣기 때문에 대역의 구멍은 기존의 문(test_chrome_translation_table_has_no_holes)이 본다.
- L1792 (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.