Fullseye 设计判断集(由源码中的 ★ 注释生成)
日本語 · English · 简体中文 · 繁體中文 · 한국어 · Deutsch
本仓库把「为什么是这样」写在源码注释里。其中标了 ★ 的是真正管用的部分——测出来的结论、踩过的坑、这样做的理由。本页由它们机械汇集而成,正本在源码一侧,因此两者不会走样。
翻译进度:612 / 1571 条。未翻译的条目照原文(日语)显示——悄悄回退到原文会看着像已翻译,所以没译就明说没译。
accel.py
- L296 (ja) — ★CPU 側(ops._otsu)と同じくビンの上端で切る(2026-09-26)。 中点で切ると argmax ビンの背景画素が前景に混ざる。ここを直し忘れると 同じ絵で CPU と GPU の答えが割れる(test_fast_parity が門)。
- L688 (ja) — ★2026-10-02: HALCON 名は
local_max(画素精度のマスク)。以前は local_max_sub_pix と書いていた。
- L812 (ja) — interior 差の判定閾値。★2026-09-20(GenSpark 第 32・33 報 N116): 0.0002 の差に “exact” と出て、 語が実測と矛盾していた —— 判定は閾値で決まるので、語に閾値を添える。
accel_match.py
- L170 — ★窗口必须比模板大,否则完全重叠的位置数会变为零 → r = T//2 + f(粗误差) + win。
acoustics.py
- L1173 — ★
med == 0 一律当作 inf 处理——连 peak 也为 0 时(静音、频带内什么都没有)也报告”无限突出的峰”。正如 docstring 所述,这两个数本是对”即使什么都没有也会返回峰频率”的诚实性指标,却偏偏朝最会说谎的方向摆动。0/0 的答案是 0.0。(2026-09-05:在 Linux / numpy 2.5.2 上暴露。旧版只是滤波残差略有残留使 med > 0,缺陷一直就在。)
- L1181 — ★全局中位数在收窄频带时会颠倒顺序(纯噪声 11375 对真正的缺陷 9433。2026-09-06 实测,见 _local_prominence 的表)。做与带宽无关的判定时用这个。既有的两个保持含义不变而保留——同名而内容改变,比增加一个更危险。
- L1789 — ★
med == 0 一律当作 inf 处理——连 peak 也为 0 时(静音、频带内什么都没有)也报告”无限突出的峰”。正如 docstring 所述,这两个数本是对”即使什么都没有也会返回峰频率”的诚实性指标,却偏偏朝最会说谎的方向摆动。0/0 的答案是 0.0。(2026-09-05:在 Linux / numpy 2.5.2 上暴露。旧版只是滤波残差略有残留使 med > 0,缺陷一直就在。)
- L2597 (ja) — ★fail-closed(2026-10-06): 全帯域の PHAT は帯域の限られた信号で黙って外す。
acquire.py
- L70 (ja) — ★公開面は本体から数える(
tests/test_acquire_contract.py の門が AST で 読み、ここと突き合わせる)。dir() は環境で変わるので一次情報はこちら。 2026-09-25 まで 7 つ足りていなかった —— 追記のつもりが当たっていなかった。
- L96 (ja) — ★2026-09-24: the table used to carry rows this module could not open.
capabilities() announced nine backends while Camera._open branched on five, so realsense, oak, zed and kinect answered ValueError: unknown backend even with the SDK installed — a declaration/implementation split of exactly the kind a “registered only” gate is blind to. Each row now names the opener, _open dispatches THROUGH the table, and test_acquire_contract.py asserts every declared backend has one. unit is the physical meaning of what grab() returns: “normalised” -> float64 in [0, 1] (an image) “m” -> float64 metres (a depth map; NEVER rescaled to [0, 1], which would destroy the measurement — 35 ledger ops take depth) (name, module-to-probe, pip, kind, unit, opener, one-line desc)
- L144 (ja) — ★No count of those SDKs is written here. The corpus lives in another tree, so a number quoted here has no gate keeping it true – it said “13” while the corpus had grown to 28 (2026-09-25). A figure nothing can check is worse than no figure. Each value names things that must exist – a test resolves every one of them, so a rename or a deletion turns the claim red instead of leaving a stale boast.
- L196 (ja) — ★
unit carries only what the standard states in prose. Where UVC does not state a unit (PU_GAIN_CONTROL says merely “the setting for the attribute of the addressed Gain control”) the entry is None – inventing dB there would be a claim the standard does not make.
- L254 (ja) — ★UVC 1.5 defines
dwExposureTimeAbsolute as “1: 0.0001 sec … 100000: 10 sec”, i.e. 100 us per step, while SFNC gives ExposureTime in us. The same number 5000 therefore means 5 ms under SFNC and 0.5 s under UVC – a factor of 100 that raises no exception and only moves the picture.
- L362 (ja) — ★This is the fix for a silent defect: a 12-bit sensor hands back a uint16 buffer, and dividing by the CONTAINER maximum (65535) instead of 4095 makes the whole image 16x too dark (measured: 4095 -> 0.0625) with no exception — every threshold operator downstream is then wrong. The container cannot tell you the depth; the pixel format can, so backends pass it in and this table decides.
- L1048 (ja) — ★
as_numpy_ndarray() はフレームのバッファをそのまま指す (vmbpy 同梱の例が「同じメモリを使う」と書いている)。vmbpy の取得は フレームを再キューしてバッファを使い回すので、複製しないと 次の 1 枚が前の 1 枚を書き換える —— 例外は出ず、絵だけが入れ替わる。
- L1425 (ja) — ★以前はここが [] を返していた。GenTL を出す全ベンダを覆える唯一の経路 だけが列挙できない、という穴だった。プロデューサは GenTL 1.6 の GENICAM_GENTL{32,64}_PATH に自分を登録するので、こちらはそれを読む。
- L1450 (ja) — ★同一性は
id。serial_number は Windows では取得できず既定 0 のまま 返るので、鍵にすると全機が同じ鍵になる(Stereolabs API reference)。
- L1459 (ja) — ★
camera_state の既定は NOT_AVAILABLE ―― 一覧に出ても塞がっている ことがある。黙って落とさず状態を添える(在るが使えない、は発見である)。 CAMERA_STATE の全メンバーは公表文書から裏が取れなかったので、 文書が名指しする NOT_AVAILABLE とだけ突き合わせる。
- L1471 (ja) — ★pyk4a は台数しか教えてくれないので、シリアルを読むには開くしかない (pyk4a の example/devices.py)。だから列挙そのものが装置を触る ―― 必ず閉じ、開けなかった機は落とさずに「在るが開けない」として返す。
annotate.py
- L3105 — ★标点(。、)本应不旋转而是靠向右上,但这里不靠——与其默默近似做不到的事,不如写进 docstring 留存。竖排中靠向右上的字(标点)。横排时位于字左下的点,竖排时来到右上——排版之道是移动位置而非旋转。Windows 的
@ 前缀字体(GDI 按 face 名选择的竖排字面)在字体侧做了这件事。Pillow 以文件路径打开字体,够不到 @ 字面,HarfBuzz 的 direction="ttb" 也会因是否安装 Raqm 而结果不同(本机 Pillow 12.3.0 的 features.check("raqm") 为 False)。遵循选择跨平台一致者的方针,这里用合成来靠位。
aoi.py
- L441 (ja) — ★積の向きが符号を決める。
fb * conj(fa) の山は「moving が reference に対してどれだけずれているか」に立つ(逆にすると符号が反転し、残差を測る ときに逆向きへ戻してしまうので、完全に一致する対でも残差が 1 を超える)。
api.py
- L170 (ja) — ★2026-10-02: 合成パイプライン 6 本を fs.<名前> から出す。以前は ``fs.pipeline3d.`` でしか届かず、 公開経路の門では「1 本も届かない島」として _INTERNAL に置かれていた。import 自体は torch が無くても 通る(torch_lazy)。torch を要るのは呼んだときの FPFH / ICP の側だけ。名前>
- L882 (ja) — ★名前はすべて glyph_ で始める。1-D / 2-D / 3-D でレジストリが分かれている repo なので、接頭辞の無い名前は公開経路ごとに別物を指す事故を起こす。
- L898 (ja) — ★JSON 一枚で受ける入口。op ではなく API 層の関数(レジストリの op は (画像, a, b) 固定でノブ 2 つなので、文字列も JSON も渡せない)。
- L953 — ★
annotate.overlay_mask 有意不暴露到顶层。同名的 imgio.overlay_mask 已作为 fs.overlay_mask 公开,其参数与含义都不同(imgio = 原始 RGB、mask>0.5、fill/margin / annotate = 角色名的颜色、也可用权重 [0,1]、拒绝形状不匹配)。在同名上加载不同的约定,调用方收到的不是异常而是看似合理却不同的图。公开 API 的破坏性变更不擅自做,故带角色的那个用 fs.annotate.overlay_mask 取用。
- L1115 (ja) — ★2026-10-02: 「名前の無い非公開関数」の棚卸しで、op として振る舞うのに公開経路が 1 本も無かった 18 本。 どれも既存の型つき台帳の約束(台帳 = 実装モジュールの集合)に合わないので、facade(fs.<名前>)から出す。 門は tests/test_hidden_ops_exposed_2026_10_02.py(定理か第 2 実装)。名前>
- L1678 (ja) — ★空・空白だけの名前は「無い」(2026-09-20、GenSpark N27): 多くの op は halcon 別名が “” なので、
name == halcon の一致で “” が lowpass に解決し、保存したパイプラインに空名が混ざると 別の op が黙って走っていた。名前の照合はこの先で行うので、ここで先に切る。
- L1681 (ja) — ★2026-10-11: このコメントと判定が docstring より前にあったので、関数に docstring が 無かった(
find_op.__doc__ が None)。説明の門(台帳・facade 版)が拾った。
- L1697 (ja) — ★大小文字とハイフンだけ違う名前は同じ op(2026-09-20、GenSpark N50): HALCON のリファレンスは GAUSS_FILTER のように大文字で書かれることが多く、
GAUSS_FILTER / Gauss-Filter が unknown だった。 正規化して 1 度だけ引き直す(元の綴りに一致が無いときだけなので、既存の解決は変わらない)。
- L1766 (ja) — ★2026-09-20(GenSpark 第 35 報 N124): 台帳 op の名前を apply に渡すと「unknown operator」と言い、 op_names() を案内していた(そこにも無い)。索引は tier を知っているので、正しい入口を言う。
- L2066 (ja) — ★2026-09-20(GenSpark 第 55 報 N199):
with strict_mode(): apply(gray, "access_channel") が例外にならず、 入力型の fallback(source=”input”)が台帳に残っていた。strict は op 本体の例外と GPU / 高速路だけが見ていて、 _guard_input と非有限出力の門は on_error しか見ていなかった —— 「厳密」が経路ごとに別の意味だった。 strict(strict_mode / set_strict / FULLSEYE_STRICT)は on_error=None のとき “raise” と同じ。明示の on_error は文脈より強い(引数 > 文脈 > 環境変数 > 既定)。
- L2097 — ★ 目前对彩色图像没有正确的调用方式:整批传入会混色,按通道调用 3 次会让自归一化的 op 把每个通道除以各自的最大值,破坏通道间的比值(灰度边缘法的角度误差从自建 Sobel 的 1.03 度 -> 每图 4.17 度 -> 每通道 27.86 度,零点 29.14 度)。倒向哪一边是契约的决定,所以这里不改动任何一个默认数值,仅在
on_error="raise" 时拒绝,默认则记入台账使其可见。详情与选项见 docs/KNOWN_ISSUES.md。
- L2385 (ja) — ★2026-09-20(GenSpark 第 26 報 N97): 素の str / dict / スカラーは ndarray でないのでここを素通りし、 既定の fallback 方針では入力がそのまま返っていた(
apply("abc", "gaussian") == "abc")。 raster を取る op には、配列にしてから同じ検査を掛ける。list / tuple は数値の入れ子として下で配列化される。
- L2421 (ja) — ★float16 / float32 → float64 の昇格は無損失(値も範囲も変わらない)なので記録しない(2026-09-20、 GenSpark N29): float16 は scipy.ndimage が扱えず op が RuntimeError → fallback で入力のコピーが 返っていた。float32 は op が float32 で走り float32 を返していた(契約は float64)。
- L2692 (ja) — ★2026-10-18(外部レビュー 0.6.0 N224): 以前の文は「got name=ndarray」だけで、受け取った image 側 (op 名の文字列)を言わず、規約の説明と食い違って読めた。受け取った 2 つと、直した呼び方を言う。
- L2813 (ja) — ★形状不一致(2026-09-19 外部レビュー #13): ラスタ同士の n-ary で形が違うと numpy の 「could not be broadcast」がそのまま台帳に残り、既定の方針では第 1 入力が そのまま返る(sort として妥当な fallback)。返り値の形だけ見た利用者には 「(32,32)+(32,16) が (32,32) で成功した」と映った。何が要るかを文で言う。
- L2817 (ja) — ★ただし第 2 入力がマスク(畳み込みの核)の op は形が違って当然 —— 3×3 のマスクを 画像と同じ大きさに埋めないと呼べない、では入口として壊れている(2026-10-12、例の 付与で発見)。核を取る op だけ名指しで外す。
- L3126 (ja) — ★2026-09-20(GenSpark 第 15・16 報 N67): 4 op の入口の関門(ops.NATIVE_CRASHES_ON_DEGENERATE)は 効いているのに、その事実は ops.py の中にしか無く、registry を使う側からは見えなかった。 行に載せる(None = 関門なし。理由の文がそのまま値)。
- L3130 (ja) — ★2026-09-20(GenSpark 第 20 報 N84): 同じ HALCON 別名を複数の op が名乗る(cv_ / sk_ の移植と コアの実装)。どれが走るかは find_op の規則(完全一致 → name == halcon → _ALIAS_CANONICAL)で 決まっていて曖昧ではないが、その事実が行に無かった。halcon_peers = 同じ別名を名乗る他の op。
- L3251 (ja) — ★2026-09-20(GenSpark 第 24 報 N95): 綴り違いの sort が黙って 0 行だった(「該当なし」と区別できない)。
- L3261 (ja) — ★台帳には入力ゼロの op(カタログを返すだけ)が在り
in_sort が None になる。 生の None を並べ替えの鍵に混ぜると TypeError で落ちる —— レジストリと n-ary だけ だった頃は None が現れなかったので、この鍵は 2026-09-25 まで壊れずに済んでいた。
astrostack.py
- L157 — ★假设检验:我们预测「只要能装进一条缓存行(64B)就不值得搬移」,但猜错了。float32 的临界点在 K≈17-19,接近 64B(K=16),但 float64 的实际临界点是 K≈23-25(约 200B),而预测是 K=8。决定它的是元素个数而非字节数 —— 每个元素的取出开销占主导。数量少时搬移反而更慢(float64 K=5 时慢 1.4 倍),所以临界点必不可少。
-
| L380 — ★MAD 塌缩为 0 但图像并不平坦 = 量化(2026-09-08,poc_thermal_radiometry 踩到的)。整数 DN 下 |
x-med |
也是整数,所以能返回的 sigma 只能是 1.4826 的倍数 —— σ=0.5 的实拍等效返回 0.0,σ=1.0 与 σ=1.983 都给出同一个 1.4826。悄悄返回 0 会让阈值与背景相同,下游(star_detect)什么都找不到。这里是返回数值的入口,所以不 raise 而是发出提示(调用者可以选 method=”clip”)。refuse 是出答案一侧 = star_detect 的职责。 |
- L617 — ★ 散粒噪声的唯一入口。photons_per_unit=1 时「期望值 = lambda」。
- L708 — ★ field_seed 固定(同一片天空),只变动 seed(不同的观测)。
- L781 — ★在 2026-09-08 之前这个门的注释写着「完全平坦 = 无法测量噪声」。错的是前提 —— σ 变成 0 还有另一条路径,即整数 DN 下 MAD 塌缩的情况(σ=0.5 等效的实拍为 0.0)。对不平坦的图像返回空并非保守的答案,而是错误的答案;实际上植入 200x200 整数帧的 2 个点目标被返回为 0 个。于是分开路径:平坦则返回空(没有星),不平坦则拒绝。
- L1106 (ja) — ★ 画像の外の中心は「flux 0・area 0・snr inf」を黙って返していた —— 拒否する。 画像の縁で欠けた開口は計算はできるが flux が系統的に少ないので
truncated で印を付ける(area_px は欠けた後の面積)。
- L1344 (ja) — 残差の sigma で下支えする。★ 以前は +inf に置き換えていたので 何も落とさず、宇宙線がそのまま平均に入った。
- L1702 (ja) — 束ねた sigma で下支えする。★ 以前は中央値画像の空間 MAD を使っていたが、 平坦な整数データではそれも 0 になり床が 1e-12 —— 読み出し雑音の +1 DN が 全部「宇宙線」になった(32x32x9 枚で真の宇宙線 1 に対し 871 画素)。
- L1743 — ★平局时选择原始票数更多的 bin。3x3 平滑从真峰的左右两侧看都得到相同的和,所以只用平滑值取 argmax 可能选中「峰旁边的空 bin」—— 实测正是如此:真实位移 (-0.087, +0.996) 的 7 + 4 票在 bin 边界被一分为二,而其中心偏了一个 bin 变成0 票(frame_align 误以为「没有重叠」而 fail-closed)。1e-6 的权重远小于平滑值的步长(1/9),所以在真有差异时不会改变排序。
- L1766 — ★2026-09-08:同时返回第二高峰的高度。星野只有一个峰,但重复结构(网点、光栅、织物)中,等高的峰会沿格矢方向平移排列,无论选哪个都会「全体赞成」= inlier_ratio 变成 1.00。赞成率并不是「答案正确的概率」,所以用另一个数来给出是否只有一个峰(0 = 单峰,接近 1 = 还有其他等价候选)。
backend_safe.py
- L212 (ja) — ★2026-09-20(GenSpark 第 44 報 N158): 環状バッファは黙って古い方を捨てる。捨てた数を数えないと、
fallbacks() が 256 件しか返さない理由が利用者から見えない(counts と件数が合わない)。
- L490 (ja) — ★2026-09-19 の門(tests/test_op_probe_ledger)が最初に捕まえたのがこれ:
fly_tau_from_expansion は 「膨張していない標本の time-to-contact は NaN(数を発明すると plausible-wrong)」と docstring に書き、 レジストリの tb_fly_tau_from_expansion はそれを signal の既定値で埋めて有限契約を守る。 関数を直接呼べば NaN の意味が保たれる(flyvision の docstring 参照)。ここに足すときは、その op の docstring に「NaN を返す理由」が書いてあることを確かめること。
- L509 (ja) — ★2026-10-18(0.7.0 の preflight の退化スイープ): 複素の sort を名乗る op でも、入力が実数の NaN / Inf だと実数の配列を返すことがある(3 op とも float64 の NaN を返した)。複素の時だけ埋めていたので、 その実数の非有限がそのまま外へ出ていた。実数でも複素数でも、非有限は記録したうえで 0 で埋める。
- L580 — ★feature op 返回的是 numpy 标量而非 ndarray,所以上面的分支从未见到它:NaN/Inf 的测量值(例如对退化帧调用 sk_blur_effect 内部的 0/0)会直接从 api.apply 流出。把非有限标量也洗到 sort 回退,使所声明的”有限、sort 有效”保证对 feature/contour 标量也真正成立。
backends.py
- L23 — ★
_safe 回退是最后手段,并且可能掩盖已死的 op。当 out_sort==”image” 时 backend_safe.fallback 返回裁剪后的输入,于是一个对任何输入其库调用都会抛异常的 wrapper,在进化 / difftest / coverage 看来就像一个能工作的恒等 op 而非失败。运行时的健壮性得以保留,但退化是可检测的:每一个被吞掉的异常都记录到共享的回退台账,strict 模式下则改为重新抛出。2026-09-02:把台账 / strict 开关下移到 backend_safe,使其他 23 个 backend 文件(各有私有的 _safe)都向同一处报告——在此之前,24 个 wrapper 族中只有本模块会记录任何东西。下面的名字作为供从此处导入的调用方与测试使用的薄别名保留。
- L819 — LBP 编码。★在 2026-09-08 之前
b 其实什么都没做,method 固定为 'default'(非旋转不变)。在实拍纹理(brick / grass / gravel)上测量,各向异性材料在旋转下移动的量是材料间距离的 9.64 倍,换成 'uniform' 后降到 1.72 倍(examples/poc_real_texture_invariance.py)。不能选就无从降低,所以分配了 b。做成阈值表是当同一轴上分支增多时的规约(不用嵌套 if)。b=0.5(默认)照旧为 'default'。
- L1035 — ★向 cv2 传入 bool 数组会让
cv2.Laplacian 破坏堆,进而在后续无关的 op 处让进程崩溃(2026-09-05 Fable 评审,我在 Windows 上 100 次内自行复现了 SIGSEGV,exit 127)。facade 会把 dtype 对齐到契约,但 op.fn 直接路径(测试、coverage、进化循环)是直通的。在族的入口对齐为 float64。
backends_auto.py
- L60 (ja) — ★scikit-image が無いときは、同じ答えを返す numpy の双子か、止まる例外か、どちらか(2026-10-25)。 それまでは
_HAS_SK / _HAS_CV が偽だと別の式(面積率、矩形の構造要素、画像平均のしきい値、 恒等写像 …)に黙って落ちていた —— min 構成(numpy + scipy)で image / region 入力の登録 op 488 本を走らせると 89 本が例外なく走って別の値を返した(tools/check_fallback_parity.py で再現できる)。 bit 一致で書けるものは numpy_twins に写し(門: tests/test_numpy_twins_2026_10_25.py)、書けないものは _require_dep で :class:backend_safe.MissingDependencyError を投げる(門: tests/test_fallback_parity_2026_10_25.py)。
- L152 (ja) — ★HALCON と同名の形状係数は、HALCON の式で計算する(2026-09-26)。 名前を借りたのにに別の量を返すと、HALCON のレシピを移してきた人が 同じしきい値で違う判定を得る —— しかも例外は出ない。一次情報: circularity C = min(1, F / (π·max²)) max = 重心から全輪郭画素までの最大距離 compactness C = max(1, L² / (4π·F)) L = 輪郭長 roundness C = 1 - σ/μ μ,σ = 重心→輪郭距離の平均と標準偏差 rectangularity 同じ 1 次・2 次モーメントを持つ矩形との差の面積を矩形面積で正規化 (https://www.mvtec.com/doc/halcon/2605/en/circularity.html ほか)
- L160 (ja) — ★HALCON の
eccentricity は3 値を返す演算子である(Anisometry / Bulkiness / StructureFactor)。2026-09-26 まで、この op は skimage の離心率 sqrt(1-(b/a)²) という 3 つのどれでもない量を返していた。 3 つとも無次元なので、そのまま返して HALCON と数が合う。円なら (1, 1, 0)。
- L174 (ja) — ★寸法を持つ特徴は HALCON と同じ画素値で返す(2026-09-26、ユーザー判断)。 それまでは画像サイズで割って [0,1] に収めていた(「解像度に依らない」規約)。 HALCON のレシピを移してきた人にとっては、正規化も式の違いと同じだけ「数が 合わない」原因になる。正規化が要るなら利用者が割れるが、割った値から画素数を 復元することはできない —— 情報を捨てない側に倒す。docs/KNOWN_ISSUES.md §51。
- L292 (ja) — ★2 次モーメントで向きが決まらない形では、向きは定義に含まれない。 正方形や円は共分散が等方なので固有ベクトルが任意に決まる —— そのまま採点すると モーメント矩形が 45 度回った状態で当たり、正方形が 0.651 になる(実測)。 HALCON は「矩形なら 1 を返す」と明記し、向きが決まらない形での過小評価は 最大 10% と書いている(https://www.mvtec.com/doc/halcon/1911/en/rectangularity_xld.html)。 等方なときは「同じモーメントを持つ矩形」が向きの数だけ在るので、どれを選んでも 定義は満たす。ここでは重なりが最大になる向きを選ぶ —— 任意性を最大側で潰す。
- L808 — ★不改变画布(reshape=False)+ 边框外镜像(mode=”reflect”)。角度为 -45°..+45°(a=0.5 时为 0°)。四角会折返映入原图,所以对像单据纠偏(deskew)那样「想用背景色填充框外」的用途,直接用并不合适(这是已知的设计判断而非 bug — 详情与取舍见
ops._rotate_img 的 docstring)。
- L831 — ★但返回值的 shape 要保持在与输入相同的画布上。这个 registry 的 image 有「段间无条件衔接」的契约,改变 shape 会让评估器无法与目标图像对齐而崩溃(实测:目标尺寸版返回 (70,50) 的瞬间,
test_evolve_is_reproducible_given_seed 以 “operands could not be broadcast together with shapes (70,50) (64,64)” 失败)。于是把重采样到 Ht x Wt 的像放在画布左上角,边距填 0,超出部分裁掉 —— 「图像现在是 Ht x Wt 像素」这一点照旧可见。
- L1103 (ja) — ★画素で返す(2026-09-26、ユーザー判断)。それまでは 3 成分とも 画像サイズで割って [0,1] に収めていた(「解像度に依らない」規約)が、 同名は同じ数を取る方に倒した —— 正規化は利用者が割れるが、割った値 から画素数は復元できない。docs/KNOWN_ISSUES.md §51。 [0] 面積(画素数)、[1] 重心の行、[2] 重心の列。 領域が空のときは面積ゼロ・中心は画像中心(fail-soft)。
- L1119 (ja) — ★3 成分を返す op は、空でも 3 成分を返す(スカラーに落ちると 受け取る側の形が入力で変わる)。円の値 (1, 1, 0) を既定にする。
- L1132 (ja) — ★頭打ちを外し、HALCON の式に揃えた(2026-09-26)。以前は
min(1.0, C'/10) で、C’ = L²/(4πF) が 10 を超える形(幅 2 px なら 長さ 80 以上の傷)を全部 1.0 に潰していた —— 傷や割れという、いちばん 見たい領域で「形が違うのに同じ数」が返っていた。HALCON は上ではなく 下を 1 で切る(画素近似で 1 を下回りうるため)。 docs/hardening/compactness-saturated-at-one.md
- L1144 (ja) — ★HALCON は同じ 1 次・2 次モーメントを持つ矩形との差で測る。 以前は軸平行の外接矩形との比(skimage の extent)だったので、 同じ長方形を 30 度回しただけで 1.000 が 0.359 に落ちていた (HALCON は 0.998 のまま)。docs/hardening/halcon-named-shape-factors.md
- L1155 (ja) — ★HALCON の roundness は
1 - σ/μ(重心→輪郭距離の平均と標準偏差)。 以前は 4A/(π·長軸²) という別の量で、16x64 の矩形で 0.239 対 0.577 と食い違っていた。
- L1161 (ja) — ★量もスケールも違っていた(2026-09-26)。等面積円の直径を画像サイズで 割っていたが、HALCON の Diameter は輪郭 2 点間の最大距離(画素)。 30x70 の矩形で 0.2585 対 74.85。おまけに輪郭版
diameter_xld は最大弦を 返していたので、双子どうしで 5.6 倍食い違っていた。
- L1169 (ja) — ★HALCON の
elliptic_axis は (Ra, Rb, Phi) を返す。 ここが返して いたのは Anisometry(= Ra/Rb、別の演算子 eccentricity の出力)を 10 で割ったものだった —— 名前が約束している量ではない。
- L1174 (ja) — ★画素で返す(2026-09-26)。頭打ちも外れる —— 厚みが画像の長辺の半分を 超える領域は、それまで全部 1.0 だった。
- L1178 (ja) — ★画素で返す(2026-09-26)。HALCON の
contlength は輪郭長(画素)。
- L1183 (ja) — ★頭打ちを外した(2026-09-26)。
min(1.0, H/W) だったので、 縦長の対象が全部 1.0 になっていた(60x20 で 1.0、真値 3.0 / 160x4 で 1.0、真値 40.0)。横長は正しく出るので、向きが変わった 瞬間に情報が消える。HALCON の height_width_ratio も軸平行の 外接矩形の高さ/幅で、上限は無い。 docs/hardening/features-saturated-at-one.md
- L1201 (ja) — ★頭打ちを外した(2026-09-26)。細長い形(幅 4・長さ 80 以上)で モーメント特徴が全部 1.0 になり、形が違うのに同じ数が返って いた。値域 [0,1] は feature の契約ではない。 docs/hardening/features-saturated-at-one.md
- L1249 (ja) — ★2026-10-07: 0 画素の平均・標準偏差は 0/0(NaN を guard が置き換えていた)
- L1345 (ja) — ★2026-10-25: skimage 無しの Moore 追跡は画素解像度の別の輪郭(点数も座標も違う)だった。 登録 op の答えとしては返さない(fail-closed)。追跡そのものは明示的に
backends_auto._moore_boundaries(mask) を呼べば使える(近似であることを名乗った別経路)。
- L1355 — ★2026-09-02:它返回的是
np.where 的整数像素坐标本身,虽自称 sub_pix 却没有亚像素精度。新增了通过抛物线拟合沿法线方向的精化(与 core ops._edges_sub_pix 相同的共享辅助函数。同名 op 在注册表中后者胜出,所以实际运行的是这个 —— 只改 core 无效)。实测(真实位置在列 20.37 的合成阶跃边缘,a=0.2):旧实现返回的列为 {20.0, 21.0},平均绝对误差 0.500 px,精化后为 {20.324, 20.370},0.0228 px(约 22 倍改善)。点的个数与连通分量的划分不变(坐标只移动不到 1 px)。
- L1434 (ja) — ★画素で返す(2026-09-26)。HALCON の
area_center_xld は (Area, Row, Column, PointOrder)。面積と重心を画素で返す (PointOrder は向きの印なので返していない —— §51)。
- L1440 (ja) — ★region 版と同じ HALCON の式。重心は囲まれた面積の重心を使う (点の平均ではない —— 点が密な側に寄ってしまう)。
- L1446 (ja) — ★region 版と同じ欠陥がここにも在った(
/10 + 頭打ち)。 直した op の双子を見落とすと、穴が半分残る。
- L1465 (ja) — ★画素で返す + 最小外接円ではなく最大弦(2026-09-26)。 領域版
diameter_region と同じ量になる。
- L1470 (ja) — ★HALCON は最小外接矩形ではなく同じモーメントを持つ矩形で測る。 輪郭を一度ラスタ化して region 版と同じ式に載せる(差の面積を 直接測るため)。
- L1476 (ja) — ★領域版と同じ頭打ちが輪郭版にも在った(2026-09-26)。 直した op の双子を見落とすと、穴が半分残る。
- L1484 (ja) — ★region 版と同じ HALCON の 3 値。Ra, Rb は囲まれた面積の幾何 モーメントから導く ——
cv2.fitEllipse は輪郭「点」への 最小二乗当てはめで、細長い形では大きく外れる(実測: 4x80 の 棒で Anisometry 39.1 対 20.65)。HALCON の定義は前者。
- L1500 (ja) — ★elliptic_axis: HALCON は (Ra, Rb, Phi)。fitEllipse は直径を返すので 半径にし、角は列(x)軸から反時計回りのラジアンに直す。
- L1502 (ja) — ★
ang は最初に返る軸(d1 = 短軸のことが多い)の向きなので、 長軸でなければ 90 度回す —— これを忘れると領域版と 90 度ずれる (30x70 の矩形で region 0 度 / xld -89.9 度、2026-09-26 に実測)。
- L1555 — ★当 b >= 0.75 时取 4 个方向(0/45/90/135 度)的平均。默认 b=0.5 照旧只有 0 度,所以现有结果一个 bit 都不会变。是否有效取决于 a(共生距离)(poc_real_texture_invariance 第 6 节,3 种实拍素材):对各向同性素材在中短距离有效,对各向异性的 brick 仅在距离 4 有效(摆幅/分辨率 3.13 -> 1.54)。距离 1 时 brick
- L1560 — 反而恶化(0.30 -> 0.56)。★根源在于拉长距离会让分辨率本身塌缩,0.0328 -> 0.0122。
- L1760 — ★2026-09-02:这两个共享
{"kind": "zoom"},因此是完全相同的实现,而且两者都没有用 b(实测:同一输入的最大差 0.0,b=0 与 b=1 之差 0.0)。在 HALCON 中 factor 版取两个倍率,size 版取目标尺寸,是不同的东西,所以拆分 kind,让实态与名称相符。
- L1833 — ★2026-09-02:旧规格是 out_sort=feature / metric=”area”,实体是
np.mean(mask) = 在图像中所占的面积比。由于 HALCON 的 area_center 是返回 (Area, Row, Column) 的 op,存在双重不一致:(1) 不返回中心 (2) 面积是比率而非像素数(= 依赖分辨率)。单个标量无法满足这个名字,所以像 ncc_locate 一样做成 match sort 的 1-D 向量,返回 (面积比, 行, 列)。match / feature 都是终端 sort(候选仅为 identity),所以基因组->op 的映射不动。
- L1840 — ★自 2026-09-26 起 3 个分量都以像素表示(面积 [像素数], 行 [px], 列 [px])。说明文仍写着归一化长达 3 周,照着它写的例子把坐标乘以 (H-1) 而出错(2026-10-15)。说明与行为的一致由 tests/test_feature_units_doc_2026_10_15.py 检查。
backends_bridge.py
- L518 (ja) — ★定数列で軸が潰れると
axes_transform は ValueError を投げる(傾きが 無限大になるため、向こうの仕様)。潰れた軸だけここで開く —— 定数列は 「描けない」のではなく「真ん中に水平線 1 本」が正しい絵。
backends_decomp.py
- L142 — ★把 BLAS 的线程上限在循环外只施加一次。这里是把限制在 work_max=64 的方阵最多 SVD 60 次的地方,占用本 repo 分解时间的大半(一次套件 30.7 秒 / 分解合计 31.4 秒,svd 23,987 次 = 98%)。64x64 的 SVD 用 24 线程比 1 线程慢 3.9 倍 —— 因为分解中的 GEMM 太小,同步开销超过计算量(表见 fsthreads 的 docstring)。每次都包裹会把机制的 2.4us 付 60 次,所以放在循环外。
- L210 — ★
ev[0] 是代数上最大的特征值,而非绝对值最大的。在明亮的脊上主曲率为负,所以 ev[0] 是绝对值较小的那个,给出脊上为 0、两侧为 1 的相反响应(2026-09-05 Fable 评审,实测 [1, .64, 0, 0, 0, 0, .64, 1])。按说明取绝对值最大者。
backends_measure1d.py
- L83 (ja) — ★ A float image in 0..255 (cv2.imread(…).astype(float)) was clipped to a flat 1.0 above 1 — every edge brighter than 1 vanished silently.
backends_r3.py
- L49 — ★在 2026-09-05 之前用
except Exception: out = None 吞掉了异常。注册时外层施加了 backend_safe.guard,但在内层消除异常后外层什么都看不到 —— 即使 strict mode 也不抛异常,台账里也不留痕。这是 2026-09-02「24 族中只有 1 族到达台账」审计的漏网(Fable 的对抗评审作为第 5 族指出)。让异常原样向外抛出:外层 guard 记录它,落到符合 sort 的值,strict 则重新抛出。
- L441 (ja) — ★探針は 32 px(2026-09-19、GenSpark 第 7 報 N12): 24 px だと db4 / sym4 の level=2 に足りず (必要 (8-1)·2² = 28 px)、import のたびに pywt の「Level value of 2 is too high」が漏れていた。 さらに
python -W error::UserWarning では警告が例外になり、この try/except が xwt_visushrink / xwt_firm_denoise を黙って落としていた(931 → 929 op、FAILED_BACKENDS にも残らない)。 探針は機能の門であって警告の門ではないので、探針の中の警告は数えない。
backends_scipy.py
- L198 — ★当 lambda >= ~12 时 scipy 抛出「boundary conditions did not converge」,guard 的 fallback 变成了恒等(旧的 1+40a 在 a>=0.3、含默认 0.5 有 7 成为恒等。2026-09-05 Fable 评审)。说明也对齐到 1〜11。
backends_subpix.py
- L453 (ja) — ★2026-10-02: 以前は halcon “” で「local_max_sub_pix は core op が既にカバー」と書いていたが、 core の
local_max が名乗るのは画素精度の HALCON local_max(サブピクセルではない)で、 local_max_sub_pix を名乗る op は 1 本も無かった(accel の表だけが誤って書いていた)。 兄弟の sp_local_min_sub_pix は local_min_sub_pix を名乗っており、max 側だけが空いていた。
backends_typed.py
- L493 (ja) — ★2026-10-07: 空入力を op が正しく拒否した後、ここが空配列の平均 = NaN を返して いた(8 op。外側の guard が置き換えるので有限に見え、台帳にだけ source=output で 残っていた)。拒否の後始末が 0/0 を作らないよう、空なら 0.0。
- L570 (ja) — ★本当に効く r_lo / r_hi(半径の窓)だが、後者は既定が None で「データから決める」 意味なので、正の数値既定を要求する橋の選定には載らない。嘘のノブを 1 本足すより a だけを配線して b を『未使用』と書くほうが正しい。
- L588 (ja) — ★2026-10-07: 相対スケールの端が定義域の外へ出ていた 2 本(契約電池で、端の knob が 全入力で拒否されていた)。両端は a=0.5 の値が相対スケールと同じになるよう選んだ (window 10 / k 3)—— 既定の挙動と図の主図は動かない。整数の既定を持つ引数は
_make_runner が整数に丸めて渡す。
- L594 (ja) — ★2026-10-18: points_render の不透明度は (0, 1] —— 既定 1.0 の相対スケールは a > 0.5 で 1 を超えて拒否。 足跡の半径は 0.5〜4 画素(a=0.5 で 2.25)。
- L607 (ja) — ★2026-10-07 実測:
tb_cx_apply_transfer_function は H を 32x32 固定で束縛していたので 32x32 以外のスペクトルでは全入力・全 knob で拒否していた(契約電池 24x24、図 128x128)。 tb_temporal_band_power / tb_temporal_bandpass は帯域 [3, 5] Hz 固定で、12 フレーム / 32 fps の探針(ビン間隔 2.67 Hz)には帯域内のビンが無く、契約電池で一度も計算されていなかった。
- L801 (ja) — ★cleandoc で共通の字下げを外してから継ぐ(2026-10-11)。.strip() だけだと 1 行目以外が 4 字下げのまま残り、 字下げの無い橋渡し文を後ろに足すため後段の cleandoc も最小字下げ 0 と見て外さない → docs/ops の Markdown で空行の後の本文がコードブロックとして表示されていた(tb_ 146 本)。
- L886 — ★在 2026-09-05 之前通过操作 sys.path 读取
tools/chain_fuzz(未随附)。在 wheel 中会失败,而下面的 build() 悄悄返回 [],所以 tb_* 143 个 op 消失了。
ballistics.py
- L309 (ja) — ★減衰つき(Levenberg–Marquardt)。素の Gauss–Newton は軌跡が短い(曲がりが雑音に埋もれる)と ω の方向が ほぼ不定になり、1 歩で 1e7 rad/s へ飛んだ(2026-09-30、PoC ㉔ の 10〜45 コマ)。費用が下がる歩だけ受け入れる。
- L804 (ja) — ★ dt が標本間隔を超えると模型は標本の間で区分線形になり、C_d と推力が別の値に化けるのに例外も NaN も出ない (30 fps の同じ軌跡で dt = 0.5 s にすると C_d 0.33 → 3.1、2026-10-23 の敵対的レビュー)。歩数の上限は ms で渡した t を止める。
- L965 (ja) — ★ 残差が離散化の床にあるなら n·ln(RSS_b / RSS_t) は丸め屑の比を増幅するだけ(雑音ゼロの真値で +144、推力の推定値は 3e-14 m/s²)。
blob2d.py
- L289 — ★注意符号:顶点按 (row, col) 顺序排列,所以
_monotone_chain 返回的朝向是(把 row 视为 x 的)逆时针 = 屏幕上为顺时针。内侧是叉积非负的一侧(写成 <= 0 会让所有物体 solidity 为 0)。
- L621 — ★仅靠腐蚀只会出现一侧。编号较小的物体,即使旁边来了编号较大的物体,邻域最小值仍是自己,因而被判为「内部」(2026-09-06 实测:在 1 与 2 相接的列,1 一侧的轮廓消失了)。同时看膨胀就得到「邻域中有与自己不同的编号」这一对称判定。
calib.py
- L274 — ★2026-09-06 实测了这个门在实机相机上不会触发。在无畸变的合成数据上按设计工作(倾斜 0 度时比 3.8e-14,0.05 度时 8.6e-10,均拒绝)。但加入现实的桶形畸变 k1=-0.18 后,平面单应模型本身就不再吻合,比值与倾斜无关地钉在 1.9e-06 附近(0 度 1.916e-06 / 0.05 度 1.935e-06 / 0.2 度 2.005e-06)。
- L280 — ★仅当两个条件同时满足时:存在畸变,以及视点间板子横向移动。只要满足其一,门就按设计鸣响(切分见 tests/test_calib.py 的 3 条)。而实际的标定会话是手持移动板子拍摄的,所以两者必然同时满足。也不是提高阈值就能解决 —— 有畸变时,完全退化 1.92e-06 与倾斜 2 度 4.42e-06 之差只有 2.3 倍,画不出分界线。因此:* 阈值保持不变(对已去畸变的点能正确生效)* 把比值本身作为
orientation_rank_ratio 返回 * 让实际拦截的后段门说出「请倾斜板子」(下)。无法修复,那就把判断材料交给使用者。
caltab.py
- L256 — ★这个门抓不到的东西:对单张平面靶标的内参误差(尤其是 fx/fy 之比)。单个平面的 homography 只对内参施加两个约束(Zhang 2000),所以错误的 fy 大多被这里求解的位姿 6 自由度吸收,残差可能留在阈值之下。实测 2026-09-05:即使把 fy 从 500 -> 300 弄错,Linux/scipy 1.18 上 RMS 也只有 0.90 px(正确 K 则为 0.14 px)。同样的输入在 Windows/旧 scipy 上变成 6.39 px,仅凭优化收敛点的不同就「能检测到或检测不到」。若想验证内参,请取 3 个以上视点或使用非平面靶标。这里有效的是「位姿无法吸收」的不一致(对应关系错误、非平面板)。
carpath.py
-
| L169 (ja) — ★OMPL の mod2pi は (−π, π] に折る(Python の [0, 2π) ではない)。ここを [0, 2π) にすると t >= 0 の判定が常に真に なり、CCSC 系 8 語が一度も候補に出ず(2026-09-28 に語の族を数えて発見)、負の区間長が 2π − |
t |
の遠回りに化ける。 |
champion_to_macro.py
- L225 — ★强制执行招牌式的诚实主张(“DNA op 只在锁定的 holdout 上胜过手工基线时才添加”)——此前这个标志只是打印出来却从不设门,于是比手工更差的宏也能被注册,并被下一轮进化选中。除非显式覆盖,门会拒绝它。
conngraph.py
- L357 (ja) — ★2026-10-07: 非零の向きつきグラフに閉路(自己ループ含む)が無ければ W は冪零 = 半径はちょうど 0。 ARPACK は冪零(Jordan 塊)で擬スペクトルの縁を返す(鎖 500 個で 0.366、層状 DAG で 3.6e-5 → reservoir_from_graph が 0 を拒否せず 2.5 万倍に拡大した)。残差では見分けられないので構造で判定する。
- L365 (ja) — ★2026-10-07: 強連結成分で並べ替えると W はブロック三角 → 固有値は対角ブロックの和集合。 既約な非負ブロックなら Perron 根に ARPACK が確実に届く(冪零な DAG 部分は 0 に寄与)。
- L727 (ja) — ★ 軸ごとに [0,1] へ伸ばすと(成分が横一列のとき)縦だけ 3 倍に伸びて 成分内の距離が成分間より大きくなる —— 全体は一様に縮める。
- L1077 (ja) — ★2026-10-07: 入力の和が 0 以下の受け手(負の重みが勝つ)は「和を 1 に正規化」できない。 以前は 1e-300 で割って 1e300 倍に吹き飛び、linear の正規化で他の列が 4e-301 に潰れた。
- L87 — ★不保证位一致(2026-09-05 更正)。数学上按行独立,但
U @ w 是 BLAS 的 GEMM,所以规约的划分与向量化路径会随行数 M 变化,舍入可能改变。实测:一旦给 CI 的 py3.11 作业加入 torch(= 一旦载入了另一个 OpenMP 运行时),分块与否结果就不一致。保证的是数值上的一致(数个 ULP),而非 bit 一致。
demops.py
- L105 — ★不提供用中位数等填补的选项。填补会造出不存在的平原,不抛异常地放水通过。但效果的大小要如实写下。在同一份实测数据(东京湾岸 1024x1024,缺测 3.83%)上比较 3 种方式的最大汇水单元数:出流口 312,108 (29.8%) / 中位数填补 338,188 (32.3%) / 墙 315,023 (30.0%)。填补大约夸大 8%,但「一个单元汇聚全体的 3 成」这件事本身就是此地形的实际(平坦的填海地确实会汇向一处)。最初只看填补就写「这个数字是填补的产物」是夸张,取了对照后效果就缩小了。不放填补选项,是因为会无法区分哪里是真实地形、哪里是填补,而非因为数字会以数量级变化。
- L613 — ★这个慢是在 PoC(examples/poc_dem_terrain.py)中 513^2 的天空可视率花了 41.9 秒才第一次注意到。测试只用了小格子,确认了「能动」但没确认「能用」。
- L694 — ★2026-09-08 修正(
poc_stockpile_volume 发现)。当视线的采样经 np.rint 舍入到目标单元自身时,就会把该单元的高度当作「途中地形」来与自己比较。由于 t < 1,分母 dist*t 很小,(z-eye)/(dist*t) > (z-eye)/dist 在 z > eye 时必为真 —— 高于视线的单元几乎都自遮挡了。实测(修正前):平地上高 10 m 的柱子在 25 m 外、视线 2 m 处返回「看不见」,只有低于视线的 1 m 柱子「看得见」。凸立体的最高点从外部必然可见,所以这在几何上是错的。采样落在目标单元上的那次不计入。
- L754 — ★台账声明
points = (N, 3)。传入标量会变成 (3,),与声明不符,所以总是折叠为 (N, 3)(2026-09-06 由 fuzzer 的 TYPEMISS 暴露。加入 6 个地心坐标 op 后没有跑 fuzzer)。若想保持格子形式的 (H, W, 3),请用 :func:dem_geocentric_grid。
-
| L807 — ★渐屈线内侧的大地纬度不唯一 -> 不悄悄返回超出范围的纬度,而是拒绝。椭圆 x²/a² + z²/b² = 1 的渐屈线为 (a·x)^(2/3) + (b·z)^(2/3) = (a²-b²)^(2/3)。只有等号外侧才是「法线唯一确定」的区域(2/3 次幂非负,所以符号取 |
z |
)。 |
- L988 (ja) — ★ 鎖の残り。ECEF ↔ 測地座標 は在ったが、その先(ジオイド高・標高・datum・ENU) # が無く、能力ノート docs/capabilities/geodetic-frames.md に「どれも未実装。 # GNSS が返すのは楕円体高で地図が使うのは標高、取り違えると日本付近で 30〜40 m # 静かにずれる」と自分で書いてあった。ここを閉じる。 # ————————————————————————— # :func:
dem_height_frame_convert が受ける高さの基準。
detect.py
- L60 (ja) — ★しきい値は argmax ビンの上端(2026-09-26、ops._otsu と同じ直し)。 中点だと argmax ビン(背景の山を含む)の画素が前景に入り、平らな板で 全画素が 1 つの対象として返っていた。
device.py
- L62 (ja) — ★
available は「SDK が入っている」であって「Fullseye から開ける」ではない。 2026-09-25 まで名簿はこの 2 つを 1 つの欄で答えていた —— dynamixel_sdk を入れた 機械で available は True になるのに、open_driver("dynamixel") は「その SDK を 直接使え」と断る。読んだ人は「対応済み」と受け取る。 implemented は環境に依らない(この版に一級のアダプタが在るか)ので、表にも 書けるし、どの機械でも同じ門で見られる。「いま開けるか」は implemented and available。
- L68 (ja) — ★欄の名前は自分で決めていない ——
acquire は既にこの区別を持っていた (implemented = opener が在る / available = SDK が在る、「the two are different questions」と註まで在る)。同じ問いに 3 層が別々の語で答えると、 読む側は毎回学び直す。先に正しかった層の語に合わせる。
- L105 (ja) — ★名簿の綴りと構築子の綴りが違っていた。 名簿(
capabilities())は io-modbus と名乗るのに、構築子は DigitalIO("modbus") を取る —— つまり表を読んでそのまま渡すと ValueError になっていた。名簿を 印刷しておきながら、その綴りで呼べないのは名簿の側の不備である。
- L161 (ja) — ★名簿に 12 載せて、扉が 3 つしか無かった(2026-09-25)。
capabilities() は I-O・サーボ・ロボット・ROS を名乗るのに、開ける口が在ったのは :class:DigitalIO の 3 backend だけで、残り 9 には入口が 1 つも無かった —— 名簿を読んだ人が、そこから何かを始める方法が無い。隣の層(comm)は 同じ問いに既に答えていたので、これは機能の不在ではなく片側の入口だけが 塞がれていた型である。開けないものにも「何を入れればよいか」を返す。
- L189 (ja) — ★PyPI に無い SDK(ベンダ配布の wheel)は「pip install None」と言わせない。
drivehumanoid.py
- L375 (ja) — ★ユーザー案(2026-10-03)「あらかじめ物体ごとの描画をマスク付きで作っておく」。精細なメッシュを向き × 位相ごとに 一度だけ描き(色・マスク・深度のずれ)、毎コマは縮めて貼り、世界の深度と比べて前後を決める。見た目は精細なまま、 1 体の費用は貼る画素の数だけ。近似は 2 つ(門で大きさを測る): (1) 方位を n_yaw 段に丸める、(2) 事前描画は水平に 遠くから見た像なので、カメラが高い・近いときの透視の違いを無視する。
driveinf.py
- L209 (ja) — ★道の帯は step ごとに切る: 描画器(render3d)は頂点が 1 つでもカメラの後ろにある三角形を捨てるので、100 m 級の 1 枚の帯は車載カメラから丸ごと消えた(2026-10-01)
driveworld.py
- L615 (ja) — ★2026-10-07: 置いた高さ z を物体に残す(残さないと world_move が元の z を外せず、z=2 で置いて z=2 へ動かすと底が 4 になった)
dualxray.py
- L218 (ja) — ★2026-10-15 探針で見つけた: Pb 50 mm でも e^{-130} は 0 にならず、正規化すると「ほぼ何も通らない」スペクトルが ふつうの顔で返っていた。透過が 1e-12 を切ったら値を返さず拒否する。
- L956 (ja) — ★2026-10-15 探針で見つけた: Fe(26)より上は R がほとんど同じになる(80 kV・窓 20/45 keV の薄い板で Fe 4.403 / Ni 4.417 / Cu 4.418 / Zn 4.416 —— Cu と Zn は逆転する)。区別できない範囲を照合に入れると、 単調性の検査で拒否するか、雑音で Z が 26〜30 を飛び回る。照合は Fe までにし、それより重い R は範囲の外(NaN)。
engine.py
- L190 (ja) — ★backend が入っていないだけの名前は「unknown」でなく不足 extra を言う(api._resolve と同じ門、2026-09-19)
- L243 (ja) — ★op 名は文字列でなければならない(2026-09-20): 以前は str() で何でも名前にしていたので、 {“op”: “gaussian”} が “{‘op’: ‘gaussian’}” という op 名になり、run で unknown operator になっていた。 名前の規則は stage_name の 1 本(diagnose_stages / unified.Pipeline と共有)。
- L274 (ja) — ★2026-09-20(GenSpark 第 30 報 N107): {“stages”: None} が 0 段のエンジンになり、run が入力をそのまま 返していた(壊れた設定が「成功」)。[] は文書どおり恒等、None / 数値は設定の壊れ。
- L280 (ja) — ★2026-09-20(GenSpark 第 30 報 N107 の ‘x’ の行): 文字列は 1 文字ずつ段になっていた。from_ops と同じ ops 文字列。
- L372 (ja) — ★範囲外は断る(2026-09-20、GenSpark N40): –upto 9 / -1 が黙って全段 / 0 段になっていた
evis_fullseye_bridge.py
- L152 (ja) — ★The sky is “infinitely” far (measured: 998 in a world whose animal is 0.3 across), and with the sky in view the 3rd/92nd percentiles straddle it, so the panel collapses to two flat colours — sky and everything-else. depth_max cuts the band at a distance that means something for this body, so the scene gets the colour range instead of the sky.
- L171 (ja) — ★ego_camera(モデル自身の目)でも eye パネルを出す。ここを ego>=0 だけで見ていたので、 ハエの複眼から描いたのに複眼の絵がコマに入らなかった(2026-09-14 実測)。
- L180 (ja) — ★drop frame 0: the event panel has no previous frame to difference against, so it is blank by construction. Keeping it makes the first thing a reader sees a black panel, which reads as “the events never fired” (measured: frame 0 has 960 lit pixels, frame 20 has 35,550). The stats below still count every frame that was rendered.
- L189 (ja) — ★distances carry the MODEL’s unit, not metres: the fly world is cm/g/s, so reporting “6.96m” for a 7 cm walk is a lie the caller cannot see.
unit names it honestly.
examplefig.py
- L148 (ja) — 書いた図の sha256 -> 名前。★同じ中身の図が 2 枚出たら台帳に積む
- L220 — ★
colorize_depth 返回 float [0,1]。用 np.asarray(..., np.uint8) 接收会把所有 0.x 截断为 0,变成全黑(2026-09-06 踩到)。
- L378 — ★不要丢掉示例的正文。图出不来固然遗憾,但数字必须给出。
- L417 — ★这里不能甩给 :func:
_to_rgb8。它把 (H,W) 传给 colorize_depth,但在其中会逐帧归一化,所以全为 0 的帧和全为 1 的帧会出同样的颜色(2026-09-09 被测试抓到)。只有显式传入值域,尺度才会统一为一个。
- L482 — ★Pillow 会把与前一帧完全相同的帧折叠为一帧(那部分时间会加到前一帧的显示时间上,所以动作速度不变)。写完后计数,若与传入的数不同就在台账里两者都留下 —— 以免把嘴上说「72 帧的 GIF」而内容只有 40 帧的情况悄悄放过。
- L650 — ★2026-09-08:面板小时标题放不下,
annotate_figure_grid(正确地)拒绝,于是有一张图悄悄消失了。29×19 的 core 格子或 24×24 的缩小图在 PoC 里很常见,可错误却说「把标题缩短」—— 实际的修法是「把面板放大」。两位负责人独立地掉进同一个坑(有过看板的 scene 图消失一张的例子),所以不让每个调用者各自写放大,而在这里只做一次最近邻放大。用最近邻是为了在放大时不造出值(插值会在图上产生并不存在的中间值,伪彩会说谎)。
- L767 (ja) — ★2026-10-03: 下の余白を 16 px 広げた。軸名の帯(左下)が x 軸の目盛りの数字に重なって 「0.5」や「20」を隠していた(transforms_tour の図で踏んだ。全部の save_plot に効く)。
- L779 (ja) — ★2026-10-21: 棒を 1 本ずつ別の系列にした図(色を棒ごとに変えるため)は、系列の中に x が 1 つしか なく plot_series が間隔を知れないので、棒が描画域の 70 % の幅になり隣と重なった(製造公差 PoC の 歩留まりの対比図で目視)。棒の x を全系列から集め、その最小間隔(棒が 1 本しかなければ目盛りの 間隔)を画素に直して、1 点の系列にだけ bar_width として渡す。複数点の系列は従来どおり自分の間隔。
- L811 (ja) — ★2026-10-03: 凡例はデータを最も隠さない隅に置く(MATLAB の legend(‘best’))。右上固定だと 減衰の遅い応答の山が凡例の下に隠れた。点の数で象限を選ぶ最初の版も、Runge の端の山を 半分隠した —— 隠れるのは「点」でなく「線の画素」なので、各隅に凡例を試しに描き、 その矩形の下にあるデータの画素(背景でも格子でもない画素)を数えて最少の隅を選ぶ。
examples/acoustic_condition_monitoring.py
- L469 — ★抛物线插值仍残留向整数拉的偏差(因为峰是 sinc 状的,无法用二次完全逼近)。从 0 扫到 1 实测偏差,展示它呈 S 形 —— 若止步于「读到了亚样本」,这个偏差就会悄悄搭在结果里。
examples/annotate_paper_tour.py
- L51 — ★EXTEND:把 text 和 path 替换为你自己图的文字与折线 (x, y)
examples/blas_thread_budget.py
- L117 — ★这是要点。96x96 并不是”因为小所以快”,而是一个正因为小才使多线程反而吃亏的尺寸。在循环外放置一次(若每次迭代都包裹,就要把限流机制本身的开销付 30 次)。
examples/blob_split_tour.py
- L98 — ★实测(honest):高度 2 < h 的条上也会立起种子。blob_seeds 以残差
f - R > 0 作为种子,但若对每个分量以背景 0 重建,峰高 M < h 的分量得到 R = M - h < 0,于是残差在该分量的全部像素乃至背景 1 px 的边缘都为正(skimage 的 h_maxima 以 残差 >= h 剔除)。不修改实现,仅作报告。此处去掉条的种子,验算”无种子团块”的路径。
- L129 — ★实测(honest):割缝并不落在交线上,而是编号较大的种子一侧沿谷底吃进。blob_split 逐级膨胀,将”同时被两个区域触及的像素”赋给 grey_dilation 的 max(=较大编号),因此经 8 连通的斜向链式传播,编号较大的区域沿谷线侵入数列。互换种子编号,侵入方向也随之互换(是编号的偏置,而非几何)。不修改实现,仅作报告。
- L153 — ★实测(honest):若按教科书的 h-maxima,当 h 超过”较低山峰的凸起(16 - 鞍部 10.07 = 5.93)”时,两个种子就会融合为一。blob_seeds 以残差 > 0 作为种子,故残差 = min(h, 凸起) > 0 恒成立,较低山峰的种子不会在该 h 处消失。融合发生在 h 超过”较高山峰 - 鞍部(22 - 10.07 = 11.93)”时——它所参照的山峰正好相反。
examples/coherence_scanning.py
- L166 — 6) ★ 与相移法的对照 # —————————————————————— #
examples/dem_geodesy_tour.py
- L49 — ★若不把仓库根目录加入路径,就找不到
demops(本例不 import fullseye,因此路径钩子不生效)。
- L61 — ★EXTEND: 替换为你自己瓦片的西北角(此处在东京附近)。
- L131 — ★诚实的分解:Bowring 的单次迭代在椭球面上为 1e-9 m,但高度越高误差越大(实测 8848 m 处 8e-7 m,20 km 处 4e-6 m)。docstring 中的”1e-12 度 / 1e-7 m”是近地表值,在平流层高度并不成立。用于地形(高程 < 9 km)时为 1e-6 m,此处将阈值设为 1e-5 m。
- L160 — ★EXTEND: 将 dem 替换为真实数据(第 0 行为北)。此处为已知的斜面。
examples/dem_terrain_analysis_tour.py
- L46 — ★若不把仓库根目录加入路径,就找不到
demops(本例不 import fullseye,因此路径钩子不生效)。
- L59 — ★EXTEND: 单元尺寸 [m]。真实数据用 dem_cell_size_webmercator(zoom, 纬度) 求得。
- L158 — ★诚实的观察:当斜面中途存在缺测时,其正北的邻元即便是 outlet 也不落向缺测,而是流向西南(有有限落差的方向)。实现是”仅当别无下降去处时才落向缺测”,比 docstring 的”允许流向缺测”更窄。此处仅打印,不 assert。
examples/example_inner_diameter_mm.py
- L67 (ja) — 穴(暗い側)を前景に。★面積の大小では決めない —— 穴と地の面積がほぼ同じだと 取り違える(R=100 px の的で地の側を「穴」と取った、2026-10-15)。輝度で決める。
- L71 (ja) — area_center は (面積 [px²], 行 [px], 列 [px])。★2026-09-26 に正規化 [0,1] から HALCON と同じ画素値に変わった(ecdaf14637)。
examples/gallery2d_color_artistic.py
- L224 (ja) — ★向きも見る(2026-09-26)。ここまでの確認は「二値」「自明解でない」だけで、 どちらの向きでも通っていた —— 実際この op は兄弟の補集合を返していた (docs/hardening/itk-threshold-ops-returned-the-dark-side.md)。明るい画素の 方が region に入ることを、入力そのものと突き合わせて確かめる。
examples/gallery2d_edges.py
- L217 (ja) — ★null を破るのは「雑音の扱い」: 素の衝撃は雑音を構造に化かすので、 段差が真値を超える。超えたら鮮鋭化ではなく増幅である。
examples/gallery2d_features.py
- L270 (ja) — ★返り値は bits/16 なので 16 倍して読む。上限は画素数で決まる —— 連続値の 画像では最小の刻みが ~1/N になるので推定は log2(N) 付近で頭打ちになり、 16 には届かない(256x256 = 65536 画素で 16 前後、128x128 では 13.7 と実測)。 「測れない線」を画素数から先に引いておくための注意書きで、門もそう書く。
examples/gallery2d_morphology.py
- L228 (ja) — ★背景の 1 点だけでは足りない —— 前景の外に 1 画素も漏れていないことを 全数で見る。離散の円板で膨らませると境界の外まで塗ってしまい、最初の実装は 前景 197 画素の円に対して外へ 48 画素(24%)漏らしていた。中心の値は正しい ままなので、中心だけ見る検査では捕まらない。
- L240 (ja) — ★閾値を選ばない op なので、検証も「閾値を選ばずに 3 つの山を同時に当てる」 形にする。高さ 1.0 / 0.6 / 0.3 の山を置いて、そのまま返るかを見る。
examples/gallery2d_texture_freq.py
- L305 (ja) — ★窓は
_k(a) が決める —— a=0.5 は 7x7(5x5 ではない)。ここを取り違えると 閉形式の定数がずれて、正しい実装が落ちる(実際に一度落とした)。
examples/gallery_illusion_invariants.py
- L231 (ja) — ★docstring は (−2, −2) と書くが、この盤(行・列、上向きで出発・白で右)では (+2, −2)。 定理が言うのは「周期 104 で同じ斜めの 2 マス」で、符号は回転の規約で変わる(perpetual.py の自己検査と同じ読み)。
examples/gallery_nary_image_algebra.py
- L117 (ja) — ★公開の入口
fullseye.apply は n-ary の 2 入力に「同じ形」を要求する(3×3 のマスクは形の不一致で拒まれる)。 画像と同じ大きさのゼロ配列の中央(scipy の原点 = N // 2)に置けば、同じマスクとして働く。
examples/gallery_openvx_spec_values.py
- L39 (ja) — vx_nonlinear_filter の function(vx_non_linear_filter_e)。★引用符つきの “median” を書くと、例の索引 (tools/op_example_index.py)が「この例は 2-D の median op を呼んでいる」と数えてしまう (引用符つきの op 名は振り分けの一覧として拾う規則)。ここは fullseye の median op を使わないので 1 本の文字列から分ける。
examples/optics_four_f_processor.py
- L84 (ja) — ★数字は構成で変わる。どの構成で測ったかを必ず併記する —— 併記しないと 説明文が別の実行の数字を引いたまま残る(2026-09-26 にこの例で踏んだ)。
- L199 (ja) — ★(1, N) のまま渡すと four_f_filter が「2x2 未満」で断る。 場と同じ格子に広げる —— 断ってくれる op のおかげで気づけた。
- L217 (ja) — ★図・動画は opt-in。既定で出さないのは、CI が図の生成時間を払わないため。
examples/piv_flow_from_particles.py
- L27 — ★由于要 import repo 根目录下的模块(pivops),把 repo 根目录放到最前,使其从 checkout 直接运行即可通过。与其他示例相同的做法。没有它,
py -3.11 examples/<name>.py 会因 ModuleNotFoundError 而失败(2026-09-09 实测:在缺少运行门的 83 本中,失败的仅此类型的 2 本)。
examples/poc_active_contours.py
- L258 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_allsky_cloud_cover.py
- L104 — ★最后 3 个是薄云(光学厚度不同)。提高阈值时,越薄的越先掉落——第 4 节的阶梯即由此产生。
- L142 — ★立体角权重。dΩ/dA = sinθ/(f²θ) —— 等距投影的雅可比。
examples/poc_asbuilt_wall_deviation.py
- L497 — ★遗漏的不是倾倒而是鼓胀。predict_bulge 以闭式返回的一次系数量,会原封不动地变成伪倾倒与伪平面内偏摆。
- L555 — ★向闭式传入包含被鼓胀吸收的部分(§6)的有效倾倒。若不包含,则仅 f=0 的单点偏差 1.2 mrad,看似预测失准。
- L660 — ★仅噪声的地板。在鼓胀为零的壁面上以同样方式读取,就得到这个。
examples/poc_astro_photometry.py
- L322 — ★ 这里曾错过一次:以为”scale=2 所以亮度也是 1/4”,写成 flux/4,得出 -74.89 %。守恒律(上文 6.1e-14)把它剔除了。每像素亮度变为 1/4,但星的总和不变。
- L423 — ★ 这里曾放弃过一次 assert:上表的 rms(1 次合成、孤立星 8 个)给出良 6 帧 0.306 % vs 良 12 帧 0.324 % = 0.947 倍。这并非对理论 1.414 的反证,而是意味着那个 rms 是”逐星的系统偏差”与”噪声”之和,8 个样本无法单独取出噪声。与第 1 段相同,累积迭代并减去逐星均值后,才只剩噪声。
examples/poc_attention_identities.py
- L232 (ja) — ★合否にするのは厳密に数えられる側だけ。(QK^T)V は 2T^2 d + 2T^2 d 回、 Q(K^T V) は 2Td^2 + 2Td^2 回の積和なので、比は 厳密に T/d である。 これは機械に依らない整数の主張で、交差点が T == d にあることの中身でもある。
- L563 (ja) — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_barcode_1d.py
- L806 — (d) ★measure_pos 的边缘数量对 sigma 非单调依赖。
examples/poc_battery_ct_degradation.py
- L316 — ★
sdf_offset 仅为标量,故要按场偏移就需扭曲格点后再评估。
- L334 — ★为避免叠层穿透罐体,将其局部压缩到挠曲端板所允许的高度(真实电芯中电极也会被加压而收缩)。若不这样做,在较高的气体空隙处,端部层会被罐体吞蚀,层数比较失效(最初就是这样)。
- L612 — ★以”上升边的数量”来数层。若按
vol_wall_thickness 的成对(上升 -> 下降)来数,只要在罐内表面紧内侧多出 1 条下降边,配对就错位,健全电芯也会从 17 -> 16 掉落。
examples/poc_battery_electrode_tortuosity.py
- L136 — ★不在公开路径上的处理:体素空间的 6 邻接图。fullseye 拥有 3-D 的 # 连通分量(vol_label)与距离变换(vol_distance_transform),但 # 没有处理”穿过空隙的路径”的入口(测地距离、输运)。 # ————————————————————————— #
- L258 — ★若直接传入 64 voxel 的切片,面板宽度仅 64 px,标题文字放不下,整幅图就会失败(examplefig 不会默默放弃)。
- L279 — ★若把固相保持为 0,则 log10(耗散) 为负,于是固相被涂得最亮(2026-09-08 曾这样出过一次)。将固相对齐到空隙的最低 2 %。
examples/poc_beam_modal_video.py
- L629 — ★冲突:在 fps 48.5 时,照明的混叠正好落在 f_1 = 3.00 Hz 上
examples/poc_beats_fringes_and_screens.py
- L237 (ja) — ★デューティ 50 % の矩形格子は偶数次が消える —— 矩形波のフーリエ係数が 偶数調波でちょうど 0 になるからで、これは実装の都合ではない閉形式の事実。 最初「±1, ±2 が立つ」と期待して NG にした: 期待が誤っていた(op は正しい)。 偶数次が「消えていること」まで見るので、山の位置だけを見るより強い門になる。
- L535 (ja) — ★図の書き出しが失敗したら、ここで拾う。見ないと「検査は全部 OK・でも図は 1 枚も出ていない」が黙って通る(examplefig は fail-soft で貯める)。
examples/poc_bev_sensor_fusion.py
- L135 — 已放置。★这并非装饰:* 若把面放在单元边界上,面的回波会因噪声向邻元溢出一半,仅靠 discretisation 就使拟合率跌到 0.5。* 若把面放在单元中心,这次轮到真值因浮点舍入而时进时出(确实踩到:侧壁回波所在列偏离真值,133 个伪占据单元中大半即为此)。放在两者之间则两种情况都不发生。
h 避开 0.2 m 的倍数——以显示高度的量化。lx/ly 取 0.1 m 的奇数倍。
- L564 — ★误差是绕世界 z 轴(=与 place 相同)。写成
R_wc @ rz 就变成绕光轴的 roll,重投影误差会化为 1/5(2026-09-07 踩到:得出 0.98 px,与几何预测 f·tanθ 不符而暴露)。
examples/poc_bilateral_asymmetry.py
- L585 — ★保持为可直接通过孔 D 之门的形式(margin 先塌陷,角度随后跳变)。
examples/poc_bone_trabecular_thickness.py
- L708 (ja) — ★穴が塞がったので、所見を「無い」から「規約が 1 画素ずれる」に書き換える。
examples/poc_bump_coplanarity.py
- L147 — ★真实的低阶缺陷(die-attach 空洞 = 中央平缓下沉)。故意不做成严格的二次——若为二次,拟合按定义会吸收 100 %,”能被吸收多少”这一问题便变得自明。
-
| L306 — ★先以 ±SPEC_UM 进行 clip 再传入。examplefig 的发散配色按每个面板以 max |
v |
归一化,若不 clip,3 幅的颜色含义就不一致。 |
- L445 — 6. ★过度扣除之害 —— 会吸收真实的低阶缺陷 # ————————————————————————— #
- L540 — (e) ★经台账的 surface_form_error 只返回 PV 的 float
examples/poc_cad_scan_deviation.py
- L434 — ★台账的 out 适配器把 dict 截断为 (R, t),故 rmse 传不到
- L897 — 第 6 章:★缺陷牵动配准 —— 以向刚体 6 维的投影来预测 # ————————————————————————— #
- L1103 — ★不加入缺陷 —— 若加入,第 6 章的 datum 偏移(0.107 mm)会成为点位移的基垫,与”因初始角度而破坏的量”混在一起。
- L1256 — ★对真值为 0 的对照组给出”%”,会因除以 0 而得到无意义的巨大数值。面积仍以 mm^2 并列,仅在真值有意义时才附上 %。
- L1267 — ★不要把单次运行的差异读作”起效了” —— 变动种子并与离散度比较
- L1357 — ★缺口一旦被填补就会触发的 assert。它确实在 2026-09-07 触发,于是重写了这一行:在收到“无法构建圆柱孔、倒角与圆角”的意见后,添加了 plane / cylinder / torus / capsule。意见改变了工具,所以留下记录后继续前进。
- L1379 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
examples/poc_calipers_under_illusion.py
- L141 (ja) — ★はじめ図説に「半幅を変えると採用点の数が変わる」と書いたが、生成された 本文を読むと 4 通りとも 41 点だった。書いたことがデータと違ったので 直し、「変わらない」ほうを門にした。証拠の数が動く例は第 5 章のツェルナー。
- L150 (ja) — (b) ★探針 1 枚では足りない —- ずらし量 × 探索半幅の格子で全数を見る 最初は shift=0.25 だけで試して「測定器は決して動かない」と書いた。 格子で見ると 0.125 と 0.375 でだけ 0.14 度傾く。既定に見える 0.25 は、たまたま外れない側だった。
- L266 (ja) — 外れた組み合わせを絵の上に描き戻す。★全体図では 8 px の飛びが潰れて 見えないので、目地の帯の周りだけを等倍で切り出す。
- L365 (ja) — ★測定線は軸そのものの上にある。そのまま塗ると被写体が消えるので、 指示線だけ 12 px 上へ逃がして描く(測っている行は軸の行のまま)。
- L476 (ja) — ★中心の座標は推測せず illusion.py から読む(最初 (h/2, w/4) と当てずっぽうに 置いて、周りの円のエッジを掴み rms が 3.4 になった)。真の中心は (170, 168) と (170, 452)、半径 30。
examples/poc_camera_calibration.py
- L152 — ── 校正(自制的最小捆绑调整。★ 缺口 (e))──────────────────────────────────── #
- L181 — ★ 缺口 (d):camera_calibration 的图像点是 (row, col)。project_points 是 (x, y)。
- L519 — ★ 缺口 (b):reprojection_error 不知道畸变。即使传入真值也不会变成 0。
- L740 — 2. ★ 主角:重投影 RMS 几乎相同,但 fx 误差却相差一个数量级以上
- L748 — 3. ★ 抵消机制:fx 的比值与 Z 的比值一致
- L754 — 4b. ★ 诚实的失败记录:在窄视场 + 0.30 px 噪声下,将主点固定在图像中心的零点 B 比去估计它更正确(确实存在无法超越的条件)
- L770 — ★ 缺口 (c):由于是畸变点,拦下它的不是退化门,而是后段的非有限 K 门。还要确认其文案中包含“请倾斜标定板”(2026-09-06 添加)。
- L778 — 5b. ★ 缺口 (c3):闭式解会因畸变而系统性偏离(仅用作初值)
- L782 — 6. ★ 缺口 (b):reprojection_error 不知道畸变 -> 即使传入真值也很大
- L788 — 7. ★ 缺口 (a)(已解决 2026-09-19):内部参数估计现已在门面(facade)上公开。以前从
fs 看不到,这根绊线(tripwire)一直提示“一旦补上就更新 docstring”。现在可通过 fs.camera_calibration 调用(能力笔记 camera-intrinsics-calibration)。不过它是门面函数,而非注册表中的 op(因为它不是固定的 (图像, a, b) 形式)。
examples/poc_cell_counting.py
- L68 (ja) — ★2026-10-02: 他の PoC と同じく、リポジトリ直下を自分で sys.path に足してから fullseye を import する。 パスフック頼みだと、examples/ から PYTHONPATH 無しで走らせたとき(tests/test_poc_scripts_run.py の走らせ方)に 本線の editable install の fullseye が先に入り、この worktree で足した台帳(watersheds_marker)が無くて落ちた。
- L860 — ★可指定的最小 h 为 0.05 x max(距离变换)。图像中只要有一个大细胞,就会抬高整幅图像的 h 下限(由 op 规格造成的耦合)。
- L1048 — ★这个 PoC 的标题。在偏差曲线穿过 0 的位置,分割误差并不是一个谷。
- L1337 — ★过度合并与漏检是两回事 —— 即使粘连也并未“消失”
- L1365 — ★最优 h 随密度变化(在偏差准则或一对一准则中必有其一会变化)
- L1368 — (5) ★确实存在计数正确但分割全错的点:偏差不到 3 %,但仍残留大量分割误差,一对一对应也远离最佳。
- L1394 — ★可指定的最小 h 随尺寸比一同上升(由工具规格造成的尺度耦合)
- L1434 — (10) ★用机器确认工具的缺口“仍然存在”(一旦修好就会失败 = 好的失败方式)(a) 进化 op 的距离变换按最大值归一化
examples/poc_change_detection_misreg.py
- L947 — ★一张图:残余偏移 vs 假阳性(扫掠曲线 + 配准结果的点)
examples/poc_cold_chain_excursion.py
- L570 — ★寻找峰值的窗口只到下一次门开合之前。若取得过宽,在 τ 较大处会捕捉到下一个脉冲的上升沿,看起来像“悬崖不会到来”(2026-09-08 用 200 分钟的窗口踩过:y=53 的实测拉长到了 153 分钟)。
- L949 — ★把视线方向(D 轴)设为宽度。若保持 (t, y, x) 直接投影,D = 时间 720,只会得到细长的 (H, W) = (60, 12) 图像。
- L1008 — ★区分“命中”是靠约定还是偶然:将每个点扰动 ±1 m 后计数。
examples/poc_colocalization_crosstalk.py
- L355 — ★拖尾损失的预测:阈值 T 以下的 Gaussian 尾部不会进入区域。峰值 p 的点中,区域内的荧光为 1 − (T − 基座)/p(2-D Gaussian 体积的闭式解)。基座 = 细胞质 + 背景(+ 渗入部分),p 会被 PSF 压缩为 σ_ves²/(σ_ves²+σ_psf²) 倍。
- L657 (ja) — ★2026-09-20:
graph_degree_preserving_shuffle(結合グラフの辺の繋ぎ替え = null model)が台帳に入った。ここで探している 「画像ブロックの並べ替え検定」とは別物なので、graph_ の族は穴の判定から除く(語が同じだけ)。
examples/poc_colormap_readability.py
- L343 — ★从台阶列中能读出的差是 Δ + 1 个像素宽的斜坡 —— 忘了这一点就会把悬崖高估 2 倍(最初这样写,得到 0.57 vs 实测 0.30)
- L406 — ★用真实梯度去除。不除的话,就会把“场变化陡峭的地方”当作边界来计数
- L657 — ★超过颜色数会被默认拒绝(本 PoC 指出后当天变为 fail-closed)。这里的目的是测量“循环会怎样”,所以显式设置 cycle=True —— 强制显式本身就是对策。
- L732 — ★因本 PoC 的指出当天修复。名单的判据仅为“明度的单调性”,所以明度虽单调但色差步进粗糙的 cividis 却自称“安全”。现在色差的均匀性也纳入判据,cividis 已移至 CVD_SAFE。
examples/poc_complex_plane_fields.py
- L289 (ja) — ★「そのまま渡すと厳密に 2」が言えるのは 2 次以下の多項式のときだけ (中心差分がそこまで厳密だから)。一般の正則場では 2 から同じ床の分 だけ引かれる —— 実測 2 − 4.89e-05 に対し正則側の床は 2.06e-04 で同じ桁。 だから「2 に十分近い」ではなく「2 とのずれが床と同じ桁」を門にする。
examples/poc_compound_eye.py
- L271 (ja) — ★実測(2026-10-11): 雑音だけの利得は N=49 で 7.05(√49=7.00)、周縁 8px 除外で 全体利得 7.19、床は外周 4 画素にだけ載り k>=4 で 1e-15 の丸め屑。 → 第 2 章の飽和(5.33)は重ねの原理ではなく縁(像の外から画素を借りる帯)の誤差。
- L402 (ja) — ★PoC の門(tests/test_poc_scripts_run.py)は exit 0 に加えて “PASS” の印字を 要求する(合否を計算したのに捨てる門を防ぐ規約)。以前は “OK:” と書いていて、 台帳に登録した瞬間に「exit 0 だが PASS を印字していない」で落ちた。
examples/poc_connectome_across_decades.py
- L147 (ja) — ★2 匹の平均(半整数)を丸めると偶数丸めで奇数/偶数のギザギザが出る —— 合計(整数)で数える
examples/poc_connectome_motor_bottleneck.py
- L328 (ja) — ★2026-10-06: 人型ロボット / evis のデータが無い環境(CI・初見の人)では系列が合成歩容 1 本だけになり、 折れ線は点 1 個で描けず図が消えて PoC 自身の assert で exit 1 だった(手元は人型ロボットのデータがあって緑)。 系列が 2 本未満なら点で描き、図注は実際に使ったデータを言う。門 = tests/test_poc_connectome_motor_figures.py
examples/poc_crop_phenotyping.py
- L209 — ★随机数务必以 (n_plant, NESTED_MAX) 的形状预先抽取。若按叶数改变抽取数量,随机序列会错位,n_leaf 仅加 1 就会变成另一片群落(2026-09-07:植被率相对叶数不再单调,无法测量悬崖)。
- L525 — ★
grid_coords 放置的是体素中心(中心间距 = span/res,而不是 span/(res-1))。最初乘以 span/(res-1),在球上产生了 +12 % 面积、+18 % 体积的误差 —— 单位弄错会“错得很像模像样”。
- L933 (ja) — ★2026-10-06: 題が「当たる」と外れた予想のほうを言っていた(本文は「予想が外れた」)。実測を言う。
- L972 — ★真值和叶角分布都取自本节所观察的群落本身。若沿用基准条件(7 片叶)的 k,就会因上层叶越发直立的梯度而使真值偏移。
- L981 — ★最大的平面未必是地面(群落郁闭后,冠层的一部分会成为最大)。将第一个平面直接当作地面的版本给出了 1.69 m 的高程(2026-09-07 踩过)。只有加入取最低平面的规则后才稳定下来。
- L1008 — ★对照组:将同一公式应用于真实法线(缓冲区所持有的)。
- L1137 — ★
occupancy_grid 的轴是 (x, y, z)。render_volume_projection 会以轴 0 作为视线方向进行压缩,所以若想要天顶图,需交换为 (z, y, x)。不交换就调用会得到“本想当侧视图的天顶图”(默默出错的类型)。
examples/poc_ct_fidelity.py
- L342 — ★这个 PoC 的标题。可以用眼睛看到 FBP 与零点 A(水平线)和零点 B 相交的地方。横轴是投影数(左侧稀疏)。横轴取 log —— 相交发生在稀疏一侧(12~45 条),线性轴下会挤到左端,关键处读不出来。
- L407 — ★2026-09-06 已填补。以前固定的是损坏行为 =“检测器加倍会使质量亏损改善 2 倍以上”。现在固定两点:(1) 质量本来就是守恒的 (2) 不随检测器数量变化(因为 n_detectors 是检测器的宽度,而非采样的精细度,所以只要目标能容纳,增加的部分只是多出空 bin)。
examples/poc_ct_void_morphology.py
- L233 — ★用晶粒占据来替代时,在粗体素下 50 µm 厚的晶粒会落在体素中心之间,基准本身消失(在 60 µm、相位 2/3 时实际变成了 0 个)。
- L558 — ★把全 nan(任何相位都无法测量)传给 np.nanmean 会发出警告。“无法测量”不是求平均的对象,所以在此显式设为 nan。
- L634 — ★绘制前先剔除 nan(无法测量的点)—— 折线 op 会拒绝非有限值。
- L808 — ★缺口填补后就会触发。2026-09-07 触发,于是重写了本节 —— 在收到“esdf 接受长度为 3 的 voxel_size,但绘制其输出的一侧却仅限立方”的意见后,query_distance(和 occupancy_grid)改为接受按轴的 res。
- L878 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
- L1097 — ★体积率即使在粗体素下也得以保持,先失效的是形状指标(预测落空的一侧)
examples/poc_datacenter_thermal_field.py
- L221 — ★2026-09-08:此 PoC 记录了「没有从散乱点构建场的入口」,因此加入了
fs.interp_scattered。落在凸包之外的点由 op 以掩码返回,因此无需用 isfinite 去猜测(即使把 fill_value 设为有限值也不会出错)。
- L862 — ★破坏门来验证「假峰 0」是否真的在计数。
examples/poc_dem_terrain.py
- L42 — ★若不把仓库根目录加入路径,就找不到
demops(本例不 import fullseye,因此路径钩子不生效)。
- L76 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
examples/poc_dense_bubble_count.py
- L748 (ja) — ★最初は「相対 3 % 以内」と書いて、真値 30 個で 1 個ずれた 0.033 で落ちた —— 言いたかったのは 「誤っても 1 個ぶん」なので、個数の差で書き直した(2026-10-18)。真値は画面の外に出た細胞も 数えているので、1 個の差の一部は op でなく真値の規約の側にある(どれかは区別していない)。
- L751 (ja) — ★2 回目: 1 個ぶんでも足りなかった(最大 2 個、600 枚の全数で)。ずれの大きさは印字に残し、 門は「自信をもった誤りの件数」だけにする —— 合わせ直すたびに門を緩めるのは門ではないので、 ここで止める。
- L846 (ja) — ★記録(門ではない): o = 0.4 では「決まらない」と言った塊の区間が真値を外す。いびつな泡が 別の泡に食い込むと、くびれが山を残さず、上限 hi にも数えられない(op の docstring の限界)。
examples/poc_dfm_thickness_overhang.py
- L284 — ★朝向(正反面)由缠绕顺序决定,但 marching cubes 的缠绕顺序会随输入的符号约定而翻转。若是闭合网格,则由带符号体积唯一确定 —— 用公式而非目视来决定。
- L379 — ★不要把格点原点对齐到墙面。在 3.0 处切割会使墙面正好落在 voxel 边界上,8 个扫掠点全部误差 0.000 mm,得出「不会发生量化」的错误结论(2026-09-07 曾经这样写过)。实际的网格划分器不会把格点对齐到零件的面,因此采用不对齐的原点。
- L455 — ★不要只在「T/h 为整数」的点上扫掠 h。整数比时占用体素的数量恰好为 T/h 个,误差 0.000 mm 排成一列,看起来像「不会发生量化」(2026-09-07 曾经这样写过)。要连续地扫掠 h。
- L705 — ★不要纳入正好 45 度的倾斜方向 —— 板背面 2349.7 mm^2 自身也会贴附到阈值上,「哪个朝向更好」的表格会被台阶的问题所劫持。
- L824 — ★当孔被填塞时触发的 assert。它在 2026-09-07 触发,于是重写了这一行 —— 因收到「没有逐面的面积」的指摘,加入了 face_areas / mesh_volume / boundary_vertices。记录下已被填塞并继续前进。
examples/poc_dic_strain.py
- L104 — ★用从基准图像确定的单一常数进行归一化。若按每幅图像的最大值来除,只要形变使最大值稍有移动,整体亮度就会改变,从而给假设亮度不变的估计器(Lucas-Kanade / Horn-Schunck)叠加无关的误差。
- L211 — ★固定所见:由于形变不是插值而是斑点的重绘,整数移位应当严格一致。若此处崩溃,则第 2 节及以后的「真值」将不再是真值,也就分不清测量的是估计器还是我们自己的插值器。
- L247 — ★固定所见:三者都必须以数量级取胜于仅回答「没有移动」的零点。哪怕有一个跌破 10 倍,该估计器在此场景下就不堪用。
- L282 — ★固定所见。(1)piv 的偏差在扫掠全域内都小于 lk / hs。※「小一个数量级」只在第 2 节 u=0.37 的单点成立(0.0002 vs 0.0042 = 21 倍),而扫掠的最大值之间约为 6 倍(piv 0.0015 / lk 0.0088)。这里把最大值之间保守地固定为 2 倍。
- L365 — ★固定所见。(1)lk 与 piv 将 100 µε 以 ±30 µε 的精度回收(实测 +9.1 / +0.4)。
- L369 — (2) ★hs 对 100 µε 只返回 22 µε —— 上面的「符号和数量级会出来」不适用于 hs(正则化把均匀应变本身抹平了)。由于主张与实测不符,故以实测为准固定下来。
- L413 — ★固定所见。(1)2 度的旋转在微小应变下如理论所料成为约 -609 µε 的谎言(材料并未伸长)。相当于钢的屈服应变 2000 µε 的三成。
- L438 — ★在均匀梯度(ε 关于 x 为一次)下不会变钝 —— 因为对称窗的最小二乘会严格返回一次函数的斜率。要看到窗的效果,需要带曲率的应变场。切口尖端的应变集中正是如此,因此植入高斯形的集中。
- L484 — ★固定所见。(1)lk 的峰值随窗宽单调下降(正是空间分辨率的极限)。
- L522 — ★只切一个角来计数,会随窗的取法变动 2 倍。使用全部窗的平均。
- L577 — ★固定所见:把斑点加粗后偏差单调减小。第 3 节看到的 lk 偏差并非只是估计器的性质,散斑的采样不足占了一半。若此处不再单调,「0.01 px」主张的依据便会崩掉一根。
examples/poc_die_tilt_tsv_overlay.py
- L167 — 格点的展布。★若不包含 erf 的尾部(±4σ),在倾斜的裸片上外周的通孔会在每个 z 上被以不同方式切割,产生虚假的倾斜。
- L241 — ★经由台账的 vol_label 与 docstring 不同,只返回 labels(
(labels, n) 的 n 被丢掉了。第 9 节的 (f))。
- L297 — ★这里不要减去 MU_SI。探针在通孔之外穿过的是空气(0),因此原始值直接与材料的占有率成正比。若减去并 clip,边缘平缓的部分会被压到 0,长度从 100.0 -> 98.1 µm(-1.9 %)。
- L484 — ★减去对照组,只提取「倾斜所增加的部分」(消除估计器的系统误差)。
- L634 — (f) ★同一个 op 会因调用路径不同而返回值的内容不同。
examples/poc_dimensional_inspection.py
- L521 — ★rms 是否可信 —— 对抗性地只把一个点向外移动。
- L1553 — ★2026-09-06「被埋没」的状态得到解决。以前是
n_reach == 0(固定其到达不了)。现在固定其能够到达。
examples/poc_document_scan.py
- L271 — ★直接把 sobel_dir 作用于二值掩码,会把梯度方向量化到 0/90 度,一点一票的带方向 Hough 就会坍缩到那两条线上(实测:4 条线中有 2 条正好是 0.00 / 90.00 度)。先模糊再测方向。
- L389 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_driving_decisions.py
- L247 (ja) — ★2026-10-03 まで縞が x に 10 m 長く y に並んでいた(90° 回っていた、ユーザー指摘)。下の門が向きを確かめる。
examples/poc_driving_endless_map.py
- L329 (ja) — 追従カメラ: 車の 7 m 後ろ・3 m 上から、車の 25 m 先を見る(★頂点がカメラの後ろにある三角形は描かれないので、 カメラを車の真上に置くと足元の地面に穴が開く)
- L337 (ja) — ★描画器は頂点が 1 つでもカメラの後ろにある三角形を捨てるので、足元に穴(空の色)が開く。地平線より下なのに何も 当たらなかった画素だけを地面の色で埋める(第 6 回の env_render と同じ扱い。見た目だけで、門には使わない)
examples/poc_em_second_opinion.py
- L115 (ja) — ★面積で揃える: 仕込んだ融合は「min_area 以上の 2 ラベルの和」なので必ず大きい。負例をそのまま 使うと「大きいラベル = 怪しい」だけで AUC が出てしまう(最初の実測: 弦 0.86 に対し面積だけで 0.87)。 負例は正例と同じ下限(2 × merge_area)以上の成分に限り、基準の「面積だけ」も同じ集合で測る。
examples/poc_emva1288_in_camera_processing.py
- L430 (ja) — ★壁時計でなく CPU 時間で掛ける: スイートが PoC を 6 本並べて走らせると、単独 31 秒が壁時計 115 秒になった(2026-10-13 の全量)。 この PoC が自分で使う計算量を見るのが目的なので、他のプロセスの混み具合で揺れない量にする。
examples/poc_endless_zoom_and_turning_solids.py
- L75 (ja) — 深さの巡回に使う色。★赤と緑は対にしない(意味が見る人で反転するため)
- L303 (ja) — ★主張は整数で置く。埋まった箱の数が 6 ズームとも同じ整数列である ことが「ズームしても同じ集合を見ている」そのもので、整数だから 環境に依らない。
- L310 (ja) — ★次元のほうは最小二乗を通るので機械精度でしか主張しない。
sd == 0.0 と書いていた時期があり、CI で落ちた —— 6 つとも 6 桁まで 同じ値なのに std != 0 で、degrade の記録も 0 件だった。同じ整数列を 渡しても BLAS の並列化で lstsq の最下位ビットが揺れる。 それは「ズームで次元が動く」ことではない。
- L412 (ja) — ★ここで最初の予言を外した。「2 パーセントの床は marching cubes の面取りの せい」と読んだが、距離を伸ばすと厳密な立方体も同じところまで落ちた —— 床の正体は透視投影だった。面取りのぶんは別の量(最大/最小の比)に出る。
- L630 (ja) — ★op が静かに degrade していないか。
fs.op.* は backend_safe.guard 越しで、 例外が出ても「sort 妥当な別の値」を返す —— 厳密な等式の検査だけが落ちて、 原因が症状から離れる。degrade していたらここで名指しする。
- L645 (ja) — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_eye_to_brain.py
- L60 (ja) — ★背側から見るだけだと、像の左右(方位角)は soma の y 軸 = 奥行きに写り、応答の移動が見えない (2026-09-20 に実測: 縞を動かしても同じ場所が光って見えた)。背側と側面の 2 方向を並べる。
- L139 (ja) — ★2 値の縞では 1 ビットでも相関 0.99 で量子化の効き目が測れない(実測)。背景 0.5 に +0.3 の 滑らかな縞(σ = 6 px)= 低コントラストの像で、ビット数が信号を潰す条件にする。
- L162 (ja) — ★実測(2026-09-20): 効いているのはビット数ではなく「背景を引く」適応。背景 0.5 の像を適応なしで入れると 全柱が刺激され重心が動かない(実データで 0.63)。適応した連続値と 8 ビットは同じ(0.99)。
examples/poc_fabric_defect.py
- L83 — ★掩码的面积故意调成大致相同。合并后的 AUC 接近以阳性像素数加权的平均,因此若其中一方大一个数量级,「合并后被隐藏」就不会发生。
- L119 — ★掩码半径按 σ 的倍率分别设定 —— 为了让面积相当。若面积相差一个数量级,就会变成「合并后的 AUC 即面积较大者的 AUC」,本 PoC 想测的「合并后被隐藏」就被偷换成「面积大的一方获胜」这另一回事。
examples/poc_fiber_orientation.py
- L376 — 第 2 节。★★朴素的平均在 180 度周期下崩溃 # ————————————————————————— #
- L469 — 第 4 节。★★不选择权重的话,取向度必定偏小 # ————————————————————————— #
- L499 — ★由于角度是周期量,用 colorize_depth 上色会使 0 度与 179 度成为完全相反的颜色。fullseye 中没有循环 LUT 的名字,但把 (cos2θ, sin2θ) 传给 colorize_flow 就能得到二倍角的循环 LUT(见末尾「工具的漏洞」(f))。
- L693 — ★存在「coherence」这个名字,但那是信号处理中的双信号相干性(另一回事)。
- L724 — (e) ★同一族的两个在输入检查上不一致。
examples/poc_fly_optomotor_steering.py
- L503 (ja) — ★2026-10-06: 6 系列に配色の役が 5 つしかなく、motor right が HS left と同じ色だった。 層ごとに 1 色、左 = 実線・右 = 破線にする。
examples/poc_fly_vision.py
- L623 (ja) — ★ラミナ段(DC 落とし)を省くと相関が落ちる、を固定する。落ちなくなったら fly_emd_response の側で DC が消えている(仕様変更)なので、この対照を見直す。
- L650 (ja) — ★PoC の門(tests/test_poc_scripts_run.py)は exit 0 に加えて “PASS” の印字を 要求する(合否を計算したのに捨てる門を防ぐ規約)。
examples/poc_focus_stacking.py
- L176 (ja) — 絞り。★2026-10-14: defocus_blur のぼけが 2 倍広かった(σ = 錯乱円の直径/2、正しくは /4)のを直したら、F 5.6 では 被写界深度が 2 倍深くなり、0.42 mm 間隔の像で奥行きが区別できなくなった(テクスチャ有の RMS 0.47 → 0.91 mm)。 旧版の結果は「F 5.6 と書いて実質 F 2.8 のぼけ」の上に立っていた —— 書いた値と効いていた値を揃えて F 2.8 にする。
- L601 — 1. 图是有效的。★阈值为 +3 dB——半导体实拍图像大部分是平滑金属(芯片、引线),这些区域单帧就已合焦,因此 AIF 的提升不如全面高频的合成图案那么大(这是现场的真实情况;旧的全面纹理场景曾得到 +14 dB)。
examples/poc_forensics_roc.py
- L396 — ★漏洞 (a) 是「常数图」,因此画成图就无需去读数字。
- L523 — ★本 PoC 的标题。最强检测器的曲线,只按一次保存按钮就跌到对角线(乃至更低)。
- L677 — (4) ★漏洞 (a):op 的 argmin 读出,对再保存过的图像实质上是常数图。AUC 恰好为 0.5 = 与随机无法区分。
- L704 — (9) ★漏洞 (b):8 像素格。仅当差为 8 的倍数时才猜中(无再保存)。
- L52 (ja) — 色。★赤と緑は対にしない
- L355 (ja) — ★変数名は章ごとに分ける(あとの章の best に上書きされて、図の説明が 別の章の数字を出していた)
- L370 (ja) — ★図が主題を映しているか。x, y だけで描くと zw 面の回転が消える。 実際にそれで 2 つの GIF がバイト単位で同一になっていた。
- L403 (ja) — ★marching-cubes 系と同じく巻きが内向きなので絶対値を取る
- L425 (ja) — ★B との差が「断面の角数に依らない」= 2 つの誤差が独立に分かれている証拠
- L559 (ja) — ★x, y だけを描くと zw 面の回転が消える。一般の向きで見る。
- L651 (ja) — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_fourier_ptychography.py
- L239 (ja) — ★明視野と暗視野の境に LED が乗る構成(ピッチ 7 mm・距離 70 mm、照明 NA 0.0995)は外し、境の章で別に見せる
- L390 (ja) — ★高さだけの線(振幅は一様)では、full(384 画素)で 2 本の初期値が 0.098 違って拒否された(差は照明 NA 0.2〜0.3 の 帯に集まる。暗視野の露光を 4 倍にしても 0.092)。散乱の弱い物体の高い周波数は、k の丸めの模型の誤差に埋もれる。
- L581 (ja) — ★実データでは瞳を画素ごとに自由に推定する(pupil_degree=None)。2〜4 次の多項式に射影すると残差が 2.3 倍 (0.0143 対 0.0061)になり、G7 の大きな要素でも変調が 0.4 に落ちる —— 実機の瞳は振幅にも構造がある(推測)。
examples/poc_gear_tooth_metrology.py
- L199 — 成像系统的模糊。★2-D 高斯模糊没有直接传 σ 的入口,因此从进化 op 的旋钮 a 反算 σ = 0.3 + 2.7 a 后传入(见末尾「工具的漏洞」(c))。
examples/poc_geodetic_height_frames.py
- L411 — ★往返无法排除「两者朝同一方向出错」。要与独立实现相互对照。
-
| L440 — ★预测(在测量前打印):坡度为 atan |
∇H |
。使用 h 则为 atan |
∇H+∇N |
。 |
- L467 — ★把预测与实测的最大差异区分为「模型误差」还是「离散化」。把网格单元细化。
-
| L587 — ★预测(闭式):下坡方向转过 90 度以上 ⇔ ∇H·(∇H+∇N) < 0 ⇔ |
∇H |
^2 + ∇H·∇N < 0。测量前先算出比率。 |
-
| L647 — ★第二个(才是真正关键的)闭式。视线由两端的 h 连成,所以 N 的线性部分在视线和地面上叠加量相同而抵消。剩下的是 N 偏离弦的量 = |
N’’ |
d^2 / 8。此处 N’’ 为 2C(cos^2θ - sin^2θ),所以 |
N’’ |
<= 2C。 |
- L1120 (ja) — §10 穴。★2026-09-08 にこの節は「geoid / enu / datum は 0 件」を門にした。 2026-09-22 にその門が鳴った(埋まったから)—— 門を消さずに、まだ空いている 語幹へ付け替える。閉じた側は「何が閉じたか」を名前で固定する。
- L1124 (ja) — ★2026-10-15: material_xray_attenuation(X 線の減衰)の “att-enu-ation” が語幹 enu に当たる。 測地の ENU ではなく単語の一部 —— 同じ文字列の別の意味として名前で固定する。
- L1126 (ja) — ★2026-10-19: water_attenuation(水の減衰)も同じ。
- L1128 (ja) — ★2026-10-05: granular の datum_tilt_check(粉体の山の基準面の傾きの警報)が語幹 datum に当たる。 測地成果ではなく「高さ図の基準面」の意味 —— 同じ語の別の意味として名前で固定する。
- L1138 (ja) — ★
ortho は逆向きの教訓: op 名に ortho を含むものは 0 件のままだが、 能力は dem_height_frame_convert(frm/to に “orthometric”)で在る。 件数で「在る」と言ってはいけないのと同じくらい、名前で「無い」と言ってもいけない。
- L1141 (ja) — ★2026-10-15: 語幹 “ortho” は名前で実験計画の直交表の op(orthogonal、別の語)に 当たるようになった。門が問うているのは「標高(orthometric)の op」なので、検索語を正確にする。 あわせて検索側の穴も塞いだ: 欧文のクエリは 1 行目の doc までしか見ておらず、”orthometric” は dem_height_frame_convert の引数の説明にしか無いので 0 件だった(opassist.find に docstring 全文の段)。
- L1152 — ★
vertical 即使 op_find 返回了数量,内容也没有一条相关(如 boundary_vertices 的词干匹配)—— 不能靠数量就说「存在」。
examples/poc_glyph_typo_detection.py
- L40 (ja) — 壊す位置(行, 列)。★真値はここで決まる。
- L158 (ja) — ★統計は画像の全マスをまとめて取る —— 閾値をその形で導いたから。 行ごとに取ると、4 字の行では四分位が粗すぎて 0.48〜0.59 に跳ね、 正しい版面を自分で断ってしまう(実測)。導出と適用で統計を変えない。
- L210 (ja) — ★マスを少し広げて切り出し、その中で「このマスに属する成分」 だけをマスクにする。隣の字がマスの縁からはみ出していると、 マスちょうどで切ったときにその分が消し残り、置換後に 旧字の切れ端が浮いて見える(実測)。
- L287 (ja) — ★床は「同じ字なのに絵が違う」量。書体が 2 本以上あるならその散らばりで測るのが 実態に近いが、素の Linux には CJK が 1 本しか入らないことがある (実測: CI は fonts-noto-cjk だけで、この PoC が丸ごと skip して落ちた)。 1 本しか無いときは、ぼけ・線幅・わずかな回転・再標本化という既知の妨害で 同じ字を揺らして床を作る。測っているものが違うので、名前も表示も分ける。
- L355 (ja) — ★合成に対する主張を固定する(真値は自分で植えたので厳密に測れる)。 ここが割れたら、穴が塞がったか本当に壊れたかのどちらかで、 assert を消して通すのはどちらでもない。
- L364 (ja) — ★環境に依存する量を assert しない。 床は「その環境に入っている書体の 散らばり」から作るので、どの書体が入っているかで動く —— 実測 2026-09-17: 手元(Meiryo / 游ゴシック / MS ゴシック)は 0.0581、CI(Noto 系 3 本)は 0.0462。本数は同じ 3 本で、違うのは中身(CI の 3 本は互いに似ていて 距離の中央が 0.0250 対 0.0437)。この差で
電 1 字(距離 0.053)が CI でだけ床を超え、fp == 0 が手元で緑・CI で赤になった。 固定すべきなのは順序である —— 壊れた字の最小距離が、無事な字の最大距離を 上回ること。これは閾値の置き方と無関係に手法の良し悪しを測る(CI の実測: 無事な字の最大 0.053 < 壊れた字の最小 0.069 で、両環境とも完全に分離)。 その上で「床がその隙間に落ちたか」は環境の性質として報告する。
- L375 (ja) — ★これは note 080 で退けた「順位で判定する」とは別物 —— 判定は今も床で行い、 ここで固定するのは分離しているという性質だけ。
- L403 (ja) — ★書体 1 本の環境では主張を弱める。妨害から作った床は書体の散らばりより 狭く(実測 0.0258 対 0.0581)、撮り方の違いだけで無事な字まで超えてしまう (実測 7 本中 5 本)。この環境では言えないことを言わないのが正しく、 閾値を緩めて通すのは測定を捨てるのと同じ。CI には CJK を 2 本入れてある。
examples/poc_good_sample_variation_model.py
- L286 (ja) — ★地の模様が弱いと、汚れた 3 枚の傷が位相相関の山を引っ張り、0.65 px の「ずれ」として拒否された (実測。拒否は正しい振る舞い —— 汚れた良品は位置合わせも汚す)。ここは帯の比較なので模様を強くする。
examples/poc_granular_heap_repose.py
- L357 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L408 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_graph_hierarchy_segmentation.py
- L369 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_grating_interferometry.py
- L323 (ja) — ★正直な限界: 段差の縁の 1 画素だけが π を超える板(平らな背景の隣)は、折り返しが見えずに通る
examples/poc_gravitational_lens_invariants.py
- L77 (ja) — 色。★赤と緑は対にしない
-
| L129 (ja) — ★縁の幅は像面の画素で測る。光源面の距離をそのまま使うと、倍率の 大きいところで縁が細く見え、面積が系統的にずれる(実測 2.1% → 0.2%)。 d は光源面の量なので、像面での変化率 |
∇d |
で割って像面の単位に直す。 |
- L242 (ja) — ★はじめ「暗い像が小さくなる u = 1.5 がいちばん苦しい」と読んで外した。 実測ではどの解像度でも u = 0.3(焦線に近い側)が最悪で、u = 1.5 の 暗い像は n=3201 でも 209 画素ある。苦しいのは「像が小さい」ほうではなく 「像が引き伸ばされて細い弧になる」ほうだった。
- L531 (ja) — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_hyperspectral_foreign_matter.py
- L105 (ja) — 見た目の色(線形 RGB の反射率)。★同じ色にしたのは設計(この PoC の問いそのもの: 色を合わせた異物)。 皮つきアーモンドの茶色に、殻・木片・茶色に着色した樹脂片を ±3 % で合わせた。黒い樹脂だけは黒い。
- L418 (ja) — ★実データの破片は暗い(反射率の中央値 0.07)ので、生の反射率の SAM は足し算のベースラインに負ける(下で数える)。 連続体除去(
spec_continuum_removal、上側の凸包で割る)の帯の深さ 1 − R/包絡 を特徴にする。
- L466 (ja) — ★外の真値の検査 1: 別の撮影の基準試料(Training/PP・PE・PET の 11x11)をライブラリにして、試験の場面の PP / PET / PE を分ける
- L482 (ja) — ★外の真値の検査 2: この PoC の材料表の物理(吸収帯 + Kubelka–Munk)をライブラリにする
- L944 (ja) — 幾何平均(間が空いていれば余裕の真ん中)。★初版は q_k だけで決め、試験のトレイで粒径・含水率の端の仁を 丸ごと排出した(画素の分位点は仁の「個体」のばらつきを数えていない、2026-10-15 に図で見つけた)。
- L1038 (ja) — ★クラスごとに同じ画素数で選ぶ: Fisher の Sb = Σ n_k (μ_k − μ)² は画素の多いクラス(ベルト・仁)に 引っ張られ、少ない樹脂片どうし(PE と PP)を分ける帯域を選ばなくなる(2026-10-15 の初回で実測)。
- L1050 (ja) — ★log 反射率で選ぶ: 画素ごとの明るさ(陰影)は全帯に共通の足し算になり、多変量の J はその方向を クラス内のばらつきとして割り引く(1 帯域だけでは明るさと材質を分けられない —— k = 1 が弱いのはそのため)
examples/poc_illusions_and_perpetual_drawing.py
- L60 (ja) — ★ここは以前「錯視の図で測る側を採点する」章だった。だが並んでいた検査は 自分で置いた定数を読み返すだけで、間に変換が 1 つも無かった —— 厳密に水平に引いた目地が水平だ、平坦に塗ったマスが平坦だ、同値に置いた 2 パッチが同値だ。錯視は人間の知覚の性質なので、測る側が騙される理由が そもそも無い。同義反復なので落とした(2026-09-24、指摘を受けて)。 残したのは 1 件だけ —— 素朴な長さ計測が実際に外すこと。これは 知覚ではなくアルゴリズムの偏りの話なので、中身がある。
- L95 (ja) — ★外した予言 —— 「矢羽根が長いほど偏りも大きい」と読んだが違った。
- L103 (ja) — ★錯視の絵(カフェウォール・チェッカー・カニッツァ・フレーザー・ エビングハウス)は直線と矩形を引いているだけで、この箱の力を 何も示していない。2026-09-24 の指摘を受けて主図から降ろした。 残すのは、測る側の偏りが見える 1 枚だけ。
- L144 (ja) — ★閉形式で厳密に出るものと、再帰で誤差が積もるものを同じ物差しで見ない。
- L167 (ja) — ★最初は「104 歩で 52 マス = 0.5 /歩」と書いたが、実測 0.114 と合わなかった。 測り直すと正味の増加は 104 歩あたりちょうど 12 マス(整数)。周期の 中で塗っては消すので、正味はずっと少ない。推測でなく実測が正しかった。
examples/poc_interferometry_step.py
- L401 — 3) ★重复测量 — 区分偏差与离散 # —————————————————————— #
- L444 — 4) ★与零点(包络线的最大采样)的比较 # —————————————————————— #
- L516 — 6) ★噪声扫描 — 在何处无法测量 # —————————————————————— #
- L556 — ★离散小并不能证明正确
examples/poc_interreflection_fringe_error.py
- L289 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L292 (ja) — ★この PoC だけは CPU 時間が壁時計を大きく上回る(手元 24 スレッドで CPU 10〜13 秒・壁時計 0.6〜0.7 秒、 OMP/OPENBLAS/MKL_NUM_THREADS=1 では CPU・壁時計とも 0.1 秒未満)。計算そのものは小さく、差は BLAS の スレッドの空回り(待ちの spin)で、コア数に比例して増える。60 秒の上限は手元の 4.7 倍で、CI の走者(4 コア) では空回りがさらに小さいので据え置く。上限に近づいたら、計算が増えたのか空回りかをスレッド 1 で切り分ける。
examples/poc_itof_multifreq.py
- L341 (ja) — ★2026-10-18: residue_crt の錨を Wang–Xia 2010(IV-A 節)どおりに直した後は、最尤の復号と同等になる。 修正前(最も長い周期 = 16 MHz を常に錨にした)は 0.556 / 0.407 と大きく誤っていた。差の許容は 最尤の 10 % + 標本 5 個(誤りの少ない条件で数個の入れ替わりを許す)。
examples/poc_kendama.py
- L112 (ja) — ★CI(2 コア、PoC を並列に走らせる)では full の設定が 600 秒の枠を超えて -1(timeout)になった(2026-09-30、run 36657843727、 手元 160 s)。FULLSEYE_POC_BUDGET=reduced(CI では既定)で、大皿の 20 試行(予測誤差の曲線と主要な門)はそのままに、小皿・中皿・ 画素雑音・推奨品の試行を 10 に、画素雑音の段を 0 / 2 / 8 / 16 px に、3DGS の試行・コマ・間隔の段を減らす。門の閾値は変えない (測った段だけで判定)。展示の数字は full の実測で、reduced は「同じ経路が走る」ことの証拠に留める(先頭に BUDGET: を印字)。
examples/poc_knife_tactile_toughness.py
- L483 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_larval_connectome_reservoir.py
- L43 (ja) — ★CI(2 コア)では full の設定が 600 秒の枠を超えて -1(timeout)になった(2026-09-20、run 35501201432)。 FULLSEYE_POC_BUDGET=reduced(CI では既定)で標本・格子・seed を減らす。展示の数字は full の実測で、 reduced は「同じ経路が走る」ことの証拠に留める(先頭に BUDGET: を印字)。
- L207 (ja) — 5. 図(FULLSEYE_FIGURE_DIR があるときだけ)。★2,952² の隣接行列をそのまま描くと 1.3 % の点で一色になり、 Fiedler 配置は重い裾の次数分布で 1 点に潰れる(2026-09-20 に実際にそうなった)。升に集約し、対照と並べる。
examples/poc_laser_line_speckle_floor.py
- L349 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_leak_localization.py
- L591 — ★预测 C 的检验 —— 细密地变动漏水位置,把小数部分打散
- L726 — ★对照组 —— 只把反射左右对调。若偏差方向反转,就能说原因是「较远的接头决定偏差方向」。
examples/poc_lens_tolerancing.py
- L165 (ja) — ★2026-10-21: 棒の縦軸は 0 から(自動範囲は最小値の少し下から始まり、差を 10 倍に見せていた)。
examples/poc_lidar_terrain_change.py
- L425 — ★无法测量的 core 面积完全不计入土方量。也返回按有效率反除后的值 —— 不反除就会把「悄悄缺失的土方量」当成正确值。
- L713 — ★接近真值的数字未必「正确」—— 把方向相反的两个误差分开计数
- L842 — ★有效 core 太少时,LoD 不算作「已测量」(2 个点的标准差能算出数字但没有意义)。
- L845 — ★若在此处抽稀,C2C 就会去测「抽稀后的点间距」,密度依赖随之消失(最初写成统一到 6000 点时,任何密度下都成了恒定的 0.42 m)。
- L965 — — ★ 对齐掉多少,变化就消失多少 ————————————– #
- L1329 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
examples/poc_lightfield_depth.py
- L707 — 2b. ★ 缺口 (d):docstring 说是 0-d,实际是 (1,)
- L723 — 6. ★ 缺口 (a):默认 linear 会把 1.15 拉向 1.0,cubic 不会
- L747 — 10. ★ 缺口 (e) 已于 2026-09-06 堵上。已改写为固定住已堵上的状态这一侧(以前是 assert「会发出警告」)。
examples/poc_livestock_body_volume.py
- L1187 — ★3 台与 6 台的切线集合完全一致(平行投影下相对的 2 台相同)
- L1195 — ★奇数的 13 台胜过偶数的 16 台
- L1209 — ★3-D 凸包无法替代「截面的凸包」(会把胸围大幅偏离)
- L1212 — ★2 倍律:胸围误差随体重翻倍(残差为 2 次项)
examples/poc_machine_condition_fusion.py
- L184 — (联轴器, 轴承A, 轴承B, 整机) 的发热 [W]。★正常、不平衡、松动是故意做成相同的 —— 从原理上无法用热区分的 3 种模式。
- L202 — ★和轴承一样热。不同的只有扩散范围(两个轴承 + 整机)。
- L1028 — ★2026-09-08:这里原本自己手写了 numpy 的 rfft —— 因为读到「台账里没有单边幅值谱的入口」,但
fs.spectrum 一直都在(只是没在台账里出现)。这是只看一层就断定「没有」的例子,故改为使用 op 的写法。
- L1162 — ★2026-09-08:这里原本写着「台账里没有 spectrum」,但
fs.spectrum 从一开始就在(dsp 的 1-D 层)。缺的只有「在台账(fs.ledger)里出现」和「每个 op 的笔记」;这个 PoC 只查了一层就断定「没有」,自己手写了 numpy 的 rfft。现在把 ops1d 接入台账后,两边都能查到。
examples/poc_malecns_activity_wave.py
- L241 (ja) — ★同じ瞬間を 3 方向から(2026-09-20、ユーザー「いくつかの方向から発火状態を見れると良い」): 上段コネクトーム、下段 shuffle
examples/poc_material_optical_library.py
- L111 (ja) — ★2026-10-15: 水の k を Hale & Querry 1973 から Segelstein 1981 に差し替えた(RII の Hale の表は NIR を 0.2 µm おきにしか持たず、1.45 / 1.94 µm の吸収帯を線形補間で 1/3 に潰していた。n は滑らかなので Hale のまま)。 1500 nm の k は optiland 0.6.3 の MaterialFile で Segelstein.yml を評価し直した値(2.2392e-4)。
- L195 (ja) — ★2026-10-15: 以前は k の相対差に 1e-6 を掛けて n の門に混ぜていたので、k が ±100 % ずれても通った。 写した k は有効数字 5 桁(1.4361e-07 など)なので、丸めの幅は相対 5e-5。optiland が k を持たない点(0)では こちらも 1e-8 未満(水の 500 nm は Segelstein の 9e-10、吸収の無い区間)。
examples/poc_measurement_system_analysis.py
- L155 (ja) — ★★看板は一目で読めるものにする。濃淡の地図は情報としては正しいが 読者には「色のついた雑音」で、何の図か分からない。ゲージ R&R の古典的な 見せ方 —— 部品ごとに測定値を縦に並べる —— なら、10 個の塊が縦に離れて いるのが部品差、各塊の太さが測る行為のばらつき、と目で読める。
- L211 (ja) — ★「全部内側のはず」と書いたら 1 升はみ出した。実データのほうが正しい —— 規格の例題はわざと 1 点だけ管理外にしてある(範囲図の読み方を示すため)。
- L466 (ja) — ★2 点を結んだ直線では「7.3 % 違う」としか言えない。交互作用の強さを 掃引すると、いつモデル選択が効いていつ効かないのかが曲線で見える。
- L661 (ja) — ★★規格の「t 表を引く直前に切り捨てる」は、滑らかな t(ν) に対する階段。 実装が踏んだ欠陥(切り捨てずに引いた)が、そのまま曲線と階段の差になる。
- L684 (ja) — ★3 点の散布では「向きが逆」が読み取れない。相関係数を掃引すると、 2 本の曲線が無相関の水平線を反対側で横切るのが見える。
- L756 (ja) — ★★その 150 は乱数ではなく閉形式で出る: X1²+X2² は u²χ²₂ = 平均 2u² の 指数分布なので、上側 95 % 点は 2u² ln 20。公表値と小数 1 桁まで合う。
- L771 (ja) — ★★閉形式が絵になる場所。x1 = x2 = 0 では X1^2 + X2^2 は u^2 chi^2_2、 すなわち平均 2u^2 の指数分布。95 % 点は 2 u^2 ln 20 で閉形式。
- L837 (ja) — ★★半幅を 3 本の水平線で並べても「なぜ違うのか」は見えない。密度を 重ねると、正規近似の裾が実際より厚いことが絵で分かる。
- L849 (ja) — ★区間は水平の線分で描く(plot_series は非有限を拒むので 「NaN で区切って 2 本の縦線」は使えない。読みやすくもある)
- L912 (ja) — ★窓は3 段階すべてが入るように取る。伝播則の下端が 0 を超えるのは x1 > 2 k u = 0.0196 なので、そこまで届かない窓だと「追いつく」が見えない。
- L922 (ja) — ★各コマで最大値に正規化する。絶対密度のままだと、指数(原点で 2e4)と 後半の正規(1.6e3)で 1 桁違い、後半が平らに潰れて形の変化が見えない。
examples/poc_mesh_quality_repair.py
- L602 — ★让它饱和显示。原始差异最大 %.2f mm,直接上色会使 99 %% 的像素为 0 而全黑,成为「跑了但什么都没出来」的图。
- L816 — ★用双对数绘制。线性轴下误差会挤到粗糙一侧的 1 个点,斜率(=误差律)完全无法读出(2026-09-07 曾这样画过一次)。
- L832 — ★直接叠加累积分布会使 4 条都挤在 0.9 以上而无法读取。移动的是上尾,故以分位点 0.5〜0.99 为横轴,纵轴画「该分位点的曲率」(逆累积的上半)。
- L568 — ★实测比这更慢。掩膜上实际被抹去的晶界像素比例 f_eff 小于 f(模糊会把相邻的黑漏到缝隙两端各 1 px,局部阈值将其拾取),故与用 f_eff 重新推得的预测 ΔG0 + 6.64 log10(1-f_eff) 对比。
examples/poc_moire_screen.py
- L586 (ja) — ★2026-09-23: 語の網を (“notch”, “destripe”, “mura”) に狭めた。npr 族が入って ‘moire’ と ‘periodic’ が引っかかるようになったが、
halftone_moire_period は うなりの周期を予言する op であって落とす op ではない —— 穴は残っている。 「語で引く穴の固定」は、別の意味で同じ語を使う族が来た瞬間に偽陽性になる (この PoC は (a) で fly_hex_lattice の例を既に書いている)。穴の主張は 語でなく「何ができないか」で書くこと: ここで無いのは「特定の (fx, fy) を 落とす」op であって、「モアレという語を含む op」ではない。
- L636 (ja) — ★2026-09-23: “moire” はここから外した —— この PoC が「族の名前か docstring に入れておけ」と書いた提案がそのまま実装され、
halftone_moire_period が 引けるようになったため。穴の記録は埋まったら埋まったと書く(消さない): 消すと「昔から在った」ことになり、何が効いたのかが記録から落ちる。
- L640 (ja) — ★元の判定は「名前にその語を持つ op が返らないこと」(docstring 一致は数えない)。
op_find は docstring も語幹も拾うので、素の == [] にすると edge_alias_energy のような無関係の族で必ず鳴る(一度そう書いて落ちた)。
- L646 (ja) — ★2026-10-13:
lattice_moire_peak(flyvision、標本化格子がナイキストを超えた模様から作る モアレの尖り = ピーク/背景中央値)も引けるようになった。網点の 2 版のうなりとは別の モアレ(格子×周期面)で、ディスプレイ・メッシュ・織物の検査カメラ側の語。
- L649 (ja) — ★2026-10-15: 位置合わせのモアレ 8 op(moirealign、
moire_*)が加わった —— ピッチの僅かに違う 2 枚の格子の 縞の位相から nm のずれを読む側で、網点のうなり(画質の欠陥)とは逆にモアレを測りに使う語。
- L651 (ja) — ★2026-10-15: op_find に docstring 全文の段(最低点 12)が加わり、本文で「モアレ」に触れるだけの op (fly_vogel_lattice・halftone_screen・sampling_alias_distance)も並ぶ。名乗る op だけを数える。
examples/poc_multibeam_bathymetry.py
- L359 (ja) — ★走時を使い切った光線は cosθ が層の途中の値のまま残り、後ろの層で dt_full が 負になりうる。負の dt は rem を「生き返らせ」光線を進めてしまう(実データの 152 節点のキャストで 57 度・0.13 s が 110 m → 493 m になった)ので 0 で止める。
- L544 — 合成回波的部分角数目。★把它设为 61 时,在 70 度处相邻部分角的到达时间相差 330 µs,超过脉冲宽 64 µs,于是包络变成梳齿,幅度检测会拾取其中一个齿(检测偏差为 -1131 µs)。用直方图构建到达时间的密度并与脉冲卷积更正确。
- L572 — ★不要把下限裁到 0 —— 正下方波束会只剩一侧,照亮的带宽减半(曾以脚印减半的形式踩过一次坑)。
- L729 — ★把横轴除以该波束自身的回波长度。以原始 µs 叠加会让 70 度(21 ms)独占坐标轴,使正下方与 45 度挤成一条竖线。
- L732 — ★
plot_series 会拒绝 xlim 之外的点(因为它们贴在边框上,看着像真数据)。裁剪是调用方的职责,故先裁剪。
- L1151 — ★不要看重叠的正中间 —— 那里两条测线的摆角相同,误差叠加量相同而差为零。要取整个带内的最大值。
- L1222 — ★纵轴取高度(= −深度)。直接用深度绘制会上下颠倒,使「微笑」形状看起来像「愁眉」。
- L1293 — ★纵轴为 −深度。直接用深度绘制会得到海面在下、海底在上的颠倒图。
- L1327 — ★
op_find 以词干部分匹配来命中,所以即便数量不为 0,内容也可能无关(“footprint” → sk_median_disk)。要看到最上层的名字再说「没有」。
- L1383 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
- L1974 (ja) — ★左右に分ける: 音速の取り違えは θ について偶(左右対称)。ロールの小さな 取付偏りや参照格子の左右の食い違いは奇(D tanθ δ)。中心対称な階級なので k と n−1−k が鏡像。偶部で崖を測り、奇部は両解で同じか(= 音速でない)を見る。
- L2231 — ★全路径的悬崖比预测更靠前。差异来自幅度检测的偏差(闭式中没有的量)
examples/poc_nuclei_ploidy.py
- L686 — ★确实存在方向相反的两个失误相互抵消、伪装成「与真值完全一致」的行
examples/poc_one_stroke_epicycles.py
- L209 (ja) — ★線画なので灰色のまま出す。(H,W) を渡すと save_gif が疑似カラーに 塗って黄緑の絵になる(実測)—— 強度そのものを見せる図では色は邪魔。
- L246 (ja) — ★env は examplefig が 呼ばれるたびに読むので、ここで入れれば効く (import 時に固定されていたら –out が黙って無視される、の回避)。
- L267 (ja) — ★2026-10-06: 図の見出しが「photograph (NASA AS11-45-6709)」のまま北斎を描いていた(前の題材の名残)。 出典は入力から決める(–image で自分の写真を渡したときに北斎と名乗らない)。
- L418 (ja) — ★この絵では既定のペン幅 1.0 px がたまたまほぼ当たっており(偏り -0.0031)、 解いた幅 0.900 px のほうが偏りは大きい(-0.0294)。閉形式が当てるのは 偏りではなくインク率なので、門はそちらに置く —— 偏りで門を作ると 「元から合っていた絵」で落ちる(実測でそうなった)。
- L422 (ja) — ★偏りで門を作ると「元から合っていた絵」で落ちる(この絵では既定 1.0 px の 偏りが -0.0031 と既にほぼ 0 で、解いた 0.903 px のほうが偏りは大きい)。 閉形式が当てるのはインク率で、線が重なるぶん実測は必ず下回る —— 門はその向きと大きさに置く。
- L457 (ja) — ★ナイキストを満たしているかを先に測る。等弧長の打ち直しは、標本間隔が 線分より粗いと角を切って線そのものが短くなる —— フーリエに載せる前の 段階で情報が落ちるので、ここを見ないと「予言が当たった」の土台が崩れる。
- L523 (ja) — ★図を出さない設定のときは組む前にやめる(examplefig.enabled はそのためにある)。 72 コマを描いてから捨てていたので、この PoC だけで 322 秒かかっていた —— スイートは FULLSEYE_FIGURES=off で全 PoC を並列に走らせ、1 本 600 秒・ 全体 5400 秒の上限があるので、共有ランナーで timeout に落ちる(CI py3.12)。 数値の門はフレームに依らないので、ここを飛ばしても採点は 1 つも減らない。
examples/poc_pallet_load_utilization.py
- L232 — ★甲板上的点会因噪声上浮到 +3σ,所以用地板阈值截断。不加这一步,即使是零溢出的货物也会出现 0.006 m3 的“溢出”。
- L479 — ★g = w 正好相等时,就变成了“格子是否碰巧对齐”的赌局。
examples/poc_panorama_drift.py
- L112 — ★缺口 (a):以下 4 个在 fs 门面和 fs.op 中都没有出现
examples/poc_particle_sizing.py
- L213 — ★只用一个种子时,这条曲线的起伏就只是波动。用 4 个种子把均值和离散度分开后,再说它“越过”了。
- L428 — ★对照组 —— 只把既未融合也未断裂的团块,与该团块所成像的那个粒子本身一对一地比对。若真值一侧用全部粒子,“越大的粒子越容易融合”这种选取偏差就会混入,与采样偏差无法区分(起初就是这么写的,弄错了)。
examples/poc_particle_tracking.py
- L702 — ★返回的不是掩膜,而是 (N, 3) 的 (z, y, x) 坐标(2-D 的
local_max / sk_local_maxima 返回图像,所以族内不一致。第 10 节的缺口 (g))。起初用 count_nonzero 计数,把数量级搞错了。
- L777 — ★为把向上 3.4 倍、向下 0.93 倍装进一张图,纵轴取 log10 比值。0 表示“正好是真值”。若保持线性,向下的偏差会被压扁而看不见。
- L792 — ★叠加原始 MSD 时,4Dτ 的直线支配一切,看不出差异。改用除以真值的比值后,偏离 1.0 的方式(=损坏方式)就能从形状上读出。
examples/poc_periodic_video_boundary.py
- L137 (ja) — 第 2 章 ★空の出力は、等変性の門を素通りする # ————————————————————————— #
- L267 (ja) — 第 4 章 ★汚れるフレームは集合として閉形式で予言できる # ————————————————————————— #
- L296 (ja) — ★汚れが先頭側だけで末尾側に無いこと = 窓が後方(因果的)である証拠
- L457 (ja) — ★この 1 行が要る。門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見ており、落とすと exit -2(門が付ける合成コード、 意味は「exit 0 だが PASS を印字していない」)で赤になる。
examples/poc_phase_measuring_deflectometry.py
- L496 (ja) — ★2026-10-15: 手元 23 秒の計算が、CI の並列のシャード(py3.12 3/4)では壁時計 120.6 秒になり、この門だけが赤に なった。壁時計は同じ機械で走る他のテストの負荷を数えてしまう。この門が抑えたいのは「この PoC 自身の計算量」 なので、プロセスの CPU 時間で測る(壁時計は併記する。テスト側の 600 秒の打ち切りは別にある)。
examples/poc_photoelasticity.py
- L160 — ★固定所见:这是对 fullseye 的 Mueller op 的严格验算,即使让 δ 以 15 度步长走一圈、θ 取 5 种,也在机器精度上一致(实测 2.2e-16)。若此处松动,第 3 节之后测的就不是“读取流程”,而是 op 的 bug。
- L181 — ★也固定应力场本身的验算。若积分得到的力与载荷不一致,就不是“真值”;中心值应在代数上等同于闭式 8P/(πDh)。
- L207 — ★固定零点的水平。之后所有的“◯倍”都以这 1.09 MPa 作分母,所以此处一动,比较的含义就变了。
- L231 — ★固定所见:从单张暗场图只读整数条纹的朴素方法,连零点的 2 倍都赢不了。因为分辨率被 fσ/h = 1.78 MPa 的步长所限。与第 4 节相移(误差降到机器精度)的对比是本 PoC 的骨架。
- L286 — ★因为在零噪声下从同一强度公式反解,θ 应严格还原(从 4 张平面偏振求 4θ 的代数本身就是逆映射)。
- L308 — ★固定所见。(1) 一致率超过 95 %,但达不到 100 %。其余是被 (δ,θ) ↔ (-δ,θ+90°) 二义性翻转符号的像素,单波长单次测量原理上无法消除。就把“既非几乎吻合,也非完全吻合”这个所见原样固定下来。
- L371 — ★固定所见。(1) 没有退偏(Stokes 幅值严格为 1)。这是第 5 节主张“调制下降的不是光量,而是相位灵敏度”的依据。
- L377 — (2) ★★实测说的恰恰是“传入掩膜就能修好”这一朴素期待的反面:无掩膜 97.0 % / 排除欠采样 97.1 % / 连低调制也排除则降到 81.9 %。因为抽掉低调制像素会使区域被割裂,skimage 的 unwrap 会为每个岛选取不同的 2π 偏移。“两者都可用掩膜排除”作为预报正确,作为处方却错误。固定实测值。
- L442 — ★固定所见。(1) 若既无噪声也无量化,δ 从明场/暗场之比中严格还原。
- L445 — (2) ★“仅” 8 bit 量化的误差,与“仅”噪声 σ=0.002 的误差同量级(实测 0.00277 vs 0.00305)。相机的位深与噪声一样重要。
examples/poc_pigment_unmixing.py
- L860 — ★“不要归结为一个数字”的根据本身。同一行中 1.000 与 0.013 并列。
- L1082 — ★把没能取胜这件事也留在图里。没有任何一条复原落在零点线以下。
examples/poc_pipe_wall_loss.py
- L423 — ★健全区要选“没有任何缺陷落入的 z”。起初我把 z=20..60 写成健全区,但那正好在管底腐蚀的正上方(壁厚 4.5 mm)。
- L471 — ★r_in/r_out 以像素(体素)为单位。若按 mm 传入,会采样到视野之外,返回值全为 0(无声无息。起初就因此出了一张全黑的图)。
- L817 — ★由于按每个面板归一化,先裁到同一范围再传入(不裁的话只有 E0 按 ±4 mm、其余按 ±1 mm 上色,无法比较)。
- L1040 — ★缺口一被堵上就会响。2026-09-07 响了,于是重写了本节 —— 因收到“按 mm 传入会毫无异常地全返回 0”的指摘,当环落在视野之外时改为 fail-closed。记录它从“返回空并沉默”变为“拒绝并告知”。
examples/poc_pixel_shift.py
- L418 (ja) — drizzle(既存 op、面積保存の別実装)で独立に合わせる。★drizzle の shifts は「フレームの中身が基準からずれた向き」 なので、センサのシフト(画素 (r, c) がシーンの c + dc を見る = 中身は −dc ずれる)とは符号が逆。
- L508 (ja) — ★Q = 2 は「折り返しが出るか」の境目。見える解像の得(系の MTF ≥ 0.1 の帯域)が尽きるのはもっと手前: sinc(0.5)·MTF(0.5Q) = 0.1 の Q*。F 11(Q = 1.75)は画素律速の判定でも得は 1.0 倍。
examples/poc_plateau_venue_lod2.py
- L124 (ja) — ★文献値との差は門にしない(正直に): 間引いた点群の主軸方向の外接幅は 562 × 298 × 244 m で、 文献の 535 × 294 × 209 m より 1〜17 % 大きい。主軸の取り方(点の主成分か慣性主軸か)と外接の取り方の 違いで、どちらが「正しい」かをこの例は決められない。比較の文には文献値(535 m)を使う。
examples/poc_pod_lighting.py
- L406 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_powder_grinding_ae.py
- L269 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_powder_scoop_pour.py
- L313 (ja) — ★2026-10-07: 共有ランナーでは同じ計算が手元の数倍かかる(poc_reproducible_icp で 6 s → 41〜57 s)。 CI(py3.10)で 5.33 s になり落ちた。主張は手元の 5 s、CI は 8 倍の枠で「桁が変わっていない」だけを見る。
- L316 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L503 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_print_registration.py
- L151 — 网点线数 [lpi](商业印刷的惯用值)。★故意避开整数比:取 1200/150 = 8.00 px 时,所有网点都落在相同的小数位置,采样相位对齐,合成器就出现伪影(实测重心每个小数偏移跳动 1.4 px)。实际扫描中,分辨率也几乎不会是线数的整数倍。
- L405 — ★台账的入口会为匹配声明的 out 类型而丢弃 info,所以要用
.raw(这个坑在 fullseye/init.py 的注释里带实测记着)。
- L855 — ★FM 一侧不收窄搜索范围(收窄也不改变结果,但为了堵住“AM 的折返是因为搜索范围”这种借口)。
- L1242 — ★两级失效的点,必定是粗略值超过单元半径的点(固定包含关系)
- L1277 (ja) — ★2026-09-13: ‘lattice’ だけ例外を 1 つ許す。flyvision 族の
fly_hex_lattice(複眼の六角格子)が この語を含んで CI で鳴った(run 34751219513)。あれは網点の格子ではないので印刷の穴は 残ったまま —— 例外は名指しで 1 件に限り、それ以外が現れたら今までどおり鳴る。 「語で引く穴の固定」は、無関係の族が同じ語を使った瞬間に偽陽性になる、という実例。
- L1281 (ja) — ★2026-10-13: 縞に近づくハエの眼(poc_zebra_stripes_fly_eye)の
fly_vogel_lattice(フィボナッチ の複眼)と lattice_moire_peak(標本化格子のモアレの尖り)も同じ語を含む。どちらも複眼の 標本化格子で、網点の格子ではない —— 名指しで足し、印刷の穴は残ったまま。
- L1286 (ja) — ★2026-09-23: ‘halftone’ / ‘screen’ / ‘moire’ の 3 語は埋まった。npr 族の
halftone_screen(回転網点の合成)と halftone_moire_period(2 版のうなりの 周期と向きを閉形式で)が入り、この PoC が「入口が 1 つも無い」と書いていた うちの合成とモアレ予言はファサードから引ける。穴の記録は消さずに、埋まった 語を「在ることの検査」に裏返す —— 消すと「昔から在った」ことになる。 残っている穴は ‘rosette’ / ‘misregist’ / ‘lpi’ / ‘trapping’(版ずれの測定、 スクリーン角/線数の推定、トラッピング)で、そちらが印刷検査の本丸。
- L1330 — ★基准也加入噪声 —— 零噪声图像会让 star_detect 因“0 颗星”而抛出 ValueError(这本身就是正确的 fail-closed)。
- L1353 — ★2026-09-08:因本 PoC 的指摘而修正了 op 一侧。在 docstring 中带实测数字写明“不能用于重复结构”,并让它把投票的第二高峰 / 最高峰作为
vote_margin 返回。用赞成率无法区分的两者,用这个数就能区分。
examples/poc_print_warpage_risk.py
- L364 — ★新生成的层被放在“当时已经翘曲的面上”(单元的诞生在变形后的构型中进行)。若忘了在此初始化,只有后长出的层保持零位移,用列平均测得的翘曲变成 1/4(2026-09-07 踩过)。力学(K 与 f)在公称格子上,故不变。
- L806 — ★颈部整个消失。部件会分成两块,所以不能求解。
examples/poc_pv_thermal_survey.py
- L381 — ★MOD_SHELTER 是一个健全但吹不到风的模块。在第 3 节,它在全局平均基准下会变成“故障”。
- L583 — ★模块编号要按每个编号的面积比决定。对编号取平均再取整,会使边界像素变成相邻编号(或 0),从而破坏逐模块处理。
- L812 — ★模块中位数的代价 —— 对整个模块的异常盲目
- L1270 — ★
apply_cmap 若不传 vmin/vmax,就会按该数组的 min/max归一化(导致每个条件下颜色含义不同),所以务必传入。
examples/poc_pxrd_phase_peel.py
-
| L185 (ja) — ★a の門 5e-5 の余裕(組み込み時 2026-10-06 に雑音の種を 12 通りずつ振って実測): 誤差は雑音でなく較正の系統で決まり、 この像(傾き 3°・向き −40°)では +3.0〜+4.1e-5(種 21 は +3.8e-5)。種による散らばりは ±0.5e-5 程度で、24 通りの最大は |
4.2e-5 |
。 種は固定なので結果は決定的。門を締めると系統の偏りに当たり、緩める理由も無いので 5e-5 のまま。 |
- L260 (ja) — ★40 s は手元(19-22 s)の 2 倍で決めていたが、CI の py3.10 の走者で 41.6 s に なり落ちた(2026-10-11、ほかの 13 門は全部 ok)。走者は手元の約 2 倍遅いので 3 倍の 60 s に。
- L262 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_real_coin_metrology.py
- L136 — ★即使数目相符,也未必数的是同一样东西。要确认 1 个圆恰好落入 1 个成分(一对一)—— 不做这一步,“24 = 24”也会碰巧成立(1 个两片粘连的团块 + 1 个杂点,仍是 24)。
- L341 (ja) — ★2026-10-06: 題の「46 %」が固定文言で、実行の値(+0.40 で -50.41 %)から外れていた。実行の値を差し込む。
examples/poc_real_deblur_honesty.py
- L199 — ★要守护的不是“谁获胜”,而是获胜者随度量而不同这件事。若把方法名固定,就会变成“仅因实现变好”就失败的门。
examples/poc_real_defect_floor.py
- L156 — 振幅的步长。★它本身就是一个旋钮。若太粗,极限会被舍入到同一格点,从而把“σ 越大差距越大”这类由步长制造的差异误读为真实(2026-09-09,在 34 级时 σ=1.5 与 σ=3.0 的中位数都舍入到 3.20)。
examples/poc_recycling_sorting.py
- L520 — ★在扫描之前,先从代数给出预测并打印出来。
examples/poc_registration_basin.py
- L785 — ★当用户认为“法线明明是有的”而显式传入
estimate_normals 时。这里是缺口的残余,比默认值差 14 个数量级。
- L965 — ★缺口 1 已于 2026-09-06 封堵。此 assert 已改写为固定已封堵的状态一侧(以前固定的是损坏状态:
d_fixed < 1e-6 < d_default = 已损坏)。若损坏方式回归,这里会失败。
- L976 — ★缺口 2 已于 2026-09-06 封堵。以前是
< 0.9 * len(ka)(固定损坏状态)。现在固定的是保持默认即可完全一致。
examples/poc_reproducible_icp.py
- L39 (ja) — ★既定(図なし)の経路は CI の PoC の門そのもの。手元 6 s が CI で 41〜57 s(約 9 倍)になり「所要 ≤ 30 s」で落ちた (0.4.0、a9f7e765c)。既定は手元 2.5 s 以下に絞り、主張の重い版(20 万点 × 11 順、ICP の家族 5 本)は –full に移した。 記事・展示の数字は –full の実行から写している。
- L465 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L468 (ja) — ★GPU の測定(–full で GPU があるときだけ)の待ちは CPU 時間に入らない —— 門は CPU 側の計算量だけを見る。
examples/poc_rotation_invariance_audit.py
- L115 — ★HALCON 风格的区域矩不变量。与用于 3-D 点云的
moment_invariants 不同(仅凭名称选择会要求 (N,3) 而失败)。
- L208 — ★当分母接近 0 时,相对偏差失去意义。对于接近圆形的形状,Hu[1] 的真值接近 0,因此若默默用 % 来表述,就会变成“偏差 30 %”。
- L220 — ★预测落空之处。写的时候我以为“对灰度插值后再二值化会更粗糙”,但在周长方面结果相反。
- L262 — ★由于背景是单色,轮廓用有彩度的颜色绘制。灰色没有彩度,因此有彩度的颜色能靠色相与任何灰阶区分——比反色更可靠,而且一眼就能看出“这是叠加的线”。反色真正发挥作用是在背景为彩色、“无论选哪种颜色都可能冲突”的时候。
examples/poc_safety_clearance.py
- L114 — ★躯干由并排放置两个胶囊体构成。若用单个圆柱体,截面会变成圆形,肩部(距躯干中心 ±0.19 m)会脱离躯干的阴影——真实躯干的截面是宽 0.50 m / 深 0.30 m 的扁平形状,伸出的手臂从背后看会被躯干遮住。
- L126 — ★X0 与速度经过挑选,使得“每次试验中真实分离距离始终为正(不接触)”且“在危险带停留足够长的时间”——若让其快走,会在数帧内穿过危险带,用于统计漏检的样本就不够。
- L673 — ★若在保留遮挡的情况下改变密度,遮挡偏差(+0.12 m)会叠加到每一行上,使密度的影响看不出来。逐个关闭因素正是对照组的作用。
- L683 — ★噪声与抽稀只抽一次时,漏检率会上下波动几个 %。跑 3 次取平均。
- L840 — ★按行批量评估(逐个单元格的 Python 循环会跑 15000 次)。
- L1079 — ★体积 op 是 (depth,row,col)。grid_coords 是 (nx,ny,nz),所以要转置。
examples/poc_sam_hybrid_bonding_voids.py
- L332 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_scan_to_bim_asbuilt.py
- L658 — ★施加 trim 会持续只挑选“拟合良好的点”,落入 RMSE 0.13 mm 的另一个解(实测:trim=0.9 时吸入角为 0.17 mrad,无 trim 时为 0.62 mrad)。在 as-built 检查中,缺陷本身就是较大的残差,所以 trim 会把缺陷丢弃。
- L950 — ★把标题主张放进一张图:完好无损的天花板,仅因对齐方式就显得倾斜
examples/poc_sea_ice_concentration.py
- L232 — 2. ★零基准 vs 线性混合分解 # ————————————————————————— #
- L252 — 3. ★★团块大小(周长)决定偏差 # ————————————————————————— #
- L291 — 4. ★★偏差的符号随密接度反转(抵消点) # ————————————————————————— #
- L353 — 6. ★当端元偏移 5 % 时 # ————————————————————————— #
- L380 — 7. ★★第 3 成分(薄冰) # ————————————————————————— #
- L490 — (b) spec_unmix 是存在的(★在写“没有”之前查了 3 层)
examples/poc_search_sweep_width.py
- L829 — ★形状的作用方式因搜索类型而异。统一扫描宽度,只比较曲线形状。
- L869 — ★用漏检率 1-P 来绘制。若用 P 本身,会贴在右上角、被图例框挡住而看不见(实际上就曾被挡住一次才察觉)。图要先看“是否读得出来”再定——即使数字正确,被挡住就传达不了。
- L1089 — ★可重现性检查:由于种子和帧数都与 §3 不同,看在相同条件下会变动多少。
- L1266 — ★要超过零基准(在假阳性率对齐的前提下)。增益是保守的——“即便零基准也能达到 174 m”才是本节的发现,因此固定的是这一点。
- L1272 — ★落空的预测:减去整体背景是仿射变换,因此实质上等同于零基准
- L1286 — ★落空的预测:在实测的 p 下,平行搜索在 C=1 时达不到 1.000
- L1290 — ★形状只对平行搜索有效:统一扫描宽度后,随机一致而平行分裂
- L1293 — ★落空的预测:本以为平坦的曲线更强,结果反而更弱(因为拖尾长)
- L1296 — (6) ★W 加倍 与 t 加倍 等价
- L1304 — (8) ★看守者:误检集中在正下方。仅凭阈值 W 就会大幅变动
- L1322 — ★填补缺口一侧的门(2026-09-08)。由于给 op_find 加了日文段,并在 star_detect 的 docstring 中写了领域中立的描述词,因此固定在日文查询中能排在前列。若退化,这里会报警。
- L1327 — ★唯独“点 检测”至今仍不出现——单字“点”也必然出现在 cv_canny / frei_amp 这类轮廓 op 的说明中,因此同分并列把它挤了出去。不掩盖这一局限:日文段只有在“两字及以上的词起作用”时才拾取得到。
examples/poc_segmentation_gauntlet.py
- L237 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
- L282 (ja) — ★表は世界ごとに 1 枚。examplefig.save_table は 1 セルごとに text_box を全画像に掛けるので、65 行 × 16 列の 1 枚は 100 秒を超えた (実測 104 s)。11 行 × 11 列 × 6 枚なら数秒で、読む側も世界ごとに手法を比べられる。
examples/poc_shape_from_polarization.py
- L296 (ja) — ★2026-10-15: 壁時計は CI の並列のシャードで同じ機械の他のテストの負荷まで数える (poc_phase_measuring_deflectometry がこれで赤になった)。この門が抑えたいのはこの PoC 自身の計算量なので、プロセスの CPU 時間 (time.process_time)で測り、壁時計は併記する。
examples/poc_solar_el_inspection.py
- L366 — ★校正线也要通过同一成像系统(模糊)。未经模糊直接贴上的校正线,其响应比真实裂纹强 2.4 倍,使陡崖偏向粗的一侧(2026-09-07 踩到过)。
examples/poc_solar_limb_darkening.py
- L317 — 2. ★零基准(50 % 法)vs 梯度最大 vs 减光模型 # ————————————————————————— #
- L367 — 3. ★★扫描减光系数 u —— 不是成比例而是折弯 # ————————————————————————— #
- L391 — ★对照组——关闭模糊后,剩下的只有几何(50 % 面的位置)
- L427 — 4. ★★模糊的作用符号随阈值改变(抵消点) # ————————————————————————— #
- L488 — 5. ★黑点 —— 3 % 的离群点会使半径变动 # ————————————————————————— #
examples/poc_spc.py
- L144 (ja) — ★MT 法。単位空間の MD² の平均はちょうど (n-1)/n(導出した恒等式)。 1.0 を固定する検査はどんな有限標本でも間違いになる。
examples/poc_star_astrometry.py
- L264 — 图像合成(★ 缺口:fullseye 中没有在指定坐标放置星点的公开 op) # ————————————————————————- #
- L1243 — ★ “每次小”和“总体小”是不同的主张。
- L1348 — ★「均匀·孤立」的偏差为 0.0000 是理所当然的 —— 板解正是用那 24 个拟合的,所以最小二乘让残差的均值为 0。要看未使用的星上的误差,需逐个剔除后重新求解。
examples/poc_stockpile_volume.py
- L658 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
- L863 — ★度量不同,胜者会互换:体积用水平底面,重心用平面拟合
- L879 — ★落空的预测:插值不是偏小而是偏大
- L882 — ★相互抵消:含插值的外周使误差看起来小,只用可见点时又回来
- L891 — ★工具的漏洞。dem_viewshed 修好后这里会报警(这正是目的)
- L893 — ★2026-09-08:因这个 PoC 的指摘修好了 op,所以现在可见才是正确的。固定它与自建的视线判定一致、且接近闭式解(若再坏则报警)。
examples/poc_strain_history.py
- L507 — ★闭式预测。中央 = (w²-1)/24 x d²(速度)/dt²(平滑化的钝化),因果 = 返回延迟 (w-1)/2 的过去速度。
- L578 — ★不制作把历史本身叠加的图 —— 真值·累积·直接用肉眼无法区分(误差为真值的 0.1〜3 %),只会成为看起来「吻合得很好」的图。只输出能看见所测量之物的图。
examples/poc_structure_4d_deterioration.py
- L349 — ★遮蔽以设计形状(
p_nom)判定。当数 mm〜数十 mm 的劣化使 surface 进入自遮蔽的盒子内侧时,缺损最深处会整体缺测,制造出「越深的缺损越看不见」的虚假场面(2026-09-07 踩到:缺损谷 -21 mm 的 core 全变成 NaN)。
- L437 — ★
fit_plane_3d 的法线符号是任意的。对齐到真正的外向(扫描器一侧)。
- L507 — ★经由台账只返回声明的 out 类型(pose),所以用
.raw 全部接收。
- L696 — ★实际尝试「若密度不同是问题,那就统一它」(voxel_grid_downsample)
- L1257 — ★直接从点云统计可观测的信息量本身(正规方程的对角分量)
- L1299 — ★先取测量方法本身的地板 —— 无劣化、无姿态误差,只测两次。
examples/poc_surface_roughness.py
- L270 — ★真值要 在声明频带之后 定义。真值不是粗糙度成分本身,而是「用 λc 截取之后的粗糙度成分」。若这里用原始的 rough_true,即使按正确步骤测量也会偏 -23%,那 23% 会与采样误差混在一起。不含频带的「粗糙度真值」并不存在 —— 这也是第 2 节的主张。
examples/poc_swc_tree_truth.py
- L200 (ja) — ★門 4: fullseye の op が自前の計算と整数まで一致する(op の実例 + 第 2 実装)
- L209 (ja) — ★門 2: 3 次元 Sholl は回転で整数が 1 つも動かない
examples/poc_table_tennis_bounce.py
- L53 (ja) — ITTF の台の跳ね(30 cm → 約 23 cm)を満たす e と、その落下の衝突の速さ [km/h]。★空気抵抗を無視した √(23/30) = 0.876 では 上り下りの抵抗で 1.2 cm 足りない(21.8 cm)ので、main の最初に抵抗込みで解き直す(_calibrate_ittf)。
examples/poc_table_tennis_rally_loop.py
- L342 (ja) — ★送り合いの刻みは dt = 0.2 ms。刻みごとにコマを作ると 10 本で 2 万コマ超・数百 GB になり、 図づくりがメモリ逼迫で止められた(2026-10-01)。コマはシミュレーションの時刻で刻む: 1/2 速・25 fps = 0.02 s ごとに 1 コマ、軌跡は直近 0.3 s。コマは uint8 で持つ。
examples/poc_table_tennis_spin.py
- L49 (ja) — ★追跡カメラは予算に関係なく 240 fps。120 fps に落とすと標本が半分になり、回転の誤差が √2 倍(バック 0.9 → 10.9 %)、 コマ間で球が 1.6 cm 動くので跳ねの谷も浅く見えた(2026-09-30)。予算は長さの掃引の刻みだけで削る。
- L245 (ja) — 画像から見つけた跳ね(真値は使わない)。★z の局所最小のうち最も低いもの —— 欠けた検出が残ると空中に偽の 「跳ね」ができ、最初の谷を採るとその手前で軌跡を切ってしまう(バックスピンで 36 コマしか使えなかった)。 高さの閾値(台 + r + 1.5 cm)で選ぶ手は、コマ間で球が 1.6 cm 動く 120 fps で本物の谷を落とした
examples/poc_telecentric_metrology.py
- L113 (ja) — 狙い = iterative)。★2026-10-15 から門に使う: 手元に optiland が無いとき(CI)は、この記録値と telecentric.chief_ray_angle・raytrace.chief_ray(入射瞳が無限遠なら絞りを狙う)の両方を 2e-6 mm で照合する (記録は 6 桁に丸めてあるので丸めの幅 5e-7 mm を含む)。
- L1231 (ja) — ★リングごとに自由な楕円(5 自由度)を当てると、影で弧が 90〜180° しか見えない外側のリングは長半径が外挿で 膨らむ・縮む(2026-10-15 に元の解像度で見て分かった: 外側のリングで楕円が白い線から外れ、間隔が 246〜257 px/mm と ばらついた)。テレセン(正射影)なら傾いた板の同心円は「中心と形を共有する楕円の族」に写るので、族ごと当てる。 族の仮定そのもの(中心の共有)は (c) でリングごとに中心を解き直して確かめる。
examples/poc_tem_ctf_thon_rings.py
- L345 (ja) — 許容幅(★初回の実行で 400 Å の例が 12.5 % / 5.2° で旧の幅 10 % / 5° を外れ、広げた —— 記録として残す): 大きさは max(60 Å, 10 %)(実写 part2_001 で著者の 2 つの推定どうしが非点で 9 Å、この推定とは 190 Å 違う桁)、 向きは 8°(大きさの誤差 / 大きさ ≈ 0.12 rad = 7° の桁が、向きの決まりにくさの目安)。
examples/poc_template_tracking.py
- L93 — ★ 漏洞 (a):没有返回相关图的公开 op,所以借用 private。在第 0 章检验其与公开 op
fs.op.ncc_locate 一致后再使用。
- L327 — ★ 漏洞 (d):若是公开 op,这里会静默返回 [0,0,0]。改为明确返回失败。
- L1241 — (2) 零点存在地板 —— 整数坐标的量化(★ 漏洞 b)
- L1271 — (9) ★ 主题:置信度的强项与弱项会随条件反转
- L1275 — ★ 各自擅长的崖是相反的 = 无法把其中任一个选作置信度
examples/poc_theorems_as_pictures.py
- L308 (ja) — ★手前側の辺を集めて、ひとつの座標系で一度に焼く。三角形を 1 枚ずつ 焼くと、呼び出しごとに自分の外接矩形へ正規化されて図が壊れる。
- L423 (ja) — ★判定は “is not a similarity” で行う。”similarit” だけで見ると op 名
ifs_similarity_dimension そのものに当たって必ず通る —— 最初それで書いており、しかも preset 名を間違えて(“fern”、正しくは “barnsley_fern”)未知 preset の拒否を見ていたのに OK が出ていた。
- L547 (ja) — ★図の書き出しが失敗したら、ここで拾う。見ないと「検査は全部 OK・でも図は 1 枚も出ていない」が黙って通る(examplefig は fail-soft で貯める)。
examples/poc_thermal_drift_metrology.py
- L560 (ja) — ★語で穴を固定すると、別の意味で同じ語を使う族が来た瞬間に鳴る。
gauge は 測定システム解析(msa_gauge_rr = ゲージ R&R)が入った時点で当たるように なった —— この repo で 4 度目の偽陽性なので、意味の合う語だけに絞る。
examples/poc_thermal_radiometry.py
- L522 — ★前向是直接积分,逆向是校正表。用同一张表往返会平凡地得到误差 0,就不算测到了地板。
- L543 — ★Case-0 之所以严格为 0,是因为 350.0 K 恰好落在表的节点上。偏离节点就能看到插值误差 —— 把 0 称作地板就是谎言。
- L772 — ★横轴是相对周围的升高。若保持 T_obj,发散会塌缩成左端的一条竖线,读不出关键的「从哪里开始跳」。
- L782 — ★
plot_series 会拒绝框外的点(因为它们会贴在框上,看起来像真实数据)。发散的一侧由调用方先行裁掉。
- L836 — ★横轴是绝对的 Δε。若用相对 Δε/ε 作图,三条会完全重合(因为如 §2 所述 ε 从式中消去)—— 作为图什么也说不出。
- L1169 — ★guard band 用的是上侧的伸出。因为我们想判为合格的是「真值不在阈值之上」,所以在区间的上端裁切。若用下侧 off[0],会裁得过浅(分布右偏多少就浅多少)—— 曾这样写过一次,因误合格没有减少才察觉。
- L1272 — ★同样的取错,在 ε=0.10 的面上 L_obj 会跌为负而抛出异常。也就是说「停下还是静默出错」不是由取错决定,而是由场面决定。
- L1346 — ★发热部要做成平台。若做成山峰,「螺栓与周围同温」不成立,就无法区分表观的谷是因发射率还是因温度。
- L1392 — ★校正消除了偏差,但把噪声放大 1/ε 倍。这就是图 (d) 中只有螺栓发糙的原因。
- L1464 — ★
op_find 以词干的部分匹配来抓取。blackbody 返回 4 条,但内容是 cv_blackhat 等形态学,与热辐射毫无关系。看数量就判「有」会出错。先看到开头的名字再说。
- L1614 — 3. ★落空的预测:绝对误差温度越高越大
- L1616 — ★即使改变度量,发射率的误差也不会随上升比发散(在 Δε/ε 处封顶)
- L1619 — ★发散的是反射表观温度这一侧(升高越小越跳)
- L1632 — 6. ★★覆盖率。在地板(ρ=0)处 RSS 与 MC 都是 95 %,加入相关后 RSS 会下降
- L1636 — ★MC 一侧稳定在 94.4〜94.6 %(并非恰好 95 %)。区间端点由 40000 次试验的百分位决定,故有采样误差,现实中还混有量化。把这些都包含在内地说「MC 是准的」。
- L1652 — 7. ★漏判偏向一侧(对称的 ±k·u 会漏掉偏斜的分布)
- L1656 — 8. ★★guard band:误合格为 忽略 > RSS > MC,误不合格则相反
- L1676 — ★校正消除偏差,代价是把噪声放大 1/ε 倍(接近 ε 之比 9.5)
examples/poc_thermography_ndt.py
- L61 — ★观测时间要取得足够长——超过健全部的 t* (6.8 s)。太短的话健全部的膝会跑到窗外,TSR 会把健全部答成「窗边缘的深度」(实测中卡在 2.82 mm)。
- L126 — ★仅此处为近似。由于一维解不含横向扩散,故在每个时刻以扩散长 σ(t)=√(2αt) 的高斯在面内做模糊。物理的标度律是对的,但不满足边界处的质量守恒。
- L236 — TSR 搜索 t* 的范围。★排除两端不是装饰 —— 高次多项式的 2 阶导数在端点必然发散(Runge)。不排除的话 argmax 会贴在第一帧或最后一帧,深度贴在窗口两端的 2 个值上(实测,2026-09-06)。次数扫过 4–11,最终定为 8(4–5 时 1.5 mm 以深会贴在端点,8 以上与 9/11 给出相同答案)。
- L271 — ★把 t* 舍入到格点步长会让深度呈阶梯状量子化(64 点时为 5 % 步长)。用 3 个点拟合抛物线,求出 ln t 的亚格点位置。
- L329 — ★固定所见。这里是近似零的验算,一旦崩坏就说明实现坏了。
- L343 — ★估计器本身的偏差。完全不经过图像,对严格的 1 维曲线施加
tsr_depth。这里产生的误差就是「多项式拟合的下限」,从第 3 节以后的偏差中减去它,剩下的才是横向扩散与噪声的贡献。
- L361 — ★固定所见:下限不为零但很小。从两侧夹住 —— 若变为零,第 3 节的重新解读(「即使不经过图像的曲线也会偏差数 %」,±5 % 与下限几乎相同)就不成立;若变大,就无法把第 3 节以后的偏差归因于横向扩散。
- L396 — ★固定所见。这 2 行同时成立正是本节的主张本身。(1) 把 16 个归并成 1 条平均后,TSR 输给「始终回答 1.50 mm」的零点基线。
- L426 — ★固定所见。(1) 直径为深度 4 倍以上的右下三角在数 % 内命中(与第 1 节的下限几乎相同)。
- L457 — ★对照组:关闭横向扩散的同一场景。这样就能区分「横向扩散的锅」和「像素不足/取不到掩膜的锅」。只看一边就归咎于物理,是这类实验最常见的错误。
- L504 — ★固定对照组的所见:关闭横向扩散后,16 个全部落入 ±8 %。这 1 行就是「坏掉的原因只有横向扩散一个,既不是像素粗糙也不是取掩膜的方式」的依据。放松它,第 3 节的结论就会退回到『提高分辨率就能修复』的误读。
- L514 — ★如果上面的推理(窗口末端的扩散长度起作用)正确,那么截断窗口就能修复。立下假设后,务必安排 1 个能证伪它的实验。 —————————————————————— #
- L535 — ★固定这个 PoC 最重的所见 ——「纵横比的极限」不是物理,而是拟合时间窗口的选法。(1) 窗口 4 秒时,8 个小的全部落入 ±20 %(实测最差 -14 %)。
- L623 — ★固定所见:若加热均匀,原始单帧检出最多,而 TSR 的 2 阶导数一个也检不出。「对深度估计有效但不适合检测」= 同一工具未必对两者都有效,正是本节的主张本身。
- L670 — ★灯的映入。带有与缺陷同尺度结构的正是这一个。
- L697 — ★固定所见。(1) 会破坏它的只有 (c) 的与缺陷同尺度的不均匀。(b) 的平缓倾斜几乎不破坏原始单帧 —— 这里正是「预料落空」之处,所以明确确认 (b) 不低于 (a)。
- L778 — ★也给默认的 cube 加入 NETD。噪声为零时,健全区的面内起伏严格为 0,SNR 会变成 1e9 这样无意义的数(实测后修正)。
examples/poc_thin_film_reflectometry.py
- L92 (ja) — ★色名から色相への対応は私の選択(CSS の色は表の色より彩度が高い)—— 色相だけを比べる。
- L210 (ja) — ★ 実測で採点(公開データ、CC BY 4.0)—— この PoC の主役 # ————————————————————————— #
- L308 (ja) — ★フラット補正(2026-10-15、図を見たユーザーの指摘「Si 側が 2 段に分かれて見える」から): 写真は視野の中心が明るい 周辺減光を持つ(裸の Si は左端 0.238 → 中央寄り 0.263、SiO₂ は中央寄り 0.103 → 右端 0.095)。補正しないと、Si の 暗い側が「薄い膜」と読まれ(0 nm 付近は R が膜厚の 2 乗でしか下がらないので、数 % の明るさの差が 10〜17 nm に化ける)、 明るい側は 0 nm に張り付いて、2 段に見えた。減光を半径の 2 乗 V = c₀ + c₁ r² として裸の Si の側だけで当てはめ、 視野全体を割る。SiO₂ の側は当てはめに使っていないので、その明るさの傾きが消えるかが独立の検算になる。
- L437 (ja) — ★予言が外れた: 「裸の Si は無彩色(C* < 3)」と置いたら C* 6.6 だった。Si の反射率は 400 nm 0.49 → 800 nm 0.33 と 短波長ほど高いので、裸のウェハは青みの灰色に見える(実物のとおり)。門を所見の側に書き直した。
- L475 (ja) — ★境の直上でも FFT は最大 %.0f nm 外す(窓の DC の裾とフレネルの位相の分)—— 2 倍の厚さで 1 % 以内に入る。
examples/poc_timelapse_growth.py
- L472 — ★把格子相位振 5 种,把偏差(均值)与离散(幅度)分开计数。
- L610 — 2) ★Y 字 —— 沿着穿过合体组中心的行切割体积
examples/poc_traffic_counting.py
- L256 — ★在画面左右被截断的行,其重心会被拉偏。也测量剔除它们的版本。
examples/poc_tree_ring_dendro.py
- L229 — ★斜着读像素图时,边界处的编号会以 k, k+1, k, k+1 抖动(最近邻的阶梯)。少于 5 个样本(1.25 px)的短游程被吸收进前一个值 —— 放任不管的话真值边界会多出 1–2 条,变成「年数吻合方向 18 + 不吻合 13 = 31 > 24」。
- L336 — ★用 threshold=0 全取,台阶高度自己测。measure_pos 的 amplitude(梯度瓣两端之差)在木纹使梯度不再单调时会停在台阶中途,把 0.14 的台阶返回成 0.05(在第 8 节计数)。
- L345 — ★用于换算回 px 的外缘半径取自测量的那一行。若用整个 15° 扇形的中位数,偏心生长会让外缘在扇形内移动 10 px 以上,于是外侧的年轮全部错位(最初就那么写,把年轮 18–35 整段丢掉了)。
- L543 — ★即使在年数弄错的方向,宽度相关性是否仍高 —— 年数与宽度的相关是不同的量
examples/poc_vanishing_detail_and_morphing_area.py
- L73 (ja) — 色。★赤と緑は対にしない
- L623 (ja) — 3. 消える距離は整数(束ね幅を縦に積む。★各行を正規化しない)
- L638 (ja) — ★消える行(f·k が整数)に左端で印を付ける
- L775 (ja) — ★見せる図は決め打ちの制御点で(検査のほうは乱数 4 通りで通してある)
- L851 (ja) — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/poc_vegetation_cover.py
- L320 — 所以这里降到绿、红 2 个波段来求解。★工具的漏洞。
- L543 — ★是否落在对角线上,正是「能否以分数形式作答」本身。二值方法的线会变成阶梯,在混合像素的带上大幅偏离对角线。
- L755 — ★用图展示「只有数字对上了」。第 3 张和第 2 张几乎没有共同像素,却只有白色像素的数量是平衡的。
- L953 — (7) ★PPI 在噪声下崩坏 —— 即使纯像素占 6 成以上也拾取不到叶子。而噪声为零时在同一场景命中 = 断崖的原因不是纯像素不足。
- L993 — (11) ★这个 PoC 发现并在 fullseye 0.1.10 中修复的漏洞。三个 Otsu 对同一输入返回了不同答案 —— 仅把同一图像乘以 4095,判定就偏移了 otsu 13.34 pp / cv_otsu 13.92 pp,只有 sk_otsu 是仿射不变的。原因是
ops._otsu 和 backends._u8 中的 np.clip(v, 0, 1)(0..255 的 float 会使全部像素饱和而变成「全部前景」)。现在三者都不随倍率而变。cv_otsu 残留的 0.5 pp 是因为 OpenCV 内部量子化为 8 bit,这是与 docstring 一致的行为。门是 tests/test_value_range_saturation.py。
- L1007 — (12) ★工具的漏洞:spec_unmix 拒绝 B=3(彩色图像)= 没有求解 RGB 的路径
- L1013 — (12b) ★确实存在只有覆盖率数字对上、而一个像素都没命中的场景。这 1 行就是「不要归约成 1 个数字」最强的依据。
examples/poc_veiling_glare.py
- L229 — ★fullseye 侧的核对:艾里斑 → psf_to_mtf 是否与闭式一致
examples/poc_vessel_network.py
- L263 — ★涨落要在模糊之后加。先加的话 PSF 会把它抹平,阈值边界仍保持干净(最初就那么写,即使把振幅提高到 0.35 也一根毛刺都没出现)。
- L452 — 节 2-3. ★★毛刺从何而来 / 修剪阈值依赖于分辨率 # ————————————————————————— #
- L560 — 节 4. ★★直径的估计 —— 在分叉附近必然过大 # ————————————————————————— #
- L620 — 节 5. ★★Murray 指数 —— 直径的 1 成会变成指数的 1 # ————————————————————————— #
- L751 — 节 6. ★交叉的对照组 / 因分辨率而丢失的枝 # ————————————————————————— #
- L890 — (c) ★skeleton_prune3d 不是「修剪短枝」,而是「把所有枝都缩短」
- L903 — (d) ★fs.skeleton_nodes 的 docstring 说是「坐标」,却只返回端点
examples/poc_video_physics_consistency.py
- L175 (ja) — ★ 縁に触れた bbox の辺は車の縁でなく画像の縁。そのまま使うと位置が 0.36 m ずれて黙って軌跡に入る(2026-10-23 の敵対的レビュー、 発射条件の端 3000 本中 2 本)。label_extent は切り詰めを知らないので、ここで止める。
examples/poc_warehouse_flow.py
- L145 — ★「等人」4 件 x (7.5 + 缓行 2.5) 与「通道干扰」8 件 x (2.5 + 缓行 2.5) 都向零点加上 40.0 秒 —— 是故意凑齐的。未必与现实一致,但「相同数字出自不同原因」可用 1 例展示。
- L160 — 零点的「静止」阈值 [m/s]。★若不放得远高于噪声制造的表观速度(σ√2/Δt = 0.085 m/s @ Δt=0.25 秒),就会把静止的人误判为移动,使零点减少(取 0.15 m/s 时,Δt=0.25 秒下零点减半,得出「拍得越细滞留越少」的假结论)。
- L239 — ★只要有任意 1 台能看到就算可见,所以进入盲区是所有摄像头都被遮挡的高度 = 各摄像头极限的最大值。这里我取成了 min,导致预测偏差 0.5 m。
- L329 — ★排队者的到达时刻要从实际开始作业的时刻来确定(用估算来定就偏差了 20 秒,等待的柱与作业的柱没有重叠)。
- L342 — ★相遇的位置必须在货架列的正旁边。不在货架与货架之间的交叉通道两侧敞开、空余宽度有 1.9 m,不会被归类为「窄通道」(最初的实现让他们在主通道的高度相遇,10 件中有 4 件落入「其他」)。
- L435 — ★做成了合并而非交换(swap)—— 交换不会破坏「在同一根柱中,较晚开始的一方是等待方」这一时间嵌套(只是角色互换,两个角色都被正确填入)。会被破坏的是当两个人看起来像一个人时。
- L594 — ★只保留静止的芯。柱由两人份的足迹构成,有 1.8 m,因此穿行者的中心也会有 2〜3 帧落入柱内(实测中这制造出「只有一个人的干涉」,10 件中落掉了 8 件)。将持续停留在距中位数 :data:
CORE_R 以内的最长连续段作为芯。
- L846 — ★按多人成分来计数会使「通道上有 10 人通过的列」变厚而混杂,所以在同一个人内部比较「等待期间」与「行走期间」。
- L1257 — 标记的大小。★由于在同一货架前会发生「等待补货」与「缺货」,所以从大的标记开始画,把小的标记叠在上面。若以相同大小绘制,后画的会完全遮住先画的,图上 5 件看起来只有 2 件。
examples/poc_water_level.py
- L346 — 2. ★零点 vs 单应性 # ————————————————————————— #
- L389 — 3. ★符号会随锚点(anchor)的位置而改变 # ————————————————————————— #
- L422 — 4. ★波动 —— 稳健(robust)只在存在离群值时才有效 # ————————————————————————— #
- L459 — 5. ★★反射 —— 系统性地偏低 # ————————————————————————— #
- L622 — (d) 卡尺(caliper)是存在的(★正要写「没有」时,翻了 3 层后找到了)
examples/poc_web_roll_periodicity.py
- L123 — ★第 1 nip 与第 2 nip 的周长差故意只有 15.7 mm(为了第 6 节的悬崖)。
- L158 — 只对第 6 节(悬崖)提高试验次数。★在 24 次试验时,报告率在 12000 mm 为 100 %、在 14000 mm 为 88 %,出现了非单调,「检测悬崖」的位置随小样本波动而移动(在 120 次试验时 12000 mm 稳定在 93 %,能保持 100 % 的是 17000 mm 以上)。只有主张悬崖位置的那一节,用地板不晃动的试验次数来测量。
- L253 — ★op 不做取整地返回顶点(超过 ±0.5 就是「那里不是极大」的信息)。由于这个 PoC 也评估梳状的谐波 bin,所以在这里显式取整。
- L802 — ★地板不是 0。在 24 次试验中,最长的 2 个点偶然为 0 %,使得「保持 0 % 的最短 L」这一判定通过了,但在 120 次试验中,即便最长 20000 mm 也残留 2 %。先测量地板,再决定以地板的多少倍称为悬崖(不把 0 % 用于判定)。
- L1057 — ★改为 120 次试验后就不再正好是 100 % 了(97 / 98 %)。24 次试验的「100 %」只是分母小而已。看着地板把它设在 95 %。
examples/poc_weld_bead_profile.py
- L696 (ja) — ★2026-10-13:
op_find("laser") は 0 件でなくなった —— coherent 族 (laser_line_coherent / speckle_field / triangulation_speckle_limit)が引っかかる。 だがあれは光条を描く側と、スペックルが決める誤差の床を返す閉形式で、 画像から列ごとの中心を取る op ではない。穴は残っている(語でなく族で固定する)。
- L700 (ja) — ★2026-10-15: op_find に docstring 全文の段(最低点 12)が加わり、引数の説明に “laser” と書いただけの 無関係な op も並ぶようになった。ここで固定したいのは「名前か 1 行目で laser を名乗る op」なので、その段は除く。
- L705 (ja) — ★2026-09-23:
op_find("stripe") は 0 件でなくなった —— wave 族の wave_fringe_period(「縞模様の画像から周期を測り返す」)が docstring で 引っかかる。だがあれは画像全体の 1 本の支配的な周期を返す op で、 ここで要るのは列ごとの輝線の中心をサブピクセルで取る op。穴は残っている。 語で穴を固定すると、別の意味で同じ語を使う族が来た瞬間に偽陽性になる (この repo で 3 度目: fly_hex_lattice / halftone_moire_period / これ)。
examples/poc_weld_bead_scan_angle.py
- L485 — ★候选是「回到母材面高度的点」,因此沟槽之外平坦的母材也都会成为候选。只有确认在内侧 CHECK_IN mm 处存在焊缝金属(自母材面起有 CHECK_DEV 以上的凹陷)后,才认定为趾 —— 没有这道门,候选就会滑落到母材上,脚长会向外飞出 1.7 mm。
- L489 — ★门的深度要取得比最深的沟槽还深。最初设为 -0.6 mm 时,深度 0.45 mm(垂直方向为 0.74 mm)的沟槽穿过了门,16 个断面中有 1 个偏离了 2.2 mm。
- L572 — ★仅存活断面的真值均值。查看聚合中漏掉了什么。
- L999 — ★只有凸起(余高)偏离了预测。原因是趾部的蔓延(因为 τ 是绝对值阈值)。
- L1193 — ★沟槽随角度逐渐消失的样子(以自母材面的凹陷来看)
examples/poc_what_a_picture_cannot_check.py
- L280 (ja) — ★偏りの正体を探し当ててから書く。平面の推定が 1.88 と 真値 2 より低いのは、最初に疑った「点数が足りない」ではなかった (400 → 3,000 点で 1.8825 → 1.8709 とむしろ下がる)。正体は べき乗則を見る半径の窓で、既定は対距離の 1〜25 パーセンタイル —— 単位正方形ではその上端が箱の端に当たり、相関和が飽和して傾きが審う。 窓を小さい r 側に寄せると 2.05 まで上がる。
- L402 (ja) — ★平行移動フレームの効き目: まっすぐな区間を含む曲線でも半径が崩れない
- L480 (ja) — ★K の一致は必要条件にすぎない
- L630 (ja) — ★図の書き出しが失敗したら、ここで拾う。見ないと「検査は全部 OK・でも図は 1 枚も出ていない」が黙って通る(examplefig は fail-soft で貯める)。
examples/poc_worm_neurites_grow.py
- L111 (ja) — ★dist_to_root には coords に無い節点も入っている(1 匹目で 196 本中 54 本)。 座標のある節点だけに絞らないと最大値が食い違う(最大 12 倍)。
examples/poc_zernike_aberrations.py
- L85 (ja) — n <= 6 の 28 モード。★(n+1)(n+2)/2 = 28 は閉形式で数えられる
- L402 (ja) — 絵を作る道具 —— ★色は飾りでなく量に結びつける # ————————————————————————— #
- L588 (ja) — ★本物の op と突き合わせる —— 同じ仕様の 2 度目の実装。
fit_zernike は torch(grid_sample)で補間するので、CI の py3.10 / py3.12 には入っていない(大きさと時間のため py3.11 だけ)。 だから発見そのものは numpy の写しで立て、op があるときだけ照合する。
- L707 (ja) — ★同じ絵を線形補間で読むとどうなるか(章ごとの接尾辞 lin_)
- L838 (ja) — ★1 次か 2 次かは「収差を半分にしたときの比」で分かる(章ごとの接尾辞)
- L865 (ja) — ★帯は必ず書く。球面収差のハローは明るいので、同じ帯でも段数が変わる (実測: 無収差の 3.5-8.0 λ/D は線形 1 段、球面収差 0.30 波なら 6 段)。
- L1041 (ja) — ★検査で使った点像は瞳 96・格子 1024(1 画素 0.19 λ/D)で、絵としては 粗い。同じ無収差をもう一度、細かい刻みで描き直す(数は検査のもの)。
- L1298 (ja) — ★門 tests/test_poc_scripts_run.py は exit 0 だけでなく PASS の印字も見る。
examples/polarization_camera_pipeline.py
- L110 (ja) — ★雑音つきで回復した行列は coherency の最小固有値が僅かに負に出る(雑音 1e-4 → -1e-4 程度)。tol は雑音の水準で置く。tol を勘で小さくすると「非物理」に化ける。
examples/profile_shape_inspection.py
- L25 — ★由于要 import repo 根目录下的模块(profileops),把 repo 根目录放在最前,使其从 checkout 直接运行也能通过。与其他示例做法相同。没有它,
py -3.11 examples/<name>.py 会以 ModuleNotFoundError 失败(2026-09-09 实测:在没有运行门的 83 个中,失败的只有这种类型的 2 个)。
examples/representation_roundtrip.py
- L175 — (c) 高斯 -> voxel 的质量。★曾经弄错过的数字
examples/shape2d_morph_descriptor_tour.py
- L64 — ★EXTEND: 替换为你自己的轮廓提取结果(
{"shape": (H,W), "cs": [ (N,2) (row,col), ... ]})
examples/shapestat_landmark_tour.py
- L71 — ★EXTEND: 把你自己的地标 (N,3) 放入 s(点的排列须一一对应)
- L123 — ★EXTEND: 把你自己的群 (K,N,3) 放入 scrambled(位置、朝向、大小可以各不相同)
- L221 — ★EXTEND: 把你自己的地标按「先全部左边,再以相同顺序放右边」排列并放入 lm
- L276 — ★EXTEND: 把 surf 设为你自己的曲面点(网格顶点、点云),normals 设为其带朝向的法线
- L299 — ★EXTEND: 替换为你自己的群 (K,N,3)(点的排列须在个体之间一一对应)
examples/voxel_labels_color.py
- L81 — 1) ★颜色的稳定性 —— 这个族存在的理由 # —————————————————————— #
- L152 — 4) ★各向异性 spacing # —————————————————————— #
examples_3d/alpha_shape_topology.py
- L149 — ★判别性断言:alpha shape 保留孔洞 = 几乎不包含轴探针。null 方法(凸包)以包含率 ≈1 在此条件下 FAIL(= 具判别性)。
examples_3d/ct_hand_radiograph.py
- L34 — 实际调用来确认。★直到 2026-09-05,这个示例写着「若 azimuth=elevation=0 则与 np.sum(axis=0) 一致」,却一次也没确认过。而且由于 op → example 的索引把 hasattr 的字符串误认作调用,「一个示例都没有的 op」被隐藏在 100% 覆盖率之中。
examples_3d/geodesic_dome.py
- L6 (ja) — ★この例の要点は絵ではなくオイラーの公式: V − E + F = 2 から、次数 5 の 頂点はどれだけ細分してもちょうど 12 個になる。11 個でも 13 個でも球には ならない。ここでは次数を 別実装の op(conngraph.graph_degree_table)に 数えさせて確かめる —— 自分で数え直して自分と一致しても、何も確かめたことに ならないため。 repo をそのまま clone した状態でも動くように、リポジトリ直下を import パスへ入れる。
- L48 (ja) — ★オイラーの公式の帰結。細分しても 12 から動かない。
examples_3d/geometry_metrology.py
- L186 — ★以数字给出与无限直线版本的差异(同样的 2 条线段)
examples_3d/hull_bounds.py
- L237 — — 面板 C: ★新增 min_enclosing_sphere(贴合)vs 朴素球(过大)—
- L272 — ★(1) 新增 op — min_enclosing_sphere: 已知球上半径复原 + 包含所有点 + 近乎最小 ============================================================
- L296 — ★(2) 新增 op 的 beat-null — 在非对称点云上比朴素球更小、近乎最小、偏安全侧 ============================================================
examples_3d/mesh_props.py
- L404 — ★把绕序翻转,体积的符号就反转 = 符号本身就是朝向的检验
examples_3d/metrics_eval.py
- L234 — ★最近邻距离说谎,是在「变化为零只是重新测了一遍」的时候。把同一斜面以不同密度、不同位置重新采集,最近邻会沿着表面抓住相邻的点,于是产生约为点间距量级的伪变化。M3C2 向法线方向投影,所以那个分量被去掉了。(写这个 PoC 之前的预测「C2C 在法线偏移下也会偏大」是错的 —— 只是把平行面沿法线方向移动的话,最近邻距离也几乎是真值。说谎出现在沿表面重新采集这一侧。)
examples_3d/minimal_surfaces.py
- L6 (ja) — ★この例の要点は絵ではなく定義そのもの: 極小曲面とは「平均曲率 H が至るところ 0」の曲面である。既存の
vertex_curvature がまさにその H を測るので、 「これは極小曲面だ」という主張を、作り方を知らない op が採点する。 対照群として単位球(H = 1)と半径 1 の円柱(H = 0.5)を同じ手続きにかけ、 門が素通しでないことを示す。
- L12 (ja) — ★カテノイドとヘリコイドは等長なのでガウス曲率 K が一致するが、それは 必要条件にすぎない —— K が一致しても極小とは限らないので、門は H に置く。 repo をそのまま clone した状態でも動くように、リポジトリ直下を import パスへ入れる。
- L130 (ja) — ★平行移動フレームの効き目: まっすぐな区間を含む曲線でも半径が崩れない
examples_3d/sdf_csg.py
- L167 — ★陷阱:即使
res 是标量,它也是每个轴的体素数,所以当 bounds 非各向同性时体素就不是立方体(这里 x,y 为 0.125、z 为 0.0625)。用 h**3 计算体积会正好差 2 倍 —— 实际在本例中给出 295.00,相对闭式解 148.03 有 99 % 的误差,下面的 assert 报警了。
examples_3d/space_carving.py
- L117 — ★使用
carve_look_at(2026-09-08)。与 look_at 是相同实现,但能从公开层引用的名字是这个 —— fs.look_at 是 render3d 的 gluLookAt 版本(4x4、−Z 朝前),是另一回事,传入其 M[:3,:3], M[:3,3] 会使所有点落到相机后方,不抛异常地返回空的 hull。
examples_3d/structured_light_scan.py
- L122 — ★ 座标系陷阱:
look_at 以 gluLookAt 约定(相机朝向 -Z,+Y 向上)构建位姿,但 render_mesh 先把该 Vc 改写为 (x, -y, -z) 再乘以 K(= 与 depth_to_points / K 相同的 CV 约定,depth 为 +Z 朝前)。三角测量是在 CV 约定这一侧闭合的,所以位姿也要先施加 FLIP 再合成。跳过这一步,投影器就会朝向相机背后,而 depth 会保持在「看似合理的量级」却全部错误(第一次运行正是如此:RMSE 78 mm = 与零点无法区分)。
eyebrain.py
- L242 (ja) — ★fly_hex_resample と同じ向き: 画面の x = 方位角 az(右が正)、y = 仰角 el(上が正)。uv から組むと 像と眼の絵の左右が食い違う(2026-09-20 に実測: 縞を右へ動かすと柱の u が減った)。
fast.py
- L254 — ★不要发布 uint8 的 gaussian。
cv2.GaussianBlur 的 8U 路径使用 8 bit 定点内核,因此与 float64 core 的差异为 1.174/255(实测,本 module 的 6 张门图 x PARITY_AB 5 点的最大值),不满足「一致到 1/255」。box 为 0.494/255,median / 形态学为 0.000/255,故只发布这些。若需要快速的 uint8 gaussian,请以「到 2/255」的另一契约明确地追加。
- L294 — ★此处列出的全部都是通过了 :func:
parity 门的项。追加时务必遵守「实现 -> 跑门 -> 通过则收录」的顺序。
- L320 — ★不收录
edges_image(作为 HALCON 名与 canny 相同)。registry 中的这个名字是 backends_auto 的 skimage canny(带真正的 hysteresis),与 core 的 canny 是不同的算法。不一致率 1.0(实测)。 – HALCON 名的 twin(在 registry 中以相同实现、别名登记的 op)———- 与 accel._TWIN_ALIASES 同一思路。门是针对 registry 中该名字的实现来跑的,因此实现一旦偏离就会落榜而不被收录。
- L372 — ★不可用「观测到的输出是否为 {0,1}」来判定 – 即便是连续 op,在常数图像上输出也会全为 0,从而被误判为二值、使基准擅自变严(实现过程中踩到过)。判定要用 registry 中声明的 out_sort。
- L403 (ja) — ★twin はどれも歴史的な規約(reflect / 正方形)しか実装していないので、
b が新しい選択肢を選んでいる間は core にそのまま落ちる。 速くはならないが、答えは 1 ビットも変わらない —— median の k>5 と同じ扱い。 ここを黙って無視すると「速いが違う」ができる(実測: parity が 11 件割れた)。
feat_fpfh.py
- L304 — ★2026-09-07:位姿计算是 numpy(FPFH、RANSAC、Kabsch 都是 numpy),torch 仅用于包裹返回值。因此在不装 torch 的 CI(py3.10 / 3.12)上,这个 op 会整体 ImportError,PoC 随之失败。若有 torch 则一如既往返回 Tensor,没有则返回相同数值的 numpy(数值不变)。
feat_shot.py
- L80 (ja) — ★2026-10-11: 平面上の点の λ3 は丸め屑(λ3/λ1 ~ 1e-17)。軸に沿った平面では 厳密に 0 で落ちるが、傾けた平面では屑が正になり「特徴の無い平面」から キーポイントが 203 個出ていた(回転不変の主張が崩れる)。床は λ1 に対する相対量で。
flyvision.py
- L217 (ja) — ★ The cap is on the product, not on either factor, because the accident it prevents is the cross term: a modest 900-ommatidium eye and a modest 512x512 image are each unremarkable and together are 236M float64 = 1.9 GB.
fourierdesc.py
- L296 (ja) — ★この族の既存 op(elliptic_fourier)は Kuhl-Giardina の実係数(a,b,c,d) # で、楕円 1 つ 1 つを表す。こちらは同じ輪郭を複素係数 c_k で見る —— # z(t) = Σ c_k exp(2πikt) と書けるので、各項が「回る腕」そのものになり、 # パーセバルで打ち切り誤差を描く前に予言できる。用途が違うので両方置く。 # ————————————————————————— #
- L396 (ja) — ★偶数点では添字 n/2 が k = +n/2 と k = -n/2 の同じ 1 つの係数である。 両方を並べるとエネルギーを 1 本ぶん多く数えてパーセバルが破れる (実測: n=8 で 1.17e-01、n=512 で 7.5e-03 ずれた)。numpy の
fft.fftfreq に合わせて k = -n/2 の側だけを出す。 最初の検査(正方形の輪郭)はこの係数がたまたま 0 に近くて通っていた —— 探針 1 枚では足りない、の実例。
fscript.py
- L1220 (ja) — ★しきい値は argmax ビンの「上端」(2026-09-26)。(k + 0.5)/256 は そのビンの中点で、argmax が指すのは背景の山を含むビンなので、同じ ビンに居る背景画素が前景へ漏れていた(背景 0.30 / 明部 0.90 の板で 4,096 px 全部が前景、期待 400)。
ops._otsu / accel._otsu / detect._otsu_mask と同じ式を 4 か所に別々に書いてあり、4 つとも 同じ誤りを持っていた —— docs/hardening/otsu-threshold-at-the-bin-midpoint.md。
- L1284 (ja) — ★2026-09-14: ここは
FsTypeError だけを捕まえていた。逆さの区間と未知の feature を契約どおり FsValueError(= FS_E_INVALID_ARG)にした結果、 fscript の利用者には Python の生の例外が漏れるようになっていた —— 例外の種類を増やしたら、それを言語境界で受けている場所を必ず一掃する ([[feedback_same_bug_class_recurs_check_siblings]])。
fslib.py
- L559 (ja) — ★2026-09-14: ここは長らく borderType 既定 =
BORDER_REFLECT_101 (d c b | a b c d — 境界の画素を重複させない折り返し)だった。numpy backend の ndi.gaussian_filter の既定は mode='reflect' = d c b a | a b c d (境界の上で折り返す)で、同じ「reflect」という語が別物を指す。 実測(512x512, sigma=1.0, 乱数): 内部は 4.6e-08 まで一致するのに、端の画素だけ 最大 0.13 = 値域の 13% ずれていた。内部しか見ない検査では原理的に出ない。 connection の 4/8 連結と同じクラスの欠陥(兄弟コードを一掃した 2 件目)。 契約は numpy 側(既存の進化レシピのオラクル)に合わせて BORDER_REFLECT。
- L615 (ja) — ★2026-09-14: ここは長らく
ndi.label(mask) = 4 連結の既定だった。 cv2 backend は connectedComponentsWithStats(..., 8, ...) で 8 連結なので、 同じ op が backend によって違う物体数を返していた —— 8x8 の市松模様で numpy 32 個 / cv2 1 個。レシピの答えが「どちらの backend が選ばれたか」で 変わるという、いちばん静かな壊れ方。C ABI を Rust で 2 度目に実装して 突き合わせたときに見つかった(fullseye_abi.h の fs_connection に 8 連結と明記した)。回帰は tests/test_fslib.py が backend 横断で見る。
- L632 (ja) — ★2026-09-14: ここは
(mask, 8, cv2.CV_32S) と位置引数で書いてあった。 読むと「8 連結を明示している」ように見えるが、cv2 5.0.0 で実測すると connectedComponentsWithStats(a, 4, CV_32S) も (a, 8, CV_32S) も同じ答え を返す —— 位置引数は connectivity として解釈されておらず、既定の 8 に たまたま一致していただけ。既定が変われば黙って 4 連結になる。 コードが主張している意図を API が守っていない形なので、キーワードで固定する。 (差分ファジングの変異解析で 4 連結を注入したのに一切検出されず、掘ったら 注入のほうが効いていなかった、という経路で見つかった。)
- L725 (ja) — ★契約 R-1(fullseye_abi.h): 失敗した演算子は「何も見つからなかった」演算子と 区別できなければならない。逆さの区間は呼び手の間違いであって、「空を寄こせ」 という正当な指定ではない —— 黙って空の Region を返すと、しきい値の計算を 間違えたレシピが「不良ゼロ」として通る。2026-09-14、同じ契約の Rust 実装が FS_E_INVALID_ARG を返すのにこちらは空を返す、という差分で見つかった。
- L780 (ja) — ★契約 R-1:
threshold で直したのと同じ欠陥が兄弟に残っていた。逆さの区間は 呼び手の間違いであって「空を寄こせ」という指定ではない —— 黙って 0 個を返すと、 面積の下限と上限を取り違えたレシピが「該当なし = 良品」として通る。 2026-09-14、Rust 実装が FS_E_INVALID_ARG を返すのにこちらは 0 個を返す差分で発見。
fsruntime.py
- L284 — ★判定 recipe 在每一种 profile(不限于工业)下都只能使用精选的、以 fslib 为后端的 builtin。其他任何调用都是通过
fscript._call_registry_op → api.RT 解析的 650-op 进化注册表 op,其 _safe wrapper 是 fail-OPEN(吞掉 op 失败并返回无害的”无缺陷”值)。这个面绝不能作为 recipe 的算子——studio / 参考运行时也会判定部件——所以使用它的 recipe 在加载时被拒绝(docs/FSCRIPT_DECISION.md 1.6b)。
fullseye/__init__.py
- L468 (ja) — ★2026-10-02: 「名前の無い非公開関数」の棚卸しで、op として振る舞うのに公開経路が 1 本も無かった 18 本。 どれも既存の型つき台帳の約束(台帳 = 実装モジュールの集合)に合わないので、facade(fs.<名前>)から出す。 門は tests/test_hidden_ops_exposed_2026_10_02.py(定理か第 2 実装)。名前>
- L511 (ja) — ★1-D 版は signal_ 接頭辞で出す。素の名前で出すと
fs.local_std(1-D)と fs.ledger.local_std(2-D)が別物を指す —— 既に lowpass がその状態になっており(facade=dsp / ledger=2-D)、 同じ罠を増やさない。次元をまたぐ同名は、呼ぶ側で見分けがつく形にする。
- L741 — ★与声明 out 类型对齐的 adapter,会丢弃返回元组的 op 的第 2 项及以后(
drizzle_resample 的 wht、piv_cross_correlate 的 info)。当被丢弃的一侧需要用到时,从台账入口就够不着。2026-09-06,某超分辨率 PoC 写成 flow, info = fs.ledger.piv_cross_correlate(...),沿第 1 轴拆开 (2,R,C),把 dy 的第 2 行当作 dx 使用,使偏移估计从 0.12 -> 0.74 像素(不抛异常)。用 .raw 可够到原始返回:fs.ledger.piv_cross_correlate.raw(a, b)。
- L1234 (ja) — ★字の検証・修正(glyph_*)。dir() でなく __all__ が一次情報なので ここに載せる —— dir は環境依存で、載せ忘れは全体スイートでしか出ない。
- L1321 (ja) — ★2026-09-20(GenSpark 第 50 報 N175 / N176):
import fullseye; fullseye.os が通っていた —— import に使った 道具(os / sys / warnings と future の annotations)は facade の名前ではない。tab 補完と dir() を汚さない。
fullseye/mcp/catalog.py
- L70 (ja) — ★
dim は docs/ops の族ディレクトリ名(2d / 3d / oned のほか optics / annotate … 31 種)で、厳密な次元ではない —— volume を取る registry op は 2d/3d/ の下にあり dim: 2d。 次元は in / out の sort から読む(2026-09-20、GenSpark 第 31 報 N109。族と次元の分離は 0.2.2)。
- L96 (ja) — ★2026-10-02: 区切り文字を “/” にそろえてから並べる。素の sorted() は Windows の “\“(0x5C)と Linux の “/”(0x2F)で順序が変わり、
segmentation/watershed/ と segmentation/watershed3d/ の 前後が入れ替わって OP_NOTES.json の鍵の順が OS ごとに違った(手元の regen は緑、CI の –check が赤)。
- L103 (ja) — ★frontmatter は閉じ線まで読む(2026-10-02): 先頭 1200 文字で切っていたら、examples: の行が 44 本に伸びた text_box の閉じ線が範囲の外に出て「op の無いノート」に見え、索引の op がノートから引けなくなった。
- L125 (ja) — ★5 層。最初は 4 層で組み、「索引にもレジストリにも facade にも無いノート」が 480 枚残った。残骸かと思ったら 480 / 480 が
fullseye.ledger で解決した (型付き台帳。レジストリでは tb_project、台帳では project のように接頭辞が 違う)。「無い」と言う前に全層を引く —— 4 層目まで引いて止めていたら、実在する 480 個の機能を残骸と呼んでいた。
- L311 (ja) — ★2026-09-20(GenSpark 第 41 報 N141): 「callable なら op」でクラス 41 個(Image / Pipeline / MissingBackendError / TcpChannel …)が facade 層に op として混ざり、
fullseye_search_ops の検索面を汚していた。クラスとモジュールは型・器であって op ではない。関数(生 / builtin / functools.partial)だけを op として数える。同じ報の「facade 表に無い 474 件」は halcon_facade_map.json(HALCON 対応表、鍵は camera.xxx の名前空間つき)との比較で、 残る 460 件は import fullseye で呼べる実関数 —— 表の目的が違うので設計のまま。
- L361 (ja) — ★同点の割り方は
api.find_op と同じにする: 別名を複数 op が共有するとき name == halcon の正典を先に。次に層が多い(実行もノートもある)方。 実測 2026-09-15: “gauss” で gauss_filter(正典)と gaussian が同点になり、 名前順だと _ < i で前者が先に来た —— 偶然そうなっていたのを規則にした。
fullseye/mcp/diagnose.py
- L87 (ja) — ★順序が答えを変える(2026-09-15 実測):
ones + inf は有限部の std が 0 なので 「定数」が先に当たり、0..715 の配列は 99.9 % が ≥ 1 なので「飽和」が先に当たった。 より根本的な異常を先に言う: 非有限 → 定数 → 範囲外 → 飽和 → 平坦。
- L109 (ja) — ★飽和・平坦は image / color だけ。region は 0/1 が契約なので「飽和」ではない —— リファクタで region を含めてしまい、
--demo で otsu の出力が「飽和」と判定されて 小図が昇格した(2026-09-15 実測)。region の定数(空 / 全面)は上で拾う。
fullseye/mcp/handles.py
- L51 (ja) — ★thumb_dir を渡されたときに作っていなかった(mkdtemp のときだけ存在する)。 小図の保存が FileNotFoundError で落ち、テスト 4 件で発覚(2026-09-15)。
- L156 (ja) — ★2026-10-11: 根の中の壊れた png・object 配列の npy は ValueError 等を HandleError に 写さず投げ、dispatch を抜けてサーバのループが死んでいた。読めない中身は理由つきで断る (-32602)。npy は pickle を決して許さない。
fullseye/mcp/server.py
- L508 (ja) — ★2026-10-11: Content-Length が無い / 0 のフレームで None(= EOF)を返し、サーバが 黙って終了していた。EOF は「ヘッダを 1 行も読めない」ときだけで、壊れたフレームは FramingError(→ -32700)にしてループを続ける。
- L1357 (ja) — ★bbox が無いときは glyphops.make_spec に任せる。版面が取れなければ items に bbox が 入らない = 黙って外れた箱で直すことは起きない。ここでは理由を付けて断る。
- L1630 (ja) — ★2026-10-11: find_ops は「既知の種別以外は拒否する」と書きながら typo を受け、 0 件を返していた。search_ops と同じ門を通す。
- L1777 (ja) — ★2026-10-11: params が配列 / 文字列、name が配列 / dict のとき、.get や辞書引きの AttributeError / TypeError が run_stdio_server のループまで抜け、サーバが死んでいた (後続の正しい要求にも返事が無い)。型は境界で検査して -32602、残りは最後の網で -32603。
- L1824 (ja) — ★2026-09-20(GenSpark 第 38 報 N135): 「2390 names」が op 数と読まれた —— 数えているのは op 名 + HALCON 別名。
fullseye/xlsxio.py
- L46 (ja) — ★ float64 に直してから [0,1] に clip すると uint8 の 0..255 が 0/1 の 2 値に潰れた
- L51 (ja) — ★ 切り捨ての int() だと 1000 px が step 3 で 334 px になり longest を守らない
- L68 (ja) — dict の表は key / value の 2 列(mdio と同じ)。★ list(dict) はキー文字列の 列になり、1 文字ずつのセルに綴られていた
fullseye_comm.py
- L393 (ja) — ★CRC は公表された検査値で裏を取る。CRC-16/MODBUS の諸元は
width=16 poly=0x8005 init=0xffff refin=true refout=true xorout=0x0000 check=0x4b37(CRC catalogue)—— check は ASCII "123456789" の CRC である。 自分で作った入力の往復だけで試すと、反射入力と反射出力を同時に取り違えた実装が 緑になる(自分で包んで自分で開けるので、向きの誤りが打ち消し合う)。 外の値と突き合わせて初めて、線の向こうの装置と話が通じることが言える。
- L641 (ja) — ★表は 1 つに畳む —— 同じ PDU 処理を RTU の装置役 (:class:
ModbusRtuLoopback)でも使う。2 つ書くと、FC を足した ときに片方だけ増える。
- L751 (ja) — ★
modbus-rtu は 2026-09-25 まで「名簿に載るだけ」の行で、開こうとすると 「pymodbus を入れて直接使え」と断っていた。だが RTU は Modbus TCP と同じ PDU を別の框で包んだものにすぎず、その PDU の組み立てと解釈は既にここに在って 単体試験も付いていた。足りなかったのは框(アドレス + CRC)と線の口だけで、 断り続ける理由は無かった —— 名簿は「持っていないもの」だけでなく、 「持っているのに繋いでいないもの」も隠す。
- L764 (ja) — ★断り文句が「install ‘None’」と言っていた。
cclink は pure-python の master が存在しないので pip 名も import 名も持たない —— そこを場合分けせずに 書式へ流し込んだ結果、open_channel("cclink") は 「install ‘None’ and use the None client directly」と答えていた。 入っていないものを名指しする口は、名指しできない相手で必ず崩れる。 2026-09-25、device.open_driver を足すときに同じ分岐を書いて気づいた(隣の 層を直したら、元の層を読み返すこと)。
- L771 (ja) — ★もう 1 つ: 相手が入っているときに「install しろ」と言っていた。入って いるのに入れろと言う案内は、読んだ人をそこで止める。
- L817 (ja) — ★同梱の顔ぶれをここで凍らせる(名簿を全部登録し終えた後)。これより前に 呼ぶと空を覚えてしまい、
unregister が同梱の protocol を消せてしまう。
g1_policy_bridge.py
- L33 — ★不要把本地绝对路径烧进发布物(2026-09-05 的审计中,非公开的兄弟项目名出现在了 PyPI 的 wheel 里)。默认值通过环境变量给出。Unitree G1 的场景 XML。指向 MuJoCo Menagerie 的
unitree_g1/scene.xml。
- L61 — ★安全边界。
pickle 在 load 期间可调用任意 callable,因此若让 find_class 直接放行,则仅仅打开检查点就会执行代码。RL 的检查点是以从他人处获取为前提的产物,所以这是现实的威胁。(2026-09-05 实测:放行版会直接返回 os.system / subprocess.Popen / builtins.eval,并能在 load() 期间实际创建文件。)此处列出的仅是 brax PPO 检查点实际引用的数值类。出现缺失时加入本列表(异常消息会打出模块名)。
gicp.py
- L178 (ja) — ★2026-10-07 レビュー修正: 小角線形化 R ← (I+[ω]×)R は原点まわりの回転なので、原点から 遠い点群(オフセット 1e3 で回転誤差 20°)では回転と並進がほぼ縮退して誤った姿勢に落ちた。 target の外接箱の中心 c へ両点群を寄せて解き、t = t’ + c − R·c で世界へ戻す (外接箱の中心は点の順に依らない = reproducible=True のビット一致を保つ)。
glassmirror.py
- L44 (ja) — ★2026-10-15 から既定ではない(
source="table" で選んだときだけ使う)。実測の表との色差は 法線入射で Cu ΔE*ab 8.3 / Au 6.6 / Ag 2.7 / Cr 0.6 / Al 0.2 —— 銀は青が 0.91 に落ちて黄ばんで いた(実測では 0.98 でほぼ中性)。以前の図を同じ値で再現したいときのために残す。 それでも「銀はほぼ中性で最も明るい / 金と銅は 500 nm 付近で立ち上がる赤黄色 / アルミはやや暗いが平坦」という色の順序は正しく出る(テストで固定)。
- L324 (ja) — 多重反射の和は偏光ごとに取ってから平均する。★ 以前は Rs と Rp を先に平均して 1 本の R で和を取っていたので、斜め入射で透過率を過小評価した(air→1.5、 60° で 0.836 対 正しい 0.848)。垂直入射では Rs = Rp なので値は変わらない。
glyphops.py
- L44 (ja) — ★2026-09-18: ここまで all に無かった(api 側は名前で import していたので 気づけなかった)。一次情報は all なので、公開するものは全部書く。
- L308 (ja) — ★リングの内径は字のにじみの外に置く。にじみ(アンチエイリアスやぼけ)の 中を背景として数えると、地色と文字色の中間が混ざって多峰に見える —— 実測で、ぼけ σ=1.2 の合成看板が背景の集中度 0.52〜0.60 になり、 平坦な単色の地なのに「置換できない」と断った。内径は呼び出し側が
edge_transition_width から決められる。
- L324 (ja) — ★「同じ量子化ビンに入った割合」で集中度を測ってはいけない —— 実写では 最頻色がビンの境目にまたがって割合が半分になり、平坦な看板の地色まで 多峰と判定した(実測で前景の占有率 0.31〜0.64、閾値 0.5 では全滅)。 最頻色からの距離が許容幅に入る割合で測る。同じ実写で 0.87〜1.00、 合成した赤い縁取りでは 0.63 と、はっきり分かれる。
- L342 (ja) — ★縁取りは最頻色の占有率では捕まらない —— 縁が太ければ字のすぐ外は「縁の色一色」で 立派に単峰になる(実測で赤い縁取りを単峰と 判定した)。近いリングと遠いリングの色が 違うかで見る。違えば背景は 1 色では書けない。
- L456 (ja) — ★消す範囲もにじみの幅から決める。2 値マスクは字の芯しか覆わないので、 固定の 1 画素だけ広げて塗ると、旧字の灰色の縁が幽霊として残る (実測: 置換した字の周りに旧字の輪郭がうっすら見えた)。
- L462 (ja) — ★平均色で塗るだけでは継ぎ目が見える。地にはノイズと量子化のざらつきが あり、塗った面だけが滑らかだと矩形が浮く(実測: 置換した字の周りに はっきりした四角が出た)。地のばらつきも測って合わせる。
- L475 (ja) — ★触る必要のある画素だけに限る。塗った面の外は入力のまま残す —— でないと、消去した矩形の縁が地のざらつきと食い違って四角い継ぎ目が 見える(実測: 置換した字の周りにはっきりした枠が出た)。 境目は少しぼかして、切り替わりを見えなくする。
- L501 (ja) — ★極性は多数決で決めてはいけない。行に密着した帯では字が 57 % を占める ことがあり(実測 2026-09-17、合成の掲示の 1 行目)、「インクは少数派」と すると白黒が丸ごと反転して距離が 0.025 -> 0.121 に跳ねた。 外周は背景という事実で決める —— 字は縁まで届かない。
- L836 (ja) — ★大きさは行で 1 つに揃える。マスごとに元の字のインク幅へ合わせると、壊れた字の 広い/狭いをそのまま引き継いで字の大きさがばらつく(2026-09-18、縦書きの試作で ユーザー指摘)。CJK は正方なので、一辺 = min(行のインク高さ, マス幅の中央値)。
- L1031 (ja) — ★マスを少し広げて切り出し、その中で「このマスに属する成分」だけを マスクにする。マスちょうどで切ると、外周リングが隣の字のインクを 拾って「色が多峰」と誤判定し、直せるものまで断ってしまう (実測 2026-09-17: 壊れた 4 字のうち 3 字がこれで断られた)。 また隣の字のはみ出しが消し残り、置換後に旧字の切れ端が浮く。
- L1036 (ja) — ★上下左右に余白を付けて切り出し、その中で「このマスに属する成分」だけを マスクにする。bbox ちょうどで切ると、背景色を測る外周リングが 隣の字のインクと字の縁を拾い、「色が多峰」と誤判定して 直せるものまで断る(実測 2026-09-17: 壊れた 4 字のうち 3 字が これで断られ、背景色の占有率が 0.49〜0.57 に落ちていた)。 余白は画像そのものから取る —— 行の bbox は字に密着しているので、 bbox の中だけでは純粋な背景が手に入らない。
- L1101 (ja) — ★色が多峰(縁取り・影)で断ったマスがあると、インクのマスクに縁まで入って距離が 膨らむ(実測: 5 px の縁取りで無事な 4 字が全部「床の 2.5 倍」に出て unrelated に 化けた)。測れていない距離で誤字/別物を言わない。
- L1148 (ja) — ★2026-09-18: ここを「大津 + 外周で極性」に替えて退行した(既存 12 枚で 見逃し 0 -> 6、誤検出 4/14 -> 9/22)。出荷済み
_ink_mask と同じ規則でも、 1 マスに当てるのと画像全体に当てるのでは別物 —— 全体の大津は壁や板の 明暗で閾値が動き、字の縁を取り込む。固定の暗さ閾値に戻す。白字の看板は この経路では取れない(既知の穴として記録)。
- L1164 (ja) — ★枠 = 中身が薄く、大きく、他の成分(字)の外接箱よりずっと大きい成分。3 つ目の 条件は 2026-09-18 に足した: 無いと、小さな画像(280x432)で 96 px の「中」(外接箱 9216 px > 画像の 2 %、中身 0.3)が枠と見なされ、行が丸ごと消えた。PoC を育てた 1,000 px 級の画像では字が 2 % を超えないので見えなかった尺度依存。「画像の半分以上に 渡る」で切ると生成ポスター 10 枚で誤検出 5/8 → 7/8 に退行した(半分に届かない枠の 切れ端が残る)ので、字の大きさ(成分の外接箱の中央値)を物差しにする。
- L1180 (ja) — 行は水平投影の帯で取る。★成分をまとめる方法は使えない —— 漢字は部品に 分かれて出る(
電 は 3 つ)ので、重なりや中心距離で束ねると行間の狭い 看板で 2 行が 1 行に融け、逆に離れた部品が 3 行目になった(実測 6/12 枚)。
graphinv.py
- L793 (ja) — ★2026-10-07: kmax = 0 の個体(辺 0 本など)は「0-core = 全員」を最内殻にして全ノードを数えていた (三角形 2 個体 + 空 1 個体で appearances [3,3,3,1,1])。殻が無い個体は誰も含まない。
halcon_coverage.py
- L93 (ja) — ★2026-10-06: 正本は同梱の fullseye/data/(c5268029e で移した)。旧来の data/ だけを見ていたため、 facade の 600 本が黙って数えから落ち、HALCON 対応が 982 → 388 と出ていた(例外も警告も無し)。
honest_summary.py
- L34 (ja) — ★wheel には data/halcon_operators.json を同梱しない(MVTec のリファレンスの説明文を含むため。 名前だけは halcon_names_data として出荷している)。
fullseye coverage が FileNotFoundError で落ちていた (GenSpark 第 6 報 N5)ので、無いなら何が要るかと数字の在処を言って終える。
- L68 — ★把未通过功能门的 auto op 从招牌数字中排除——此前它们只是被 [warn] 打印却仍被计入,用门所拒绝的 op 虚增了”已过功能门”的 parity 数。
- L87 — ★2026-09-08:这一行原本写着 – “= %d evolvable registry ops + %d n-ary capability ops (disjoint).” 实测为 979 + 17 = 979,即 n-ary 的 17 个是
reg_counted 的子集(nary_names - reg_counted 为空)。标题的 979 是正确的,但唯独这条明细行看起来像「加法」,读者一加就成了 996。数字虽对,但形式上说明在撒谎,故已修正。明细能否作为和成立,由 tests/test_honest_summary_arithmetic.py 每次检查。
illusion.py
- L290 (ja) — ★周りの円は互いに重ならないように置く。n 個を半径 rs の環に並べるとき、 隣どうしの中心間距離は 2rssin(pi/n) なので rs > rr / sin(pi/n) が要る。 最初これを守らずに (rs=62, rr=46, n=6) と置いたら、周りの円が融合して 花のような 1 つの塊になった —— エビングハウス錯視になっていない。
imgevolve.py
- L48 (ja) — ★module / requires(2026-09-19): 「unknown operator」が backend 不足を隠していた (外部レビュー #1)。索引が出自と optional 依存を持てば、core 環境の
api._resolve が同梱の複製(fullseye/data/OP_INDEX.json)から不足 extra を 案内できる。requires は AST で静的に読むので、生成環境に依らず同じ値。
- L57 — ★不要吞掉它(2026-09-06 的对抗性评审)。
imgops_nary 是只需 numpy 和 scipy 的一级 module,因此 import 失败意味着「损坏的 checkout」,而非「该环境没有的功能」。以前是 except Exception: pass,又因为这个函数同时兼任生成器和检查器,CI 可以在保持绿色的情况下发布一个整整消失了 17 个 op 的索引。
- L81 (ja) — ★2026-10-24: IMREAD_COLOR / IMREAD_GRAYSCALE alone demote a 16-bit file to 8 bits (cv2 drops the low byte) and the result was then divided by 255. IMREAD_ANYDEPTH keeps the samples; scaling follows the decoded dtype.
- L158 (ja) — ★2026-09-20(GenSpark 第 37 報 N131): 台帳 op(
color_lut)と汎用アルゴリズム(quicksort)は索引に 載っているのに has が「unknown」と答えていた —— 発見面(索引)と判定面(registry + nary)が別だった。 索引(同梱複製)の台帳行と algo 層をここで引く。
- L356 (ja) — ★os.path.basename は実行 OS の区切りしか知らない —— Linux では
C:\\...\\fullseye.exe が丸ごと 1 要素になり 「fullseye で始まらない」と判定された(手元 Windows 緑・CI Linux 赤)。両方の区切りで最後の要素を取る。
- L363 (ja) — ★parity.main() は自分で sys.argv を読む —— サブコマンド名 “parity” が残っていると 「unrecognized arguments: parity」で落ちていた(GenSpark 第 6 報 N6)。accel / bench と同じく argv を差し替える。
- L401 (ja) — ★2026-10-18(外部レビュー 0.6.0 N228 の再現で見つけた): color 層は OpenCV が要る(extra
opencv)。 素の pip install fullseye では空が正しいのに、ここが無条件に assert していたので fullseye index が AssertionError で落ちていた。黙って空になるのを止めたいのは OpenCV が在るときだけ。
- L463 (ja) — ★2026-10-18(外部レビュー 0.6.0 N228): checkout の判定が「HERE に docs/ が在るか」だけだった。wheel の HERE は site-packages そのものなので、別のパッケージが site-packages/docs/ を置いていると、そこへ OP_INDEX.json を書きに行く(読み取り専用の環境では落ちる)。checkout にしか無い正本の組で判定する。
- L546 (ja) — ★2026-09-20(GenSpark 第 53 報 N187、再現): –seq 無しは空列を「ソートして」[] を印字し rc 0 だった。
- L655 (ja) — ★help の実行例(2026-09-19、GenSpark 第 6 報 N9 / K2): 配布物では console_script
fullseye が入口で、 py -3.11 imgevolve.py は checkout 専用の綴り。呼ばれ方に合わせて例文を書き換える。
- L665 (ja) — ★2026-10-18(外部レビュー 0.6.0 N217):
fullseye algo list に倣って fullseye ops list と打つと rc=2(unrecognized arguments)だった。list は既定の動作と同じなので、語として受けて同じものを出す。
imgforensics.py
- L192 (ja) — ★ complex は ComplexWarning だけで虚部を捨て、実部のハッシュを返していた。 文字列・object も同じく受け取らない
- L706 (ja) — ★2026-10-18: 受けるのは 2-D の uint8 だけ。float の [0,1] を渡しても古い Pillow は mode=”L” で生のバイト列を 読み替えて黙って通し(画素値は意味の無い数になる)、Pillow 13 で初めて “Invalid mode for data type” で落ちた。 試験 1 本がこの経路で無意味な入力を 1 か月使っていた。型を確かめてから渡す(mode は dtype から決まる)。
imgio.py
- L99 — ★判定有两个(2026-09-08,当天内已修正)。最初只用「CIE L* 的折返为 0 次」来选,但
poc_colormap_readability 实测到 cividis 折返 0 次却立起了色差的脊。即便明度单调,若色差步进不均匀,平滑的场中也会看见不存在的分界 – 它以片面的基准自称「安全」。实测(512 级,相邻色差的 max / median,以及超过中位数 1.6 倍的局部最大的个数): ========== ========== ============== ========== 映射 / L* 折返 / dE max/median / 脊的条数 ========== ========== ============== ========== gray 0 1.33 0 viridis 0 1.38 0 plasma 0 1.38 0 magma 0 1.48 0 inferno 0 1.50 0 cividis 0 2.23 1 turbo 1 1.78 1 ========== ========== ============== ========== 剔除 cividis 是因为本 repo 的近似 LUT 过粗,而非公开的 cividis 本身的问题(其 6 个控制点在逐次映射中最少)。为希望顾及色觉特性来选择的人,准备了 :data:CVD_SAFE。tests/test_pseudocolour_family.py 每次都测量两个基准。
- L124 — 据称即便有色觉特性(P/D 型)也能读出顺序的映射。★
cividis 的近似 LUT 只有 6 个控制点,色差步进过粗,不满足 :data:PERCEPTUAL_SAFE 的基准(实测 dE max/median 2.23)。增加控制点即可同时进入两者 – 由于手抄一手资料的数值有笔误的前科,故在能核实出处前暂缓。
- L712 (ja) — ★2026-10-18(外部レビュー 0.6.0 N209): 順は save(path, arr)。逆に呼ぶと「path must be … got ndarray」で 止まってはいたが、逆順だとは言わなかった。配列が path に、文字列が arr に来たら、それを言う。
-
| L721 (ja) — ★2026-09-20(GenSpark 第 34 報 N120): PFM は float 専用の形式なのに、既定の 8 bit 経路が 0..255 の 値を float32 として書き、読むと 0..1 に clip されて別画像になっていた(往復 max |
Δ |
0.98)。 PFM の既定は float(無損失)。 |
- L915 (ja) — ★2026-09-20(GenSpark 第 18 報 N78): 無い・ディレクトリ・読めない、が全部同じ文だった。
imgmetrics.py
- L151 (ja) — ★2026-09-20(GenSpark 第 23 報 N92): 配列なしで呼ぶと空集合の pop(KeyError)/ 0-d の float() (TypeError)という内部の文が出ていた。
- L163 (ja) — ★2026-10-11: 符号付きの幅を最大値(int16 = 32767)にしていて、skimage の peak_signal_noise_ratio(data_range = iinfo.max - iinfo.min = 65535)と 6.02 dB ずれた。 幅は dtype が取りうる全範囲。符号なしは max - 0 で従来と同じ。
matappear.py
- L167 — ★传入 0 维(标量)时,
r.shape[-1] 会抛出裸的 IndexError(在 2026-09-04 的对抗性审计中被揪出)。分光反射率至少带有波长轴 – 标量不是「每个波长的值」,因此在守卫处明确拒绝。
- L273 (ja) — ★ 範囲外は黙って clip せず拒否する(cos=5 が垂直入射、cos=-0.5 が全反射に化けていた)。 丸めの屑(1 + 1e-15 など)だけは許す。
- L349 — ★真实光栅会向两侧衍射(若沟槽对称,+/-m 的效率几乎相同)。此处若不把 +/- 两侧都放进去,则视光源与视线的位置关系,解可能全为负,「只保留正 lambda」的滤波器就会全部丢弃而漆黑一片。实测:与沟槽正交照射的 CD(delta-sin = -0.55),m=+1,+2 在 lambda<0 处全部消失,m=-2 的 440 nm 才是正解。
match3d.py
- L344 — ★2026-09-07:改用 numpy 的 FFT。式子相同(float32 的 fftn -> 仅相位 -> ifftn 的实部 -> argmax),没有任何地方需要用 torch。在不装 torch 的 CI(py3.10 / 3.12)上,这个 op 会变成 ImportError,PoC 随之失败。
-
| L1048 (ja) — ★2026-10-07 レビュー修正: 境界 voxel は占有側の 1 層なので、iso 面より平均 |
n |
₁/2 voxel 内側(勾配 n の向き = 高い値の側)にある(軸平行で 0.5、斜めで最大 0.87)。d が系統的に その分ずれていた。各 voxel を − |
n |
₁/2·n だけ iso 面側へ戻してから投票する。 実測(40³、真の法線、半 voxel ずらし 10 通り×表裏): 軸平行の平均誤差 ±0.5 → 0.000、 斜め面は投影の離散化で ±0.3 以内が残る。 |
-
| L1110 (ja) — ★2026-10-07 レビュー修正: 境界 voxel は占有側の 1 層で、iso 面より平均 |
n |
₁/2 voxel 内側(勾配 n の向き)にある。半径が明球で −0.6、暗球で +0.6 voxel 系統的にずれていた。 各 voxel を − |
n |
₁/2·n だけ iso 面へ戻してから投票する(明球・暗球どちらでも同じ式)。 実測(48³、半径 7〜13、中心を半 voxel 内で乱した球): 平均誤差 明球 −0.64 → +0.17 / 暗球 +0.57 → −0.15 voxel (残りは丸め投票と放物線補間の偏り)。 |
- L1794 — ★2026-09-07:把主体改写为 numpy。这个 ICP 是最近邻搜索用 cKDTree、位姿更新用 3x3 的 SVD,没有一件事需要 torch,却把 torch 设为必需。在不装 torch 的 CI(py3.10 / 3.12)上,4 个 PoC 以
ImportError: this operator needs the optional 'torch' backend 落败而暴露(本地有 torch 所以没能察觉 – 「门要立在事故发生的地方」的实例)。数值是相同的 float64 式,因此结果不因环境而变。返回类型为兼容而保留:有 torch 则 torch.Tensor,没有则 numpy.ndarray(数值相同)。若请求 “cpu” 以外的 device 则 fail-closed。
- L2029 — ★2026-09-07:把主体改写为 numpy。最近邻搜索、6x6 的正规方程、Rodrigues 都是 CPU 上的小型线性代数,本无需 torch,却被设为必需。在不装 torch 的 CI(py3.10 / 3.12)上,PoC 以 ImportError 落败而暴露。式子是相同的 float64,故结果不变(实测与 torch 版之差在 R/t 上为 0、RMSE 上为 0)。
- L2044 (ja) — ★2026-10-07 レビュー修正: 小角線形化 R ≈ I+[ω]× は「原点まわり」の回転。原点から遠い 点群(UTM 座標など、オフセット 1e3 で回転誤差 23°)ではてこの腕 p が巨大になり、 回転と並進の自由度がほぼ縮退して Gauss-Newton が誤った姿勢へ収束していた。 dst の外接箱の中心 c へ両点群を寄せてから解き、最後に t = t’ + c − R·c で戻す。 外接箱の中心は点の順に依らない(reproducible=True のビット一致を保つ)。
-
| L2915 (ja) — ★2026-10-07 レビュー修正: 未中心化の |
p |
² は原点から遠い点群(オフセット 1e6)で桁落ちし 半径が 7.5e5 も狂った。重心へ寄せて解き、中心を戻す(数学的には同じ解)。 |
- L3069 — ★2026-09-07:若环在图像之外则 fail-closed。
r_in/r_out 以像素为单位,故若按 mm 传入,会读到视野之外,并无异常地返回全部 0(在 poc_pipe_wall_loss 输出一张漆黑的图后暴露)。若没有一个半径小于从中心到图像四角的最大距离,则返回值只可能为空。
- L3080 — ★2026-09-07:把 grid_sample(bilinear, align_corners=True, zeros padding)替换为 scipy 的 map_coordinates(order=1, mode=”constant”, cval=0) – 同样的双线性插值,在不装 torch 的 CI(py3.10 / 3.12)上也能跑。实测差异最大为 6.0e-06(值域 0..1 的随机图像;float32 与 float64 的舍入之差)。
- L3129 — ★2026-09-07:出于与 polar_unwrap 相同的理由,替换为 map_coordinates(双线性、范围外 0)。无 torch 也能跑。实测差异最大为 7.6e-06。
- L3260 (ja) — ★2026-10-07: 瞳の中心・半径を外から渡せるように(既定は従来どおり)。
- L3474 — ★2026-09-07:把 affine_grid + grid_sample(align_corners=False, zeros padding)替换为 numpy 的坐标计算 + scipy 的 map_coordinates(order=1)。torch 仅用于双线性重采样,在不装 torch 的环境(CI 的 py3.10 / 3.12)中这个 op 会变成 ImportError。约定原样照抄:输出体素 (d,h,w) 的归一化坐标为 ((i+0.5)/N)2-1,旋转后用 (g+1)/2N-0.5 换回输入的像素坐标(align_corners=False 的定义)。grid 的最末轴为 (x, y, z) = (W, H, D) 的顺序。与 torch 版的实测差异最大为 7.6e-06。
materials.py
- L977 (ja) — ★X 線の列の op 4 本の台帳は
opstomography の spectral_xray(dualxray と同じ族)。materials.__all__ は opsoptics の matprop 台帳と 1 対 1(tests/test_materials.py)なので、ここには足さない —— 足すと matprop の登録と食い違い、統合で他の作業(電子線の列)と同じ行を取り合う。
- L1146 (ja) — ★引き先は「NIST の化合物の表の名前」か「化学式」だけ。化学式を名前として引き直すと、化学式と 同じ名前のレコード(BI4GE3O12、CDWO4)が自分自身に戻って無限に再帰する(2026-10-23 に実際に踏んだ)。
mathestimation.py
- L90 (ja) — ★床(eps)は q がちょうど 0 の所だけに掛ける。最初は q 全体を np.maximum(q, eps) で床上げしていて、 1e-49 のような小さな q が 1e-12 に持ち上がり p より大きくなって、KL(p‖p) が −3e-10(負!)になった (KL ≥ 0 の門で 2026-10-03 に捕まえた)。
- L256 (ja) — ★2026-10-07: ±inf は欠測(NaN)と区別する。以前は黙って欠測扱いで更新を飛ばしていた。
- L365 (ja) — ★2026-10-07: acos は π の近くで桁落ち(π−1.5e-6 で ω の誤差 4e-4 rad)→ 角は atan2(sinθ, cosθ)、 π の近くの軸は対称部 (R+Rᵀ)/2 = cosθ I + (1−cosθ) a aᵀ の最大対角の列から、符号は歪対称部から取る。
mathgeometry.py
- L228 (ja) — ★最初は発散を np.gradient(中心差分)で取り、Poisson を 5 点 Laplacian で解いていた —— 2 つが互いの随伴でなく、 縁で発散の総和も釣り合わず、隅で距離が真値の 0.52 倍に縮んだ(2026-10-03)。同じ G から両方を作ると Poisson は「勾配が X に最も近い φ」の最小二乗そのものになり、縁(断熱)でも無矛盾になる。
- L251 (ja) — ★熱の段は直接法で解く: u は距離とともに e^{−r/h} で 1e-30 まで落ち、遠くの勾配の「向き」はその極小値の 相対精度に乗っている。CG は絶対誤差 ~1e-12 で止まり、極小値を塗りつぶして遠くの向きを壊した (3-D で誤差 0.045 → 0.279、2026-10-03)。定数のずれが無害な Poisson の段だけ CG にする。
- L307 (ja) — ★2026-10-07: 面に使われない頂点が 1 個あると M と L にその行が 0 で入り、熱の段が特異 → 全頂点 NaN (513 頂点で例外なし)。始点と繋がらない成分は φ が任意の定数(実測 0.755)で有限に見えた。 始点を含む連結成分だけで解き、残り(未使用・非連結)は inf にする(geodesic_heat_grid と同じ約束)。
- L356 (ja) — ★2026-10-07: 始点が別々の成分にあると φ の定数は成分ごとに任意 → 成分ごとに始点で 0 に合わせる
mathnumerics.py
- L258 (ja) — ★2026-10-07: 重みを差の直接の積で作ると、Chebyshev 1200 点や区間 [0, 1e-4] で 積が 0 / inf に飛び全点 NaN になっていた。重みは共通の定数倍を除いて決まるので、 対数で和を取り最大で正規化してから exp する(符号は別に数える)。
- L425 (ja) — ★2026-10-11(台帳契約の門): 係数表でない table({pre, post} など)を渡すと生の KeyError: ‘coeffs’ が漏れていた。何が足りないかを名指しして拒否する(fail-closed)。
- L441 (ja) — ★2026-10-07: list も格子扱いしていたので、d 点 x d 次元の点列 [[x, y], [x, y]] が ndarray なら点ごと、list なら外積格子と、同じ数値で答えが変わっていた。格子は tuple のみ (文書の呼び方
(gx, gy) は tuple)、list は ndarray と同じく点 (M, d) として読む。
mathops.py
- L114 (ja) — 定理が門になる図(2026-09-23)。★
MATHOPS(台帳が読む一覧)と __all__ (import * の公開面)は別物で、両方に書かないと片方だけ通る。
- L1734 (ja) — ★既存の cplx_* は閉曲線を点列で持つ層(積分・巻き数・ローラン・等角写像)。# ここで足すのは領域の層 —— 値の場・位相彩色・ニュートンの吸引域・ # 脱出時間・翼まわりのポテンシャル流。新しい語は 1 つも作らない # (cimage / rgbimage / labels2d / mask / roots / signal はすべて既存)。 # 真値は「使った式」ではなく、偏角の原理・Cayley の定理・主カージオイドの # 閉形式内部判定・c=0 のジュリア集合(単位円板)・そして既存 op である # cplx_winding_number / cplx_cr_residual / cplx_joukowski / poly_roots。 # ————————————————————————— #
- L2206 (ja) — ★もう一方の臨界点 -b は円の内側になければならない。外に出ると dz/dzeta = 0 が流れの領域に現れ、そこで速度が発散する(翼でなく尖りが 2 つある図形になる)。
-
| L2319 (ja) — ★どれも「きれいな図」だが、採ったのはきれいだからではなく、 正しさを定理が言えるからである。数学の図はきれいなので、合って いるかを誰も確かめない —— だから絵の外に真値を置く: circle_packing_apollonian デカルトの円定理(厳密な代数等式)+ 整数充填 ford_circles 接するのは |
ps - qr |
= 1 のときに限る(整数で厳密) phyllotaxis_pattern 隣の番号差がフィボナッチ数(黄金角のときだけ) ifs_fractal モランの式 sum r^d = 1 と、既存 fractal_dimension space_filling_curve 4^n 点をちょうど 1 回ずつ・隣は必ず距離 1 相棒(neighbour_index_gaps / ifs_similarity_dimension / curve_locality)は 主張を数にする側で、これが無いと「それらしい絵」しか残らない。 ————————————————————————- # |
- L2432 (ja) — ★四つ組の最後が「直前に生まれた円」。それを落とす反射は親をもう一度 作るので、種の四つ組だけ 4 方向、以降は 3 方向に進む。ここを間違えると depth 3 で 56 個のはずが 88 個になった(実測。一意な円は 56 のままなので、 絵は正しく見えるが同じ円を何度も描き、以降の段が指数的に太る)。
- L2773 (ja) — ★2026-10-07: 縮小しない写像(r >= 1)を黙って通すと二分法が上端 8.0 に張り付き (r=1.2 の 2 枚で 7.99999…)、恒等写像 1 枚では 0 を返していた。Moran の式は 全写像が縮小(r < 1)のときだけ意味を持つので、ここで明示的に拒否する。
- L2782 (ja) — ★2026-10-07: 写像の数が多いと解が 8 を超えうる —— 上端を広げてから二分する。
- L2850 (ja) — ★ムーア曲線 = ヒルベルト曲線 4 本を輪に閉じたもの。四分割の向きと進む方向は 総当たり(8 対称 x 反転、4096 通り)で「継ぎ目 3 か所と折り返しが全部距離 1」を 満たす 32 解を出し、その 1 つを固定した。手で置くと隣接条件が静かに壊れる (最初の実装は隣接 False・閉 False のまま、絵としては正しく見えていた)。
- L2956 (ja) — ★クラドニ図形は「板」ではなく膜の解である。よく見る coscos - coscos は ヘルムホルツ方程式 + ノイマン境界の膜のモードで、実際のクラドニ板は 重調和方程式に従う別物。砂が節線に集まる絵は同じでも周波数比は合わない。 ここでは膜と明記し、膜の真値(閉形式の固有値・ベッセル零点)だけで採点する。 干渉と回折の真値は既存 op(grating_wavelengths / fraunhofer_pattern)。 ————————————————————————- #
- L3046 (ja) — ★2026-10-07: 矩形は [0,1] x 0,aspect。以前は y を [0,1] で取りつつ n pi y/aspect を 使っていたので、aspect != 1 で y=1 の辺が境界条件(Dirichlet なら 0)を破っていた。
- L3054 (ja) — ★2026-10-07: Dirichlet(sin x sin)は m=0 か n=0 で恒等的に 0 —— 全ゼロの場を 「固有モード」として返していた。拒否する。
- L3059 (ja) — ★2026-10-07: 組合せ (m,n)-(n,m) の 2 項は aspect != 1 だと固有値が pi2 (m2 + n2/a2) と pi2 (n2 + m2/a2) で異なり、和は固有モードでない。
- L3128 (ja) — ★2026-10-07: 以前は「集めた数が c+8 を超えたら止める」で、低い次数(m=0..2)の 高い零点ばかり集めて m>=3 の低い固有値(j’{3,1}**2 = 17.65 …)を落としていた。 j’{m,1} は m について単調増加なので、次の次数の最初の零点が、集めた中の c 番目を 超えた時点で打ち切れば取りこぼしは無い。
- L3327 (ja) — ★真値は公表値か閉形式だけ: 線形系は expm(At)x0 が厳密解で刻み半分に すると誤差が 1/16(4 次)、Lorenz のリアプノフ指数の和はトレース恒等式 により厳密に -(sigma+1+beta)、ロジスティック写像の周期倍分岐は 3 と 1+sqrt6、 相関次元は円 1・カントール log2/log3。絵では何も確かめられない。
- L3331 (ja) — ★関数(callable)を引数に取らない —— 型付き台帳は入力を sort で登録し、 連鎖ファザーがデータから引数を組むので callable は載らない。系は族名か係数配列。 ————————————————————————- #
- L3515 (ja) — ★
table は列名 -> 1-D 配列。状態を (S, n) のまま 1 列に入れると型の嘘に なるので、成分ごとの列に開く(x0, x1, … と時刻 t)。
- L3860 (ja) — ★上限は 60 パーセンタイルにしていたが、有界な集合では大きい r で C(r) が 飽和して傾きが下がる(充填した正方形で 1.83、真値 2.0)。飽和の 手前に寄せる。下限は近傍の離散化(雑音の床)を避ける。
measuring1d.py
- L375 (ja) — ★空の表は名指しで拒否する(2026-10-12 の空入力の方針 A)。空 list を空 list で返すと、 測定が 1 件も取れなかったことが mm 換算の後ろで見えなくなる。
- L624 (ja) — ★ここを「もう片端が次数 3 以上」と書いていた最初の版は、実測で 一度も発火しなかった: ヒゲの根元が枝の端点クラスタと 26 近傍で 融合して次数 2 になる配置が普通にあり、その場合に素通りしていた (「刈った」と報告しながら 0 本という、いちばん静かな失敗)。
mesh.py
- L410 (ja) — ★ match the whole line: a comment that merely mentions end_header used to end the header there and shift the binary body (silent garbage).
- L655 (ja) — ★ A comma is a column separator only when it is the ONLY one on the line. “1,5 2,5 3,5” (decimal commas, European locale) used to be re-split into 6 columns and read as xyz + colour (silently wrong).
meshio_opt.py
- L452 (ja) — ONCE from all three. ★ Per-channel, a 16-bit orange scene whose blue stays <= 255 (in 16-bit units) had blue divided by 255 -> 0.78 instead of 0.003.
metrics3d.py
- L373 (ja) — ★2026-10-07 レビュー修正: md=None(軸方向は無制限)で球の半径を r にしていたため、 実際は「半径 r の球」で切り取っていた(面が法線方向に r 以上動くと両側が揃わず nan)。 無制限の円筒は球で絞れないので、全点を候補にして軸・半径で判定する。
motionio.py
- L137 (ja) — ★ 値域(ptp)最大の単調列を時刻にすると、左→右に掃く縁の x(0..239 px)が 秒単位の t(0..0.1)に勝って x と t が入れ替わった(2026-10-07)。 x・y は画素座標なので整数値。時刻は「整数でない単調列」を優先し、 決まらなければ推測せず拒否する(見出しを付ければ名前で読める)。
occupancy.py
- L230 — ★2026-09-07:让
res 接受逐轴的值(也可长度 3)。若限定为立方,则像鸟瞰格(薄 z x 宽 xy)这样扁平的体积,连不需要的轴也被强制用同一步进(poc_bev_sensor_fusion 实测:409.6 万体素中只用了 8.1 %)。同族的 grid_coords 一开始就接受逐轴的 res – 对齐了入口与出口契约宽度不同的问题。传入标量的既有调用方不变。
- L340 — ★2026-09-07:让
res 接受逐轴的值(也可长度 3)。此前用 int(res) 只允许立方格,而 esdf 接受长度 3 的各向异性 voxel_size,可用 world 坐标去引其输出的这一侧却限定为立方,成了只有一侧狭窄的契约。在像 CT 的薄接合层 (30,180,180) 这样的格子上会直接卡住(在 poc_ct_void_morphology 中实测)。传入标量的既有调用方不变。
octscan.py
- L1238 (ja) — ★窓の端で振幅が下り坂のところは、0 で埋めた外側との段差が「極大」に見える → 元の振幅で極大のものだけ
op_probe.py
- L42 (ja) — ★2026-09-17:
feature を足した。戻りの橋 feature_to_img が入るまで、 2-D 台帳に feature を入力に取る op が 1 本も無かったので代表値も要らな かった。門(knob_liveness / probe_ledger / op_contracts)は 3 本とも 「測れない op が居る」と正しく落ちてこの穴を教えた。
opassist.py
- L56 (ja) — ★2026-10-23: カメラ校正(calib / caltab / fit_transform、21 op)。実装は 2026-08 から あり試験も 30 本超あったのに、台帳が無いので op ノートが 1 枚も無く、fs.ledger / OP_INDEX.json / op_find(“caltab”) のどこからも引けなかった(fs.<名前> は 21 中 1)。 新語なし(points / pose / matrix / table / contour / image2d)。名前>
- L77 — ★2026-09-08:ops1d(dsp 16 + funct1d 23)已注册,却既未出现在 docs,也未出现在 op_run / op_assist / op_find – 「注册了」和「查得到」是两回事。加入 opdocs 后,这道门便对查不到的一侧鸣响。
- L318 — ★设计(2026-09-04,用户「能处理各种容器类型固然更好,但统一感也很重要」):最初在
kind 里混入了 “seq” 和 “matrix” – 即值的类型(数值、整数还是选项)与容器的形状(1 个、向量还是矩阵)在同一个字段里相互竞争。从 UI 看,「int 的 3 向量」无法表达,而唯独矩阵的结构位于 seq 键之下,处理各不相同。将此处正交化,kind 只放值类型,容器一律放入 container。标量也不作例外({"form": "scalar", "shape": ()}),因此 UI 可以把分支写成一条。
- L452 — ★最长匹配。若按从短到长看,
sigma_per_mm 会命中 _mm 而变成 “mm”(实际是 1/mm)。单位一错,UI 的数字就会悄悄变成别的东西。
- L535 (ja) — ★2026-09-20(GenSpark 第 15 報 N71):
write_wav(path, x, rate) は in=[“signal”] なので、 第 1 引数の path に signal が割り当てられ、op_run("write_wav") が配列をファイル名として 開こうとしていた。パス名の引数は、宣言 sort が “file” のときだけデータ(読む側)で、 それ以外は書き先のパラメータ —— データ型は次の引数へ送る。
- L568 — ★要点在此:有些参数其默认值并非以 tuple 给出。
center=None(可省略的 (row,col))、必需的 trans(3 向量)、k_cam(3x3 矩阵)… 只看默认值就会看成「一个数值」,UI 便只出一个 spin box 而崩溃。用名字补足结构。
- L782 (ja) — ★一様乱数の行列にしない —— 成分・モジュラリティ・rich club は構造が無いと 「どのノブでも同じ数」になり、押して動いても意味のある絵にならない。
- L786 (ja) — llmcore(2026-09-24): ★一様乱数にしない —— どの行も似た向きになり、 注意の重みが全行ほぼ一様になって「押しても何も起きない」種になる。 滑らかな画像を 8x8 パッチに切ると、近い場所が近い向きを向く。
- L802 — ★实测发现:向
prism_min_deviation_deg 的波长输入传入 0..1 的通用 signal,会被「波长须为正值」拒绝,变成一个样例跑不动的 op。若已知单位,以该量的合理范围作种,更接近「一按就动」。
- L995 — 日文(CJK)的连缀。★
_WORD_RE 为 [a-z0-9]+,因此日语查询一个词都取不到(对日语输入而言 _WORD_RE.findall(...) == [])。词干那一段失效,而部分匹配是连空白一起去找字符串,所以日语的多词查询在结构上必定 0 命中 – 在一款 docstring 大半为日语、以 6 种语言分发的产品里。2026-09-08 由 poc_search_sweep_width 踩到而查明(经 op_find 查「点检出」/「光斑检出」/「小目标」的日语查询均为 0 命中,而带亚像素质心的点目标检出只有 star_detect,却无法从日语抵达)。
- L1048 — 视为词干一致的公共前缀长度。★取 4 会把 “median”/”medial” 及 “contrast”/”contour” 连到一起;切在 5,则 “correlation”/”correlate”(8)、”segmentation”/”segment”(7)、”rotation”/”rotate”(5)、”gaussian”/”gauss”(5) 能被拾取,而上述两组不会。
- L1058 — 公共前缀之后允许的词尾。★仅凭前缀长度判定会把 “median”/”medial” 连起来(共有 5 个字符的 “media”)。看词尾是否像屈折词尾,则 “correlation”/”correlate”(ion / e)通过,而 “median”/”medial”(n / l)与 “corner”/”cornea”(r / a)落选。
- L1154 — ★下限。没有它时,”zzz-nothing-matches” 会返回
histogram_match(因为 “matches” 与 match_* 词干一致)。若命中词的权重不足整条查询的 15 %,则视为「未命中」。实测:”digital image correlation” 为 0.19(通过),”zzz-nothing-matches” 为 0.10(丢弃)。
- L1294 (ja) — ★欧文の段(2026-10-15): 欧文のクエリは 1 行目の doc までしか見ておらず、引数の説明にだけ 出る語が 0 件だった —— “orthometric”(標高)は dem_height_frame_convert の frm / to にしか 書かれておらず、op_find(“ortho”) は名前に ortho を含む doe_orthogonal_array(直交表)しか 返さなかった。docstring 全文の部分一致を、どの段より低い点(12)で最後に拾う。
- L1335 (ja) — ★2026-09-19(GenSpark N2):
fullseye.apply([x, y], "add_image") で動くのに、 op_names() にも op_find() にも載っていなかった(op_names は 1 入力のレジストリだけ、 op_find は台帳 + レジストリだけを見ていた)。呼べるものは探せなければならない。
- L1364 (ja) — ★2026-10-18(外部レビュー 0.6.0 の一次検証): op_find(“sgm”) が 0 件で、外部 AI は「SGM は無い」と結論した。 実際には
fullseye.disparity_sgm(Hirschmüller の SGM、census の費用 + 経路集約)が 0.1 系から在り、 fullseye.stereo の族ごとファサードにだけ在る —— 台帳・2-D レジストリ・n-ary のどれにも載らないので、 探す側からは見えなかった([[feedback_search_all_tiers_before_declaring_a_gap]] と同じ型)。 名前と docstring の 1 行目で、他の層より 1 点低く拾う(同名なら op 表の行が勝つ)。
- L1392 (ja) — ★2026-09-20: 何で当たったかを
match に(exact = 名前の完全一致 / name = 名前の部分一致 / stem = 語幹 /
- L1463 (ja) — ★2026-09-20(GenSpark 第 55 報 N200): op_run(img, “gaussian”) が
unhashable type: 'numpy.ndarray'、 op_run(“gaussian”, img) が「not in any ledger」で終わり、registry op は apply で走ることを言わなかった。
- L1483 (ja) — ★2026-09-20(GenSpark 第 20 報 N87): 種を作れない型(mesh / lab / matrix …)は None のまま 関数に渡り、IndexError / AttributeError / AxisError が利用者に届いていた(11 op)。 呼ばずに、どの入力を渡せばよいかを言う。
- L1496 (ja) — ★2026-09-20(N71): データ引数が署名の先頭に無い op(write_wav(path, x))は名前で渡す —— 位置で渡すと 配列が path に入る。データ引数の名前は param_spec が知っている。
- L1506 (ja) — ★2026-09-20(GenSpark 第 34 報 N122、再現): 入力を一部だけ渡すと(blend_mode(base) で top 無し)Python の生の 「missing 1 required positional argument」が届いていた。0 個のときは上で種を作って言うのに、1 個以上のときは 検査が無かった。必須のデータ引数が位置でも名前でも来ていなければ、期待する形を 1 文で言う。
- L1524 (ja) — ★2026-09-20(N87): 自動の数値サンプル(1.0)が座標や行列を要する引数に合わないと、op の中の IndexError がそのまま利用者に届いていた(scene_box の center_mm 等)。自動値が原因なら言う。
ops.py
- L339 (ja) — ★勾配は片側差分の大きい方で取る。
np.gradient の中心差分は 1 画素で 立ち上がる段差を 2 画素に広げてしまい(段差の頂点で 0.5 しか出ない)、 理想の段差が幅 2.00 と報告される —— 測る道具が理想ケースで 2 倍を返す。 片側差分なら段差で 1.0、傾斜 m の斜面でも m となり、どちらも正しい。
- L637 (ja) — ★相対床だけでは足りない: 一様面 + 丸め屑では値域そのものが屑なので、 相対床も屑まで下がってしまう。絶対床 1e-5(画像は [0,1] 契約)を併せる。
- L713 (ja) — ★一様な面では勾配が丸め屑しか残らず、
arctan2 はその屑の符号で任意の角度を 返す —— 明るさを 0.01 変えただけで向きが一斉に変わる。絶対値の床では画像の 明るさに依存してしまうので、必ず相対量で切る。
- L817 (ja) — ★膨張は前景をはみ出す。連続の世界では半径 r の円は収まっているが、離散の 円板で膨らませると境界の外の画素まで塗る —— 実測で前景 197 画素の円に 対し外へ 48 画素(24%)漏れ、そのせいで粒度分布の生存率が 1.0 を超えた。 太さは前景の量なので、必ず前景で切る。
- L1010 (ja) — ★各画素には「入った時点で属していた山」の persistence を入れる。 ここで find(i)(= 最終的な根)を引くと、全画素が最後に残った 1 つの山の値に なってしまう —— 実測で高さ 1.0 / 0.6 / 0.3 の 3 つの山が全部 1.000 になった。
- L1017 (ja) — ★画像の最小値そのものの台地(たいていは背景)は 0 にする。そこは最後に 処理されて全体最大の山に吸収されるので、放っておくと背景一面が最大値に なって地図が読めない(実測で背景が 1.000 になった)。閾値を新たに選ぶのでは なく「最小値ちょうど」だけを落とすので、閾値フリーの性質は保たれる。
- L1109 (ja) — ★
m / n**2 ではなく (m + 0.5) / n**2。前者は値が {0, 1/4, 1/2, 3/4} と なって平均が 0.375 にしかならず、ディザ全体が暗い側へ偏る(1 ビットの傾斜で 平均が 0.031 ずれるのを実測した)。閾値は刻みの真ん中に並べる。
- L1298 (ja) — ★歴史的な挙動を
b <= 0.5 の帯に置く。これらの op の b は 2026-09-17 まで 「未使用」で、保存済みの進化プログラムが持つ b の値は事実上ばらばらに散って いる。新しい選択肢を上半分だけに割り当てれば、およそ半数の既存プログラムは 1 ビットも結果が変わらない(全域に割り当てると全部変わる)。 b <= 0.5 が旧実装とビット一致することは tests/test_knob_b_options.py が固定する。 ————————————————————————— #
- L1312 (ja) — ★境目は 0.5 を含めて歴史側に置く。0.5 は「まん中」として既定値に使われて いて(api.apply の既定、studio の中央、保存済みプログラムの初期値)、ここを 新しい側に入れると既定のまま呼んだだけで答えが変わる。実測で gaussian と その HALCON 別名の一致検査まで割れた。
- L1420 (ja) — ★しきい値は argmax ビンの「上端」で取る(2026-09-26)。中点で取ると、 argmax が指すのは背景の山を含むビンなので、その中点より上に居る背景画素 自身が前景に入る。背景 0.30 / 明部 0.90 の板では 400 px の答えが 4,096 px (全画素)になり、例外も警告も出なかった —— skimage と OpenCV は同じ絵で 400 を返す。ビンの上端で切れば argmax ビンの画素は全部背景側に落ちる。 試験の入力に必ず雑音が載っていたため 30 年物の門が全部通していた (docs/hardening/otsu-threshold-at-the-bin-midpoint.md)。
- L1547 (ja) — ★2026-10-07: 0 画素の面積率は 0/0(np.mean が NaN を返し、guard が黙って置き換えていた)
- L1687 — ★端点用端点值填充。以前是
np.convolve(x, k, "same"),它会把两端的 w 个点与零平均 – 轮廓的起点和终点被朝原点 (0,0) 方向拖动最多 50 px 以上,形成一幅 140 条轮廓的红色条纹向左上收敛的图(2026-09-06,第一次逐 op 作图时发现;数值测试中平均偏差 0.3 px,看不出来)。
- L2283 (ja) — ★pickle は名前で(2026-09-19 外部レビュー N5):
fn は backend_safe._safe のクロージャで pickle できず、Op を丸ごと multiprocessing / joblib に渡すと PicklingError で止まっていた(Pipeline は名前を持つので通る、という非対称)。 復元先は復元する側の環境の登録: backend が入っていない環境で戻すと KeyError(不足 extra の案内つき)になり、黙って別の実装にはならない。
- L2456 (ja) — ★2026-09-19 の外部レビュー(#1): scikit-image 無しの環境で
sk_canny を呼ぶと 「unknown operator」になり、存在しないのか backend が入っていないのかを 区別できなかった。fn は backend_safe._safe に包まれて __module__ を失う ので、登録の側で出自を残す(後勝ち = REGISTRY の重複解消と同じ規則)。 imgevolve.py index がこれを module / requires として索引に書き、 api._resolve が未登録の名前を引かれたときに索引から不足 extra を案内する。
- L2465 (ja) — ★pyproject の optional-dependencies と食い違うと案内が嘘になるので
tests/test_usability_review_2026_09_19.py が突き合わせる。
- L2752 (ja) — ★2026-10-07: 複素の sort は sanitize(実 sort 向けの規約で実部だけを返す)を通さない。 以前は tb_angular_spectrum_propagate / tb_cx_apply_transfer_function / tb_fmcw_window_apply が cimage / beatcube を名乗りながら float64 を返していた(虚部を黙って捨てる = 位相が消える)。 backends_bridge の橋は同じ理由で既に素通しにしていた —— その規約をこちらにも揃える。
- L2767 — ★记录在退化输入下会连整个进程一起崩溃的原生侧 op 的台账(2026-09-05)。
guard 只能捕获 Python 的异常。一旦在 C/C++ 内部越界写入,就到此为止,并连用户的整条流水线一起消失 – fail-soft 最糟的破法。除了在入口拦截别无他法,故带理由列在此处,并在注册时设卡。各平台行为不同正是此台账存在的理由。下面 3 个在 Linux(Ubuntu 24.04 / Python 3.12 / PyPI 的 wheel)上会崩,但在 Windows 上以相同输入一件都未复现。原生构建不同,边界的破坏方式也不同,所以「这类输入就没事」的精细划线不可信 – 对退化输入一律拒绝。不是「修好就删」,而是在能确认上游已修复后再删(这不是我们自己的代码,故删除条件不同)。
ops1d.py
- L117 (ja) — ★2026-10-11(台帳契約の門): read_wav / read_audio は (x, rate) を返すのに宣言は signal で、adapter が無かった(io 族は連鎖ファザーの目録から外れていて、誰も 型を確かめていなかった)。resample と同じく本体(x)を取り出す。rate が要るなら
fs.ledger.read_wav.raw(path) か dsp.read_wav(どちらも (x, rate) のまま)。
ops3d.py
- L437 — ★out 不是 image2d 而是 rgbimage(2026-09-02 实测)。docstring 与实现都是「RGB (size, size, 3) float [0,1]」,唯独这一行自称是 2-D 的亮度图。直到放入 mesh 的种子,这个 op 才被执行,类型谓词以 TYPEMISS「declared ‘image2d’ but returned ndarray(512,512,3)」将其暴露(在此之前,因把 (V,F) 拆成 2 个位置参数的形式,它一次都没被执行过)。其余 3 个 render_* op(ambient_occlusion / cast_shadow / supersample_mesh)如实测为 2-D,故保持 image2d 即可 – 撒谎的仅此一行。
- L460 (ja) — ★どれだけ細分しても次数 5 の頂点はちょうど 12 個。これは V - E + F = 2 の帰結であって実装の都合ではない(11 個でも 13 個でも 球にならない)。mesh_subdivide は任意メッシュの細分で、正多面体から の構成は持っていなかった。入力を取らない生成 op。
-
L466 (ja) — ★極小曲面と掃引(2026-09-23)。極小曲面は平均曲率 H が至るところ 0 の 曲面で、既存 vertex_curvature がまさにそれを測る —— 「これは極小曲面だ」 という主張を、作り方を知らない op が採点する。カテノイドとヘリコイドは 等長なのでガウス曲率 K が一致するが、それは必要条件にすぎない(門に するのは H)。実測 |
H |
中央値 0.0001 に対し、対照群の単位球 1.00004・ 半径 1 の円柱 0.50000。 |
- L476 (ja) — ★これは節面近似であって厳密な三重周期極小曲面ではない。残差は 隠さず docstring に書く(主曲率スケールの 1 % 程度)。
- L562 (ja) — ★新しい sort は作らない: ノード表と枝表は「単位も意味も違う 2 つの表」で、 タプルで返して adapter に
r[0] と書くと 枝表を黙って捨てる (pose_error / m3c2_distance で繰り返した失敗の型)。1 つの dict に 両方を入れれば宣言 ‘table’ が実返りと一致し、捨てるものが無い。
- L717 — ★2026-09-08 追加。此前用于雕刻的位姿辅助(visualhull.look_at)从任何公开层都引不到,而抓到同名的 render3d.look_at(gluLookAt、-Z 朝前)就会无一例外地得到空的 hull(poc_livestock_body_volume)。
- L738 (ja) — ★ out は image2d ではなく keypoints(2026-09-15 実測)。実返りは 像面上の (N,2) 画素座標で、入力 (160,3) に対し (160,2) が出る —— 画像ではない。同じ型の嘘を “render” 節の
project_points で 2026-09-02 に既に直しているのに(「旧宣言 ‘image2d’ は型の嘘で、 pnp3d 側の ‘image2d’ 宣言と噛み合って PnP を壊していた」)、 この 1 行だけが兄弟一掃から取り残されていた。 例外にならないのは _sort_ok が image に ndim == 2 しか求めず、 (N,2) が「幅 2 の画像」として黙って通るから。値域も画素座標 (実測 16.0 .. 47.9)で [0,1] ではなく、image を名乗る限り 下流の閾値 op に渡ると意味を失う。
- L828 — ★曾搁置的理由(a)「points 候选列表变短而悄悄改写既有 champion」,已随 backends_typed.TYPE_TO_SORT 把 coordgrid -> points 折叠而消失:2-D 桥的 tb_sphere_sdf / tb_box_sdf 带有 INPUT_ADAPTERS._points_to_grid,确实会从点云生成坐标场,所以那边的 “points” 声明并非谎言(实测:传入 (64,3) 会返回 (16,16,16) = 是活的)。撒谎的只是 3-D 台账那一侧。
- L991 — ★axis=1。
pairs 的正典是 (N,2)(实测:消费侧 6 个 op 明确拒绝 (2,N))。当谓词还是 lambda v: True 时,这里生成的是 (2,n),把「任何消费侧都无法接收的形状」当作声明类型来自称
- L1029 — ★position 的正典是 [z, y, x] 的 3 个分量。不是靠多数表决,而是运行消费侧来定的:refine_translation_lk / refine_lm 在传入 4 个分量时,会以 “init_pos must have exactly 3 components [z, y, x] (got 4)” fail-closed(实测)。生成器也是 (8.0, 8.0, 8.0) 的 3 分量。然而 match_* 系列按 docstring 返回 [score, d, h, w] 的 4 个分量,若声明 out 仍为 “position” 就放行,后段的精化 op 会全军覆没 = 类型的谎言。由于 score 本身是诚实信息,函数一侧不删(get() 保持 4 分量),而在自称台账类型的 call() 一侧只取出坐标(与 project_points 同样处理)。
opsacoustics.py
- L195 (ja) — ★新しい型の語は作らない。積層・A スキャン・C スキャンは kind の印つきの dict(table)で、 印の無い table は消費する 5 op がすべて ValueError で拒む —— 別の族の table を積層として 黙って読む経路が無い。
- L198 (ja) — ★A スキャンを素の signal にしない理由: 超音波で測る量は時刻(深さ = 往復時間)で、 素の 1-D 配列は時刻の原点(表面エコーの手前の窓の始まり)と rate を失う。上の rate の 注記と同じ「例外も NaN も無しに深さが狂う」経路になるので、t と rate を同じ dict に 入れて流通させる(dict の
rf を取り出して acoustics の op に渡すのは呼び手の明示的な行為)。
- L202 (ja) — ★C スキャンの RF の立方体(画素 × 時刻)は返さない: 返すのはゲートの中で読んだ像だけ (振幅・位相・同相・符号つき山・到達時刻)。立方体を image / volume として流せば 「時間の軸を空間の軸として」読む経路ができる(混ぜると黙って嘘をつく)。
- L205 (ja) — ★接合面の地図は既存の labels2d(整数ラベル = 積層の種類)。2 入力なので 2-D の橋は 架からず、1 入力の op の in はすべて table か無し(TYPE_TO_SORT に無い)。
opsastrostack.py
- L85 — ★ 作为替代,我们明确拒绝原始的 (N,H,W) ndarray。无论是 video (T,H,W) / voxel (D,H,W) / histcube (H,W,T) / zscan,3-D 数组都能通过同一结构检查,即使弄错也不会抛异常,而是返回一个“看似合理却错误的合成结果”——这与 photon 族将 histcube 从 voxel 中分离是完全相同的危险。但这里并非增加类型,而是通过要求它“必须是 list”来获得同样的防御。一旦写成 list(volume),调用方就声明了“首轴是帧轴”。 * image2d —— 合成结果、drizzle 输出、单帧。均为 2-D 的 float64,现有的 2-D op(滤波、阈值、morphology、psf_to_mtf)可保持语义不变地使用。它甚至并非非负(会出现 κ-σ 合成的残差以及样条插值的负值边缘),所以自称为 counts 反而是谎言。 * keypoints ——
star_detect 的返回是 (N, 2) 的 (row, col)。TYPE_CHECKS 中的 keypoints 是“(N,3) 或任意 2-D 数组”,故直接适用,并由 psf_fit / aperture_photometry 消费。
-
L101 — ★ 这里不是 pairs:pairs 的正典是 reprconv 侧的 6 个 op 所确定的“(x, y) 对”,而这里是图像坐标的 (row, col),与 fit_transform / mosaic 是同一规约。混用会导致行与列互换(与本 repo 已知的陷阱同形:features.match_keypoints 返回 (x,y),而 fit_transform 要求 (row,col))。自称 keypoints 至少能共享“图像上的点”这一约定。 * indices —— lucky_select 返回的采用帧的下标(1-D int)。就是既有词汇本身。[frames[i] for i in idx] 即可还原为 images。 * measurement —— noise_sigma 是单个实标量。 * matrix —— frame_align 的 (3,3) 齐次变换。与 transforms / fit_transform / mosaic 所处理的是同一物,没有理由另造专用词。 * table —— dict / list of dict(质量、PSF 拟合、测光)。TYPE_CHECKS 中的 table 为 list |
dict,故两者都适用。不分离的代价(honest):若非天体图像序列进入 images 池,frame_align 找不到星,会以 ValueError 停止。由于这是 fail-closed,所以不是“发现为零”,而是“到达了但被正确拒绝”,但从链式 fuzzer 的角度看,align 系的 2 个 op 可能只沦为 CONTRACT。由于会出现与 photon 族分离 counts 的原因相同的症状(7/17 从未被执行),若实测确实如此,那时将“含点像的图像序列”另立一池的判断才被正当化——不预先增加类型(在本 repo,顺序是:只有在出现“混用会变成谎言”的证据之后才增加类型)。 |
opsconngraph.py
- L66 (ja) — 作る —— シナプス表から隣接行列へ、帰無モデル、二値化。★カテゴリ名は docs/ops/conngraph// に なる: "build" は .gitignore の build/ に当たり、ノート 3 枚が commit されず CI だけ赤になった(2026-09-20)
opsdem.py
- L35 — ★ 诚实的局限:
depth 池也可能纳入相机透视投影产生的深度。透视深度中,1 px 在地面上对应多少米会随深度而变,所以用恒定的 cell_size 计算的坡度会看似合理却错误。那为何不分类型——这并非类型弄错,而是与错误给定 cell_size 同一类的错误,而 cell_size 已被设为必需参数(不设默认值)。增加类型也无法防止非正射深度(谓词最多只能看到“2-D 的实数数组”),反而会造出一个没有任何 op 持有种子的 dem 池,使全部 13 个 op 永久未被执行。与其假装用类型防住了防不住的东西,不如用必需参数与 docstring 明示,并选择在 fuzzer 中真正运行它。 * 只有 dem_fill_sinks 的输出是 depth —— 填洼的结果仍是高程栅格,直接进入 dem_flow_direction。此处若声明为 image2d,则族内的链(填 → 流)会因类型而断开。 * dem_flow_direction 是 labels —— 返回是 int8 的 0-7 与 -1(无流出方向),是无序意义的编号。自称 mask 会被当作二值,自称 image2d 会使 3 与 4 的平均具有意义。它直接符合 labels 谓词(整数 dtype,1-3 维)。 * dem_stream_network 是二值但为 image2d —— 内容是 float64,除 0.0/1.0 外还带有缺测的 nan,不满足 mask 谓词(bool 或整数 dtype)。若设为 bool,则“非河道”与“本就无值”将无法区分,故让类型迁就实现。 * 其余全部为 image2d —— 坡度[度]、坡向[度]、曲率[1/m]、山体阴影[0,1]、起伏[m]、地平线仰角[度]、天空可视因子[0,1]、可视[0/1]。均为 2-D 的实数场,现有的 2-D op(平滑、阈值、morphology、伪彩色、图注)可保持语义不变地使用。值域未必是 [0,1],但这与 astrostack 的合成结果处境相同:在本 repo,image2d 并非亮度的约定,而是“2-D 的实数场”的约定。类别 → [(op 名, module, [输入类别], 输出类别)]
opsflyvision.py
- L64 (ja) — ★ 重みは公開しない:
fly_hex_resample の個眼×画素の重み行列は functools.lru_cache で内部にだけ保持し、op の入出力型には現さない —— 出すと「画素座標系に依存する巨大な派生物」が型プールを汚し、下流の 2-D op が それを画像と取り違えて黙って処理してしまう(zscan を video に渡すと通る、と 同じ事故の型)。出さないことでこの取り違えを構造的に不可能にする。
opsgraph.py
- L35 (ja) — ★比べられる数字はヌルで割った比だけ。素の個数は規模で決まる。
- L44 (ja) — ★matrix の束を images に載せない —— 画像を渡すと全画素 > 0 で「全結合が全員に在る」 というもっともらしい嘘を返す。table なら他 op の表を渡しても op が断る。
opsimgforensics.py
- L206 — ★
phash 的谓词中,看 dtype 才是本体。若只用 ndim == 1,就与既有的 signal 完全重叠,分离的意义随之消失。
- L208 — ★
fingerprint 的谓词在形状上无法与 image2d 区分。只能靠零均值性来切分,而那是运行时的统计式猜测,所以谓词也带有同样的弱点(因此才用类型来分离)。请把这一弱点留在谓词的注释里。
- L224 — ★
fingerprint 的种子必须始终经由 sensor_fingerprint 生成。若直接放 rng.standard_normal((H, W)),那是白噪声而非指纹,比对将永远返回“无关联”=以为增加了检验面,实则未增加。
- L227 — ★
images 的种子必须是相同 shape 且2 张以上。只有 1 张时,sensor_fingerprint 会持续 fail-closed 而一次也不运行。
- L242 — ★
jpeg_ghost_quality 的 qualities=None 假定为“40..95 步长 5 的 12 个”,所以若 images 的种子不是 12 张,必然抛 ValueError。这是有意的 fail-closed(不返回下标与品质错位的图),故请在 fuzzer 侧对齐张数。
- L246 — ★
watermark_* 的 bits 必须不超过容量(LL 的 8x8 块数)。64x64 的 image2d + level 1 的 LL 为 32x32 = 16 块。
opsinterferometry.py
- L96 — ★ 未搭载到既有
signal 上,是实测的结果。最初判断“csi_signal_simulate ([] -> signal) 会把真正的干涉信号注入池中,故可到达”,但用该配线跑链式 fuzzer 时,在 600 条链(300x长度6 + 300x长度8)中 csi_peak_position 与 chromatic_confocal_height 一次也没有被执行(记录仅有 7 条 CONTRACT)。原因是 signal 种子是带负值的正弦波,入口 op 在同一链中被先抽到的概率很低。这与 opsphoton 在 counts 上踩过的陷阱完全一致,作为 fail-closed 完美生效的结果,“发现为零”看起来像稳健。在以 sweep 为专用池的同条件重测中,9 个 op 全部被执行。混用 2 种类型也不会让弄错悄然通过,这一点由各自专用的判别来保障(两者都以闭式测得阈值):- 把频谱传给 csi_peak_position → carrier_tolerance。干涉信号的载波立于 2/λ(Nyquist 的 0.333),而共焦峰为 0.010。实测中同一检查也能捕获 1000 倍的单位错误。- 把干涉信号传给 chromatic_confocal_height → max_carrier_fraction。共焦响应的 AC 分量只有低频(实测 0.010 / 0.010 / 0.015),而干涉信号是 0.333。入口 = csi_signal_simulate / chromatic_confocal_simulate(两者均无参数即可产生),出口 = csi_envelope (-> signal) 与 2 个 measurement op。
opsmath.py
- L97 (ja) — ★閉形式の内部判定。脱出時間の図に「ここは絶対に出ない」を重ねられる。
-
| L102 (ja) — ★定理が門になる図(2026-09-23)。数学の図はきれいなので、合っているかを 誰も確かめない —— ここに入れるのは絵の外に真値があるものだけ。 デカルトの円定理 / |
ps - qr |
= 1 / フィボナッチの斜列 / モランの式 / 4^n 点をちょうど 1 回ずつ。相棒の 3 本は「主張を数にする」側で、 これが無いと「それらしい絵」しか残らない。 |
- L108 (ja) — ★型は
pairs(N,2)。points は (N,3) の 3 次元点で、 最初そちらで登録して型契約の門に捕まった —— 名前が似ているので 取り違えやすい(門が無ければ「もっともらしく間違った」宣言が残った)。
- L123 (ja) — ★波動(2026-09-23)。クラドニ図形は「板」ではなく膜の解 —— 板は重調和 方程式に従う別物で、砂が節線に集まる絵は同じでも周波数比は合わない。膜と 明記して、膜の閉形式(矩形は pi^2(m^2/a^2 + n^2/b^2)、円はベッセルの零点) だけで採点する。干渉と回折の真値は既存 op(grating_wavelengths / fraunhofer_pattern)が独立に持っている。
- L140 (ja) — ★力学系(2026-09-23)。真値は公表値か閉形式だけ: 線形系は expm(At)x0 が 厳密解で刻み半分なら誤差 1/16(4 次)、Lorenz のリアプノフ指数の和は トレース恒等式で厳密に -(sigma+1+beta)、ロジスティックの周期倍分岐は 3 と 1+sqrt6、相関次元は円 1・カントール log2/log3。絵では何も確かめられない。
opsoptics.py
- L232 (ja) — ★真値が閉形式で外部参照が要らない: 恒等フィルタ → 180 度回転、 (i2πf)^n → n 階微分(ガウシアンの微分は閉じた式)、渦位相板の 巻き数が整数。fourier_plane_filter は入力を取らない生成器で、 four_f_filter が場と透過関数を受ける(cimage 2 つ)。
- L243 (ja) — ★ pupil_blur は「画像 × カーネル」の一般畳み込み(filters_freq.convol_fft) ではない —— PSF の標本間隔 λN/oversample を検出器ピッチへ面積積分して から畳む、その単位合わせが本体。だから PSF を作る側に置く。
- L304 — ★ 不是 normals(点云的 (N,3) 法线),而是 normalmap。二者形状相似,但传入 (N,3) 会被 _normal_map 以 ValueError 拒绝。此处若声明为 normals,便是“可以传入点云法线”的谎言,链式 fuzzer 每次都会以 CONTRACT 结束,从而一次也不执行此族(=化为发现为零)。
- L407 (ja) — ★trace_rays は登録しない: 台帳の trace_rays は optscene が持ち、正準名 lens_trace_rays は窓口(facade)の 別名として予約済み(opnames.FACADE_ALIASES)で、台帳に置くと test_op_names_phase1 の衝突の門が赤になる。 台帳からは ray_bundle / noncoaxial_trace で同じ追跡に届く。refractive_index は別の作業が中を直しているので この回は登録しない(既定の媒質が要る)。
- L538 (ja) — ★新しい型の語は作らない(位相も image2d、統計は table)。
- L539 (ja) — ★2-D の橋(tb_*)は架からない: 1 入力の op は speckle_statistics だけで、その in の image2d は sort
image(_NEW_SORTS の外)、out の table は sort に写らない (2026-10-13 に backends_typed.build の条件で確かめて決めた。_OP_BRIDGE_SKIP 不要)。
- L543 (ja) — ★材料は名前(別名可)かレコード dict で受ける。波長曲線はすべて pairs(λ [nm], 値)= 光源・QE・ ライトガイドの曲線と同じ形(像 = 光源 × 光学系 × 対象 × QE の波長積分へ渡す)。全部が引数だけで 描く側(画像を受けない)なので 2-D の橋は架けない(_OP_BRIDGE_SKIP)。
- L574 (ja) — ★曲線は materials と同じ pairs(λ [nm], 値)。像の明るさ = ∫ 光源 × 光学系・対象 × QE dλ を spectral_product で 1 本ずつ掛けて spectral_integral で積む。QE を掛ける前に energy_to_photons。 画像を受けないので 2-D の橋は架けない(_OP_BRIDGE_SKIP)。
- L597 (ja) — ★膜も基板も材料表(materials)の鍵で指定する。画像(分光の帯域画像)を受ける map も表を返すので 2-D の橋は架けない。
- L605 (ja) — ★レンズの処方(raytrace)と硝材の分散(materials)→ 波長ごとの焦点位置の較正表 → 戻りスペクトル → ピーク → 高さ・透明板の厚さ。観察対象(透明板・金属)の反射率も同じ材料表から。画像を受けないので 2-D の橋は架けない。
- L616 (ja) — ★画像を受ける op の in は image2d(橋の外)、引数だけの op は表 / 曲線を返す側なので 2-D の橋は架けない。
- L631 (ja) — ★fail-closed: 扱えない面の種類・座標変換面・r² の非球面項・別名でしか表に無い硝材は拒否、近似は allow_partial で明示したときだけ(結果に approximate=True)。画像を受けないので 2-D の橋は架けない(_OP_BRIDGE_SKIP)。
- L640 (ja) — ★fail-closed: 無い面・未知の欄・lens_system が拒否する値は ValueError。基の系は書き換えない。
- L648 (ja) — ★fail-closed: 矩形窓は参照の周期が整数のときだけ(そうでなければ拒否し、窓の宣言 hann を促す)、ナイキスト以上・1 周期未満は拒否。 法線の復元は影の無い画素だけ有効(他は NaN と valid = False)。雑音の模擬は種を明示。
- L661 (ja) — merit を再実装しない。★fail-closed: カタログに許容距離内の近傍が無いモデル硝材・無効な始点・未知の merit 欄は ValueError。
- L667 (ja) — lensopt の変数・LM をそのまま使い、硝材を変数にできる(離散の外側ループ)。★fail-closed: 未知のオペランド・足りない/余計な引数・ 範囲外の添字・有限でない値・重みが全部 0 の表は ValueError。
- L677 (ja) — 追跡の前に毎回解き直される(傍らの数値は解いた値)。★fail-closed: 未知の種類・循環したピックアップ・絞りを動かす厚みの解・ 軸上の主光線の解・根の無い F/# の解・collimate しない afocal は ValueError。
-
| L690 (ja) — ★fail-closed: 収束しない屈折は NaN と converged = False、表の外の波長・未知の水の種類・ |
g |
>= 1・n <= 1 は拒否。 波のスペクトルは Pierson-Moskowitz(1964)/ JONSWAP(1973)、水の吸収は Pope & Fry(1997)、散乱の位相関数は Petzold(1972)。 |
- L704 (ja) — Kolb, Mitchell & Hanrahan (1995)。幾何光学のみ(回折なし)。★fail-closed: 射出瞳が無限遠の系・非有限の入力・範囲外の波長/照明の表・ 軸対称でない系への点光源(前方追跡で回す)は ValueError。ケラレ/全反射の光線は NaN と vignetted = True で返す。
- L760 (ja) — ★fail-closed: 非有限の高さ・波頭より浅い底・下を向かない光・n <= 1・充填率の範囲外・定数画像・両クラスのない欠陥マスクは拒否。 濡れ面は Lekner & Dorf(1988)、水中画像は watermedia(Akkaynak & Treibitz 2018)、瓶は 2 次元の断面の光線追跡。
- L771 (ja) — ★格子の式 mλ = d(sin α + sin β) と Czerny–Turner の幾何から、角分散・分解能 mN・帯域の幅(スリットの像 ⊗ 画素 ⊗ 回折)・smile / keystone(3 次元の格子の式)・高次の重なりまで。chromconf の spectrometer_fwhm_nm と spectralrad の band_fwhm_nm を、スリット・格子・焦点距離・画素から実体化する。画像を受けないので 2-D の橋は 架からない(table は sort に写らず、spectrum は 2 入力)。
- L782 (ja) — ★LP モードは特性方程式の数値解(遮断 = Bessel の零点)。画像を受けないので 2-D の橋は架けない。
-
| L792 (ja) — ★縞はずれを M = p_m/ |
Δp |
倍(ウェハが動く)/ p_w/ |
Δp |
倍(マスクが動く)に拡大する。差動の 2 対で共通の誤差を消す。 |
- L803 (ja) — ★暗視野は縞の可視度の比(試料あり / なし)で、画素より小さい構造の小角散乱を測る。散乱角の広がりへは公表式で換算。
- L815 (ja) — 読み戻す。★新しい型の語は作らない: 図は印つきの dict(table)で、印の無い table は書き出しの op が ValueError で拒む。SVG / DXF は既存の text(文字列)、画像は rgbimage。
- L845 (ja) — 高さで変わる倍率・ケラレ・ぼけを実光線で。★光線は入射瞳でなく絞りを狙う(入射瞳が無限遠でも動く)。
- L864 (ja) — ★1 画素 4 枚 = 各画素で R・G・B(偽色が消える、解像はそのまま)/ 半画素 = 折り返しが消える(開口の MTF は上がらない)。
- L873 (ja) — ★新しい型の語は作らない。干渉スペクトル・A スキャン・B スキャンの束は kind の印つきの dict(table)で渡し、 印の違う table は消費する op がすべて ValueError で拒む(oct_interferogram / oct_bscan_spectra / oct_ascan / oct_bscan の 4 種)—— 別の族の table を黙って読む経路が無い。B スキャンの画像だけは image2d(dB)で出し、 界面を辿る op は装置の出力の図(実画像)も同じ image2d で受ける。
- L893 (ja) — ★距離は周期 c/(2f) の剰余。高い f ほど細かいが折り返す / 多重反射・縁の混合・高調波・背景光で壊れる。
- L904 (ja) — 高 NA の複素像。★新しい型の語は作らない。像の組は kind=”fp_stack” の印つきの table、復元は kind=”fp_result” で、 fp_reconstruct は印の違う table を ValueError で拒む。撮像の入口は振幅と位相の image2d、装置の像の組は volume と 照明の方向余弦 2 本の signal。
- L933 (ja) — ★新しい型の語は作らない。曖昧な法線の集合(候補 2 本 / 4 本)を normalmap と 区別するために新 sort を作るかを考えたが、集合は
kind == "sfp_candidates" の dict(= table)で返す: (K,H,W,3) を normalmap と申告すると法線を食う op(積分・ 陰影)に 4 本重ねの配列が渡るが、table なら normalmap の枠には入らず、逆に sfp_disambiguate は印の無い table を ValueError で拒む —— 混ぜても黙って嘘を 返す経路が無いので、語彙を増やす理由が無い(2026-10-13 に確かめて決めた)。
- L939 (ja) — ★2-D の橋(tb_*)は架からない: 1 入力の op の in は image2d(sort image、_NEW_SORTS の外) か normalmap / polsweep / table(TYPE_TO_SORT に無い)。_OP_BRIDGE_SKIP 不要。
- L969 (ja) — ★新しい型の語は作らない。断面と輸送行列は kind の印つきの dict(table)で渡し、印の無い table は消費する 5 op がすべて ValueError で拒む —— 別の族の table を幾何として黙って 読む経路が無い。パターンと画像は既存の images(2-D 画像の list、fringe の位相シフトと同じ)。
- L972 (ja) — ★縞と ToF は 1 つの族(このカテゴリ)にまとめ、sort は分けない。物理は同じ「経路ごとの フェーザの和の偏角」で、op の入出力はどちらも名前つきの値の dict(table)—— 縞は bias [rad] と height_error、ToF は depth / bias [m] と鍵の名前も単位も違い、位置で 並んだ配列を取り違えて渡す経路が無い(混ぜても黙って嘘を返さない)ので語彙を増やす理由が無い。
- L976 (ja) — ★2-D の橋(tb_*)は架からない: 1 入力の op の in は table / images(TYPE_TO_SORT に無い)。
- L993 (ja) — ★新しい型の語は作らない。パッチの組・解・描画の結果は kind の印つきの dict(table)で、印の無い table は消費する op が ValueError で拒む。多角形は points((V, 3))、放射は signal((N,))。
- L995 (ja) — ★2-D の橋(tb_*)は架からない: 1 入力の op の in は table(TYPE_TO_SORT に無い)。
opsphoton.py
- L85 — ★ 需注意:由于 counts 是 1-D 的 float64 数组本身,所以“调用”dsp / funct1d 毫无妨碍(类型词汇是为链式 fuzzer 的 pool 分离,而非 Python 的可调用性)。反向桥 = 将 signal 非负化为 counts 的路径,参见下方的“桥”注记。 * countrate —— SPAD 的计数率序列(Hz)(1-D,非负)。与 counts 同为“非负的 1-D”,但是不同的量,故另立一池。理由有两点,都基于实测:(a) 单位相差 7 个数量级。counts 池的值域约为 0-250 计数,把它传给 spad_deadtime_apply(dead_time_ns=50) 得 250 Hz x 50 ns = 1.25e-5 → 无一例外返回无限接近恒等映射的值。op 虽“到达”,但死时间的物理(饱和、1/tau 的 fail-closed、麻痹型的非单射性)从未被踏及。这与把 histcube 搭载到 voxel 上时相同,是“看似合理却错误的通过”,既不出 CONTRACT 也不出 TYPEMISS。(b) 物理不同。死时间作用于检测器的率流,而非对 TCSPC 的时间 bin 直方图逐 bin 作用(对直方图正确的畸变模型是 Coates = tcspc_coates_correct)。若归为同一词汇,进化搜索会把“对直方图施加死时间校正”这一物理上错误的链学作正当的类型连接。countrate 是明知只有 apply <-> correct 2 个 op 的狭窄 sort(与 jones 有 2 op、stokes 有 3 op 同级)。不过这 2 个 op 互为严格逆,故池内有往返不变量在循环。 * histcube —— 逐像素的到达时刻直方图立方体 (H, W, T),时间轴在最后。既有的
voxel 是“3-D 数组”,TYPE_CHECKS 也仅 ndim == 3,故结构上会通过。但 voxel 是 (D, H, W) 的空间格,轴义不同:把 (D,H,W) 的体积当作 histcube 传入,dtof_cube_depth 会把 W 读作时间轴,返回的不是异常而是“看似合理却错误的深度图”(实测:均匀体积下全像素 0.0075 m)。此外,扁平的 histcube 在 dtof_cube_depth 侧也会被判为 empty 而静默不通过(双重防御)。桥(针对狭窄 sort 的对策,实现未竟=待亲判断):可成为 signal -> counts 之桥的是“把任意实数 1-D 视为非负的光子率轮廓并作 Poisson 采样”的 op(photon_sample 的 1-D 版)。将负值的处理设为显式参数便不成为静默整流,也不破坏纪律。既有的非负输出 1-D op(funct1d.abs_funct_1d 实测 min 0.0023,dsp.envelope 实测 min 0.749,两者均保证非负),若该桥存在,则是 signal -> counts 的自然前段。详见报告。
opspiv.py
- L25 — * ★ 我们新设了
flow2d。既有的 flow_dense 的谓词是 ndim == 4 and shape[0] == 3(3-D 场景流),故 2-D 的 (2, h, w) 本就不适用。借用其名,就等于台账一边声明“返回 3 个分量”一边返回 2 个分量,使声明成谎言。它满足本 repo 增加类型的条件(“若没有持有种子的 op,将永久未被执行”):生成为 7 个 op(cross_correlate / multipass / deform_pass / ensemble_correlate / replace_outliers / to_velocity / sample_at_windows),消费为 13 个 op(含场量 8、可视化 2、检定 2、评估 3 的重叠),族内的生成与消费是闭合的。
- L35 — ★ 我们必给它一个出口(
visualise 的 5 个 op)—— 能造却看不见的类型会在链中途成为死路,产生“狭窄 sort”。双向的 fail-closed 也已实测确认:把 2-D 流传给 reprconv.flow_magnitude 会抛 ValueError(点名以“取 (3, D, H, W)”拒绝),把 3-D 场景流传给 piv_vorticity 会抛 ValueError。 * 输入的图像对是 image2d —— 粒子图像本身就是 2-D 的实数场,现有的 2-D op(平滑、阈值、背景差、图注)可保持语义不变地使用。不保证亮度落在 [0,1],但这与 astrostack 的合成结果处境相同。 * piv_outlier_mask 是 mask —— bool 的 2-D,与谓词一致。与因带 nan 而无法自称 mask 的 dem_stream_network 不同,这里已把缺测折叠到 True(外点)一侧,故以 bool 闭合。 * 统计是 table(dict)。piv_error_stats / piv_peak_locking。 * 转速度的 piv_to_velocity 的输出也是 flow2d —— 单位从 px/frame 变为 m/s 但类型相同。此处诚实写明:类型守不住单位。故把两种尺度都设为必需参数(与 demops 的 cell_size 同一判断)。也曾考虑按单位分类型,但那会成为只有 1 个 op 生成 m/s、无一 op 消费的类型——违反“出证据后再增加”的顺序,故未采纳。
opsprintpath.py
- L54 (ja) — ★様式化(2026-09-23)。「きれいな絵」を返す op ではなく、保った量と捨てた 量を数で返す op にする —— 既存の NPR ライブラリは絵しか返さない。真値は モアレ周期の予言(描く前に分かる)、被覆率 w/d の閉形式、既知の縞の向き、 Lloyd の単調減少(既存 stipple_energy が測る)、セル平均の L2 最適性。 点描の 6 op と同じ族に入れたのは、どちらも「濃淡を離散的な墨に落とす」 同じ問題で、入口も出口も同じ語彙(image2d / pairs)だから。
opsrangedoppler.py
- L108 — ★ 订正的记录:本模块初稿写作“在 real 中速度的符号会丢失”,但那是错的(仅对只有距离轴的 1-D 实信号成立,两轴齐全后符号会被保留)。测试先破而发觉。真正丢失的是“一对中哪一个是真的”、振幅的一半,以及无模糊测距范围的一半。
_as_beat_cube 在 dtype 阶段拒绝,并点名修法(显式构造解析信号)。 ————————————————————————– 为避免狭窄 sort 的入口与出口(对已实测教训的应对) ————————————————————————– 本 repo 实际踩过 2 个陷阱:① 无 op 产生的类型永久不可达(score 是 434 op 中唯一 1 件 blocked 的那件),② 搭载到既有池会每次 fail-closed 被弹,看起来像“发现为零”(photon 族 7/17 未被执行的那件)。beatcube 对两者都作了处置:入口(产生 beatcube 的 op):fmcw_beat_simulate(仅参数,无输入类型)fmcw_window_apply(beatcube -> beatcube)出口(返回既有 sort 的 op):range_doppler_map -> image2d(最大池)fmcw_range_profile -> signal beamform_delay_sum -> signal beamform_doa -> table 入口是“仅参数之源”这一点与 tcspc_simulate(无输入类型 -> counts)同形,故链式 fuzzer 需要与 counts 相同的专用生成器(对亲的交办事项;生成器的实体已在报告中经执行确认载明)。出口落入 image2d 与 signal,是本 repo 最大级的 2 个池,故不会成为 jones(2 op)或 countrate(2 op)那样闭合的狭窄 sort。
opsreprconv.py
- L257 — ★
flow 无法用单一谓词写就。因密 (3,D,H,W) 与散在 (N,3) 同名共存,若谓词同时放行两者则什么都守不住,若定于一方则既有 4 op 中必有其一成为 TYPEMISS。分离才是正确的(与将 video 从 voxel 分离同一判断),但那是改写既有 op 声明的工作,超出本模块职责,故此处仅留提案。
opsspc.py
- L91 (ja) — ★単位空間の MD² の平均は ちょうど (n-1)/n(導出、当てはめではない)。 教科書の「単位空間の距離は平均 1」を有限標本で正確に言い直したもので、 1.0 を固定する試験はどんな標本でも間違い、(n-1)/n は全部で正しい。
- L120 (ja) — ★新しい型の語は作らない。曲線(大きさの格子・POD・下限)も表の列として返す。
- L121 (ja) — ★2-D の橋(tb_*)は架からない: 出力の table は backends_typed.TYPE_TO_SORT に 写らないので _OP_BRIDGE_SKIP に入れる必要も無い(2026-10-12 に確認して決めた)。
opsspecular.py
- L160 (ja) — ★出力は既存の語彙(images / normalmap / image2d / table)だけ。法線マップは photometric と同じ規約なので integrate_normals(高さ)・render_shaded へ無改造で流れる。装置の幾何は table(rig)で、他の op は rig= で受ける(既定の装置なら省略可)。順方向は高さ場(image2d)→ 縞の鏡像(images)。
opstomography.py
-
| L141 (ja) — この台帳に置く。★出力は既存の語彙だけ: スペクトルと μ/ρ(E) は pairs、チャネル・線質・CRLB は table、 チャネルの像と基底の厚みは images (C |
B, H, W)、R 値と実効 Z は image2d。 |
opsvolcolor.py
- L63 — ★ 但既有的
labels 谓词为 ndim >= 1,2-D 的标签图像与 3-D 的标签体积同居。本模块的 11 个 op 被传入 2-D 时全部抛 ValueError(fail-closed),故弄错绝不会悄然通过。危险在于相反面:在只有 2-D 种子的池中,会在一次也不执行的情况下看起来像“发现为零”—— 与 opsphoton 在 counts 上踩过的陷阱同形。配线侧务必注入 3-D 标签种子(参见下方“亲配线时”)。 * voxel —— vol_label_overlay 叠加的原灰度体积,以及 vol_label_color_flicker 接收的二值体积。二者都是 (D,H,W) 的既有 voxel 词汇本身,没有理由另造新词。 * rgbimage —— 断面与投影的返回 (H,W,3)。既有的 rgbimage 消费 op(镜面分离、色变换、保存)可保持语义地使用。这里是 rgbvolume 词汇的出口,故新词汇不成死胡同。 * matrix —— vol_label_palette 的返回 (n+1, 3)。就是 2-D 的实矩阵本身。 * table —— 形状统计 / 图例 / 闪烁测量 / 带色网格的集合。
- L77 — ★ 未为“带色网格的集合”另造新词,是实测的结果。最初打算加
colormeshes,但把既有的 table 消费 op 全部过一遍,将 vol_labels_to_meshes 的返回传入(2026-09-02 实测,横跨 ops3d / ops1d / opsmath / opsoptics / opslightfield / opsphoton / opsacoustics / opsinterferometry / opscadmap),能吃 table 的 op 只有 3 件(abcd_matrix / wavefront_stats / istft),且 3 件都以 ValueError fail-closed。即不满足“混用会悄然出错”的条件。给不满足者添词,只会多出一个消费者为零的新词汇 = 多一个死胡同(docs/OP_COMBINATION_MATRIX.md 的判断基准)。此外,若想把单个网格作为 mesh sort 流向下游,用 [(m["vertices"], m["faces"]) for m in result] 剥出 —— 因这是丢弃颜色的操作,故不在 adapter 中隐式进行。 ————————————————————————– 一个新词汇及其理由(基于实测) ————————————————————————– * rgbvolume —— (D, H, W, 3) 的带色体积。既有 lightfield 的谓词只是 ndim == 4,故色体积完全满足 lightfield。实测(2026-09-02,将 (8, 16, 16, 3) 的色体积传给 lightfield 的 op):- lf_refocus / lf_subaperture / lf_epi / lf_depth_from_focus 这 4 个 op 既不出异常也不出 NaN,返回有限的 (16, 3)(各自自称“重聚焦像”“部分开口像”“EPI”“深度”)。是把 z 轴读作角度轴 V、y 轴读作角度轴 U 而得的无意义有限值。- 只有 lf_all_in_focus 因参数不足给出 TypeError(不是类型问题)。反向(把光场传给 vol_label_slice_rgb)会因 shape[3] != 3 而 fail-closed。安全的只有一侧,故不能依赖运行时检查。与将 zscan 从 video 分离同一判断。入口 = vol_colorize_labels (labels -> rgbvolume) 与 vol_label_overlay (voxel + labels -> rgbvolume),出口 = vol_label_slice_rgb / vol_label_mpr_rgb (-> rgbimage)。产 2、吃 2,故不成死胡同。
optdraw.py
- L677 (ja) — ★入射瞳が無限遠(物体側テレセン)では近軸の F 値 = EFL / 入射瞳径 が 0 になる —— 意味の無い「F/0.00」を書かない
- L911 (ja) — ★上面図は第三角法で側面図と横軸 y を共有するので、センサーの長辺(像の横 = 世界の x)は縦に描かれる。 向きを取り違えないよう、軸の矢印と名前を描く(+X が上)。
optics.py
-
L871 (ja) — ★奇数次の微分は奇関数。偶数長の fftfreq はナイキストの -1/2 だけを 持ち対の +1/2 が無いので、そこを残すと実の場の「微分」に虚部が出た (実測 max |
Im |
0.34)。hilbert_x と同じくそのビンを 0 にする。 |
- L887 (ja) — ★補集合はここで作る。
1 - lowpass を呼び出し側に作らせると、 境界の扱いが 2 通りに分かれて lowpass + highpass = 1 が崩れる。
- L892 (ja) — ★ナイキストのビンを 0 にする。
fftfreq は偶数長で -1/2 だけを 返し、対になる +1/2 が無いので、そこを残すと片側位相が奇対称を 厳密に満たさない(実測: 残差 1.6e-09 → 0 にすると 2.3e-16)。 離散ヒルベルト変換で標準的な扱いで、scipy.signal.hilbert も同じ。
- L2767 (ja) — ★縁はモザイクのまま鏡映で 2 画素広げてから抜く。広げ幅が偶数で
reflect (縁の画素を重ねない鏡映)なら 2x2 の位相が保たれる。マスク後の面を伸ばすと 未計測の 0 が縁に写り、一様な場でも縁が暗くなった(実測 16 画素)。
optscene.py
- L2349 (ja) — σ = 0.42·λN(Airy 強度の最良ガウス近似)。★ 以前は 0.42·(1.22λN) で 22 % 太かった
- L2749 (ja) — ★2026-10-11(台帳契約の門): lens_spec() は image_circle_mm を None で持つ(鍵は在る) ので
.get(.., 0.0) が None を返し、float(None) の生の TypeError が漏れていた —— 下の「image_circle_mm が無い」の ValueError に届いていなかった。
ozakimm.py
- L341 (ja) — ★2026-10-07: 行・列の最大値で 2 の冪に先に正規化してからノルムを取る(1e-200 × 1e200 で 二乗がアンダー/オーバーフローし 0 を返していた)。2 の冪の倍率は正確なので通常域の結果はビット同一。
pcseg.py
- L489 — ★
full_matrices=True(默认)会分配 (N, N) 的 U 并丢弃。2026-09-06 实测:20000 点为 3.73 s / 3.2 GB,而 full_matrices=False 为 0.876 ms(4263 倍),且 Vt 逐位一致。10 万点则会因 80 GB 而崩。同型也存在于 pcseg.fit_plane / measure / ops / camera / pnp3d(都在丢弃 U)。静态门是 tests/test_svd_full_matrices.py。
perpetual.py
- L115 (ja) — 密度の配色(暗い紺 → 橙 → 生成り)。★赤と緑は対にしない
- L149 (ja) — ★
np.add.at は同じことをするが桁違いに遅い(散らばった加算)。 1 次元に畳んで bincount で積むと CI の予算に収まる。
- L315 (ja) — ★色を黒でいた時間に結びつける。途中で通っただけのマスと、早くから 黒いままのマスが同じ濃さになるのが「白黒の点」の正体だった。 高速道路は最後にできるので薄く、最初の混沌は濃く出る。
- L326 (ja) — ★構図 —— 蟻が触った範囲は盤の一部しかない(既定では 1/3 ほど)。 埋まった範囲の外接箱で切り出さないと、絵の大半が余白になる。
- L341 (ja) — ★切り出すと 100 画素角ほどになる。最近傍で伸ばす —— これはセル オートマトンなので、補間すると存在しない中間値を作ってしまう。
- L364 (ja) — ★外接箱で枠を使い切る(外接円だと三角形が上下に余白を残す)
- L376 (ja) — ★密度をそのまま色に —— 双一次で積み、asinh で暗部を伸ばす
- L470 (ja) — ★★平方根には枝が 2 つあり、片方は「親 3 円に接しない円」を返す。 最初は主値だけを使っていて、絵の左上に外円の外へ逃げる円の鎖が 出た —— 絵としては「フラクタルっぽい」ので、見ただけでは欠陥と 分からない。接することを数で確かめて枝を選ぶ。
- L491 (ja) — 持ち上げる。★「順位で正規化すれば配り直される」と読んだが外れで、 極小円が多数派なので大きい円が全部下端に潰れ、前より悪くなった。
- L560 (ja) — ★点群の外接箱で枠を使い切る(式の定数で決め打ちにしない)
- L582 (ja) — ★正規化する前の速さ。色と太さをこれに結びつける(飾りでなく量)。
- L636 (ja) — ★色は濃度 v に結びつける(単調な配色なので順位が保たれる)
- L877 (ja) — ★二項係数そのものを積むと C(62,31)*31 が int64 を黙って溢れる。 要るのは偶奇だけなので、リュカの定理の帰結 「C(n,k) が奇 ⟺ (n & k) == k」を使う(桁あふれの余地が無い)。
- L897 (ja) — ★向きの符号は回転の規約で変わる。定理が言うのは「周期 104 で同じ斜めの 変位を繰り返す」ことなので、そちらを門にする(大きさは縦横とも 2)。
- L904 (ja) — ★高速道路は正味で 104 歩あたりちょうど 12 マス黒を増やす(実測で整数)。 最初は「104 歩で 52 マス」と書いたが実測 0.114/歩 と合わず、測り直して 12/104 = 0.11538 だった。周期の中で塗っては消すので、正味はずっと少ない。
- L921 (ja) — ★★描いた円が本当に接しているか。平方根の枝を選び損ねると、 絵としては「フラクタルっぽい」まま外へ逃げる鎖が出る(実際に出した)。
photometric.py
-
L98 (ja) — ★2026-10-02: 以前は np.sign(nz) * 1e-6 + 1e-12 で、nz がちょうど 0(真横を向く法線)のとき np.sign(0) = 0 になり分母が 1e-12 → p = -1e12 を返していた(±1e-6 で抑えるつもりが効かない)。 0 は正の側に寄せる。真横の法線の勾配は本来無限大で、ここでは |
p |
, |
q |
≤ 1e6 に抑えた値になる。 |
pipeline3d.py
-
L45 (ja) — ★2026-10-02: 以前は符号なし距離 distance_point_plane( |
d |
)で PV = max |
d |
− min |
d |
を出しており、 平面の両側に散る点では PV を桁で過小に報告した(±h の 2 層で真の 2h·cosθ = 0.0188 に対し 0.0020)。 平面度の PV は符号つき残差の山と谷の差。RMS は 2 乗なので元から正しかった。 |
pivops.py
- L506 — ★ 相关峰立不起来的窗(无纹理、全面一样)返回 nan —— 不返回 0 是为了不把“未动”与“不明”混同。但有几成是 nan 只能从返回值得知,此前的形态是等到
flow.mean() 变为 nan 才察觉(2026-09-06)。在此计数。实测:均匀背景上只有 16x16 方块的图像,98 窗中仅 16 窗为有限(0.163)。全面纹理则为 1.000。
pnp3d.py
- L241 (ja) — ★2026-10-07 レビュー修正: 旧式は回転ブロックに -[Xc]x(= t も回す更新の微分)を使い、 実際の更新(t は回さない)と食い違っていた。初期値が良いほど収束が線形に遅くなり、 30 反復で最小に届かないことがあった(重心中心化した DLT 初期値で 50 反復要した)。
- L309 (ja) — ★2026-10-07 レビュー修正: 世界原点から遠い点群(オフセット 1e4、画素ノイズ 0.5 px)で DLT の脱正規化 M = T2⁻¹·Pn·T3 の並進列が桁落ちし、t が壊れた初期値から LM が 回転誤差 175° の別解へ落ちていた。入口で重心 c を引いて解き、最後に t − R·c で戻す (Xc = R(X − c) + t’ = R X + (t’ − R c))。
polish.py
- L435 (ja) — ★2026-10-05 chain_fuzz の 2 回目の発見(ttc_from_scale → raster_wipe_area): 面積の 4 項が有限でも、N 本の和(N·single)と 一筆の y 座標((i − (N−1)/2)·pitch)はまだ溢れうる。区切りの NaN 以外に非有限が出たら黙って返さない
pose_quat.py
- L190 (ja) — ★2026-10-07 レビュー修正: ry = ±90°(ジンバルロック)では R[2,1], R[2,2], R[1,0], R[0,0] が どれも丸め屑になり、rx, rz を屑の atan2 で決めていた(ry=90° ちょうどで行列の往復誤差 0.16)。 cos(ry) = hypot(R[0,0], R[1,0]) が √ε 未満なら rx と rz は和/差しか決まらないので rx = 0 に 固定し、rz を残りの成分から取る(R[0,1] = −sin rz, R[1,1] = cos rz が ±90° の両方で成り立つ)。
- L291 (ja) — ★2026-10-07 レビュー修正: 符号を w の正負で揃えると、w≈0 をまたぐ組(yaw +179° と −179°)が 反対の半球に分かれ、平均が恒等(0°)に潰れた。最初の四元数を基準に、内積が負のものを反転する。
-
| L425 (ja) — ★2026-10-07 レビュー修正: 回転が無い(純並進)と sin(θ/2)=0 で割れず、旧実装は 軸 0・並進 0 を返して並進を丸ごと失った。qr = ±1 なら qd = ±(0, t/2) なので t = 2·sign(w)·qd[1:]、軸 = t/ |
t |
、d = |
t |
(並進も無ければ軸 0・d 0)。 |
ppf.py
- L126 — ★ 素朴的 PCA 法线符号任意,旋转后有四成的点会翻转。由于 PPF 的特征是法线之间的角度,翻转则键会改变。实测(400 点,绕 z 轴):用素朴法线时键的一致率在 0/37/90/143 度为 100 / 73.6 / 69.4 / 67.2 %,用定向法线则全部 100 %。与
pointcloud.fpfh 踩过的同一个洞,在同一天一并修好。
printpath.py
- L45 (ja) — 様式化(npr、2026-09-23)。★test_printpath の門が
set(OPSPRINTPATH) == set(__all__) - {定数} を要求するので、 台帳とここの両方に書く必要がある。
- L185 (ja) — ★2026-10-07: 行番号 N123 とチェックサム *71 を外す(外さないと N が命令に見え、その行の移動が黙って落ちた)
- L195 (ja) — ★2026-10-07: G の無い座標だけの行(modal な移動)などは黙って捨てず拒否する
- L209 (ja) — ★2026-10-07: 以前は黙って無視され、直後の G91 の相対量が絶対座標として読まれていた 軸は数値なしでも書ける(
G28 X Y)ので、数値つきの語でなく文字そのものを見る
- L231 (ja) — ★2026-10-07: 始点未定の軸への相対移動は未定のまま(以前は相対量を絶対座標として読んだ)
- L717 (ja) — ★ペンプロッタの経路と 3D プリンタの経路は同じ対象(順に回る線分の列)で、 # 出口も同じ(contours_to_gcode → gcode_write / gcode_time_estimate)。 # だから族を新しく立てず、ここに stroke カテゴリとして足す。 # 参考: Kaplan & Bosch, “TSP Art”, Computational Aesthetics 2005。 # ————————————————————————— # 点描の距離。”euclidean” 以外は将来。
- L818 (ja) — ★画素ごとの最近傍をKD 木で引く。以前は各反復で (画素 x 点) の距離行列を まるごと作っていたので、202x300 の絵に 9,000 点を置くだけで 60,600 x 9,000 = 5.5 億要素(4.4 GB 相当)を 18 回組み直していた —— 手元で 101 秒、共有ランナーでは PoC の実行門(1 本 600 秒)に迫る。KD 木は厳密に同じ最近傍を返すので答えは 変わらない(同距離の並びだけは実装依存になるため、種を固定した回帰検査を置く)。
- L1034 (ja) — ★被覆率で塗る。整数画素の円板で塗っていたときはペン幅が階段になり (0.5 / 1.0 / 1.5 px がインク率 0.1900 で一致し、2.0 で 0.4853 へ跳ねた)、 「目標の濃さに合うペン幅」を解くことができなかった。画素中心から標本までの 距離で被覆率を出すと、ペン幅が連続なノブになる。
- L1076 (ja) — ★2026-10-07: 反射の詰め物を手で切ると r ≥ 辺の長さで足りず出力が縮んだ((8, 12), σ=3 → (4, 12))。 np.pad の reflect は繰り返し反射するので形が保たれる(r < 辺の長さでは従来と同じ値)
- L1086 (ja) — ★「きれいな絵」を返す op ではなく、保った量と捨てた量を数で返す op にする。 既存の NPR ライブラリは絵しか返さない —— 差はそこ。真値はモアレ周期の予言、 被覆率 w/d の閉形式、既知の縞の向き、Lloyd の単調減少(既存 stipple_energy が 測る)、セル平均が L2 最適であること。 ————————————————————————- #
- L1297 (ja) — ★ストロークを構造に沿わせるなら、縞の周波数ベクトルはその 直交方向に向ける(線は周波数ベクトルに直交に走る)。 この 90 度を入れ忘れていて、docstring は「沿う」と書きながら 実装は「横切る」だった —— 既知の角度の縞を渡す門で掴んだ (2026-09-23)。絵を見るだけではどちらも「それらしい線」に見える。
problems.py
- L147 — ★一个确定性的全局洗牌(基点固定,因此 train/holdout/locked 索引同一个置换),按 seed 的角色分成三个互不相交的带(evolve.run 取 train=seed、holdout=seed+10000、locked=seed+20000,于是 seed//10000 mod 3 选出带)。旧的
off = seed % pool 在 pool 整除 10000 时总是把三个窗口塌缩到同一批帧——一个静默的 train↔holdout↔locked 泄漏,使过拟合 train 的 champion 看起来”在纯 holdout 上胜过手工”。纯粹的三分需要 pool >= 3n;更小的 pool 无法给出干净的 holdout,所以我们拒绝而非静默泄漏。
profileops.py
- L270 — ★ 最初写作“曲率较大的一侧”,在 NACA 2412 上把后缘判成了前缘。三点圆的曲率,在上下面几乎相切的后缘处会比前缘的圆度更大——“前缘是圆的”这一直觉,用轮廓上的 3 点来测时会逆转。
- L277 — ★ 后缘张开时,最远的 2 点会拾取后缘的某一角而使弦倾斜。改在缝隙的中点重取,再把前缘定为“离该中点最远的点”。不这样做,即使对称翼也会出现相当于后缘半缝隙的弯度(实测 0.001257)。
- L643 — ★ 比对前用同一取法重取。弦的框架(尤其是后缘中点)会略依赖点的放置方式,故把生轮廓与重取轮廓相互对照时,即使同一形状也会引入 0.02 度的旋转与 7.8e-4 的平移——这本身就成了偏差的地板(实测 rms 6.05e-4)。要比较的东西须置于同一擂台。
- L654 — ★ 不作点对点,而作点对折线测量。即便按等弧长重取,两者的相位也不一致,故若以编号取对应,则相位错移会直接成为偏差(实测:拿同一形状与自身比,rms 为 6.05e-4——与想检测的缺陷同一数量级)。
pxrd.py
-
| L976 (ja) — ★2026-10-07: 補正で割った値 v = I / c の分散は I / c² = |
v |
/ c(補正を σ に通さないと 2θ=55° で σ を 2.3 倍小さく見積もった) |
raster.py
- L222 (ja) — ★ /iinfo.max put a signed image in [-1, 1] (int16 -32768 -> -1.00003)
- L280 (ja) — ★2026-10-24: imageio (Pillow) returns a 16-bit RGB/RGBA/gray+alpha PNG as uint8 without an error. Read the declared depth from the IHDR and, when it is > 8, try the depth-keeping reader (OpenCV IMREAD_UNCHANGED) first.
raytrace.py
-
| L925 (ja) — ★2026-10-18(lensfile の第 2 実装との照合で発覚): 以前は「 |
t |
の小さい方」を選んでいた。光線が前の面から 出て、球の z 範囲の中から始まる(R < 0 の面が長い空気間隔の後にある望遠型など)と、後ろ側の球面 (t < 0)を拾い、全光線が「けられ」に化けていた(R = −14.5 の面の 26 mm 手前から y = 3 の光線が NaN)。 物理的な交点は頂点を含む葉 —— sag の式の枝で (1+k)·c·z = 1 − √(1 − (1+k)c²r²) ≤ 1 —— の上にある。 その葉の上の根だけを候補にし、両方が乗るとき(双曲面など)に |
t |
の小さい方を取る。 |
- L1226 (ja) — ★2026-10-14: 以前は bfl(無限遠の物体の焦点)を使い、有限物体でも像面を無限遠の焦点に置いていた (700 mm の物体で像は 51.39 mm なのに 47.71 mm、W20 −18 波の偽のぼけ)。近軸の像距離は無限遠なら bfl と同じ。
- L1240 (ja) — ★2026-10-15: 像面とほぼ平行・逆向きに進む光線は像面に届かない —— 無効にする。以前は傾いた鏡(tilt 45°)の後で D_z ≈ 1e-17 の光線が巨大な有限の点になり、spot_stats が rms 3.4e18 mm・n_vignetted 0 を返した (傾きは「その面だけ」の摂動で、光軸は折れない。折り返しは raytrace3d の fold_mirror で組む)。
raytrace3d.py
- L652 (ja) — ★光線が像面とほぼ平行・逆向き(像面の +z へ進まない)なら像面に届かない —— 無効にする。 以前の raytrace は傾いた鏡の後で D_z ≈ 1e-17 の光線を巨大な有限の点(rms 3e18 mm)として有効に数えた。
- L657 (ja) — ★局所座標は傾いた像面そのものの基底で取る(以前は傾けない座標系へ射影し、傾けた向きが cos θ’ 倍に縮んでいた)
realdata.py
- L38 — ★ 只有
public 列为真者,方可用于公开发布的图。仅限研究、教育目的且需注明引用者,带有 cite。
- L97 — ★ skimage 只持有随附的子集,其余在运行时经 pooch 去取。取不到的在本 repo 中不使用(PoC 若依赖网络,出问题时便分不清是实现还是网络所致)。
render3d.py
- L1946 (ja) — ★極小曲面は平均曲率 H が至るところ 0 の曲面。既存
vertex_curvature が まさにそれを測るので、「これは極小曲面だ」という主張を、作り方を知らない op
- L1948 (ja) — が採点する。★カテノイドとヘリコイドは等長なのでガウス曲率 K が一致するが、 それは必要条件にすぎない —— 門にするのは H のほう。 ————————————————————————- #
- L2153 (ja) — ★marching cubes は面積 0 の三角形を出す(格子点をちょうど通る等値面で、 2 頂点が同じ位置に来る)。曲率 op はそれを正しく拒否するので、ここで落とす —— 黙って渡すと「曲率が定義できない」と下流で落ち、原因がここだと分からない。
- L2215 (ja) — ★平行移動フレームで掃く(フレネ枠を使わない —— 直線部で法線が定義できず、 変曲点で従法線が反転して管がねじれる)。真値は、円を中心線にすると トーラスになり体積 2 pi^2 R r^2・表面積 4 pi^2 R r が解析解であること。 ————————————————————————- #
reprconv.py
- L149 — ★ 转为整数 dtype 时,须在转换前检查生值。敌对检查发现的洞(2026-09-02):
np.asarray(nan, dtype=int64) 不出异常而返回 INT_MIN,转换后 dtype.kind == 'i',故会跳过下面的非有限检查。像 3.7 这样的非整数也会被静默截为 3——下标偏了 1 的结果,无异常地返回。这正是转换 op 的谎言本身。
- L1076 — ★ 真实 bug 的回归点。最初此处为
np.maximum(sigma, finfo.tiny)。在重复点处 sigma = 2.2e-308,gaussians_to_voxel 的 sigma ** 3 下溢为 0,导致 0 除 -> NaN。本想“避开 0”,却替换成了会在下游产生 NaN 的值(体积的一部分在无异常下变为 NaN = 典型的静默出错)。重复点意味着“间隔无法测量”,故不以哨兵填补,而是 fail-closed。
residue.py
- L336 (ja) — ★2026-10-07: [lo, hi) に候補が 1 つも無い標本は範囲外の値・score -inf・margin 2.0(最大の確信)を 返していた → 値と score は NaN、margin 0(residue_fault_locate の「決められない = NaN」と同じ約束)。
- L614 (ja) — ★2026-10-07: 範囲内に候補が無い画素は margin 0(= valid にしない)。値は warp 用に有限のまま残す。
-
| L698 (ja) — ★2026-10-07: refine 後に |
d |
が探索範囲 max_disp を越えた画素は黙って切らず valid=False にする。 |
roughness.py
- L55 (ja) — ★規格の文面どおりの ±λc/2(= 2.67 σ)は裾の 0.8 % を落とし、カットオフでの透過率を 0.5 でなく 0.5095 にする(2026-10-18 に実測して直した。α の定数も標本化の正規化も正しく、 原因は打ち切りだけだった)。4 σ まで取ると λc で 0.5 に 1e-4 台まで合う。
- L978 (ja) — ★2 は入れない: 局所二次の中心値の等価核は
G(u)(3/2 - u²/(2σ²)) になり、透過率が (1+x)exp(-x), x = ln2 (λc f)² へ変わって λc で 85 % になる(= 規格のカットオフ定義と 食い違う)。次数 0/1 の内部は同じ核なので、カットオフの意味が保たれる。
rust/fullseye_core/examples/python_ctypes.py
- L42 (ja) — ★第 5 引数 fs_dtype_t。2026-09-14 までヘッダにだけ在って実装と FFI 宣言に 無かった引数。ctypes は引数の数を検査しないので、抜けても黙って動く。
sample_data.py
- L147 — ★ 加入的理由:在展示 111-113 中再次出现“合成只能造出自己已知的坏法”(有 6 张实拍出现 9 件不良的前例)。PoC 保持离线闭合,只把替换为实数据的入口置于台账。commercial=”check” 及以上者,须先读源的页面再用。
scale.py
- L54 (ja) — ★2026-09-17: 検査のタイル幅を 64/16 だけから 60/12 も見るように広げたら、 tile_safe と宣言されていた 168 本のうち 16 本が割れた。64 も 16 も 8 の 倍数なので、周期 8 の処理と、たまたま境界が穴に掛からない領域処理が すり抜けていた。以下はそのとき測って落ちたもの(誤差は 60/12 での実測)。
- L86 (ja) — ★2026-09-17: 走査長平滑化は隙間を最大 65 画素まで埋めるので、 標準タイラーの halo より広い。60/12 のタイルで 0.2613 ずれた(実測)。
- L89 (ja) — ★2026-09-17: 局所の二峰性は窓が最大 41 画素、傾き補正は角度を画像全体から 1 つ決める。どちらもタイルごとに測ると別の答えになる(実測 1.0000)。
- L185 (ja) — ★名前つきの理由はカテゴリの分岐より先に引く。category が先に返してしまうと、 幾何カテゴリの op はすべて「cv2 の座標上限」と説明されてしまい、実際の理由 (deskew なら「角度は画像全体から 1 つ決まる」)に辿り着けない。この辞書に 載っているのは実測で非タイル可と分かった op だけなので、載せた op 以外の 分類は 1 件も変わらない(2026-09-17 に 925 op 全数で確認)。
scene_registry.py
- L19 (ja) — ★配布物にローカル絶対パスを焼き込まない。ここは自分のマシンの作業物を指していた ので、他人が pip install した環境では黙って落ちる(しかも「場面が無い」ではなく 「その場面だけ静かに欠ける」形で)。環境変数で受け、未設定ならその場面を登録しない = 在ると偽らない。
loco_mujoco は入っていれば自分で在り処を知っているので探す。
sdf_ops.py
- L346 — ★ 加入的理由基于实测:
poc_dfm_thickness_overhang 与 poc_cad_scan_deviation 报告称 # “机械部件由圆柱孔、倒角、圆角构成,但基元只有球与 # 长方体,故无法用 CSG 拼装”,两者都各自手写了逐面的解析式。此处的 4 个全部为闭式且严格(外侧为到最近表面的 # 欧氏距离,内侧为到最近面的负值),故此后可仅用 CSG 拼出带真值的合成部件。 # ————————————————————————— #
segcompare.py
- L216 (ja) — ★2026-10-07: 43*0.1/0.1 = 42.99999999999999 → floor で 1 voxel 手前に落ちた(spacing 0.1 で 1000 個中 47 個)。 整数のごく近く(相対 1e-9)は整数に寄せてから floor
sensitivity.py
- L396 (ja) — ★2026-10-15: 生きた列(影響ゼロでない列)が 1 本以下なら、組み合わせが 1 つも無いので交絡は定義上ない (以前は max_subset の範囲 2..2 に 1 が入って ValueError で落ちた。simcal で σ = 0 のボケの列が 0 になって踏んだ)。
- L418 (ja) — ★大きさの等しい項の順と符号の基準は丸めの屑で決めない(simcal._fmt_combo と同じ、2026-10-15 に CI の Linux でだけ順が入れ替わった)。1e-6 で丸めて比べ、同点は宣言順。
shapestats.py
- L557 (ja) — ★2026-10-07 レビュー修正: 中点がほぼ一直線(2 番目の広がりが 1 番目の 1e-3 未満) または一点だと、面は直線まわりに決まらず vt[-1] は雑音で決まる(真の面から 90 度 ずれうる)。中点の面の法線が左→右の平均ベクトルと 60 度以上食い違う場合も、鏡映面と して左右の対と矛盾する。どちらも左→右の平均ベクトルの、中点の主方向に直交する成分を 法線にする(面の位置は従来どおり中点の重心)。それも決まらなければ ValueError。
simcal.py
-
| L938 (ja) — ★同じ大きさの項(利得 × 照明のように |
e |
が等しい組)の順と「主の項」は、丸めの屑で決めない。 argmax / argsort は 1e-16 の差で入れ替わり、Windows では “illum^1 * gain^1”、CI の Linux では “gain^1 * illum^1” になった(2026-10-15)。大きさを 1e-6 の相対で丸めて比べ、同点は宣言順。 |
-
| L967 (ja) — ★重みは自然な座標(e· |
列 |
)なので、単位の違う項が混ざると指数が大きくなりうる(8 次の多項式の係数と利得: 2026-10-18 に exp が溢れた)。対数のまま ln_product も返し、積は溢れたら inf / 0 にする(落とさない)。 |
spc.py
- L426 (ja) — ★管理図と工程能力は「工程のばらつき」を見るが、その数字は測定のばらつきを 含んだままである。ゲージ R&R は総変動を「部品差」と「測る行為の差」に分け、 後者が前者を食っていないかを見る —— 工程能力の前に来るべき検査で、ここが 抜けていると「工程が暴れている」と読んだものが実は測定器だったという取り違えが 起きる。GUM は同じ問いを 1 回の測定について立て、成分ごとの不確かさを 合成する。どちらも閉形式で、照合できる恒等式を持つ。 =========================================================================== #
- L733 (ja) — ★どのモデルで出した数字かを必ず載せる(黙って切り替えない)
- L1042 (ja) — ★★破綻は警告でなく構造で返す。感度係数がすべて 0 になると、入力に 不確かさがあるのに合成不確かさが 0 になる —— 規格の比較損失の例 (
dY = X1^2 + X2^2 を x_i = 0 で評価)がまさにこれで、 c_i = 2 x_i = 0 だから 1 次近似は「不確かさゼロ」と答える。数式としては 正しいが測定の主張としては嘘で、モンテカルロは同じ状況で u = 50e-6 を返す。0 を返すこと自体は止めない(それが伝播則の答えなので)が、 guf_valid=False と invalid_reasons=["stationary_point"] を結果に 同伴させる。警告にすると握りつぶされ、呼んだ側は「測定が完璧だった」と読む。
- L1051 (ja) — ★この検出条件そのものは本実装の判断であって、規格が列挙したものではない。 規格が定めるのは線形モデルの 3 条件(Welch-Satterthwaite の適用可否 / 有限自由度の入力が独立であること / 出力分布が正規または t で近似できること)と 非線形モデルの 5 条件(最良推定値の近傍で連続微分可能 / 適切な次数の全微分で 成立 / 高次項に関わる入力が独立 / その分布が正規 / 落とした高次項が無視できる) で、「感度が全部 0」「区間が定義域を出る」という判定手順は書かれていない。 ここで実装したのは、その条件が破れたときに観測される形のほうである —— 停留点は高次項が支配する特殊例、負側への張り出しは正規近似の破綻の現れ。
- L1062 (ja) — ★停留点 = 不確かさのある入力の 1 次感度がすべて0(高次項が支配する)。 感度が非 0 なのに分散が 0 なのは、相関による厳密な打ち消し (X1 = X2 で Y = X1 - X2)で、u = 0 が正しい答え —— 妥当として note を付ける。
- L1073 (ja) — ★破綻は警告でなく構造で返す(警告は握りつぶされる/ログに消える)
- L1104 (ja) — ★ NaN は
nu <= 0 をすり抜け、下の isfinite で「無限大」扱いになっていた (dof=[4, nan] で nu_eff 16 = 自由度を水増しし k を小さく)。欠測は拒否する。
- L1121 (ja) — ★規格は「nu_eff が整数でなければ次に小さい整数へ切り捨ててから t を引く」 ことを要求する(安全側に倒すため)。16.64 のまま引くと k = 2.1132、 切り捨てて 16 で引くと 2.1199 —— 公表例題の 2.12 は後者。0.3 % の差だが、 拡張不確かさは報告書に載る数字なので規格どおりに倒す。切り捨て前の値も
dof_effective に残す(どこで丸めたかが見えないと追えない)。
- L1151 (ja) — ★区間が定義域を出たら、それは測定の主張でなく近似の破綻。 比較損失(二乗の和)は構成上非負なのに、規格の例題では伝播則の 95 % 区間が [-96, +296]e-6 と負側へ張り出す。伝播則は出力を正規と見なすので 境界を知らない —— 知っているのは呼ぶ側だけなので、境界を渡されたときに 限って検査する(既定で勝手に 0 を下限と仮定はしない)。
- L1530 (ja) — ★”no spread” is not “std == 0.0”. A column holding one repeated value leaves rounding dust behind: 4.2 stored 200 times gives std = 1.3e-14, not zero (measured). Dividing by that dust amplifies it into a distance of nonsense, and the absolute test never fires. Put the floor at the relative scale of the column, below which a spread cannot be represented in the data itself.
- L1562 (ja) — ★ std = 1 alone does NOT make a flat feature “contribute nothing”: a new observation that leaves the flat value is scored in raw units, so the same physical data in mm vs um gave MD 1.73 vs 1732 (2026-10-07 review). Zero its row and column of the inverse correlation instead — then its z drops out of z’ R^-1 z whatever the new value is.
- L1673 (ja) — ★A unit space given in part is the dangerous case: the missing piece would be silently estimated from the very data under test, so a drifted batch would score itself as normal. Refuse instead.
specops.py
- L811 — ★ 这是一个同时依赖染色与成像系统的值,并非万能常数——若在自家载玻片上定量,请拍单染载玻片并用 :func:
stain_vectors_from_patches 重新测量。
- L843 — ★ 第 3 根是“余量”。仅 2 根时 2x3 无逆矩阵,用伪逆则残差会被静默分配给这 2 根。立起正交的第 3 根,把无处可去的密度汇集到那里(=日后可作为残差读取)。
spectralrad.py
- L576 (ja) — ★既定の溶融石英(SILICA、Malitson の分散式)は材料表に k が無く、厚さは効かない —— 内部の吸収を入れたいなら k を持つ硝材の名前と厚さを渡す(材料表の glass の類)。
studio.py
- L349 (ja) — ★2026-10-03: GIF を QPixmap で読むと 1 コマ目しか出なかった(例の図の 1/4 は掃引 GIF)。QMovie で回す。
- L358 — ★ 直接右键点击图本身(用户 2026-09-06:“若能右键把作为图显示的东西复制到剪贴板就好了”)。这是本 repo 的 Studio UI 规约——显示系也须能从右键完成一整套。可与下方按钮列做同样的事(不要二者取其一)。
- L1550 (ja) — ★2026-10-03: (2, h, w) を “color” と判定し、描けずに前の画像が残っていた。
-
| L1560 (ja) — ★2026-10-03: 複素数は虚部を黙って捨てた min/max を出していた。 |
z |
で数える |
- L1583 (ja) — ★2026-10-03: dict は中身に関係なく「輪郭 0 本」と表示していた。台帳の op(~1,700 本)の大半は {“distance”: …, “t”: …} のような表を返すので、全部「輪郭 0 本」に見えていた。 輪郭(
cs を持つ)以外は表として、欄ごとに何が入っているかを出す。
- L1594 (ja) — ★2026-10-03: 空の配列は「先頭の値」を取りに行って IndexError、4 次元以上は先頭の 1 値を スカラーとして見せていた(台帳の op を Studio から走らせて踏んだ)。
- L2187 (ja) — ★ヘルプの「開けるファイル」表の正本(2026-10-03、ユーザー指摘「ヘルプにも機能として書いておいたほうがいい」)。 各行 = (分類キー, 何で開くか, 拡張子, 補足)。文字列は英語 =
tr のキー。拡張子は上の定数から引くので 定数に足せば表にも出る。表から漏れた拡張子・分類と違う行は tests/test_studio_dragdrop_formats.py の門が落とす。
- L6430 (ja) — ★2026-10-21: 走っている/終わりかけの実行ワーカーを静止させてから閉じる。QThread が 走ったまま親ごと破棄されると Qt は abort し、CI では「全件合格のあと exit 134」になる。
- L6987 (ja) — ★順位(2026-09-19、GenSpark 第 10 報 N17): 「canny」で先頭に edges_color(説明文に canny を含む)が 来て、Enter で挿入する op を取り違えやすかった。名前の完全一致 → 前方一致 → 名前に含む → HALCON 名 → 説明文だけ、の順に並べる(同順位は登録順のまま)。
- L9254 (ja) — ★fallback は画面に出す(2026-09-19、GenSpark 第 10 報 N16): グレー画像に edges_color(color 入力)を Run once すると、ライブラリは台帳に記録して sort の既定値を返すが、GUI は「ran … once」としか 言わなかった。結果の窓には既定値が映っているので、それを結果だと思わせてはいけない。
- L10327 — ★ 图的承接盘。示例经
examplefig 往此处写 PNG。不传环境变量的运行(CLI)中一张都不写,故只有从画廊运行时才出图(示例的数值与速度不变)。
- L10483 — ★ 图的承接盘。示例经
examplefig 往此处写 PNG。不传环境变量的运行(CLI)中一张都不写,故只有从画廊运行时才出图(示例的数值与速度不变)。
- L11360 (ja) — ★実行キー(F5 / Ctrl+Return / Ctrl+R)は「いま書いてあるものを走らせる」(2026-09-19、GenSpark 第 8 報 N13): Program に未適用の編集があるのに実行キーを押すと古いパイプラインが走り、画面は 「● unapplied edits」のまま何も変わらなかった(Xvfb + xdotool の実測、s8 → s9 が同一画面)。 先に Apply し、Apply が通らなければ(構文エラー等は Program の状態表示に出る)走らせない。
- L12260 (ja) — ★パスで渡すと sim_source は拡張子 .xml の時だけファイルと読み、.urdf / .mjcf はXML の文字列と 取り違えて「XML parse error」になった(2026-10-03 のテストで発見)。モデルはここでパスから作る。
- L12333 (ja) — ★2026-10-03: 3DGS の学習結果(.ply に f_dc/opacity、または .splat)は、以前は普通の点群として 色無しで開いていた。ガウスの中心を 0 次の球面調和の色で出す(不透明度 5% 未満は落とす)。 楕円体の描画ではなく中心の点 —— 形を見る用(splat の見た目そのものは gs_render)。
- L12336 (ja) — ★2026-10-03(ユーザー「Physical AI で使われるデータ形式も読んで表示」): glTF / LAS・LAZ / MJCF・URDF。 読み手は既存(meshio_opt / sim_source)で、依存は任意(無ければ pip の名前つきで断る)。
- L13825 (ja) — ★2026-10-03(ユーザー「画像をドラッグ・アンド・ドロップして見れる」「Python スクリプトも D&D で開ける方が便利」): 以前は 1 本目しか見ず、.py は「未対応」だった。種類ごとに全部さばく: 画像 1 枚 = 入力として読む(従来どおり)、2 枚以上やフォルダ = 画像ビューアで並べる、 .py = Python エディタのタブ、.json = パイプライン。
- L13844 (ja) — ★モデル + qpos 軌跡 (T, nq) を一緒に落とすと再生(nq が 3 や 6 だと点群と見分けがつかないので、 モデルと一緒に落とされた .npy は形に関係なく軌跡として読む)
- L14886 (ja) — ★2026-09-20(GenSpark 第 43 報 N154):
fullseye-studio --help が表示の無い Linux で SIGABRT。QApplication を作る前に –help / –version を答え、表示が無ければ Qt を起こさず 1 文で止まる(abort は説明にならない)。
studio_result.py
- L48 (ja) — ★2026-10-04: bool の配列(占有格子など、台帳の op が返す)は np.round が bool へ書き戻せず落ちた —— bool はそのまま二値
superquadric.py
- L182 (ja) — ★2026-10-07: 0 点の平均残差は 0/0(NaN を guard が置き換えていた)
tacsim.py
- L385 (ja) — ★既定の探索半径は窓の縁まで(双線形 ±0.5 px の余白に 2 px)。2026-10-05 までは窓の半分の半分(0.5 × 縁までの距離)で 打ち切っていて、201 px の窓では 50 px で止まり、半径 61 px の実機の接触を 49 px と答えた(tacscalib の門 12: −12.9 px)。 tacsim の合成(256 px・Hertz)は接触が窓の 1/4 より内側なので、直しても結果は 1 桁も変わらない。
- L422 (ja) — ★2026-10-07: 窓の端までの距離は中心から測る(原点 = 窓の中心と仮定していて、X・Y・中心を +8 mm ずらすと δ が 11 % 縮んだ)
- L506 (ja) — ★2026-10-07: a0 が 20 % 超ずれると黄金分割が区間の端 0.8·a0 / 1.2·a0 をそのまま返していた。端に張り付いたら その端を新しい a0 にして画素の選び(縁の除外の輪)ごとやり直す。8 回で内側に収まらなければ ValueError
tests/conftest.py
- L28 — ★ 把 Studio 的设置在整个会话内逃逸到一次性 ini。 # ————————————————————————— #
QSettings("Fullseye", "Studio") 会写入原生存储库(Windows 上为注册表 HKCU\Software\Fullseye\Studio)。我们此前把隔离放在各个测试文件里,故被遗漏的文件污染了用户的真实注册表。2026-09-05 的审计确认了实害:10 个 recent_files 中有 8 个是 pytest 的临时路径,system\operator_timeout_ms 等实值也残留着。(隔离只在 3 个文件中的 2 个里,test_studio_params.py 是素通的。)不再逐个添加,而是作为会话 autouse 在此只放一个。环境变量是 studio._settings() 唯一查看的入口,故此举覆盖全部测试。
- L44 — ★ 需要 optional backend 的测试的声明。 # ————————————————————————— # CI 的注记长期写着“不安装 torch/kornia(对应测试 graceful skip)”,但 2026-09-05 的实测显示那并非事实——目标测试并未 skip,而是以
ImportError: this operator needs the optional 'torch' backend 失败(14 件)。只有注记,却没有用机器核实它的机制。此处把声明汇入单一入口。目标是双向:* 无 backend 的环境 → skip(让注记成为事实)* 理应有 backend 的环境 → 不许 skip,令其失败(FULLSEYE_REQUIRE_OPTIONAL=1。CI 的 py3.11 作业会立起它)只有单向时,真正的回归会悄然化为 skip(与 feedback_failsoft_hides_permanently_dead_ops 同形)。
- L192 (ja) — ★2026-09-14 追加。ここまで探針バンクは 6 sort しか無く、901 op のうち 151 本 (16.8 %)が契約ゲート 3 本(例外を投げない / 非有限を出さない / 決定的)を 一度も実行されていなかった ——
PROBELESS_OPS_BUDGET = 151 というラチェットで 本数だけ凍結し、「本来の直しは BANKS を全 in_sort へ広げること」と自分で書いて あった。その本来の直しをここで入れる。 形の出どころは推測ではない: backends_bridge._EMPTY_OF が 12 sort すべての 正準の最小値を宣言しており(そこが sort の定義そのもの)、problems.py の _points_stack / _signal_stack などが実データの作り方を持っている。 各バンクは既存の作法に合わせ、普通の値・定数 0・定数 1・退化形を混ぜる (定数と退化形が「走った」と「意味のある出力」を分ける —— [[feedback_ran_is_not_meaningful_output]])。 ————————————————————————— #
- L215 (ja) — ★点群は連結なものと非連結なものの両方を置く。
tb_geodesic_distances が 不達を inf で表すのは契約どおりで、ops.NONFINITE_IS_MEANINGFUL に 「1.0 に潰すと『届かない』が『近い』に化ける」と宣言済み。 ここで一度 normal をわざと連結にして有限性ゲートを緑にしかけたが、 それは欠陥を隠す方向だった —— 直すべきは門が台帳を見ていないこと。 normal は橋でつないだ現実的な形、two_clusters は非連結を撃つ探針。
- L282 (ja) — ★特異行列は必ず置く。 一度ここから外しかけたが、それは誤りだった ——
tb_mat_cond が特異行列で inf を返すのは契約どおりで、ops.py の NONFINITE_IS_MEANINGFUL に「厳密に特異な行列は s_min=0 なので inf が 正しい答え。有限に潰すと『十分に良条件』と読めてしまう」と既に宣言済み だった。落ちていたのは op ではなく、有限性ゲートがその台帳を見ていない こと。探針を削って緑にするのは、欠陥を隠す行為。 (同じ註に 2026-09-05 の教訓が書いてある ——「自分の probe では特異行列を 作っていなかったので tb_mat_cond を取りこぼした」。探針から外すのは その取りこぼしをわざと再現することになる。)
- L400 (ja) — ★新規(2026-09-14): ここまで探針が無く、契約ゲートを一度も通っていなかった 5 sort = 101 op。残る 6 sort(video / qimage / cimage / lightfield / beatcube = 50 op)は形が複素・4-D で退化形の設計に手間が要るため、 一度に全部入れて切り分け不能にしないよう次の段で足す。
- L408 (ja) — ★第 3 段(2026-09-17): 戻りの橋
feature_to_img が入るまで、feature を 入力に取る op は 1 本も無かった(作る op は 125 本ある)。門が「探針の 無い op が 1 本に増えた」と正しく落ちて教えた。
- L453 (ja) — ★2026-10-07: ここに
return があり、上の docstring(sort 既定の帯を捨てない) に反して override のある 10 op は sort 既定の帯を一度も通っていなかった。 sort 既定は「拒否が明示の fail-closed で記録される」ことの検査として通す (test_op_contracts.KNOWN_FALLS_BACK_ON_EDGE に by-design として載る)。
tests/test_abi_apply.py
- L78 (ja) — ★target dir は 別に切る。最初は
target/release(既定)に建ててそこから直接ロードして いたが、同じプロセスで後に走る test_rust_abi_parity.py が cargo build --release (feature なし)で同じ DLL を書き換えようとし、ロード済みでロックされているので ビルドに失敗 → 36 件が黙って SKIP になった([[feedback_zero_findings_may_mean_never_executed]])。 建てる場所を分け、ロードは tmp へのコピーから行う。
- L49 (ja) — ★このパーサは「タグから最初の
; まで」を宣言とみなす。だからタグと 宣言のあいだに ; を含む散文があると、宣言が見つからず collection 中に 死ぬ —— そして pytest はファイル 1 つの collection エラーで スイート全体を中断する(2026-09-14 実測: Interrupted: 1 error during collection で 12,000 件が 1 件も走らず、それでも runner の exit code は 0)。 [[feedback_test_import_kills_collection]] と同じ族なので、何が悪くて どう直すかをここで言う。黙って「malformed」とだけ言うと、壊した本人が ヘッダの書式規則に気づけない。
- L234 (ja) — ★2026-09-14:
FsValueError を足した。それまで例外は 2 種しか無く、 種の違う失敗が同じ status に潰れていた —— 逆さの区間は契約では FS_E_INVALID_ARG なのに FsTypeError(= FS_E_TYPE)を投げていた。 差分テストが「どちらも拒否した」までしか見ていなかったので素通りした。
tests/test_abi_signatures_match.py
- L82 (ja) — ★
[A] + [B] * 3 のような式で書かれた argtypes がある。最初この形を 数えられず fs_measure_all を「1 引数」と誤読して門が 3 件赤になった —— 門のパーサが弱いのを実装の欠陥と読まない。 行末までを 1 宣言として 取り、[...] の各塊の要素数に * N の倍数を掛けて合計する。
- L180 (ja) — ★
cl に .h を直接渡してはいけない —— MSVC は拡張子で言語を決めるので 「ソースファイルの種類は認識できません」と警告だけ出して rc=0 を返す。 検査が 1 行も走っていないのに緑になる、最悪の形 ([[feedback_ran_is_not_meaningful_output]]。2026-09-14 に実際そう読みかけた)。 #include する小さな .c / .cpp を作って /Zs(構文検査のみ)を掛ける。
- L190 (ja) — ★引用は 1 段も挟まない。
subprocess にリストで渡すと Python が 引数を再クォートし、内側の " が \" に化けて cmd に届く (実測のエラー: '\"C:\Program Files...\vcvars64.bat\"' は認識されて いません)。バッチファイルに書き出して、それを叩くのが確実。
tests/test_acquire_contract.py
- L45 (ja) — ★「開く実装が在る」と「入っていないときに何を入れればよいか言う」は別。 上の門は opener の存在を見るが、SDK が無い機械で呼ばれたときに何と言うかは 見ていなかった。2026-09-25 に接続の 3 層(protocol / image source / driver)を 揃えたとき、
comm は cclink に「install ‘None’」と言い、device は 9 driver に 入口すら持っていなかった。同じ問いに答える層は、同じ約束をすること。
- L166 (ja) — 16.003663…**。★「16 倍」と書いて落ちた —— 器の幅と有効ビットの比は 2^4 ではなく (2^16-1)/(2^12-1) で、1 桁目から違う。
- L300 (ja) — ★「次は ## デバイス制御」と決め打ちしていたため、あいだに節を 1 つ足した だけでその表の行まで backend 行として読んでしまった(2026-09-24)。 節の終わりは次の見出しであって、特定の見出しの名前ではない。
- L323 (ja) — ★「見つける」は「開く」とは別の問い。1 列にまとめていたせいで、 開けるのに一覧に出てこない zed / kinect が表では ✓ のままだった (2026-09-25)。列の中身は AST から数えた実際の分岐と突き合わせる。
- L437 (ja) — ★ここまでの門は「acquire が持っている綴り」からしか数えていない。規格の全数を 分母に置くと、そもそも知らない形式が見つかる —— 実際これで 10 bit 非詰めの Bayer 4 形式が丸ごと抜けていた(2026-09-24)。台帳は EMVA が無償公開している 「GenICam Pixel Format Names and Values」の単板 59 形式。
- L484 (ja) — ★最初ここに「詰め形式は容器 = 有効」と書いて、この門に捕まった。実際は 2 通りある: (a) 10/12/14 bit の非詰めが 16 bit 容器に入る場合と、 (b) grouped(GigE Vision 1.x の
Packed)の 10 bit が 12 bit に 入る場合 —— 2 画素 = 3 バイトなので 1 画素あたり 12 bit になる。 真の lsb packed(p)だけが容器 = 有効。
- L516 (ja) — ★機能名はベンダの名前ではなく規格の名前なので、1 本の語彙表で GenTL を出す 全ベンダを覆える。だからこの層は「どのベンダの SDK を入れたか」と無関係に 検査できる —— 模擬ノードマップで足りる。実機が無いことは言い訳にならない。
- L678 (ja) — ★SDK のバッファを指したまま返すと、次の 1 枚が前の 1 枚を書き換える。 例外は出ない —— 絵だけが入れ替わるので、連写を保存して初めて気づく。 実機が要る経路なので実行では確かめられない。ソースで確かめる。
- L716 (ja) — ★複製が要らない backend と、その理由。黙って外さない。
- L772 (ja) — ★SDK を採点したのと同じ物差しで自分も採点する。違う物差しで測った数を 並べると「SDK より厚い」が意味を失う。しかも自己申告にしない —— 各軸が どの入口で満たされているかを実在する名前で名指しし、門がそれを引く。
- L821 (ja) — ★列挙軸の一番大きな穴はここだった。
_enumerate("genicam") は [] を返していて、 GenTL を出す全ベンダを覆える唯一の経路だけが列挙できない状態だった。 GenTL 1.6 が「プロデューサのインストーラは GENICAM_GENTL{32/64}_PATH に自分を 足す」と決めているので、こちらはその変数を読めばよく、ベンダごとの表は要らない。 実機も SDK も無しで検査できる —— 変数と .cti という名前のファイルがあればよい。
- L875 (ja) — ★
__all__ は「何を公開したか」の一次情報(dir() は環境で変わる)。だから 本体が増えたのに __all__ が増えない、という遅れは静かに起きる —— 実際に 2026-09-25 まで 7 つ足りていなかった(追記のつもりが当たっていなかった)。 門は台帳側でなく本体側から数える。
- L947 (ja) — ★
opencv backend が開くのは UVC の装置。その規格が制御の名前と、いくつかは 単位まで決めている。単位が SFNC と違うので、換算を往復で確かめる —— 100 倍の係数を書き忘れても例外は出ず、露光だけが狂う。
- L1162 (ja) — ★門そのものを呼んで、本当に落ちることを確かめる(式の真似ではなく)。
tests/test_annotate_bold_italic.py
- L59 — ★ 叠打只会横向变粗。上下变粗的描边会把和文字的内白填满(2026-09-09 实测:11pt 的“量 值 面积”变成了黑块)。
tests/test_aoi.py
- L145 (ja) — ★平均は保たれない(被写体と感度に相関があるとずれる)。実測 8.9 %。
tests/test_api.py
- L226 (ja) — ★台帳をまるごと外すと「層が現れない」で落ちる —— この門が見張る事故そのもの。
tests/test_astrostack.py
- L1053 — ★ 2026-09-08:新增了第 3 个返回值 vote_margin(第 2 高的峰 / 第 1 高)。若为星野,峰只有一个,故应当小——这一点也在此固定。
tests/test_backends_typed.py
- L71 (ja) — ★2026-10-07:
or True で無効化されていた。実測 936 op / 重複 0 —— 主張は成り立つので門に戻す
tests/test_backends_typed_liveness.py
- L57 — ★ 就这一件而言,记录有3 处——此处、
gen_op_figures.DOMAIN_MISMATCH,以及 op 自身 0/60 的实测。即便如此,“已注册却一次也不运行”的状态仍在持续。知道某事与在判定中使用它是两回事(KNOWN_ISSUES §42)。
- L129 (ja) — ★2026-10-07: 探針を作れず
_live_report が検査せずに飛ばす tb_* op の台帳 {op: 理由}。 以前は skipped を返すだけで誰も見ておらず、探針の無い op は生死の検査を黙って抜けた。
- L725 (ja) — ★2026-10-07: 例外で抜けた組は検査していない —— 何組を実際に見たかに下限を置く (実測 159 op × 5 入力 = 795 組、例外 0)。
tests/test_blob2d.py
- L443 — ★三个物体必须都是不同的形状。把相同形状排列起来的种子会让 circularity 和 holes 都返回相同的值,从而漏掉「无论转哪个旋钮都返回相同数值的 op」。
tests/test_caltab.py
- L121 — ★门是否触发依赖于环境,所以不作断言。只检查值未被隐藏地返回。
tests/test_capabilities.py
- L167 (ja) — ★2026-09-24 に見つけた穴: 既存の門は frontmatter の
ops: に書いた名前が実在 するかは見るが、本文のコードは一度も実行していなかった。だから measure_pos(img, row=32, col0=0, col1=127)(実際の引数は測定線ハンドル)、 fs.frame_align([a, b])(実際は (reference, frame) の 2 引数)、 fs.ledger.blob_count(mask)(blob_count は台帳ではなく 2-D の進化 op)が 3 本とも走らないまま出荷されていた。名前の実在と呼び方の正しさは別物で、 前者だけの門は後者に構造的に盲目([[feedback_registered_only_gates_miss_unregistered]])。 走らないことが正しい例もある —— 利用者自身の写真や校正板の角点が要るもの。 それは理由つきで名指しする。名指しの無いものが 1 本でも落ちたら赤。 「ファイルが無いから仕方ない」を既定にすると、呼び方の誤りがそこに紛れる。
- L183 (ja) — ★2026-09-25:
io は例のなかで fs.open_driver("io-memory") から開く ようにしたので、免除の理由はロット画像だけに縮んだ。
tests/test_chain_type_contracts.py
- L222 (ja) — だけなので、格子も積分時間も最小で足りる。★二重スリットは「縞が 3 本 入らない」と fail-closed するので、スクリーンの幅と分離を検証済みの 組み合わせ(550 nm / 200 um / 200 mm / 5 um 画素)で渡す。
tests/test_ci_wheel_check_paths.py
- L68 — ★不看 returncode。这项检查的对象是参数的解析,而不是 wheel 的内容。内容的判定依赖于环境 —— 实测 2026-09-05:在通过 PYTHONPATH 暴露源码的环境中,由于脚本会把 repo 根目录从 sys.path 移除,部分模块无法 import 而报 NG(在 pip install 的环境中不会发生)。因为这里看了 returncode,在 Linux 上这项检查以「路径解析问题」的形式落败。
tests/test_collection_sizes.py
- L65 — ★OPS3D 是 {op 名: 元数据 dict} 的扁平表。用
sum(len(v) for v in values()) 计数会得到各 op 元数据键数的总和(2,492),差点把一个没有意义的数字刻进台账(2026-09-08,在写入前查看结构时发现)。
- L85 (ja) — ★2026-09-25 追加: 通信の名簿(
comm.protocols)は数えていたのに、 駆動の名簿は数えていなかった。接続の 3 層(protocol / image source / driver)のうち 1 つだけ見ていない状態で、 driver が 1 行消えても誰も気づかない。
- L91 — ★2026-09-08 新增:两个用于积累说明的台账。说明最容易悄悄减少,所以在这里计数(docs/CAPABILITIES.md 与 docs/HARDENING.md 的来源)。
tests/test_comm.py
- L135 (ja) — ★1 本だけ見る門は、1 本だけしか守らない。 ここには長いあいだ
test_cataloged_protocol_gives_install_hint が在り、ethernet-ip の断り文句 1 本だけを見ていた。その陰で cclink は 「install ‘None’ and use the None client directly」と答えていた —— pip 名も import 名も持たない 1 行が、場合分けの外に落ちていたからである ([[feedback_one_probe_input_is_not_coverage]])。全数で見る。
- L141 (ja) — ★「相手が居ない」は「扉が無い」ではない(device 側で先に踏んだ): native な protocol は本当に繋ぎに行くので、
OSError は扉が在る証拠として通す。
- L209 (ja) — ★捕まえられない例外は、無いのと同じ。
fullseye.open_channel は facade に 在るのに、それが投げる CommError は 2026-09-25 まで facade に無く、利用者は 内部モジュール名 comm を import しないと except に書けなかった。 1 つずつ足すのではなくクラスごと閉じる —— __all__ が公開の一次情報で、 そこに在って facade に無い名前は、書いた本人しか使えない。
- L214 (ja) — ★免除は理由つきで名指しする。
comm.register(protocol の登録)を facade に 出したら、既に在った fullseye.register(点群のレジストレーション op)を 上書きした —— 出荷していれば利用者の点群処理が静かに別物になっていた (2026-09-25、既存の例の門が捕まえた)。同名は譲らず、内部名で使う。
tests/test_connectivity_doc.py
- L96 (ja) — ★ここは長いあいだ
あり(= その lib が import できるか)の欄で、 機械ごとに違うので門が見られなかった —— 誰も検査しない欄が表に 1 列在る状態だった(しかも中身は kind == native の写しで、pyserial を 入れた機械では嘘になる)。2026-09-25 に「実装」(Fullseye 自身が開けるか) へ替えた。版で決まるので、どの機械でも同じ答えになる。
- L168 (ja) — ★入口の名前は実装の台帳から引く。表に手で書いた名前が古くなると、 「証拠が消えた対応済み」になる。
- L213 (ja) — ★門を壊して確かめる —— 「通るだけの門」と「何も見ていない門」は区別できない。 (節, 壊し方, 期待する文言)。壊すのは表の側で、判定は本物の関数を呼ぶ。
- L222 (ja) — ★実際に踏んだ形 —— 名簿には載るが開けない driver を「開ける」と書く。
- L352 (ja) — ★名簿が「在る」と言うのと、開けるのは別の問いだった。2026-09-25 まで
capabilities() の available 1 欄が両方を兼ねており、dynamixel_sdk を入れた 機械では available: True なのに open_driver("dynamixel") は「その SDK を直接 使え」と断った —— 読んだ人は「対応済み」と受け取る。acquire は既に implemented / available を分けて持っていたので、先に正しかった層の語に 合わせた。ここではその欄が実際の口の振る舞いと一致することを見る。
- L73 (ja) — ★2026-10-07: 0 サイズ入力で本体が NaN/Inf を出し、guard が記録して置き換えている op。
test_no_op_returns_a_non_finite_value_for_an_empty_input は guard 越しの戻り値だけを 見ていたので、置き換え後の有限値しか見えず、この 16 op の 0/0 を一度も捕まえていなかった (docstring の「0 除算の検出器」は空振りしていた)。台帳(source=output)で数える。 いずれも空配列の縮約(平均・比・最大)を素直に書いた形 —— 明示の拒否にするのが筋(bug-suspect)。
- L78 (ja) — ★2026-10-07 同日に 16 → 0。内訳: 9 op(area_frac / gray_histo_abs / intensity / sk_blur_effect / hx_estimate_* 4 本 / tb_superquadric_residual)は本体の 0/0 を明示の ValueError に、 残る tb_* 7 本は本体は既に正しく拒否していて、橋の後始末
backends_typed._fallback が 空配列の平均 = NaN を返していた(空なら 0.0 に直した)。器は残す —— 次に見つけたらここへ。
- L89 (ja) — ★スカラに「0 要素」は無い(2026-09-17、戻りの橋
feature_to_img で feature が初めて入力になったときに気づいた)。この門が探している のは 0/0 なので、空配列の代わりに分母を 0 にする値 0.0 を渡す。
- L147 (ja) — ★2026-10-07: 例外で抜けた op は戻り値を検査していない —— 母数が黙って縮まないよう下限を置く
- L208 (ja) — ★2026-10-07: 例外で抜けた組は検査していない —— 下限(実測 1738 / 1738)
- L244 (ja) — ★2026-10-07: 母数の下限。注意 —— guard は FloatingPointError も握って fallback にする (実測 36 op)ので、ここの FloatingPointError 枝には guard 越しでは来ない。 0/0 が外へ出る op は test_no_op_returns_a_non_finite_value_for_an_empty_input の KNOWN_NONFINITE_ON_EMPTY_INPUT(台帳の source=output)が捕まえる。
- L306 (ja) — ★2026-10-07: 以前は呼ぶ前に数えていたので、全 op が例外で抜けても n > 700 で緑だった
- L315 — ★这里棘手的是,这个测试所守护的缺陷在 Windows 上不会重现。实测 2026-09-05:在 Linux(Ubuntu 24.04 / py3.12 / PyPI wheel)上 3 个 op 对退化输入 SIGSEGV。把相同的输入送到 Windows 上一个也没崩溃。所以「本地是绿的」不能作为依据,必须保持在一种能在两个环境上验证台账是否正确生效的形式。 ————————————————————————— #
- L322 — ★
ops.NATIVE_CRASHES_ON_DEGENERATE 的对照。它必须与本体 1:1 一致。只改一边就会落败 —— 从本体删除,或往本体添加,都要求在这里同时改写(= 由人确认意图)。为什么需要对照:在门的变异测试(2026-09-05)中,即使从本体删除 cv_cc_count,检查「台账里的 op 都拥有关卡」的测试依旧通过。从台账删掉的 op 也会从循环的对象中消失,所以整条检查路径连同它一起消失。所守护的 SIGSEGV 仅限 Linux,在 Windows 上碰巧会返回像样的值,所以最后一道防线也不起作用。只有与独立信息源(这一组)的等价,才能在 Windows 上也捕捉到两个方向。与 test_the_two_nonfinite_ledgers_agree 同形。
tests/test_demops.py
- L440 — ★返回始终是 (N, 3)。即使传入标量,得到的也是 (1, 3) 而非 (3,) —— 因为台账声明 points = (N, 3)(2026-09-06,fuzzer 的 TYPEMISS 暴露了不一致,于是把实现对齐到声明)。
- L755 (ja) — ★ 旧日本測地系に近い 3 パラメータでは、同じ緯度経度が地上で数百 m 動く
tests/test_derived_headlines_2026_10_07.py
- L58 (ja) — ★2026-10-07(CI で判明): registry の op 数は入っている backend で変わる(py3.10/3.12 の CI は 910)。 見出し(上)は同梱の名前表だけで決まるので常に照合し、registry 行は完全な registry の環境でだけ照合する。
tests/test_device_open_driver.py
- L36 (ja) — ★「相手が居ない」は「扉が無い」ではない。 この門を最初に書いたとき、
io-modbus が ConnectionRefusedError で落ちて 1 件挙がった —— が、それは 「PLC に届く口が在って、線の先に誰も居なかった」ということで、口が無いのとは 正反対である。だから「この install が実際に開ける driver」からの OSError は通す。一緒くたにすると、門は CI に PLC を繋げと要求し始める —— 繋がりようの ない要求をする門は、やがて外される。
- L83 (ja) — ★pip も import 名も持たない driver は名簿に無い(在れば、その行が 「何も分からない行」なので、ここで落ちてよい)。
tests/test_device_register_driver.py
- L135 (ja) — ★台帳の門は
len(device.drivers()) を数える —— 登録は runtime でそこに 入るので、後片付けを忘れた試験が 1 本あるだけで台帳の門が落ちる (しかも落ちるのは別のファイルなので、原因が遠くなる)。
- L142 (ja) — ★★数だけ見る門は差し替えに盲目。
dynamixel を自前のもので置き換えても 行は 12 のままなので、台帳の門は緑のまま通る。中身(何が implemented か) まで見て初めて、登録が残っていないと言える。
tests/test_docs_index_numbers.py
- L37 — ★op 集合随环境变化(Linux CI 没有 torch/kornia/mahotas/xfeatures2d,共 859 op;本地是 885)。把本地生成的文档与活的 registry 比对的检查,只有在满配环境下才有意义 —— 与 test_opdocs 相同的约定,未齐全就 skip(原因里会给出缺少的 backend 名)。在 2026-09-07 的 CI 上,有 22 项在这里落败。与环境无关的检查(文件的存在、内容的量、图的存在)照常运行。
tests/test_docs_index_reachable.py
- L42 — ★op 集合随环境变化(Linux CI 没有 torch/kornia/mahotas/xfeatures2d,共 859 op;本地是 885)。把本地生成的文档与活的 registry 比对的检查,只有在满配环境下才有意义 —— 与 test_opdocs 相同的约定,未齐全就 skip(原因里会给出缺少的 backend 名)。在 2026-09-07 的 CI 上,有 22 项在这里落败。与环境无关的检查(文件的存在、内容的量、图的存在)照常运行。
- L80 — ★只看 Markdown 语法是不够的。
docs/GALLERY.md 在表格中有 14 处使用 <img src="...">,朴素地扫描 ]( 一个也看不到(在 Codex 的对抗性审查中发现,2026-09-06)。也要看原始 HTML。
- L189 — ★允许标记重复,就会让一个旧表格残留下来却依然变绿。生成器只改写第一个 start–end,所以第二个会永远保持旧的并持续被发布(Codex 的对抗性审查,2026-09-06)。
- L210 — ★以前用「有 20 行且能看到 4 个维度名」就通过,但那样即使掉了几百个 op 也会变绿(Codex 的对抗性审查,2026-09-06)。要与每个维度的实数一个不落地核对。
- L249 — ★输出差异在哪里。不输出的话,就无法追踪那种只在整套测试里才落败的顺序依赖问题(如 registry 污染)。
- L312 — ★只有件数和名字,类型契约(in_sort/out_sort)、类别、HALCON 对应、tier 都会保持陈旧却变绿(Codex 的对抗性审查,2026-09-06)。RAG 会读 in_sort/out_sort 来挑选类型能连接的 op,所以那里陈旧就会自信满满地提出连不上的链。要连内容一起核对。
- L400 (ja) — ★日本語版だけを見ていた門を 6 言語に広げた(2026-09-16)。
local_std を足した ときに ja/en/ko/tw/zh が 1,947 のまま落ちたが、de は落ちなかった —— ドイツ語の桁区切りはピリオドで 1.947 と書くため、"{:,}" では一致も 不一致も見えない。門が 1 言語にしか立っていないと、他の 5 言語は黙って腐る。
- L467 — ★检查产物「是否有内容」—— 只看一致的门,即使两边都为空也会变绿 # ————————————————————————— # 2026-09-06 的实测。低于它就落败(提高是自由的)。
tests/test_docs_no_local_paths.py
- L36 (ja) — ★区切りは 1 つとも 2 つとも書かれる —— JSON の中では区切りが二重になる。 一重の形だけ見ていたので 2026-09-25 に二重の形を丸ごと見落とした (最大の漏れが公開 JSON の 164 か所だった)。
- L39 (ja) — ★ここに綴りの例を書かないこと。この門は自分のコメントも読むので、 例として書いたパスがそのまま違反になる(実際に一度そうなった)。
- L41 (ja) — ★
e:\n のようなエスケープ列と LaTeX の q:\, は道ではない —— 区切りの次が n/r/t で語が続かないもの、道に使えない文字で始まるものは外す。
tests/test_dsp.py
- L341 — ★最大值是谐波:period / (1/f_max_bin) 落在整数附近
- L371 (ja) — ★どれも閉形式の真値を持つので、「動いた」でなく「理論値と合う」で検査する。 ————————————————————————— #
tests/test_dualxray.py
- L178 (ja) — ★探針で見つけた: Pb 50 mm の e^{-130} を正規化して「ふつうのスペクトル」を返していた
tests/test_dynsys.py
- L112 (ja) — ★残差の正体は burn-in 。短い burn での誤差は 3 倍以上大きい。
- L123 (ja) — ★r の列を1 本だけ選ぶ。横に幅を持たせると、隣の r の不動点が 別の柝に見えて r = 2.9 でも「3 本」になる(一度それで誤判定した)。
- L66 (ja) — ★mesh_to_voxel は points_to_voxel が optional の torch を要る。CI には torch が無いので 拒否の確認(上)だけ走らせ、通常入力の実行は torch のある環境に限る。
tests/test_example_names_do_not_shadow.py
- L46 (ja) — ★2026-10-07(同日): 範囲を 2 つ広げる。 # ————————————————————————— #
tests/test_example_scripts_run.py
- L48 — ★2026-09-09,在加入这个门后的第一次 CI 上,7 个在 py3.12 上落败(py3.11 是绿的)。CI 故意只在 py3.11 安装 torch / kornia / mahotas / opencv-contrib,其他版本不装。测试侧本已有名为
requires_backend 的声明机制,但跑示例的门却没有它 —— 机制存在,和所有路径都经过它,是两回事。gallery2d_* 是「把该族的 op 全部跑一遍」的画廊,所以它的契约本身依赖于装了哪些 backend(它直写 op 名并与 registry 核对,缺一个就以「OPS 里多余」落败)。所以按族声明。剩下 2 个直接用 torch(fit_zernike / match_logpolar_z)。在满配环境(CI 的 py3.11,FULLSEYE_REQUIRE_OPTIONAL=1)里 skip 会变成失败,所以声明过多和漏声明两个方向都会落败。
- L87 — ★不传 PYTHONPATH(这个门的要点)。使用者不会设置环境变量。
- L126 (ja) — ★2026-10-07: 以前は全例を走らせていた。session fixture はセッションごと(CI のシャードごと・ xdist のワーカーごと)に作られるので、CI では 4 シャード × 3 版 = 12 回、全例を走らせていた (シャードあたり 21〜41 分、run 37474292595)。手元の -n 6 では 6 ワーカーがそれぞれ全例を WORKERS 並列で回し、最大 48 本が同時に走って単独 207 秒の quickstart が 600 秒を超えていた。 いまは (1) xdist のワーカーでは引かれた 1 本だけを走らせ、並列は xdist に任せる (2) それ以外(CI のシャード)では、このセッションに残ったテストの分だけをまとめて並列に走らせる。
tests/test_fallback_names_identify_the_op.py
- L60 (ja) — ★2026-10-07: 台帳は 256 件の環状バッファ。溢れると
fallbacks() は新しい 256 件しか返さず、 下の「名前が潰れていない」「実在の op 名」は一部だけを見て緑になる(実測 186 件・溢れ 0)。
tests/test_features_do_not_saturate_2026_09_26.py
- L82 (ja) — ★族は6 つ。対称な矩形だけだと、対称性で消える特徴(奇数次モーメント)や 穴を数える特徴(オイラー数)が原理的に動かず、「潰れている」と区別できない。
- L93 (ja) — ★どの族でも一定で、それが正しい op。理由つきで名指しし、下の試験が 「本当にまだ一定か」を確かめる —— 動くようになったら外させられる。
tests/test_fix_op_name_and_range_2026_09_02.py
- L75 (ja) — ★2026-10-07: [0,1] を外れるが、まだ
ops.UNIT_RANGE_IS_NOT_THE_CONTRACT にも載らず 正規化もされていない image op(所有者の判断待ち)。conftest.inputs_for が override の ある op にも sort 既定の帯を返すようにして見つかった。
- L78 (ja) — ★2026-10-07 同日に空になった:
tb_normals_to_egi(拡張ガウス像の計数、最大 48)は橋の出口で 総数で割って割合([0,1]、和 1)にした(backends_typed._egi_counts_to_fraction。公開関数 reprconv.normals_to_egi は計数のまま)。器は残す —— 次に見つけたらここへ。
tests/test_flyvision.py
- L328 (ja) — ★ The MTF identity is a small-footprint approximation and is NOT claimed
- L329 (ja) — ★ far from the optical axis: at ~35 deg elevation the measured transfer
- L330 (ja) — ★ already departs from exp(-…) by more than the on-axis tolerance. This
- L331 (ja) — ★ assert pins that hole so a future “curvature-corrected” resample has a
- L332 (ja) — ★ failing test to turn green rather than a silent regression to argue about.
tests/test_four_f_2026_09_26.py
- L202 (ja) — ★ナイキストのビンを 0 にしたので、この対称性は 1e-16 台で成り立つ
- L288 (ja) — この一覧に門がある種類。★
FOURIER_PLANE_KINDS に足したらここも足す。
- L383 (ja) — ★2026-10-07: 以前は finally で
sys.path.pop(0) していたが、読み込んだ PoC 自身が repo 直下を 先頭に足すので、pop で消えるのはrepo 直下の方で、examples/ がワーカーの終わりまで先頭に残った (event_camera の取り違えと同じ型の漏れ)。丸ごと保存して戻す。
tests/test_fslib.py
- L330 (ja) — backend 横断の一致 —— ★2026-09-14 に実際に壊れていたところ ————————————————————————— #
tests/test_fullseye_3dgs.py
- L78 (ja) — ★道具の有無と資産の有無は別。ここは mujoco の有無だけを見ていたので、 Menagerie が無い環境では
scene_registry.resolve() が返す None を掴んで TypeError になった。同ファイルの test_scene_resolution_via_registry は 既に資産の skip を持っており、作法が兄弟に適用されていなかった。
tests/test_gaits.py
- L99 (ja) — ★2026-09-14: ここは
resolve() の戻りを検査せず spec["xml"] を引いていた。 scene_registry が実在しない場面に None を返す設計(資産が無い環境では 正しい振る舞い)なので、資産チェックアウトが無いと TypeError で落ちる。 同じファイル群の test_fullseye_3dgs.py は既にこの skip 作法を持っていた —— 作法が兄弟に適用されていなかった ([[feedback_same_bug_class_recurs_check_siblings]])。
tests/test_gen_poc_viewer.py
- L366 (ja) — ★2026-10-30: 運動拡大の掃引は振幅を 40 倍にしても指標が 3.93 -> 3.97 で平らだった(64 px 用の読み出しを 160 px の動画に当てていた)。つまみを動かしても絵も指標も変わらないビューアは偽物なので止める。
tests/test_generative.py
- L66 (ja) — ★ head を変えると画布の幅も変わる(矢羽根の置き場が要る)ので、 2 枚を直接重ねることはできない。軸の長さで比べる。
- L84 (ja) — ★ std() は平均を引くので、定数でも 1 ulp 残る(実測 5.6e-17)。 「全部同じ値」を厳密に言うなら ptp(最大 − 最小)。
- L111 (ja) — ★ ptp なら厳密。本物の辺があれば 0.85 前後になる量なので、門は十分厳しい。
- L132 (ja) — ★許容を 1 つにまとめない。閉形式で厳密に出るものと、再帰で誤差が積もる ものを同じ物差しで見ると、どちらかの門が甘くなる。接触だけは深さ 5 の 再帰の末端なので相対 1e-5(実測 9.2e-07)。
tests/test_glassmirror.py
- L91 — ★与直觉相反:以为「铜比金红」,写了 cu[2] < au[2] 结果落败。就算按公开值,相对于 Au 的 R(450 nm) ≈ 0.40,Cu ≈ 0.56,蓝色是铜更多(= 金是更饱和的黄)。错的是这边的先入之见,而不是表。
- L175 — ★把波长作为第 1 参数的理由(台账的「首个是数据」约定)。以前把数组传给顶角会抛出裸的 TypeError。
tests/test_glyphops.py
- L256 (ja) — ★bbox は描いた後のインクから取る。PIL の text() は書体の ascent 分だけ 下げて描くので、指定した座標をそのまま bbox にすると字が縦にはみ出し、 無事な字まで「遠い」と出る(実測 0.058〜0.110、床 0.058)。
- L348 (ja) — ★ここで検査するのは 閉形式で言い切れること だけにしてある。 端から端まで(受理率・誤検出)の証拠は repo の外の実写 12 枚で取った (repo の外に置いた実写一式、正本 = glyph コーパスの curated/140)。 合成の場面を 1 枚こしらえて「動いた」と言うのはやめた —— 候補の生成は 局所標準偏差の分位点で切るので背景がざらついていることを要求し、四隅の 精密化は背景の勾配が小さいことを要求する。実写はその両方を満たすが、 素朴な合成(一様乱数の背景)はどちらか片方しか満たせず、合成で緑にすると 「合成に合わせた実装」になってしまう。
- L483 (ja) — ★比(中央値 ÷ 床)は環境で動く(Windows 3 書体 1.90 / CI noto-cjk 2.45)ので、 境にしないし、ここでも値を断言しない。載っていることだけ見る。
tests/test_graphinv.py
- L248 (ja) — 非正方の画像は形の検査で止まる。★正方の画像は重み行列と区別できない(全画素 > 0 なら 全結合として数える)—— 入力が配線であることは呼び手の責任で、op は形しか確かめられない
tests/test_halcon_named_shape_factors_2026_09_26.py
- L277 (ja) — ★同名なのに HALCON と別の量を返すもの。直す予定のものだけをここに書き、 「本当にまだ違う」ことを下の試験が確かめる(直ったら台帳から外させる)。
- L280 (ja) — ★2026-09-26:
elliptic_axis と diameter_region はここから外れた —— ユーザー 判断で「寸法を持つ特徴も HALCON と同じ画素値で返す」と決まり、量もスケールも 合わせたため(docs/KNOWN_ISSUES.md §51 は解決)。台帳を空にしても門は残す: 次に「まだ合わせていないもの」が出たとき、ここに名指しで載せる場所が要る。
tests/test_honest_summary_arithmetic.py
- L41 — 改成「没有就说明理由并 skip」—— ★2026-09-08 的 CI 在这里变红:把本地有的东西也当成 CI 里有,就只有本地变绿(与
feedback_gate_computed_a_verdict_then_discarded_it 同型)。
tests/test_imgforensics.py
- L1064 (ja) — ★2026-10-18: 以前は float の [0,1] をそのまま渡し、古い Pillow がバイト列を読み替えて黙って通していた (Pillow 13 で発覚)。本物の 8 bit に直してから JPEG を通す。
tests/test_kendama_combo.py
- L21 (ja) — ★2026-10-02: 以前は examples/ を sys.path の先頭に入れっぱなしにしていた。同じ xdist ワーカーで後から
import event_camera した test_sensor_sims が、ルートの event_camera.py でなく同名の examples/event_camera.py(デモ)を拾い run_event_demo が無いと落ちた(ワーカーへの振り分け次第で出る)。 PoC はファイルから直接読み、sys.path を汚さない。
tests/test_knob_b_options.py
- L41 (ja) — 歴史側で試す点。★0.5 を含める —— 0.5 は「まん中」として既定値に使われて いる(
api.apply の既定、studio の中央、保存済みプログラムの初期値)ので、 ここが新しい側に落ちると既定のまま呼んだだけで答えが変わる。 最初 b < 0.5 で切ったら、gaussian と HALCON 別名の一致検査まで割れた。
tests/test_ledger_contracts.py
- L55 (ja) — ★同日の 2 回目: 探針側の builder(
ledger_contracts.probe_builders)で 2,055 / CI 相当 2,019 に上がったので床も上げた(床を据え置くと、builder が黙って外れても気づけない)。
- L61 (ja) — ★空入力(h)と効かないノブ(f)の探針は同じ 1 回の探針に相乗りさせる (引数と結果を使い回す)。別モジュールで回し直すとスイートが 50 s 余分にかかる。
- L419 (ja) — ★2026-10-12 方針 A: 黙って値を返す op(zz_gap_silent)と生の例外(zz_gap_raw)も門になった。 「空なら空」と書いて値を返す op・書かずに ValueError で断る op は通る
tests/test_llmcore.py
- L48 (ja) — ★許容差を入れない。-inf の exp は厳密に 0 になる。
tests/test_mathops.py
- L518 (ja) — tier1 16 + complex 18 + construct 8 + wave 6 + dynsys 6。★ここは op を 足すたびに動く行なので、足した理由を残しておく(35 = 複素平面の 面 8 op、43 = 定理が門になる図 8 op、55 = 波動 6 + 力学系 6、59 = LU/QR/Cholesky/一般の固有値)。
- L1109 (ja) — ★極は標本に乗れないので偶数格子で(零点と違って値が数にならない)
- L1485 (ja) — ★数学の図はきれいなので、合っているかを誰も確かめない。ここでは絵を一度も 見ずに、定理と既存 opだけで合否を決める。 ————————————————————————— #
- L1563 (ja) — ★円は (p/q, 1/(2q^2)) に載っているので、接触は 2 次元の距離で見る。 x の差だけで測ると 0/1 と 1/9 のような組を「接していない」と読む (距離 0.1111 対 半径和 0.5062)—— 最初これで落ちた。
- L1683 (ja) — ★ムーア曲線は閉じている(最後から最初に戻れる)。ヒルベルトは閉じない。
tests/test_mcp_images.py
- L331 (ja) — ★最初
ones + inf にしていて、有限部が定数なので免除 op でも「定数」判定になり 落ちた —— それは診断器が正しい。確かめたいのは「免除 op なら非有限を異常と 言わない」だけなので、有限部に変化のある入力にする。
tests/test_mcp_server.py
- L160 (ja) — ★引数名を
name にしていて _call(4, "fullseye_op_help", name="gaussian") が TypeError になり、subprocess の実 stdio 往復が 1 度も走らないまま 23 件が緑だった(2026-09-15)。走らなかった検査は無いのと同じ。
- L208 (ja) — ★最初
gaussian が先頭と決めつけて落ちた。gauss_filter と gaussian は同じ HALCON 別名を共有する別 op で、api.find_op は name == halcon の正典を優先する。 検索もその規約に揃えたので、正典が先頭・gaussian が上位に居ることを見る。
- L421 (ja) — ★以前の被験者は台帳経由で索引に入ったこと(= 索引が台帳を数えている)も見る
- L452 (ja) — ★2026-09-17 に
b は「未使用」から端の扱いを選ぶつまみになった。 ノートがその意味と歴史側の帯を両方書いていることを固定する —— どちらか片方だけだと、保存済みプログラムを読む人が挙動を誤解する。
- L494 (ja) — ★同日実測: 4 層で 480 枚が「どこにも無いノート」に見えたが、5 層目(ledger)で 480 / 480 が解決した。ここが 0 でなくなったら、まず引き忘れた層を疑うこと ([[feedback_search_all_tiers_before_declaring_a_gap]])。ノートの残骸と決めつけない。
tests/test_mcp_wheel.py
- L215 (ja) — ★数を直書きしない。9 本目(fullseye_fix_text)を足したとき、この門は CI の core ジョブでしか走らず、手元のスイートは緑のまま CI だけ赤になった(2026-09-18)。 正本は checkout の TOOLS —— wheel が同じ集合を名乗ることを見る。
- L225 (ja) — ★順位を 3 位までに固定していた門は、新しい op(gauss_quadrature、2026-10-03)が「gauss」に正しく当たっただけで CI の core ジョブ(ここでしか走らない)を赤にした。見たいのは「2-D レジストリの op が索引の層から出る」こと。
tests/test_meshres.py
- L107 (ja) — ★2026-10-07: ここにあった
abs(pc_density(P[inner])["nonuniformity"] - 1) < 1e-9 or True は or True で常に真だった。実測 1.9121 —— 内側だけを切り出すと、その部分集合自身の縁で 近傍殻が欠けるので一様にはならない(主張そのものが誤り)。上の spacing の検査が本題なので削除。
tests/test_msa.py
- L80 (ja) — ★この恒等式は交互作用を残すモデルの性質なので、モデルを明示して問う。 既定の “auto” は規格の手順に従って交互作用を誤差へ畳むことがあり、そのとき EV^2 は「升目ごとの分散の平均」ではなく「畳んだあとの平均平方」になる。 (この門は実際にその切替を捕まえた —— 既定を変えた瞬間に落ちた)
- L91 (ja) — ★★連鎖ファザーが
msa_anova_table の NONFINITE を実検出した(2026-09-23)。 正しい対処は「この op の非有限を許す」ではなく「どこに出るかを宣言する」 こと —— 丸ごと許すと二度と鳴らない門になり、将来 0 除算や自由度計算の誤りで 部品行や測定者行に NaN が漏れても捕まえられなくなる。 残差の F / p —— F = MS/MS_error の分母そのものなので検定できない 全体の F / p / ms —— 平方和の合計行で、検定対象の効果ではない 交互作用(測定者 1 人)—— df = (p-1)(o-1) が 0 で推定量が存在しない
- L525 (ja) — ★表の脚注が「α = 0.05 で判定」と書いているので、表の再現を名乗る門は その α を明示して通す(既定 0.25 の妥当性とは別の話)。この例題では F = 0.434 がどちらの α でも非有意なので、結果はどちらでも同じ。
- L794 (ja) — ★区間の端は標本の分位点なので 1/sqrt(n) で揺れる。実測(種 8 本): n=200,000 で標準偏差 10.0 / n=1,000,000 で 4.2。偏りではないので、n を 決めた上で揺れの 3 倍で採る(「小さい」ではなく「この n ならこの幅」)。
- L814 (ja) — ★境界を渡さなければ検査しない(勝手に 0 を下限と仮定しない)
- L863 (ja) — ★端点は位置の揺れを拾うので、幅でも別に見る(こちらは sd 0.0035)
- L887 (ja) — ★許容は測った揺れから取る。n=1,000,000 の半幅の標準偏差は種 12 本で 0.0035(位置は 0.0146)。1 本の種に 2 sigma を当てて落とすのは 3 度目の 同じ誤りなので、4 sigma = 0.014 で採る。
tests/test_no_local_paths_in_shipped_code.py
- L40 (ja) — ★2026-09-14 追加: MSVC の標準インストール先。
fullseye_3dgs._find_cl_dir() が cl.exe を探すための候補として持っている。これは「私のマシンの作業物を 指している」のではなく「Visual Studio インストーラが決める場所」なので、 環境変数に追い出しても他人の環境で当たりやすくはならない(むしろ探索が 効かなくなる)。glob で実在を確かめてから使い、無ければ None を返す作りに なっていることを確認済み。 ※ _WIN_ABS は空白入りの語を 2 つ目までしか拾わないので、切り出される断片は C:\Program Files\Microsoft までになる。許可文字列は実際に切り出される形に 合わせる —— 正規表現の結果を見ずに「あるべき文字列」を書いて外した(2026-09-14)。
tests/test_op_contract_property.py
- L32 — ★在没有 hypothesis 的环境里,这一个文件的 import 失败会让整体停下 —— pytest 会因 collection error 中断,不再跑剩下的(2026-09-05,CI 在 2 分钟内死掉,一个测试也没跑)。降为 skip,别把别的也拖下水。
tests/test_op_contracts.py
- L53 (ja) — ★2026-09-14 実測: 901 op 中 151 本(16.8 %) がこの状態で、空ループを 1 周 しただけで緑を返していた —— 「門が判定を計算した直後に捨てる」の親戚で、 こちらは 判定を一度も計算しない。まず skip で見えるようにし、
test_probeless_ops_do_not_grow で本数を台帳に固定する(減る分には通る)。
- L57 (ja) — ★2026-09-14: 本来の直しを入れて 151 → 0 にした。 上に「本来の直しは
conftest.BANKS を全 in_sort へ広げること」と自分で書いておきながら、 ラチェットで本数を凍結したまま 9 日が過ぎていた —— 台帳は免罪符になりやすい ([[feedback_never_weaken_the_probe_to_get_green]])。 足したのは 11 sort: points(56) / signal(27) / video(16) / qimage(11) / cimage(9) / counts(8) / lightfield(8) / rgbimage(6) / matrix(4) / beatcube(4) / keypoints(2) = 151 op。形は推測ではなく backends_bridge._EMPTY_OF (12 sort すべての正準の最小値)と problems.py の入力生成器から取った。 これで 901 op すべてが 3 つの契約ゲートを実際に通る。 0 になった以上、このラチェットの役目は「増えたら落とす」に変わった。 新しい in_sort を足した人は conftest.BANKS に探針も足すこと —— 足さないと その op たちは「登録されているのに一度も実行されない」状態に戻る。
- L78 (ja) — ★2026-10-07: 契約電池で
backend_safe.guard の fallback に落ちる op の台帳 {op: (分類, 落ちる入力名の集合, 理由)}。 上の 3 契約(例外なし・有限・決定的)は op.fn をguard 越しに呼ぶ。guard は例外を 握って sort の既定値を返し、非有限の出力は置き換えてから返す —— だから op 本体が 例外を投げても NaN を出しても、assert の時点では「例外なし・有限・決定的」に見えていた (2026-10-07 実測: 936 op 中 46 op が電池のどこかで黙って fallback、うち 8 op は 疑わしい欠陥。inputs_for が sort 既定の帯を返すようにしてさらに 10 op)。 今は guard の台帳(backend_safe.mark / events_since)を見て、ここに無い (op, 入力)で劣化が記録されたら赤にする。台帳の op が電池のどこでも落ちなくなったら それも赤(直ったら行を消す)。入力名の集合は「これ以上増えない」上限として使う。
- L201 (ja) — ★2026-10-24: kornia 0.9 未満の環境でだけ 全入力で理由つきで断る op。
xkor_clahe: 0.8 以前の equalize_clahe は OpenCV の CLAHE と最大 0.46 ずれ、0.9 で直った (backends_kornia._clahe)。CI は最新の kornia を入れるので、そこでは上の台帳どおり tiny4 だけが 落ちる。古い kornia では「その拒否文で落ちた」入力だけを許す —— ほかの理由の劣化は従来どおり赤。 (2026-10-24 に xkor_dog / xkor_laplacian の tiny4 を台帳から消した: 鏡映を自前で足すようにして 4x4 でも走る。tests/test_kornia_version_drift_2026_10_24.py)
- L223 (ja) — ★2026-10-07: 宣言した out_sort の形を守っていない op(
test_op_honours_declared_sort の else 枝 = points/signal/matrix/video/qimage/cimage/… の 120 op を新たに検査して見つかった)。 (2026-10-07 同日に 3 op を直して空になった: 複素の sort を名乗る tb_angular_spectrum_propagate / tb_cx_apply_transfer_function / tb_fmcw_window_apply が、ops._wrap_unguarded の guard で実部だけにされ float64 を返していた。表は器として残す —— 次に見つかった違反の置き場。)
- L243 (ja) — ★2026-10-07(CI で判明): optional backend が無い環境の ImportError は「劣化」ではなく 「この環境では走らない」—— requires_backend と同じく skip(py3.11 の完全環境では失敗にする)。
- L279 (ja) — ★2026-10-07: 全体実行でだけ fallback する op(単独・同じファイル群では再現しない)。 KNOWN_FALLS_BACK_ON_EDGE は「必ず落ちる」の完全一致なので、ここに載せたものは「落ちてもよい・ 落ちなくてもよい」として扱う —— 門を黙らせるのでなく、原因不明であることを名指しで残す置き場。 sk_gabor: -n 6 の全体スイートで tiny4 @ (a=0, b=0) の出力 16 画素中 8 画素が NaN(1 回観測)。 単独・test_fix_gabor_dc / test_studio_params / test_fix_op_name_and_range / test_api_device と 同じプロセスでは毎回有限。前に走った何かが残す大域状態が疑わしい(未特定、見直し台帳に載せた)。
- L325 (ja) — ★guard 越しでは「例外なし」は自明に真 —— 劣化の台帳で本当に走ったかを見る
- L338 (ja) — ★非有限がその op の意味を運んでいるものは、この門の対象外。判断は ここで持たず
ops.NONFINITE_IS_MEANINGFUL を単一の正本として引く (test_backends_typed_liveness.KNOWN_NONFINITE_BY_CONTRACT が同じ表の 写しで、一致は別の検査が見ている。3 つ目の写しを作らない)。 2026-09-14: 探針バンクを 6 sort 広げたとき、ここで tb_mat_cond(特異行列の 条件数 = inf)と tb_geodesic_distances(不達 = inf)が落ちた。一度 探針から特異行列と非連結点群を外して緑にしかけたが、それは誤り —— 台帳は「inf が正しい答え」と既に宣言しており、落ちていたのは門がその 台帳を見ていないことだった。探針を削って緑にするのは欠陥を隠す行為で、 しかも同じ台帳の註に「自分の probe では特異行列を作っていなかったので tb_mat_cond を取りこぼした」という 2026-09-05 の教訓が書いてある。
- L366 (ja) — ★guard は非有限の出力を置き換えてから返す(source=output で台帳に残る)。 上の assert は置き換え後を見ているので、台帳の側で「置き換えが起きていない」を確かめる。
- L388 (ja) — ★fallback の値は自明に決定的 —— 比べたのが op 本体の出力であることを台帳で確かめる
- L446 (ja) — ★2026-10-07: ここに else が無く、points/signal/matrix/video/qimage/cimage/counts/ keypoints/rgbimage/beatcube/lightfield/any の 120 op は何も検査されずに緑だった。 形の契約の正本は backends_typed._sort_ok(進化の橋の出口と同じ表)。複素の sort は dtype も見る(backends_bridge._COMPLEX_SORTS)。
tests/test_op_descriptions.py
- L258 (ja) — ★2026-10-11: 台帳・n-ary・facade(fullseye.all)にも同じ規則を広げる # ————————————————————————— # 変異探針で、上の検査は ops.REGISTRY しか見ておらず、台帳 op・n-ary op・facade の関数は 説明を消してもどの門も鳴らないと分かった。既存の欠けは docs/LEDGER_GAP_DEBT.json の “description” に固定し、増えたら落ち、直ったら台帳から消す(縮むしかない)。
tests/test_op_discovery.py
- L247 (ja) — ★2026-09-17 に 3 -> 5。1-D の局所標準偏差と mu 則圧伸を足したため。 新しい 2 件は 1-D 実装に 2-D を渡すと ValueError で鳴る(既存の
lowpass と同じ、正しい向き)。危ないのは逆で、下でその 1 つを固定する。
- L262 (ja) — ★フォールバックの警告は op ごとに 1 回だけ。同じワーカーで先に別の試験が fs.op.lowpass の フォールバックを起こしていると、ここで警告が来ず落ちた(2026-10-01、-n 6 の全体スイートだけで再現・単独では緑)。 試験の順序に依存しないよう、1 回目の警告をもう一度出せる状態に戻してから見る。
-
| L272 — ★它甚至不是原样通过:回退会截断到图像契约 [0,1] 后返回。负半部变成 0 的信号看起来像「滤波后的信号」,所以这会悄悄地撒谎。max |
差 |
= 1.0,最小值 -1.0 -> 0.0。 |
tests/test_op_example_coverage.py
- L58 — ★从配布物一侧计数母集合的 ratchet(2026-09-06)# ————————————————————————— # 2026-09-06 的实测。这是「不让它比这个数更差」的止动,而非目标值。台账 1,002 个 op 中,进入示例索引的只有 349 个,上面那两个「100 %」之所以成立,是因为母集合三层里只有两层。经过与按族的分解 = docs/KNOWN_ISSUES.md §38。
- L32 — ★op 集合随环境变化(Linux CI 没有 torch/kornia/mahotas/xfeatures2d,共 859 op;本地是 885)。把本地生成的文档与活的 registry 比对的检查,只有在满配环境下才有意义 —— 与 test_opdocs 相同的约定,未齐全就 skip(原因里会给出缺少的 backend 名)。在 2026-09-07 的 CI 上,有 22 项在这里落败。与环境无关的检查(文件的存在、内容的量、图的存在)照常运行。
- L203 — ★2026-09-08:把依赖第三方后端版本的 op 从台账里剔除、单独计数。这个台账写于「做图的环境」,验证于「跑测试的环境」。cv2 的实现随版本变化,所以本地(opencv 5.0)不起作用的旋钮在 CI(opencv-contrib 4.x)里起作用 —— 实测
xcv_grabcut 的 b 就是如此。台账只能主张在任何环境都成立的东西。依赖版本的部分不主张(拥有狭窄但正确的台账,胜过拥有撒谎的台账)。
- L363 (ja) — ★optional backend(torch 等)が無い環境では、その op は「走らせられない」のであって「壊れている」のではない。 97 本おきの抜き取りは登録簿が増減するたびにずれるので、torch の要る op に当たる/当たらないが環境で変わる (2026-09-29: op が 2 本増えて tb_points_to_voxel に当たり、torch の無い py3.10 / 3.12 のシャードだけ赤)。 飛ばした本数は数えて、実際に走った本数で門を立てる。
tests/test_op_probe_ledger.py
- L76 — ★2026-09-08 加入。在那之前这个门只为 image / region / color / volume 这 4 类构造输入,让
contour 65 / points 57 / signal 26 / video 16 … 217 个 op(registry 901 个的 24 %)作为 “uncallable” 素通。「门站在正确的位置」和「门把全部都通过」是两回事 —— 拓宽的第一次就暴露出 tb_angle_3points 在探针下一次也跑不起来(注册是 points->feature,实体却取 3 个向量)。
- L85 (ja) — ★2026-09-17: 戻りの橋
feature_to_img で feature が初めて 入力になった(作る op は 125 本あったが受ける op がゼロ だった)。この門は「探針を作れず一度も走らせていない op」を 数えるので、sort を足したらここにも足す。
- L197 — ★2026-09-08 的 CI(py3.10 / py3.12,无 torch)在这里变红 —— 因为把探针拓宽到全 sort 的第一次,首次到达了需要 torch 的 op(
tb_points_to_voxel)。「坏了」和「这个环境里没有」是不同的判定,混在一起就会把环境差异当成实现的 bug。在满配环境(FULLSEYE_REQUIRE_OPTIONAL=1)里照旧按失败处理。
tests/test_opdocs.py
- L212 — ★2026-09-03:由于所有 backend 的 _safe 都汇聚到了 backend_safe.guard,所以按 guard 立起的结构化标记来判定,而不是按 qualname 的字符串匹配(guard 也会在 qualname 里留下 “_safe(…)”,但那是给显示用的)。
- L769 (ja) — ★2026-10-12: 図が無い理由(
gen_op_figures.DOMAIN_MISMATCH の値)も T() を通すので、その表の原文もキーとして正しい
- L885 (ja) — ★2026-10-12: 本文の訳が 2,212 本そろい、実データに「本文だけ未訳」の op が無くなった (以前はここで実在の頁を 1 枚選んでいた → StopIteration)。将来 op を足した瞬間に通る道なので、 本文の訳を 1 本だけ外した状態で生成器を直接呼んで固定する(test_notice_when_nothing_is_translated と同じ作法)。
- L1238 — ★没找到的原因:
ops.REGISTRY(899)与 2-D 笔记(899)一致,所以只要从 registry 一侧计数就会看起来「零缺失」。曾经这样下结论并搞错了。所以这个门从跨 tier 的索引一侧计数(memory: feedback_search_all_tiers_before_declaring_a_gap)。 ————————————————————————— #
tests/test_optdraw.py
- L285 (ja) — ★2026-10-15 から鏡は折り返した系の断面図(noncoaxial_drawing)に、接合レンズは組図になった(拒否しない)
tests/test_packaging_foundation.py
- L158 — ★2026-09-07:本地 wheel 上带着 sample_sources_ai 的 42 MB(共 96 MB)。原因是旧的 build/lib/ 缓存(从 package-data 移除前的残骸被重新打包进去)。这是读配置的检查抓不到的事故,所以由 tools/ci_wheel_check.py(unshipped_present)与 ci.yml 的大小上限去看 wheel 实物。目录也被移到了 package 外(tools/fops_article/)。这里要求明示排除(作为保险)。
tests/test_pivops.py
- L621 — ★只看名字级别的
PARAM_HINTS,会让门比 fuzzer 更窄。chain_fuzz._bind_args 还会看按 op 名狙击的 OP_PARAM_HINTS,所以这里也要两边都看(2026-09-06:把 dic 的 window / method 放进 OP_PARAM_HINTS 后,其实已经能绑定,却只有这里落败)。
tests/test_poc_scripts_run.py
- L57 — ★2026-09-08:放弃固定的 6,改为匹配 CPU 数。在共享 runner(2–4 vCPU)上,6 路并行只会把每一条拖慢,总时间并不缩短,等 PoC 增到 84 个时,每个 job 都撞上了 pytest 的 900 秒 timeout(py3.10 / 3.12)。本地(12 核)照旧以 6 或以上运行。
- L73 — ★
PYTHONPATH 不传(2026-09-09)。长期以来一直传 PYTHONPATH=<repo>,但那是使用者不会做的设置,意味着门离事故发生的地方偏了一步 —— 由于同样的盲点,examples/piv_flow_from_particles.py 等一直停留在「从 checkout 直接运行就 ModuleNotFoundError」(那一侧连运行的门都没有,所以没被察觉。test_example_scripts_run.py)。PoC 一侧 116 个里有 108 个自己把 repo 根目录加进 sys.path,剩下 8 个只 import fullseye,所以去掉后全数通过(已实测)。
- L87 (ja) — ★stdin は /dev/null(2026-10-23)。渡さないと子は親(xdist の worker)の stdin = execnet の パイプを継ぐ。worker が死んだあとも子がそのパイプを握り、controller が「node down」の後に 固まる形になりうる(手元で torch+libiomp5md の子が消えないゾンビになった日に疑った経路。 再現はしなかったが、子に親の制御パイプを継がせる理由は無い)。
- L96 — ★失败时也返回 stdout 的末尾。PoC 会把所见和「哪项检查落败」印到 stdout 后再 SystemExit(1),所以只有 stderr 的话,你只能知道空的「exit 1」而别无所知(2026-09-07 的 CI,py3.10 poc_ct_fidelity)。
- L99 (ja) — ★stdout は 4000 文字残す。1200 だと章の後ろだけが見えて、前半で 落ちた検査の実測値が CI から読めない(2026-09-24、poc_endless_zoom の 10 番目が落ちたとき「NG が残っている(10 番目)」しか分からなかった)。
- L108 — ★2026-09-07:这里长期返回 0,从而素通了下面的
assert code == 0 —— 一个刚算完合否就丢弃的门(实测:有 3 个 PoC 从不打印 PASS —— poc_dic_strain / poc_photoelasticity / poc_thermography_ndt)。改为返回 -2 让它落败。
- L140 (ja) — ★2026-10-07: 以前は全本を走らせていた。session fixture はセッションごと(CI のシャードごと・ xdist のワーカーごと)に作られるので、CI では 4 シャード × 3 版 = 12 回、全本を走らせていた (シャードあたり 21〜41 分、run 37474292595)。手元の -n 6 では 6 ワーカーがそれぞれ全本を WORKERS 並列で回し、最大 48 本が同時に走って単独 286 秒の PoC が 600 秒を超えていた。 いまは (1) xdist のワーカーでは引かれた 1 本だけを走らせ、並列は xdist に任せる (2) それ以外(CI のシャード)では、このセッションに残ったテストの分だけをまとめて並列に走らせる。
- L156 — ★这个门把 84 个 PoC 一次性集中运行(session fixture)。这段时间会计到第一个测试上,所以 pyproject 的默认 timeout(900 秒)在共享 runner 上会落败。只在这里放宽 —— 放宽默认会连带钝化其他测试的挂起检测。
tests/test_printpath.py
- L332 (ja) — ★頂点より少ない標本は既定で拒否(長さが縮んで濃淡の再現が壊れる)
- L369 (ja) — ★完全な係数列で呼ぶ(打ち切ると尾のエネルギーが分からず予言が下界になる)。 parametrisation は “index” —— stroke_resample_closed がすでに弧長で 打ち直しているので、ここで “arclength” を選ぶと op が内部でもう 1 度 打ち直して別の輪郭の係数になる(弧長の打ち直しは冪等でない)。
- L454 (ja) — ★目標の濃さに合うペン幅を閉形式で解くと、偏りが桁で縮む
tests/test_profileops.py
- L206 (ja) — ★2026-10-07:
or True を外した。実測 none=-0.003086 < rigid=-0.001662 < 0.5*none=-0.001543
tests/test_public_reachability.py
- L76 (ja) — ★2026-09-14: この 13 本は 2026-09-05 から wheel に入っていなかったもので、 py-modules へ足した結果ここに現れた。演算子としては
unified._3DGS_OPS が _lazy_call(モジュール名, 関数名) で文字列から登録しているので、利用者には fullseye.vision.gsplat.<名前> 経由で届く(2026-10-02 訂正: fullseye.op.<名前> は存在しない。 unified registry を公開経路として数えたら 17 モジュールが島でなくなり行を消した)。 ここに残る 1〜6 本は各モジュールのデモ入口(render_*_gif など)で、op ではなく絵を作る側。だから内部専用に置く。 —— 「配布から消えていた」を直すと「公開経路から見えない」が現れる、という 二段構えだった([[feedback_registered_only_gates_miss_unregistered]])。
- L85 (ja) — ★2026-10-02: py-modules の数え漏れ(68 → 408 本)と facade 経路の数え忘れを直して初めて見えた 9 本。 内部の道具(CLI・ヘルプ書庫・n-ary の組立て・Studio の索引・標本データの取得・大画像の実行補助)、 api が別名で包むもの(mesh_decimate → mesh_decimate_preserving)、fs.. でだけ届くもの (pipeline3d の合成 op 6 本 —— 2026-10-02 に fs.<名前> から出して行を消した)。 (watershed3d の 3 本は 2026-10-02 に台帳 opssegmentation の watershed3d へ載せて行を消した。)名前>
- L98 (ja) — ★2026-09-15: 33 行すべてが公開経路(fullseye.<名前> / .ledger / .op)に届くように なっており、2 番目の検査が「この表から行を消すこと」と 33 件を挙げた。 消した 33: transforms / mosaic / fit_transform / tools_geom / matrix / shapematch / objmodel3d / matching3d / matching / calib / caltab / calibration3d / contours_xld / contours_xld2 / image_channels / filters_freq / filters_flow / regions_setops / regions_gen / region_morph / morph_minkowski / segmentation / image_gen / image_paint / misc_vision / imgops_nary / scattered / inspection / pipeline3d / watershed3d / mesh_decimate / sample_data / scale。 表は空でも残す —— 「出すべきなのに出ていない」ものが次に現れたときの器。名前>
- L120 (ja) — ★2026-10-02: コメント行の
[[feedback_...]] で非貪欲の \] が止まり、py-modules 407 本のうち 68 本しか数えていなかった(339 本が門に映らない)。コメントを剥いでから囲みを取る。
- L130 (ja) — ★2026-10-07: optional 依存が無いと import できない出荷モジュール
{module: 許す欠落依存}。 以前は except Exception: continue でどんな import 失敗も母数から黙って外していた —— 壊れたモジュールは「不可視の関数」の数にも島の検査にも入らず、ラチェットはむしろ緑に寄る。 ここに無いモジュールの import 失敗、ここにあっても別の理由の失敗は赤。
- L164 (ja) — ★2026-10-02: 4 つ目の公開経路 = 知覚 facade(fullseye.vision.<群>.<関数>、halcon_facade_map.json の "module.func" が実体)。HALCON 章の実装(segmentation.py 等)はここからだけ届いていた。 py-modules の数え漏れ(68 → 408 本)を直した途端に 35 モジュールが「見えない」と出たが、 その多くは facade 経由で届く。利用者が呼べる経路は全部数える。関数>群>
- L172 (ja) — ★2026-10-02: 5 つ目の公開経路 = unified registry(
fs.vision.<名前空間>.<op>)。3DGS などの op は 文字列 “module.func” から _lazy_call で登録され、facade map にも台帳にも名前が出ない (sugar_mesh・tsdf_mesh・route_planning 等)。”module.func” 形の module 欄だけを数える (fs.apply('x') のような呼び出し式は関数名ではない)。
tests/test_pxrd.py
-
| L246 (ja) — ★a の門 5e-5 の余裕(組み込み時 2026-10-06 に雑音の種を 12 通りずつ振って実測): 誤差は雑音でなく較正の系統で決まり、 この像(傾き 5°・向き 30°)では −2.7〜−4.2e-5(種 6 は −3.2e-5)。種による散らばりは ±0.5e-5 程度で、24 通りの最大は |
4.2e-5 |
。 種は固定なので結果は決定的。門を締めると系統の偏りに当たり、緩める理由も無いので 5e-5 のまま。 |
tests/test_rag_by_ops.py
- L48 (ja) — ★問題集は文脈の表と同じ書き手が同じ日に書いた —— 独立な評価ではないので、床は「後戻りしない」ことだけを言う。
tests/test_raster.py
- L26 — ★裸的 import 在缺失该项的环境里会中断整个收集(实测 2026-09-05)。
tests/test_raytrace3d.py
- L276 (ja) — ★2026-10-15: 傾いた鏡(摂動)の後で像面と平行に進む光線を、以前は rms 3.4e18 mm の有効な点として数えた
tests/test_roughness_robust.py
- L75 (ja) — ★α は op の定数を読まず、ここで ln2/π から作り直す(両辺に同じ入力を渡す門は無効)
tests/test_runner_scratch_families.py
- L38 (ja) — ★宣言された家族。key = “."、値 = 守り方の説明。 ここに無い関数が ``_bind_args`` を呼んでいたら、この門は落ちる。
tests/test_rust_abi_parity.py
- L402 (ja) — ★契約では FS_E_INVALID_ARG(引数が定義域の外)であって FS_E_TYPE ではない。
FsValueError を足すまでは両方 FsTypeError で、Rust が 1 を返すのに Python は 2 相当を投げる、という状態コードの食い違いが残っていた。
tests/test_sample_data.py
- L125 (ja) — ★台帳は前からあったのに、人が読む
docs/ops/SAMPLES.md には出ていなかった (2026-09-16)。表の列は id / 種別 / アクセス / URL だけで、ライセンスと商用可否は ソースを読まないと分からなかった —— 看板(「DL URL / ライセンス」)と中身がずれて いた。出す側を直したので、ここでは台帳が空欄を作らないことを固定する。 ————————————————————————— #
tests/test_scale.py
- L63 (ja) — ★d: 穴がタイル境界を跨ぐ画像。これが無いと領域 op(fill_holes / select_shape / fill_up …)がタイル分割で壊れることを検出できない —— b の穴(70:90)はどのタイルにも収まっているので、埋めた結果が一致して しまう。2026-09-17 にこの探針を足して、tile_safe と宣言されていた 6 本が誤差 1.0(全く別の結果)で割れることが分かった。 穴は 45..95 にとり、tile=64 の境界(64)と tile=60 の境界(60)の両方を跨ぐ。
- L71 (ja) — ★e: 細かい周期を持つ画像。変換ドメイン(ウェーブレット)・非局所平均・ LBP はここで初めて割れる。乱数でなく決まった模様にしてあるのは、 乱数だと対称性の破れが隠れるため。
- L77 (ja) — ★f: 小さな粒と穴が多数ある画像。面積で選ぶ op(remove_small_holes / select_shape / diameter_opening)は、粒がタイル境界で切られて面積が変わる ことでしか壊れない —— 大きな構造しか無い探針では 0.0 のまま通る。 種を固定してあるので実行ごとに同じ(乱数そのものを検査対象にはしない)。
- L81 (ja) — ★種は 2 つ持つ。1 つの種は「構造の 1 標本」でしかない ——
xsk2_isotropic_close は種 0 と 7 で誤差 1.0(全く別の結果)、種 1 と 20260917 では 0.0 だった。半分の種で割れる op を「タイル安全」と呼ばない ために、当たり外れのある探針は複数枚そろえる。
- L92 (ja) — (tile, halo) の組。★64/16 だけで測ってはいけない —— どちらも 8 の倍数なので、 8x8 の周期を持つ処理(順序ディザの Bayer 行列など)はタイルの位相がそろって たまたま一致する。実測で
dither_ordered は 64/16 で誤差 0.0000、60/12 でも 50/10 でも 37/7 でも 0.1429 だった。整列していない幅を必ず 1 つ混ぜる。 これを入れた 2026-09-17 に、tile_safe と宣言された 168 本のうち 16 本が 割れることが分かった(fill_holes など 6 本は誤差 1.0 = 全く別の結果)。 3 組目 (50, 8) はハローが狭い設定。「支持長がハローを超えるか」で決まる op(ウェーブレット再構成・大きな構造要素のモルフォロジー)は、広いハローでは たまたま一致するので、狭い側も試さないと分類が甘くなる。halo は利用者が選ぶ値 なので、「ある halo でだけ安全」は tile_safe と呼べない。
tests/test_scale_law_2026_09_26.py
- L46 (ja) — 宣言表 —— 成分ごとの尺度指数。★新しい op を足したらここにも書く(完全性を門で見る) ————————————————————————— # 周囲長を経由する量は、ラスタ化の偏りで p が厳密に出ない(docs/KNOWN_ISSUES.md §50)。 そこだけ許容差を広げ、理由を名前で残す。
- L86 (ja) — ★HALCON の同名演算子は正規化しない中心モーメントを返すので、本来は p=4 / 5 / 8 になる。この repo は 1 スカラーへ合成する際に Hu の正規化 不変量を使っており p=0 である(docs/KNOWN_ISSUES.md §52、巡 13 で直す)。 ここは あるべき値を書き、直るまで strict xfail で開いたままにする —— 免除台帳に「例外」として畳み込むと、直ったことに誰も気づけない。
- L101 (ja) — ★§52 が直るまで落ちる 3 本。
strict=True なので、直った瞬間に「予期せぬ成功」で 落ちてこの表を直せと言ってくる(黙って通り続ける免除にしない)。
tests/test_segcompare.py
- L120 (ja) — ★最初は逆に読んで赤になった —— 名前は閉形式の門(半分に割ると split が m/N)で固定してある
- L126 (ja) — ★scikit-image の precision は正解側の対で割っている(コードは truth x test の表の行和)= こちらの recall。docstring は「test の対で割る」と書くので、名前が入れ替わっている。 F 値は対称なので誤差そのものは一致する。
tests/test_segmentation_halcon.py
- L496 (ja) — ★2026-10-02: 同じ台帳に score(segeval)/world(segworld)のカテゴリが足された。HALCON の 9 本は 4 カテゴリの中にちょうど 9 本、他のカテゴリの op は segmentation.py の物ではない。
- L499 (ja) — ★2026-10-18(統合 8 第 2 波): 同じ「classify」カテゴリに cropweed の Fisher 判別 2 本が入った。HALCON 章の 9 本は 実体が segmentation.py の物なので、module で絞る(カテゴリ名だけで数えると汎用の判別が混ざる)。
tests/test_shapestats.py
- L196 — ★让平面自由,一侧均匀的展开就会被整个吸收掉(实测 4.9e-35)。中点只移动一半,平面也跟着移过去,所以不会作为左右差残留下来。这是这个定义的极限,而非缺陷 —— 想看的话就从外部给定平面,或加一个在正中线上的地标(midline)。
tests/test_simcal.py
-
| L104 (ja) — n^1 * d^~1(位相 4 pi n d / lambda)。★d の指数が 1 から外れるのは Fresnel の項(n だけに効く)の分。 2026-10-18 に決まる組の重みを e/ |
列 |
→ e· |
列 |
に直した(下の test_g2determined_combination_weights…)ので 0.94 → 1.07 に動いた。どちらも 1 の近くなので、この門は直す前も後も通る幅にしてある(向きの検査は下の門)。 |
- L339 (ja) — ★種は乱数を引かない(探針の種は型名の順に同じ乱数列から作られる)
tests/test_spc.py
- L237 (ja) — ★台帳 opsspc は 2026-10-12 から 2 モジュール(spc と pod)を載せる。比べるのは 「spc モジュールの op」どうし —— pod 側の一致は tests/test_pod.py が見る。
- L247 (ja) — ★真値は導出した恒等式と既存 op。当てはめた数字を固定しない。 単位空間の MD² の平均はちょうど (n-1)/n で、教科書の「平均 1」を有限標本で 正確に言い直したもの。1.0 を固定する試験はどんな標本でも間違いになる。
- L320 (ja) — ★この列の std は 0 ではない。4.2 を 200 個並べただけで丸め屑が 1.3e-14 残る(実測)。
std == 0.0 で判定していた最初の版はここを取りこぼし、 その屑で割った距離が意味を失っていた。屑が在ることを門に書いておく —— 絶対判定に戻したらこの行が落ちる。
tests/test_specularity.py
-
L790 (ja) — ★2026-10-07: ここにあった max|a - 7b| < 7e-12 or True は or True で常に真だった。 実測 max |
a - 7b |
= 4.91(b は 1.4e-16)—— 画像だけを 7 倍してアルベドを据え置くのはモデル違反で、 残差は 7 倍の線形にはならない(主張そのものが誤り)。成り立つ向き = 「線形ではない」を測った値で固定する。 正しい線形性の形は下の c の検査。 |
tests/test_studio.py
- L948 — ★
setDefaultFormat 只对无参构造函数生效,而 Studio 的 QSettings("Fullseye", "Studio") 固定指向 registry —— 这个 fixture 什么都没隔离(2026-09-05,registry 里残留了 pytest 的路径)。用环境变量把本体一侧的入口 studio._settings() 指向 ini。
- L2066 — ★直接构造
QSettings("Fullseye", "Studio") 会绕过隔离,写入用户的注册表(2026-09-05 的审计确认了实际危害)。设置入口保持为一个。
- L89 (ja) — ★UI 言語はプロセス全体の状態(studio._UI_LANG)。切り替えたまま返すと、同じ worker で後に走る test_studio_result_preview の note が hi / ko になって落ちる(CI shard 5、2026-10-25)。teardown で戻す。
tests/test_studio_ledger_runner.py
- L129 (ja) — ★2026-10-13: 抜き取りを「名前の SHA-1 の小さい順に 60 本」にした。等間隔の抜き取り (names[::len//60])は、前の方に op が 8 本足されただけで 60 本がまるごとずれ、 見本で走る数が 26 → 17 に落ちて門が鳴った(偏光の 8 op は 1 本も抜き取りに入っていない = 窓の欠陥ではなく抜き取りの揺れ)。名前の指紋で選べば、op を足しても既存の 60 本は 新しい名前が指紋の上位に割り込むときしか変わらない。この抜き取りの実測は 60 本中 22 本。
- L143 (ja) — ★返り値が None の op(tid2013_root はデータの置き場が無ければ None を返す)は、窓でも 「kind: none」で out = None になる。例外が出たかでなく値が返ったかで比べる (2026-10-05: 台帳が 63 本増えて抜き取りの 60 本がずれ、tid2013_root が入って鳴った)。
tests/test_studio_logic.py
- L22 — ★旧的 setDefaultFormat 方式对 Studio 的 QSettings(org, app) 不起作用。将本体的入口 studio._settings() 指向 ini(整个 session)。
tests/test_studio_ops_browser.py
- L11 — ★裸 import 在缺少 matplotlib 的环境中会中断整个收集(pytest 因一次 import 失败就不再运行其余全部)。2026-09-05 实测。
tests/test_telecentric.py
- L38 (ja) — ★2026-10-15 まで raytrace.chief_ray は入射瞳を狙い、物体側テレセンでは ValueError で止まった。 いまは入射瞳が無限遠なら絞りを狙う —— この層の主光線と同じ像の高さになること。
tests/test_threshold_polarity_2026_09_26.py
- L35 (ja) — しきい値「方法」の名前。★op 名から拾うので、新しく足した方法も自動で門に入る (免除台帳に名前を書かない限り)。綴りで探す門は綴りが違うものを見逃すので、 説明文も一緒に見る。
- L43 (ja) — ★暗い側が答えで正しい op。理由つきで名指しする —— 台帳が黙って腐らないよう、 下の試験が「本当にまだ暗い側なのか」を確かめる。
tests/test_trust_block.py
- L151 (ja) — ★2026-10-12: ここは長らく
release=True(厳密一致)で呼んでいて、docstring の 「普段は 行 ≤ 索引」と食い違っていた。0.6.0 の後に op を 1 本でも足すと(pod 5 op) 凍結済みの 0.6.0 の行は直せないので、どの commit でも必ず赤になる門だった。 厳密一致はリリース直前に tools/gen_trust_block.py --release-check で見る (その意味は下の grown / shrunk の対で固定してある)。
- L159 (ja) — ★2026-10-18: 先に索引を版の行とぴったり揃えてから 1 本足す。揃えずに足すと「厳密一致で 何件落ちるか」が、リリース後にどの層が増えたかで変わる(ops3d の op は 2-D 橋 tb_* も 生むので registry も 1 増え、2 件のはずが 3 件になった —— 門ではなく数え方の偶然)。
tests/test_vacuous_assertions.py
- L62 (ja) — ★他の試験の docstring に
\* 等が在ると ast.parse が DeprecationWarning を出す。数えるだけの処理なので黙らせる (門の出力に無関係な警告を 84 ファイル分足さない)。
- L95 (ja) — ★書き下した列(
for img in (v, w))は、中身が何であれ空にならない。 中の名前が「呼び出しの戻り」でも、周る回数は 2 と決まっている。
tests/test_videostream.py
-
| L319 — ★Collins (VSAM 2000):两者都以当前帧为基准。到 2026-09-05 为止,这个测试期望连续对 |
f[t-1]-f[t-2] |
,把实现的错误当作规范固定了下来(对匀速运动的均匀物体始终全为零 – 见下面的回归测试)。 |
tests/test_volops.py
- L384 (ja) — ★2026-10-07:
or True を外した(実測: マスク外で vol と違う 7783 画素はすべて 0)
- L567 (ja) — ★これらは「HALCON がボクセル型を持たない」ことを理由に足した族なので、正しさの 根拠は幾何が保証する真値しかない。だから全部、真値の分かる形(球・立方体・ トーラス・既知 sigma の白色雑音)で検査する。 ————————————————————————— #
tests/test_wave.py
- L85 (ja) — ★J’_0 の零点と比べると合わない —— 取り違えを門で固定する
tests/test_wingpoc_gallery.py
- L172 (ja) — ★英語側は展示数を指す句に限定する。英語の数詞は散文に普通に出るので (two separate numbers / two opposite kinds)、広く拾うと誤検知だらけになり、 誤検知だらけの門は消される。日本語の「N 点」は展示を数える言い方なので広いまま。
- L252 (ja) — ★入れ替える 2 件は受入日が違うものを選ぶ。同じ日の 2 件を入れ替えても 何も壊れないので、それで「捕まえた」と言うと破壊試験が嘘になる。
textregion.py
- L92 (ja) — ★幅 1 のストローク(2026-09-27 実測: size 16 のフォントは縦の連が 1 px で、行の再現率が 雑音に依らず 0 % だった)。境界画素の 1 歩先が既に地なら、その画素だけの幅 1。 勾配は 1 px の棒では消えて向きが定まらないので、勾配を使わず 4 近傍で決める: 上下がともに地、または左右がともに地なら、その画素の幅は 1。
- L103 (ja) — ★2026-10-30: 「出来れば全 PoC を載せたい」。初版は 80 本で切っていた。台帳の PoC は手書きの見どころか この一括のどちらかに必ず載る —— 載らない PoC があれば理由(図が無い・数が無い・分類の無い翼)ごと止める。
- L45 — ★目录、提示和适配器以出货模块
typed_catalog 为正本(2026-09-05)。以前它们住在这里,backends_typed 把 tools/ 加进 sys.path 来读取 – 结果在 wheel 中 tb_* 143 op 悄然消失。把方向反了过来。
- L284 (ja) — llmcore(2026-09-24): tokens は画像パッチを種にする。★一様乱数だと どの行も似た向きになり、注意の重みが全行ほぼ一様になって「走ったが 意味のある出力でない」側に落ちる。滑らかな画像を 8x8 で切ると、 近い場所のパッチが近い向きを向く = 注意が構造を持つ。
- L305 — 事件位置(点过程)– point_spectrum 的入口。★不要只用均匀随机:没有周期成分就一次也不会触及「寻找周期的 op」的有意义行为,所以用把 12 个无关事件混入周期 17.0 序列的结构化数据作种子(随机-only 的测试会隐藏结构缺陷,是本 repo 的规律)。
- L503 (ja) — ★rng を 1 つも引かない —— 探針(ledger_contracts)は種を型名の順に同じ乱数列から作るので、 ここで乱数を引くと型名が後ろの種(image2d / matrix / signal …)が全部ずれ、他族の op の判定が 動く(2026-10-15 に実測: 無関係な 6 op が「拒否」に、11 個のノブの判定が入れ替わった)。
- L508 (ja) — ★design と同じく rng を 1 つも引かない(種は型名の順に同じ乱数列から作られる)。模型の観測は simcal の内側の固定の種(20261015)で作るので決定的。
- L813 (ja) — ★2026-10-13: TYPE_CHECKS[“pose”] は (R, t, info) の 3 つ組も pose として通す (register_spin / register_shot / register_cpd_rigid / icp …)。ここで 2 つに 展開すると、その組が引かれた連鎖で ValueError(seed 3_000_0xx、縞に近づく ハエの眼の 5 op を足して抽選がずれた回で露見)。先頭 2 つだけ取る。
- L946 — ★混有非有限值的点云会让 KD 树的构建本身以生的 ValueError 崩溃(scipy:”data must be finite”)。池的设计是记录 NONFINITE 后仍保留值,所以脏点云来到这里是预期之内 – 由构建方防范。2026-09-06 实际踩到:新的族增加后连锁的走法变了,在 seed 3_000_0xx 命中这条路径,fuzzer 自身停止了(不是 op 的缺陷而是工具的缺陷。无法绑定的输入约定为跳过而非抛异常)。
- L1298 (ja) — ★単位空間は渡さない(渡すなら 3 つ全部)。渡さない形は「データ自身から 作る」訓練時の呼び方で、ファザーが最も広く回せる。
- L6930 (ja) — ★2026-10-18: 窓 3 つ + 厚さ 0 から始まる勾配。窓の番号(low / high)のノブは窓が 3 つないと どの値も同じ 2 窓を指し、min_log(素通しに近い画素を拒否する下限)は L が 0.01〜0.04 の画素が 無いと効かない —— 効く入力を渡す(効かないノブを台帳に載せない)。 窓は 120 kV で 20 / 40 / 60 keV(隣り合う狭い窓 20〜35 / 35〜55 では Cr と Mn の R が逆転し、 effective_z_map が単調でないとして拒否する —— それは op の正しい拒否で、ノブの検査にならない)。
- L7140 (ja) — ★obs2 の 2 点目は台車 0 の終点から (−0.15, 1.0) ずらした所: 射影の角 0.1 → 0.2 rad で終点と点の順が入れ替わり、 組紐語が変わる(角が「効かないノブ」に見えない入力。類が同じかは角に依らない —— それは門が別に見る)。
- L8120 (ja) — ★2026-10-11: file = 書き出したファイルのパス(write_wav の返り、read_wav の入力)。 述語が無いあいだ、write_wav が None を返しても誰も気づかなかった。
- L8242 — ★到 2026-09-02 为止一直是
lambda v: True = 因为谓词被计为「有」,反而比没有更糟(点检脚本也会把它计为「有谓词」)。实测下它连 None / 42 / 字符串 / dict 都放行。正典是通过全部运行消费侧 6 个 op(reprconv 的 pairs_to_signal / pairs_to_image2d / pairs_to_table / angles_to_normals / shape_index_to_curvature / polar_to_cscalar)来确定的:6 个 op 都只接受上面两种形状,其余的都以 “pairs: must be (N, 2) or a 2-tuple of equal-length 1-D arrays” 变成指名的 fail-closed(实测)。因为不接受 (2,N),把 2-tuple 用 np.stack 压成 (2,N) 的 3 个 adapter 改成了 axis=1。长度不同的两条(histogram 的 counts/edges)也不是「对」,予以拒绝。
- L8374 — ★「恰好 2 个元素」与 pose(用
len >= 2 允许 info)是有意不同的。实测 2026-09-02:把 mesh 作为单个参数接收的 4 个既有 consumer(face_normals / vertex_normals / mesh_area / vertex_curvature)对 3-tuple 会送出 “mesh must be a 2-element tuple (vertices, faces)”,cadmap 的 _mesh 和 render3d._mesh_arrays 也只接受 2 个元素。也就是说 本 repo 的 mesh sort 正典是 2-tuple,多余的元素不是「信息更多」,而是让下游全灭的类型层面的谎言。唯一的例外 voxel_to_mesh(返回 (v, f, n))现在在 ops3d.RESULT_ADAPTERS 中取出正典的排列(与 gicp / vol_label 同样处理)。
- L8583 (ja) — ★2026-10-11:
system キーに最適化後の処方(同じ object_mm = inf)
- L8585 (ja) — ★2026-10-15: 絞りと像面の前の面は平面(R = inf、lens_system の規約どおり)
- L8587 (ja) — ★2026-10-15: 図の values に処方の平面の R = inf と、無焦点の EFL / BFL = inf、 分散の無い媒質の ν_d = inf を写す(lens_system の規約どおり)
- L8590 (ja) — ★2026-10-15: 非共軸の系(raytrace3d)は面の R = inf・物体の inf を記録に持ち、 ゴーストの表・光線の束は「届かない光線 = NaN」(trace_rays と同じ規約)、 図の values にも平面の R = inf を写す。opd_samples は瞳の外 = NaN、 with_wavelength は処方(object_mm = inf)をそのまま返す。
- L8597 (ja) — ★2026-10-19: 照準 / ケラレ係数を設定した処方もそのまま返す(R = inf、object_mm = inf)
- L8599 (ja) — ★2026-10-18: .zmx から読んだ処方(lensfile)は lens_system そのもの(物体が無限遠 なら object_mm = inf、平面の R = inf、ファイル側の面の表の DISZ = INFINITY)
- L8602 (ja) — ★2026-10-19: 構成ごとに解決した処方も lens_system そのもの(R = inf、object_mm = inf)
- L8604 (ja) — ★2026-10-19: 硝材置換・大域探索は処方(R = inf)を入れ子で返す
- L8606 (ja) — ★2026-10-19: 最適化後の処方(R = inf)を返す
- L8608 (ja) — ★2026-10-20: 解を解いた・解を外した・afocal の・像面を曲げた処方(R = inf、object_mm = inf)と、 その解の一覧(R = inf の行)を返す
- L8631 (ja) — ★2026-10-11(tests/test_ledger_contracts.py が初めて全台帳 op を呼んで挙げた分のうち、 docstring が非有限を名指ししているもの)。どれも「無い・測れない・届かない」を 0 で埋めず nan / inf で言う設計で、実際に非有限だった欄と docstring の欄が一致する ことを 1 本ずつ確かめた。docstring に書かれていない非有限(world_camera の depth の inf など)は載せていない —— 台帳の負債(docs/LEDGER_CONTRACT_DEBT.json)に残る。
- L8755 (ja) — ★2026-10-07: プロセスごとに分ける。固定名だと xdist の別ワーカーが同じ捨て場を共有し、片方の テストが「中身を消してから、何か落ちたことを確かめる」間に相手が消す/書く(Windows では開いている ファイルの unlink が PermissionError)。
- L456 (ja) — ★探針が作る
text は "ラベル 73" のように相対パスとしても成立する。 台帳でパス引数を text と宣言している書き込み op にそれが渡ると、op は素直に cwd へ書く —— cwd は repo 直下である。ファザー側(chain_fuzz.run_chain) には 2026-09-23 から捨て場が在ったが、採掘側のここには無かったので 2026-09-25 に repo 直下へ xlsx が 2 本生まれた。仕組みが在ることと、 全部の経路がそこを通ることは別([[feedback_count_wrapper_families_not_mechanisms]])。
- L25 — ★把这个脚本自身的所在位置从 sys.path 中移除。 Python 会把脚本的目录放到 sys.path[0],所以从 checkout 的
tools/ 启动时,即使在 wheel 侧的 venv 中也能 import 到 tools/ 下(未随附的 chain_fuzz 等),于是就在「能看到 wheel 里没有的东西」的状态下计数。2026-09-05 的复查中,这个门漏掉了 tb_* 143 op 的缺失正是因为这个。同时也把 cwd 移到空的临时目录(cwd 是 checkout 的话会发生同样的事)。
- L34 — ★在移动 cwd 之前记住原来的 cwd,此后把所有参数路径都相对它来解析。2026-09-05 实测:preflight 传的是绝对路径所以本地能通过,ci.yml 传的是相对路径,于是 dump 被写弃到临时 dir,compare 以 FileNotFoundError 崩溃 – 门在生产的调用路径上一次也没有执行比较。这是「门要立在事故发生的地方」的第 3 次。不是去修调用方,而是让它即使用相对路径调用也能正确运作,把这一整类关掉。
- L139 — ★2026-09-08:也看 editable 侧。在此之前
a["failed_backends"] 只是收集,谁也没读 – 在同一轮里作为与 examplefig 的图失败同类型的漏洞被揪出。editable 的 venv 有很多 optional 依赖,所以 backend 可能因版本不一致而 import 失败。这时 wheel 侧只是「因为依赖不存在,一开始就不在」,不记录失败,这个比较仍然绿着通过。掉落的 backend 的 op 就从注册表里悄然消失。
- L92 — ★这里会犯两次错。fuzzer 的
run_chain(1)把输入型 any 当作「总是齐备」(从池中任意抽取),(2)在 OP_ARG_BUILDERS 中注册的 op 自行组建参数。不把这两点算进去,就会把实际上每次都在运行的 op 报告为「结构上不可达」(实际上对 fuse_to_voxel / register_cross 误报了)。可达性不是由「只看型」决定的 – 一部分可达路径在代码这一侧。
- L89 (ja) — ★2026-09-14 追加。45,000 ケースを 3 秒で「食い違いなし」と言われたとき、 信じるのではなく自分が printf で挙げた「踏んでいない座標」を足す。 一致したときこそ探針を疑う([[feedback_one_probe_input_is_not_coverage]])。
- L185 (ja) — ★2026-09-14: ここは長らく値域だけを振って画素は 0..1 のままだった。相対しきい値は 値域を通して解決されるので、値域 (100,300) では絶対値 100〜300 と比べられ、 100% が空になっていた(実測: (100,300) は 780/780 が 0 画素、全体でも 63% が 物体 0 個)。4000 ケースが 0.6 秒で「食い違いなし」だったのは頑健だからではなく、 connection も measure_all もほとんど踏んでいなかったから ([[feedback_zero_findings_may_mean_never_executed]])。値域を名乗らせるなら 画素もその値域で描く。
- L198 (ja) — ★しきい値は画像に実在する値から引く。独立に引いていたときは 41% が 「選択 0 画素」で、物体が 2 個以上あるのは 14% だけだった ——
connection の 分岐(斜め接触・入れ子・多数)をほとんど踏んでいない。乱数で撒くと空ばかりに なるのは、しきい値も探針の一部だから ([[feedback_one_probe_input_is_not_coverage]]: 探針は入力画像だけではない)。 2 割は「当てずっぽう」のまま残す —— 空・全面・範囲外という端も要る。
- L236 (ja) — ★R-3 の相対→絶対の写像と画像の形。契約の関数なのに観測していなかった。
- L265 (ja) — ★
fs_region_runs は契約が「領域表現の唯一の窓」と呼ぶもの。それを 観測していなかった —— 面積と本数が合っていても、run の切り方が違えば run-length と dense mask は別物として振る舞う(隣接 run を結合するか、 行内の並びは昇順か)。観測していない性質はケース数では出ない。
- L295 (ja) — ★並びそのものを観測する。
sorted して比べていたので、物体の順序を逆にする 変異が 3,000 ケースで 1 件も殺せなかった(2026-09-14 の変異解析)。契約は 「最初の run の (row, col) 昇順」と明記しているのに、門がどこにも無かった —— 観測していないものは、どれだけケースを撒いても出てこない。
- L337 (ja) — ★R-3 の相対→絶対の写像そのものを観測する(契約
fs_image_absolute)。
- L351 (ja) — ★種別を捨てない。ここは長らく固定値 1 だったので、
_status_of を 書いて compare にコード比較まで足したのに、Python 側が常に 1 を 名乗るせいで状態コードの食い違いが構造的に出なかった(変異 m8 が 3,000 ケースで殺せなかった正体)。観測を足したつもりで足しきれて いない、という [[feedback_gate_computed_a_verdict_then_discarded_it]] の型。
- L381 (ja) — ★コードの値まで見る。「どちらも拒否した」で止めていたので、 契約が FS_E_INVALID_ARG(1)と決めている所で Python が FS_E_TYPE(2) 相当を投げていても素通りしていた(2026-09-14 に実際そうだった)。
- L390 (ja) — ★許容差は値域に対する相対で取る。絶対値で 1e-5 と決めていたら、 値域 (100,300) の画像で 1.04e-05 の差が「食い違い」として報告された —— が、切り分けると Rust vs scipy は float64 のままなら 8.53e-14、 float32 を経由した途端 1.04e-05。つまり
fslib の astype(np.float32) の丸めで、欠陥ではなく私の測り方の欠陥だった(値域比で見ると どの値域でも一様に 1.4〜5.2e-08 = float32 の相対精度)。 [[feedback_second_instance_artifact_not_physics]] と同じ型 —— 驚く結果は物理(実装の違い)で説明する前に道具を疑う。
tools/gen_blas_article_figs.py
- L93 — ★用半透明铺出 1 线程最快的区间。为不遮住线条先放置它,并把 alpha 保持得低(带子本身主张太强的话,线条的比较会变得难读)。
- L69 (ja) — ★「描く」= 機械に線を引かせる層(2026-09-22 追加)。「見せる」が人に見せる ための絵なのに対して、こちらはペンプロッタ・レーザー・刺繍のように 線でしか描けない機械への変換で、出口が G-code になる。
- L75 — 分类的英文名。★即使在英文版中也只有标题还是日文(实测 7 行)– 正文用
title_en / _summary_en 翻译过了,却忘了翻译标题,成了「切换了却混着日文」的典型。此处没有的分类照原文输出(不擅自造译)。
- L91 (ja) — ★レシピ欄がまだ無い能力(理由つきで名指し、免除は縮める側)。 レシピ欄は 2026-09-15 に当時の 16 件 + 新設 8 件 = 24 件へ付けた(ブランチ rag/recipes-and-help)。そのブランチが本線に入らないまま 1 か月が過ぎ、その間に 足された能力 32 件には欄が無い。2026-10-15 に移植したとき、その分の連鎖・限界・ 実寸校正を確かめずに書き足すことはしなかった(型の門は通っても、限界と校正の文が 実測でなくなる)。欄を埋めたらここから消す —— 消し忘れは :func:
load_all が落とす。
- L132 (ja) — ★型付きの連鎖で書けない能力(ファサードの API で、(画像, a, b) の op ではない)。上の「後で書く」 とは理由が違う: 推奨パイプラインの各段は OP_INDEX の in/out の sort で型検査されるが、ここは 仕様(辞書)を書き出す関数で、画像の連鎖の途中に置けない。限界は本文の「向かない」に書いた。
- L48 — ★对照表放在与算子文档不同的文件里。若用
opdocs.T,取用的原文会进入 opdocs.SEEN_STRINGS,现有的「框架译文有缺口」门就会把这 604 条全部算作缺口而使 CI 变红——那道门是为了让框架文案在五种语言上齐全,而这里是「译到哪算哪」的性质。混在同一张表里,会让一边的规矩毁掉另一边。
- L82 — ★一块 = 从含有 ★ 的行开始、以相同缩进接续的
# 注释行的连续。也拾取 Sphinx 风的 #: 注释。只剥掉 # 和空白,开头会留下一个 :
- L84 — 残下来,产物里就会出现「: ★…」(实际出现过)。
: 也在这里剥掉。
- L128 — ★下一个 ★ 到来时切成另一块(保持一块一个主张)。
- L220 — ★不翻译标记,固定为
_(ja)_。按语言翻译它会让机器无法计数 – tools/i18n_status.py 是数「没有标记的日文」的工具,所以标记若随语言变化,593 行就会变成「隐藏的日文」(实际变了)。ja 是语言代码,也向读者传达「这是日文」。
- L253 (ja) — ★2026-10-07: 言語版の目次 INDEX..md もノートではない(以前は 5 本を数えて 3089 本を 3094 本と書いていた)
- L281 — ★笔记的集合从台账取(不去枚举文件)。2026-09-06 的对抗式复查(Codex)中,glob 文件并数 stem 的版本混入了一个
docs/ops/SAMPLES.md(不是 op 笔记),于是索引是 1,842、RAG 指南是 1,843,同时公开了互相矛盾的数字。笔记从 records 以 1:1 生成,所以 records 里的名字就是「有笔记的名字」的定义本身。与文件的一致由 tests/test_docs_index_reachable.py 另行检查(检测消失/多余)。
- L291 — ★用
__all__ 而非 dir(fullseye)。dir 包含模块属性(os / sys / warnings / annotations),而且在别的测试 import 之后会增加一个(1094 → 1095),所以漂移门只在整套件里失败(2026-09-06)。公开面是门面在 __all__ 中声明的 1,091 个名字。
- L340 — ★索引不只是给人的,也是 AI 的检索面(2026-09-06 用户的指出「索引也是被当作 RAG 使用的部分吧?」)。op 笔记兼作 AI 编码辅助的检索语料,所以在索引里明示机器读取的入口。把只有一半的东西写成「全部 op」,RAG 就会对剩下的一半自信满满地弄错 – 所以
_honest() 的实测行不从本节移除。
- L498 (ja) — ★2026-09-14: 長らく かな だけを見ていたので、「Studio 北極星」「実測記録」 のように 漢字だけで書かれた題に印が付かなかった —— 非日本語版の読者は それを英語の題だと思ってクリックする(印を付けないのは「読めない」という 事実を隠すことで、無訳より悪い、というのがこの関数の趣旨そのもの)。 題は常に日本語版ファイルから取る(
_doc_title(rel))ので、漢字を足しても 中国語の題を誤って日本語と呼ぶことは起きない。
- L518 (ja) — ★2026-10-11: 訳文ファイル(
X.zh.md など)の題はその言語で書かれている。以前は 日本語版と同じく漢字で判定して (ja) を付けていたので、中国語版の索引で中国語の文書が 「読めない日本語」と表示されていた。印はファイルの言語で付け、自分の言語なら付けない。
- L529 (ja) — ★2026-10-11: 日本語の原文にこの言語の訳があるなら、訳の題と訳へのリンクを先に出す (以前は英訳があっても英語版の索引が日本語の題と日本語版へのリンクしか出さず、 読める版があることが索引から分からなかった)。原文が日本語であることの印は残す。
- L690 (ja) — ★Qiita 投稿用の frontmatter(— で挟んだ YAML)は題ではない。中の
title: 行は 下の走査では見出しにも読み飛ばし対象にも当たらず、そのまま索引の見出しになって しまう(「title: ‘…’」と並ぶ)。挟まれた範囲ごと読み飛ばす。
- L94 — ★status=fixed 却没有门的不放行 – 是为了让这个台账自身不制造出「只留下修好了的记录、却止不住复发」的状态。
- L196 — ★链接目标(
docs/hardening/*.md)是用日文写的。替换成英文标题就成了谎言,所以标题照原样输出并附上 (ja) – 非日文版读者需要的不是「翻译过的标题」,而是「这是读不了的」这个事实。标记固定为 tools/i18n_status.py 能数的形式。
- L41 — ★这里不是「只是个常数」:线积分 p = Σ μ·Δx 超过 10 时,exp(-p) 就低于光子数 1,对数饱和而 p 触顶(photon starvation)。最初的版本把 μ 放成 0.55–1.0「/像素」,于是 p 达到 30,复原 μ 偏低 50–84%。零点(简单反投影)反而在 Dice 上胜出,才因此察觉。
- L166 — ★每种材质的数字是 召回率(recall)。是「在该材质标签内拾取到的比例」,而不是 Dice(因为不数落在标签外的假阳性,若称作 Dice 必然趋近 1.0)。整体的漏取/多取由下面的 precision / recall 另行给出。
- L65 — ★缠绕顺序朝外。反过来法线就朝内,render_beauty 会不抛异常地返回全黑(最初的版本就是这样,只有薄膜的球是黑的)。
- L84 (ja) — ★2026-10-03: 運転の系列の集大成と「開かれた運転基盤」のために足した 2 分野。テーマ表は製造の表と分ける (共通の 1 枚に足すと、運転の「digital twin」が製造の予知保全の op に、製造の「reconstruction」が 3DGS に当たる)。
- L288 (ja) — ★2026-10-15: 実験計画・応答曲面・品質工学・感度解析(opsmultivar)。鍵は製造のクラスタ名に実際に出る語 (射出成形の「optimization」、加工の「optimization」「prediction」)—— 工程条件の最適化と予測は、文献では 直交表・応答曲面・感度解析で回す領域。
- L306 (ja) — ★2026-10-15: sim-to-real 較正(opssimcal)。鍵はクラスタ名に実際に出る語(慣性センサ・力覚の「calibration」、 鍛造・交通・レーダの「simulation」「modeling」)—— シミュレーションを実物に合わせる・センサを較正する領域。
- L320 (ja) — ★2026-10-15: 収束型の演算(opsconverge)。鍵はクラスタ名・葉の名前に実際に出る語(有限要素の「finite」= 格子の収束の検証、 霧・散乱・光線の輸送の「fog」「scattering」「transport」= 多重散乱のモンテカルロ、描画の「rendering」= 相互反射を収束まで)。
- L389 (ja) — ★2026-10-15: 10 月に足した op の系列(研磨・粉体・粉末 X 線)は、既存のテーマの語に当たらず文献層から 1 本も 指されていなかった。語はクラスタ名に実際に出るものだけを置く(当たらない語は当てない)。
- L535 (ja) — ★2026-10-03: corpus2skill は葉へ写すときに Authors / Date / URL の行を落とす(元の papers/*.md には在る)。 その結果、出荷した文献層の代表論文がすべて「— (n.d.)」になり、「新しい順」も日付なしで並んでいた。 葉の Source: が指す元ファイルから、欠けた欄だけを補う(元のパスは読むだけで、出力には書かない)。
- L651 (ja) — ★2026-10-15: ここはテーマごとに先頭 8 本で黙って切っていた。表の後ろに足した op(10 月の研磨・材料表・ ファイバ・触覚・peg-in-hole …)は対応表に在るのに文献層のどこにも出ず、表に書いたことが嘘になっていた (2026-10-15 時点の表 251 op のうち 21 本。うち 3 本は SPC のテーマの鍵がどのクラスタ名にも当たらなかった分)。 テーマは多くても 17 本なので全部出し、当たらないテーマは INDEX に名指しする(dead_themes)。
- L101 (ja) — ★2026-10-15: 上の TIO2 はルチル単結晶の常光線だけ(430 nm から・k なし)。成膜した TiO2 は非晶質か アナターゼが多く n が低い —— 膜の計算はこちらを名指しする(非公開の膜の PoC で、ルチルの n で膜を 解くと傾いた面の膜厚の偏りが小さく出ることを確認)。
- L145 (ja) — ★光収率の幅(
light_yield_range_photons_per_mev、2026-10-24): 文献の値のばらつきが「何の違い」から来るかを 読んだ材料だけに (下限, 上限) を入れる(CdWO4 と LYSO)。それ以外は None(幅が無いのではなく、確かめていない)。 CdWO4 の 7,800〜15,800 という低い値の多くは、減衰 13 µs に対して整形時間が短い(1 µs では光の 2〜3 割しか 拾わない)ことと、光電子数 phe/MeV(光検出器の QE と光の集め方を掛けた後)を光子数 ph/MeV と混ぜたことによる。 こうした値は幅に入れない —— 幅は「絶対値として測った値」どうしの違いだけにする。
- L151 (ja) — ★発光の形(
emission_components、2026-10-24): 室温・X 線/γ 線励起で FWHM を数値で書いた一次文献は 見つからなかった。幅は全部、一次文献の図から読み取った値で、成分ごとに digitized_from_figure の印を付ける。 1 成分 = 中心 [nm]・FWHM eV・積分の重み・測定配置(surface = 励起した面から出る光 / thick_crystal_transmission = 厚い結晶の中を通って出てくる光)・励起の種類(xray / gamma / uv)・ 出典。ガウスはエネルギー軸の形(Ce³⁺・自己束縛励起子の帯はエネルギーで対称)で、波長軸へは消費側 (dualxray.scintillator_sensor_qe)がヤコビアン hc/λ² を掛けて移す。同じ測定配置の成分の重みの和は 1。
- L157 (ja) — ★
center_nm はエネルギー軸の中心(hc/E_c)。波長軸の山はヤコビアンで数 nm 短波長に出る(BGO 480 → 468 nm)。 図の「極大」は波長軸で読んだ値なので、厳密には中心をやや長波長に置くべきかもしれない —— 差は Q̄ で 1.4 % 以内 (2026-10-24 に計算)で、調査で承認された値(中心 = 公表の極大)をそのまま使う。 幅の分からない材料(CsI:Tl / NaI:Tl)は None のまま —— 消費側は発光の極大の 1 本の線として扱い、そう 返り値に書く(幅を推測で入れない)。実測の発光スペクトルがあれば emission_spectrum= で渡す (CsI:Tl は 2.25 / 2.55 eV の 2 帯だと分かっているが、幅と強度比を確かめられなかった)。
- L539 (ja) — ★k だけを取る区間(n は次の出典のまま)。2026-10-15: RII の Hale & Querry の水は NIR を 0.2 µm おきにしか持たず、1.45 / 1.94 µm の吸収帯を線形補間で 1/3 に潰していた。n は滑らか なので Hale のまま、k だけ Segelstein 1981(同じ研究室の続き、細かい刻み)から取る。
- L105 (ja) — 任意キー。ここに無いキーは拒む(fail-closed)。★所属・勤務先・製品名の欄は 意図して持たない —— 報告者に求めない情報は、台帳に置く場所も作らない。
- L313 — ★这是下界。因为它只看 op 名是否在
tests/ 中以 literal 出现,所以扫台账跑遍全部 op 的扫掠型测试(for name in ledger: ...)不计入。要读作「没有指名的测试」而非「没有测试」。
- L335 (ja) — ★報告が付いた行にだけ鍵を足す(空の台帳で出力を動かさない)。 repo 内の判定は別の鍵に残す —— 1 つの段に畳まない。
- L265 (ja) — ★fail-closed: op の一覧は台帳の本体。ここを「(section failed)」の 1 行で済ませると カタログが黙って空になる(pip だけの利用者の RAG はこのファイルしか持たない)。
- L90 (ja) — ★2026-09-17: 戻りの橋
feature_to_img で feature が初めて入力に なった。1 段で image -> feature を作れる op(intensity = 平均輝度)を 前置きにする。これが無いと図が「型が届かない」に落ちる。
- L99 (ja) — ★2026-09-17:
deskew は「傾いていないものは動かさない」op なので、合成の 標準入力(canonical_image)に掛けると in と out が同じ絵になり、図が 何も語らなくなっていた(実測: 標準入力 8 枚のうち 5 枚で恒等、図は恒等の 方)。走ったことと意味のある出力が出たことは別 —— 先に 7.0 度 傾けてから 渡す(rotate_img の角度は -45 + 90a なので a=0.5778 が +7.0 度)。
- L115 — ★2026-09-08:在这张表里的
tb_angle_3points 和 tb_indices_to_labels,不是「在图的定义域之外」,而是 不该放到桥上的 op。前者取 3 条向量,所以单条点云无法调用;后者返回 1-D,却把声明的 out 定为 labels(→ volume = ndim 3)。两者都保持注册着却一次也没运行过,fail-soft 返回着貌似合理的值。移到 backends_typed._OP_BRIDGE_SKIP,并从这张表里移除 – 有「出不了图」的记录,却在任何地方都没有「无法运行」本身的记录(有两道门,只有一道察觉到了)。
- L124 (ja) — ★2026-09-13: op が evolute 検証を得て厳格化。ECEF は地球表面(中心から ~6.4M m)の 座標を要るが、画像由来の合成点は原点付近で必ず楕円体の evolute 内に落ちるため 正しく拒否される(実データでは動く。合成入力では図を作れない恒久的な定義域ミスマッチ)。
- L127 (ja) — ★2026-10-04: 主点を 0.5 画素ずらすだけの橋(CARLA ↔ Fullseye の内部パラメータ)。3×3 で焦点距離が正の K しか受けず、 汎用の合成 matrix は fail-closed で拒否される(op_probe の探針 K では走る —— tests/test_backends_typed_liveness.py)。
- L140 — ★2026-09-07(用户指示「不必汇总成一张。分阶段的、有多个条件的分开出」「有些东西用伪彩色更好懂」「复杂的甚至可以用动画 GIF」)。在主图
<op>.png 之外,再加:<op>.a.jpg / <op>.b.jpg — 把旋钮拨到 0.1 / 0.5 / 0.9 的 3 张(仅当输出变化时。不变化就在 manifest 写理由)<op>.chain.jpg — 有前置 op 的 op 的阶段图(图像 → 中间 → 输出)<op>.gif — 当输出是视频 / 光场 / 体积时,依次展示帧 / 视点 / 切片(静图 <op>.png 为完成形,GIF 是追加。Studio 的 QTextBrowser 显示第 1 帧)。伪彩色只施加于量的场(距离·相位·朝向·深度·曲率 …)的输出,并在标题写 (viridis)。滤波类保持灰色(不呈现为会变色的 op)。
- L756 — ★「跑了」和「出了有意义的输出」是两回事(2026-09-07,用户指出「out 全黑是怎么回事?」)。把空数组算作「有图」,黑板就成了图。空就记为空,并在笔记里写理由。
tools/gen_view2026_pages.py
- L181 (ja) — ★2026-10-30: 2 つの展示の日本語が 10/27 から「???…」のまま載っていた(× と − も全言語で ? に)。 文字コードの往復で失われた文字は ? か U+FFFD になる。どちらも訳として通さない。
- L592 — ★2026-09-02:highpass / bandpass_image 现在遵循「把 0 映射到 0.5 的 [0,1]」的约定返回。以前它们把带符号数组称作 image 返回,在保存·段间 clip 时负的那一半(约 50% 的像素)被无声地压成 0。把修好这件事用实测而非推测记录下来:最小值和负像素的比例。
- L727 — ★2026-09-02:estimate_noise 现在以 σ 的单位返回(以前在 σ>=0.08 时贴到 1.0,对相差 3 倍的 σ 返回相同的值)。摆出直线 y=x,好用眼睛确认「返回值是否就是 σ 本身」。
- L840 — ★_panel_grid 的标签不换行,一旦超出宽度就会和相邻的相撞而读不了(tile 262px / font 19-17px,所以一行 ≈ 12 个全角字符为上限)。把倍率的含义放到标题和副标题里,面板上只放简短的名字和数字。
- L1184 — ★2026-09-02:
area_center 现在如其名返回 (面积比, 行, 列) 3 个分量(此前只有面积比 1 个标量,不返回中心)。
- L1186 — ★自 2026-09-26 起 3 个分量都以像素表示(面积 [像素数], 行 [px], 列 [px])。此前为 [0,1] 归一化,这里乘以 (H-1) / (W-1) 还原为像素(直到 2026-10-15 修正前,一直把像素值再乘以 (H-1))。把返回的中心画在图上,让人一眼看出返回值确实是中心。
- L1713 — ★逐点调用 apply_cmap 的话,会在那一个点之内归一化,于是全都变成同一种颜色。只做一次张开 0..1 的 LUT,从中查取。
- L1951 — ★2026-09-02:gabor 现在采用除以核的 L1 范数的固定尺度,返回可跨 op 比较的绝对值。此前它除以「该图像中的最大绝对值」,于是每个朝向都除以不同的除数,把响应的大小本身 = 朝向的判别力压垮了。作为代价,返回值落在 [0,1] 低端的狭窄区间(这 3 种花样里平均 0.007–0.030),所以直接贴上去 3 张都是全黑。图用 1–99%tile 拉伸来显示,标签的数字给出拉伸前的实测值(与 freq_sweep 的 highpass 面板相同的约定)。
- L2066 — ★2026-09-02:3 个 op 变成了各自独立的实现。以前 3 个都搭在 geom “zoom” 上,相互的最大差为 0.0 / 4.9e-14(= 相同),而且 3 个的 b 都是死的。现在 zoom_image_factor = 纵横 2 个倍率 / zoom_image_size = 目标尺寸 / rescale_img = 等方倍率 + 插值阶数。画布 shape 都保持为输入原样。
- L3878 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L411 — ★噪声用 :func:
astrostack.noise_sigma(背景的稳健 σ)来测。用「与真值的残差 RMS」的话,连 PSF 的偏移都会进到残差里 – 这个实验特意逐帧改变 FWHM,所以选法一变,合成后的 PSF 就变了,残差增大到底是因为噪声还是因为像变了就分不清了(实测该值从 25.2 -> 61.3,但其中大部分并不是噪声)。背景 σ 不依赖于星的形状。
- L471 — ★「最大差」在单帧下不动 – 因为只要召回率不足 1,漏掉的 1 个像素就会原样压住最大值。用有多少像素仍大幅偏离正解和偏离的总量,去除的效果就会如实显现。
- L713 — ★ 按原始尺寸排列时,”检测到 2 个” 无法用肉眼确认(在 44x44 之内,相距 1.6 像素的一对只会成为几个像素大的一团)。为了不做出只让读者相信检测器说法的图,围绕每对裁出相同的物理范围并放大。
- L844 — ★ 误差图涂的是大小而非符号。最初的版本用发散配色,但本实验的误差始终为正,于是变成”正 = right 的蓝色”,得到相反的含义——损坏的状态被涂上了”正确”的颜色。这里想向读者传达的不是方向而是”错了多少”,所以只用 wrong 的单一颜色改变浓淡(为了不让含义只由颜色承载,同时并列标注符号和数值)。
- L1417 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L573 — 5. ★跨越各种表示走一圈(变换的连锁正是谎言出现之处) # ————————————————————————— #
- L599 — ★ “是壳而非实体” 不可用最大值投影来断言 —— MIP 取的是深度方向的最大值,所以即便是薄壳内部也看起来是填满的(实际上曾经那样画过,差点给出”体积 5768 -> 壳 5608”这种几乎无差别的数字)。内部是否残留,用中心断面和内部填充率来说明。
- L862 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L2065 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L896 — ★ 条纹所张成的像面的实际尺寸。设为 1.0 mm 时,208 采样/mm = Nyquist 104 cyc/mm,于是 200 cyc/mm 的条纹变成了 8 cyc/mm 的粗条纹(图自己在混叠)。若为 0.25 mm 则是 832 采样/mm,即便是最高频率 200 cyc/mm,一个周期也有 4.16 像素,足够了。
- L1151 — ★ 把两个量叠在一张图上,取决于尺度的取法,两条曲线可能偶然完全重合(最初的版本正是如此,看起来与”两个独立轴”的主张完全相反)。调尺度把它们拉开是蒙混,所以把面板纵向分开——图的结构本身就说”这是不同的轴”。
- L1299 — ★ 峰值取自整行。以前写成
line[c - s : c + s + 1],当 s 超过 c 时,起点变成负索引,于是 Python 只切出末尾 56 像素,把 0.6167 当作”峰值”返回(实际最大值是 0.9834)。归一化崩坏,曲线在 1.0 处封顶,dip/peak 也在 1.9x Rayleigh 处错误地给出 0.0067。
- L1581 — ★ “模糊在 1 像素以内”的范围不从格点上采。扫掠步长为 3.9 mm,而景深只有 0.74 mm,所以格点上一点都落不进(最初的版本就因 min() 变空而崩溃)。用二分法直接求边界本身。
- L1600 — ★ 夸张倍率是 纵向 像素/mm ÷ 横向 像素/mm。最初的版本写成了倒数,在拉伸了 8 倍的图上显示”0.13 倍”(向读者传达了完全相反的信息)。
- L2090 — ★ 分成上下两栏。叠在一张图上时,单位不同的两条线(像素数与检测率)会被读成落在同一纵轴上(实际上看起来正是如此)。
- L2776 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L52 (ja) — 総合案内。★既存の Qiita 枠がこのファイルを指しているので、名前を変えない ―― 外部リンク・LGTM・ストックはこの URL に付いている。館の入口に充てるのが筋。
- L150 (ja) — 1 展示に出す静止画の追加枚数。★2 枚固定をやめる(2026-09-24)
- L405 (ja) — ★見出しは収蔵番号。順路番号(何番目か)は出さない —— 展示を 1 つ挟むだけで 以降が全部ずれ、記事を分けるたびに番号が動くため(2026-09-25)。
- L433 (ja) — ★追加の静止画。説明は 1 文に切る(枚数を増やすのが目的で、詳しい 説明は主図と 2 枚目が持っている)。2026-09-24 に 2 枚固定をやめた。
- L459 (ja) — ★展示に載るのは 1 本あたり 2 枚ほど。PoC は中央値 6 枚・最大 25 枚 作っているので、残りへの道を必ず出す(2026-09-24、ユーザー指摘 「生成した数百枚はどこにあるのか記事からは分からない」)。
- L484 (ja) — ★解説板の「この部屋の {n} 点」は生成で埋める。手書きの数は腐る ―― 10 翼中 9 翼が展示 53 点の頃の数を名乗ったままだった(産業検査は 10 と 書いて実際 27、2026-09-25)。例外は出ず、門も赤くならない。
.format は使わない(解説板に別の波括弧が在ると壊れるため)。
- L533 (ja) — 棟の目次。★展示数は毎回数えて出す(手で書くと必ず古くなる)。
- L539 (ja) — 目次に出す短い翼名。★区切りは ` / ` —— 翼名そのものに「・」が入るので (寸法・形状計測 / 医用・生物 / 色・分離)、「・」で繋ぐと境目が読めなくなる。
- L645 (ja) — ★
external の部(手書きの数学記事)は描かない。index は案内なので上で出した。
- L2611 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L219 (ja) — ★2026-10-18(外部レビュー 0.6.0 N220 の一次検証): 以前は
--all-region が大域の _REGION_MODE を 立てるだけだったので、--all-image --all-region を 1 回で回すと画像の op まで二値の探針で測り、 別々に回すと 2 回目の --json が 1 回目を上書きした。結果、op_knob.json は region -> region の 87 op を一度も載せておらず(461 / 567)、9-16 以降に足した image -> image の 19 op も未計測のまま だった。二値の探針は op ごとに、入力の型(索引の in_sort)が region のときだけ使う。
- L657 (ja) — ★効かないノブを台帳に足して黙らせない(2026-10-23): 既定の入力では効かない 3 本は、効く入力で探る。 fp_design の境の許容は NA_obj = 0.12 で軸の 2 番目の LED(NA 0.1135・0.1267、差 0.0065)が許容の 2 倍の内側に入る。
- L949 (ja) — ★探針の 32×32 だと目盛の文字幅が書体で変わり、手元(Windows の書体)は右に 3 px はみ出して 拒否・CI(代替書体)は収まって通る —— 環境で判定が割れた(2026-10-11)。余白を取って両方で通す。
- L430 (ja) — ★2026-10-14: 絶対許容差 1e-12 は、出力が 1e-21 の桁(重力波のひずみ
chirp_newtonian)だと どのノブも「変化なし」にする。出力の最大絶対値が 1 より小さいときは、その大きさで許容差を縮める (1 以上の出力では以前と同じ)。
- L42 — ★ 在缺少这一步的期间,:func:
_called 对 (op 名 × example) 的所有组合调用 :func:_strip_prose,每次都用 ast.parse + tokenize 重新解析整个源码。实测 2026-09-05:2-D 881 op × 73 本 + 3-D 347 op × 118 本 + ledger 494 op × 73 本 = 约 14 万次完整解析,一次 opdocs.py md 要花 10 分钟(toc 和 html 也重建同一索引,所以完整再生成是 30 分钟级)。散文剥离每个源码一次就够了 —— 因为它不依赖 op 名。
- L142 — ★2026-09-08: ops1d(dsp 16 + funct1d 23)虽已注册,却 在 docs/ops 下没有一张笔记 —— 它出现在 OP_CATALOG 中,但因为没有每个 op 的笔记(类型契约、陷阱、相关 op),从 RAG 语料库中整个缺失。是在
poc_web_roll_periodicity 给 dsp 添了 2 个时发现的。
- L919 (ja) — ★2026-09-23 の実測: 1 回 7〜11 秒かかるこの関数を、
gen_docs_index_ops が 6 言語 x 3 ブロックで 18 回呼んでおり、test_the_generated_blocks_are_current だけで 129 秒使っていた(スイート 2,301 秒の 5.6 %)。答えは ops.REGISTRY と docs/ から決まり、1 プロセスの中で動かない。 前提は「同じプロセスの中では台帳とノートが変わらない」。生成器は regen_all.py が別プロセスで呼ぶので跨がない。プロセス内でノートを 書き換えてから読み直す側は _records_cache_clear() を呼ぶこと (呼ばないと古い答えが返る —— 黙って古い値を返すのが一番たちが悪いので、 ここに明記しておく)。
- L981 — ★n 元(多输入)层。到 2026-09-09 为止有 17 个算子一份说明都没有(
add_image、sub_image、bit_and、reduce_domain、union2…)。它们以 tier=nary 出现在 OP_INDEX.json 中,但 docs/ops/ 下没有说明,于是永远无法从 RAG 语料中检索到。漏掉的原因很清楚:这里只遍历 ops.REGISTRY,而 ops.REGISTRY(899)与 2-D 说明数(899)相等,从注册表一侧数就显得毫无缺失。只有跨层去数才会暴露。
- L1023 — ★2026-09-07:
OPS3D[...]["doc"] 是注册时只切出 docstring 的第 1 行的产物(ops3d._build)。在笔记的”用法”里用它,无论实现写了几段都会变成一行 —— “用法只有一行的 op 494 本”中的 3-D 部分正是这个截断造成的(docstring 本身很长的 op 很多)。和台账 dim 一样,把函数的 docstring 整个读进来。
- L1046 — ★ 桥接 op(
tb_<name>)与台账的 <name> 实现相同,示例以台账名书写。到 2026-09-06 为止有 147 本是”零示例”,但那只是没有数到以别名存在、调用同一实现的示例而已。继承台账一侧的示例,并在笔记中明确写上”原 op 的示例”(以免说谎)。
- L1104 (ja) — ★2026-10-12: 2-D の例索引(
op_example_index._op_names_2d)は ops.REGISTRY から identity と 橋渡し op(category typed)を外し、n-ary 層(imgops_nary)はそもそも数えない。そのため この 3 種のノートは、examples/ に fullseye.apply([x1, x2], "add_image") や fullseye.apply(F, "tb_cx_ifft") と名指しで呼ぶ例があっても「(まだありません)」のままだった (n-ary 17 本・identity・元 op の例を継承できない tb_cx_* 7 本)。カバレッジの門の母集団は変えず、 ノートの案内だけ同じ呼び出し検出(_index_for)で名前を直接引く。
- L1282 — ★n 元算子无法通过
fullseye.apply 调用——那是单图模型。在这里写单图的调用方式会让说明撒谎:说明唯一的职责就是告诉别人怎么调用,所以错误的调用方式比没有更糟。公开入口是 fullseye.FullseyeGraph。
- L1301 — ★2026-09-07: 先写公开路径。这里只写了实现模块的直接 import,没有出现使用者实际使用的
fullseye.ledger.<名>(除 2-D 以外的全部 1,244 op)。PoC 反复报告”fs.<名> 里没有",问题不在于名字缺失,而在于**入口没有写**。名>
- L1752 — ★ 入口用 6 种语言呈现(2026-09-09)。叶子(Studio 的 op 帮助)有 6 种语言 10,191 页,然而通向那里的索引却只有日语 —— 译文存在却到不了,这种形式的缺失。框架的文案放在
T() 上,所以对照翻译的空洞由既有的门(test_chrome_translation_table_has_no_holes)来看守。
- L1792 (ja) — ★2026-10-15: 族の名前だけでは中身が分からない。
drive(694)は研磨(polish)・粉末 X 線回折 (pxrd)・触覚(tac*)・peg-in-hole を抱え、optics は材料表(matprop)・ファイバ(fiber)・ センサーの特性(sensorchar)を抱える —— 族名で選ぶ読み手は、それらを開かずに「無い」と言う。 入口でカテゴリ名を全部見せる(名前は識別子なので訳さない。各カテゴリはその族の INDEX の節)。
- L1803 (ja) — ★2026-09-15: 用途から引く索引(docs/CAPABILITIES.md)へここから送る。文書だけを 渡した AI が 1 回目に見つけられなかったのは、この目次にも AI_RAG_GUIDE にも 導線が無かったから。
- L1812 — ★ 这里长期只指向
2d/guides/,从未把读者引向光学、PIV、断层成像等 30 个族的指南(2026-09-09 修正)。
- L1970 (ja) — コードスパン。★
…(RST / docstring の二重バッククォート)を … より先に試す。 2026-10-07 まで ([^]+) だけで、p measures … p が「 の 2 文字目と次の の 1 文字目」で組まれ、コードと散文が**反転して**表示されていた(英語版 3,153 枚中 約 2,800 枚)。前に付いた RST ロール(:func:x など)は飲み込み、対象名だけをコードで出す (733 枚で :func:` が生で見えていた)。
- L2139 (ja) — ★置き換えは描画時と同じ退避記号で(空白にすると
**raises `ValueError`** の閉じの 直前が空白になって太字の組が外れず、英字にすると **name**`(a)` の閉じの直後が 英字になって外れない —— どちらも「閉じていない」と誤判定して次の箇条書きを飲み込んだ)。
- L2841 (ja) — ★2026-09-20: 生成を終えたあと、インタプリタの終了処理(fullseye が引き込む mediapipe の shutdown dispatcher)で 30〜60 分固まり、regen_all の連鎖がその間止まった(2 度実測、CPU 0)。 出力は全部書き終えているので、flush してから os._exit で確定させる。
- L121 — ★ 如果
build/lib 里残留着上次的 staging 副本,setuptools 会原样把它塞进 wheel(2026-09-05 实测:从 py-modules 中移除的模块仍留在 wheel 里,门的变异测试竟然通过了)。这与 release.yml 从 clean checkout 构建的理由相同。这里也一样,构建前务必清除。
- L233 (ja) — ★2026-10-18: スクリプトは一時 dir に置くので、
import fullseye は editable install(本線の 作業ツリー)を読んでいた —— worktree で出すリリースを検査したつもりで、別の版を見ていた。 PYTHONPATH でこの ROOT を先頭に置き、点検する対象 = 出すツリーにする。
- L319 (ja) — ★全出力は repo の外に残す。repo 直下に置くと「余計なファイル」を見る門に 当たりうるし、木が汚れて「凍った木で 1 回」という証拠の条件が崩れる。
- L362 — ★ 不带
--full 调用 --only suite 会得到 0 个项目,以前会说”全部 PASS”并以 rc=0 返回(2026-09-05 评审中实测)。什么都没检查却放行的门,比没有门更糟。
- L20 (ja) — # 選び方(★ここが肝)
- L55 (ja) — ★
__all__ と list_ops は入れない。どの族のテストにも出てくる語なので 392 本中 107 本を選んでしまい、そのうえ肝心の探針の門(test_op_probe_ledger)は その語を持たないので取り逃す(2026-09-23 実測)。広く取れば安全、ではない —— 選ぶ語は「その帳簿を読んでいる」ことの証拠でなければならない。
tools/qiita_post_poc.py
- L100 (ja) — 既定で投稿する記事の種類。★手書きの
external は名指ししたときだけ扱う —— 引数無しの 一括投稿が、生成物でない記事(数学の回など)を巻き込まないようにする。
- L49 (ja) — ★最上流。
auto_specs_data.py は backends_auto が registry を組む入力(wheel 同梱の data/auto_specs/*.json の複製)なので、registry を読む下流すべてより先に回す。 2026-10-07 まで tools/ の外にあって鎖にも表にも無かった(差分は無かったが、 spec を足して回し忘れても誰も気づけなかった)。
- L54 — ★唯一位于
tools/ 之外的生成物。正因如此才被漏掉——只要按 tools/*.py 去找生成器,就永远找不到它。
- L56 — ★2026-10-15:从第 16 位提到第 2 位。它的输入只有 registry(不读其他阶段的生成物),但 gen_capabilities_index 和 gen_trust_block 却先于它读取此文件——在新增 op 的合并中若索引取主线一侧,旧索引里没有新 op,链就会停下(集成工作中是先手动运行
imgevolve.py index 绕过的)。顺序由下面的 OUTPUTS / READS 经 order_violations() 检查。
- L73 (ja) — ★展示館より先に回す —— 生成器は見出しに収蔵番号を出すので、 未発行の展示が 1 つでもあると BuildError で止まる。
- L88 (ja) — ★これも
tools/ の外。2026-09-20 まで鎖に無く、docs/OPERATORS.md が 885 op / 47 分類(2026-09-06 の値)のまま置き去りだった(GenSpark 第 53 報と ユーザー指摘)。生成器が鎖に無い生成物は、必ず古びる。
- L92 (ja) — ★2026-10-07: 以下 3 本も
tools/ の外にあり、列挙が tools/*.py しか見ていなかったので 鎖にも表にも無かった。どれも registry とコミット済みの入力だけから決まり、2 回 回してバイト一致・各 3 秒(実測)。置き去りの実例: EXAMPLES.md は「67-op」、REFERENCES.md は「153 operators」、 OP_DISPOSITION.json は implemented 324(実際 405)のままだった。
- L100 — ★2026-10-15:没有
--md,什么都没写(只把摘要打印到标准输出)。docs/CONVERSION_MATRIX.md 停留在 2026-09-02 的“类型 59 / 转换对 164”而过时,而 –check 无法把“不写的阶段”视为 drift,于是通过了 6 周。现在由 trace_problems() 拒绝“连声明的输出都不碰的阶段”。
- L108 (ja) — ★2026-10-15: 13 番目から最後の方へ下げた。docmap が docs/.md の題を読むので、 題を持つ生成物(OPERATORS / REFERENCES / EXAMPLES / EXAMPLES_3D / SENSOR_PLAYBOOK / CONVERSION_MATRIX / DESIGN_NOTES)を書く 7 段すべてより後でなければならない —— 以前はその 7 段より前にあり、題が変わると 2 回回さないと揃わなかった。 文献層の本体はコーパスが要る(EXCLUDED)が、「op ノート N 本」の件数は docs/ops を数えれば直せる。 docs/ops を書く opdocs の後、題を読む docmap(gen_docs_index_ops)の前。
- L308 — * ★而且危险:刚生成的文章用相对路径写图像。公开版是改成
raw.githubusercontent.com 绝对 URL 后的(Qiita 用相对路径不显示图像 —— memory feedback_qiita_svg_path_and_cache)。只跑生成器,那些绝对 URL 会回退 42 行。要跑就一直跑到文章的公开步骤为止。 排除项要按文件名写。用散文归纳(”wing*_gallery 的 10 本”)机器无法比对,下面的 unclassified() 就不工作了。
- L675 (ja) — ★2026-10-07: 印も探す場所も狭すぎた。初版は
open(..,"w") / write_text / savefig / json.dump だけを tools/*.py(直下のみ)で探していたので、 * repo 直下の生成器が 1 本も見えなかった —— samples.py(docs/EXAMPLES.md が 「67-op」のまま)、references.py(「153 operators」)、dispositions.py、 lib_coverage.py(885 op のまま)、honest_summary.py …。imgevolve.py と catalog.py だけが手で足されていた —— 手で足す方式は、足し忘れを拾えない。 * 画像の書き手が 1 本も釣れなかった —— PIL の .save、imageio の mimwrite、write_bytes、Fullseye 自身の write_video / save_gif …。 gen_banner の PNG は「731 2-D + 265 3-D」と書いたまま古びている。 * tools/impl2/ など下の階層も見ていなかった(docs/op_*.json の台帳)。 印を広げれば門・デモ・ライブラリも釣れる。それは構わない —— 釣れたものは全部 上の表に理由つきで載せる(印は緩めない)。
- L690 (ja) — ★2026-10-25: まだ狭かった。
pv.write_viewer( / fs.write_viewer( で HTML を書く生成器 (tools/build_view2026_viewers.py、題材の枝の tools/build_*_anim3d.py)がどの表にも 載っていなかった。同じ洗い出しで open(.., "wb")("w" しか見ていなかった)と shutil.copy* / copytree / move も足した。印ごとに「その印でしか釣れない実在の 生成器」を tests/test_regen_all.py が要求する(印を消せば落ちる)。
- L738 — ★位于
tools/ 之外的生成物。只遍历 tools/*.py 永远发现不了它,实际上 docs/OP_INDEX.json 就一直被漏掉。
torch_lazy.py
- L69 (ja) — ★2026-09-20(GenSpark 第 24・25 報 N94): torch が入っているのに「install with」だけが出て、 導入すれば直ると誤って案内していた。入っているのに import で落ちたなら、その理由を言う。
treemorph.py
- L217 (ja) — ★殻の中点に置く((k - 1/2) * top / n)。上端を top ちょうどにすると最も遠い節点が 殻の上に乗り、回転で 1 ulp 動いただけで「内側/外側」が反転して交点が 1 -> 0 になった (回転不変の門が捕まえた)。
typed_catalog.py
- L242 (ja) — ★打ち直しは入力の頂点数より少ない標本を拒否する(角を切って線が短くなり、 濃淡の再現が壊れるため)。探針より確実に多い数を渡す。
- L252 (ja) — ★2026-10-07: 一時ファイル名にはプロセス番号を入れる(固定名だと xdist の別ワーカーが同じファイルを 同時に書き直し、読む側が壊れた zip や途中の G-code を掴む)。 printpath(2026-09-21)。読む op のパスは、その場で書いた小さな本物のファイルにする(無いパスは CONTRACT で 永久に走らない)。書く op のパスは一時ディレクトリ。z は種の mesh(単位立方体あたり)に当たる高さ。
- L323 — ★ 默认值本身很重的情况另作处理 —— 在 docstring 里写了费用表,并在 docs/KNOWN_ISSUES.md 中作为”未解决”保留。这里减轻是为了通过检查,而不是为了掩盖慢。fourier_smooth(points, keep) 的 keep 是没有默认值的必需参数。若无法绑定,就会以”参数组不起来”被永久跳过,在覆盖率表中只作为未到达出现(2026-09-06 首次计测时 13 op 中只有这 1 本掉了)。表面粗糙度。约束为 2dx <= lambda_lo < lambda_hi <= ndx / 0<hurst<1 / sq>0 / n>=8。亚像素计测。测量线的生成 op 不取输入,所以全部参数都需要提示。
- L388 — ★ 不加这一步,surface_params 每次都会 fail-closed 被拒绝,单看覆盖率这一个数字像是”能调用”,实际却从未执行。
- L561 (ja) — して探針の値が読みやすいようにする。★既定の weight=”phat” は band が必須(0.5.0、 全白色化は帯域の限られた信号で外れる)。rate=1.0 なので band は cycles/標本で全帯域を明示。
- L578 — ★ 法线不要平行于轴。若与轴平行,距离场只沿一个轴变化,图的生成器做的”堆叠切片的 GIF”会塌成一帧(2026-09-08 实测)。倾斜的法线则所有切片都会变化。长度不起作用(op 会归一化),所以传入未归一化的向量,把这个规格也展示出来。
- L650 (ja) — ★32x32 は chain_fuzz の cimage プール(32x32)に合わせた値。進化の橋 (backends_typed)はこれを使わず、呼び出しのたびにスペクトルと同じ形の H を作る (backends_typed.CALL_TIME_ARGS。固定形だと他の大きさの画像で必ず拒否された、2026-10-07)。
unified.py
- L559 (ja) — ★2026-09-20(GenSpark 第 53 報 N181): dict / list を registry の鍵にして unhashable で落ちていた
verify_auto.py
- L74 (ja) — ★
match は 1 次元ベクトル(ops._ncc_locate と同じ形)。1 スカラー では表せない組(面積+重心、楕円の 3 指標 …)を運ぶために在る。 この枝が無かったので、下の「image / region = 2 次元」に落ちて ndim=1 で弾かれていた —— 正しく作られた op が「実装されていない」 と数えられ、HALCON 対応数が静かに 1 本少なかった。
video.py
- L228 (ja) — ★2026-10-24: imageio (Pillow) decodes a 16-bit RGB/RGBA PNG to uint8 and the uint16 request then stretched those 8 bits (off by up to 237/65535). A still PNG declaring > 8 bits goes through raster.read_raster (OpenCV, or refused).
visionlab.py
- L53 — ★
float("50") 会成功,所以仅仅让它通过 float(),字符串就会作为毫米蒙混过关。visiondesign 一侧会拦截,但若在这里先转成 float,在到达那个校验之前就已经变成数值了(敌对性验证实测:VisionSystem(focal_mm=”50”) 通过了)。容器一侧也要持同样的规律。
visualhull.py
- L127 — ★ 一个不剩地所有点都在相机后方 = 几乎肯定是姿态的规约不符(2026-09-08,poc_livestock_body_volume 踩到)。这个函数要求 OpenCV 规约(+Z 朝前),但公开层中带
look_at 名字的是 render3d 的 gluLookAt 版(−Z 朝前的 4x4)。传入它的 M[:3,:3], M[:3,3] 会让全部 voxel 被判为后方,无一例外地返回空的轮廓,得到空的 hull。默默返回空,就和”雕刻完毕”分不清了,所以唯独这里要出声(也有有效的场景 —— 物体在视角后方 —— 所以不 raise 而只停在警告)。
volops.py
- L1201 (ja) — ★半径は刻みの整数倍に落とす。EDT は離散球の中心で半径より少し大きい値を返すので (半径 4 の球で ~4.12)、生の最大値から刻むと直径が系統的に +0.1 ほど大きく出る。
- L1214 (ja) — ★膨張は前景をはみ出す(離散の球で膨らませるため)。実測で 24% 漏れ、粒度分布の 生存率が 1.0 を超えた。太さは前景の量なので必ず前景で切る。
- L1313 (ja) — ★最大厚さの次の刻みまで伸ばす。ここで止めると一番太い特徴の質量が 一度も消えず、分布から丸ごと落ちる(実測: 体積の 71% が欠け、平均径が 18.0 のところ 15.1 になった)。
- L1333 (ja) — ★一様なブロックでは勾配が丸め屑しか残らず、固有値分解はその屑から任意の向きを 返す。絶対値の床は輝度スケールに依存するので、必ず相対量で切る。
world_render.py
- L69 (ja) — ★
resolve() は実在しない場面に None を返す(資産が無い環境では正しい)。 検査せずに spec["xml"] を引くと TypeError: 'NoneType' object is not subscriptable という、原因を何も語らない例外になる —— 呼び手には 「何が無いのか」と「どう直すのか」を返す。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.