fullseye

write_image が書けなかった事実を捨てて無言で戻り、uint16 が 8 bit に潰れ、読めない理由が全部「無い」だった

症状

GenSpark 第 18・19 報(N75 / N76 / N77 / N78 / N79、N72 の同族、N81 の音声分)。全部 master で再現した。

なぜ門が通したか

直し

  1. facade は imgio に委譲: read_image → imgio.load、write_image → imgio.save(depth を通す)。
  2. imgio.save は書く前に止める: 拡張子なし → ValueError、書けない拡張子 → OSError(この環境で書ける一覧つき、writable_extensions())、親ディレクトリ不在 → FileNotFoundError(ディレクトリは作らない、と文で言う)。.ppm の灰は 3 ch に複製、.pgm に色は ValueError。cv2 の失敗は dtype とチャネル数を添えた 1 文。
  3. 深度: depth=None は dtype を尊重 —— uint16 は 16 bit(PNG / TIFF)、それ以外は 8 bit。float の既定は 8 bit = 256 段階と文書化(往復誤差 1/510)。depth=16(PNG / TIFF、1/131070)、depth="float"(PFM / TIFF、float32、~1e-7)。対応しない拡張子との組は ValueError。
  4. imgio.load: None / 空 → TypeError、ディレクトリ → IsADirectoryError、無い → FileNotFoundError("no such image file")、読めない → ValueError(従来)。
  5. ops._norm は 0 要素をそのまま返す。dsp の読み手は不在で FileNotFoundError("read_wav: no such file: …")、ディレクトリで IsADirectoryError。

同じ報で設計・次回として分けたもの:

指摘 判断 理由
N75 float 保存に警告を出す 採らない(文書化) 8 bit は画像ファイルの既定の契約で、毎回の warn は産業ラインでは雑音。段階数と depth を docstring に明記し、無損失の口を足した
N79 親ディレクトリを作る 採らない 書き先を黙って作るのは副作用。無いことを 1 文で言う
N80 run_pipeline([A, B], ["add_image"])(第 19 報) 次回候補 第 7 陣で「段は 1 入力」と決めたが、先頭段だけ n-ary を受けてリストを消費する拡張は apply の規約と整合する。engine / CLI run と一緒に別の回で
N81 read_* の流儀 3 種(第 19 報) 次回候補(音声分は済) read_depth / read_mesh の文を雛形に read_envi / read_frames / read_gltf / read_las / read_pcd / read_pfm / read_volume を揃える
N82 退化入力の層ごとの不揃い(第 19 報) 0.2.0 のみ master は入口の門で一様(test_empty_input_contract_is_uniform_across_ops)
N83 has の「not in the HALCON reference」(第 19 報) 0.2.0 のみ 第 3 陣で「neither an op name, a HALCON alias, nor a HALCON reference operator」に直し済み。rc は argparse の使い方誤り = 2、アプリの失敗 = 1 の 2 段で、揃えない
N65 --version が rc 2(第 19 報の再確認) 0.2.0 のみ 第 6 陣で action="version"
fullseye.engine が無い(第 19 報) 設計 エンジンは fullseye.FullseyeEngine(facade)。engine はトップレベルのモジュール名で、fullseye.engine という属性は元から無い