noraneko-registry
noraneko の drop(コード一つで降ってくる機能。actor の xpi = 入れ物 + JSWindowActor、Firefox の about:newtab と同じ形)の台帳。 「誰かの判があるから入れる」ではなく、「入れる本人が中身を見られる」を一番前に置く。 ここの判は証言であって、門番ではない。
形
registry の中で完結する。drop の source そのものがここに置かれ、build もここで行い、判もここが押す。外の repo は使わない。
- 作者は PR に
drops/<name>/drop.toml(uuid、name、note、連絡先、actors)とdrops/<name>/src/<actor>/actor.tsを置く。 PR の diff がそのまま「実際に xpi になる source」なので、レビューはそれを読む。 正体はuuid(uuidgenで一つ振る。一度振ったら変えない)、nameは札(dir と同じ。この registry の中で一つ)。 Julia の General と同じ絵: 別の registry に同じ名前があっても、uuid が違えば別のもの。 - CI が
tooling/(noraneko から vendor した build の道具、commit を pin)で build する(reproducible)。 - 人がレビューする(この repo の main への PR レビューが門)。
- main に入ると、CI が build し、manifest に連絡先を写し、registry の identity で
manifest.jsonに keyless の判を押して、 xpi と一緒にdl.f3liz.casa/drop/<uuid>に POST する。置く側(Cloudflare Worker)がその判と xpi の sha256 と uuid を確かめてから B2 に書き、配るときも判が通るものだけ返す。この repo は B2 の鍵を持たない(判そのものが門)。attestations.jsonに Rekor と run のリンク。 manifest のsourceは「この registry の、この commit の、drops/<name>/src」。xpi の中にも source が同梱される。 - ブラウザ(noraneko)は registry の一覧を持つ(既定はこの repo。設定で足せる・外せる: iOS の代替ストアと同じ絵)。 uuid を入れると(一覧の registry に順に訊いて、持っているところから落とす)、整合性(sha256)と「その registry の identity で押されているか」を確かめて、 権限シート、source、実際に実行されるファイル、連絡先を見せる。合っていれば緑、違えば赤(止めない)。それから本人が「入れる」。
置きかた
drops/<name>/drop.toml uuid / name / note / contact / actors(PR に要るのはこれと src/)
drops/<name>/src/<actor>/actor.ts 実際に xpi になる source
drops/<name>/manifest.json build の産物 + 連絡先(main で CI が書く)
drops/<name>/manifest.json.sigstore.json registry の判(main で CI が押す)
drops/<name>/attestations.json 判とリンクの一覧(CI が書く)
tooling/ build の道具(noraneko から vendor。tooling/VENDORED.md に commit)
drops/std-actor/src/lib/ drop の殻(logic の三つの door を呼んで、view を描き、effect を carry out する)。
lib なので、どの drop の xpi にも入らない -- 配られるのは一枚だけ
trusted_root.json sigstore の trust root(sigstore/root-signing の pin)
ブラウザが持つこの registry の情報:
name = "f3liz"
base = "https://dl.f3liz.casa/drop" → <base>/<uuid>/manifest.json
identity = "https://github.com/f3liz-casa/noraneko-registry/.github/workflows/verify-and-sign.yml@refs/heads/main"
issuer = "https://token.actions.githubusercontent.com"
自分の registry を建てるなら、この repo を fork して、base(配る URL)と identity(自分の workflow)を
ブラウザの「レジストリを足す」に書く。信用の根は、その registry の main を誰がレビューするか。
手元で
mise install
npm install
mise exec -- ruby scripts/dev.rb drops/<name> # 書いているあいだの輪(見張って、組んで、棚に置く)
mise exec -- ruby scripts/build.rb drops/<name> # 一度だけ組む。_build/<name>/ に xpi と manifest
node scripts/verify.mjs drops/<name>/manifest.json.sigstore.json drops/<name>/manifest.json <registry の identity>
scripts/dev.rb:drops/<name>/と殻を見張って、変わったらbuild.rb --devで組み直し、shelf.rbで手元の棚に置く。--devは版に四つ目(組み直した印)を足すので、同じ版のまま bytes だけ替わることがない ── ブラウザを建て直さずに見られる。CI はこの旗を通らない(reproducible の約束はそのまま)。scripts/build.rb:tooling/webext-actorsとdrops/<name>/srcを_stage/に並べて build し、scripts/build-drop.rbで xpi に。 手でなぞれる手順はdocs/BUILD.md。踏んだ穴はdocs/TRAPS.md。drop をはじめて作る人はdocs/GUIDE.md。 置きかた(外したとき元に戻る約束)と層、依存関係と compat はdocs/LAYERS.md。scripts/verify.mjs: 公式の@sigstore/verify(Node)。Fulcio の chain、Rekor v1/v2、TSA、SCT まで。- ブラウザの中の verifier は
@freedomofpress/sigstore-browser(noraneko のmodules/sigstore/)。
信用の根
静的な「信用する identity の一覧」は持たない。判の「誰か」は drop.toml に書いてあるそのままで、
それを読んで通すかどうかは、この repo の main への PR レビューで人が決める。
- main は直 push 不可。PR 必須、コミット署名必須、CI(build)が緑であること。
- 判を押す job は environment
registry(required reviewer = 管理者)。main に入っても、管理者が承認するまで判は押されない。 PR の中では id-token が無いので判は押せない。fork からの PR は毎回 承認が要る。 - ブラウザが見せるのは「作者の判(drop.toml の identity)と registry の判が同じ manifest に揃っているか」だけ。 誰を信じるかは、入れる本人。
trusted_root.jsonは registry が更新して配る。ブラウザは pin を持ち、更新はブラウザの更新で届く。- 「reproducible」は、同じ commit から Linux(CI)と手元(mac)で同じ bytes が出て初めて言える。 ずれたら、それが最初に直す所。