feat: Edge が AZ-06 の EffectObservation を読み、契約が往復する - #421
Merged
Merged
Conversation
F-05 の消費者2つ目。effect_contracts は生産者2つを持ちながら消費者が0で、 レコードはシリアライズされたことしかなかった。R1c ゲートが問うているのは 両側が食い違わないかであり、**最初の読み取りこそが食い違いの表面化する場所** である。 Edge が effect を構築し(effect_export)、AZ-06 が実体化して観測を述べ (Azazel-Deception#48)、Edge がそれを読み返す。これで往復が閉じる。 engagement_advisory_client を意図的に写している。権限境界が同じだからである: - **レコード検証は fail-CLOSED。** 正準な Fabric の EffectObservation か、 さもなくば拒否。extra="forbid" により、持つことを許されていないフィールドを 帯びた観測は到達できない - **可用性は fail-OPEN。** AZ-06 は任意である。不在・沈黙・誤りはすべて 「何も観測されていない」へ縮退し、呼び出し側に例外として届かず、 決定論アービタの判断を変えない ## Fabric がしない narrowing を2つ加えた。どちらも実測に基づく **観測は decision の権限を名乗れない。** DefensiveEffectRef は observed_fact と active_materialized を明示的に拒否する (「それは観測の主張であって effect 参照の主張ではない」)。**対称の拒否が EffectObservation に無い。** 実測したところ Fabric は observation に producer_decision_ref / advisory_inference / planned_shadow / stale_or_unknown を すべて受理する。materializer の観測が決定の権限を帯びるのは、 authority_class がまさに防ぐために存在する混同である。 ここで局所的に拒否し、契約側の穴は別途報告する。黙って回避はしない。 **生産者は自分を証拠に観測できない。** materialization_producer が azazel-edge の観測は、他者の陳述を運ぶための契約を使って Edge が 自分の実体化を裏書きすることになる。 ## 3つの結果であって2つではない 「AZ-06 が答えて報告が無い」と「AZ-06 が居ない」は別の事実であり、 オペレータは区別する必要がある。engagement_advisory_client が no_advisory で 拒む畳み込みと同じ理由である。 ## 検証 tests/test_outcome_effect_observation_reader.py 20 passed tests 全体: 12 failed, 828 passed → 12 は main と**完全に同一**(集合比較で確認)。1件も増やしていない compileall(CI と同じ静的検査) OK | 変異 | 結果 | |---|---| | 観測が decision の権限を名乗るのを許す | CAUGHT (4) | | Edge 自身の観測を読み戻す | CAUGHT | | OBSERVER_AUTHORITY_CLASSES を Fabric の enum から導出 | CAUGHT (5) | | 連鎖・窓の検査を外す | CAUGHT (3) | | availability が fail-open でなくなる | CAUGHT (7) | | 不在と拒否を同じ reason に畳む | CAUGHT (6) | Refs 01rabbit/Azazel-Deception#48, 01rabbit/Azazel-Fabric#15 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SsboPSj6GyJju6mTXwHHjq
01rabbit
marked this pull request as ready for review
September 20, 2026 13:03
Owner
Author
|
Fabric contract defect Fabric #52 を登録しました。 本 PR の reader 側拒否は defence-in-depth として正しいため維持してください。ただし、Fabric 修正が出るまでは legacy producer の不正 payload を入力境界で拒否し、受理した observation が decision authority を持つような解釈をしないことを明示してください。rc4 pin への移行時に contract compatibility/negative tests を追加します。 |
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.
F-05 の消費者2つ目です。
effect_contractsは生産者2つを持ちながら消費者が0で、レコードはシリアライズされたことしかありませんでした。Edge が effect を構築し(
effect_export)、AZ-06 が実体化して観測を述べ(Azazel-Deception#48)、Edge がそれを読み返します。これで往復が閉じます。engagement_advisory_clientを意図的に写しています。権限境界が同じだからです:EffectObservationか、さもなくば拒否観測は decision の権限を名乗れない — 契約側に穴があります
DefensiveEffectRefはobserved_factとactive_materializedを明示的に拒否します(「それは観測の主張であって effect 参照の主張ではない」)。対称の拒否が
EffectObservationにありません。 実測結果:materializer の観測が決定の権限を帯びるのは、
authority_classがまさに防ぐために存在する混同です。ここで局所的に拒否し、契約側の穴は別途報告します。黙って回避はしません。
生産者は自分を証拠に観測できない
materialization_producerがazazel-edgeの観測は、他者の陳述を運ぶための契約を使って Edge が自分の実体化を裏書きすることになります。3つの結果であって2つではない
「AZ-06 が答えて報告が無い」と「AZ-06 が居ない」は別の事実で、オペレータは区別する必要があります。
engagement_advisory_clientがno_advisoryで拒む畳み込みと同じ理由です。検証
12件の失敗は
mainと完全に同一です(FAILED 集合を比較して確認)。1件も増やしていません。原因は #420 のgh依存です。OBSERVER_AUTHORITY_CLASSESを Fabric の enum から導出3番目は「派生させてはならない」ことの検査です。Fabric の enum から導出した集合は、narrowing すべき対象そのものになります。
🤖 Generated with Claude Code
https://claude.ai/code/session_01SsboPSj6GyJju6mTXwHHjq
Generated by Claude Code