Fullseye-Entwurfsnotizen (aus den ★-Kommentaren im Quellcode erzeugt)
日本語 · English · 简体中文 · 繁體中文 · 한국어 · Deutsch
Dieses Repository hält das Warum in Kommentaren im Quellcode fest. Die mit ★ markierten sind die tragenden — was gemessen wurde, was schiefging, warum es so gebaut ist. Diese Seite sammelt sie maschinell ein; maßgeblich ist der Quellcode, daher können beide nicht auseinanderlaufen.
Übersetzungsstand: 612 von 1571. Nicht übersetzte Einträge stehen im japanischen Original — ein stiller Rückfall sähe aus wie eine Übersetzung, darum wird eine fehlende Übersetzung als fehlend ausgewiesen.
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 — ★Das Fenster muss größer als die Vorlage sein, sonst geht die Zahl der Full-Overlap-Positionen auf null → r = T//2 + f(Grobfehler) + win.
acoustics.py
- L1173 — ★
med == 0 wurde pauschal als inf behandelt —— selbst wenn peak ebenfalls 0 war (Stille, nichts im Band), meldete es einen „unendlich dominanten Peak“. Wie das Docstring sagt, sind diese zwei Zahlen ein Ehrlichkeitsindikator dafür, dass „auch ohne Signal eine Peak-Frequenz zurückgegeben wird“ — doch es schlug in die unehrlichste Richtung aus. Die Antwort für 0/0 ist 0.0. (2026-09-05: auf Linux / numpy 2.5.2 zutage getreten. Die alte Version hatte nur einen kleinen Filterrest, sodass med > 0 war; der Fehler war schon immer da.)
- L1181 — ★Der globale Median kehrt seine Reihenfolge um, wenn man das Band verengt (reines Rauschen 11375 vs. ein echter Defekt 9433; gemessen 2026-09-06, siehe die _local_prominence-Tabelle). Für ein bandbreitenunabhängiges Urteil diesen verwenden. Die bestehenden zwei bleiben mit unveränderter Bedeutung —— ein gleicher Name mit geändertem Inhalt ist gefährlicher als einer mehr.
- L1789 — ★
med == 0 wurde pauschal als inf behandelt —— selbst wenn peak ebenfalls 0 war (Stille, nichts im Band), meldete es einen „unendlich dominanten Peak“. Wie das Docstring sagt, sind diese zwei Zahlen ein Ehrlichkeitsindikator dafür, dass „auch ohne Signal eine Peak-Frequenz zurückgegeben wird“ — doch es schlug in die unehrlichste Richtung aus. Die Antwort für 0/0 ist 0.0. (2026-09-05: auf Linux / numpy 2.5.2 zutage getreten. Die alte Version hatte nur einen kleinen Filterrest, sodass med > 0 war; der Fehler war schon immer da.)
- 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 — ★Satzzeichen (。、) sollten nicht gedreht, sondern nach oben rechts gerückt werden, doch hier rücken wir sie nicht —— statt das Nichtmachbare stillschweigend zu approximieren, schreiben wir es ins Docstring. Zeichen (Satzzeichen), die im Vertikalsatz nach oben rechts rücken. Ein Punkt, der im Horizontalsatz unten links am Glyph sitzt, kommt im Vertikalsatz nach oben rechts —— die typografische Sitte ist, die Position zu verschieben, nicht zu drehen. Windows’
@-Fonts (das Vertikalsatz-Face, das GDI per Face-Name wählt) erledigten das auf Font-Seite. Pillow öffnet eine Schrift per Dateipfad und erreicht das @-Face nicht, und HarfBuzz’ direction="ttb" liefert mit und ohne installiertes Raqm unterschiedliche Ergebnisse (Pillows 12.3.0 dieser Maschine hat features.check("raqm") False). Der Leitlinie das plattformübergreifend Konsistente wählen folgend, rücken wir hier per Komposition.
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 wird bewusst nicht auf oberster Ebene exponiert. Das gleichnamige imgio.overlay_mask ist bereits als fs.overlay_mask öffentlich, und Argumente wie Bedeutung unterscheiden sich (imgio = rohes RGB, mask>0.5, fill/margin / annotate = Rollenname-Farbe, Gewichte [0,1] erlaubt, lehnt Form-Fehlanpassung ab). Legt man dem gleichen Namen ein anderes Versprechen auf, erhält der Aufrufer keine Ausnahme, sondern ein plausibel anderes Bild. Breaking Changes an der öffentlichen API machen wir nicht im Alleingang, daher die rollentragende Variante über fs.annotate.overlay_mask beziehen.
- 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 — ★ Für Farbbilder gibt es derzeit keinen korrekten Aufruf: Übergibt man sie gemeinsam, vermischen sich die Farben, und ruft man pro Kanal dreimal auf, teilt ein selbstnormalisierender op jeden Kanal durch sein eigenes Maximum und zerstört die Verhältnisse zwischen den Kanälen (der Winkelfehler der Grey-Edge-Methode steigt von 1.03 Grad mit unserem eigenen Sobel -> 4.17 Grad pro Bild -> 27.86 Grad pro Kanal, 29.14 Grad am Nullpunkt). Wohin man sich neigt, ist eine Vertragsentscheidung, deshalb ändern wir hier keinen einzigen Standardwert, verweigern nur bei
on_error="raise" und protokollieren es standardmäßig im Register, damit es sichtbar bleibt. Details und Optionen in 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 — ★Hypothesentest: Wir sagten voraus, dass “das Verschieben sich nicht lohnt, solange es in eine Cache-Line (64B) passt”, lagen aber falsch. Bei float32 liegt der Übergang bei K≈17-19, nahe 64B (K=16), doch bei float64 liegt der tatsächliche Übergang bei K≈23-25 (etwa 200B) gegenüber einem vorhergesagten K=8. Es wird durch die Elementzahl bestimmt, nicht durch die Byte-Zahl —— die Abrufkosten pro Element dominieren. Verschiebt man bei nur wenigen, ist es sogar langsamer (1.4x langsamer bei float64 K=5), daher ist der Übergangspunkt unerlässlich.
-
| L380 — ★MAD fällt auf 0 zusammen, obwohl das Bild nicht flach ist = Quantisierung (2026-09-08, von poc_thermal_radiometry ausgelöst). Bei ganzzahligem DN ist auch |
x-med |
ganzzahlig, sodass das zurückgebbare Sigma nur ein Vielfaches von 1.4826 ist —— 0.0 für ein Realbild-Äquivalent von σ=0.5, und σ=1.0 und σ=1.983 ergeben beide dasselbe 1.4826. Stilles Zurückgeben von 0 macht die Schwelle gleich dem Hintergrund, und stromabwärts (star_detect) findet nichts. Dies ist ein Eintrittspunkt, der einen Wert zurückgibt, daher erhebt er die Stimme, statt zu werfen (der Aufrufer kann method=”clip” wählen). Das Verweigern ist Aufgabe der Seite, die die Antwort liefert = star_detect. |
- L617 — ★ Der einzige Eintrittspunkt für Schrotrauschen. Mit photons_per_unit=1 gilt “Erwartungswert = lambda”.
- L708 — ★ field_seed ist fest (derselbe Himmel), nur seed wird variiert (eine andere Beobachtung).
- L781 — ★Bis 2026-09-08 sagte der Kommentar dieses Gates “vollkommen flach = Rauschen ist nicht messbar”. Es war die Prämisse, die falsch war —— es gibt noch einen weiteren Weg, auf dem σ zu 0 wird: wenn MAD unter ganzzahligem DN zusammenfällt (0.0 für ein Realbild-Äquivalent von σ=0.5). Für ein nicht flaches Bild leer zurückzugeben ist keine konservative, sondern eine falsche Antwort; tatsächlich wurden 2 in ein 200x200-Ganzzahl-Frame gepflanzte Punktziele als 0 zurückgegeben. Wir trennen die Wege: wenn flach, leer zurückgeben (keine Sterne); wenn nicht flach, verweigern.
- 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 — ★Bei Gleichstand wähle den Bin mit mehr rohen Stimmen. Eine 3x3-Glättung ergibt links wie rechts der wahren Spitze dieselbe Summe, sodass ein argmax allein auf dem geglätteten Wert “einen leeren Bin neben der Spitze” wählen kann —— genau das trat in der Messung auf: die wahre Verschiebung (-0.087, +0.996) hatte ihre Stimmen 7 + 4 an der Bin-Grenze zweigeteilt, und ihr um einen Bin verschobenes Zentrum endete mit 0 Stimmen (frame_align schlug fälschlich als “nicht überlappend” fail-closed an). Ein Gewicht von 1e-6 ist weit kleiner als der Schritt des geglätteten Werts (1/9), ändert also die Rangfolge nicht, wenn ein echter Unterschied besteht.
- L1766 — ★2026-09-08: gib auch die Höhe der zweitplatzierten Spitze zurück. Bei einem Sternfeld gibt es eine Spitze, aber bei repetitiven Strukturen (Rasterpunkte, Gitter, Gewebe) reihen sich gleich hohe Spitzen um einen Gittervektor verschoben auf, und welche man auch wählt, “alle stimmen zu” = inlier_ratio wird 1.00. Die Zustimmungsrate ist nicht “die Wahrscheinlichkeit, dass die Antwort korrekt ist”, daher geben wir ob es eine einzige Spitze gab als separate Zahl aus (0 = Einzelspitze, nahe 1 = es gibt weitere gleichwertige Kandidaten).
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 — ★Ein feature-Op gibt einen numpy-Skalar zurück, kein ndarray, daher sah der Zweig oben ihn nie: eine NaN/Inf-Messung (z. B. ein 0/0 in sk_blur_effect auf einem degenerierten Frame) floss früher direkt aus api.apply heraus. Nicht-endliche Skalare werden ebenfalls auf den sort-Fallback geschrubbt, damit die deklarierte Garantie „endlich, sort-gültig“ auch für feature/contour-Skalare tatsächlich gilt.
backends.py
- L23 — ★Der
_safe-Fallback ist ein letztes Mittel und kann einen toten Op verdecken. Für out_sort==”image” gibt backend_safe.fallback die geklippte Eingabe zurück, sodass ein Wrapper, dessen Bibliotheksaufruf bei jeder Eingabe wirft, für Evolution / difftest / coverage wie ein funktionierender Identitäts-Op statt eines Fehlers aussieht. Die Laufzeit-Robustheit bleibt erhalten, aber die Degradation ist erkennbar: jede verschluckte Ausnahme wird im gemeinsamen Fallback-Register vermerkt, und der strict-Modus wirft stattdessen erneut. 2026-09-02: der Register-/strict-Schalter wanderte hinab in backend_safe, damit die 23 anderen Backend-Dateien (jede mit einem privaten _safe) an dieselbe Stelle berichten — zuvor war dieses Modul das einzige von 24 Wrapper-Familien, das überhaupt etwas aufzeichnete. Die Namen unten bleiben als dünne Aliase für Aufrufer und Tests, die sie von hier importieren.
- L819 — LBP-Kodierung. ★Bis 2026-09-08 tat
b wirklich nichts, und method war auf 'default' (nicht rotationsinvariant) festgelegt. Auf realen Texturen (brick / grass / gravel) gemessen, ist bei anisotropen Materialien der durch Rotation bewegte Betrag das 9.64-fache des Abstands zwischen den Materialien, und der Wechsel zu 'uniform' senkt ihn auf das 1.72-fache (examples/poc_real_texture_invariance.py). Ohne Wahl gibt es keine Möglichkeit, ihn zu senken, deshalb haben wir b zugewiesen. Als Schwellentabelle ausgeführt ist es die Konvention für den Fall, dass Verzweigungen entlang derselben Achse zunehmen (keine verschachtelten ifs). b=0.5 (Standard) ist wie bisher 'default'.
- L1035 — ★Übergibt man cv2 ein bool-Array, beschädigt
cv2.Laplacian den Heap, und der Prozess stirbt an einem späteren, unbeteiligten op (2026-09-05 Fable-Review; ich habe den SIGSEGV auf Windows selbst innerhalb von 100 Läufen reproduziert, exit 127). Die Fassade zwingt den dtype auf den Vertrag, aber der direkte op.fn-Pfad (Tests, coverage, Evolutionsschleife) ließ ihn durch. Wir zwingen am Eingang der Familie auf 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 — ★Ändere die Leinwand nicht (reshape=False) + außerhalb des Rahmens spiegeln (mode=”reflect”). Der Winkel ist -45°..+45° (0° bei a=0.5). Das Originalbild wird in die vier Ecken zurückgefaltet, daher eignet es sich nicht direkt für Zwecke, die “außerhalb des Rahmens mit einer Hintergrundfarbe füllen” wollen, wie das Deskewen von Formularen (dies ist eine bekannte Designentscheidung, kein Bug — für Details und die Wahl siehe den docstring von
ops._rotate_img).
- L831 — ★Behalte jedoch die Rückgabe-Shape auf derselben Leinwand wie die Eingabe. Das image in dieser registry hat den Vertrag, dass es “zwischen den Stufen bedingungslos verbindet”, daher lässt eine Änderung der Shape den Evaluator scheitern, weil er sie nicht mit dem Zielbild abgleichen kann (gemessen: in dem Moment, als die Zielgrößen-Version (70,50) zurückgab, scheiterte
test_evolve_is_reproducible_given_seed mit “operands could not be broadcast together with shapes (70,50) (64,64)”). Deshalb platzieren wir das auf Ht x Wt neu abgetastete Bild oben links auf der Leinwand, füllen den Rand mit 0 und schneiden den Überstand ab —— dass “das Bild jetzt Ht x Wt Pixel groß ist”, bleibt so sichtbar.
- 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: Zurückgegeben wurden die ganzzahligen Pixelkoordinaten von
np.where selbst, sodass es trotz des Namens sub_pix keine Subpixel-Genauigkeit hatte. Wir haben eine Verfeinerung entlang der Normalen per Parabelanpassung hinzugefügt (derselbe gemeinsame Helfer wie core ops._edges_sub_pix; ein gleichnamiger op gewinnt in der Registry zuletzt, daher läuft tatsächlich dieser —— nur core zu reparieren, wirkt nicht). Gemessen (eine synthetische Stufenkante, deren wahre Position Spalte 20.37 ist, a=0.2): die alte Implementierung gab die Spalten {20.0, 21.0} mit mittlerem absolutem Fehler 0.500 px zurück, nach der Verfeinerung {20.324, 20.370} mit 0.0228 px (etwa 22x Verbesserung). Die Zahl der Punkte und die Aufteilung der Zusammenhangskomponenten bleiben unverändert (die Koordinaten bewegen sich nur um weniger als 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 — ★Bei b >= 0.75 wird über 4 Richtungen (0/45/90/135 Grad) gemittelt. Der Standard b=0.5 ist wie bisher nur 0 Grad, sodass sich bestehende Ergebnisse um kein einziges Bit ändern. Ob es hilft, hängt von a (Ko-Okkurrenz-Abstand) ab (poc_real_texture_invariance Abschnitt 6, 3 reale Materialien): bei isotropen Materialien hilft es bei kurzen bis mittleren Abständen, bei anisotropem brick nur bei Abstand 4 (Schwankung/Auflösung 3.13 -> 1.54). Bei Abstand 1 wird brick
- L1560 — verschlechtert sich umgekehrt (0.30 -> 0.56). ★Die Wurzel ist, dass das Verlängern des Abstands die Auflösung selbst zusammenfallen lässt, 0.0328 -> 0.0122.
- L1760 — ★2026-09-02: Diese beiden teilten sich
{"kind": "zoom"} und waren daher eine völlig identische Implementierung, und keiner von beiden nutzte b (gemessen: max. Differenz 0.0 bei gleicher Eingabe, Differenz 0.0 zwischen b=0 und b=1). In HALCON nimmt die factor-Version zwei Skalierungsfaktoren und die size-Version eine Zielgröße, was verschiedene Dinge sind, deshalb haben wir das kind aufgeteilt, um die Realität an die Namen anzupassen.
- L1833 — ★2026-09-02: Die alte Spezifikation war out_sort=feature / metric=”area”, die Realität aber
np.mean(mask) = das im Bild eingenommene Flächenverhältnis. Da HALCONs area_center ein op ist, der (Area, Row, Column) zurückgibt, gab es eine doppelte Diskrepanz: (1) er gibt das Zentrum nicht zurück, (2) die Fläche ist ein Verhältnis statt einer Pixelzahl (= auflösungsabhängig). Ein einzelner Skalar kann den Namen nicht erfüllen, daher machen wir ihn wie ncc_locate zum 1-D-Vektor des match sort und geben (Flächenverhältnis, Zeile, Spalte) zurück. Sowohl match als auch feature sind terminale Sorts (Kandidaten sind nur identity), daher bewegt sich die Genom->op-Abbildung nicht.
- L1840 — ★Seit 2026-09-26 sind alle 3 Komponenten in Pixeln (Flaeche [Pixelanzahl], Zeile [px], Spalte [px]). Die Beschreibung blieb drei Wochen lang „normiert“, und ein danach geschriebenes Beispiel ging kaputt, weil es die Koordinaten mit (H-1) multiplizierte (2026-10-15). tests/test_feature_units_doc_2026_10_15.py prueft, dass Beschreibung und Verhalten uebereinstimmen.
backends_bridge.py
- L518 (ja) — ★定数列で軸が潰れると
axes_transform は ValueError を投げる(傾きが 無限大になるため、向こうの仕様)。潰れた軸だけここで開く —— 定数列は 「描けない」のではなく「真ん中に水平線 1 本」が正しい絵。
backends_decomp.py
- L142 — ★Setze das BLAS-Thread-Limit einmal außerhalb der Schleife. Hier wird eine auf work_max=64 begrenzte quadratische Matrix bis zu 60 Mal per SVD zerlegt, was den Großteil der Zerlegungszeit in diesem repo ausmacht (30.7 s pro Suite-Lauf / 31.4 s Zerlegung gesamt, svd 23.987 Mal = 98%). Eine 64x64-SVD ist mit 24 Threads 3.9x langsamer als mit 1 Thread —— weil das GEMM in der Zerlegung zu klein ist und die Synchronisationskosten den Rechenaufwand übersteigen (Tabelle im docstring von fsthreads). Es jedes Mal zu umschließen zahlt die 2.4us des Mechanismus 60 Mal, deshalb setzen wir es außerhalb der Schleife.
- L210 — ★
ev[0] ist der algebraisch größte Eigenwert, nicht der mit dem größten Absolutwert. Auf einem hellen Grat ist die Hauptkrümmung negativ, sodass ev[0] der mit dem kleineren Absolutwert wird und die umgekehrte Antwort von 0 auf dem Grat und 1 an beiden Seiten ergibt (2026-09-05 Fable-Review, gemessen [1, .64, 0, 0, 0, 0, .64, 1]). Wir nehmen wie beschrieben den größten Absolutwert.
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 — ★Bis 2026-09-05 wurden Ausnahmen mit
except Exception: out = None verschluckt. Bei der Registrierung wird außen ein backend_safe.guard angewandt, aber wenn die Ausnahme innen gelöscht wird, sieht das Äußere nichts —— selbst im strict mode wird keine Ausnahme geworfen und nichts bleibt im Register. Dies war ein Versäumnis des Audits vom 2026-09-02 “nur 1 von 24 Familien erreichte das Register” (Fables adversariale Review meldete es als 5. Familie). Lass die Ausnahme unverändert nach außen: der äußere guard protokolliert sie, senkt sie auf einen zum sort passenden Wert und wirft im strict-Fall erneut.
- 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 — ★Bei lambda >= ~12 wirft scipy “boundary conditions did not converge”, und der Fallback des guard war die Identität (das alte 1+40a machte bei a>=0.3, einschließlich des Standards 0.5, 70% zur Identität. 2026-09-05 Fable-Review). Wir haben auch die Beschreibung auf 1〜11 angepasst.
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 — ★Bis 2026-09-05 wurde
tools/chain_fuzz (nicht mitgeliefert) per sys.path-Manipulation geladen. Im wheel schlug es fehl, und da das build() darunter still [] zurückgab, verschwanden die tb_*-143-ops.
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 — ★Auf das Vorzeichen achten: Die Eckpunkte sind als (row, col) geordnet, daher ist die von
_monotone_chain zurückgegebene Orientierung (row als x betrachtet) gegen den Uhrzeigersinn = auf dem Bildschirm im Uhrzeigersinn. Das Innere ist die Seite, auf der das Kreuzprodukt nicht negativ ist (mit <= 0 geschrieben ergab sich für alle Objekte solidity 0).
- L621 — ★Erosion allein liefert nur eine Seite. Ein Objekt mit kleinerer Nummer bleibt, selbst wenn ein Objekt mit größerer Nummer benachbart ist, selbst das Minimum der Nachbarschaft und wird als “Inneres” beurteilt (2026-09-06 gemessen: in der Spalte, in der 1 und 2 sich berühren, verschwand die Kontur auf der Seite von 1). Betrachtet man Erosion und Dilatation zusammen, ergibt sich das symmetrische Urteil “in der Nachbarschaft gibt es eine andere Nummer als die eigene”.
calib.py
- L274 — ★Am 2026-09-06 haben wir gemessen, dass dieses Gate bei einer echten Kamera nicht auslöst. Auf verzerrungsfreien synthetischen Daten funktioniert es wie entworfen (Verhältnis 3.8e-14 bei 0 Grad Neigung, 8.6e-10 bei 0.05 Grad, beide verweigert). Aber mit realistischer Tonnenverzeichnung k1=-0.18 passt das planare Homographie-Modell von vornherein nicht mehr, und das Verhältnis bleibt unabhängig von der Neigung um 1.9e-06 kleben (0 Grad 1.916e-06 / 0.05 Grad 1.935e-06 / 0.2 Grad 2.005e-06).
- L280 — ★Nur wenn zwei Bedingungen zusammen erfüllt sind: dass Verzeichnung vorliegt und dass sich die Platte zwischen den Blickpunkten seitlich bewegt. Mit nur einer von beiden klingelt das Gate wie entworfen (die Trennung sind die 3 in tests/test_calib.py). Und eine tatsächliche Kalibriersitzung hat immer beides, da man die Platte von Hand bewegt, während man aufnimmt. Es reicht auch nicht, nur die Schwelle anzuheben —— bei Verzeichnung beträgt der Abstand zwischen voller Entartung 1.92e-06 und 2 Grad Neigung 4.42e-06 nur das 2.3-fache, und es lässt sich keine Trennlinie ziehen. Daher: * die Schwelle unverändert lassen (bei verzeichnungskorrigierten Punkten wirkt sie korrekt) * das Verhältnis selbst als
orientation_rank_ratio zurückgeben * das spätere Gate, das tatsächlich stoppt, “neige die Platte” sagen lassen (unten). Statt es zu beheben, geben wir dem Nutzer das Material zur Beurteilung.
caltab.py
- L256 — ★Was dieses Gate nicht fängt: Fehler in den intrinsischen Parametern bei einem einzelnen planaren Ziel (besonders das Verhältnis fx/fy). Eine Einzelebenen-Homographie legt den Intrinsics nur zwei Beschränkungen auf (Zhang 2000), sodass ein falsches fy größtenteils in die hier gelöste Pose mit 6 Freiheitsgraden absorbiert wird und das Residuum unter der Schwelle bleiben kann. Gemessen 2026-09-05: selbst wenn man fy von 500 -> 300 falsch setzt, ergibt sich auf Linux/scipy 1.18 ein RMS von 0.90 px (0.14 px mit korrektem K). Dieselbe Eingabe wird auf Windows/altem scipy zu 6.39 px, sodass es allein durch den Unterschied, wohin die Optimierung konvergiert, “mal erkannt wird und mal nicht”. Will man die Intrinsics prüfen, nimm 3 oder mehr Blickpunkte oder ein nicht-planares Ziel. Wo dies wirkt, sind Inkonsistenzen, die “von der Pose nicht absorbiert werden können” (falsche Zuordnungen, eine nicht-planare Platte).
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 — ★Erzwingt die zentrale Ehrlichkeitsbehauptung („ein DNA-Op wird nur hinzugefügt, wenn er die Handbaseline auf einem gesperrten Holdout schlägt“) — zuvor wurde dieses Flag nur ausgegeben, aber nie als Gate genutzt, sodass ein schlechteres-als-Hand-Makro registriert und dann von der nächsten Evolution ausgewählt werden konnte. Das Gate verweigert das, sofern es nicht explizit übergangen wird.
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 — ★Bit-Genauigkeit ist nicht garantiert (korrigiert 2026-09-05). Die Mathematik ist pro Zeile unabhängig, aber
U @ w ist ein BLAS-GEMM, sodass sich die Aufteilung der Reduktion und der Vektorisierungspfad mit der Zeilenzahl M ändern und die Rundung sich ändern kann. Gemessen: in dem Moment, als torch zum py3.11-Job der CI hinzugefügt wurde (= in dem Moment, als eine andere OpenMP-Laufzeit geladen wurde), divergierten die Ergebnisse zwischen gechunkt und ungechunkt. Garantiert wird numerische Übereinstimmung (wenige ULP), nicht Bit-Genauigkeit.
demops.py
- L105 — ★Wir bieten keine Option, mit dem Median o. Ä. zu füllen. Füllen erzeugt eine Ebene, die nicht existiert, und lässt Wasser durch, ohne eine Ausnahme zu werfen. Aber die Größe des Effekts halten wir ehrlich fest. Auf denselben realen Daten (Tokioter Buchtfront 1024x1024, 3.83% fehlend) verglichen über 3 Wege die maximale Einzugsgebiets-Zellzahl: Auslass 312.108 (29.8%) / Median-Füllung 338.188 (32.3%) / Wand 315.023 (30.0%). Das Füllen bläht um etwa 8% auf, aber dass “eine Zelle 30% des Ganzen sammelt”, ist selbst die Realität dieses Geländes (ein flaches aufgeschüttetes Land konvergiert tatsächlich zu einer Stelle). Zuerst allein aus der Füllung “diese Zahl ist ein Produkt des Füllens” zu schreiben, war übertrieben; mit einer Kontrolle schrumpfte der Effekt. Wir bieten keine Füll-Option, weil es unmöglich wird zu unterscheiden, wo das Gelände echt ist und wo Füllung, nicht weil sich die Zahl um Größenordnungen ändert.
- L613 — ★Diese Langsamkeit fiel uns erst auf, als der Sky-View-Faktor für 513^2 im PoC (examples/poc_dem_terrain.py) 41.9 Sekunden brauchte. Die Tests nutzten nur kleine Gitter und bestätigten so, dass es “läuft”, aber nicht, dass es “benutzbar” ist.
- L694 — ★Behoben 2026-09-08 (gefunden von
poc_stockpile_volume). Wenn eine Sichtlinien-Stichprobe per np.rint auf die Zielzelle selbst rundet, wird die Höhe dieser Zelle als “dazwischenliegendes Gelände” mit sich selbst verglichen. Da t < 1 ist, ist der Nenner dist*t klein, und (z-eye)/(dist*t) > (z-eye)/dist ist bei z > eye immer wahr —— so verdeckten sich Zellen oberhalb der Augenhöhe durchweg selbst. Gemessen (vor der Korrektur): eine 10 m hohe Säule auf ebenem Boden wurde aus 25 m Entfernung bei Augenhöhe 2 m als “nicht sichtbar” zurückgegeben, und nur eine 1 m hohe Säule unterhalb der Augenhöhe war “sichtbar”. Der höchste Punkt eines konvexen Körpers ist von außen immer sichtbar, also ist das geometrisch falsch. Die Durchläufe, bei denen die Stichprobe auf der Zielzelle landete, zählen wir nicht.
- L754 — ★Das Register deklariert
points = (N, 3). Ein Skalar ergibt (3,), was mit der Deklaration kollidiert, deshalb falten wir stets auf (N, 3) (aufgedeckt durch den TYPEMISS des Fuzzers am 2026-09-06; der Fuzzer war nach dem Hinzufügen der 6 geozentrischen Koordinaten-ops nicht gelaufen). Wenn du (H, W, 3) als Gitter willst, verwende :func:dem_geocentric_grid.
-
| L807 — ★Innerhalb der Evolute ist die geodätische Breite nicht eindeutig -> statt still eine Breite außerhalb des Bereichs zurückzugeben, verweigern wir. Die Evolute der Ellipse x²/a² + z²/b² = 1 ist (a·x)^(2/3) + (b·z)^(2/3) = (a²-b²)^(2/3). Nur außerhalb der Gleichheit liegt der Bereich, in dem “die Normale eindeutig bestimmt ist” (da die 2/3-Potenz nicht negativ ist, ist das Vorzeichen |
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 gibt float [0,1] zurück. Empfängt man es mit np.asarray(..., np.uint8), wird jedes 0.x auf 0 abgeschnitten und pechschwarz (getroffen am 2026-09-06).
- L378 — ★Lass den Textkörper des Beispiels nicht weg. Schade, dass die Abbildung nicht erscheint, aber die Zahlen müssen gezeigt werden.
- L417 — ★Reiche hier nicht einfach an :func:
_to_rgb8 weiter. Das übergibt (H,W) an colorize_depth, aber darin wird jeder Frame einzeln normalisiert, sodass ein Frame, der ganz 0 ist, und einer, der ganz 1 ist, in derselben Farbe herauskommen (von einem Test am 2026-09-09 gefangen). Erst durch die explizite Übergabe des Wertebereichs wird der Maßstab zu einem einzigen.
- L482 — ★Pillow faltet einen mit dem vorherigen identischen Frame zu einem einzigen (diese Zeit wird zur Anzeigezeit des vorherigen Frames addiert, sodass sich die Bewegungsgeschwindigkeit nicht ändert). Wir zählen nach dem Schreiben und halten, wenn es von der übergebenen Zahl abweicht, beide im Register fest —— um nicht still ein “72-Frame-GIF” durchgehen zu lassen, dessen Inhalt 40 Frames hat.
- L650 — ★2026-09-08: Ist das Panel klein, passt der Titel nicht, und
annotate_figure_grid verweigert (korrekt), sodass eine Abbildung still verschwand. Ein 29×19-core-Gitter oder eine 24×24-verkleinerte Karte erscheint in PoCs routinemäßig, doch der Fehler sagt “kürze den Titel” —— die tatsächliche Behebung ist “vergrößere das Panel”. Zwei Zuständige fielen unabhängig in dasselbe Loch (es gibt einen Fall, in dem eine scene-Abbildung auf dem Schild verschwand), deshalb lassen wir nicht jeden Aufrufer die Vergrößerung schreiben, sondern vergrößern hier einmal per Nächster-Nachbar. Wir nehmen Nächster-Nachbar, um beim Vergrößern keine Werte zu erzeugen (Interpolation würde auf der Abbildung nicht existierende Zwischenwerte erzeugen, und die Pseudofarbe würde lügen).
- 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 — ★Die parabolische Interpolation behält eine Verzerrung, die zu ganzen Zahlen zieht (weil die Spitze sinc-artig ist und nicht vollständig durch eine Quadratische approximiert werden kann). Wir sweepen von 0 bis 1, messen die Verzerrung und zeigen, dass sie eine S-Kurve bildet —— hört man bei “wir konnten bis zum Sub-Sample lesen” auf, reitet diese Verzerrung still im Ergebnis mit.
examples/annotate_paper_tour.py
- L51 — ★EXTEND: ersetze text und path durch den Text und die Polylinie (x, y) deiner eigenen Abbildung
examples/blas_thread_budget.py
- L117 — ★Das ist der Kernpunkt. 96x96 ist nicht “schnell, weil klein”, sondern eine Größe, bei der gerade das Kleinsein Multithreading zum Nachteil macht. Einmal außerhalb der Schleife platzieren (umschließt man es bei jeder Iteration, zahlt man die Kosten des Drosselungsmechanismus selbst 30-mal).
examples/blob_split_tour.py
- L98 — ★Gemessen (honest): Auch auf einem Balken der Höhe 2 < h steht ein Keim. blob_seeds nimmt das Residuum
f - R > 0 als Keim, doch rekonstruiert man jede Komponente mit Hintergrund 0, ergibt eine Komponente mit Spitzenhöhe M < h ein R = M - h < 0, sodass das Residuum über alle Pixel der Komponente und sogar einen 1 px breiten Hintergrundrand positiv ist (skimages h_maxima verwirft mit Residuum >= h). Wir berichten, ohne die Implementierung zu ändern. Hier lassen wir den Keim des Balkens weg und prüfen den Pfad des “keimlosen Klumpens”.
- L129 — ★Gemessen (honest): Die Spaltung liegt nicht auf der Schnittlinie — die Seite des höher nummerierten Keims frisst sich entlang des Tals hinein. blob_split weist bei der stufenweisen Dilatation “ein von beiden Regionen berührtes Pixel” dem max von grey_dilation (= der größeren Nummer) zu, sodass durch 8-verbundene diagonale Verkettung die höher nummerierte Region entlang der Tallinie einige Spalten weit eindringt. Vertauscht man die Keimnummern, kehrt sich auch die Eindringrichtung um (eine Verzerrung der Nummerierung, nicht der Geometrie). Wir berichten, ohne die Implementierung zu ändern.
- L153 — ★Gemessen (honest): Beim Lehrbuch-h-maxima verschmelzen die Keime in dem Moment zu einem, in dem h “die Prominenz des niedrigeren Gipfels (16 - Sattel 10.07 = 5.93)” überschreitet. blob_seeds nimmt Residuum > 0 als Keim, sodass Residuum = min(h, Prominenz) > 0 stets gilt und der Keim des niedrigeren Gipfels bei diesem h nicht verschwindet. Die Verschmelzung tritt ein, wenn h “den höheren Gipfel - Sattel (22 - 10.07 = 11.93)” überschreitet — der referenzierte Gipfel ist der umgekehrte.
examples/coherence_scanning.py
- L166 — 6) ★ Abgleich mit der Phasenschiebemethode # —————————————————————— #
examples/dem_geodesy_tour.py
- L49 — ★Ist das Repository-Wurzelverzeichnis nicht im Pfad, wird
demops nicht gefunden (dieses Beispiel importiert fullseye nicht, daher greift der Pfad-Hook nicht).
- L61 — ★EXTEND: durch die Nordwestecke deiner eigenen Kachel ersetzen (dies liegt nahe Tokio).
- L131 — ★Ehrliche Aufschlüsselung: Eine einzelne Bowring-Iteration ergibt 1e-9 m auf der Ellipsoidoberfläche, doch der Fehler wächst mit der Höhe (gemessen 8e-7 m bei 8848 m, 4e-6 m bei 20 km). Die “1e-12 Grad / 1e-7 m” des Docstrings sind oberflächennahe Werte und gelten in stratosphärischen Höhen nicht. Für Gelände (Höhe < 9 km) sind es 1e-6 m, und hier setzen wir die Schwelle auf 1e-5 m.
- L160 — ★EXTEND: dem durch echte Daten ersetzen (Zeile 0 ist Norden). Dies ist eine bekannte Hangfläche.
examples/dem_terrain_analysis_tour.py
- L46 — ★Ist das Repository-Wurzelverzeichnis nicht im Pfad, wird
demops nicht gefunden (dieses Beispiel importiert fullseye nicht, daher greift der Pfad-Hook nicht).
- L59 — ★EXTEND: Zellgröße [m]. Bei echten Daten über dem_cell_size_webmercator(zoom, Breitengrad) ermitteln.
- L158 — ★Ehrliche Beobachtung: Liegt mitten an einem Hang eine Fehlstelle (no-data), so entwässert deren nördlicher Nachbar selbst als Outlet nicht in die Fehlstelle, sondern nach Südwesten (die Richtung mit endlichem Gefälle). Die Implementierung lautet “nur in die Fehlstelle, wenn es keinen anderen Abstieg gibt”, enger als das “lässt Fluss zur Fehlstelle zu” des Docstrings. Hier wird nur ausgegeben, ohne 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 — ★Da ein Modul (pivops) im Repo-Wurzelverzeichnis importiert wird, das Repo-Wurzelverzeichnis nach vorne setzen, damit es direkt aus einem Checkout läuft. Gleiche Konvention wie die anderen Beispiele. Ohne dies scheitert
py -3.11 examples/<name>.py mit ModuleNotFoundError (gemessen 2026-09-09: von den 83, für die es kein Ausführungstor gab, scheiterten nur diese 2 dieser Art).
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 — ★Die letzten 3 sind dünne Wolken (unterschiedliche optische Dicke). Erhöht man die Schwelle, fallen sie von der dünnsten an weg — daher rührt die Treppe in Abschnitt 4.
- L142 — ★Raumwinkel-Gewicht. dΩ/dA = sinθ/(f²θ) — die Jacobi-Determinante der äquidistanten Projektion.
examples/poc_asbuilt_wall_deviation.py
- L497 — ★Was fehlte, war nicht die Neigung, sondern die Wölbung. Die Größe, die predict_bulge in geschlossener Form als Koeffizient erster Ordnung zurückgibt, wird unmittelbar zu einer falschen Neigung und einer falschen Auslenkung in der Ebene.
- L555 — ★An die geschlossene Form übergeben wir die effektive Neigung einschließlich des als Wölbung absorbierten Anteils (§6). Ohne ihn weicht nur der einzelne Punkt bei f=0 um 1.2 mrad ab, was die Vorhersage falsch erscheinen lässt.
- L660 — ★Ein Boden aus reinem Rauschen. Liest man an einer Wand ohne Wölbung auf dieselbe Weise, ergibt sich dies.
examples/poc_astro_photometry.py
- L322 — ★ Hier haben wir uns einmal geirrt: in der Annahme “scale=2, also ist die Helligkeit auch 1/4” schrieben wir flux/4 und erzeugten -74.89 %. Das Erhaltungsgesetz (6.1e-14 oben) verwarf es. Die Helligkeit pro Pixel wird 1/4, aber die Gesamtsumme eines Sterns ändert sich nicht.
- L423 — ★ Hier haben wir einmal ein assert weggelassen: Die rms in der Tabelle oben (ein Stack, 8 isolierte Sterne) ergab gut-6-Bilder 0.306 % vs gut-12-Bilder 0.324 % = 0.947-fach. Dies ist keine Widerlegung des theoretischen 1.414 — es bedeutete, dass jene rms die Summe aus “systematischem Versatz pro Stern” und “Rauschen” war und man mit 8 Stichproben das Rauschen nicht allein herausziehen kann. Wie in Stufe 1 bleibt erst, wenn man Iterationen aufsummiert und den Mittelwert pro Stern abzieht, das Rauschen allein übrig.
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) ★Die Kantenanzahl von measure_pos hängt nichtmonoton von sigma ab.
examples/poc_battery_ct_degradation.py
- L316 — ★
sdf_offset ist nur skalar, daher verzerren wir zum Verschieben als Feld das Gitter und werten es aus.
- L334 — ★Damit der Stapel nicht durch die Dose stößt, komprimieren wir ihn lokal auf die Höhe, die die durchgebogene Endplatte zulässt (auch in echten Zellen werden die Elektroden unter Druck gesetzt und schrumpfen). Ohne dies wird an hohen Gashohlräumen die Endschicht von der Dose gefressen und der Schichtzahlvergleich bricht (so geschah es zunächst).
- L612 — ★Schichten werden über die “Anzahl der steigenden Flanken” gezählt. Zählt man über
vol_wall_thickness-Paare (steigend -> fallend), verschiebt bereits eine einzige zusätzliche fallende Flanke direkt innerhalb der Doseninnenfläche die Paarung und lässt selbst eine intakte Zelle von 17 -> 16 fallen.
examples/poc_battery_electrode_tortuosity.py
- L136 — ★Eine Verarbeitung, die nicht auf einem öffentlichen Pfad liegt: ein 6-Nachbarn-Adjazenzgraph im Voxelraum. fullseye besitzt 3-D # Zusammenhangskomponenten (vol_label) und eine Distanztransformation (vol_distance_transform), aber # keinen Zugang (geodätische Distanz, Transport) für “einen Pfad, der durch den Hohlraum hindurchführt”. # ————————————————————————— #
- L258 — ★Übergibt man einen 64-Voxel-Schnitt unverändert, ist das Panel nur 64 px breit, sodass der Titeltext nicht hineinpasst und die ganze Abbildung scheitert (examplefig gibt nicht stillschweigend auf).
- L279 — ★Lässt man die Festphase bei 0, wird log10(Dissipation) negativ, sodass die Festphase am hellsten eingefärbt wird (genau das erzeugten wir einmal am 2026-09-08). Wir ordnen die Festphase den untersten 2 % des Hohlraums zu.
examples/poc_beam_modal_video.py
- L629 — ★Kollision: bei fps 48.5 landet das Aliasing der Beleuchtung genau auf 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 — Ist platziert. ★Das ist keine Zierde: * Legt man eine Fläche auf eine Zellgrenze, läuft die Hälfte der Flächenrückgabe als Rauschen zum Nachbarn über, und die Trefferquote fällt allein durch die Diskretisierung auf 0.5. * Legt man eine Fläche in eine Zellmitte, geht diesmal der wahre Wert je nach Fließkomma-Rundung mal hinein, mal nicht (tatsächlich erlebt: die Rückgabespalte der Seitenwand fiel vom wahren Wert ab, und die meisten der 133 fälschlich belegten Zellen waren das). Legt man sie dazwischen, tritt keines von beiden auf.
h meidet Vielfache von 0.2 m — um die Höhenquantisierung zu zeigen. lx/ly werden auf ungerade Vielfache von 0.1 m gesetzt.
- L564 — ★Der Fehler ist um die z-Achse der Welt (= wie place). Schreibt man
R_wc @ rz, wird daraus ein Roll um die optische Achse, und der Reprojektionsfehler verwandelt sich auf 1/5 (am 2026-09-07 erlebt: es ergab 0.98 px und stimmte nicht mit der geometrischen Vorhersage f·tanθ überein, wodurch es auffiel).
examples/poc_bilateral_asymmetry.py
- L585 — ★In einer Form halten, die das Tor von Loch D unverändert passieren kann (die Margin bricht zuerst zusammen, der Winkel springt danach).
examples/poc_bone_trabecular_thickness.py
- L708 (ja) — ★穴が塞がったので、所見を「無い」から「規約が 1 画素ずれる」に書き換える。
examples/poc_bump_coplanarity.py
- L147 — ★Ein echter Defekt niedriger Ordnung (Die-Attach-Void = die Mitte sinkt sanft ab). Absichtlich nicht exakt quadratisch gemacht — wäre er quadratisch, würde die Anpassung per Definition 100 % absorbieren und die Frage “wie viel wird absorbiert” würde trivial.
-
| L306 — ★Vor der Übergabe bei ±SPEC_UM clippen. Die divergierende Farbskala von examplefig normiert pro Panel über max |
v |
, sodass ohne Clipping die Farbbedeutung über die 3 Panels nicht übereinstimmt. |
- L445 — 6. ★Der Schaden übermäßiger Subtraktion —— sie absorbiert echte Defekte niedriger Ordnung # ————————————————————————— #
- L540 — (e) ★surface_form_error über das Register gibt nur einen PV-Float zurück
examples/poc_cad_scan_deviation.py
- L434 — ★Der out-Adapter des Registers kürzt das dict auf (R, t), sodass rmse nicht durchkommt
- L897 — Kapitel 6: ★Der Defekt zieht die Ausrichtung —— vorhergesagt durch Projektion auf die 6-D des starren Körpers # ————————————————————————— #
- L1103 — ★Keinen Defekt hinzufügen —— tut man es, wird die Datum-Verschiebung aus Kapitel 6 (0.107 mm) zu einem Sockel für die Punktbewegung und vermischt sich mit “dem durch den Anfangswinkel zerstörten Betrag”.
- L1256 — ★Gibt man für die Kontrollgruppe mit dem wahren Wert 0 ein “%” aus, entsteht durch Division durch null eine sinnlose riesige Zahl. Die Fläche in mm^2 belassen und % nur anfügen, wenn der wahre Wert eine Bedeutung hat.
- L1267 — ★Den Unterschied eines einzelnen Laufs nicht als “es hat gewirkt” lesen —— den Seed variieren und mit der Streuung vergleichen
- L1357 — ★Ein assert, der auslöst, sobald die Lücke geschlossen ist. Am 2026-09-07 hat er tatsächlich ausgelöst, und diese Zeile wurde umgeschrieben: nach dem Hinweis, dass “Zylinderbohrungen, Fasen und Verrundungen nicht konstruierbar sind”, wurden plane / cylinder / torus / capsule ergänzt. Der Hinweis hat das Werkzeug verändert, also halten wir es fest und gehen weiter.
- 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 — ── Kalibrierung (eine selbstgebaute minimale Bündelausgleichung. ★ Lücke (e)) ──────────────────────────────────── #
- L181 — ★ Lücke (d): Die Bildpunkte von camera_calibration sind (row, col). project_points sind (x, y).
- L519 — ★ Lücke (b): reprojection_error kennt die Verzerrung nicht. Selbst wenn man die wahren Werte übergibt, wird es nicht 0.
- L740 — 2. ★ Der Hauptpunkt: Der Reprojektions-RMS ist nahezu gleich, doch der fx-Fehler unterscheidet sich um mehr als eine Größenordnung
- L748 — 3. ★ Der Kompensationsmechanismus: Das Verhältnis von fx stimmt mit dem Verhältnis von Z überein
- L754 — 4b. ★ Eine ehrliche Aufzeichnung einer Niederlage: bei engem Sichtfeld + 0.30 px Rauschen ist der Nullpunkt B, der den Hauptpunkt auf die Bildmitte fixiert, korrekter als ihn zu schätzen (eine Bedingung, unter der man nicht besser sein kann, existiert wirklich)
- L770 — ★ Lücke (c): Da die Punkte verzerrt sind, hat es nicht das Degenerationsgatter gestoppt, sondern das nachgelagerte nicht-endliche K-Gatter. Wir prüfen sogar, dass dessen Meldung “neige die Platte” enthält (hinzugefügt 2026-09-06).
- L778 — 5b. ★ Lücke (c3): Die geschlossene Form weicht systematisch um den Betrag der Verzerrung ab (nur als Startwert)
- L782 — 6. ★ Lücke (b): reprojection_error kennt die Verzerrung nicht -> selbst wenn man die wahren Werte übergibt, bleibt er groß
- L788 — 7. ★ Lücke (a) [Behoben 2026-09-19]: Die Schätzung der intrinsischen Parameter ist jetzt über die Fassade zugänglich. Früher war sie von
fs aus unsichtbar, und dieser Stolperdraht meldete stets „sobald geschlossen, den Docstring aktualisieren“. Jetzt ist sie als fs.camera_calibration aufrufbar (Fähigkeitsnotiz camera-intrinsics-calibration). Sie ist allerdings eine Fassadenfunktion und kein Op in der Registry (da nicht in der festen Form (Bild, 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 — ★Das kleinste h, das man angeben kann, ist 0.05 x max(Distanztransformation). Eine einzige große Zelle im Bild genügt, um die untere Schranke von h für das gesamte Bild anzuheben (eine durch die Spezifikation des op bedingte Kopplung).
- L1048 — ★Die Überschrift dieses PoC. An der Stelle, wo die Bias-Linie 0 kreuzt, ist der Segmentierungsfehler kein Tal.
- L1337 — ★Über-Verschmelzung und Auslassung sind zweierlei —— was zusammenklebt, ist nicht “verschwunden”
- L1365 — ★Das optimale h bewegt sich mit der Dichte (es bewegt sich immer nach entweder dem Bias-Kriterium oder dem Eins-zu-eins-Kriterium)
- L1368 — (5) ★Ein Punkt, an dem die Zählung stimmt und dennoch die Segmentierung völlig falsch ist, existiert wirklich: der Bias liegt unter 3 %, dennoch bleiben viele Segmentierungsfehler und die Eins-zu-eins-Zuordnung ist weit vom Besten entfernt.
- L1394 — ★Das kleinste h, das man angeben kann, steigt mit dem Größenverhältnis (eine durch die Spezifikation des Werkzeugs bedingte Skalenkopplung)
- L1434 — (10) ★Maschinell bestätigen, dass die Lücke des Werkzeugs “noch vorhanden” ist (sie fällt durch, sobald sie behoben ist = eine gute Art des Durchfallens) (a) die Distanztransformation des Evolution-op wird auf ihr Maximum normalisiert
examples/poc_change_detection_misreg.py
- L947 — ★Ein einziges Diagramm: Restversatz vs. Falsch-Positive (die Sweep-Linie + die Punkte des Registrierungsergebnisses)
examples/poc_cold_chain_excursion.py
- L570 — ★Das Fenster zur Peak-Suche reicht nur bis kurz vor dem nächsten Türöffnen/-schließen. Nimmt man es zu breit, greift es bei großem τ die steigende Flanke des nächsten Pulses auf und lässt es so aussehen, als “komme die Klippe nie” (am 2026-09-08 mit einem 200-Minuten-Fenster hineingetreten: das gemessene y=53 dehnte sich auf 153 Minuten).
- L949 — ★Mache die Blickrichtung (die D-Achse) zur Breite. Projiziert man mit (t, y, x) unverändert, wird D = Zeit 720, und man erhält nur ein schmales Bild (H, W) = (60, 12).
- L1008 — ★Unterscheide, ob ein “Treffer” der Konvention zu verdanken oder bloßer Zufall ist: störe jeden Punkt um ±1 m und zähle.
examples/poc_colocalization_crosstalk.py
- L355 — ★Vorhersage des Ausläuferverlusts: der Ausläufer der Gaussian unterhalb des Schwellenwerts T tritt nicht in die Region ein. Von einem Punkt mit Peak p beträgt die Fluoreszenz innerhalb der Region 1 − (T − Sockel)/p (die geschlossene Form für das Volumen einer 2-D-Gaussian). Sockel = Zytoplasma + Hintergrund (+ der Einstreuanteil), und p wird durch die PSF um den Faktor σ_ves²/(σ_ves²+σ_psf²) gestaucht.
- L657 (ja) — ★2026-09-20:
graph_degree_preserving_shuffle(結合グラフの辺の繋ぎ替え = null model)が台帳に入った。ここで探している 「画像ブロックの並べ替え検定」とは別物なので、graph_ の族は穴の判定から除く(語が同じだけ)。
examples/poc_colormap_readability.py
- L343 — ★Der aus einer Stufenreihe ablesbare Unterschied ist Δ + eine ein Pixel breite Rampe —— vergisst man das, überschätzt man die Klippe um das 2-fache (ich habe es zuerst so geschrieben und 0.57 vs. die gemessenen 0.30 erhalten)
- L406 — ★Durch den wahren Gradienten teilen. Ohne zu teilen, zählt man am Ende “Stellen, wo das Feld steil ist” als Grenzen
- L657 — ★Wird die Anzahl der Farben überschritten, wird es standardmäßig abgewiesen (dieser PoC hat darauf hingewiesen, und es wurde am selben Tag fail-closed). Hier ist das Ziel, zu messen “was passiert, wenn man zyklisch fortsetzt”, daher setzen wir cycle=True explizit —— diese Explizitheit zu erzwingen ist selbst die Gegenmaßnahme.
- L732 — ★Am selben Tag dank des Hinweises dieses PoC behoben. Das Kriterium der Liste war nur “Monotonie der Helligkeit”, weshalb cividis—monoton in der Helligkeit, aber grob in den Farbdifferenz-Schritten—sich als “sicher” ausgab. Jetzt gehört auch die Gleichmäßigkeit der Farbdifferenz zum Kriterium, und cividis ist zu CVD_SAFE verschoben.
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 — ★Ziehe die Zufallszahlen immer vorab in der Form (n_plant, NESTED_MAX). Änderst du, wie viele du pro Blattzahl ziehst, verschiebt sich die Zufallsfolge, und ein um nur 1 erhöhtes n_leaf ergibt einen anderen Bestand (2026-09-07: die Vegetationsdeckung war nicht mehr monoton in der Blattzahl, und die Klippe ließ sich nicht messen).
- L525 — ★
grid_coords platziert die Voxelzentren (Zentrumsabstand = span/res, nicht span/(res-1)). Zunächst multiplizierte ich mit span/(res-1) und erzeugte Fehler von +12 % Fläche und +18 % Volumen bei einer Kugel —— eine Einheitenverwechslung “irrt auf plausible Weise”.
- L933 (ja) — ★2026-10-06: 題が「当たる」と外れた予想のほうを言っていた(本文は「予想が外れた」)。実測を言う。
- L972 — ★Nimm sowohl den wahren Wert als auch die Blattwinkelverteilung aus genau dem Bestand, den dieser Abschnitt betrachtet. Wiederverwendung des k der Referenzbedingung (7 Blätter) verschiebt den wahren Wert um den Gradienten, mit dem obere Blätter steiler stehen.
- L981 — ★Die größte Ebene ist nicht unbedingt der Boden (schließt sich der Bestand, wird ein Teil der Krone am größten). Die Version, die die erste Ebene als Boden nahm, antwortete mit einer Höhe von 1.69 m (am 2026-09-07 hineingetreten). Erst mit der Regel, die niedrigste Ebene zu nehmen, wurde es stabil.
- L1008 — ★Kontrollgruppe: wende dieselbe Formel auf die wahren Normalen an (die der Puffer enthält).
- L1137 — ★Die Achsen von
occupancy_grid sind (x, y, z). render_volume_projection kollabiert Achse 0 als Blickrichtung, daher tausche für eine Zenitansicht auf (z, y, x). Ruft man es ohne Tausch auf, entsteht eine “Zenitansicht, die als Seitenansicht gemeint war” (ein still fehlerhaftes Muster).
examples/poc_ct_fidelity.py
- L342 — ★Die Überschrift dieses PoC. Man sieht mit bloßem Auge, wo die FBP den Nullpunkt A (die horizontale Linie) und den Nullpunkt B kreuzt. Die x-Achse ist die Anzahl der Projektionen (links spärlich). Die x-Achse ist logarithmisch —— die Kreuzung geschieht auf der spärlichen Seite (12–45 davon), und auf einer linearen Achse quetscht sie sich an den linken Rand, sodass der entscheidende Teil unlesbar wird.
- L407 — ★Am 2026-09-06 geschlossen. Zuvor fixierte es das defekte Verhalten = “eine Verdopplung der Detektoren verbessert das Massendefizit um mehr als das 2-fache”. Jetzt fixiert es zwei Dinge: (1) Masse ist überhaupt erhalten, (2) es ändert sich nicht mit der Anzahl der Detektoren (da n_detectors die Breite des Detektors ist und nicht die Feinheit der Abtastung, fügt der zusätzliche Betrag, solange das Ziel hineinpasst, nur leere Bins hinzu).
examples/poc_ct_void_morphology.py
- L233 — ★Ersetzt man durch die Belegung des Dies, fällt bei groben Voxeln ein 50 µm dicker Die zwischen die Voxelzentren und die Referenz selbst verschwindet (bei 60 µm, Phase 2/3, wurde es tatsächlich 0).
- L558 — ★Übergibt man lauter nan (bei keiner Phase messbar) an np.nanmean, erscheint eine Warnung. “Nicht messbar” ist nichts zum Mitteln, daher setzen wir es hier explizit auf nan.
- L634 — ★Lasse die nan (nicht messbare Punkte) vor dem Zeichnen weg —— der Liniendiagramm-op weist nicht-endliche Werte zurück.
- L808 — ★Löst aus, sobald die Lücke geschlossen ist. Es löste am 2026-09-07 aus und dieser Abschnitt wurde umgeschrieben —— nach dem Hinweis, dass “esdf ein voxel_size der Länge 3 annimmt, die Seite, die dessen Ausgabe zeichnet, jedoch nur kubisch war”, nehmen query_distance (und occupancy_grid) nun ein res pro Achse an.
- L878 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
- L1097 — ★Der Volumenanteil bleibt selbst bei groben Voxeln erhalten; was zuerst stirbt, ist die Form-Kennzahl (die Seite, auf der die Vorhersage falsch lag)
examples/poc_datacenter_thermal_field.py
- L221 — ★2026-09-08: Dieses PoC hielt fest, dass es “keinen Zugang gibt, um aus verstreuten Punkten ein Feld zu erzeugen”, daher wurde
fs.interp_scattered ergänzt. Punkte außerhalb der konvexen Hülle gibt der op als Maske zurück, sodass man nicht mit isfinite raten muss (es bricht auch dann nicht, wenn fill_value auf einen endlichen Wert gesetzt wird).
- L862 — ★Das Gate zerstören, um zu prüfen, ob “falsche Gipfel 0” wirklich etwas zählt.
examples/poc_dem_terrain.py
- L42 — ★Ist das Repository-Wurzelverzeichnis nicht im Pfad, wird
demops nicht gefunden (dieses Beispiel importiert fullseye nicht, daher greift der Pfad-Hook nicht).
- 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 — ★Die Orientierung (Vorder-/Rückseite) wird durch die Umlaufrichtung bestimmt, aber die Umlaufrichtung von marching cubes kehrt sich je nach Vorzeichenkonvention der Eingabe um. Bei einem geschlossenen Mesh ist sie durch das vorzeichenbehaftete Volumen eindeutig bestimmt —— per Formel entscheiden, nicht per Augenschein.
- L379 — ★Den Gitterursprung nicht an der Wandfläche ausrichten. Schneidet man bei 3.0, fällt die Wandfläche genau auf die Voxel-Grenze, sodass an allen 8 Sweep-Punkten der Fehler 0.000 mm beträgt und die falsche Schlussfolgerung “es tritt keine Quantisierung auf” entsteht (am 2026-09-07 habe ich das einmal so geschrieben). Ein echter Mesher richtet das Gitter nicht an den Flächen des Bauteils aus, daher einen nicht ausgerichteten Ursprung verwenden.
- L455 — ★h nicht nur an Punkten sweepen, an denen “T/h ganzzahlig” ist. Bei ganzzahligen Verhältnissen ist die Anzahl der belegten Voxel genau T/h, sodass sich Fehler von 0.000 mm aneinanderreihen und es aussieht wie “es tritt keine Quantisierung auf” (am 2026-09-07 habe ich das einmal so geschrieben). h kontinuierlich sweepen.
- L705 — ★Die exakt 45-Grad-Neigungsrichtung nicht einbeziehen —— die 2349.7 mm^2 der Plattenrückseite haften ebenfalls am Schwellenwert, und die Tabelle “welche Ausrichtung ist am besten” wird von der Frage der Stufe gekapert.
- L824 — ★Ein assert, das auslöst, wenn ein Loch geschlossen wird. Es löste am 2026-09-07 aus und diese Zeile wurde umgeschrieben —— auf den Hinweis “es gibt keine flächenweise Fläche” hin wurden face_areas / mesh_volume / boundary_vertices ergänzt. Festhalten, dass es geschlossen wurde, und weitermachen.
examples/poc_dic_strain.py
- L104 — ★Die Normalisierung mit einer einzigen, aus dem Referenzbild festgelegten Konstante durchführen. Teilt man durch das Maximum jedes einzelnen Bildes, ändert sich die Gesamthelligkeit schon bei einer geringfügigen Verschiebung des Maximums durch die Verformung, wodurch Schätzern (Lucas-Kanade / Horn-Schunck), die Helligkeitskonstanz annehmen, ein sachfremder Fehler aufgeprägt wird.
- L211 — ★Den Befund festhalten: Da die Verformung keine Interpolation, sondern ein Neuzeichnen der Speckles ist, sollte eine ganzzahlige Verschiebung exakt übereinstimmen. Bricht dies zusammen, ist die “wahre Referenz” ab Abschnitt 2 keine wahre Referenz mehr, und es wird unklar, ob man den Schätzer oder den eigenen Interpolator misst.
- L247 — ★Den Befund festhalten: Alle drei müssen den Nullpunkt, der lediglich “nichts hat sich bewegt” antwortet, um eine Größenordnung schlagen. Fällt auch nur einer unter den Faktor 10, ist dieser Schätzer in diesem Fall nicht brauchbar.
- L282 — ★Den Befund festhalten. (1) Die Verzerrung von piv ist über den gesamten Sweep kleiner als lk / hs. Hinweis: “eine Größenordnung kleiner” gilt nur am einzelnen Punkt u=0.37 in Abschnitt 2 (0.0002 vs 0.0042 = 21-fach); beim Vergleich der Sweep-Maxima sind es etwa 6-fach (piv 0.0015 / lk 0.0088). Hier legen wir den Maximum-zu-Maximum-Vergleich konservativ auf 2-fach fest.
- L365 — ★Den Befund festhalten. (1) lk und piv gewinnen 100 µε auf ±30 µε genau zurück (gemessen +9.1 / +0.4).
- L369 — (2) ★hs liefert für 100 µε nur 22 µε zurück —— das obige “Vorzeichen und Größenordnung kommen heraus” gilt nicht für hs (die Regularisierung glättet die gleichförmige Dehnung selbst). Da die Behauptung von der Messung abweicht, halten wir die Messung fest.
- L413 — ★Den Befund festhalten. (1) Eine 2-Grad-Drehung ergibt bei kleiner Dehnung theoriegemäß eine Lüge von etwa -609 µε (das Material hat sich nicht gedehnt). Das sind 30% der Streckdehnung von Stahl von 2000 µε.
- L438 — ★Bei einem gleichförmigen Gradienten (ε linear in x) wird es nicht stumpf —— weil die kleinste Quadrate eines symmetrischen Fensters die Steigung einer linearen Funktion exakt zurückgeben. Um die Wirkung des Fensters zu sehen, braucht es ein Dehnungsfeld mit Krümmung. Die Dehnungskonzentration an der Kerbspitze ist genau das, daher bauen wir eine gaußförmige Konzentration ein.
- L484 — ★Den Befund festhalten. (1) Der Spitzenwert von lk fällt monoton mit der Fensterbreite (die Grenze der räumlichen Auflösung selbst).
- L522 — ★Schneidet und zählt man eine Ecke, verschiebt es sich je nach Fensterwahl um das 2-fache. Den Durchschnitt über alle Fenster verwenden.
- L577 — ★Den Befund festhalten: Die Verzerrung nimmt monoton ab, wenn die Speckles dicker gemacht werden. Die in Abschnitt 3 gesehene lk-Verzerrung ist keine Eigenschaft allein des Schätzers; die Unterabtastung des Speckles macht die Hälfte davon aus. Ist dies nicht mehr monoton, bricht eine Stütze der “0.01 px”-Behauptung weg.
examples/poc_die_tilt_tsv_overlay.py
- L167 — Ausdehnung des Gitters. ★Schließt man nicht den Ausläufer der erf (±4σ) ein, werden bei einem gekippten Die die Vias am äußeren Rand bei jedem z anders geschnitten, was eine falsche Neigung erzeugt.
- L241 — ★vol_label über das Register gibt, anders als der Docstring, nur labels zurück (das n von
(labels, n) fehlt. Abschnitt 9 (f)).
- L297 — ★Hier MU_SI nicht subtrahieren. Außerhalb der Via läuft die Sonde durch Luft (0), sodass der Rohwert direkt proportional zur Materialbelegung ist. Subtrahiert und clippt man, kollabiert der sanft abfallende Rand auf 0, und die Länge geht von 100.0 -> 98.1 µm (-1.9 %).
- L484 — ★Die Kontrollgruppe subtrahieren, um nur “den Anteil, den die Neigung hinzugefügt hat” herauszuziehen (den systematischen Fehler des Schätzers auslöschen).
- L634 — (f) ★Derselbe op gibt je nach Aufrufpfad einen unterschiedlichen Rückgabewert-Inhalt zurück.
examples/poc_dimensional_inspection.py
- L521 — ★Darf man dem rms trauen —— adversarial nur einen einzigen Punkt nach außen verschieben.
- L1553 — ★Am 2026-09-06 wurde der “vergrabene” Zustand behoben. Zuvor war es
n_reach == 0 (festhalten, dass es nicht erreicht). Jetzt halten wir fest, dass es erreicht.
examples/poc_document_scan.py
- L271 — ★Wendet man sobel_dir direkt auf eine binäre Maske an, wird die Gradientenrichtung auf 0/90 Grad quantisiert, und die richtungsbehaftete Hough mit einer Stimme pro Punkt kollabiert auf diese beiden Linien (gemessen: 2 der 4 Linien sind exakt 0.00 / 90.00 Grad). Erst weichzeichnen, dann die Richtung messen.
- 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 — ★Die Maskenflächen sind absichtlich vergleichbar gehalten. Der zusammengefasste AUC liegt nahe einem mit der Anzahl positiver Pixel gewichteten Durchschnitt, sodass “das Zusammenfassen verbirgt es” nicht auftritt, wenn eine um eine Größenordnung größer wäre.
- L119 — ★Der Maskenradius ist individuell als Vielfaches von σ festgelegt —— um die Flächen anzugleichen. Unterscheiden sich die Flächen um eine Größenordnung, wird daraus “der zusammengefasste AUC ist der AUC der größeren Fläche”, und was dieses PoC messen will, “das Zusammenfassen verbirgt es”, wird durch die andere Geschichte “die größere Fläche gewinnt” ersetzt.
examples/poc_fiber_orientation.py
- L376 — Abschnitt 2. ★★Der naive Durchschnitt bricht mit einer 180-Grad-Periode zusammen # ————————————————————————— #
- L469 — Abschnitt 4. ★★Ohne die Wahl von Gewichten fällt der Orientierungsgrad stets zu klein aus # ————————————————————————— #
- L499 — ★Da der Winkel eine periodische Größe ist, macht das Einfärben mit colorize_depth 0 Grad und 179 Grad zu entgegengesetzten Farben. fullseye hat keinen Namen für eine zyklische LUT, aber übergibt man (cos2θ, sin2θ) an colorize_flow, ergibt sich eine zyklische LUT des doppelten Winkels (siehe “Werkzeuglücken” (f) am Ende).
- L693 — ★Der Name “coherence” existiert, aber es ist die Zwei-Signal-Kohärenz aus der Signalverarbeitung (etwas anderes).
- L724 — (e) ★Zwei Vertreter derselben Familie weichen in ihren Eingabeprüfungen voneinander ab.
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. Das Bild wirkt. ★Die Schwelle liegt bei +3 dB — reale Halbleiterbilder bestehen größtenteils aus glattem Metall (Die, Leads), das schon in einem einzelnen Bild scharf ist; daher fällt der AIF-Gewinn kleiner aus als bei einem synthetischen Muster, das überall hochfrequent ist (das ehrliche Bild aus der Praxis; das alte vollflächige Texturfeld ergab +14 dB).
examples/poc_forensics_roc.py
- L396 — ★Lücke (a) ist eine “konstante Karte”, daher erübrigt sich das Ablesen der Zahlen, wenn man sie zeichnet.
- L523 — ★Die Überschrift dieses PoC. Die Kurve des stärksten Detektors fällt mit einem einzigen Druck auf die Speichern-Schaltfläche bis zur Diagonalen (und darunter).
- L677 — (4) ★Lücke (a): Das argmin-Auslesen des op ist bei einem erneut gespeicherten Bild im Wesentlichen eine konstante Karte. AUC ist genau 0.5 = nicht von Zufall zu unterscheiden.
- L704 — (9) ★Lücke (b): 8-Pixel-Gitter. Es errät nur richtig, wenn die Differenz ein Vielfaches von 8 ist (ohne erneutes Speichern).
- 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 — Unschärfe des Abbildungssystems. ★Die 2-D-Gauß-Unschärfe hat keinen Zugang, um σ direkt zu übergeben, daher rechnen wir σ = 0.3 + 2.7 a aus dem Regler a des Evolutions-op zurück und übergeben das (siehe “Werkzeuglücken” (c) am Ende).
examples/poc_geodetic_height_frames.py
- L411 — ★Ein Hin- und Rücklauf kann “beide in dieselbe Richtung falsch” nicht ausschließen. Gegen eine unabhängige Implementierung abgleichen.
-
| L440 — ★Vorhersage (vor dem Messen gedruckt): Die Neigung ist atan |
∇H |
. Mit h wird es atan |
∇H+∇N |
. |
- L467 — ★Trenne die maximale Differenz zwischen Vorhersage und Messung in ‘Modellfehler’ vs. ‘Diskretisierung’. Verfeinere die Zellen.
-
| L587 — ★Vorhersage (geschlossene Form): die Abwärtsrichtung dreht sich um mehr als 90 Grad ⇔ ∇H·(∇H+∇N) < 0 ⇔ |
∇H |
^2 + ∇H·∇N < 0. Berechne die Rate vor der Messung. |
-
| L647 — ★Die zweite (und eigentlich entscheidende) geschlossene Form. Da die Sichtlinie durch h an beiden Enden gezogen wird, liegt der lineare Anteil von N gleichermassen auf Sichtlinie und Boden und hebt sich auf. Es bleibt der Betrag, um den N von der Sehne abweicht = |
N’’ |
d^2 / 8. Hier ist N’’ gleich 2C(cos^2θ - sin^2θ), also |
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 — ★Bei
vertical liefert op_find durchaus Treffer, doch kein einziger ist relevant (Stamm-Übereinstimmungen wie boundary_vertices) —— behaupte nie anhand der Anzahl, es ‘existiere’.
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) ★Wiederholte Messung — Verzerrung von Streuung trennen # —————————————————————— #
- L444 — 4) ★Vergleich mit dem Nullpunkt (die maximale Probe der Einhüllenden) # —————————————————————— #
- L516 — 6) ★Rausch-Sweep — wo die Messung zusammenbricht # —————————————————————— #
- L556 — ★Eine kleine Streuung ist kein Beleg für Korrektheit
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 — ★Test von Vorhersage C —— variiere die Leckposition fein, um den Nachkommaanteil zu streuen
- L726 — ★Kontrollgruppe —— vertausche nur die Reflexionen links/rechts. Kehrt sich die Richtung der Verzerrung um, lässt sich sagen, die Ursache ist ‘die weiter entfernte Verbindung bestimmt die Richtung der Verzerrung’.
examples/poc_lens_tolerancing.py
- L165 (ja) — ★2026-10-21: 棒の縦軸は 0 から(自動範囲は最小値の少し下から始まり、差を 10 倍に見せていた)。
examples/poc_lidar_terrain_change.py
- L425 — ★Die Fläche der nicht messbaren Cores geht überhaupt nicht in die Erdmenge ein. Gib auch den durch die effektive Rate zurückgerechneten Wert zurück —— ohne Zurückrechnen hält man die ‘still fehlende Erdmenge’ für den korrekten Wert.
- L713 — ★Eine Zahl nahe am wahren Wert ist nicht zwangsläufig ‘korrekt’ —— zähle die zwei entgegengesetzten Fehler getrennt
- L842 — ★Wenn zu wenige gültige Cores vorliegen, gilt die LoD nicht als ‘gemessen’ (die Standardabweichung von 2 Punkten ergibt eine Zahl, hat aber keine Bedeutung).
- L845 — ★Wenn du hier ausdünnst, misst C2C am Ende den ‘Punktabstand nach dem Ausdünnen’, und die Dichteabhängigkeit verschwindet (als ich es zuerst auf 6000 Punkte angeglichen schrieb, ergab sich bei jeder Dichte ein konstanter Wert von 0.42 m).
- L965 — — ★ Genau um den Betrag, den du wegjustierst, verschwindet die Änderung ————————————– #
- L1329 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
examples/poc_lightfield_depth.py
- L707 — 2b. ★ Lücke (d): der docstring sagt 0-d, tatsächlich ist es (1,)
- L723 — 6. ★ Lücke (a): das voreingestellte linear zieht 1.15 in Richtung 1.0, cubic nicht
- L747 — 10. ★ Lücke (e) wurde am 2026-09-06 geschlossen. Sie wurde auf die Seite umgeschrieben, die den geschlossenen Zustand festhält (zuvor wurde per assert geprüft, dass ‘eine Warnung ausgegeben wird’).
examples/poc_livestock_body_volume.py
- L1187 — ★3 und 6 Kameras liefern exakt dieselbe Menge an Tangenten (in Parallelprojektion fallen zwei gegenüberliegende zusammen)
- L1195 — ★Ungerade 13 Kameras schlagen gerade 16
- L1209 — ★Eine 3-D-konvexe Hülle ist kein Ersatz für die ‘konvexe Hülle des Querschnitts’ (sie verfehlt den Brustumfang deutlich)
- L1212 — ★Verdopplungsgesetz: der Brustumfangfehler verdoppelt sich mit dem Körpergewicht (der Rest ist ein Term 2. Ordnung)
examples/poc_machine_condition_fusion.py
- L184 — Wärmeentwicklung [W] von (Kupplung, Lager A, Lager B, Gesamtmaschine). ★Normal, Unwucht und Lockerheit sind absichtlich identisch gemacht —— 3 Modi, die sich prinzipiell nicht anhand der Wärme trennen lassen.
- L202 — ★So heiss wie die Lager. Der einzige Unterschied ist die Ausbreitung (beide Lager + Gesamtmaschine).
- L1028 — ★2026-09-08: hier hatten wir numpys rfft selbst geschrieben —— weil wir es als ‘kein Eintrag für ein einseitiges Amplitudenspektrum im Register’ gelesen hatten, aber
fs.spectrum war von Anfang an da (es tauchte nur nicht im Register auf). Das ist ein Fall, in dem ‘existiert nicht’ entschieden wurde, nachdem nur eine Schicht betrachtet wurde, also auf die op-Nutzung umschreiben.
- L1162 — ★2026-09-08: hier stand geschrieben ‘kein spectrum im Register’, aber
fs.spectrum war von Anfang an da (die 1-D-Schicht von dsp). Es fehlte nur ‘das Erscheinen im Register (fs.ledger)’ und ‘die Notizen je op’; dieses PoC zog nur aus einer Schicht, entschied ‘existiert nicht’ und schrieb numpys rfft selbst. Da ops1d nun ins Register eingebunden ist, lässt es sich jetzt aus beiden nachschlagen.
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 — ★Zeige es gesättigt. Der reine Unterschied beträgt höchstens %.2f mm, und färbt man ihn unverändert, werden 99 %% der Pixel 0 und pechschwarz — eine Abbildung nach dem Motto ‘lief, aber nichts ist zu sehen’.
- L816 — ★Zeichne log-log. Auf linearen Achsen kollabiert der Fehler auf einen einzigen Punkt auf der groben Seite, sodass sich die Steigung (= Fehlergesetz) gar nicht ablesen lässt (am 2026-09-07 einmal so gezeichnet).
- L832 — ★Legt man die kumulativen Verteilungen unverändert übereinander, drängen sich alle 4 über 0.9 und nichts ist ablesbar. Was sich bewegt, ist der obere Rand, also lege die Quantile 0.5–0.99 auf die x-Achse und zeichne ‘die Krümmung an diesem Quantil’ auf die y-Achse (die obere Hälfte der inversen Kumulierten).
- L568 — ★Die Messung ist langsamer als das. Der Anteil der auf der Maske tatsächlich getilgten Korngrenzen-Pixel, f_eff, ist kleiner als f (die Unschärfe lässt das benachbarte Schwarz in die 1 px an beiden Enden des Spalts durchsickern, und die lokale Schwelle greift es auf), also vergleiche mit der über f_eff neu abgeleiteten Vorhersage Δ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 — Die Anzahl der Teilwinkel, die das Echo synthetisieren. ★Setzt man dies auf 61, liegen bei 70 Grad die Ankunftszeiten benachbarter Teilwinkel 330 µs auseinander, breiter als die Pulsbreite von 64 µs, sodass die Einhüllende zu einem Kamm wird und die Amplitudendetektion einen Zahn aufgreift (der Detektionsversatz ergab -1131 µs). Korrekter ist es, ein Histogramm der Ankunftszeitdichte zu bilden und mit dem Puls zu falten.
- L572 — ★Klemme die Untergrenze nicht bei 0 —— der Nadir-Strahl wird dann einseitig und das beleuchtete Band halbiert sich (bin einmal darauf hereingefallen, wobei der Footprint halb herauskam).
- L729 — ★Teile die x-Achse durch die eigene Echolänge des Strahls. Legt man in rohen µs übereinander, monopolisiert 70 Grad (21 ms) die Achse, und Nadir und 45 Grad fallen zu einer einzigen senkrechten Linie zusammen.
- L732 — ★
plot_series verweigert Punkte ausserhalb von xlim (weil sie am Rahmen kleben und wie echte Daten aussehen). Das Beschneiden ist Aufgabe des Aufrufers, also vorher beschneiden.
- L1151 — ★Schau nicht auf die Mitte der Überlappung —— dort haben beide Messlinien denselben Schwenkwinkel, sodass derselbe Fehler auf beiden liegt und die Differenz null wird. Nimm das Maximum über das gesamte Band.
- L1222 — ★Mach die y-Achse zur Höhe (= −Tiefe). Zeichnet man die Tiefe unverändert, kippen oben und unten, und eine ‘lächelnde’ Form sieht aus wie ein ‘Stirnrunzeln’.
- L1293 — ★Die y-Achse ist −Tiefe. Zeichnet man die Tiefe unverändert, ergibt sich eine auf dem Kopf stehende Abbildung mit der Meeresoberfläche unten und dem Meeresboden oben.
- L1327 — ★
op_find trifft über partielle Stämme, daher können die Inhalte auch bei einer Anzahl ungleich 0 irrelevant sein (“footprint” → sk_median_disk). Schau bis zum Namen der obersten Ebene, bevor du ‘existiert nicht’ sagst.
- L1383 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
- L1974 (ja) — ★左右に分ける: 音速の取り違えは θ について偶(左右対称)。ロールの小さな 取付偏りや参照格子の左右の食い違いは奇(D tanθ δ)。中心対称な階級なので k と n−1−k が鏡像。偶部で崖を測り、奇部は両解で同じか(= 音速でない)を見る。
- L2231 — ★Die Klippe des Alle-Pfade-Falls liegt früher als vorhergesagt. Der Unterschied ist die Verzerrung der Amplitudendetektion (eine Grösse, die in der geschlossenen Form fehlt)
examples/poc_nuclei_ploidy.py
- L686 — ★Es gibt tatsächlich Zeilen, in denen sich zwei entgegengesetzte Fehlschläge aufheben und sich als ‘exakt der wahre Wert’ tarnen
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 — ★Deckpunkte steigen durch Rauschen bis +3σ auf, also mit einer Bodenschwelle abschneiden. Ohne sie erhält selbst eine Ladung mit null Überstand einen falschen “Überstand” von 0.006 m3.
- L479 — ★Bei g = w genau wird es zur Frage, “ob das Gitter zufällig zusammenpasst”.
examples/poc_panorama_drift.py
- L112 — ★Lücke (a): keines der folgenden 4 erscheint in der fs-Fassade oder in fs.op
examples/poc_particle_sizing.py
- L213 — ★Mit nur einem einzigen Seed wird das Auf und Ab dieser Kurve bloßes Rauschen. Erst mit 4 Seeds Mittelwert und Streuung trennen, bevor man sagt, sie habe “gekreuzt”.
- L428 — ★Kontrollgruppe —— nur Blobs, die weder verschmolzen noch getrennt sind, eins zu eins mit genau dem Partikel abgleichen, das dieser Blob abbildet. Nimmt man auf der Ground-Truth-Seite alle Partikel, mischt sich der Auswahl-Bias “größere Partikel verschmelzen leichter” hinein und wird vom Sampling-Bias ununterscheidbar (zuerst so geschrieben und verwechselt).
examples/poc_particle_tracking.py
- L702 — ★Der Rückgabewert ist keine Maske, sondern (N, 3)-Koordinaten (z, y, x) (die 2-D-
local_max / sk_local_maxima geben ein Bild zurück, also ist die Familie uneinheitlich. Abschnitt 10, Lücke (g)). Zuerst mit count_nonzero gezählt und die Größenordnung verfehlt.
- L777 — ★Um 3.4× nach oben und 0.93× nach unten in ein Diagramm zu bringen, ist die vertikale Achse das log10-Verhältnis. 0 ist “genau der wahre Wert”. Linear belassen werden Abweichungen nach unten zerdrückt und unsichtbar.
- L792 — ★Legt man die rohen MSD übereinander, dominiert die 4Dτ-Gerade alles und die Unterschiede sind unsichtbar. Als durch den wahren Wert geteiltes Verhältnis lässt sich die Abweichung von 1.0 (= wie es bricht) an der Form ablesen.
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 — ★Den Befund festhalten: Dies ist eine exakte Gegenrechnung zu fullseyes Mueller-op, die selbst bei einem vollen δ-Durchlauf in 15-Grad-Schritten und 5 θ-Werten auf Maschinengenauigkeit übereinstimmt (gemessen 2.2e-16). Lockert sich das, misst man ab Abschnitt 3 nicht das “Ausleseverfahren”, sondern einen Bug im op.
- L181 — ★Auch die Gegenrechnung des Spannungsfelds selbst festhalten. Stimmt die integrierte Kraft nicht mit der Last überein, ist es nicht der “wahre Wert”, und der Zentralwert muss algebraisch mit der geschlossenen Form 8P/(πDh) identisch sein.
- L207 — ★Das Niveau des Nullpunkts festhalten. Jedes folgende “N-fach” verwendet diese 1.09 MPa als Nenner, verschiebt sich das, ändert sich die Bedeutung des Vergleichs.
- L231 — ★Den Befund festhalten: Das naive Verfahren, aus einem einzigen Dunkelfeldbild nur ganzzahlige Streifen abzulesen, schlägt den Nullpunkt nicht einmal um das 2-fache. Weil die Auflösung durch den Schritt fσ/h = 1.78 MPa begrenzt ist. Der Kontrast zur Phasenverschiebung in Abschnitt 4 (deren Fehler auf Maschinengenauigkeit fällt) ist das Rückgrat dieses PoC.
- L286 — ★Da wir bei null Rauschen aus derselben Intensitätsgleichung zurückrechnen, muss θ exakt zurückkommen (die Algebra, die 4θ aus den 4 planpolarisierten Bildern erzeugt, ist selbst die Umkehrabbildung).
- L308 — ★Den Befund festhalten. (1) Die Übereinstimmung übersteigt 95 %, erreicht aber nie 100 %. Der Rest sind Pixel, deren Vorzeichen durch die Mehrdeutigkeit (δ,θ) ↔ (-δ,θ+90°) umgekehrt ist, die sich mit einer einzigen Messung bei einer Wellenlänge prinzipiell nicht beseitigen lässt. Den Befund unverändert festhalten: weder “nahezu übereinstimmend” noch “vollständig übereinstimmend”.
- L371 — ★Den Befund festhalten. (1) Es gibt keine Depolarisation (der Stokes-Betrag ist exakt 1). Das ist die Grundlage für die Behauptung in Abschnitt 5, dass in der Modulation nicht die Lichtmenge, sondern die Phasenempfindlichkeit abfällt.
- L377 — (2) ★★Die Messung sagt das Gegenteil der naiven Erwartung, “eine Maske zu übergeben behebt es”: ohne Maske 97.0 % / bei Ausschluss der Unterabtastung 97.1 % / schließt man auch die niedrige Modulation aus, fällt es auf 81.9 %. Weil das Entfernen der niedrig modulierten Pixel die Region zerteilt und skimages unwrap pro Insel einen anderen 2π-Offset wählt. “Beides lässt sich per Maske ausschließen” ist als Vorhersage richtig, als Rezept aber falsch. Den Messwert festhalten.
- L442 — ★Den Befund festhalten. (1) Ohne Rauschen und ohne Quantisierung kommt δ aus dem Hellfeld/Dunkelfeld-Verhältnis exakt zurück.
- L445 — (2) ★Der Fehler durch “reine” 8-Bit-Quantisierung ist von derselben Größenordnung wie der Fehler durch reines Rauschen σ=0.002 (gemessen 0.00277 vs 0.00305). Die Bit-Tiefe der Kamera wiegt so schwer wie das Rauschen.
examples/poc_pigment_unmixing.py
- L860 — ★Genau die Grundlage für “nicht auf eine einzige Zahl reduzieren”. In derselben Zeile stehen 1.000 und 0.013 nebeneinander.
- L1082 — ★Auch im Diagramm festhalten, dass es nicht gewonnen hat. Keine einzige Rekonstruktion liegt unter der Nullpunktlinie.
examples/poc_pipe_wall_loss.py
- L423 — ★Für den intakten Bereich ein “z, in das kein einziger Defekt fällt” wählen. Zuerst schrieb ich z=20..60 als intakten Bereich, doch das lag direkt über der Korrosion am Rohrboden (Wandstärke 4.5 mm).
- L471 — ★r_in/r_out sind in Pixel- (Voxel-)Einheiten. Übergibt man sie in mm, wird außerhalb des Sichtfelds abgetastet und der Rückgabewert wird komplett 0 (stillschweigend. Zuerst entstand dadurch ein pechschwarzes Bild).
- L817 — ★Es wird pro Panel normiert, also vor dem Übergeben auf denselben Bereich beschneiden (ohne Beschneiden wird nur E0 mit ±4 mm und der Rest mit ±1 mm eingefärbt und sie sind nicht vergleichbar).
- L1040 — ★Klingelt, wenn die Lücke geschlossen ist. Am 2026-09-07 klingelte es und ich schrieb diesen Abschnitt um —— dem Hinweis folgend, dass “Übergabe in mm ausnahmslos alles als 0 zurückgibt”, wurde es fail-closed, wenn der Ring außerhalb des Sichtfelds liegt. Festhalten, dass es sich vom leer-zurückgeben-und-schweigen zum ablehnen-und-melden gewandelt hat.
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 — Rasterweite des Halbtons [lpi] (üblicher Wert im kommerziellen Druck). ★Absichtlich ein ganzzahliges Verhältnis vermeiden: bei 1200/150 = 8.00 px fällt jeder Rasterpunkt auf dieselbe Nachkommaposition, die Abtastphase richtet sich aus und der Compositor erzeugt Artefakte (gemessen sprang der Schwerpunkt pro Nachkomma-Versatz um 1.4 px). Auch bei echten Scans ist die Auflösung fast nie ein ganzzahliges Vielfaches der Rasterweite.
- L405 — ★Der Eingang des Registers verwirft info, um dem deklarierten out-Typ zu entsprechen, also
.raw verwenden (eine im Kommentar von fullseye/init.py mit Messwerten dokumentierte Falle).
- L855 — ★Auf der FM-Seite den Suchbereich nicht einengen (Einengen ändert das Ergebnis nicht, verhindert aber die Ausrede, “das Aliasing von AM liege am Suchbereich”).
- L1242 — ★Ein Punkt, an dem die zweistufige Stufe brach, ist stets ein Punkt, an dem das Grobe den Zellradius überschritt (die Inklusionsbeziehung festhalten)
- 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 — ★Auch der Referenz Rauschen hinzufügen —— bei einem rauschfreien Bild ergibt star_detect “0 Sterne” und einen ValueError (was für sich genommen ein korrektes fail-closed ist).
- L1353 — ★2026-09-08: Dem Hinweis dieses PoC folgend habe ich die op-Seite korrigiert. Ich schrieb “für repetitive Strukturen nicht verwendbar” mit gemessenen Zahlen in den docstring und ließ den zweithöchsten Peak / höchsten Peak der Abstimmung als
vote_margin zurückgeben. Diese Zahl kann zwei Fälle unterscheiden, die die Zustimmungsrate nicht unterscheiden kann.
examples/poc_print_warpage_risk.py
- L364 — ★Eine neu entstehende Schicht wird “auf die zu diesem Zeitpunkt bereits verwölbte Fläche” gelegt (die Elementgeburt erfolgt in der verformten Konfiguration). Vergisst man, dies zu initialisieren, bleiben nur die später gewachsenen Schichten bei null Verschiebung und die per Spaltenmittel gemessene Verwölbung wird 1/4 (am 2026-09-07 hineingetreten). Die Mechanik (K und f) liegt auf dem nominalen Gitter, ist also unverändert.
- L806 — ★Der Hals verschwindet vollständig. Das Bauteil zerfällt in zwei, daher darf es nicht gelöst werden.
examples/poc_pv_thermal_survey.py
- L381 — ★MOD_SHELTER ist ein Modul, das intakt ist, aber keinem Wind ausgesetzt wird. In Abschnitt 3 verwandelt es sich unter dem Gesamtmittel-Kriterium in einen “Defekt”.
- L583 — ★Die Modulnummer pro Nummer über den Flächenanteil bestimmen. Rundet man den Mittelwert der Nummern, werden Randpixel zu einer Nachbarnummer (oder 0) und die modulweise Verarbeitung bricht.
- L812 — ★Der Preis des Modulmedians —— blind für eine Anomalie eines ganzen Moduls
- L1270 — ★
apply_cmap normiert nach min/max dieses Arrays, wenn vmin/vmax nicht übergeben werden (wodurch sich die Bedeutung der Farbe je Bedingung ändert), also stets übergeben.
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 — ★Auch wenn die Anzahlen übereinstimmen, zählt man nicht zwangsläufig dasselbe. Prüfen, ob genau ein Kreis in genau eine Komponente fällt (eins zu eins) —— ohne das gilt “24 = 24” auch zufällig (ein Blob aus zwei zusammenklebenden + ein Stück Müll, trotzdem 24).
- L341 (ja) — ★2026-10-06: 題の「46 %」が固定文言で、実行の値(+0.40 で -50.41 %)から外れていた。実行の値を差し込む。
examples/poc_real_deblur_honesty.py
- L199 — ★Zu schützen ist nicht “welches gewinnt”, sondern dass der Sieger je Maßstab verschieden ist. Fixiert man den Methodennamen, wird es ein Tor, das schon deshalb fällt, weil sich die Implementierung verbessert hat.
examples/poc_real_defect_floor.py
- L156 — Amplitudenschritt. ★Dies selbst ist ein Regler. Ist er grob, rundet das Limit auf denselben Gitterpunkt und man liest eine vom Schritt erzeugte Differenz wie “je größer σ, desto größer der Abstand” als echt (2026-09-09; bei 34 Stufen rundeten die Mediane von σ=1.5 und σ=3.0 beide auf 3.20).
examples/poc_recycling_sorting.py
- L520 — ★Vor dem Sweep aus der Algebra eine Vorhersage bilden und ausdrucken.
examples/poc_registration_basin.py
- L785 — ★Wenn der Nutzer
estimate_normals explizit uebergibt, im Glauben, die Normalen seien doch vorhanden. Das ist der Rest der Luecke, 14 Groessenordnungen schlechter als der Standard.
- L965 — ★Luecke 1 wurde am 2026-09-06 geschlossen. Dieses assert wurde so umgeschrieben, dass es den geschlossenen Zustand fixiert (frueher fixierte es den defekten Zustand:
d_fixed < 1e-6 < d_default = defekt). Kehrt der Defekt zurueck, schlaegt es hier fehl.
- L976 — ★Luecke 2 wurde am 2026-09-06 geschlossen. Frueher war es
< 0.9 * len(ka) (den defekten Zustand fixierend). Jetzt fixiert es, dass der Standard eine exakte Uebereinstimmung liefert.
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 — ★Momenten-Invarianten fuer Regionen im HALCON-Stil. Verschieden von
moment_invariants fuer 3-D-Punktwolken (allein nach dem Namen gewaehlt, verlangt es (N,3) und schlaegt fehl).
- L208 — ★Die relative Streuung verliert ihre Bedeutung, wenn der Nenner nahe 0 liegt. Bei nahezu kreisfoermigen Formen ist der wahre Wert von Hu[1] nahe 0, sodass eine stillschweigende Angabe in % zu “um 30 % abweichend” wird.
- L220 — ★Wo die Vorhersage danebenlag. Beim Schreiben dachte ich “das Interpolieren des Grauwerts und erneute Binarisieren ist rauer”, aber beim Umfang war es umgekehrt.
- L262 — ★Da der Hintergrund monochrom ist, wird die Kontur in einer gesaettigten Farbe gezeichnet. Grau hat keine Saettigung, sodass sich eine gesaettigte Farbe von jedem Tonwert im Farbton unterscheidet – zuverlaessiger als eine invertierte Farbe, und man erkennt auf einen Blick, dass “dies eine ueberlagerte Linie ist”. Invertierte Farben spielen ihre Staerke aus, wenn der Hintergrund farbig ist und “jede gewaehlte Farbe kollidieren koennte”.
examples/poc_safety_clearance.py
- L114 — ★Der Rumpf wird gebaut, indem zwei Kapseln nebeneinander gesetzt werden. Ein einzelner Zylinder macht den Querschnitt kreisrund, und die Schultern (±0.19 m von der Rumpfmitte) fallen aus dem Schatten des Rumpfs – der reale Rumpf hat einen flachen Querschnitt von 0.50 m Breite / 0.30 m Tiefe, und ein ausgestreckter Arm wird von hinten gesehen vom Rumpf verdeckt.
- L126 — ★X0 und die Geschwindigkeit sind so gewaehlt, dass “der wahre Trennabstand in jedem Versuch positiv bleibt (kein Kontakt)” und “lange genug im Gefahrenband verweilt” – schnelles Gehen durchquert das Gefahrenband in wenigen Frames, sodass zu wenige Stichproben zum Zaehlen der uebersehenen Detektionen bleiben.
- L673 — ★Variiert man die Dichte, waehrend die Verdeckung eingeschaltet bleibt, legt sich der Verdeckungs-Bias (+0.12 m) auf jede Zeile und verdeckt die Wirkung der Dichte. Die Aufgabe der Kontrollgruppe ist es, jeweils einen Faktor abzuschalten.
- L683 — ★Bei einer einzigen Ziehung von Rauschen und Ausduennung schwankt die Fehlerrate um einige %. Dreimal laufen lassen und mitteln.
- L840 — ★Zeilenweise gebuendelt auswerten (eine Python-Schleife pro Zelle liefe 15000 Mal).
- L1079 — ★Volumen-Ops sind (depth,row,col). grid_coords ist (nx,ny,nz), also transponieren.
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 — ★Das Anwenden von trim waehlt weiterhin nur “die gut passenden Punkte” und faellt in eine andere Loesung mit RMSE 0.13 mm (gemessen: der eingezogene Winkel betraegt 0.17 mrad bei trim=0.9, 0.62 mrad ohne trim). Bei der As-built-Pruefung ist der Defekt selbst das grosse Residuum, sodass trim den Defekt verwirft.
- L950 — ★Die Kernaussage in einem Bild: eine unversehrte Decke erscheint allein durch die Art der Ausrichtung geneigt
examples/poc_sea_ice_concentration.py
- L232 — 2. ★Nulllinie vs lineare Mischungszerlegung # ————————————————————————— #
- L252 — 3. ★★Die Blob-Groesse (Umfang) bestimmt den Bias # ————————————————————————— #
- L291 — 4. ★★Das Vorzeichen des Bias kippt mit der Naehe (Aufhebungspunkt) # ————————————————————————— #
- L353 — 6. ★Wenn das Endglied um 5 % abweicht # ————————————————————————— #
- L380 — 7. ★★Dritte Komponente (dünnes Eis) # ————————————————————————— #
- L490 — (b) spec_unmix existierte doch (★vor dem Schreiben von “nicht vorhanden” 3 Ebenen durchsucht)
examples/poc_search_sweep_width.py
- L829 — ★Wie die Form wirkt, haengt vom Suchtyp ab. Die Abtastbreite angleichen und nur die Kurvenform vergleichen.
- L869 — ★Mit der Fehlerrate 1-P zeichnen. P selbst klebt oben rechts und verschwindet hinter der Legendenbox, unsichtbar (ich habe es einmal tatsaechlich verdeckt und es bemerkt). Die Abbildung erst festlegen, nachdem geprueft ist, ob sie “lesbar” ist – selbst wenn die Zahlen stimmen, vermittelt eine verdeckte Darstellung nichts.
- L1089 — ★Reproduzierbarkeitspruefung: da sowohl der Seed als auch die Frame-Anzahl von §3 abweichen, wie stark es sich unter denselben Bedingungen bewegt.
- L1266 — ★Dass es die Nulllinie uebertrifft (bei angeglichener Falsch-Positiv-Rate). Der Gewinn ist bescheiden – “selbst die Nulllinie erreicht 174 m” ist der Befund dieses Abschnitts, und genau das wird fixiert.
- L1272 — ★Eine danebenliegende Vorhersage: das Subtrahieren des globalen Hintergrunds ist eine affine Transformation, also praktisch dasselbe wie die Nulllinie
- L1286 — ★Eine danebenliegende Vorhersage: mit dem gemessenen p erreicht die parallele Suche bei C=1 nicht 1.000
- L1290 — ★Die Form wirkt nur bei der parallelen Suche: bei angeglichener Abtastbreite stimmt der Zufall ueberein, waehrend die parallele sich aufspaltet
- L1293 — ★Eine danebenliegende Vorhersage: die flache Kurve sollte staerker sein, war aber stattdessen schwaecher (wegen ihres langen Auslaeufers)
- L1296 — (6) ★W verdoppeln und t verdoppeln sind aequivalent
- L1304 — (8) ★Waechter: Falsch-Positive konzentrieren sich direkt darunter. W bewegt sich allein durch den Schwellenwert stark
- L1322 — ★Das Gate auf der aufgefuellten Seite (2026-09-08). Da op_find eine japanische Textebene erhielt und in den docstring von star_detect domainneutrale Beschreibungsbegriffe geschrieben wurden, fixiert es, dass es bei japanischen Anfragen weit oben rangiert. Bei einer Regression schlaegt es hier an.
- L1327 — ★Nur “Punkt-Detektion” taucht weiterhin nicht auf – das einzelne Zeichen “Punkt” erscheint zwangslaeufig auch in den Beschreibungen von Kontur-Ops wie cv_canny / frei_amp, sodass Gleichstaende sich aufreihen und es verdraengen. Es verschweigt nicht die Grenze, dass die japanische Textebene nur hilft, wenn “Woerter aus zwei oder mehr Zeichen greifen”.
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 — ★Die Kalibrierlinie wird ebenfalls durch dasselbe Abbildungssystem (Unschaerfe) gefuehrt. Eine ohne Unschaerfe eingefuegte Kalibrierlinie reagiert 2.4x staerker als ein echter Riss und zog die Kante zur dicken Seite (am 2026-09-07 hineingetreten).
examples/poc_solar_limb_darkening.py
- L317 — 2. ★Nulllinie (50 %-Methode) vs maximaler Gradient vs Abschwaechungsmodell # ————————————————————————— #
- L367 — 3. ★★Den Abschwaechungskoeffizienten u durchfahren – er knickt ab, statt proportional zu skalieren # ————————————————————————— #
- L391 — ★Kontrollgruppe – schaltet man die Unschaerfe ab, bleibt nur die Geometrie (die Position der 50 %-Flaeche)
- L427 — 4. ★★Das Vorzeichen der Unschaerfewirkung aendert sich mit dem Schwellenwert (Aufhebungspunkt) # ————————————————————————— #
- L488 — 5. ★Schwarze Punkte – 3 % Ausreisserpunkte bewegen den Radius # ————————————————————————— #
examples/poc_spc.py
- L144 (ja) — ★MT 法。単位空間の MD² の平均はちょうど (n-1)/n(導出した恒等式)。 1.0 を固定する検査はどんな有限標本でも間違いになる。
examples/poc_star_astrometry.py
- L264 — Bildsynthese (★ Luecke: fullseye hat keine oeffentliche op, die einen Stern an angegebenen Koordinaten platziert) # ————————————————————————- #
- L1243 — ★ “klein pro Durchlauf” und “klein in Summe” sind verschiedene Aussagen.
- L1348 — ★Dass der Bias von “uniform/isoliert” 0.0000 ist, versteht sich von selbst – die Plate-Lösung wurde an diese 24 angepasst, also treibt die Methode der kleinsten Quadrate den Mittelwert der Residuen auf 0. Um den Fehler an nicht genutzten Sternen zu sehen, jeweils einen weglassen und neu lösen.
examples/poc_stockpile_volume.py
- L658 (ja) — ★座標の約束: 格子の行 0 を北(画像の上)とし、世界座標は (x = 東, Y = 北 = -行方向, z = 上)。 行方向をそのまま +Y にすると左手系になり、絵が鏡像になる(上から見た静止図と左右が食い違う)。
- L863 — ★Je nach Maßstab wechselt der Sieger: Volumen nutzt eine horizontale Grundfläche, der Schwerpunkt eine Ebenenanpassung
- L879 — ★Eine Vorhersage, die danebenlag: die Interpolation unterschätzt nicht, sondern überschätzt
- L882 — ★Auslöschung: mit dem interpolierten Umfang wirkt der Fehler klein, mit nur den sichtbaren Punkten kehrt er zurück
- L891 — ★Eine Lücke im Werkzeug. Diese Stelle schlägt an, sobald dem_viewshed behoben ist (das ist der Zweck)
- L893 — ★2026-09-08: aufgrund des Befunds dieses PoC wurde der op behoben, also ist sichtbar jetzt korrekt. Wir fixieren, dass es mit unserer eigenen Sichtlinienprüfung übereinstimmt und nahe an der geschlossenen Form liegt (es schlägt erneut an, wenn es kaputtgeht).
examples/poc_strain_history.py
- L507 — ★Vorhersage in geschlossener Form. Zentral = (w²-1)/24 x d²(Geschwindigkeit)/dt² (die Abstumpfung durch Glättung), kausal = gibt die um (w-1)/2 verzögerte Geschwindigkeit zurück.
- L578 — ★Kein Diagramm erstellen, das die Verläufe selbst überlagert – Wahrheit, kumuliert und direkt sind mit dem Auge nicht unterscheidbar (der Fehler beträgt 0.1-3 % der Wahrheit), und es wird ein Diagramm, das bloß “gut übereinstimmend” aussieht. Nur Diagramme ausgeben, in denen das Gemessene sichtbar ist.
examples/poc_structure_4d_deterioration.py
- L349 — ★Verdeckung wird über die Sollform (
p_nom) beurteilt. Drückt eine Degradation von wenigen mm bis einigen zehn mm die surface ins Innere der selbstverdeckenden Box, wird die tiefste Stelle des Defekts komplett nicht gemessen, was die falsche Szene “je tiefer der Defekt, desto unsichtbarer” erzeugt (am 2026-09-07 erlebt: der core der Defektmulde bei -21 mm wurde vollständig NaN).
- L437 — ★Die Normale von
fit_plane_3d hat ein beliebiges Vorzeichen. An die echte Außenrichtung angleichen (auf der Scanner-Seite).
- L507 — ★Über das Register wird nur der deklarierte out-Typ (pose) zurückgegeben, daher alles über
.raw entgegennehmen.
- L696 — ★”Wenn unterschiedliche Dichte das Problem ist, dann vereinheitliche sie” tatsächlich ausprobieren (voxel_grid_downsample)
- L1257 — ★Den beobachtbaren Informationsgehalt selbst aus der Punktwolke zählen (die Diagonale der Normalgleichungen)
- L1299 — ★Zuerst den Boden der Messmethode selbst nehmen – einfach zweimal messen, ohne Degradation und ohne Lagefehler.
examples/poc_surface_roughness.py
- L270 — ★Die Wahrheit wird erst nach Deklaration des Bandes definiert. Nicht die Rauheitskomponente selbst, sondern “die Rauheitskomponente nach dem Schnitt bei λc” ist die Wahrheit. Nimmt man hier das rohe rough_true, weicht selbst eine Messung nach korrektem Verfahren um -23% ab, und diese 23% vermischen sich mit dem Abtastfehler. Eine “Rauheitswahrheit” ohne Band existiert nicht – das ist zugleich die Aussage von Abschnitt 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 — ★ Lücke (a): es gibt keinen öffentlichen op, der eine Korrelationskarte zurückgibt, daher leihen wir einen privaten. Erst verwenden, nachdem in Kapitel 0 verifiziert wurde, dass er mit dem öffentlichen op
fs.op.ncc_locate übereinstimmt.
- L327 — ★ Lücke (d): ein öffentlicher op würde hier stillschweigend [0,0,0] zurückgeben. Stattdessen explizit einen Fehler zurückgeben.
- L1241 — (2) Der Nullpunkt hat einen Boden – Quantisierung ganzzahliger Koordinaten (★ Lücke b)
- L1271 — (9) ★ Thema: Stärken und Schwächen der Konfidenz kehren sich je nach Bedingung um
- L1275 — ★ Die Kanten, an denen sie jeweils gut sind, sind entgegengesetzt = man kann nicht eines von beiden als Konfidenz wählen
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 — ★Vorwärts ist direkte Integration, invers ist eine Kalibriertabelle. Ein Hin-und-Zurück durch dieselbe Tabelle liefert trivialerweise Fehler 0 und gilt nicht als Messung des Bodens.
- L543 — ★Dass Case-0 exakt 0 ist, liegt daran, dass 350.0 K zufällig auf einem Tabellenknoten liegt. Weg vom Knoten zeigt sich der Interpolationsfehler – 0 als Boden zu bezeichnen ist eine Lüge.
- L772 — ★Die x-Achse ist der Anstieg über die Umgebung. Bleibt es bei T_obj, kollabiert die Divergenz zu einer einzigen senkrechten Linie am linken Rand, und das entscheidende “ab wo es springt” ist nicht ablesbar.
- L782 — ★
plot_series weist Punkte außerhalb des Rahmens ab (weil sie am Rahmen kleben und wie echte Daten aussehen). Die divergierende Seite schneidet der Aufrufer vorher ab.
- L836 — ★Die x-Achse ist das absolute Δε. Als relatives Δε/ε geplottet überlappen sich die drei Kurven exakt (weil ε gemäß §2 aus der Gleichung herausfällt) – das Diagramm sagt nichts aus.
- L1169 — ★Das Guard-Band nutzt den oberen Überstand. Da wir als Bestehen behaupten wollen, dass “die Wahrheit nicht über dem Schwellwert liegt”, schneiden wir am oberen Ende des Intervalls. Nimmt man das untere off[0], schneidet man zu flach (genau um die Rechtsschiefe der Verteilung) – einmal so geschrieben und daran gemerkt, dass die Falsch-Bestehen nicht abnahmen.
- L1272 — ★Bei derselben Verwechslung fällt L_obj auf der ε=0.10-Fläche ins Negative und löst eine Ausnahme aus. Das heißt, “anhalten oder still danebenliegen” entscheidet nicht die Verwechslung, sondern die Szene.
- L1346 — ★Die Wärmequelle als flaches Plateau ausführen. Als Berg gilt “Schraube und Umgebung bei gleicher Temperatur” nicht, und man kann nicht trennen, ob die scheinbare Mulde vom Emissionsgrad oder von der Temperatur kommt.
- L1392 — ★Die Korrektur beseitigt den Bias, vervielfacht aber das Rauschen um 1/ε. Deshalb ist in Abbildung (d) nur die Schraube körnig.
- L1464 — ★
op_find greift über Teiltreffer am Wortstamm. blackbody liefert 4 Treffer, deren Inhalt aber Morphologie wie cv_blackhat ist und nichts mit Wärmestrahlung zu tun hat. Aus der Trefferzahl “es existiert” abzulesen, geht daneben. Erst nach Blick auf den führenden Namen sagen.
- L1614 — 3. ★Eine Vorhersage, die danebenlag: der absolute Fehler ist bei höherer Temperatur größer
- L1616 — ★Selbst bei geändertem Maßstab divergiert der Emissionsgradfehler nicht mit dem Anstiegsverhältnis (er sättigt in Δε/ε)
- L1619 — ★Was divergiert, ist die reflektierte scheinbare Temperatur (je kleiner der Anstieg, desto stärker springt sie)
- L1632 — 6. ★★Überdeckungsrate. Am Boden (ρ=0) sind RSS und MC beide 95 %; mit Korrelation fällt RSS ab
- L1636 — ★Die MC-Seite pendelt sich bei 94.4-94.6 % ein (nicht exakt 95 %). Die Intervallenden werden über Perzentile aus 40000 Versuchen bestimmt, es gibt also Stichprobenfehler, und in der Realität ist auch Quantisierung beigemischt. Genau das einschließend sagt man “MC trifft”.
- L1652 — 7. ★Die Fehltreffer neigen zu einer Seite (symmetrisches ±k·u verfehlt eine schiefe Verteilung)
- L1656 — 8. ★★guard band: Falsch-Bestehen ist Ignorieren > RSS > MC, Falsch-Durchfallen umgekehrt
- L1676 — ★Die Korrektur beseitigt den Bias, vervielfacht dafür aber das Rauschen um 1/ε (nahe am ε-Verhältnis von 9.5)
examples/poc_thermography_ndt.py
- L61 — ★Die Beobachtungszeit lang genug — über das t* (6.8 s) des gesunden Bereichs hinaus wählen. Zu kurz, und das Knie des gesunden Bereichs rutscht aus dem Fenster, und TSR beantwortet den gesunden Bereich als “Tiefe am Fensterrand” (in der Messung blieb es bei 2.82 mm kleben).
- L126 — ★Nur diese Stelle ist eine Näherung. Da die 1-D-Lösung keine laterale Diffusion enthält, verschmieren wir zu jedem Zeitpunkt in der Ebene mit einer Gauß-Funktion der Diffusionslänge σ(t)=√(2αt). Das physikalische Skalierungsgesetz ist korrekt, aber die Massenerhaltung am Rand wird nicht erfüllt.
- L236 — Der Bereich, in dem TSR nach t* sucht. ★Das Ausschließen der Ränder ist keine Zierde —— die 2. Ableitung eines Polynoms hoher Ordnung explodiert an den Rändern zwangsläufig (Runge). Ohne dies klebt das argmax am ersten oder letzten Frame, und die Tiefe klebt an den 2 Werten an den Fensterrändern (gemessen, 2026-09-06). Wir haben die Grade 4–11 durchlaufen und uns für 8 entschieden (bei 4–5 kleben Tiefen jenseits von 1.5 mm an den Rändern; ab 8 dieselbe Antwort wie 9/11).
- L271 — ★Das Runden von t* auf die Gitterschrittweite quantisiert die Tiefe treppenförmig (bei 64 Punkten 5 %-Schritte). Wir passen eine Parabel an 3 Punkte an, um die Sub-Gitter-Position von ln t zu ermitteln.
- L329 — ★Den Befund festhalten. Dies ist eine Nahe-Null-Kontrollrechnung, bricht sie zusammen, ist die Implementierung kaputt.
- L343 — ★Der Bias des Schätzers selbst. Ganz ohne ein Bild zu durchlaufen wenden wir
tsr_depth auf eine exakte 1-D-Kurve an. Der hier auftretende Fehler ist der “Boden der Polynomanpassung”, und nur was nach dessen Abzug von den Abweichungen ab Abschnitt 3 übrig bleibt, ist der Beitrag von Querdiffusion und Rauschen.
- L361 — ★Den Befund festhalten: der Boden ist nicht null, aber klein. Wir grenzen ihn beidseitig ein —— würde er null, hielte die Umdeutung in Abschnitt 3 (“selbst eine Kurve, die kein Bild durchläuft, weicht um einige % ab”; ±5 % entspricht etwa dem Boden) nicht mehr, und würde er groß, könnten wir die Abweichungen ab Abschnitt 3 nicht mehr der Querdiffusion zuschreiben.
- L396 — ★Den Befund festhalten. Dass diese 2 Zeilen gleichzeitig gelten, ist genau die Aussage dieses Abschnitts. (1) Fasst man die 16 zu einem einzigen Mittelwert zusammen, unterliegt TSR der Null-Basislinie, die “immer 1.50 mm antwortet”.
- L426 — ★Den Befund festhalten. (1) Das untere rechte Dreieck, wo der Durchmesser mindestens das 4-fache der Tiefe beträgt, wird auf wenige % genau getroffen (etwa gleich dem Boden aus Abschnitt 1).
- L457 — ★Kontrollgruppe: dieselbe Szene mit abgeschalteter Querdiffusion. Damit lässt sich “Schuld der Querdiffusion” von “Schuld zu weniger Pixel / einer nicht extrahierbaren Maske” trennen. Nur eine Seite zu betrachten und die Physik zu beschuldigen ist der häufigste Fehler bei dieser Art von Experiment.
- L504 — ★Den Befund der Kontrollgruppe festhalten: mit abgeschalteter Querdiffusion fallen alle 16 innerhalb ±8 %. Diese eine Zeile ist der Beleg dafür, dass “die einzige Ursache des Versagens die Querdiffusion ist, weder die Pixelgrobheit noch die Art der Maskengewinnung”. Lockert man sie, kehrt die Schlussfolgerung von Abschnitt 3 zur Fehldeutung zurück, dass ‘eine höhere Auflösung es behebt’.
- L514 — ★Wenn die obige Überlegung (die Diffusionslänge am Ende des Fensters wirkt) korrekt ist, dann behebt das Abschneiden des Fensters es. Wenn du eine Hypothese aufstellst, platziere stets ein Experiment, das sie widerlegen könnte. —————————————————————— #
- L535 — ★Den schwersten Befund dieses PoC festhalten —— die “Seitenverhältnis-Grenze” war keine Physik, sondern die Wahl des Anpassungs-Zeitfensters. (1) Mit einem 4-Sekunden-Fenster fallen alle 8 kleinen innerhalb ±20 % (gemessener schlimmster Fall -14 %).
- L623 — ★Den Befund festhalten: bei gleichmäßiger Erwärmung erkennt das rohe Einzelbild am meisten, während die 2. Ableitung von TSR keines erkennt. “Es taugt zur Tiefenschätzung, aber nicht zur Detektion” = dasselbe Werkzeug wirkt nicht zwangsläufig für beides, was genau die Aussage dieses Abschnitts ist.
- L670 — ★Lampenspiegelung. Diese hat Struktur auf derselben Skala wie der Defekt.
- L697 — ★Den Befund festhalten. (1) Das Einzige, was es bricht, ist die Ungleichmäßigkeit auf derselben Skala wie der Defekt in (c). Der sanfte Gradient in (b) bricht das rohe Einzelbild kaum —— da hier “die Vorhersage danebenlag”, halten wir explizit fest, dass (b) (a) nicht unterschreitet.
- L778 — ★Auch dem Standard-Cube NETD hinzufügen. Bei null Rauschen wird die Schwankung des gesunden Bereichs in der Ebene exakt 0 und der SNR wird zu einer bedeutungslosen Zahl wie 1e9 (gemessen und behoben).
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 — ★Die Gitterphase auf 5 Arten variieren und Bias (Mittelwert) getrennt von Streuung (Breite) zählen.
- L610 — 2) ★Y-Form —— das Volumen entlang der Zeile schneiden, die durch das Zentrum des verschmelzenden Paars verläuft
examples/poc_traffic_counting.py
- L256 — ★Zeilen, die am linken oder rechten Bildrand abgeschnitten sind, bekommen ihren Schwerpunkt verzerrt. Wir messen auch die Version, in der sie entfernt sind.
examples/poc_tree_ring_dendro.py
- L229 — ★Liest man die Pixelkarte diagonal, flackern die Nummern an der Grenze als k, k+1, k, k+1 (Nächster-Nachbar-Treppe). Kurze Läufe von weniger als 5 Stichproben (1.25 px) werden in den vorhergehenden Wert absorbiert —— lässt man sie stehen, nehmen die Ground-Truth-Grenzen um 1–2 zu und es wurde “18 in Richtung passender Jahreszahl + 13 nicht passend = 31 > 24”.
- L336 — ★Mit threshold=0 alles nehmen und die Stufenhöhe selbst messen. Die amplitude von measure_pos (die Differenz zwischen den beiden Enden des Gradientenlappens) bleibt auf halber Stufe stehen, wenn die Maserung den Gradienten nicht-monoton macht, und gibt eine Stufe von 0.14 als 0.05 zurück (in Abschnitt 8 gezählt).
- L345 — ★Der zur Rückrechnung auf px verwendete Außenkantenradius ist der der gemessenen Zeile. Verwendet man den Median über den gesamten 15°-Sektor, bewegt sich die Außenkante durch exzentrisches Wachstum um mehr als 10 px innerhalb des Sektors, sodass alle äußeren Ringe verschoben werden (ich schrieb es zunächst so und ließ die Ringe 18–35 komplett wegfallen).
- L543 — ★Ist die Breitenkorrelation auch in der Richtung mit falscher Jahreszahl hoch —— die Jahreszahl und die Breitenkorrelation sind verschiedene Größen
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 — daher reduzieren wir es hier auf die 2 Bänder Grün und Rot, um es zu lösen. ★Eine Lücke im Werkzeug.
- L543 — ★Ob es auf der Diagonale liegt, ist genau “ob man in Brüchen antworten kann”. Die Linie einer binären Methode wird zur Treppe und entfernt sich im Band gemischter Pixel weit von der Diagonale.
- L755 — ★”Nur die Zahlen stimmen” als Bild zeigen. Das 3. und das 2. Bild teilen fast keine gemeinsamen Pixel, dennoch ist nur die Anzahl weißer Pixel ausgeglichen.
- L953 — (7) ★PPI bricht unter Rauschen zusammen —— selbst bei 60 % oder mehr reinen Pixeln erfasst es das Blatt nicht. Bei null Rauschen hingegen trifft es dieselbe Szene = die Ursache der Klippe ist kein Mangel an reinen Pixeln.
- L993 — (11) ★Eine Lücke, die dieses PoC fand und in fullseye 0.1.10 behob. Drei Otsus lieferten für dieselbe Eingabe unterschiedliche Antworten —— das bloße Multiplizieren desselben Bildes mit 4095 verschob das Urteil um otsu 13.34 pp / cv_otsu 13.92 pp, und nur sk_otsu war affin-invariant. Ursache war das
np.clip(v, 0, 1) in ops._otsu und backends._u8 (Floats in 0..255 sättigen jedes Pixel und machen es “komplett Vordergrund”). Jetzt sind alle drei skalierungsinvariant. Die verbleibenden 0.5 pp bei cv_otsu rühren daher, dass OpenCV intern auf 8 bit quantisiert, was dem Verhalten laut docstring entspricht. Das Gate ist tests/test_value_range_saturation.py.
- L1007 — (12) ★Eine Lücke im Werkzeug: spec_unmix lehnt B=3 (Farbbilder) ab = es gibt keinen Weg, RGB zu lösen
- L1013 — (12b) ★Es gibt tatsächlich Szenen, in denen nur die Abdeckungsgrad-Zahl stimmt, während kein einziges Pixel getroffen wird. Diese eine Zeile ist der stärkste Beleg für “nicht auf eine einzige Zahl reduzieren”.
examples/poc_veiling_glare.py
- L229 — ★Abgleich auf der fullseye-Seite: Airy-Muster → stimmt psf_to_mtf mit der geschlossenen Form überein
examples/poc_vessel_network.py
- L263 — ★Die Fluktuation nach dem Weichzeichnen hinzufügen. Fügt man sie zuerst hinzu, glättet die PSF sie und die Schwellenwertgrenze bleibt sauber (ich schrieb es zunächst so, und selbst bei Erhöhung der Amplitude auf 0.35 erschien kein einziger Fusel).
- L452 — Abschnitt 2-3. ★★Woher kommen die Fusel / der Beschneidungs-Schwellenwert hängt von der Auflösung ab # ————————————————————————— #
- L560 — Abschnitt 4. ★★Durchmesserschätzung —— in der Nähe von Verzweigungen stets überschätzt # ————————————————————————— #
- L620 — Abschnitt 5. ★★Murrays Exponent —— 10 % beim Durchmesser werden zu einer 1 beim Exponenten # ————————————————————————— #
- L751 — Abschnitt 6. ★Kontrollgruppe für Kreuzungen / durch die Auflösung verlorene Zweige # ————————————————————————— #
- L890 — (c) ★skeleton_prune3d “beschneidet nicht kurze Zweige”, sondern “verkürzt alle Zweige”
- L903 — (d) ★fs.skeleton_nodes gibt nur Endpunkte zurück, obwohl der docstring “Koordinaten” sagt
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 — ★”Warten auf Personen” 4 Fälle x (7.5 + Langsamfahrt 2.5) und “Gang-Interferenz” 8 Fälle x (2.5 + Langsamfahrt 2.5) addieren beide 40.0 Sekunden zur Null-Basislinie —— bewusst angeglichen. Es stimmt nicht zwangsläufig mit der Realität überein, aber dass “dieselbe Zahl aus verschiedenen Ursachen entsteht”, lässt sich an einem Beispiel zeigen.
- L160 — Der “stationär”-Schwellenwert der Null-Basislinie [m/s]. ★Wird er nicht deutlich über die durch Rauschen erzeugte Scheingeschwindigkeit (σ√2/Δt = 0.085 m/s @ Δt=0.25 s) gelegt, werden stationäre Personen fälschlich als bewegt eingestuft und die Null-Basislinie schrumpft (bei 0.15 m/s halbiert sich die Null-Basislinie bei Δt=0.25 s, was zu dem falschen Schluss führt, dass “je feiner man abtastet, desto weniger Verweildauer”).
- L239 — ★Da es sichtbar ist, sobald auch nur eine der Kameras es sieht, bedeutet das Eintreten in den toten Winkel die Höhe, bei der alle Kameras verdeckt sind = das Maximum der Grenzen jeder Kamera. Ich hatte hier min und die Vorhersage lag um 0.5 m daneben.
- L329 — ★Die Ankunftszeit der Wartenden aus dem Zeitpunkt, zu dem die Arbeit tatsächlich beginnt ableiten (aus einer Schätzung abgeleitet lag sie um 20 Sekunden daneben, sodass der Wartebalken den Arbeitsbalken nicht überlappte).
- L342 — ★Der Treffpunkt muss direkt neben einer Regalreihe liegen. Ein Quergang, der nicht zwischen zwei Regalen liegt, ist zu beiden Seiten offen, hat 1.9 m freie Breite und wird nicht als “enger Gang” eingestuft (die erste Implementierung ließ sie auf Höhe des Hauptgangs treffen, und 4 von 10 fielen in “Sonstiges”).
- L435 — ★Es ist ein Zusammenführen, kein Vertauschen (swap) —— ein Vertauschen bricht die zeitliche Verschachtelung “innerhalb desselben Balkens ist der später Begonnene der Wartende” nicht (nur die Rollen tauschen, und beide Rollen werden korrekt gefüllt). Was es bricht, ist wenn zwei Personen wie eine aussehen.
- L594 — ★Nur den ruhenden Kern behalten. Ein Balken misst durch die Fußabdrücke zweier Personen 1.8 m, sodass auch das Zentrum einer durchgehenden Person für 2-3 Frames in den Balken fällt (in Messungen erzeugte das eine “Interferenz mit nur einer Person” und ließ 8 von 10 wegfallen). Als Kern gilt die längste Folge, die innerhalb von :data:
CORE_R um den Median blieb.
- L846 — ★Zählt man nach Mehrpersonen-Komponenten, wird “eine Spalte, durch deren Gang 10 Personen gingen” dick und vermischt sich, deshalb vergleicht man “während des Wartens” und “während des Gehens” innerhalb derselben einzelnen Person.
- L1257 — Markergröße. ★Da vor demselben Regal “warten auf Nachschub” und “nicht vorrätig” auftreten, vom größten Marker aus zeichnen und die kleineren darüberlegen. Bei gleicher Größe verdeckt der zuletzt gezeichnete den vorherigen vollständig, und im Diagramm sahen 5 wie 2 aus.
examples/poc_water_level.py
- L346 — 2. ★Nullpunkt vs Homographie # ————————————————————————— #
- L389 — 3. ★Das Vorzeichen ändert sich mit der Ankerposition # ————————————————————————— #
- L422 — 4. ★Welligkeit —— Robustheit hilft nur, wenn es Ausreißer gibt # ————————————————————————— #
- L459 — 5. ★★Reflexion —— fällt systematisch zu niedrig aus # ————————————————————————— #
- L622 — (d) Der Messschieber war vorhanden (★ich wollte schon “nicht vorhanden” schreiben, zog dann 3 Ebenen und fand ihn)
examples/poc_web_roll_periodicity.py
- L123 — ★Der Umfangsunterschied zwischen dem 1. Nip und dem 2. Nip beträgt absichtlich nur 15.7 mm (wegen der Klippe in Abschnitt 6).
- L158 — Nur für Abschnitt 6 (die Klippe) die Anzahl der Versuche erhöhen. ★Bei 24 Versuchen war die Meldequote nichtmonoton — 100 % bei 12000 mm und 88 % bei 14000 mm — und die Position der “Detektionsklippe” verschob sich durch die Schwankung kleiner Stichproben (bei 120 Versuchen pendelte sich 12000 mm bei 93 % ein, und 100 % hält erst ab 17000 mm). Nur der Abschnitt, der die Klippenposition behauptet, wird mit einer Versuchszahl gemessen, bei der der Boden nicht wackelt.
- L253 — ★Die op gibt den Scheitelpunkt ohne Rundung zurück (ein Überschreiten von ±0.5 ist die Information, dass “dort kein Maximum ist”). Da dieses PoC auch die harmonischen Bins des Kamms auswertet, runden wir hier explizit.
- L802 — ★Der Boden ist nicht 0. Bei 24 Versuchen waren die längsten 2 Punkte zufällig 0 %, und das Urteil “das kürzeste L, das 0 % hält” ging durch, doch bei 120 Versuchen bleiben selbst bei den längsten 20000 mm noch 2 %. Zuerst den Boden messen, dann entscheiden, ab welchem Vielfachen des Bodens man es Klippe nennt (0 % nicht für das Urteil verwenden).
- L1057 — ★Mit 120 Versuchen war es nicht mehr genau 100 % (97 / 98 %). Die “100 %” bei 24 Versuchen waren nur ein kleiner Nenner. Am Boden orientiert auf 95 % setzen.
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 — ★Kandidaten sind “Punkte, die auf die Höhe der Grundwerkstoffoberfläche zurückgekehrt sind”, daher wird auch der gesamte flache Grundwerkstoff außerhalb der Naht zum Kandidaten. Erst wenn bestätigt ist, dass innerhalb der inneren CHECK_IN mm Schweißgut (ein Abfall von mindestens CHECK_DEV gegenüber der Grundwerkstoffoberfläche) vorhanden ist, wird es als Nahtübergang (toe) anerkannt —— ohne dieses Gate rutschen Kandidaten auf den Grundwerkstoff ab und die Schenkellänge springt um 1.7 mm nach außen.
- L489 — ★Die Gate-Tiefe tiefer als die tiefste Rille wählen. Zuerst auf -0.6 mm gesetzt, ließ es eine Rille der Tiefe 0.45 mm (vertikal 0.74 mm) durch das Gate, und bei 1 der 16 Querschnitte lag es um 2.2 mm daneben.
- L572 — ★Der Mittelwert der Wahrwerte nur der überlebenden Querschnitte. Sehen, was aus der Aggregation herausgefallen ist.
- L999 — ★Nur die Wölbung wich von der Vorhersage ab. Die Ursache ist das Kriechen des Nahtübergangs (weil τ ein Betragsschwellwert ist).
- L1193 — ★Wie die Rille mit dem Winkel verschwindet (betrachtet am Abfall gegenüber der Grundwerkstoffoberfläche)
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 — ★Da ein Modul direkt unter dem Repo (profileops) importiert wird, den Repo-Stamm nach vorne stellen, damit es direkt aus einem Checkout läuft. Gleiche Konvention wie die anderen Beispiele. Ohne dies scheitert
py -3.11 examples/<name>.py mit ModuleNotFoundError (gemessen 2026-09-09: von den 83 ohne Gate zum Ausführen scheiterten nur 2 dieses Typs).
examples/representation_roundtrip.py
- L175 — (c) Gauß -> voxel-Masse. ★Eine Zahl, die ich einmal falsch hatte
examples/shape2d_morph_descriptor_tour.py
- L64 — ★EXTEND: durch das eigene Konturextraktionsergebnis (
{"shape": (H,W), "cs": [ (N,2) (row,col), ... ]}) ersetzen
examples/shapestat_landmark_tour.py
- L71 — ★EXTEND: die eigenen Landmarken (N,3) in s einsetzen (die Punktreihenfolge muss übereinstimmen)
- L123 — ★EXTEND: die eigene Gruppe (K,N,3) in scrambled einsetzen (Position, Ausrichtung und Größe dürfen beliebig sein)
- L221 — ★EXTEND: die eigenen Landmarken als “erst alle linken, dann die rechten in derselben Reihenfolge” anordnen und in lm einsetzen
- L276 — ★EXTEND: surf zu den eigenen Oberflächenpunkten (Mesh-Vertices, Punktwolke) und normals zu deren orientierten Normalen machen
- L299 — ★EXTEND: durch die eigene Gruppe (K,N,3) ersetzen (die Punktreihenfolge muss zwischen den Individuen übereinstimmen)
examples/voxel_labels_color.py
- L81 — 1) ★Farbstabilität —— der Grund, warum diese Familie existiert # —————————————————————— #
- L152 — 4) ★Anisotropes spacing # —————————————————————— #
examples_3d/alpha_shape_topology.py
- L149 — ★Diskriminierende Assertion: die alpha shape bewahrt Löcher = sie enthält die Achsen-Probe kaum. Die Null-Methode (konvexe Hülle) FAILt diese Bedingung mit einer Einschlussrate von ≈1 (= diskriminierend).
examples_3d/ct_hand_radiograph.py
- L34 — Tatsächlich aufrufen und verifizieren. ★Bis 2026-09-05 schrieb dieses Beispiel “stimmt mit np.sum(axis=0) überein, wenn azimuth=elevation=0”, hatte es aber kein einziges Mal verifiziert. Zudem verwechselte der op → example-Index die hasattr-Zeichenkette mit einem Aufruf, sodass “ops ohne ein einziges Beispiel” innerhalb der 100%-Abdeckung verborgen waren.
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 — ★Den Unterschied zur Version mit unendlicher Gerade als Zahl ausgeben (dieselben 2 Segmente)
examples_3d/hull_bounds.py
- L237 — — Panel C: ★neu min_enclosing_sphere (eng anliegend) vs naive Kugel (überdimensioniert) —
- L272 — ★(1) neue op — min_enclosing_sphere: Radiuswiederherstellung an bekannter Kugel + enthält alle Punkte + nahezu minimal ============================================================
- L296 — ★(2) beat-null der neuen op — bei einer asymmetrischen Punktwolke kleiner als die naive Kugel, nahezu minimal, auf der sicheren Seite ============================================================
examples_3d/mesh_props.py
- L404 — ★Das Umkehren der Umlaufrichtung kehrt das Vorzeichen des Volumens um = das Vorzeichen ist selbst eine Orientierungsprüfung
examples_3d/metrics_eval.py
- L234 — ★Der Nächste-Nachbar-Abstand lügt, wenn er “bei null Änderung nur nachgemessen” wurde. Nimmt man denselben Hang mit anderer Dichte oder Position erneut auf, greift der nächste Nachbar entlang der Oberfläche einen benachbarten Punkt und erzeugt eine Scheinänderung in der Größenordnung des Punktabstands. M3C2 projiziert auf die Normalenrichtung, sodass diese Komponente wegfällt. (Die Vorhersage vor dem Schreiben dieses PoC, “C2C fällt auch bei einer Normalenverschiebung zu groß aus”, war falsch —— bewegt man parallele Flächen nur entlang der Normalenrichtung, bleibt auch der Nächste-Nachbar-Abstand nahezu beim Wahrwert. Die Lüge trat bei der Neuaufnahme entlang der Oberfläche auf.)
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 — ★Falle:
res ist selbst als Skalar die Anzahl der Voxel pro Achse, sodass das Voxel bei anisotropen bounds kein Würfel ist (hier ist x,y 0.125 und z 0.0625). Das Volumen mit h**3 zu berechnen liegt um genau den Faktor 2 daneben —— in diesem Beispiel ergab es tatsächlich 295.00, ein Fehler von 99 % gegenüber der geschlossenen Form 148.03, und die assert unten schlug an.
examples_3d/space_carving.py
- L117 — ★
carve_look_at verwenden (2026-09-08). Dieselbe Implementierung wie look_at, aber der aus der öffentlichen Schicht erreichbare Name ist dieser —— fs.look_at ist etwas anderes, die gluLookAt-Version von render3d (4x4, −Z nach vorne), und die Übergabe von deren M[:3,:3], M[:3,3] lässt alle Punkte hinter die Kamera fallen und gibt ohne Ausnahme eine leere hull zurück.
examples_3d/structured_light_scan.py
- L122 — ★ Fallstrick des Koordinatensystems:
look_at erzeugt die Pose in der gluLookAt-Konvention (Kamera blickt entlang -Z, +Y ist oben), aber render_mesh schreibt dieses Vc erst zu (x, -y, -z) um, bevor mit K multipliziert wird (= dieselbe CV-Konvention wie depth_to_points / K, depth ist +Z nach vorn). Die Triangulation ist auf der CV-Konventions-Seite geschlossen, also muss auch die Pose vor dem Zusammensetzen mit FLIP versehen werden. Ueberspringt man dies, blickt der Projektor hinter die Kamera, und die depth bleibt bei einer ‘plausiblen Groessenordnung’, ist aber vollstaendig falsch (der allererste Lauf tat genau das: RMSE 78 mm = nicht von Null zu unterscheiden).
eyebrain.py
- L242 (ja) — ★fly_hex_resample と同じ向き: 画面の x = 方位角 az(右が正)、y = 仰角 el(上が正)。uv から組むと 像と眼の絵の左右が食い違う(2026-09-20 に実測: 縞を右へ動かすと柱の u が減った)。
fast.py
- L254 — ★Das uint8-gaussian nicht ausliefern. Der 8U-Pfad von
cv2.GaussianBlur verwendet einen 8-Bit-Festkomma-Kernel, sodass die Abweichung vom float64-core 1.174/255 betraegt (gemessen, das Maximum ueber die 6 Gate-Bilder dieses module x 5 PARITY_AB-Punkte) und damit ‘Uebereinstimmung bis 1/255’ nicht erfuellt. box ist 0.494/255, median / Morphologie sind 0.000/255, daher werden nur diese ausgeliefert. Wird ein schnelles uint8-gaussian benoetigt, fuege es explizit unter einem separaten Vertrag von ‘bis 2/255’ hinzu.
- L294 — ★Alles hier Aufgefuehrte hat das :func:
parity-Gate bestanden. Beim Hinzufuegen stets die Reihenfolge ‘implementieren -> Gate laufen lassen -> bei Bestehen aufnehmen’ einhalten.
- L320 — ★
edges_image (als HALCON-Name identisch mit canny) nicht aufnehmen. Dieser Name in der registry ist das skimage canny von backends_auto (mit echter hysteresis), ein anderer Algorithmus als das core-canny. Nichtuebereinstimmungsrate 1.0 (gemessen). – HALCON-Namens-Twin (ein op, der in der registry unter einem Alias mit identischer Implementierung registriert ist) ———- dieselbe Idee wie accel._TWIN_ALIASES. Das Gate laeuft gegen die Implementierung unter diesem Namen in der registry, also faellt es bei abweichender Implementierung durch und wird nicht aufgenommen.
- L372 — ★Nicht anhand von ‘war die beobachtete Ausgabe {0,1}’ entscheiden – selbst ein kontinuierlicher op liefert auf einem konstanten Bild eine reine 0-Ausgabe, die faelschlich als binaer eingestuft wird und das Kriterium stillschweigend verschaerft (bei der Implementierung darauf gestossen). Entscheide anhand des deklarierten out_sort in der registry.
- L403 (ja) — ★twin はどれも歴史的な規約(reflect / 正方形)しか実装していないので、
b が新しい選択肢を選んでいる間は core にそのまま落ちる。 速くはならないが、答えは 1 ビットも変わらない —— median の k>5 と同じ扱い。 ここを黙って無視すると「速いが違う」ができる(実測: parity が 11 件割れた)。
feat_fpfh.py
- L304 — ★2026-09-07: Die Pose-Berechnung ist numpy (FPFH, RANSAC und Kabsch sind alle numpy), und torch wurde nur zum Umhuellen des Rueckgabewerts verwendet. Dadurch wurde dieser op auf CI ohne torch (py3.10 / 3.12) zu einem kompletten ImportError, und der PoC schlug fehl. Ist torch vorhanden, gibt es wie bisher einen Tensor zurueck; andernfalls numpy mit denselben Werten (Werte unveraendert).
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 — ★Ein Bewertungs-Recipe darf unter jedem Profil (nicht nur industriell) ausschließlich die kuratierten, fslib-gestützten Builtins verwenden. Jeder andere Aufruf ist ein Op aus der 650-Op-Evolutionsregistry, aufgelöst über
fscript._call_registry_op → api.RT, dessen _safe-Wrapper fail-OPEN ist (er verschluckt einen Op-Fehler und gibt einen harmlosen „keine Defekte“-Wert zurück). Diese Fläche darf niemals der Operator eines Recipes sein — eine Studio-/Referenzlaufzeit bewertet ebenfalls Teile —, daher wird ein Recipe, das ihn verwendet, beim Laden abgelehnt (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 — ★Der Adapter, der sich an den deklarierten out-Typ haelt, verwirft alles ab dem 2. Element eines op, der ein Tupel zurueckgibt (
wht von drizzle_resample, info von piv_cross_correlate). Wird die verworfene Seite benoetigt, war sie ueber den Eingang des ledger nicht erreichbar. Am 2026-09-06 schrieb ein Superaufloesungs-PoC flow, info = fs.ledger.piv_cross_correlate(...), entpackte das (2,R,C) entlang der 1. Achse, nutzte die 2. Zeile von dy als dx und machte die Verschiebungsschaetzung von 0.12 -> 0.74 px (ohne Ausnahme). Mit .raw erreicht man die rohe Rueckgabe: 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 — ★Keinen lokalen absoluten Pfad in die Distribution einbrennen (im Audit vom 2026-09-05 fuhr ein nicht oeffentlicher Geschwisterprojektname im PyPI-wheel mit). Den Default ueber eine Umgebungsvariable geben. Das Szenen-XML des Unitree G1. Verweist auf
unitree_g1/scene.xml der MuJoCo Menagerie.
- L61 — ★Sicherheitsgrenze.
pickle kann waehrend des load ein beliebiges callable aufrufen, also bedeutet ein Durchreichen von find_class, dass allein das Oeffnen eines Checkpoints Code ausfuehrt. Ein RL-Checkpoint ist ein Artefakt, das von anderen empfangen werden soll, also ist dies eine reale Bedrohung. (Gemessen 2026-09-05: die Durchreich-Variante gab os.system / subprocess.Popen / builtins.eval direkt zurueck und konnte waehrend load() tatsaechlich eine Datei anlegen.) Hier sind nur die numerischen Klassen aufgefuehrt, die ein brax-PPO-Checkpoint tatsaechlich referenziert. Fehlt etwas, fuege es dieser Liste hinzu (die Ausnahmemeldung nennt den Modulnamen).
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-Ops, die das Funktions-Gate nicht bestanden haben, aus der Schlagzeile ausschließen — zuvor wurden sie nur per [warn] ausgegeben, aber weiter mitgezählt, was die „funktional gegatterte“ Paritätszahl mit Ops aufblähte, die das Gate ablehnt.
- L87 — ★2026-09-08: Diese Zeile lautete – “= %d evolvable registry ops + %d n-ary capability ops (disjoint).” Gemessen: 979 + 17 = 979, d. h. die 17 n-ary-ops sind eine Teilmenge von
reg_counted (nary_names - reg_counted ist leer). Die 979 der Ueberschrift stimmt, doch allein die Aufschluesselungszeile sieht nach ‘Addition’ aus, und wer sie addiert, erhaelt 996. Die Zahlen stimmen, aber die Erklaerung luegt, daher wurde es korrigiert. Ob die Aufschluesselung als Summe aufgeht, prueft jedes Mal 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 — ★Nicht verschlucken (adversariales Review 2026-09-06).
imgops_nary ist ein primaeres Modul, das nur numpy und scipy braucht, daher bedeutet ein fehlgeschlagener Import einen ‘kaputten checkout’, nicht ‘eine in dieser Umgebung fehlende Funktion’. Zuvor war es except Exception: pass, und weil diese Funktion zugleich Generator und Pruefer ist, konnte CI einen Index mit komplett verschwundenen 17 ops gruen veroeffentlichen.
- 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 — ★Zwei Kriterien (2026-09-08, am selben Tag behoben). Zunaechst wurde nur nach ‘CIE L* hat 0 Umkehrungen’ ausgewaehlt, doch
poc_colormap_readability mass, dass cividis trotz 0 Umkehrungen einen Farbdifferenz-Grat aufwirft. Selbst bei monotoner Helligkeit erscheint bei ungleichmaessiger Farbdifferenz-Schrittweite eine nicht vorhandene Grenze in einem glatten Feld – es gab sich nach einem einseitigen Kriterium als ‘sicher’ aus. Gemessen (512 Stufen, max / median der benachbarten Farbdifferenz sowie die Anzahl der lokalen Maxima, die das 1.6-fache des Medians ueberschreiten): ========== ========== ============== ========== Map / L*-Umkehrungen / dE max/median / Gratanzahl ========== ========== ============== ========== 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 wurde entfernt, weil die approximierte LUT dieses repo grob ist, nicht wegen eines Problems des veroeffentlichten cividis selbst (seine 6 Kontrollpunkte sind die wenigsten unter den sequenziellen Maps). Fuer alle, die mit Blick auf Farbsehschwaechen waehlen wollen, steht :data:CVD_SAFE bereit. tests/test_pseudocolour_family.py misst jedes Mal beide Kriterien.
- L124 — Maps, denen nachgesagt wird, dass ihre Reihenfolge auch bei Farbsehschwaeche (P/D-Typ) lesbar bleibt. ★Die approximierte LUT von
cividis hat 6 Kontrollpunkte und eine grobe Farbdifferenz-Schrittweite und erfuellt das :data:PERCEPTUAL_SAFE-Kriterium nicht (gemessen dE max/median 2.23). Mit mehr Kontrollpunkten liesse es sich in beide aufnehmen – da das haendische Abschreiben von Primaerquellenwerten eine Vorgeschichte von Tippfehlern hat, wird dies bis zur Bestaetigung der Quelle zurueckgestellt.
- 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 — ★Das Uebergeben eines 0-dimensionalen (skalaren) Werts liess
r.shape[-1] einen nackten IndexError werfen (im adversarialen Audit vom 2026-09-04 aufgedeckt). Ein spektraler Reflexionsgrad hat mindestens eine Wellenlaengenachse – ein Skalar ist kein ‘Wert pro Wellenlaenge’, daher weist der Waechter ihn ausdruecklich ab.
- L273 (ja) — ★ 範囲外は黙って clip せず拒否する(cos=5 が垂直入射、cos=-0.5 が全反射に化けていた)。 丸めの屑(1 + 1e-15 など)だけは許す。
- L349 — ★Ein reales Gitter beugt auf beiden Seiten (bei symmetrischen Furchen sind die +/-m-Effizienzen nahezu gleich). Bindet man hier nicht beide +/- ein, koennen je nach Geometrie von Lichtquelle und Blickrichtung alle Loesungen negativ werden, und der Filter ‘nur positives lambda behalten’ verwirft alles und wird pechschwarz. Gemessen: eine senkrecht zu den Furchen beleuchtete CD (delta-sin = -0.55) hatte m=+1,+2 bei lambda<0 komplett verschwunden, und die 440 nm von m=-2 waren die eigentliche Loesung.
match3d.py
- L344 — ★2026-09-07: Durch numpys FFT ersetzt. Die Formel ist dieselbe (float32 fftn -> nur Phase -> Realteil von ifftn -> argmax), und torch war nirgends noetig. Auf CI ohne torch (py3.10 / 3.12) wurde dieser op zu einem ImportError, und der PoC schlug fehl.
-
| 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: Den Rumpf in numpy neu geschrieben. Dieses ICP ist Naechste-Nachbarn-Suche per cKDTree und Pose-Aktualisierung per 3x3-SVD, ohne eine einzige Aufgabe fuer torch, machte torch aber zur Pflicht. Auf CI ohne torch (py3.10 / 3.12) fielen 4 PoCs mit
ImportError: this operator needs the optional 'torch' backend durch und es kam ans Licht (lokal war torch vorhanden, daher unbemerkt – ein Beispiel fuer ‘das Gate dort aufstellen, wo der Unfall passiert’). Die Zahlen sind dieselbe float64-Formel, also aendert sich das Ergebnis mit der Umgebung nicht. Der Rueckgabetyp bleibt aus Kompatibilitaetsgruenden erhalten: torch.Tensor, wenn torch vorhanden, sonst numpy.ndarray (Werte identisch). Wird ein anderes device als “cpu” verlangt, fail-closed.
- L2029 — ★2026-09-07: Den Rumpf in numpy neu geschrieben. Naechste-Nachbarn-Suche, die 6x6-Normalgleichungen und Rodrigues sind allesamt kleine CPU-Lineare-Algebra ohne Bedarf an torch, waren aber zur Pflicht gemacht worden. Auf CI ohne torch (py3.10 / 3.12) fiel der PoC mit einem ImportError durch und es kam ans Licht. Die Formel ist dasselbe float64, also bleibt das Ergebnis unveraendert (die Abweichung von der torch-Version wurde als 0 in R/t und 0 in RMSE gemessen).
- 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, wenn der Ring ausserhalb des Bildes liegt.
r_in/r_out sind in Pixeln, also liest ein Uebergeben in mm ausserhalb des Sichtfelds und gibt ohne Ausnahme komplett 0 zurueck (kam ans Licht, als poc_pipe_wall_loss eine pechschwarze Abbildung erzeugte). Liegt kein einziger Radius innerhalb der maximalen Distanz vom Zentrum zu den vier Bildecken, kann die Rueckgabe nur leer sein.
- L3080 — ★2026-09-07: grid_sample (bilinear, align_corners=True, zeros padding) durch scipys map_coordinates(order=1, mode=”constant”, cval=0) ersetzt – dieselbe bilineare Interpolation, und es laeuft auch auf CI ohne torch (py3.10 / 3.12). Die gemessene Abweichung betraegt hoechstens 6.0e-06 (Zufallsbild im Bereich 0..1; die Rundungsdifferenz zwischen float32 und float64).
- L3129 — ★2026-09-07: Aus demselben Grund wie polar_unwrap durch map_coordinates ersetzt (bilinear, ausserhalb des Bereichs 0). Laeuft auch ohne torch. Die gemessene Abweichung betraegt hoechstens 7.6e-06.
- L3260 (ja) — ★2026-10-07: 瞳の中心・半径を外から渡せるように(既定は従来どおり)。
- L3474 — ★2026-09-07: affine_grid + grid_sample (align_corners=False, zeros padding) durch numpy-Koordinatenberechnung + scipys map_coordinates(order=1) ersetzt. torch wurde nur fuer das bilineare Resampling verwendet, und in einer Umgebung ohne torch (CI py3.10 / 3.12) wurde dieser op zu einem ImportError. Die Konvention wurde wortgetreu uebernommen: die normierte Koordinate eines Ausgabe-Voxels (d,h,w) ist ((i+0.5)/N)2-1, und nach der Rotation wird sie per (g+1)/2N-0.5 auf Eingabe-Pixelkoordinaten zurueckgefuehrt (die Definition von align_corners=False). Die letzte Achse von grid ist in der Reihenfolge (x, y, z) = (W, H, D). Die gemessene Abweichung von der torch-Version betraegt hoechstens 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 so gemacht, dass es pro Achse Werte annimmt (Laenge 3 ebenfalls erlaubt). Auf wuerfelfoermig beschraenkt wird bei einem flachen Volumen wie einem Vogelperspektive-Gitter (duennes z x breites xy) auch auf der nicht benoetigten Achse dieselbe Schrittweite erzwungen (poc_bev_sensor_fusion gemessen: von 4,096 Millionen Voxeln werden nur 8.1 % genutzt). Das grid_coords derselben Familie nahm von Anfang an per-Achse-res an – die Diskrepanz, bei der die Breite des Vertrags an Eingang und Ausgang unterschiedlich ist, wurde angeglichen. Bestehende Aufrufer, die einen Skalar uebergeben, bleiben unberuehrt.
- L340 — ★2026-09-07:
res so gemacht, dass es pro Achse Werte annimmt (Laenge 3 ebenfalls erlaubt). Zuvor erlaubte int(res) nur ein wuerfelfoermiges Gitter, und waehrend esdf ein laengen-3-anisotropes voxel_size annimmt, war diese Seite – die dessen Ausgabe in world-Koordinaten subtrahiert – auf wuerfelfoermig beschraenkt, ein nur auf einer Seite enger Vertrag. Sie klemmt direkt bei einem Gitter wie CTs duenner Verbindungsschicht (30,180,180) (gemessen in poc_ct_void_morphology). Bestehende Aufrufer, die einen Skalar uebergeben, bleiben unberuehrt.
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) war registriert, erschien aber weder in docs noch in op_run / op_assist / op_find – ‘registriert’ und ‘abrufbar’ sind verschieden. Nach dem Hinzufuegen zu opdocs schlug dieses Gate auf der nicht abrufbaren Seite an.
- L318 — ★Design (2026-09-04, Nutzer: ‘Verschiedene Container-Typen behandeln zu koennen ist besser, aber Einheitlichkeit ist auch wichtig’): Anfangs mischte
kind “seq” und “matrix” hinein – das heisst, der Werttyp (numerisch, ganzzahlig oder Auswahl) und die Container-Form (einzeln, Vektor oder Matrix) konkurrierten in einem Feld. Aus Sicht der UI liess sich ein ‘int-3-Vektor’ nicht ausdruecken, und nur Matrizen hatten ihre Struktur unter dem seq-Schluessel, sodass die Handhabung zerstreut war. Dies wurde orthogonalisiert: kind enthaelt nur den Werttyp, und der Container kommt stets in container. Auch ein Skalar wird nicht zur Ausnahme ({"form": "scalar", "shape": ()}), sodass die UI ihre Verzweigung als einen einzigen Pfad schreiben kann.
- L452 — ★Laengste Uebereinstimmung. Beim Durchsuchen von kurz nach lang trifft
sigma_per_mm auf _mm und wird zu “mm” (tatsaechlich ist es 1/mm). Bei falscher Einheit wird die Zahl der UI stillschweigend zu etwas anderem.
- 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 — ★Der springende Punkt: Manche Argumente haben ihren Default nicht als Tupel angegeben.
center=None (ein optionales (row,col)), das erforderliche trans (3-Vektor), k_cam (3x3-Matrix)… allein am Default betrachtet erscheinen sie als ‘eine einzelne Zahl’, und die UI bricht, indem sie eine spin box anzeigt. Die Struktur wird ueber den Namen ergaenzt.
- L782 (ja) — ★一様乱数の行列にしない —— 成分・モジュラリティ・rich club は構造が無いと 「どのノブでも同じ数」になり、押して動いても意味のある絵にならない。
- L786 (ja) — llmcore(2026-09-24): ★一様乱数にしない —— どの行も似た向きになり、 注意の重みが全行ほぼ一様になって「押しても何も起きない」種になる。 滑らかな画像を 8x8 パッチに切ると、近い場所が近い向きを向く。
- L802 — ★Durch Messung festgestellt: Uebergibt man ein generisches 0..1-signal an die Wellenlaengeneingabe von
prism_min_deviation_deg, wird es von ‘Wellenlaenge muss positiv sein’ abgewiesen, was es zu einem op macht, dessen Beispiel nicht laeuft. Ist die Einheit bekannt, kommt es dem ‘laeuft auf Knopfdruck’ naeher, es mit einem fuer diese Groesse plausiblen Bereich zu initialisieren.
- L995 — Eine Folge japanischen (CJK-)Textes. ★
_WORD_RE ist [a-z0-9]+, sodass eine japanische Anfrage kein einziges Wort ergibt (_WORD_RE.findall(...) == [] bei japanischer Eingabe). Die Stemming-Stufe stirbt, und da die Teiluebereinstimmung nach einer Zeichenkette samt Leerraum sucht, war eine mehrwortige japanische Anfrage strukturell stets 0 Treffer – in einem Produkt, dessen docstrings ueberwiegend japanisch sind und das in 6 Sprachen ausgeliefert wird. Am 2026-09-08 durch poc_search_sweep_width aufgedeckt (die japanischen Anfragen fuer ‘Punkterkennung’ / ‘Spot-Erkennung’ / ‘kleines Ziel’ ueber op_find ergaben allesamt 0 Treffer, und obwohl die Subpixel-Schwerpunkt-Punktziel-Erkennung nur star_detect ist, war sie vom Japanischen aus nicht erreichbar).
- L1048 — Die als Stamm-Uebereinstimmung geltende gemeinsame Praefixlaenge. ★Bei 4 werden “median”/”medial” und “contrast”/”contour” verknuepft; schneidet man bei 5, werden “correlation”/”correlate” (8), “segmentation”/”segment” (7), “rotation”/”rotate” (5) und “gaussian”/”gauss” (5) erfasst, die beiden obigen Paare hingegen nicht.
- L1058 — Die nach dem gemeinsamen Praefix erlaubte Endung. ★Entscheidet man allein nach der Praefixlaenge, werden “median”/”medial” verknuepft (sie teilen ein 5-Zeichen-“media”). Prueft man, ob die Endung nach einer Flexionsendung aussieht, kommt “correlation”/”correlate” (ion / e) durch, waehrend “median”/”medial” (n / l) und “corner”/”cornea” (r / a) herausfallen.
- L1154 — ★Untergrenze. Ohne sie gibt “zzz-nothing-matches”
histogram_match zurueck (weil “matches” mit match_* stamm-uebereinstimmt). Liegt das Gewicht der getroffenen Woerter unter 15 % der gesamten Anfrage, gilt es als ‘kein Treffer’. Gemessen: “digital image correlation” ist 0.19 (besteht), “zzz-nothing-matches” ist 0.10 (verworfen).
- 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 — ★Die Raender mit dem Randwert auffuellen. Zuvor war es
np.convolve(x, k, "same"), was die w Punkte an beiden Enden mit Null mittelt – Anfang und Ende einer Kontur wurden um bis zu 50 px oder mehr Richtung Ursprung (0,0) gezogen, was eine Abbildung ergab, in der die roten Streifen von 140 Konturen nach oben links konvergierten (gefunden 2026-09-06, als erstmals Abbildungen pro op erstellt wurden; in numerischen Tests betrug die mittlere Abweichung 0.3 px und war unsichtbar).
- 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 — ★Ein Verzeichnis von ops, die auf der nativen Seite bei einer degenerierten Eingabe den ganzen Prozess zum Absturz bringen (2026-09-05).
guard kann nur Python-Ausnahmen abfangen. Sobald innerhalb von C/C++ ausserhalb der Grenzen geschrieben wird, ist es dort vorbei, und die gesamte Pipeline des Nutzers verschwindet – die schlimmste Art, wie fail-soft bricht. Es bleibt nur die Abweisung am Eingang, also hier mit Begruendung auffuehren und zur Registrierungszeit eine Schranke setzen. Das Verhalten unterscheidet sich je nach Plattform – das ist der Existenzgrund dieses Verzeichnisses. Die 3 unten stuerzen unter Linux (Ubuntu 24.04 / Python 3.12 / PyPI-wheel) ab, aber unter Windows reproduzierte sich mit derselben Eingabe kein einziger. Ein anderer nativer Build bedeutet, dass die Grenze anders bricht, also ist eine feine Trennlinie ‘diese Art von Eingabe ist in Ordnung’ nicht vertrauenswuerdig – degenerierte Eingaben pauschal ablehnen. Nicht ‘entfernen, sobald behoben’, sondern entfernen, sobald bestaetigt werden kann, dass der Upstream behoben ist (dies ist nicht unser eigener Code, also unterscheidet sich die Entfernungsbedingung).
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 ist nicht image2d, sondern rgbimage (gemessen 2026-09-02). Sowohl der docstring als auch die Implementierung sagen ‘RGB (size, size, 3) float [0,1]’, und nur diese Zeile gab sich als 2-D-Luminanzbild aus. Dieser op lief erst, nachdem ein mesh-Seed geliefert wurde, und das Typpraedikat deckte es mit einem TYPEMISS auf: “declared ‘image2d’ but returned ndarray(512,512,3)” (bis dahin war er wegen der Form, die (V,F) auf 2 Positionsargumente aufteilt, nie ein einziges Mal gelaufen). Die anderen 3 render_*-ops (ambient_occlusion / cast_shadow / supersample_mesh) sind wie gemessen 2-D, also bleibt image2d fuer sie in Ordnung – die Luege war nur diese eine Zeile.
- 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 — ★Hinzugefuegt 2026-09-08. Bis dahin war der Pose-Helfer fuers Schnitzen (visualhull.look_at) aus keiner oeffentlichen Schicht erreichbar, und das Greifen des gleichnamigen render3d.look_at (gluLookAt, -Z nach vorn) ergab ausnahmslos ein leeres 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 — ★Der Grund (a) fuer das Zurueckhalten – ‘die points-Kandidatenliste wird kuerzer und ueberschreibt stillschweigend den bestehenden champion’ – ist verschwunden, seit backends_typed.TYPE_TO_SORT coordgrid -> points faltet: Die 2-D-Bruecken tb_sphere_sdf / tb_box_sdf tragen INPUT_ADAPTERS._points_to_grid und bauen tatsaechlich ein Koordinatenfeld aus der Punktwolke, also ist deren “points”-Deklaration keine Luege (gemessen: das Uebergeben von (64,3) gibt (16,16,16) zurueck = lebendig). Die Luege war nur auf der 3-D-Verzeichnis-Seite.
- L991 — ★axis=1. Die kanonische Form von
pairs ist (N,2) (gemessen: die 6 konsumierenden ops lehnen (2,N) ausdruecklich ab). Solange das Praedikat lambda v: True war, erzeugte dies (2,n) und gab als seinen Typ ‘eine Form, die kein Konsument akzeptieren kann’ aus
- L1029 — ★Die kanonische Form von position ist 3 Komponenten [z, y, x]. Nicht per Mehrheitsentscheid, sondern durch Ausfuehren der Konsumenten entschieden: refine_translation_lk / refine_lm sind fail-closed mit “init_pos must have exactly 3 components [z, y, x] (got 4)”, wenn 4 Komponenten uebergeben werden (gemessen). Auch der Generator hat 3 Komponenten (8.0, 8.0, 8.0). Die match_*-Familie gibt jedoch gemaess docstring 4 Komponenten [score, d, h, w] zurueck, sodass ein Durchleiten mit einem deklarierten out von “position” die nachgelagerten Verfeinerungs-ops ausloescht = eine Typ-Luege. Da score selbst eine ehrliche Information ist, wird die Funktionsseite nicht beschnitten (get() bleibt bei 4 Komponenten), und auf der call()-Seite, die den Typ des ledger ausgibt, werden nur die Koordinaten extrahiert (dieselbe Behandlung wie 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 — ★ Stattdessen weisen wir ein rohes (N,H,W) ndarray ausdrücklich zurück. Ein 3-D-Array besteht dieselbe Strukturprüfung, egal ob es video (T,H,W) / voxel (D,H,W) / histcube (H,W,T) / zscan ist, sodass eine Verwechslung keine Ausnahme auslöst und ein “plausibel falsches Kompositresultat” zurückgibt —— dies ist genau dieselbe Gefahr wie beim Trennen von histcube von voxel durch die photon-Familie. Hier jedoch erreichen wir dieselbe Absicherung nicht durch Hinzufügen eines Typs, sondern indem wir verlangen, dass es “eine list ist”. Sobald man list(volume) schreibt, hat der Aufrufer erklärt, dass “die führende Achse die Frame-Achse ist”. * image2d —— Kompositresultat, drizzle-Ausgabe, Einzelframe. Alle sind 2-D float64, sodass bestehende 2-D-Ops (Filter, Schwellenwert, morphology, psf_to_mtf) mit erhaltener Bedeutung nutzbar sind. Es ist nicht einmal nichtnegativ (Residuen der κ-σ-Kombination und negative Ränder der Spline-Interpolation treten auf), sodass es counts zu nennen stattdessen eine Lüge wäre. * keypoints —— die Rückgabe von
star_detect ist (N, 2) als (row, col). Die keypoints in TYPE_CHECKS ist “(N,3) oder ein beliebiges 2-D-Array”, also trifft es direkt zu und wird von psf_fit / aperture_photometry konsumiert.
-
L101 — ★ Dies ist kein pairs: der Kanon von pairs ist das “(x, y)-Paar”, das von den 6 Ops auf der reprconv-Seite festgelegt wird, während dies (row, col) in Bildkoordinaten ist und derselben Konvention wie fit_transform / mosaic folgt. Ein Mischen vertauscht Zeilen und Spalten (dieselbe Form wie die in diesem Repo bekannte Falle, bei der features.match_keypoints (x,y) zurückgibt, während fit_transform (row,col) verlangt). Es keypoints zu nennen teilt zumindest das Versprechen “ein Punkt auf dem Bild”. * indices —— die Indizes (1-D int) der übernommenen Frames, die lucky_select zurückgibt. Genau das bestehende Vokabular. [frames[i] for i in idx] führt zu images zurück. * measurement —— noise_sigma ist ein einzelner reeller Skalar. * matrix —— die (3,3) homogene Transformation von frame_align. Es ist dasselbe, was transforms / fit_transform / mosaic behandeln, also gibt es keinen Grund, einen eigenen Begriff zu erfinden. * table —— dict / list of dict (Qualität, PSF-Anpassung, Photometrie). Die table in TYPE_CHECKS ist list |
dict, also trifft beides zu. Der Preis des Nicht-Trennens (honest): wenn eine nicht-astronomische Bildsequenz in den images-Pool gelangt, findet frame_align keine Sterne und hält mit ValueError an. Da dies fail-closed ist, ist es keine “null Funde”, sondern “erreicht und korrekt zurückgewiesen”, doch aus Sicht eines verketteten Fuzzers können die 2 align-Ops zu nichts als CONTRACT werden. Da dasselbe Symptom auftreten kann wie der Grund, warum die photon-Familie counts trennte (7/17 werden nie ausgeführt), wenn die Messung dies zeigt, ist dann die Entscheidung gerechtfertigt, “Bildsequenzen mit Punktbildern” in einen separaten Pool zu legen —— wir fügen nicht vorsorglich einen Typ hinzu (in diesem Repo lautet die Reihenfolge: einen Typ erst hinzufügen, nachdem Belege aufgetaucht sind, dass “Mischen es zur Lüge macht”). |
opsconngraph.py
- L66 (ja) — 作る —— シナプス表から隣接行列へ、帰無モデル、二値化。★カテゴリ名は docs/ops/conngraph// に なる: "build" は .gitignore の build/ に当たり、ノート 3 枚が commit されず CI だけ赤になった(2026-09-20)
opsdem.py
- L35 — ★ Ehrliche Grenze: der
depth-Pool kann auch Tiefe aus der perspektivischen Projektion einer Kamera enthalten. Bei perspektivischer Tiefe ändert sich mit der Tiefe, wie vielen Bodenmetern 1 px entspricht, sodass eine mit konstantem cell_size berechnete Neigung plausibel falsch ist. Warum also den Typ nicht trennen —— dies ist keine Typverwechslung, sondern dieselbe Art Fehler wie eine falsche Angabe von cell_size, und cell_size ist bereits ein Pflichtargument (kein Standardwert). Einen Typ hinzuzufügen kann nicht-orthographische Tiefe nicht verhindern (das Prädikat sieht nur bis zu “ein 2-D reelles Array”), und stattdessen entstünde ein dem-Pool ohne einen einzigen Op mit Seed, wodurch alle 13 Ops dauerhaft unausgeführt blieben. Statt vorzugeben, ein Typ verhindere, was er nicht kann, machten wir es mit einem Pflichtargument und Docstring explizit und wählten, es im Fuzzer tatsächlich laufen zu lassen. * nur die Ausgabe von dem_fill_sinks ist depth —— das Ergebnis des Senkenfüllens ist immer noch ein Höhengitter und geht direkt in dem_flow_direction. Es hier als image2d zu deklarieren würde die familieninterne Kette (füllen -> fließen) per Typ trennen. * dem_flow_direction ist labels —— die Rückgabe ist int8 0-7 und -1 (kein Abflussziel), ein Vorzeichen ohne Ordnungsbedeutung. Es mask zu nennen würde es als binär behandeln, und es image2d zu nennen würde den Mittelwert von 3 und 4 bedeutungsvoll machen. Es trifft direkt auf das labels-Prädikat zu (Integer-dtype, 1-3 Dimensionen). * dem_stream_network ist binär, aber image2d —— sein Inhalt ist float64 mit 0.0/1.0 plus nan für fehlende Daten und erfüllt das mask-Prädikat (bool oder Integer-dtype) nicht. Es bool zu machen würde “kein Gerinne” und “gar kein Wert” ununterscheidbar machen, also passten wir den Typ an die Implementierung an. * alles Übrige ist image2d —— Neigung[Grad], Exposition[Grad], Krümmung[1/m], Schummerung[0,1], Relief[m], Horizont-Höhenwinkel[Grad], Himmelssichtfaktor[0,1], Sichtbarkeit[0/1]. Alle sind 2-D reelle Felder, sodass bestehende 2-D-Ops (Glättung, Schwellenwert, morphology, Pseudofarbe, Beschriftung) mit erhaltener Bedeutung nutzbar sind. Der Wertebereich ist nicht notwendigerweise [0,1], aber das ist derselbe Stand wie das Komposit von astrostack: in diesem Repo wird image2d nicht als Helligkeitsversprechen, sondern als Versprechen “ein 2-D reelles Feld” verwendet. Kategorie -> [(Op-Name, module, [Eingabetypen], Ausgabetyp)]
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 — ★ Im Prädikat von
phash ist das Prüfen des dtype das Wesentliche. Nur mit ndim == 1 überlappt es sich vollständig mit dem bestehenden signal, und der Sinn der Trennung geht verloren.
- L208 — ★ Das Prädikat von
fingerprint lässt sich anhand der Form nicht von image2d unterscheiden. Es kann nur über die Nullmittelwertigkeit abgegrenzt werden, was zur Laufzeit eine statistische Vermutung ist, sodass das Prädikat dieselbe Schwäche trägt (deshalb trennen wir per Typ). Halte diese Schwäche im Kommentar des Prädikats fest.
- L224 — ★ Der Seed von
fingerprint muss stets über sensor_fingerprint erzeugt werden. Wenn man rng.standard_normal((H, W)) direkt einsetzt, ist das weißes Rauschen und kein Fingerabdruck, und der Abgleich gibt stets “unkorreliert” zurück = man meint, eine Prüffläche hinzugefügt zu haben, hat es aber nicht.
- L227 — ★ Die Seeds von
images müssen die gleiche shape haben und 2 oder mehr sein. Mit nur 1 schlägt sensor_fingerprint dauerhaft fail-closed fehl und läuft nie.
- L242 — ★
qualities=None von jpeg_ghost_quality nimmt “12 Einträge von 40..95 Schritt 5” an, sodass es, sofern der Seed von images nicht 12 Einträge hat, stets ValueError auslöst. Dies ist das beabsichtigte fail-closed (es gibt keine Karte zurück, bei der Indizes und Qualitäten verschoben sind), also gleiche die Anzahl auf der Fuzzer-Seite an.
- L246 — ★ Die
bits von watermark_* müssen höchstens der Kapazität (Anzahl der 8x8-Blöcke von LL) entsprechen. Ein 64x64 image2d + Level 1 LL ist 32x32 = 16 Blöcke.
opsinterferometry.py
- L96 — ★ Nicht auf dem bestehenden
signal mitzureiten war das Ergebnis der Messung. Zunächst urteilten wir “da csi_signal_simulate ([] -> signal) ein echtes Interferenzsignal in den Pool gießt, ist es erreichbar”, doch beim Laufenlassen des verketteten Fuzzers mit dieser Verdrahtung wurden über 600 Ketten (300 x Länge 6 + 300 x Länge 8) csi_peak_position und chromatic_confocal_height kein einziges Mal ausgeführt (nur 7 CONTRACT-Einträge). Die Ursache ist, dass der signal-Seed eine Sinuskurve mit negativen Werten ist und die Wahrscheinlichkeit gering ist, dass der Eingangs-Op in derselben Kette früher gezogen wird. Es ist genau dieselbe Falle, in die opsphoton mit counts trat, und als Ergebnis eines perfekt greifenden fail-closed sieht “null Funde” wie Robustheit aus. In einer Wiederholungsmessung unter denselben Bedingungen mit sweep als eigenem Pool wurden alle 9 Ops ausgeführt. Dass das Mischen der 2 Typen eine Verwechslung nicht stillschweigend durchlässt, wird durch jeweils einen eigenen Diskriminator gewährleistet (beide Schwellen in geschlossener Form gemessen): - ein Spektrum an csi_peak_position übergeben -> carrier_tolerance. Ein Interferenzsignal hat seinen Träger bei 2/λ (Nyquists 0.333), während ein konfokaler Peak bei 0.010 liegt. Dieselbe Prüfung fängt sogar einen 1000-fachen Einheitenfehler bei der Messung. - ein Interferenzsignal an chromatic_confocal_height übergeben -> max_carrier_fraction. Die AC-Komponente der konfokalen Antwort ist nur niederfrequent (gemessen 0.010 / 0.010 / 0.015), während das Interferenzsignal 0.333 ist. Eingang = csi_signal_simulate / chromatic_confocal_simulate (beide erzeugen ohne Argumente), Ausgang = csi_envelope (-> signal) und die 2 measurement-Ops.
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 — ★ Nicht normals (die (N,3)-Normalen einer Punktwolke), sondern normalmap. Beide sind in der Form ähnlich, aber die Übergabe von (N,3) wird von _normal_map mit ValueError zurückgewiesen. Es hier als normals zu deklarieren wäre die Lüge, “man dürfe Punktwolken-Normalen übergeben”, und der verkettete Fuzzer würde jedes Mal in CONTRACT enden und diese Familie nie ausführen (= verwandelt sich in null Funde).
- 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 — ★ Beachte, dass counts ein 1-D float64-Array selbst ist, sodass nichts das “Aufrufen” von dsp / funct1d verhindert (das Typvokabular dient der Pool-Trennung des verketteten Fuzzers, nicht der Aufrufbarkeit in Python). Zur umgekehrten Brücke = dem Pfad, der ein signal zu counts nichtnegativiert, siehe die “Brücke”-Notiz unten. * countrate — die Zählratenfolge (Hz) eines SPAD (1-D, nichtnegativ). Es ist dasselbe “nichtnegative 1-D” wie counts, aber eine andere Größe, also legten wir es in einen separaten Pool. Es gibt 2 Gründe, beide messungsbasiert: (a) die Einheit unterscheidet sich um 7 Größenordnungen. Der Wertebereich des counts-Pools liegt bei etwa 0-250 counts, und dies an spad_deadtime_apply(dead_time_ns=50) zu übergeben ergibt 250 Hz x 50 ns = 1.25e-5 -> ein Wert unendlich nahe der Identitätsabbildung wird ausnahmslos zurückgegeben. Der Op “erreicht”, aber die Physik der Totzeit (Sättigung, 1/tau fail-closed, die Nichtinjektivität des paralysierbaren Typs) wird nie betreten. Dies ist derselbe “plausibel falsche Durchlauf” wie beim Mitreiten von histcube auf voxel, wobei weder CONTRACT noch TYPEMISS ausgegeben wird. (b) die Physik unterscheidet sich. Totzeit wirkt auf den Ratenstrom des Detektors, nicht pro Bin auf ein TCSPC-Zeit-Bin-Histogramm (das korrekte Verzerrungsmodell für ein Histogramm ist Coates = tcspc_coates_correct). Sie zum selben Vokabular zu machen würde die evolutionäre Suche die physikalisch falsche Kette “eine Totzeitkorrektur auf ein Histogramm anwenden” als legitime Typverbindung lernen lassen. countrate ist ein schmales sort, das wissentlich mit nur 2 Ops, apply <-> correct, getrennt ist (gleichrangig damit, dass jones 2 Ops und stokes 3 Ops hat). Diese 2 Ops sind jedoch streng invers zueinander, sodass eine Round-Trip-Invariante innerhalb des Pools zirkuliert. * histcube — der Ankunftszeit-Histogrammwürfel pro Pixel (H, W, T), Zeitachse zuletzt. Das bestehende
voxel ist ein “3-D-Array” und TYPE_CHECKS ist ebenfalls nur ndim == 3, also besteht es strukturell. Aber voxel ist ein (D, H, W) räumliches Gitter mit anderer Achsenbedeutung: ein (D,H,W)-Volumen als histcube zu übergeben lässt dtof_cube_depth W als Zeitachse lesen und keine Ausnahme, sondern eine “plausibel falsche Tiefenkarte” zurückgeben (gemessen: 0.0075 m für alle Pixel bei einem gleichförmigen Volumen). Beachte, dass ein flaches histcube auch auf der dtof_cube_depth-Seite als empty beurteilt und stillschweigend nicht durchgelassen wird (doppelte Absicherung). Brücke (Gegenmaßnahme gegen schmale sorts, Implementierung ausstehend = Urteil des Elternteils abwartend): was zu einer signal -> counts-Brücke werden könnte, ist ein Op, der “ein beliebiges reelles 1-D als nichtnegatives Photonenraten-Profil betrachtet und Poisson-abtastet” (eine 1-D-Version von photon_sample). Die Behandlung negativer Werte zu einem expliziten Argument zu machen vermeidet stille Gleichrichtung und bricht die Disziplin nicht. Bestehende 1-D-Ops mit nichtnegativer Ausgabe (funct1d.abs_funct_1d gemessen min 0.0023, dsp.envelope gemessen min 0.749, beide nichtnegativ garantiert) wären, falls diese Brücke existiert, eine natürliche Vorstufe für signal -> counts. Details siehe Bericht.
opspiv.py
- L25 — * ★ Wir richteten neu
flow2d ein. Das bestehende flow_dense hat das Prädikat ndim == 4 and shape[0] == 3 (3-D-Szenenfluss), sodass 2-D (2, h, w) von vornherein nicht zutrifft. Den Namen zu entleihen würde bedeuten, dass das Register “es gibt 3 Komponenten zurück” erklärt, während es 2 Komponenten zurückgibt, was die Erklärung zur Lüge macht. Es erfüllt die Bedingung dieses Repos zum Hinzufügen eines Typs (“wenn es keinen Op mit Seed gibt, wird es dauerhaft unausgeführt”): 7 erzeugende Ops (cross_correlate / multipass / deform_pass / ensemble_correlate / replace_outliers / to_velocity / sample_at_windows) und 13 konsumierende Ops (einschließlich Überschneidung von 8 Feldgrößen, 2 Visualisierungen, 2 Tests, 3 Auswertungen), sodass Erzeugung und Konsum innerhalb der Familie geschlossen sind.
- L35 — ★ Wir geben ihm stets einen Ausgang (die 5 Ops von
visualise) —— ein Typ, der erzeugt, aber nicht gesehen werden kann, wird mitten in der Kette zur Sackgasse und erzeugt ein “schmales sort”. Fail-closed in beide Richtungen ist ebenfalls durch Messung bestätigt: die Übergabe eines 2-D-Flusses an reprconv.flow_magnitude löst ValueError aus (namentlich zurückgewiesen mit “nimmt (3, D, H, W)”), und die Übergabe eines 3-D-Szenenflusses an piv_vorticity löst ValueError aus. * das Eingabe-Bildpaar ist image2d —— Partikelbilder sind 2-D reelle Felder selbst, sodass bestehende 2-D-Ops (Glättung, Schwellenwert, Hintergrundsubtraktion, Beschriftung) mit erhaltener Bedeutung nutzbar sind. Es gibt keine Garantie, dass die Helligkeit in [0,1] passt, aber das ist derselbe Stand wie das Komposit von astrostack. * piv_outlier_mask ist mask —— bool 2-D, wie das Prädikat sagt. Anders als dem_stream_network, das sich wegen nan nicht mask nennen konnte, sind hier fehlende Daten auf die True-Seite (Ausreißer) gefaltet, sodass es als bool geschlossen ist. * Statistiken sind table (dict). piv_error_stats / piv_peak_locking. * die Ausgabe der Geschwindigkeitsumrechnung piv_to_velocity ist ebenfalls flow2d —— die Einheit ändert sich von px/frame zu m/s, aber der Typ ist derselbe. Hier schreiben wir ehrlich: der Typ kann die Einheit nicht schützen. Also machten wir beide Skalen zu Pflichtargumenten (dasselbe Urteil wie cell_size von demops). Wir erwogen auch, die Einheit per Typ zu trennen, aber das wäre ein Typ, bei dem nur 1 Op m/s erzeugt und kein Op es konsumiert —— entgegen der Reihenfolge “hinzufügen, nachdem Belege auftauchen”, also übernahmen wir es nicht.
opsprintpath.py
- L54 (ja) — ★様式化(2026-09-23)。「きれいな絵」を返す op ではなく、保った量と捨てた 量を数で返す op にする —— 既存の NPR ライブラリは絵しか返さない。真値は モアレ周期の予言(描く前に分かる)、被覆率 w/d の閉形式、既知の縞の向き、 Lloyd の単調減少(既存 stipple_energy が測る)、セル平均の L2 最適性。 点描の 6 op と同じ族に入れたのは、どちらも「濃淡を離散的な墨に落とす」 同じ問題で、入口も出口も同じ語彙(image2d / pairs)だから。
opsrangedoppler.py
- L108 — ★ Korrekturprotokoll: der erste Entwurf dieses Moduls schrieb “in real geht das Vorzeichen der Geschwindigkeit verloren”, aber das war falsch (es stimmt für ein 1-D reelles Signal allein der Range-Achse, aber sobald 2 Achsen vorhanden sind, bleibt das Vorzeichen erhalten). Ein Test brach zuerst und deckte es auf. Was tatsächlich verloren geht, ist “welches des Paares echt ist”, die Hälfte der Amplitude und die Hälfte des eindeutigen Entfernungsmessbereichs.
_as_beat_cube weist in der dtype-Stufe zurück und benennt die Behebung (explizit ein analytisches Signal erzeugen). ————————————————————————– Eingang und Ausgang zur Vermeidung eines schmalen sort (Umgang mit einer gemessenen Lektion) ————————————————————————– Dieses Repo ist tatsächlich in 2 Fallen getreten: (1) ein Typ ohne Op, der ihn erzeugt, ist dauerhaft unerreichbar (der Fall, in dem score der einzige 1 blockierte unter 434 Ops war), (2) das Mitreiten auf einem bestehenden Pool wird jedes Mal fail-closed zurückgewiesen und sieht wie “null Funde” aus (der Fall, in dem 7/17 der photon-Familie unausgeführt waren). beatcube ist für beide behandelt: Eingang (Ops, die beatcube erzeugen) : fmcw_beat_simulate (nur Argumente, kein Eingabetyp) fmcw_window_apply (beatcube -> beatcube) Ausgang (Ops, die zu einem bestehenden sort zurückkehren) : range_doppler_map -> image2d (größter Pool) fmcw_range_profile -> signal beamform_delay_sum -> signal beamform_doa -> table Dass der Eingang eine “nur-Argument-Quelle” ist, hat dieselbe Form wie tcspc_simulate (kein Eingabetyp -> counts), sodass der verkettete Fuzzer wie bei counts einen eigenen Generator benötigt (ein Übergabepunkt für den Elternteil; der eigentliche Generator ist im Bericht mit bestätigter Ausführung enthalten). Der Ausgang fällt in image2d und signal, 2 der größten Pools in diesem Repo, sodass es kein geschlossenes schmales sort wie jones (2 Ops) oder countrate (2 Ops) wird.
opsreprconv.py
- L257 — ★
flow lässt sich nicht mit einem einzigen Prädikat schreiben. Da dicht (3,D,H,W) und verstreut (N,3) unter demselben Typnamen koexistieren, schützt ein Prädikat, das beide durchlässt, nichts, und die Festlegung auf eines macht zwangsläufig einen der bestehenden 4 Ops zu einem TYPEMISS. Trennen ist korrekt (dasselbe Urteil wie das Trennen von video von voxel), aber das ist Arbeit, die Deklarationen bestehender Ops umzuschreiben, und liegt außerhalb des Umfangs dieses Moduls, also hinterlassen wir hier nur den Vorschlag.
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 — ★ Das bestehende
labels-Prädikat ist jedoch ndim >= 1, und ein 2-D-Labelbild und ein 3-D-Labelvolumen koexistieren. Die 11 Ops dieses Moduls lösen alle ValueError (fail-closed) aus, wenn ihnen 2-D übergeben wird, sodass eine Verwechslung nie stillschweigend durchgeht. Die Gefahr ist umgekehrt: in einem Pool mit nur 2-D-Seeds sieht es wie “null Funde” aus, während es nie ausgeführt wird —— dieselbe Form wie die Falle, in die opsphoton mit counts trat. Gieße unbedingt 3-D-Label-Seeds auf der Verdrahtungsseite (siehe “wenn der Elternteil verdrahtet” unten). * voxel — das Quell-Grauvolumen, das vol_label_overlay überlagert, und das binäre Volumen, das vol_label_color_flicker empfängt. Beide sind das bestehende voxel-Vokabular von (D,H,W) selbst, also gibt es keinen Grund, einen neuen Begriff zu schaffen. * rgbimage — die Rückgabe von Querschnitten und Projektionen (H,W,3). Bestehende rgbimage-konsumierende Ops (Spiegeltrennung, Farbkonversion, Speichern) sind mit erhaltener Bedeutung nutzbar. Dies ist der Ausgang des rgbvolume-Vokabulars, sodass das neue Vokabular keine Sackgasse ist. * matrix — die Rückgabe von vol_label_palette (n+1, 3). Eine 2-D reelle Matrix selbst. * table — eine Menge aus Formstatistiken / Legende / Flimmermessung / gefärbtem Mesh.
- L77 — ★ Für “eine Menge gefärbter Meshes” kein neues Vokabular zu schaffen war das Ergebnis der Messung. Zunächst beabsichtigten wir,
colormeshes hinzuzufügen, doch als wir alle bestehenden table-konsumierenden Ops durchgingen und die Rückgabe von vol_labels_to_meshes übergaben (gemessen 2026-09-02, über ops3d / ops1d / opsmath / opsoptics / opslightfield / opsphoton / opsacoustics / opsinterferometry / opscadmap), sind die Ops, die table konsumieren, nur 3 (abcd_matrix / wavefront_stats / istft), und alle 3 schlagen mit ValueError fail-closed fehl. Das heißt, es erfüllt nicht die Bedingung “Mischen macht es stillschweigend falsch”. Etwas, das dies nicht erfüllt, ein Vokabular hinzuzufügen, fügt nur ein neues Vokabular mit null Konsumenten hinzu = eine Sackgasse (das Entscheidungskriterium von docs/OP_COMBINATION_MATRIX.md). Wenn man einzelne Meshes als mesh-sort stromabwärts fließen lassen will, streife sie mit [(m["vertices"], m["faces"]) for m in result] ab —— da dies Farbe verwirft, tue es nicht implizit in einem Adapter. ————————————————————————– Ein neues Vokabular und sein Grund (messungsbasiert) ————————————————————————– * rgbvolume — ein (D, H, W, 3) gefärbtes Volumen. Das bestehende lightfield-Prädikat ist nur ndim == 4, sodass ein Farbvolumen lightfield vollständig erfüllt. Gemessen (2026-09-02, Übergabe eines (8, 16, 16, 3) Farbvolumens an lightfield-Ops): - lf_refocus / lf_subaperture / lf_epi / lf_depth_from_focus, diese 4 Ops geben ein endliches (16, 3)-Ergebnis ohne Ausnahme und ohne NaN zurück (jeweils behaupten sie “refokussiertes Bild”, “Subapertur-Bild”, “EPI”, “Tiefe”). Bedeutungslose endliche Werte, gelesen mit der z-Achse als Winkelachse V und der y-Achse als Winkelachse U. - nur lf_all_in_focus gibt einen TypeError aus unzureichenden Argumenten (keine Typangelegenheit). Die Umkehrung (ein Lichtfeld an vol_label_slice_rgb) schlägt mit shape[3] != 3 fail-closed fehl. Nur eine Seite ist sicher, sodass man sich nicht auf Laufzeitprüfungen verlassen kann. Dasselbe Urteil wie das Trennen von zscan von video. Eingang = vol_colorize_labels (labels -> rgbvolume) und vol_label_overlay (voxel + labels -> rgbvolume), Ausgang = vol_label_slice_rgb / vol_label_mpr_rgb (-> rgbimage). Erzeugt 2, konsumiert 2, also keine Sackgasse.
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 (Standard) allokiert das (N, N) U und wirft es weg. Gemessen 2026-09-06: für 20000 Punkte 3.73 s / 3.2 GB, während full_matrices=False 0.876 ms (4263x) mit bitidentischem Vt ist. Bei 100k Punkten stirbt es bei 80 GB. Dasselbe Muster war in pcseg.fit_plane / measure / ops / camera / pnp3d (alle werfen U weg). Das statische Gate ist 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 — ★ Ein Fenster, in dem der Korrelationspeak nicht steht (keine Textur, überall gleichförmig), gibt nan zurück —— wir geben nicht 0 zurück, um “bewegt sich nicht” nicht mit “unbekannt” zu vermischen. Aber welcher Anteil nan ist, lässt sich nur aus dem Rückgabewert erkennen, und die Form war so, dass man es erst bemerkt, wenn
flow.mean() zu nan wird (2026-09-06). Hier zählen wir es. Gemessen: ein Bild mit nur einem 16x16-Quadrat auf gleichförmigem Hintergrund hat nur 16 von 98 Fenstern endlich (0.163). Volle Textur ergibt 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 — ★ Rohe PCA-Normalen haben ein beliebiges Vorzeichen und kippen unter Rotation bei 40% der Punkte. Da PPF-Merkmale Winkel zwischen Normalen sind, ändert sich beim Kippen der Schlüssel. Gemessen (400 Punkte, um die z-Achse): mit rohen Normalen ist die Schlüssel-Übereinstimmungsrate bei 0/37/90/143 Grad 100 / 73.6 / 69.4 / 67.2 %, mit orientierten Normalen alle 100 %. Dasselbe Loch, in das
pointcloud.fpfh getreten war, am selben Tag zusammen behoben.
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 — ★Ein deterministisches globales Shuffle (feste Basis, sodass train/holdout/locked dieselbe Permutation indizieren), aufgeteilt in drei disjunkte Bänder, verschlüsselt nach der Rolle des Seeds (evolve.run zieht train=seed, holdout=seed+10000, locked=seed+20000, also wählt seed//10000 mod 3 das Band). Das alte
off = seed % pool kollabierte alle drei Fenster auf dieselben Frames, wann immer pool 10000 teilte — ein stiller train↔holdout↔locked-Leak, der einen auf train überangepassten Champion so aussehen ließ, als hätte er „auf einem reinen Holdout die Hand geschlagen“. Ein reines 3-Wege-Split braucht pool >= 3n; ein kleinerer Pool kann kein sauberes Holdout liefern, also verweigern wir, statt still zu lecken.
profileops.py
- L270 — ★ Zunächst schrieben wir es als “die mit größerer Krümmung” und beurteilten die Hinterkante als Vorderkante bei NACA 2412. Die Krümmung des 3-Punkte-Kreises fällt an der Hinterkante, wo Ober- und Unterseite sich fast berühren, größer aus als an der Rundung der Vorderkante —— die Intuition “die Vorderkante ist rund” kehrt sich um, wenn man mit 3 Punkten auf der Kontur misst.
- L277 — ★ Wenn die Hinterkante offen ist, greifen die 2 entferntesten Punkte eine der Ecken der Hinterkante und die Sehne kippt. Wir nehmen sie am Mittelpunkt des Spalts neu, dann bestimmen wir die Vorderkante als “den Punkt, der am weitesten von diesem Mittelpunkt entfernt ist”. Ohne dies zeigt selbst ein symmetrisches Profil eine Wölbung um den halben Spalt der Hinterkante (gemessen 0.001257).
- L643 — ★ Vor dem Vergleichen mit derselben Methode neu nehmen. Der Sehnenrahmen (besonders der Mittelpunkt der Hinterkante) hängt leicht von der Platzierung der Punkte ab, sodass das Abgleichen einer rohen Kontur gegen eine neu genommene Kontur selbst bei identischer Form eine Rotation von 0.02 Grad und eine Translation von 7.8e-4 einbringt —— das selbst wurde zum Boden der Abweichung (gemessen rms 6.05e-4). Stelle das, was du vergleichst, auf denselben Boden.
- L654 — ★ Miss nicht Punkt-zu-Punkt, sondern Punkt-zu-Polylinie. Selbst nach Neunahme bei gleicher Bogenlänge stimmen die Phasen der beiden nicht überein, sodass das Herstellen der Korrespondenz per Index die Phasenverschiebung direkt zur Abweichung macht (gemessen: dieselbe Form mit sich selbst zu vergleichen ergibt rms 6.05e-4 —— dieselbe Größenordnung wie der Defekt, den wir erkennen wollen).
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 — ★ Nur solche, deren
public-Spalte true ist, dürfen in zu veröffentlichenden Abbildungen verwendet werden. Solche, die auf zitierte Nutzung zu Forschungs- und Bildungszwecken beschränkt sind, tragen cite.
- L97 — ★ skimage hält nur eine gebündelte Teilmenge; den Rest holt es zur Laufzeit über pooch. Was es nicht holen kann, verwenden wir in diesem Repo nicht (wenn ein PoC von der Verbindung abhängt, wird unklar, ob ein Fehler die Implementierung oder das Netzwerk war).
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 — ★ Zur Konvertierung in einen Integer-dtype prüfe den rohen Wert vor dem Cast. Ein durch adversariale Prüfung gefundenes Loch (2026-09-02):
np.asarray(nan, dtype=int64) löst keine Ausnahme aus und gibt INT_MIN zurück, und nach dem Cast ist dtype.kind == 'i', sodass es an der Nicht-endlich-Prüfung unten vorbeischlüpft. Ein Nicht-Integer wie 3.7 wird ebenfalls stillschweigend auf 3 abgeschnitten —— ein um 1 verschobenes Ergebnis im Index wird ohne Ausnahme zurückgegeben. Dies ist genau die Lüge eines Konvertierungs-Ops.
- L1076 — ★ Regressionspunkt eines echten Bugs. Zunächst war dies
np.maximum(sigma, finfo.tiny). An einem Duplikatpunkt ist sigma = 2.2e-308, und sigma ** 3 in gaussians_to_voxel läuft auf 0 unter, was eine Division durch null -> NaN verursacht. Was “0 vermeiden” sollte, wurde durch einen Wert ersetzt, der stromabwärts NaN erzeugt (ein Teil des Volumens wird ohne Ausnahme zu NaN = der Lehrbuch-stille-Fehler). Da ein Duplikatpunkt bedeutet “der Abstand kann nicht gemessen werden”, fail-closed statt mit einem Sentinel aufzufüllen.
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 — ★ Grund des Hinzufügens: in den Exponaten 111-113 trat erneut zutage, dass “Synthese nur die Bruchweise erzeugen kann, die sie bereits kennt” (ein Präzedenzfall, bei dem 9 Defekte in 6 realen Aufnahmen auftraten). Der PoC bleibt offline geschlossen, und wir platzieren nur den Eingang, der auf echte Daten umschaltet im Register. Für commercial=”check” und höher lies die Seite der Quelle, bevor du es verwendest.
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 — ★ Grund des Hinzufügens, messungsbasiert:
poc_dfm_thickness_overhang und poc_cad_scan_deviation berichteten, # “ein Maschinenteil besteht aus zylindrischen Bohrungen, Fasen und Verrundungen, aber da die Primitive nur Kugel und # Quader sind, lässt es sich nicht mit CSG zusammenbauen”, und beide schrieben pro Fläche analytische Formeln selbst. Die 4 hier sind alle geschlossen-form und exakt (außen ist die # euklidische Distanz zur nächsten Oberfläche, innen der negative Wert zur nächsten Fläche), sodass ein synthetisches Teil mit # Grundwahrheit nun allein mit CSG zusammengebaut werden kann. # ————————————————————————— #
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 — ★ Dies ist ein Wert, der sowohl von der Färbung als auch vom Bildgebungssystem abhängt und keine universelle Konstante ist —— wenn du auf eigenen Objektträgern quantifizierst, nimm einen Einzelfärbungs-Objektträger auf und miss ihn mit :func:
stain_vectors_from_patches neu.
- L843 — ★ Der 3. Vektor ist “der Rest”. Mit nur 2 hat ein 2x3 keine Inverse, und die Verwendung der Pseudoinversen verteilt das Residuum stillschweigend auf die 2. Richte einen orthogonalen 3. Vektor ein und sammle die Dichte ohne Ziel in ihm (= sie kann später als Residuum gelesen werden).
spectralrad.py
- L576 (ja) — ★既定の溶融石英(SILICA、Malitson の分散式)は材料表に k が無く、厚さは効かない —— 内部の吸収を入れたいなら k を持つ硝材の名前と厚さを渡す(材料表の glass の類)。
studio.py
- L349 (ja) — ★2026-10-03: GIF を QPixmap で読むと 1 コマ目しか出なかった(例の図の 1/4 は掃引 GIF)。QMovie で回す。
- L358 — ★ Rechtsklick auf die Abbildung selbst (Benutzer 2026-09-06: “es wäre schön, das als Abbildung Angezeigte per Rechtsklick in die Zwischenablage kopieren zu können”). Eine Studio-UI-Konvention dieses Repos —— die Anzeigeseite muss auch per Rechtsklick alles ermöglichen. Es kann dasselbe wie die Buttonreihe unten (mach es nicht zu einem Entweder-oder).
- 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 — ★ Das Auffanggefäß für Abbildungen. Die Beispiele schreiben hier ein PNG über
examplefig. In Läufen, die keine Umgebungsvariable übergeben (CLI), wird kein einziges geschrieben, sodass ein Bild nur erscheint, wenn es aus der Galerie ausgeführt wird (die Zahlen und die Geschwindigkeit des Beispiels ändern sich nicht).
- L10483 — ★ Das Auffanggefäß für Abbildungen. Die Beispiele schreiben hier ein PNG über
examplefig. In Läufen, die keine Umgebungsvariable übergeben (CLI), wird kein einziges geschrieben, sodass ein Bild nur erscheint, wenn es aus der Galerie ausgeführt wird (die Zahlen und die Geschwindigkeit des Beispiels ändern sich nicht).
- 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 — ★ Rette Studios Einstellungen für die ganze Session in eine wegwerfbare ini. # ————————————————————————— #
QSettings("Fullseye", "Studio") schreibt in den nativen Speicher (unter Windows die Registry HKCU\Software\Fullseye\Studio). Wir hatten die Isolation in einzelne Testdateien gelegt, sodass eine Datei, in der sie vergessen wurde, die echte Registry des Benutzers verschmutzte. Ein Audit am 2026-09-05 bestätigte tatsächlichen Schaden: 8 der 10 recent_files waren pytest-Temp-Pfade, und reale Werte wie system\operator_timeout_ms blieben ebenfalls. (Die Isolation war in nur 2 von 3 Dateien, und test_studio_params.py ging durch.) Höre auf, sie einzeln hinzuzufügen, und platziere nur eine, hier, als session-autouse. Die Umgebungsvariable ist der einzige Eingang, den studio._settings() betrachtet, sodass dies alle Tests abdeckt.
- L44 — ★ Deklaration von Tests, die ein optionales Backend benötigen. # ————————————————————————— # Die CI-Notiz sagte lange “torch/kornia nicht installieren (entsprechende Tests graceful skip)”, aber eine Messung am 2026-09-05 zeigte, dass das nicht wahr war —— die Zieltests skippten nicht, sondern scheiterten mit
ImportError: this operator needs the optional 'torch' backend (14 davon). Es gab nur eine Notiz und keinen Mechanismus, sie maschinell zu verifizieren. Hier konsolidieren wir die Deklaration in einen einzigen Eingang. Das Ziel ist beide Richtungen: * eine Umgebung ohne das Backend -> skip (die Notiz wahr machen) * eine Umgebung, in der das Backend vorhanden sein sollte -> skip nicht zulassen, es scheitern lassen (FULLSEYE_REQUIRE_OPTIONAL=1. Der CI-py3.11-Job setzt dies) Mit nur einer Richtung verwandelt sich eine echte Regression still in einen skip (dieselbe Form wie 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 — ★ Überdrucken verdickt nur seitlich. Eine Kontur, die nach oben und unten verdickt, füllt die Innenräume von CJK-Text (gemessen 2026-09-09: 11pt “Menge Wert Fläche” wurde ein schwarzer Klumpen).
tests/test_aoi.py
- L145 (ja) — ★平均は保たれない(被写体と感度に相関があるとずれる)。実測 8.9 %。
tests/test_api.py
- L226 (ja) — ★台帳をまるごと外すと「層が現れない」で落ちる —— この門が見張る事故そのもの。
tests/test_astrostack.py
- L1053 — ★ 2026-09-08: ein 3. Rückgabewert, vote_margin (Peak Platz 2 / Platz 1), wurde hinzugefügt. Für ein Sternfeld sollte der Peak einzeln und somit klein sein —— fixiere auch das hier.
tests/test_backends_typed.py
- L71 (ja) — ★2026-10-07:
or True で無効化されていた。実測 936 op / 重複 0 —— 主張は成り立つので門に戻す
tests/test_backends_typed_liveness.py
- L57 — ★ Für diesen einen gab es 3 Aufzeichnungen —— hier,
gen_op_figures.DOMAIN_MISMATCH, und die eigene gemessene 0/60 des Ops. Dennoch dauerte der Zustand “registriert, läuft aber nie” an. Etwas zu wissen und es in einer Entscheidung zu verwenden sind verschieden (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 — ★Alle drei Objekte müssen unterschiedliche Formen haben. Ein Seed mit gleichen, aufgereihten Formen lässt circularity und holes alle denselben Wert zurückgeben und verdeckt so einen “op, der bei jedem Regler dieselbe Zahl liefert”.
tests/test_caltab.py
- L121 — ★Ob das Gate auslöst, hängt von der Umgebung ab, also wird das nicht behauptet. Es wird nur geprüft, dass der Wert unverborgen zurückgegeben wird.
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 nicht ansehen. Ziel dieser Prüfung ist die Auflösung der Argumente, nicht der Inhalt des wheel. Die Beurteilung des Inhalts hängt von der Umgebung ab —— gemessen 2026-09-05: in einer Umgebung, die die Quelle über PYTHONPATH sichtbar macht, lassen sich wegen des Skript-Verhaltens, das den repo-Wurzelpfad aus sys.path entfernt, einige Module nicht importieren und es schlägt fehl (in einer pip-install-Umgebung passiert das nicht). Weil hier returncode angesehen wurde, schlug diese Prüfung auf Linux so fehl, dass es wie ein “Pfadauflösungsproblem” aussah.
tests/test_collection_sizes.py
- L65 — ★OPS3D ist eine flache Tabelle {op-Name: metadata dict}. Zählt man sie als
sum(len(v) for v in values()), ergibt das die Gesamtzahl der Metadaten-Schlüssel über alle ops (2,492), womit beinahe eine bedeutungslose Zahl ins Register geschrieben worden wäre (2026-09-08, vor dem Schreiben durch Ansehen der Struktur bemerkt).
- L85 (ja) — ★2026-09-25 追加: 通信の名簿(
comm.protocols)は数えていたのに、 駆動の名簿は数えていなかった。接続の 3 層(protocol / image source / driver)のうち 1 つだけ見ていない状態で、 driver が 1 行消えても誰も気づかない。
- L91 — ★Hinzugefügt 2026-09-08: zwei Register, die Beschreibungen sammeln. Beschreibungen schrumpfen am leisesten, deshalb werden sie hier gezählt (Quelle von docs/CAPABILITIES.md und 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 — ★Das Heikle hier: der Defekt, den dieser Test absichert, reproduziert sich unter Windows nicht. Gemessen 2026-09-05: unter Linux (Ubuntu 24.04 / py3.12 / PyPI wheel) SIGSEGV bei 3 ops auf degenerierter Eingabe. Dieselbe Eingabe an Windows brachte keinen einzigen zum Absturz. “Lokal ist grün” ist daher kein Beleg, und es muss so gehalten werden, dass sich das tatsächliche Wirken des Registers in beiden Umgebungen prüfen lässt. ————————————————————————— #
- L322 — ★Das Gegenstück zu
ops.NATIVE_CRASHES_ON_DEGENERATE. Es muss 1:1 mit der Haupttabelle übereinstimmen. Nur eine Seite zu ändern schlägt fehl —— aus der Haupttabelle zu löschen oder ihr etwas hinzuzufügen verlangt, hier zugleich umzuschreiben (= ein Mensch bestätigt die Absicht). Warum ein Gegenstück nötig ist: beim Mutationstest des Gates (2026-09-05) bestand der Test, der prüft “jeder op im Register hat einen guard”, weiterhin, selbst nachdem cv_cc_count aus der Haupttabelle entfernt war. Ein aus dem Register entfernter op fällt auch aus den Zielen der Schleife, sodass der gesamte Prüfpfad mit verschwindet. Der abgesicherte SIGSEGV ist Linux-only, und unter Windows kommt zufällig ein brauchbarer Wert zurück, sodass auch die letzte Verteidigungslinie versagt. Nur die Äquivalenz mit einer unabhängigen Quelle (dieser Menge) fängt beide Richtungen auch unter Windows. Gleiche Form wie test_the_two_nonfinite_ledgers_agree.
tests/test_demops.py
- L440 — ★Die Rückgabe ist immer (N, 3). Selbst das Übergeben eines Skalars ergibt (1, 3), nicht (3,) —— weil das Register points = (N, 3) deklariert (2026-09-06, der TYPEMISS des Fuzzers deckte die Diskrepanz auf und die Implementierung wurde an die Deklaration angeglichen).
- 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 — ★Die op-Menge ändert sich mit der Umgebung (Linux-CI fehlen torch/kornia/mahotas/xfeatures2d und hat 859 ops; lokal 885). Eine Prüfung, die die lokal erzeugten Dokumente gegen das lebende Register vergleicht, ist nur in einer vollen Umgebung sinnvoll —— gleiche Konvention wie test_opdocs: skip, wenn nicht vollständig (der fehlende Backend-Name erscheint im Grund). Im CI vom 2026-09-07 fielen hier 22 Einträge durch. Umgebungsunabhängige Prüfungen (Datei-Existenz, Inhaltsmenge, Abbildungs-Existenz) laufen weiterhin.
tests/test_docs_index_reachable.py
- L42 — ★Die op-Menge ändert sich mit der Umgebung (Linux-CI fehlen torch/kornia/mahotas/xfeatures2d und hat 859 ops; lokal 885). Eine Prüfung, die die lokal erzeugten Dokumente gegen das lebende Register vergleicht, ist nur in einer vollen Umgebung sinnvoll —— gleiche Konvention wie test_opdocs: skip, wenn nicht vollständig (der fehlende Backend-Name erscheint im Grund). Im CI vom 2026-09-07 fielen hier 22 Einträge durch. Umgebungsunabhängige Prüfungen (Datei-Existenz, Inhaltsmenge, Abbildungs-Existenz) laufen weiterhin.
- L80 — ★Nur die Markdown-Syntax anzusehen reicht nicht.
docs/GALLERY.md verwendet <img src="..."> an 14 Stellen innerhalb von Tabellen, und ein naiver Scan nach ]( sieht keine davon (in Codex’ adversarialem Review gefunden, 2026-09-06). Auch das rohe HTML ansehen.
- L189 — ★Doppelte Marker zuzulassen bedeutet, dass eine alte Tabelle stehen bleibt und trotzdem grün wird. Der Generator schreibt nur das erste start–end um, sodass das zweite für immer alt bleibt und weiter veröffentlicht wird (Codex’ adversariales Review, 2026-09-06).
- L210 — ★Früher genügte “es gibt 20 Zeilen und 4 Dimensionsnamen sind sichtbar”, aber das wird grün, selbst wenn Hunderte ops wegfallen (Codex’ adversariales Review, 2026-09-06). Gegen die tatsächliche Zahl je Dimension abgleichen, bis auf den letzten Eintrag.
- L249 — ★Ausgeben, wo sie sich unterscheiden. Ohne das lassen sich reihenfolgeabhängige Fehler (etwa Register-Verschmutzung), die nur in der Gesamt-Suite auftreten, nicht verfolgen.
- L312 — ★Mit nur Anzahl und Namen bleiben der Typvertrag (in_sort/out_sort), die Kategorie, die HALCON-Entsprechung und der tier komplett veraltet und werden trotzdem grün (Codex’ adversariales Review, 2026-09-06). RAG liest in_sort/out_sort, um typverknüpfbare ops zu wählen; ist das veraltet, schlägt es voller Zuversicht eine Kette vor, die nicht verbindet. Samt Inhalt abgleichen.
- L400 (ja) — ★日本語版だけを見ていた門を 6 言語に広げた(2026-09-16)。
local_std を足した ときに ja/en/ko/tw/zh が 1,947 のまま落ちたが、de は落ちなかった —— ドイツ語の桁区切りはピリオドで 1.947 と書くため、"{:,}" では一致も 不一致も見えない。門が 1 言語にしか立っていないと、他の 5 言語は黙って腐る。
- L467 — ★Prüfen, dass die Ausgabe “Inhalt hat” —— ein Gate, das nur die Übereinstimmung prüft, wird grün, selbst wenn beide leer sind # ————————————————————————— # Gemessen 2026-09-06. Unterschreitet man es, schlägt es fehl (Anheben ist erlaubt).
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 — ★Das Maximum ist die Harmonische: period / (1/f_max_bin) landet nahe einer ganzen Zahl
- 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, im ersten CI nach Einführung dieses Gates fielen 7 auf py3.12 durch (py3.11 war grün). CI installiert torch / kornia / mahotas / opencv-contrib absichtlich nur auf py3.11 und nicht auf anderen Versionen. Auf der Testseite gab es bereits einen Deklarationsmechanismus namens
requires_backend, doch das Gate, das die Beispiele ausführt, hatte ihn nicht —— dass ein Mechanismus existiert und dass jeder Pfad ihn durchläuft, ist zweierlei. gallery2d_* ist eine Galerie, die “alle ops jener Familie ausführt”, sodass ihr Vertrag selbst davon abhängt, welche Backends installiert sind (sie kodiert op-Namen fest und gleicht gegen das Register ab, mit “überzählig in OPS” scheiternd, wenn auch nur einer fehlt). Also je Familie deklarieren. Die übrigen 2 nutzen torch direkt (fit_zernike / match_logpolar_z). In einer vollen Umgebung (CIs py3.11, FULLSEYE_REQUIRE_OPTIONAL=1) wird ein skip zu einem Fehlschlag, sodass sowohl Über-Deklaration als auch vergessene Deklaration in beide Richtungen durchfallen.
- L87 — ★PYTHONPATH nicht übergeben (der ganze Sinn dieses Gates). Nutzer setzen keine Umgebungsvariablen.
- 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 — ★Es war kontraintuitiv: in der Annahme “Kupfer ist röter als Gold” schrieb ich cu[2] < au[2] und es schlug fehl. Selbst nach veröffentlichten Werten liegt gegenüber Aus R(450 nm) ≈ 0.40 Cu bei ≈ 0.56, also hat Kupfer mehr Blau (= Gold ist das gesättigtere Gelb). Falsch war diese Vorannahme, nicht die Tabelle.
- L175 — ★Der Grund, weshalb die Wellenlänge zum ersten Argument gemacht wurde (die “Daten zuerst”-Konvention des Registers). Ein Array an den Scheitelwinkel zu übergeben löste früher einen nackten TypeError aus.
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 — Es auf “bei Fehlen mit Begründung skip” setzen —— ★das CI vom 2026-09-08 wurde hier rot: anzunehmen, was lokal vorhanden ist, sei auch im CI da, macht nur lokal grün (gleiches Muster wie
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 — ★In einer Umgebung ohne hypothesis stoppt ein Import-Fehler in dieser einen Datei das Ganze —— pytest bricht beim collection error ab, ohne den Rest auszuführen (2026-09-05; CI starb in 2 Minuten und kein einziger Test lief). Auf skip herabstufen, damit es andere nicht mitreißt.
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 — ★Es ist nicht einmal ein Durchreichen: der Fallback gibt nach dem Abschneiden auf den Bildvertrag [0,1] zurück. Ein Signal, dessen negative Hälfte 0 wurde, sieht aus wie ein “gefiltertes Signal”, also lügt dies stillschweigend. max |
Diff |
= 1.0, Minimum -1.0 -> 0.0. |
tests/test_op_example_coverage.py
- L58 — ★Ein Ratchet, das die Grundmenge von der Seite des ausgelieferten Artefakts zählt (2026-09-06) # ————————————————————————— # Gemessen 2026-09-06. Ein Anschlag, um es nicht schlechter als diese Zahl werden zu lassen, kein Zielwert. Von den 1,002 ops des Registers sind nur 349 im Beispiel-Index, und die beiden “100 %” oben galten nur, weil die Grundmenge 2 von 3 Schichten hatte. Verlauf und Aufschlüsselung je Familie = docs/KNOWN_ISSUES.md §38.
- L32 — ★Die op-Menge ändert sich mit der Umgebung (Linux-CI fehlen torch/kornia/mahotas/xfeatures2d und hat 859 ops; lokal 885). Eine Prüfung, die die lokal erzeugten Dokumente gegen das lebende Register vergleicht, ist nur in einer vollen Umgebung sinnvoll —— gleiche Konvention wie test_opdocs: skip, wenn nicht vollständig (der fehlende Backend-Name erscheint im Grund). Im CI vom 2026-09-07 fielen hier 22 Einträge durch. Umgebungsunabhängige Prüfungen (Datei-Existenz, Inhaltsmenge, Abbildungs-Existenz) laufen weiterhin.
- L203 — ★2026-09-08: jeden op, der von der Version eines Drittanbieter-Backends abhängt, aus dem Register herausnehmen und separat zählen. Dieses Register wird in “der Umgebung, die die Abbildungen erzeugte” geschrieben und in “der Umgebung, die die Tests ausführt” verifiziert. cv2-Implementierungen ändern sich mit der Version, sodass ein Regler, der lokal (opencv 5.0) nicht wirkt, im CI (opencv-contrib 4.x) wirkt —— gemessen war das b von
xcv_grabcut genau so. Das Register darf nur Dinge behaupten, die in jeder Umgebung gelten. Versionsabhängige Teile nicht behaupten (ein schmales, aber korrektes Register ist besser als ein lügendes).
- 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 — ★Hinzugefügt 2026-09-08. Bis dahin baute dieses Gate nur für die 4 von image / region / color / volume Eingaben und ließ
contour 65 / points 57 / signal 26 / video 16 … 217 ops (24 % des 901-op-Registers) als “uncallable” durch. Dass “das Gate an der richtigen Stelle steht” und dass “das Gate alles durchlässt”, ist zweierlei —— bei der ersten Ausweitung kam heraus, dass tb_angle_3points unter der Sonde nie laufen kann (registriert als points->feature, doch die eigentliche Entität nimmt 3 Vektoren).
- L85 (ja) — ★2026-09-17: 戻りの橋
feature_to_img で feature が初めて 入力になった(作る op は 125 本あったが受ける op がゼロ だった)。この門は「探針を作れず一度も走らせていない op」を 数えるので、sort を足したらここにも足す。
- L197 — ★Das CI vom 2026-09-08 (py3.10 / py3.12, kein torch) wurde hier rot —— weil das Ausweiten der Sonde auf alle sorts erstmals einen op erreichte, der torch braucht (
tb_points_to_voxel). “Kaputt” und “in dieser Umgebung nicht vorhanden” sind verschiedene Urteile, und sie zu vermischen macht aus einem Umgebungsunterschied einen Implementierungsfehler. In einer vollen Umgebung (FULLSEYE_REQUIRE_OPTIONAL=1) wie bisher als Fehlschlag behalten.
tests/test_opdocs.py
- L212 — ★2026-09-03: da das _safe jedes Backends in backend_safe.guard zusammengefasst wurde, nach dem strukturierten Marker urteilen, den der guard setzt, nicht nach String-Abgleich auf qualname (der guard lässt auch “_safe(…)” im qualname, das ist aber zur Anzeige).
- 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 — ★Warum es nicht gefunden wurde:
ops.REGISTRY (899) und die 2-D-Notizen (899) stimmen überein, sodass es solange man von der Registerseite zählt wie “null fehlend” aussieht. Ich habe das einmal geschlossen und lag falsch. Daher zählt dieses Gate von der tier-übergreifenden Index-Seite (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: das lokale wheel trug sample_sources_ai mit 42 MB (96 MB). Ursache war ein veralteter build/lib/-Cache (Überreste von vor der Entfernung aus package-data werden neu eingepackt). Es ist ein Unfall, den eine konfigurationslesende Prüfung nicht fängt, daher betrachten tools/ci_wheel_check.py (unshipped_present) und die Größengrenze in ci.yml das echte wheel. Das Verzeichnis wurde zudem aus dem Paket verschoben (tools/fops_article/). Hier verlangen wir die explizite Ausschlussangabe (als Absicherung).
tests/test_pivops.py
- L621 — ★Nur das namensbezogene
PARAM_HINTS anzusehen macht das Gate schmaler als den Fuzzer. chain_fuzz._bind_args konsultiert auch OP_PARAM_HINTS, das nach op-Namen zielt, also hier ebenfalls beides ansehen (2026-09-06: nachdem dics window / method in OP_PARAM_HINTS gelegt wurden, war es tatsächlich bindbar, doch nur hier schlug es fehl).
tests/test_poc_scripts_run.py
- L57 — ★2026-09-08: die feste 6 aufgeben und an die CPU-Zahl anpassen. Auf gemeinsam genutzten Runnern (2–4 vCPU) verlangsamt 6-fache Parallelität nur jeden Einzelnen, ohne die Gesamtzeit zu verkürzen, und als die PoCs auf 84 wuchsen, traf jeder Job pytests 900-Sekunden-timeout (py3.10 / 3.12). Lokal (12 Kerne) läuft es wie bisher mit 6 oder mehr.
- L73 — ★
PYTHONPATH nicht übergeben (2026-09-09). Lange wurde PYTHONPATH=<repo> übergeben, doch das ist eine Einstellung, die Nutzer nicht vornehmen, und es bedeutete, dass das Gate einen Schritt neben dem Ort stand, an dem der Unfall geschieht —— durch denselben blinden Fleck blieben examples/piv_flow_from_particles.py und andere als “ModuleNotFoundError beim direkten Ausführen aus einem Checkout” (jene Seite hatte nicht einmal ein Gate, das sie ausführt, daher blieb es unbemerkt. test_example_scripts_run.py). Auf der PoC-Seite fügen 108 von 116 den repo-Wurzelpfad selbst zu sys.path hinzu, und die übrigen 8 importieren nur fullseye, sodass alle auch nach dem Entfernen bestehen (gemessen).
- L87 (ja) — ★stdin は /dev/null(2026-10-23)。渡さないと子は親(xdist の worker)の stdin = execnet の パイプを継ぐ。worker が死んだあとも子がそのパイプを握り、controller が「node down」の後に 固まる形になりうる(手元で torch+libiomp5md の子が消えないゾンビになった日に疑った経路。 再現はしなかったが、子に親の制御パイプを継がせる理由は無い)。
- L96 — ★Bei Fehlschlag auch das Ende von stdout zurückgeben. Ein PoC druckt seine Befunde und “welche Prüfung fehlschlug” nach stdout vor SystemExit(1), sodass man mit stderr allein nur “exit 1” und sonst nichts erfährt (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: dies gab lange 0 zurück und ging so glatt durch das
assert code == 0 weiter unten —— ein Gate, das sein Urteil gleich nach dem Berechnen verwirft (gemessen: 3 PoCs drucken nie PASS —— poc_dic_strain / poc_photoelasticity / poc_thermography_ndt). -2 zurückgeben, damit es fehlschlägt.
- 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 — ★Dieses Gate führt die 84 PoCs in einem Durchgang aus (session fixture). Diese Zeit wird dem ersten Test angerechnet, sodass pyprojects Standard-timeout (900 Sekunden) auf gemeinsam genutzten Runnern fehlschlägt. Nur hier erweitern —— den Standard zu lockern würde auch die Hänger-Erkennung anderer Tests abstumpfen.
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 — ★Ein nackter import bricht in einer Umgebung, in der es fehlt, die gesamte Sammlung ab (gemessen 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 — ★Gibt man die Ebene frei, wird eine gleichförmige Ausbreitung auf einer Seite komplett aufgesogen (gemessen 4.9e-35). Der Mittelpunkt bewegt sich nur zur Hälfte und die Ebene bewegt sich dorthin mit, sodass es nicht als Links-rechts-Differenz übrig bleibt. Das ist eine Grenze dieser Definition, kein Defekt —— will man es sehen, gibt man die Ebene von außen vor oder fügt einen Landmark auf der Mittellinie (midline) hinzu.
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 wirkt nur auf den argumentlosen Konstruktor, und Studios QSettings("Fullseye", "Studio") war fest auf die Registry gesetzt —— diese fixture isolierte nichts (2026-09-05; pytests Pfade blieben in der Registry). Den hauptseitigen Einstieg studio._settings() per Umgebungsvariable auf eine ini richten.
- L2066 — ★Ein direktes
QSettings("Fullseye", "Studio") umgeht die Isolierung und schreibt in die Registry des Nutzers (im Audit vom 2026-09-05 als realer Schaden bestaetigt). Halte den Einstiegspunkt fuer Einstellungen bei genau einem.
- 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 — ★Der alte setDefaultFormat-Ansatz hatte keine Wirkung auf Studios QSettings(org, app). Richte den Haupteinstiegspunkt studio._settings() auf die ini aus (fuer die gesamte session).
tests/test_studio_ops_browser.py
- L11 — ★Ein nacktes import bricht die gesamte Collection ab in einer Umgebung ohne matplotlib (pytest fuehrt nach einem einzigen Import-Fehler den Rest nicht mehr aus). Gemessen am 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): beide beziehen sich auf den aktuellen Frame. Bis 2026-09-05 erwartete dieser Test das aufeinanderfolgende Paar |
f[t-1]-f[t-2] |
und zementierte damit einen Implementierungsfehler als Spezifikation (stets komplett null fuer ein gleichfoermig mit konstanter Geschwindigkeit bewegtes Objekt – der Regressionstest unten). |
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 — ★Fuer Katalog, Hints und Adapter ist das ausgelieferte Modul
typed_catalog die Quelle der Wahrheit (2026-09-05). Frueher lebten sie hier, und backends_typed las sie, indem es tools/ zu sys.path hinzufuegte – dadurch verschwanden im wheel tb_* 143 op stillschweigend. Die Richtung wurde umgekehrt.
- L284 (ja) — llmcore(2026-09-24): tokens は画像パッチを種にする。★一様乱数だと どの行も似た向きになり、注意の重みが全行ほぼ一様になって「走ったが 意味のある出力でない」側に落ちる。滑らかな画像を 8x8 で切ると、 近い場所のパッチが近い向きを向く = 注意が構造を持つ。
- L305 — Ereignispositionen (Punktprozess) – der Einstiegspunkt von point_spectrum. ★Nicht nur gleichverteilten Zufall verwenden: ohne eine periodische Komponente wird das sinnvolle Verhalten einer “op, die Perioden findet” kein einziges Mal ausgeuebt, daher als Keim strukturierte Daten verwenden, die 12 unabhaengige Ereignisse in eine Reihe mit Periode 17.0 mischen (die Disziplin dieses repo, dass rein zufaellige Tests strukturelle Defekte verbergen).
- 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 — ★Eine Punktwolke mit nicht-endlichen Werten bringt die KD-Baum-Konstruktion selbst mit einem rohen ValueError zum Absturz (scipy: “data must be finite”). Der Pool ist so ausgelegt, dass er NONFINITE protokolliert und die Werte behaelt, daher ist eine verunreinigte Punktwolke hier erwartbar – die bauende Seite muss absichern. Am 2026-09-06 real getroffen: eine neue Familie kam hinzu, die Art, wie Ketten durchlaufen werden, aenderte sich, und bei seed 3_000_0xx wurde dieser Pfad getroffen und der fuzzer selbst hielt an (kein Defekt der op, sondern ein Defekt des Werkzeugs. Die Zusage ist, dass nicht bindbare Eingabe uebersprungen und nicht geworfen wird).
- 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 — ★Bis 2026-09-02 war es
lambda v: True = da das Praedikat als “vorhanden” gezaehlt wird, ist es schlimmer als gar keins (auch das Pruefskript zaehlt es als “hat ein Praedikat”). Gemessen liess es sogar None / 42 / einen String / ein dict durch. Der Kanon wurde festgelegt, indem alle 6 konsumierenden op (reprconvs pairs_to_signal / pairs_to_image2d / pairs_to_table / angles_to_normals / shape_index_to_curvature / polar_to_cscalar) vollstaendig ausgefuehrt wurden: alle 6 op akzeptieren nur die beiden obigen Formen, alles andere wird zu einem namentlichen fail-closed mit “pairs: must be (N, 2) or a 2-tuple of equal-length 1-D arrays” (gemessen). Da (2,N) nicht akzeptiert wird, wurden die 3 adapter, die ein 2-tuple mit np.stack zu (2,N) zusammendrueckten, auf axis=1 korrigiert. Zwei Arrays unterschiedlicher Laenge (histograms counts/edges) sind ebenfalls kein “Paar” und werden abgewiesen.
- L8374 — ★”Genau 2 Elemente” ist absichtlich anders als pose (das via
len >= 2 info erlaubt). Gemessen 2026-09-02: die 4 bestehenden consumer, die ein mesh als ein Argument nehmen (face_normals / vertex_normals / mesh_area / vertex_curvature), geben fuer ein 3-tuple “mesh must be a 2-element tuple (vertices, faces)” aus, und cadmaps _mesh und render3d._mesh_arrays akzeptieren ebenfalls nur 2 Elemente. Das heisst der Kanon fuer den mesh sort dieses repo ist ein 2-tuple, und ein zusaetzliches Element ist nicht “mehr Information”, sondern eine Luege auf Typ-Ebene, die alles Nachgelagerte ausloescht. Die einzige Ausnahme voxel_to_mesh (die (v, f, n) zurueckgibt) laesst jetzt die kanonische Reihenfolge in ops3d.RESULT_ADAPTERS extrahieren (gleich behandelt wie 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 — ★Entferne den eigenen Speicherort dieses Skripts aus sys.path. Python legt das Verzeichnis des Skripts auf sys.path[0], sodass beim Start aus dem
tools/ des checkout selbst im venv des wheel Dinge unter tools/ (das nicht mitgelieferte chain_fuzz usw.) importierbar werden und man in einem Zustand zaehlt, in dem “Dinge sichtbar sind, die nicht im wheel liegen”. Im Review vom 2026-09-05 hat dieses Gate das Fehlen von tb_* 143 op uebersehen genau deswegen. Verschiebe zugleich auch cwd in ein leeres temporaeres Verzeichnis (dasselbe passiert, wenn cwd der checkout ist).
- L34 — ★Merke dir vor dem Verschieben von cwd das urspruengliche cwd und loese fortan alle Argumentpfade dagegen auf. Gemessen 2026-09-05: preflight uebergibt absolute Pfade und ging daher lokal durch, waehrend ci.yml relative Pfade uebergibt, sodass der dump in ein temp-dir weggeschrieben wurde und compare mit FileNotFoundError scheiterte – das Gate fuehrte den Vergleich auf dem produktiven Aufrufpfad kein einziges Mal aus. Das 3. Mal fuer “stelle das Gate dorthin, wo der Unfall passiert”. Statt den Aufrufer zu korrigieren, sorge dafuer, dass es auch bei Aufruf mit relativen Pfaden korrekt funktioniert, und schliesse diese ganze Klasse.
- L139 — ★2026-09-08: schau auch auf die editable-Seite. Bis dahin wurde
a["failed_backends"] nur gesammelt und von niemandem gelesen – in derselben Runde als Loch derselben Art wie examplefigs Abbildungs-Fehler aufgedeckt. Das editable-venv hat viele optionale Abhaengigkeiten, sodass ein backend wegen einer Versionsabweichung beim import scheitern kann. Dann ist die wheel-Seite bloss “von Anfang an nicht da, weil die Abhaengigkeit fehlt”, protokolliert keinen Fehler, und dieser Vergleich geht gruen durch. Die op des gefallenen backend verschwinden stillschweigend aus der Registry.
- L92 — ★Hier kann man sich zweimal irren. Die
run_chain des fuzzer (1) behandelt den Eingabetyp any als “immer verfuegbar” (zieht beliebig aus dem Pool) und (2) in OP_ARG_BUILDERS registrierte op bauen ihre Argumente selbst. Zaehlt man diese beiden nicht, wird eine op, die tatsaechlich jedes Mal laeuft, als “strukturell nicht erreichbar” gemeldet (tatsaechlich falsch gemeldet fuer fuse_to_voxel / register_cross). Erreichbarkeit wird nicht durch “den Typ allein” bestimmt – ein Teil des Erreichbarkeitspfads liegt auf der Code-Seite.
- 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 — ★Lege den Bereich, in dem 1 Thread am schnellsten war, halbtransparent aus. Platziere ihn zuerst, damit er die Linien nicht verdeckt, und halte alpha niedrig (wenn das Band selbst zu sehr in den Vordergrund tritt, wird der Vergleich der Linien schwer lesbar).
- L69 (ja) — ★「描く」= 機械に線を引かせる層(2026-09-22 追加)。「見せる」が人に見せる ための絵なのに対して、こちらはペンプロッタ・レーザー・刺繍のように 線でしか描けない機械への変換で、出口が G-code になる。
- L75 — Englische Namen der Kategorien. ★Selbst in der englischen Version blieben nur die Ueberschriften auf Japanisch (gemessen 7 Zeilen) – der Inhalt war mit
title_en / _summary_en uebersetzt, aber die Ueberschriften wurden vergessen, ein Musterbeispiel fuer “umgeschaltet, aber Japanisch mischt sich ein”. Hier nicht vorhandene Kategorien werden unveraendert ausgegeben (keine Uebersetzungen erfinden).
- 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 — ★Die Übersetzungstabelle liegt in einer anderen Datei als die Operatordokumentation. Mit
opdocs.T landete jeder abgefragte Originaltext in opdocs.SEEN_STRINGS, und das bestehende Tor „Löcher in den Rahmenübersetzungen“ würde alle 604 als Löcher zählen und die CI rot färben — jenes Tor sorgt dafür, dass Rahmentexte in allen fünf Sprachen vollständig sind, während dies hier eine nach und nach gefüllte Sammlung ist. In einer gemeinsamen Tabelle zerstört die eine Disziplin die andere.
- L82 — ★Ein Block = eine Folge von
#-Kommentarzeilen, die von einer Zeile mit ★ ausgeht und mit derselben Einrueckung fortfaehrt. Auch Kommentare im Sphinx-Stil #: werden aufgenommen. Streift man nur # und Leerraum ab, bleibt vorne ein :
- L84 — uebrig, und im Artefakt erscheint “: ★…” (ist tatsaechlich passiert). Streife
: hier ebenfalls ab.
- L128 — ★Wenn das naechste ★ kommt, schneide es als separaten Block ab (ein Anspruch pro Block).
- L220 — ★Uebersetze die Markierung nicht; fixiere sie auf
_(ja)_. Sie pro Sprache zu uebersetzen macht sie fuer die Maschine unzaehlbar – tools/i18n_status.py ist ein Werkzeug, das “Japanisch ohne Markierung” zaehlt, sodass 593 Zeilen zu “verstecktem Japanisch” mutieren, wenn sich die Markierung pro Sprache aendert (ist tatsaechlich passiert). ja ist ein Sprachcode und vermittelt dem Leser zugleich “dies ist Japanisch”.
- L253 (ja) — ★2026-10-07: 言語版の目次 INDEX..md もノートではない(以前は 5 本を数えて 3089 本を 3094 本と書いていた)
- L281 — ★Nimm die Menge der Notizen aus dem Register (zaehle nicht die Dateien auf). Im adversarialen Review vom 2026-09-06 (Codex) mischte eine Version, die Dateien globt und Stems zaehlt, ein
docs/ops/SAMPLES.md (keine op-Notiz) hinein, und der Index nannte 1,842, der RAG-Leitfaden 1,843 – es wurden gleichzeitig widerspruechliche Zahlen veroeffentlicht. Notizen werden 1:1 aus records erzeugt, daher ist ein Name in records selbst die Definition von “ein Name, der eine Notiz hat”. Die Uebereinstimmung mit den Dateien prueft separat tests/test_docs_index_reachable.py (erkennt Fehlende / Ueberzaehlige).
- L291 — ★
__all__, nicht dir(fullseye). dir enthaelt Modulattribute (os / sys / warnings / annotations) und erhoeht sich zudem um eins, nachdem ein anderer Test importiert hat (1094 → 1095), sodass das Drift-Gate nur in der Gesamt-Suite fiel (2026-09-06). Die oeffentliche Oberflaeche sind die 1,091 Namen, die die Fassade in __all__ deklariert.
- L340 — ★Der Index ist nicht nur fuer Menschen, sondern auch die Suchoberflaeche der KI (die Bemerkung des Nutzers vom 2026-09-06 “der Index ist doch auch der Teil, der als RAG genutzt wird, oder?”). Da op-Notizen zugleich der Suchkorpus fuer KI-Coding-Unterstuetzung sind, mache den maschinenlesbaren Einstiegspunkt im Index explizit. Schreibt man “alle op” fuer etwas, das nur die Haelfte hat, irrt sich das RAG ueber die andere Haelfte selbstsicher – deshalb werden die gemessenen Zeilen aus
_honest() nicht aus diesem Abschnitt entfernt.
- 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 — ★Lass status=fixed ohne Gate nicht durch – damit dieses Register nicht selbst einen Zustand erzeugt, in dem nur der Vermerk, es behoben zu haben, bleibt, waehrend ein Wiederauftreten nicht gestoppt werden kann.
- L196 — ★Die Linkziele (
docs/hardening/*.md) sind auf Japanisch geschrieben. Sie durch einen englischen Titel zu ersetzen waere eine Luege, also gib den Titel unveraendert aus und haenge (ja) an – was ein Leser der nicht-japanischen Version braucht, ist kein “uebersetzter Titel”, sondern die Tatsache “das ist nicht lesbar”. Fixiere die Markierung auf die Form, die tools/i18n_status.py zaehlt.
- L41 — ★Das ist keine “blosse Konstante”: sobald das Linienintegral p = Σ μ·Δx 10 uebersteigt, faellt exp(-p) unter eine Photonenzahl von 1, der Logarithmus saettigt und p stoesst an eine Decke (photon starvation). Die erste Version setzte μ auf 0.55–1.0 “pro Pixel”, sodass p 30 erreichte und das rekonstruierte μ um 50–84% zu niedrig ausfiel. Die Null-Baseline (einfache Rueckprojektion) gewann beim Dice, und da fiel es auf.
- L166 — ★Die Zahlen pro Material sind Recall. Sie sind “der Anteil, der innerhalb des Labels dieses Materials erfasst wurde”, nicht Dice (da falsch-positive ausserhalb des Labels nicht gezaehlt werden, wuerde es sich als Dice stets an 1.0 annaehern). Das insgesamt Uebersehene / Ueberfassen wird unten separat als precision / recall angegeben.
- L65 — ★Die Wicklungsreihenfolge ist nach aussen. Kehrt man sie um, zeigen die Normalen nach innen, und render_beauty gibt ohne eine Exception auszuloesen reines Schwarz zurueck (so war die erste Version, und nur die Duennschicht-Kugel war schwarz).
- 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 — ★Dies ist eine untere Schranke. Da nur geprueft wird, ob der op-Name als Literal in
tests/ erscheint, werden Sweep-artige Tests, die das Register durchlaufen und alle op ausfuehren (for name in ledger: ...), nicht gezaehlt. Lies es als “kein namentlicher Test”, nicht als “kein Test”.
- 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 und tb_indices_to_labels, die in dieser Tabelle standen, waren nicht “ausserhalb des Definitionsbereichs der Abbildung”, sondern op, die nicht auf die Bruecke gehoeren. Ersteres nimmt 3 Vektoren, kann also nicht mit einer einzigen Punktwolke aufgerufen werden, und letzteres gibt 1-D zurueck, deklariert out aber als labels (→ volume = ndim 3). Beide waren zwar registriert, aber nie ein einziges Mal gelaufen, und fail-soft gab plausible Werte zurueck. Nach backends_typed._OP_BRIDGE_SKIP verschoben und aus dieser Tabelle entfernt – es gab einen Vermerk, dass keine Abbildung herauskam, aber nirgends einen Vermerk ueber die Unfaehigkeit zu laufen selbst (es gab zwei Gates, und nur eines hatte es bemerkt).
- 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 (Nutzeranweisung “es besteht kein Bedarf, alles in ein Bild zusammenzufassen; Stufenweises oder solches mit mehreren Bedingungen getrennt ausgeben”, “bei manchem ist eine Falschfarbe verstaendlicher”, “Komplexes gerne auch als animiertes GIF”). Zusaetzlich zur Hauptabbildung
<op>.png: <op>.a.jpg / <op>.b.jpg — 3 Bilder mit dem Regler auf 0.1 / 0.5 / 0.9 gestellt (nur wenn sich die Ausgabe aendert; aendert sie sich nicht, kommt der Grund ins manifest) <op>.chain.jpg — eine Stufenabbildung fuer eine op mit vorgeschalteter op (Bild → Zwischenschritt → Ausgabe) <op>.gif — wenn die Ausgabe Video / Lichtfeld / Volumen ist, Frames / Blickpunkte / Slices der Reihe nach zeigen (das Standbild <op>.png ist die fertige Form und das GIF ist zusaetzlich; Studios QTextBrowser zeigt das erste Frame). Wende Falschfarbe nur auf die Ausgabe eines Feldes einer Groesse an (Abstand, Phase, Orientierung, Tiefe, Kruemmung …) und schreibe (viridis) in die Bildunterschrift. Filter-Typen bleiben grau (nicht als farbwechselnde op darstellen).
- L756 — ★”Es lief” und “eine sinnvolle Ausgabe kam heraus” sind zweierlei (2026-09-07, Bemerkung des Nutzers “was soll das pechschwarze out?”). Zaehlt man ein leeres Array als “hat eine Abbildung”, wird eine schwarze Platte zur Abbildung. Erfasse Leeres als leer und schreibe den Grund in die Notiz.
tools/gen_view2026_pages.py
- L181 (ja) — ★2026-10-30: 2 つの展示の日本語が 10/27 から「???…」のまま載っていた(× と − も全言語で ? に)。 文字コードの往復で失われた文字は ? か U+FFFD になる。どちらも訳として通さない。
- L592 — ★2026-09-02: highpass / bandpass_image folgen nun der Konvention, “[0,1] mit 0 auf 0.5 abgebildet” zurueckzugeben. Zuvor gaben sie ein vorzeichenbehaftetes Array zurueck, das als image bezeichnet wurde, und beim Speichern / Zwischenstufen-clip wurde die negative Haelfte (etwa 50% der Pixel) stillschweigend auf 0 gedrueckt. Halte die Behebung durch Messung statt Vermutung fest: den Minimalwert und den Anteil negativer Pixel.
- L727 — ★2026-09-02: estimate_noise gibt jetzt in Einheiten von σ zurueck (zuvor blieb es bei σ>=0.08 bei 1.0 haengen und gab fuer σ, die sich um das 3-fache unterschieden, denselben Wert zurueck). Lege die Gerade y=x an, damit man visuell pruefen kann, “ob der Rueckgabewert σ selbst ist”.
- L840 — ★Die Labels von _panel_grid brechen nicht um, und sobald sie die Breite ueberschreiten, stossen sie mit dem Nachbarn zusammen und werden unlesbar (bei tile 262px / font 19-17px sind pro Zeile ≈ 12 Vollbreiten-Zeichen das Maximum). Verlagere die Bedeutung des Skalierungsfaktors in Titel und Untertitel und platziere auf dem Panel nur einen kurzen Namen und Zahlen.
- L1184 — ★2026-09-02:
area_center gibt nun, wie der Name sagt, die 3 Komponenten (Flaechenverhaeltnis, Zeile, Spalte) zurueck (bis dahin war es nur der einzelne Skalar Flaechenverhaeltnis, und das Zentrum wurde nicht zurueckgegeben).
- L1186 — ★Seit 2026-09-26 sind alle 3 Komponenten in Pixeln (Flaeche [Pixelanzahl], Zeile [px], Spalte [px]). Vorher waren sie auf [0,1] normiert, und hier wurde mit (H-1) / (W-1) multipliziert, um zu Pixeln zurueckzukehren (bis zur Korrektur am 2026-10-15 wurden die Pixelwerte erneut mit (H-1) multipliziert). Das zurueckgegebene Zentrum wird ins Bild gezeichnet, damit man sieht, dass es wirklich das Zentrum ist.
- L1713 — ★Ruft man apply_cmap Punkt fuer Punkt auf, wird innerhalb dieses einen Punkts normiert, sodass alles dieselbe Farbe wird. Erstelle einmal eine LUT, die 0..1 aufspannt, und schlage darin nach.
- L1951 — ★2026-09-02: gabor verwendet nun eine feste Skala, die durch die L1-Norm des Kernels teilt, und gibt einen ueber op hinweg vergleichbaren Absolutwert zurueck. Zuvor teilte es durch “den maximalen Absolutwert in diesem Bild”, also pro Orientierung durch einen anderen Divisor, was die Groesse der Antwort selbst = die Unterscheidungskraft ueber Orientierungen zunichtemachte. Im Gegenzug faellt der Rueckgabewert in ein schmales Band am unteren Ende von [0,1] (Mittel 0.007–0.030 bei diesen 3 Mustern), sodass ein direktes Einfuegen alle 3 pechschwarz macht. Zeige das Bild auf das 1–99%tile gestreckt und gib in den Label-Zahlen die vor der Streckung gemessenen Werte an (dieselbe Konvention wie das highpass-Panel von freq_sweep).
- L2066 — ★2026-09-02: die 3 op wurden zu getrennten Implementierungen. Zuvor ritten alle 3 auf geom “zoom” mit einer gegenseitigen maximalen Differenz von 0.0 / 4.9e-14 (= identisch), und zudem war b in allen 3 tot. Jetzt zoom_image_factor = 2 Skalierungsfaktoren (Hoehe/Breite) / zoom_image_size = Zielgroesse / rescale_img = isotroper Skalierungsfaktor + Interpolationsordnung. Die canvas shape bleibt bei allen wie die Eingabe.
- L3878 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L411 — ★Miss das Rauschen mit :func:
astrostack.noise_sigma (ein robustes Hintergrund-σ). Verwendet man “RMS des Residuums gegen den Ground Truth”, gehen sogar PSF-Verschiebungen ins Residuum ein – dieses Experiment variiert absichtlich FWHM pro Frame, sodass eine andere Auswahl die PSF nach dem Stacken aendert und man nicht mehr unterscheiden kann, ob das gestiegene Residuum vom Rauschen oder von der Bildaenderung kommt (gemessen bewegte sich der Wert von 25.2 -> 61.3, aber das meiste davon war kein Rauschen). Das Hintergrund-σ haengt nicht von der Form der Sterne ab.
- L471 — ★Die “maximale Differenz” bewegt sich bei einem einzelnen Frame nicht – denn solange der Recall unter 1 liegt, haelt ein einziges uebersehenes Pixel das Maximum unveraendert fest. Wie viele Pixel weiterhin stark vom Ground Truth abweichen und die Gesamtmenge der Abweichung spiegeln die Wirkung der Entfernung direkt wider.
- L713 — ★ In Originalgröße nebeneinandergestellt lässt sich “2 detektiert” mit bloßem Auge nicht bestätigen (innerhalb von 44x44 ist ein Paar im Abstand von 1.6 Pixeln nur ein Klumpen von wenigen Pixeln). Um keine Abbildung zu erzeugen, die den Leser allein der Behauptung des Detektors vertrauen lässt, schneide um jedes Paar denselben physischen Bereich aus und vergrößere ihn.
- L844 — ★ Die Fehlerkarte färbt die Größe, nicht das Vorzeichen. Die erste Version verwendete eine divergierende Farbskala, aber der Fehler in diesem Experiment ist stets positiv, sodass “positiv = das Blau von right” entstand und sich die umgekehrte Bedeutung ergab, bei der ein defekter Zustand mit der “korrekten” Farbe eingefärbt wird. Hier soll dem Leser nicht die Richtung, sondern “wie falsch es ist” vermittelt werden, also variiere nur die Intensität einer einzigen wrong-Farbe (und zeige zusätzlich Symbole und Zahlen, damit die Bedeutung nicht allein an der Farbe hängt).
- L1417 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L573 — 5. ★Eine volle Runde über die Darstellungen hinweg (die Kette der Umwandlungen ist genau der Ort, an dem Lügen entstehen) # ————————————————————————— #
- L599 — ★ “Eine Schale, kein Volumenkörper” darf nicht mit einer Maximum-Intensity-Projektion behauptet werden —— MIP ist das Maximum entlang der Tiefenrichtung, sodass selbst eine dünne Schale innen gefüllt aussieht (tatsächlich haben wir es einmal so gezeichnet und beinahe die kaum unterschiedlichen Zahlen “Volumen 5768 -> Schale 5608” berichtet). Ob das Innere erhalten bleibt, sagt man mit dem Mittelschnitt und dem inneren Füllgrad.
- L862 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L2065 (ja) — ★台帳に残すパスは repo 相対へ落とす(公開される場所なので)。
- L896 — ★ Die tatsächliche Größe der Bildebene, die die Balken aufspannen. Auf 1.0 mm eingestellt ergibt 208 Abtastungen/mm = Nyquist 104 cyc/mm, sodass ein Balken mit 200 cyc/mm sich in einen groben Streifen von 8 cyc/mm verwandelte (die Abbildung aliaste sich selbst). Bei 0.25 mm sind es 832 Abtastungen/mm, und selbst bei der höchsten Frequenz von 200 cyc/mm reicht eine Periode mit 4.16 Pixeln aus.
- L1151 — ★ Zwei Größen in einer Abbildung zu überlagern bedeutet, dass je nach Wahl der Skalen die beiden Kurven zufällig genau zusammenfallen können (die erste Version tat genau das und sah wie das Gegenteil der Behauptung “zwei unabhängige Achsen” aus). Die Skalen zu manipulieren, um sie zu trennen, ist Augenwischerei, also teile die Panels vertikal — die Struktur der Abbildung selbst sagt “das sind verschiedene Achsen”.
- L1299 — ★ Nimm den Peak aus der gesamten Zeile. Früher stand dort
line[c - s : c + s + 1], und wenn s größer als c wird, wird der Start zu einem negativen Index, sodass Python nur die letzten 56 Pixel herausschnitt und 0.6167 als “Peak” zurückgab (das tatsächliche Maximum ist 0.9834). Die Normierung brach zusammen, die Kurve deckelte bei 1.0, und dip/peak kam ebenfalls falsch mit 0.0067 bei 1.9x Rayleigh heraus.
- L1581 — ★ Der Bereich “Unschärfe innerhalb von 1 Pixel” wird nicht aus dem Gitter entnommen. Die Schrittweite des Sweeps beträgt 3.9 mm, während die Schärfentiefe nur 0.74 mm ist, sodass kein einziger Punkt auf das Gitter fällt (die erste Version stürzte dort ab, weil min() leer wurde). Löse die Grenze selbst per Bisektion.
- L1600 — ★ Der Überhöhungsfaktor ist vertikale Pixel/mm ÷ horizontale Pixel/mm. Die erste Version schrieb den Kehrwert und zeigte “0.13x” auf einer um das 8-fache gestreckten Abbildung an (was dem Leser genau das Gegenteil vermittelt).
- L2090 — ★ In zwei Zeilen aufteilen, oben und unten. In einer Abbildung überlagert, lesen sich die beiden Linien mit unterschiedlichen Einheiten (Pixelzahl und Detektionsrate) so, als lägen sie auf derselben vertikalen Achse (genau so sah es tatsächlich aus).
- 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 — ★ Solange dies fehlte, rief :func:
_called :func:_strip_prose für jede Kombination von (op-Name × example) auf und parste dabei jedes Mal die gesamte Quelle mit ast.parse + tokenize neu. Gemessen am 2026-09-05: 2-D 881 op × 73 Beispiele + 3-D 347 op × 118 Beispiele + ledger 494 op × 73 Beispiele = etwa 140.000 vollständige Parses, sodass ein einzelnes opdocs.py md 10 Minuten dauerte (toc und html bauen denselben Index ebenfalls neu auf, sodass eine vollständige Neugenerierung in der Größenordnung von 30 Minuten liegt). Das Entfernen von Prosa muss nur einmal pro Quelle geschehen —— da es nicht vom op-Namen abhängt.
- L142 — ★2026-09-08: ops1d (dsp 16 + funct1d 23) war registriert, hatte aber nicht eine einzige Notiz unter docs/ops —— es erscheint in OP_CATALOG, aber ohne Notiz je op (Typvertrag, Fallstricke, verwandte ops) fehlte es vollständig im RAG-Korpus. Aufgefallen ist es, als
poc_web_roll_periodicity dsp um 2 ergänzte.
- 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 — ★Die n-äre (mehreingabige) Schicht. Bis zum 2026-09-09 hatten 17 Operatoren keine einzige Notiz (
add_image, sub_image, bit_and, reduce_domain, union2 …). In OP_INDEX.json stehen sie als Tier nary, doch ohne Notiz unter docs/ops/ waren sie aus dem RAG-Korpus heraus nie auffindbar. Der Grund für das Übersehen ist klar: hier wurde nur ops.REGISTRY durchlaufen, und ops.REGISTRY (899) stimmt mit der Zahl der 2-D-Notizen (899) überein — von der Registry aus gezählt sah es vollständig aus. Erst schichtübergreifendes Zählen zeigt es.
- L1023 — ★2026-09-07:
OPS3D[...]["doc"] ist zum Registrierungszeitpunkt nur die erste Zeile des Docstrings, herausgeschnitten (ops3d._build). Verwendet man es für die “Verwendung” einer Notiz, wird es zu einer einzigen Zeile, egal wie viele Absätze die Implementierung schreibt —— der 3-D-Anteil von “494 ops mit einzeiliger Verwendung” war durch dieses Abschneiden verursacht (viele ops haben selbst lange Docstrings). Lies den Docstring der Funktion vollständig, wie bei der ledger-dim.
- L1046 — ★ Ein Brücken-op (
tb_<name>) hat dieselbe Implementierung wie das <name> des Ledgers, und Beispiele werden unter dem Ledger-Namen geschrieben. Bis zum 2026-09-06 galten 147 davon als “null Beispiele”, aber das bedeutete nur, dass wir nicht gezählt hatten, dass Beispiele, die dieselbe Implementierung aufrufen, unter einem anderen Namen existieren. Erbe die Beispiele der Ledger-Seite und vermerke in der Notiz ausdrücklich, dass es “Beispiele des ursprünglichen op” sind (um nicht zu lügen).
- 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 — ★Ein n-ärer Operator lässt sich nicht über
fullseye.apply aufrufen — das ist das Ein-Bild-Modell. Die Ein-Bild-Aufrufform hier hinzuschreiben lässt die Notiz lügen; die einzige Aufgabe dieser Notiz ist zu sagen, wie man aufruft, also ist eine falsche Aufrufform schlimmer als gar keine. Der öffentliche Weg ist fullseye.FullseyeGraph.
- L1301 — ★2026-09-07: Schreibe zuerst den öffentlichen Pfad. Hier stand nur ein direkter Import des Implementierungsmoduls, und
fullseye.ledger.<name>, das Nutzer tatsächlich verwenden, tauchte nicht auf (alle 1.244 ops außer 2-D). Dass PoCs wiederholt “nicht in fs." meldeten, lag nicht daran, dass der Name fehlte, sondern daran, dass **der Einstiegspunkt nicht geschrieben war**.
- L1752 — ★ Gib die Einstiegspunkte in 6 Sprachen aus (2026-09-09). Die Blätter (Studios op-Hilfe) haben 10.191 Seiten in 6 Sprachen, doch der Index, der dorthin führt, war nur Japanisch —— eine Lücke der Form, dass die Übersetzungen existieren, aber nicht erreichbar sind. Der Wortlaut des Rahmens kommt in
T(), sodass Löcher in den Paralleltexten vom bestehenden Gate (test_chrome_translation_table_has_no_holes) überwacht werden.
- 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 — ★ Dies zeigte lange nur auf
2d/guides/ und schickte die Leser kein einziges Mal zu den Leitfäden der 30 Familien wie Optik, PIV und Tomographie (behoben 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 — ★ Bleibt in
build/lib eine vorherige Staging-Kopie zurück, packt setuptools sie unverändert ins wheel (gemessen 2026-09-05: ein aus py-modules entferntes Modul blieb im wheel, und der Mutationstest des Gates ging durch). Derselbe Grund, aus dem release.yml aus einem sauberen Checkout baut. Auch hier vor dem Bauen unbedingt verwerfen.
- L233 (ja) — ★2026-10-18: スクリプトは一時 dir に置くので、
import fullseye は editable install(本線の 作業ツリー)を読んでいた —— worktree で出すリリースを検査したつもりで、別の版を見ていた。 PYTHONPATH でこの ROOT を先頭に置き、点検する対象 = 出すツリーにする。
- L319 (ja) — ★全出力は repo の外に残す。repo 直下に置くと「余計なファイル」を見る門に 当たりうるし、木が汚れて「凍った木で 1 回」という証拠の条件が崩れる。
- L362 — ★
--only suite ohne --full aufzurufen ergibt 0 Elemente, und früher meldete es “alles PASS” und kehrte mit rc=0 zurück (gemessen im Review vom 2026-09-05). Ein Gate, das durchlässt, während es nichts prüft, ist schlimmer als gar kein Gate.
- 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 — ★Das einzige generierte Artefakt außerhalb von
tools/. Genau deshalb wurde es übersehen — wer Generatoren unter tools/*.py sucht, findet dieses nie.
- L56 — ★2026-10-15: von Platz 16 auf Platz 2 vorgezogen. Die einzige Eingabe ist die Registry (es liest keine Ausgabe einer anderen Stufe), doch gen_capabilities_index und gen_trust_block lasen diese Datei vorher — nimmt ein Merge, der Ops hinzufügt, beim Index die Mainline-Seite, fehlen im veralteten Index die neuen Ops und die Kette bricht ab (bei der Integration wurde
imgevolve.py index von Hand vorab ausgeführt). Die Reihenfolge prüft order_violations() anhand von OUTPUTS / READS unten.
- 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: ohne
--md schrieb es nichts (es gab nur eine Zusammenfassung auf stdout aus). docs/CONVERSION_MATRIX.md blieb auf dem Stand vom 2026-09-02 (“59 Typen / 164 Konversionspaare”) stehen, und da –check “eine Stufe, die nichts schreibt” nicht als Drift sieht, lief es sechs Wochen lang durch. Jetzt weist trace_problems() eine Stufe zurück, die ihre deklarierten Ausgaben nicht einmal berührt.
- 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 — * ★ Und gefährlich: ein Artikel unmittelbar nach der Generierung schreibt Bilder mit relativen Pfaden. Die veröffentlichte Version hat sie auf absolute URLs auf
raw.githubusercontent.com umgestellt (mit einem relativen Pfad zeigt Qiita keine Bilder —— memory feedback_qiita_svg_path_and_cache). Läuft nur der Generator, werden diese absoluten URLs um 42 Zeilen zurückgesetzt. Wenn du ihn laufen lässt, führe es bis zu den Veröffentlichungsschritten des Artikels durch. Schreibe Ausschlüsse nach Dateiname. Fasst man sie in Prosa zusammen (“die 10 von wing*_gallery”), lässt sich das maschinell nicht abgleichen, und das unclassified() unten funktioniert nicht.
- 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 — ★Ein generiertes Artefakt außerhalb von
tools/. Wer nur tools/*.py durchläuft, findet es nie — docs/OP_INDEX.json wurde tatsächlich übersehen.
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 — ★ Der Fall, in dem der Standardwert selbst schwer ist, wird gesondert behandelt —— wir schrieben eine Kostentabelle in den Docstring und beließen ihn in docs/KNOWN_ISSUES.md als “ungelöst”. Es hier leichter zu machen dient dazu, die Prüfung zu bestehen, nicht dazu, die Langsamkeit zu verbergen. Das keep von fourier_smooth(points, keep) ist ein Pflichtargument ohne Standardwert. Kann es nicht gebunden werden, wird es für immer als “Argumente nicht zusammensetzbar” übersprungen und erscheint in der Coverage-Tabelle nur als nicht erreicht (bei der ersten Messung am 2026-09-06 fiel von 13 ops nur dieses eine heraus). Oberflächenrauheit. Die Einschränkungen sind 2dx <= lambda_lo < lambda_hi <= ndx / 0<hurst<1 / sq>0 / n>=8. Subpixel-Messung. Der op zur Erzeugung der Messlinie nimmt keine Eingabe, daher braucht jedes Argument einen Hinweis.
- L388 — ★ Ohne dies wird surface_params jedes Mal fail-closed abgelehnt, und an der einen Coverage-Zahl sieht es “aufrufbar” aus, während es in Wirklichkeit nie ausgeführt wird.
- L561 (ja) — して探針の値が読みやすいようにする。★既定の weight=”phat” は band が必須(0.5.0、 全白色化は帯域の限られた信号で外れる)。rate=1.0 なので band は cycles/標本で全帯域を明示。
- L578 — ★ Mache die Normale nicht achsenparallel. Ist sie achsenparallel, variiert das Distanzfeld nur entlang einer Achse, und das “GIF aus gestapelten Schnitten”, das der Abbildungsgenerator erzeugt, kollabiert zu einem einzigen Frame (gemessen 2026-09-08). Bei einer geneigten Normale ändert sich jeder Schnitt. Die Länge hat keine Wirkung (der op normiert), also übergib einen nicht normierten Vektor, um auch diese Spezifikation zu zeigen.
- 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") gelingt, sodass ein bloßes Durchreichen durch float() einen String als Millimeter durchschlüpfen lässt. Die visiondesign-Seite weist ihn ab, aber wenn man hier zuerst in float umwandelt, wird er zu einer Zahl, bevor er jene Validierung erreicht (unter adversarialer Prüfung gemessen: VisionSystem(focal_mm=”50”) ging durch). Halte auch auf der Container-Seite dieselbe Disziplin.
visualhull.py
- L127 — ★ Ausnahmslos jeder Punkt hinter der Kamera = fast sicher eine Konventionsabweichung in der Pose (2026-09-08, von poc_livestock_body_volume ausgelöst). Diese Funktion verlangt die OpenCV-Konvention (+Z nach vorn), aber was in der öffentlichen Schicht den Namen
look_at trägt, ist die gluLookAt-Version von render3d (−Z nach vorn, eine 4x4). Übergibt man deren M[:3,:3], M[:3,3], wird jeder voxel als hinten liegend beurteilt, und ausnahmslos eine leere Silhouette wird zurückgegeben, was einen leeren hull ergibt. Stillschweigend leer zurückzugeben ist nicht von “vollständig herausgeschnitzt” zu unterscheiden, also erheben wir allein hier die Stimme (es gibt gültige Fälle —— das Objekt liegt hinter dem Sichtfeld —— daher belassen wir es bei einer Warnung statt einem 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.