Skip to content

v0.6.15

Choose a tag to compare

@Driedsandwich Driedsandwich released this 14 Aug 10:27
· 87 commits to main since this release

v0.6.15 — toolVersion を 18 へ。止めた理由の名前が、ほぼすべての止まり方に付きます

⚠ 先に読むところ

1. toolVersion が 17 → 18 になります。受け手の分岐が変わります

v0.6.14 までの道具は、stableReasonCode(止めた理由の変わらない名前)を
archive 系の 2 つの status にしか付けていませんでした。
残る 4 つの止まり方は ${status}_OTHER へ落ちるだけで、機械では分岐できません。

                              v0.6.14                     v0.6.15
source を取れない        SOURCE_UNAVAILABLE_OTHER  →  SOURCE_DIRECTORY_MISSING など 8 種類
manifest を読めない      (名前なし)               →  MANIFEST_MISSING / _UNREADABLE / _NOT_JSON
入力 0 件                (名前なし)               →  MANIFEST_INPUTS_EMPTY
工程が終わっていない      入れ子の中にだけ            →  SCOPE_* を top-level へ 7 種類
記録と合わない            null                      →  MISMATCH_* 6 種類

*_OTHERnull で分岐している自動処理があれば、そこは直す必要があります。
OK のときは今までどおり null です。

止め方の名前は 55 → 80 種類になりました。一覧は同梱の
source-verifier-cli-result.v1.schema.jsonstableReasonCode.enum にあります。

v0.6.13 と v0.6.14 の道具は、それぞれ 16 と 17 を名乗ります。
v0.6.12 と v0.6.13 だけはどちらも 16 なので、tool.sha256 で見分けてください。

2. v0.6.14 で「一覧そのものを消しました」と書いたのは誤りでした

v0.6.14 の notes と作業指示:「A は検査を足すのではなく一覧そのものを消しました」
実測: 消したのは冒頭 28〜32 行の 5 種類版だけ。
      **正本 CLI_STATUS_META の 12 行上に、8 種類の手書き一覧が残っていた**
      ——しかも「同じ境界は 1 か所で持つ」と書いた同じコメント塊の中に。

同じ欠陥を直したと宣言しながら、同じファイルの中に同じ形を残していました。

あわせて 2 件。受け手向けのエラー文が v0.6.14 で消したファイル
scripts/reasonCodes.mjs)を指したままで、
SECURITY.md と配布ソースの版数境界は「v0.3.0 より前」のままでした
——ERRATA で notes を訂正したときに、この 3 か所を見落としています。

変異対照(2026-08-14)
  コメントから 1 status を消す      → 新たに落ちた試験 **0 件**
  SECURITY.md を v0.9.9 に書き換え  → **1236 件すべて緑**

文言は 1 か所も検査されていませんでした。

3. catalog に載せた止め方のうち 2 つは、一度も出ていませんでした

実測 2026-08-14(v0.6.14 の道具)
  FIFO を置いた directory   → ENTRY_TYPE_UNSUPPORTED
                              (SOURCE_SPECIAL_NODE は出ない)
  読めない directory        → SOURCE_UNAVAILABLE / SOURCE_UNAVAILABLE_OTHER
                              (catalog は ARCHIVE_UNSUPPORTED と宣言していた)

名前を足すのは無料ですが、受け手はその名前で分岐を書きます。
出ない名前を配るのは、来ない分岐を実装させることです。

訂正は
docs/ERRATA.md
気づいた方法と再現手順つきで積んでいます(今回で 12 件目まで)。


直し方 — 到達性を宣言させ、両方向で照合する

catalog の各項目に reachability を足しました。これは宣言です。
そのまま信じず、毎 run 実測と突き合わせます。

到達すると宣言した code   → この run で**実際に出た**ことを確かめる
到達しないと宣言した code → この run で**出ていない**ことを確かめる

片方向だけだと逃げ道が残ります——宣言を defensive-invariant へ書き換えるだけで、
どんな未配線 code も「合格」にできてしまう。

catalog 80 種類 = corpus 45 / cli-route 27 / defensive-invariant 8
この run で実際に出た 72 種類(残り 8 は「出ていない」ことも実測)

corpus は 182 個 19 種類 → 190 個 20 種類。足した 8 件は、
catalog に前から在ったのに材料が無く、一度も踏まれていなかった止め方です。

こちらで 1 件見つけました

