feat: Knowledge の EngagementAdvisory を読む消費者を追加する (Fabric#23 R1c) - #418
Merged
Merged
Conversation
engagement_contracts は**プロデューサ2・コンシューマ0**だった。Edge も Knowledge も Engage 整合の型を書くが、互いの書いたものを誰も読んでいない。 シリアライズされたことしかない契約は相互運用が確認されておらず、 最初の読み取りこそ不一致が現れる場所である。 本コミットはその読み取り側である。 ## 権限境界は deception_effectiveness_client と同一 同モジュールを意図的に鏡像とし、2つの失敗規律をそのまま引き継ぐ: - **応答検証は fail-CLOSED。** 正典の EngagementAdvisory でなければ HTTP ステータスが何であれ拒否する。authority は advisory_only、executable は False でなければならず、extra="forbid" により助言が持てないはずの コマンドを持って到着することはない - **Edge の稼働は fail-OPEN。** timeout・障害・不正な本文・fail-closed 拒否は すべて「助言なし」に劣化し、呼出側へ送出せず、ブロックせず、 決定論的アービタの決定を変えない ## 結果は2値ではなく3値である Knowledge は「全フィールドが unknown の助言」ではなく null を返す。 「証拠が無ければ助言も無い」は Knowledge 自身の規則であり、 **Knowledge が見た上で何も無かった**ことを意味する。 これを「到達不能」と同じ箱に入れれば、応答したノードと存在しないノードの 区別が失われる。オペレータにはその区別が要る。よって no_advisory は 独立した理由であり、失敗ではない。knowledge_answered がその区別を表す。 ## 判断経路には触れない posture_suggestion は英語の通常の意味での示唆である。決めるのは Edge の 決定論的アービタであり、その決定は本モジュールが助言を返そうが no_advisory を返そうが呼ばれなかろうが同一である。 この不在は約束ではなくテストで表明した。双方向で検査する — 本モジュールが arbiter を import しないこと、および **arbiter が本モジュールを import しないこと**。後者が実際に効く方である。 要求本文は呼出側が与える。Edge が Knowledge に何を尋ねるかは製品の判断で あり、本モジュールの仕事は転送と検証である。 ## 冗長な検査を正直にした authority / executable の明示検査は到達不能である。モデルの Literal が 先に拒否するため、どのペイロードも到達させられない。 削除せず残すが、「契約が緩められた場合の backstop」であることと、 **誰もテストできない backstop は、load-bearing になった瞬間に気付けなければ 残す価値がない**ことを明記した。test_the_contract_still_pins_advisory_only が Literal を固定するため、緩和はそこで赤くなる。 ## 検証 791 passed, 4 skipped(当環境で `gh` CLI 未導入のため bhusa 系4ファイルを除外。 本変更とは無関係であることは既に特定済み)。 変異試験9件すべて捕捉: - 再帰的 directive 検査を外す / 契約検証を外す - no_advisory を失敗に畳む / key 欠落を null と同一視する - 非整数 repeatability をそのまま渡す - 最終 except を狭める / 要求本文を書き換える - 契約の authority / executable Literal が緩む(Fabric 側を実際に変異させて確認) 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 02:55
This was referenced Sep 20, 2026
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.
Refs 01rabbit/Azazel-Fabric#23
なぜ
engagement_contractsは プロデューサ2・コンシューマ0 でした。Edge も Knowledge も Engage 整合の型を書きますが、互いの書いたものを誰も読んでいません。シリアライズされたことしかない契約は相互運用が確認されておらず、最初の読み取りこそ不一致が現れる場所です。本 PR はその読み取り側です。
Fabric の R1c 証拠ゲート(実プロデューサ1 + 実コンシューマ2)で7族中1族しか満たしていない現状を、1族進めます。
権限境界は
deception_effectiveness_clientと同一同モジュールを意図的に鏡像とし、2つの失敗規律をそのまま引き継ぎます。
EngagementAdvisoryでなければ HTTP ステータスが何であれ拒否結果は2値ではなく3値です
Knowledge は「全フィールドが unknown の助言」ではなく
nullを返します。「証拠が無ければ助言も無い」は Knowledge 自身の規則であり、Knowledge が見た上で何も無かったことを意味します。okno_advisoryunreachable/malformed_response/hostile_response/unconfiguredこれを「到達不能」と同じ箱に入れれば、応答したノードと存在しないノードの区別が失われます。 オペレータにはその区別が要ります。
knowledge_answeredがそれを表します。キーの欠落と明示的な
nullも区別します — 後者は Knowledge が「無い」と言っており、前者は Knowledge の形をしていません。判断経路には触れません
posture_suggestionは英語の通常の意味での示唆です。決めるのは Edge の決定論的アービタであり、その決定は本モジュールが助言を返そうがno_advisoryを返そうが呼ばれなかろうが同一です。この不在は約束ではなくテストで表明しました。しかも双方向で検査します。
arbiter/decision_layers/control_plane/evaluatorsを import しないことarbiterが本モジュールを import しないこと ← 実際に効くのはこちらです要求本文は呼出側が与えます。Edge が Knowledge に何を尋ねるかは製品の判断であり、本モジュールの仕事は転送と検証です。
冗長な検査を正直にしました
authority/executableの明示検査は到達不能です。モデルのLiteralが先に拒否するため、どのペイロードも到達させられません。削除せず残しますが、「契約が緩められた場合の backstop」であることと、誰もテストできない backstop は load-bearing になった瞬間に気付けなければ残す価値がないことを明記しました。
test_the_contract_still_pins_advisory_onlyが Literal を固定するため、緩和はそこで赤くなります(Fabric 側を実際に変異させて確認済み)。検証
変異試験9件、すべて捕捉:
no_advisoryを失敗に畳むnullと同一視するrepeatabilityをそのまま渡すexceptを狭めるauthorityLiteral が緩むexecutableLiteral が緩むテスト除外について(事実として記録)
当環境では
bhusa系4ファイルがghCLI 未導入により失敗するため除外しました。本変更とは無関係で、原因は前 PR (#417) で特定済みです。範囲外(マスターのご判断を要します)
本モジュールには実行時の呼出元がまだありません。 Edge がいつ Knowledge に engagement context を問い合わせるか(どの契機で、どの entity について)は製品設計の判断であり、本 PR では決めませんでした。
R1c ゲートの定義は「受け取ったインスタンスを解析・検証する」であり、本モジュールと28本のテストはそれを満たします。ただしライブ経路への結線は別の判断であることを、Fabric の採用マトリクス更新時に正確に記録します。
🤖 Generated with Claude Code
https://claude.ai/code/session_01SsboPSj6GyJju6mTXwHHjq
Generated by Claude Code