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: 610 von 681. 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_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.)
annotate.py
- L3095 — ★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.
api.py
- L587 — ★
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.
- L1346 — ★ 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.
astrostack.py
- L156 — ★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.
-
| L379 — ★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. |
- L586 — ★ Der einzige Eintrittspunkt für Schrotrauschen. Mit photons_per_unit=1 gilt “Erwartungswert = lambda”.
- L675 — ★ field_seed ist fest (derselbe Himmel), nur seed wird variiert (eine andere Beobachtung).
- L746 — ★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.
- L1606 — ★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.
- L1629 — ★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
- L436 — ★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.
- L812 — 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'.
- L1028 — ★Ü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
- L594 — ★Ä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).
- L617 — ★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.
- L1111 — ★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).
- L1270 — ★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
- L1275 — 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.
- L1482 — ★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.
- L1555 — ★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.
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.
- L206 — ★
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_r3.py
- L46 — ★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.
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_typed.py
- L505 — ★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.
blob2d.py
- L287 — ★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).
- L587 — ★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
- L178 — ★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).
- L184 — ★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
- L188 — ★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).
champion_to_macro.py
- L193 — ★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.
- 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
- L97 — ★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.
- L605 — ★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.
- L686 — ★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.
- L746 — ★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.
-
| L795 — ★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 |
). |
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
- L139 — ★
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).
- L171 — ★Lass den Textkörper des Beispiels nicht weg. Schade, dass die Abbildung nicht erscheint, aber die Zahlen müssen gezeigt werden.
- L210 — ★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.
- L275 — ★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.
- L339 — ★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).
examples/acoustic_condition_monitoring.py
- L467 — ★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/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_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.
- L524 — ★2026-09-08: “equidistant” trifft nun auf das 1-D
create_funct_1d_array (baut eine Funktion aus gleichmäßig verteilten Stichproben) — ein Nebeneffekt davon, ops1d über op_find auffindbar zu machen, ohne Bezug zum Projektionsmodell. Nur das Wort stimmt überein, die Lücke ist nicht gefüllt, daher haben wir es so umgeschrieben, dass es das “Fehlen in der Projektionsfamilie” prüft (nicht nach Wortübereinstimmung urteilt).
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_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”. # ————————————————————————— #
- L248 — ★Ü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).
- L269 — ★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_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_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
- L893 — Kapitel 6: ★Der Defekt zieht die Ausrichtung —— vorhergesagt durch Projektion auf die 6-D des starren Körpers # ————————————————————————— #
- L1099 — ★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”.
- L1252 — ★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.
- L1263 — ★Den Unterschied eines einzelnen Laufs nicht als “es hat gewirkt” lesen —— den Seed variieren und mit der Streuung vergleichen
- L1353 — ★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.
examples/poc_camera_calibration.py
- L150 — ── Kalibrierung (eine selbstgebaute minimale Bündelausgleichung. ★ Lücke (e)) ──────────────────────────────────── #
- L176 — ★ Lücke (d): Die Bildpunkte von camera_calibration sind (row, col). project_points sind (x, y).
- L304 — ★ Lücke (b): reprojection_error kennt die Verzerrung nicht. Selbst wenn man die wahren Werte übergibt, wird es nicht 0.
- L525 — 2. ★ Der Hauptpunkt: Der Reprojektions-RMS ist nahezu gleich, doch der fx-Fehler unterscheidet sich um mehr als eine Größenordnung
- L533 — 3. ★ Der Kompensationsmechanismus: Das Verhältnis von fx stimmt mit dem Verhältnis von Z überein
- L539 — 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)
- L555 — ★ 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).
- L563 — 5b. ★ Lücke (c3): Die geschlossene Form weicht systematisch um den Betrag der Verzerrung ab (nur als Startwert)
- L567 — 6. ★ Lücke (b): reprojection_error kennt die Verzerrung nicht -> selbst wenn man die wahren Werte übergibt, bleibt er groß
- L573 — 7. ★ Lücke (a): Die Schätzung der intrinsischen Parameter ist von der Fassade aus nicht sichtbar
examples/poc_cell_counting.py
- L853 — ★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).
- L1041 — ★Die Überschrift dieses PoC. An der Stelle, wo die Bias-Linie 0 kreuzt, ist der Segmentierungsfehler kein Tal.
- L1330 — ★Über-Verschmelzung und Auslassung sind zweierlei —— was zusammenklebt, ist nicht “verschwunden”
- L1358 — ★Das optimale h bewegt sich mit der Dichte (es bewegt sich immer nach entweder dem Bias-Kriterium oder dem Eins-zu-eins-Kriterium)
- L1361 — (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.
- L1387 — ★Das kleinste h, das man angeben kann, steigt mit dem Größenverhältnis (eine durch die Spezifikation des Werkzeugs bedingte Skalenkopplung)
- L1427 — (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
- L568 — ★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).
- L947 — ★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).
- L1006 — ★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.
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_compound_eye.py
- L301 (ja) — ★PoC の門(tests/test_poc_scripts_run.py)は exit 0 に加えて “PASS” の印字を 要求する(合否を計算したのに捨てる門を防ぐ規約)。以前は “OK:” と書いていて、 台帳に登録した瞬間に「exit 0 だが PASS を印字していない」で落ちた。
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”.
- L971 — ★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.
- L980 — ★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.
- L1007 — ★Kontrollgruppe: wende dieselbe Formel auf die wahren Normalen an (die der Puffer enthält).
- L1136 — ★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.
- L917 — ★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).
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.
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_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
- L491 — 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).
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
- L408 — ★Ein Hin- und Rücklauf kann “beide in dieselbe Richtung falsch” nicht ausschließen. Gegen eine unabhängige Implementierung abgleichen.
-
| L437 — ★Vorhersage (vor dem Messen gedruckt): Die Neigung ist atan |
∇H |
. Mit h wird es atan |
∇H+∇N |
. |
- L464 — ★Trenne die maximale Differenz zwischen Vorhersage und Messung in ‘Modellfehler’ vs. ‘Diskretisierung’. Verfeinere die Zellen.
-
| L584 — ★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. |
-
| L644 — ★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. |
- L1106 — ★Nur bei
vertical liefert op_find 5 Treffer. Kein einziger ist relevant (Stamm-Übereinstimmungen wie boundary_vertices) —— behaupte nie anhand der Anzahl, es ‘existiere’.
examples/poc_interferometry_step.py
- L159 — 3) ★Wiederholte Messung — Verzerrung von Streuung trennen # —————————————————————— #
- L202 — 4) ★Vergleich mit dem Nullpunkt (die maximale Probe der Einhüllenden) # —————————————————————— #
- L274 — 6) ★Rausch-Sweep — wo die Messung zusammenbricht # —————————————————————— #
- L314 — ★Eine kleine Streuung ist kein Beleg für Korrektheit
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_lidar_terrain_change.py
- L406 — ★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.
- L694 — ★Eine Zahl nahe am wahren Wert ist nicht zwangsläufig ‘korrekt’ —— zähle die zwei entgegengesetzten Fehler getrennt
- L823 — ★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).
- L826 — ★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).
- L946 — — ★ Genau um den Betrag, den du wegjustierst, verschwindet die Änderung ————————————– #
examples/poc_lightfield_depth.py
- L594 — 2b. ★ Lücke (d): der docstring sagt 0-d, tatsächlich ist es (1,)
- L610 — 6. ★ Lücke (a): das voreingestellte linear zieht 1.15 in Richtung 1.0, cubic nicht
- L634 — 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
- L1032 — ★3 und 6 Kameras liefern exakt dieselbe Menge an Tangenten (in Parallelprojektion fallen zwei gegenüberliegende zusammen)
- L1040 — ★Ungerade 13 Kameras schlagen gerade 16
- L1054 — ★Eine 3-D-konvexe Hülle ist kein Ersatz für die ‘konvexe Hülle des Querschnitts’ (sie verfehlt den Brustumfang deutlich)
- L1057 — ★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_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_multibeam_bathymetry.py
- L518 — 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.
- L546 — ★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).
- L703 — ★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.
- L706 — ★
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.
- L1125 — ★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.
- L1196 — ★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’.
- L1267 — ★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.
- L1301 — ★
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.
- L1428 — ★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_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
- L108 — ★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_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_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 件に限り、それ以外が現れたら今までどおり鳴る。 「語で引く穴の固定」は、無関係の族が同じ語を使った瞬間に偽陽性になる、という実例。
- L1316 — ★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).
- L1339 — ★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.
- L808 — ★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”.
- L482 — ★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.
- L711 — ★Der Preis des Modulmedians —— blind für eine Anomalie eines ganzen Moduls
- L1169 — ★
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_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).
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
- L656 — ★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.
- L836 — ★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.
- L847 — ★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_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_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_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_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
- L698 — ★Je nach Maßstab wechselt der Sieger: Volumen nutzt eine horizontale Grundfläche, der Schwerpunkt eine Ebenenanpassung
- L714 — ★Eine Vorhersage, die danebenlag: die Interpolation unterschätzt nicht, sondern überschätzt
- L717 — ★Auslöschung: mit dem interpolierten Umfang wirkt der Fehler klein, mit nur den sichtbaren Punkten kehrt er zurück
- L726 — ★Eine Lücke im Werkzeug. Diese Stelle schlägt an, sobald dem_viewshed behoben ist (das ist der Zweck)
- L728 — ★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
- L272 — ★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_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.
- L326 — ★ Lücke (d): ein öffentlicher op würde hier stillschweigend [0,0,0] zurückgeben. Stattdessen explizit einen Fehler zurückgeben.
- L1138 — (2) Der Nullpunkt hat einen Boden – Quantisierung ganzzahliger Koordinaten (★ Lücke b)
- L1168 — (9) ★ Thema: Stärken und Schwächen der Konfidenz kehren sich je nach Bedingung um
- L1172 — ★ Die Kanten, an denen sie jeweils gut sind, sind entgegengesetzt = man kann nicht eines von beiden als Konfidenz wählen
examples/poc_thermal_radiometry.py
- L507 — ★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.
- L528 — ★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.
- L757 — ★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.
- L767 — ★
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.
- L821 — ★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.
- L1154 — ★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.
- L1257 — ★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.
- L1331 — ★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.
- L1378 — ★Die Korrektur beseitigt den Bias, vervielfacht aber das Rauschen um 1/ε. Deshalb ist in Abbildung (d) nur die Schraube körnig.
- L1450 — ★
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.
- L1600 — 3. ★Eine Vorhersage, die danebenlag: der absolute Fehler ist bei höherer Temperatur größer
- L1602 — ★Selbst bei geändertem Maßstab divergiert der Emissionsgradfehler nicht mit dem Anstiegsverhältnis (er sättigt in Δε/ε)
- L1605 — ★Was divergiert, ist die reflektierte scheinbare Temperatur (je kleiner der Anstieg, desto stärker springt sie)
- L1618 — 6. ★★Überdeckungsrate. Am Boden (ρ=0) sind RSS und MC beide 95 %; mit Korrelation fällt RSS ab
- L1622 — ★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”.
- L1638 — 7. ★Die Fehltreffer neigen zu einer Seite (symmetrisches ±k·u verfehlt eine schiefe Verteilung)
- L1642 — 8. ★★guard band: Falsch-Bestehen ist Ignorieren > RSS > MC, Falsch-Durchfallen umgekehrt
- L1662 — ★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.
- L142 — 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).
- L177 — ★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.
- L235 — ★Den Befund festhalten. Dies ist eine Nahe-Null-Kontrollrechnung, bricht sie zusammen, ist die Implementierung kaputt.
- L249 — ★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.
- L267 — ★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.
- L302 — ★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”.
- L332 — ★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).
- L362 — ★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.
- L409 — ★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’.
- L419 — ★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. —————————————————————— #
- L440 — ★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 %).
- L528 — ★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.
- L575 — ★Lampenspiegelung. Diese hat Struktur auf derselben Skala wie der Defekt.
- L602 — ★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.
- L683 — ★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_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_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_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_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/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/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/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).
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.
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).
flyvision.py
- L187 (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.
fscript.py
- L1269 (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 横断で見る。
- L630 (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 連結を注入したのに一切検出されず、掘ったら 注入のほうが効いていなかった、という経路で見つかった。)
- L723 (ja) — ★契約 R-1(fullseye_abi.h): 失敗した演算子は「何も見つからなかった」演算子と 区別できなければならない。逆さの区間は呼び手の間違いであって、「空を寄こせ」 という正当な指定ではない —— 黙って空の Region を返すと、しきい値の計算を 間違えたレシピが「不良ゼロ」として通る。2026-09-14、同じ契約の Rust 実装が FS_E_INVALID_ARG を返すのにこちらは空を返す、という差分で見つかった。
- L743 (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
- L531 — ★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).
fullseye/mcp/catalog.py
- L104 (ja) — ★5 層。最初は 4 層で組み、「索引にもレジストリにも facade にも無いノート」が 480 枚残った。残骸かと思ったら 480 / 480 が
fullseye.ledger で解決した (型付き台帳。レジストリでは tb_project、台帳では project のように接頭辞が 違う)。「無い」と言う前に全層を引く —— 4 層目まで引いて止めていたら、実在する 480 個の機能を残骸と呼んでいた。
- L318 (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 なので「飽和」が先に当たった。 より根本的な異常を先に言う: 非有限 → 定数 → 範囲外 → 飽和 → 平坦。
- L106 (ja) — ★飽和・平坦は image / color だけ。region は 0/1 が契約なので「飽和」ではない —— リファクタで region を含めてしまい、
--demo で otsu の出力が「飽和」と判定されて 小図が昇格した(2026-09-15 実測)。region の定数(空 / 全面)は上で拾う。
fullseye/mcp/handles.py
- L47 (ja) — ★thumb_dir を渡されたときに作っていなかった(mkdtemp のときだけ存在する)。 小図の保存が FileNotFoundError で落ち、テスト 4 件で発覚(2026-09-15)。
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).
honest_summary.py
- L58 — ★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.
- L77 — ★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.
imgevolve.py
- L50 — ★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.
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.
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.
- L296 — ★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
- L297 — ★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.
- L1633 — ★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.
- L1848 — ★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).
- L2810 — ★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.
- L2821 — ★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).
- L2866 — ★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.
- L3117 — ★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.
- L624 (ja) — ★ここを「もう片端が次数 3 以上」と書いていた最初の版は、実測で 一度も発火しなかった: ヒゲの根元が枝の端点クラスタと 26 近傍で 融合して次数 2 になる配置が普通にあり、その場合に素通りしていた (「刈った」と報告しながら 0 本という、いちばん静かな失敗)。
occupancy.py
- L223 — ★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.
- L317 — ★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.
opassist.py
- L50 — ★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.
- L242 — ★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.
- L357 — ★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.
- L454 — ★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.
- L610 — ★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.
- L730 — 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).
- L783 — 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.
- L793 — 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.
- L889 — ★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).
ops.py
- L628 — ★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).
- L1498 — ★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).
ops3d.py
- L375 — ★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.
- L465 (ja) — ★新しい sort は作らない: ノード表と枝表は「単位も意味も違う 2 つの表」で、 タプルで返して adapter に
r[0] と書くと 枝表を黙って捨てる (pose_error / m3c2_distance で繰り返した失敗の型)。1 つの dict に 両方を入れれば宣言 ‘table’ が実返りと一致し、捨てるものが無い。
- L616 — ★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).
- L637 (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 に渡ると意味を失う。
- L727 — ★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.
- L882 — ★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
- L920 — ★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).
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”). |
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
- L62 (ja) — ★ 重みは公開しない:
fly_hex_resample の個眼×画素の重み行列は functools.lru_cache で内部にだけ保持し、op の入出力型には現さない —— 出すと「画素座標系に依存する巨大な派生物」が型プールを汚し、下流の 2-D op が それを画像と取り違えて黙って処理してしまう(zscan を video に渡すと通る、と 同じ事故の型)。出さないことでこの取り違えを構造的に不可能にする。
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.
opsoptics.py
- L125 (ja) — ★ pupil_blur は「画像 × カーネル」の一般畳み込み(filters_freq.convol_fft) ではない —— PSF の標本間隔 λN/oversample を検出器ピッチへ面積積分して から畳む、その単位合わせが本体。だから PSF を作る側に置く。
- L140 — ★ 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).
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 2 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.
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.
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.
pcseg.py
- L448 — ★
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.
pivops.py
- L470 — ★ 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.
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.
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
- L269 — ★ 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.
- L276 — ★ 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).
- L642 — ★ 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.
- L653 — ★ 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).
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.
- L90 — ★ 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).
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.
- L1080 — ★ 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.
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.
scene_registry.py
- L19 (ja) — ★配布物にローカル絶対パスを焼き込まない。ここは自分のマシンの作業物を指していた ので、他人が pip install した環境では黙って落ちる(しかも「場面が無い」ではなく 「その場面だけ静かに欠ける」形で)。環境変数で受け、未設定ならその場面を登録しない = 在ると偽らない。
loco_mujoco は入っていれば自分で在り処を知っているので探す。
sdf_ops.py
- L293 — ★ 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. # ————————————————————————— #
specops.py
- L810 — ★ 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.
- L842 — ★ 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).
studio.py
- L273 — ★ 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).
- L6119 — ★ 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).
- L6275 — ★ 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).
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 は非連結を撃つ探針。
- L263 (ja) — ★特異行列は必ず置く。 一度ここから外しかけたが、それは誤りだった ——
tb_mat_cond が特異行列で inf を返すのは契約どおりで、ops.py の NONFINITE_IS_MEANINGFUL に「厳密に特異な行列は s_min=0 なので inf が 正しい答え。有限に潰すと『十分に良条件』と読めてしまう」と既に宣言済み だった。落ちていたのは op ではなく、有限性ゲートがその台帳を見ていない こと。探針を削って緑にするのは、欠陥を隠す行為。 (同じ註に 2026-09-05 の教訓が書いてある ——「自分の probe では特異行列を 作っていなかったので tb_mat_cond を取りこぼした」。探針から外すのは その取りこぼしをわざと再現することになる。)
- L381 (ja) — ★新規(2026-09-14): ここまで探針が無く、契約ゲートを一度も通っていなかった 5 sort = 101 op。残る 6 sort(video / qimage / cimage / lightfield / beatcube = 50 op)は形が複素・4-D で退化形の設計に手間が要るため、 一度に全部入れて切り分け不能にしないよう次の段で足す。
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_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_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_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).
tests/test_blob2d.py
- L442 — ★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_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
- L64 — ★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 — ★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).
- L260 — ★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. ————————————————————————— #
- L267 — ★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).
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.
- L457 — ★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_dsp.py
- L338 — ★Das Maximum ist die Harmonische: period / (1/f_max_bin) landet nahe einer ganzen Zahl
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.
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_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_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_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_mcp_images.py
- L312 (ja) — ★最初
ones + inf にしていて、有限部が定数なので免除 op でも「定数」判定になり 落ちた —— それは診断器が正しい。確かめたいのは「免除 op なら非有限を異常と 言わない」だけなので、有限部に変化のある入力にする。
tests/test_mcp_server.py
- L57 (ja) — ★引数名を
name にしていて _call(4, "fullseye_op_help", name="gaussian") が TypeError になり、subprocess の実 stdio 往復が 1 度も走らないまま 23 件が緑だった(2026-09-15)。走らなかった検査は無いのと同じ。
- L105 (ja) — ★最初
gaussian が先頭と決めつけて落ちた。gauss_filter と gaussian は同じ HALCON 別名を共有する別 op で、api.find_op は name == halcon の正典を優先する。 検索もその規約に揃えたので、正典が先頭・gaussian が上位に居ることを見る。
- L249 (ja) — ★以前の被験者は台帳経由で索引に入ったこと(= 索引が台帳を数えている)も見る
- L316 (ja) — ★同日実測: 4 層で 480 枚が「どこにも無いノート」に見えたが、5 層目(ledger)で 480 / 480 が解決した。ここが 0 でなくなったら、まず引き忘れた層を疑うこと ([[feedback_search_all_tiers_before_declaring_a_gap]])。ノートの残骸と決めつけない。
tests/test_no_local_paths_in_shipped_code.py
- L22 — ★
tomllib gibt es ab Python 3.11. Ein nackter import am Modulanfang bricht auf 3.10 die Sammlung ab, und kein einziger Test läuft —— direkt nachdem ich am 2026-09-05 mit hypothesis in dieselbe Falle trat, habe ich es in dieser Prüfung reproduziert (CI py3.10 collection error). Import-Fehler immer auf skip herabstufen.
- L53 (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
- L52 (ja) — ★2026-09-14 実測: 901 op 中 151 本(16.8 %) がこの状態で、空ループを 1 周 しただけで緑を返していた —— 「門が判定を計算した直後に捨てる」の親戚で、 こちらは 判定を一度も計算しない。まず skip で見えるようにし、
test_probeless_ops_do_not_grow で本数を台帳に固定する(減る分には通る)。
- L56 (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 たちは「登録されているのに一度も実行されない」状態に戻る。
- L98 (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 の教訓が書いてある。
tests/test_op_discovery.py
-
| L229 — ★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).
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).
- L192 — ★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).
- L1178 — ★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_packaging_foundation.py
- L170 — ★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).
- L91 — ★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).
- L100 — ★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.
- L122 — ★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_public_reachability.py
- L71 (ja) — ★2026-09-14: この 13 本は 2026-09-05 から wheel に入っていなかったもので、 py-modules へ足した結果ここに現れた。演算子としては
unified._3DGS_OPS が _lazy_call(モジュール名, 関数名) で文字列から登録しているので、利用者には fullseye.op.<名前> 経由で届く。ここに残る 1〜6 本は各モジュールのデモ入口 (render_*_gif など)で、op ではなく絵を作る側。だから内部専用に置く。 —— 「配布から消えていた」を直すと「公開経路から見えない」が現れる、という 二段構えだった([[feedback_registered_only_gates_miss_unregistered]])。
- L88 (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。 表は空でも残す —— 「出すべきなのに出ていない」ものが次に現れたときの器。名前>
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_rust_abi_parity.py
- L402 (ja) — ★契約では FS_E_INVALID_ARG(引数が定義域の外)であって FS_E_TYPE ではない。
FsValueError を足すまでは両方 FsTypeError で、Rust が 1 を返すのに Python は 2 相当を投げる、という状態コードの食い違いが残っていた。
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_studio.py
- L920 — ★
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.
- L2029 — ★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.
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_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). |
- L43 — ★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.
- L256 — 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).
- L864 — ★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).
- L1557 — ★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.
- L1667 — ★”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).
- 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).
- L37 — 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).
- L45 — ★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.
- L79 — ★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 :
- L81 — uebrig, und im Artefakt erscheint “: ★…” (ist tatsaechlich passiert). Streife
: hier ebenfalls ab.
- L105 — ★Wenn das naechste ★ kommt, schneide es als separaten Block ab (ein Anspruch pro Block).
- L197 — ★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”.
- L280 — ★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).
- L290 — ★
__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.
- L339 — ★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.
- L490 (ja) — ★2026-09-14: 長らく かな だけを見ていたので、「Studio 北極星」「実測記録」 のように 漢字だけで書かれた題に印が付かなかった —— 非日本語版の読者は それを英語の題だと思ってクリックする(印を付けないのは「読めない」という 事実を隠すことで、無訳より悪い、というのがこの関数の趣旨そのもの)。 題は常に日本語版ファイルから取る(
_doc_title(rel))ので、漢字を足しても 中国語の題を誤って日本語と呼ぶことは起きない。
- L655 (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.
- L194 — ★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).
- L153 — ★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”.
- L105 — ★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).
- L115 (ja) — ★2026-09-13: op が evolute 検証を得て厳格化。ECEF は地球表面(中心から ~6.4M m)の 座標を要るが、画像由来の合成点は原点付近で必ず楕円体の evolute 内に落ちるため 正しく拒否される(実データでは動く。合成入力では図を作れない恒久的な定義域ミスマッチ)。
- L127 — ★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).
- L730 — ★”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.
- 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 gab das Zentrum nicht zurueck). Alle 3 Komponenten sind [0,1]-normiert, um nicht von der Aufloesung abzuhaengen, also zum Zurueckrechnen in Pixel: Zeile ×(H-1) / Spalte ×(W-1). Hier zeichnen wir das zurueckgerechnete Zentrum in das Bild ein, sodass sichtbar wird, dass der Rueckgabewert wirklich das Zentrum ist.
- L1712 — ★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.
- L1950 — ★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).
- L2065 — ★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.
- 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).
- 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.
- 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).
- 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.
- L105 — ★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.
- L790 — ★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.
- L832 — ★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.
- L855 — ★ 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).
- L1075 — ★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.
- L1094 — ★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**.
- L1455 — ★ 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.
- L1500 — ★ 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).
- L119 — ★ 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.
- L313 — ★
--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.
- L54 — ★Das einzige generierte Artefakt außerhalb von
tools/. Genau deshalb wurde es übersehen — wer Generatoren unter tools/*.py sucht, findet dieses nie.
- L77 — * ★ 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.
- L167 — ★Ein generiertes Artefakt außerhalb von
tools/. Wer nur tools/*.py durchläuft, findet es nie — docs/OP_INDEX.json wurde tatsächlich übersehen.
typed_catalog.py
- L217 — ★ 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.
- L271 — ★ 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.
- L459 — ★ 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.
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
- L123 — ★ 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).
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.