Skip to content

feat: Knowledge の EngagementAdvisory を読む消費者を追加する (Fabric#23 R1c) - #418

Merged
01rabbit merged 1 commit into
mainfrom
claude/zealous-edison-k5vt5j
Sep 20, 2026
Merged

01rabbit merged 1 commit into
mainfrom
claude/zealous-edison-k5vt5j

Conversation

@01rabbit

Copy link
Copy Markdown
Owner

Refs 01rabbit/Azazel-Fabric#23

なぜ

engagement_contracts は プロデューサ2・コンシューマ0 でした。Edge も Knowledge も Engage 整合の型を書きますが、互いの書いたものを誰も読んでいません。

シリアライズされたことしかない契約は相互運用が確認されておらず、最初の読み取りこそ不一致が現れる場所です。本 PR はその読み取り側です。

Fabric の R1c 証拠ゲート(実プロデューサ1 + 実コンシューマ2)で7族中1族しか満たしていない現状を、1族進めます。

権限境界は deception_effectiveness_client と同一

同モジュールを意図的に鏡像とし、2つの失敗規律をそのまま引き継ぎます。

層 規律
応答検証 fail-CLOSED — 正典の EngagementAdvisory でなければ HTTP ステータスが何であれ拒否
Edge の稼働 fail-OPEN — timeout・障害・不正本文・拒否はすべて「助言なし」に劣化し、送出せず、ブロックせず、決定論的アービタの決定を変えない

結果は2値ではなく3値です

Knowledge は「全フィールドが unknown の助言」ではなく null を返します。「証拠が無ければ助言も無い」は Knowledge 自身の規則であり、Knowledge が見た上で何も無かったことを意味します。

reason 意味
ok 助言があり、検証を通過した
no_advisory Knowledge は答えた。助言が無かっただけ。失敗ではない
unreachable / 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 側を実際に変異させて確認済み)。

検証

791 passed, 4 skipped

変異試験9件、すべて捕捉:

変異 結果
再帰的 directive 検査を外す 赤(5件)
契約検証を外す(素通り) 赤
no_advisory を失敗に畳む 赤
key 欠落を null と同一視する 赤
非整数 repeatability をそのまま渡す 赤
最終 except を狭める 赤
要求本文を書き換える 赤
契約の authority Literal が緩む 赤(Fabric 側を実変異)
契約の executable Literal が緩む 赤(同上)

テスト除外について(事実として記録)

当環境では bhusa 系4ファイルが gh CLI 未導入により失敗するため除外しました。本変更とは無関係で、原因は前 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

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
01rabbit marked this pull request as ready for review September 20, 2026 02:55
@01rabbit
01rabbit merged commit f706057 into main Sep 20, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants