feat: Fabric pin を v0.9.0rc4 へ上げ、局所拒否を生きたガードに戻す - #423
Merged
Merged
Conversation
Azazel-Fabric#52 は EffectObservation が名乗れる権限クラスを observed_fact と active_materialized の2つに限定した。非加法的変更で あり、rc3 で valid だった入力を rc4 は拒否する。Edge は effect_observation_reader が同じ4クラスを既に局所拒否していたため 実運用への影響はない。 pin は rc3 を飛ばして rc2 -> rc4 とする。rc3 は型付き参照の本体に コロンを許す変更で、Edge が発行する edge:nft:1 は rc2 の文法では 型付きスロットすべてに拒否されていた。rc3 も Edge にとって任意ではなく、 同じ移動で入る。 局所拒否が到達不能になっていたため、モデル構築の前に移した。 EffectObservation の構築が先に走るため rc4 導入後は Fabric が先に拒否し、 Fabric 不在時は read_effect_observation が早期 return する。つまり どちらの構成でも一度も走らないガードだった。前に移すことで、 操作者は pydantic のダンプではなく Edge の文章を読む。また AuthorityClass の次の変更が今回と同じ向きに狭まる保証はない。 未知の権限値は最弱クラスへ強制せず、そのまま拒否理由に出す。強制は Fabric 側では正しい(未知の入力が昇格してはならない)が、この境界では payload が名乗っていないクラスを理由に挙げることになり、操作者が 存在しない記録を探しに行く。 テスト: 「契約はこれを通す」と断言していた4件は反転させた。ギャップを 記録する仕事を終えたテストとして正しい結末である。局所集合と Fabric の OBSERVABLE_AUTHORITY_CLASSES の一致、AuthorityClass からの列挙による 補集合の拒否、順序が load-bearing であることを固定するテストを追加した。 pydantic は直接 import しない。Fabric extra 経由でしか入らず Edge は 宣言していないため、例外クラスは Fabric の実挙動から導出する。 依存契約テストの許可リストを緩めるのは方向が逆である。 tests 全体 866 passed / 4 skipped、compileall OK。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SsboPSj6GyJju6mTXwHHjq
pin は主張である。何が入ったかは別の事実であり、この差を見るものが 無かった。 計測から書いた。v0.9.0rc4 への移行準備中にタグが2度誤ったコミットで 切られ、2度目は本リポジトリの CI がそれを導入して成功を報告した。 Running command git checkout -q ca05d5ab2b8e3f7c959c3966d7c04b1d9412a327 Created wheel for azazel-fabric: filename=azazel_fabric-0.9.0rc4.dev0-... Successfully installed ... azazel-fabric-0.9.0rc4.dev0 ... 866 passed, 4 skipped タグが変更のマージコミットを指していたため、コードは正しく、挙動の テストはすべて通った。誤っていたのはリリースの側である。版数 0.9.0rc4.dev0、digest manifest 無し、署名無し。開発版がリリースタグを 着て入り、Edge にはそれを見る手段が無かった。 requirements/fabric.txt は「an exact tagged release, never a branch and never a development commit」と方針を述べ、 test_defensive_state_vocabulary.py はその「ファイルがそう書いているか」 を検査している。どちらも「何が届いたか」を問わない。 等価比較にしてある。0.9.0rc4.dev0 は 0.9.0rc4 で始まるため、 startswith や前方一致で書けば、このテストが拒否すべき当のビルドを 素通りさせる。.dev0 こそが差分である。 誤ったビルド(3a9543a)を実際に導入して2本とも赤くなることを確認した。 tests 全体 869 passed / 4 skipped、compileall OK。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SsboPSj6GyJju6mTXwHHjq
Owner
Author
タグは訂正済み、CI の赤の原因は解消しました
追加のガード — この PR で直接扱うべき欠落が 1 つ判明しましたこの PR の最初の CI 実行が、誤ったタグを導入して成功を報告しました。推測ではなく、ジョブログの実測です。 誤ったタグは変更のマージコミットを指していたため、コードは正しく、挙動のテストはすべて通りました。誤っていたのはリリースの側です — 版数
等価比較である理由
実物で確認しました誤ったビルド( 正しいタグに戻すと 3 件とも通ります。 検証(ローカル、
|
01rabbit
marked this pull request as ready for review
September 20, 2026 14:08
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
⚠ CI はタグが直るまで赤です
v0.9.0rc4タグが誤ったコミット(3a9543a= PR #53、version.pyが0.9.0rc4.dev0で manifest も署名も不在)を指しております。正しい対象は Azazel-Fabric の0c85091です。タグ訂正後に CI を再実行すれば緑になります。ローカルでは0c85091を導入して全緑を確認済みです(866 passed / 4 skipped)。何を
Fabric pin を rc2 → rc4(rc3 を飛ばす)。
EffectObservationが名乗れる権限クラスを 2 つに限定(Azazel-Fabric#52)。非加法的。Edge はeffect_observation_readerが同じ 4 クラスを既に局所拒否していたため実運用への影響なしedge:nft:1は rc2 の文法では型付きスロットすべてに拒否されていたため、rc3 も Edge にとって任意ではない発見 — 局所拒否はどちらの構成でも走っていなかった
マスターのご指示は「Edge 側の局所拒否は維持」でした。維持しようとして、それが到達不能であることが判明しました。
Fabric 不在時も
read_effect_observationが早期 return するため、どちらの構成でも一度も走らないガードでした。モデル構築の前へ移しました。これで:
AuthorityClassの次の変更が今回と同じ向きに狭まる保証はない。一度狭まったことは、次も狭まる理由にならない未知の権限値は最弱クラスへ強制せず、そのまま拒否理由に出します。強制は Fabric 側では正しい(未知の入力が昇格してはならない)ものの、この境界では payload が名乗っていないクラスを理由に挙げることになり、操作者が存在しない記録を探しに行きます。
テスト
「契約はこれを通す」と断言していた 4 件(
assert EffectObservation(**payload))を反転させました。ギャップを記録する仕事を終えたテストとして正しい結末です。その断言こそが Fabric#52 になった計測でした。追加:
..._agree_with_fabrics_exactlyOBSERVABLE_AUTHORITY_CLASSES。従来の「真部分集合」では、Edge 側が要素を失っても通る..._still_partition_the_enum_between_themAuthorityClassから列挙した補集合を Edge が拒否する。将来 Fabric に追加されたクラスが見える..._reaches_the_operator_before_fabrics_does..._refused_as_what_it_saidOBSERVER_AUTHORITY_CLASSESは import せず literal のままです。これは意図的な重複であり、意図的な重複とはテストが下にあるもののことです。Azazel-Edge#413 が見つけた「維持の偶然」——Fabric のモデルとフィールド単位で一致する局所 dataclass を何も比較していなかった——との違いはそこだけです。pydanticを直接 import しないValidationErrorを import したところtest_runtime_dependency_contractが発火しました。pydanticは Fabric extra 経由でしか入らず Edge は宣言していません。依存契約テストの許可リストを緩めるのは方向が逆ですので、例外クラスを Fabric の実挙動から導出しました。導出時のelse分岐も生きたガードです(Fabric が空 payload を受理するようになれば、この file の拒否テスト全体が無意味化する前に赤くなります)。変異試験
active_materializedを落とすproducer_decision_refを足すstale_or_unknownに強制検証(ローカル、Fabric
0c85091導入下)🤖 Generated with Claude Code
https://claude.ai/code/session_01SsboPSj6GyJju6mTXwHHjq
Generated by Claude Code