SOURCE_ARCHIVE_MISSING(今回の新設)は到達しません。
存在しない path は、先に directory の判定が SOURCE_DIRECTORY_MISSING で止めるので、
loadFromArchive の存在検査は死んでいます。defensive-invariant として宣言しました。


archivePolicy の中身を、配布 schema が拘束するようにしました

v0.6.14 の schema は、欄の有無も値も検査していませんでした。
外部監査の反例 7 件を、自分の道具の実出力と自分の ajv で再現しています。

                                        v0.6.14    v0.6.15
覆っている範囲の一覧を消す                  適合    → 落ちる
中身を ['TOTALLY_FAKE'] に差し替える        適合    → 落ちる
acceptedTypeflags を偽値に                 適合    → 落ちる
endOfArchiveConvention を偽値に            適合    → 落ちる
limits を {} にする                        適合    → 落ちる
acceptedHeaderFormats を [] にする         適合    → 落ちる
stableReasonCode を TOTALLY_FAKE に        適合    → 落ちる
対照: status を enum の外へ                落ちる  → 落ちる
対照: archivePolicy ごと削除               落ちる  → 落ちる

policyId / policyVersion / policySha256 / coverage を足しました。

⚠️ policySha256 は改竄されていないことの証明にはなりません。
同じ道具が policy と digest の両方を書いているので、両方書き換えれば一致します。
捕まえられるのは、版を跨いだ取り違えと、途中で欠けた欄だけです。

schema を狭めましたが、版は据え置きです——版数判定器で
HOLD_RECORD(狭まった=据え置き可・要記録)と実測しました。


profileId が変わりました。lock を作り直してください

v0.6.14  trs-jack-3d:TRS|JACK-TRS:864677448069
v0.6.15  trs-jack-3d:TRS|JACK-TRS:1ee9fcdb2c88

v0.6.14  trs-jack-3d:TRS|JACK-TRRS:a5cf46509971
v0.6.15  trs-jack-3d:TRS|JACK-TRRS:2eb28f2d173e

この文書から転記せず、同梱の trs-jack-3d-release-index.v1.json から引いてください。

動いた原因は版数上げ(package-lock.json)です。モデルの数値は変わっていません。


まだやっていないこと

  • **実測が 1 件も来ていません。**ジャック内部の接点位置は全部仮定のままで、
    導通測定も音響測定もしていません(verifiedPhysicalfalse)。
  • core と CLI の分離をしていません。外部監査 P2 の指摘です。
    2,890 行の単一ファイルで、単体配布の制約は試験で強制されています。
    bundle 工程を足すと配布物と source の byte 一致を確かめる鎖をもう 1 本作る
    ことになり、
    これだけの変更を入れた直後に同じ版でやるのは危険だと判断しました。
    次の版の最初に、他の変更を混ぜずに着手します。
  • 「非 OK なら理由必須」を schema の条件節で書いていません。
    版数判定器が if/then/else を扱えず、入れると
    この schema の今後の差分がすべて判定不能(=無条件で版上げ)になります。
    規則は道具側と試験で担保しています。
  • BusyBox を oracle に足すこと。開発機にも CI にもありません。
  • annotated tag への署名。
  • 検算ツールの強化は試験した範囲までです。すべての細工に耐えることは示していません
    ——v5 から v16 までに計 33 件見落とし、v9〜v15 では正当な archive を拒みもしていました。
    v0.6.15 では、catalog に載せた止め方のうち 2 つが一度も出ていなかったことが分かっています。

数えたもの

v0.6.14 v0.6.15
単体テスト 1236 1304(skip 0 / 失敗 0)
壊れた tar の材料 182 個 19 種類 190 個 20 種類
うち実際に通る材料 72 72
止め方の名前(catalog) 55 種類 80 種類
うち corpus が踏む 37 種類 45 種類
うちこの run で実際に出た 未計測 72 種類
検証対象(validate:profiles 14 14
schema 23 23(BUMP 0)
記録された入力 32 32
検算ツール toolVersion 17 18
区間 / event TRS 23/32・TRRS 30/36 変わらず

変わっていないもの

  • **モデルの数値。**接点位置も走査結果も同じです。
  • verifiedPhysicalfalse。実測記録は依然 0 件です。
  • 過去 release の asset。v0.1.0 以降の 605 件すべて byte 一致であることを、
    再生成の段ごとに対照つきで実測しています。