From d852bc926ea32ed0fa54a2be840174cca6430a94 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 20 Sep 2026 14:29:14 +0000 Subject: [PATCH] =?UTF-8?q?chore:=20Fabric=20pin=20=E3=82=92=20v0.9.0rc4?= =?UTF-8?q?=20=E3=81=B8=E4=B8=8A=E3=81=92=E3=82=8B=EF=BC=88AZ-06=20?= =?UTF-8?q?=E3=81=AF=20EffectObservation=20=E3=81=AE=E7=94=9F=E7=94=A3?= =?UTF-8?q?=E8=80=85=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 一斉更新ではない。AZ-06 が rc4 へ動く理由は、文法がどこかで変わった ことではなく、AZ-06 が EffectObservation の生産者であり、rc4 が まさにその契約を狭めたことにある。 v0.9.0rc4 は EffectObservation が名乗れる権限クラスを observed_fact と active_materialized の2つに限定し、rc3 が受理していた4つを拒否する (Azazel-Fabric#52)。シリーズで最初の非加法的候補である。 この移行に実費用は無い。runtime/effect_projection.py は既に status から クラスを導出しており、observe_effect にはそのための引数が無く、 2つ以外を発行できない。変わるのは、それが1つの関数の習慣ではなく 契約の保証になったことである。将来3つ目のクラスを持ち込む編集は、 下流に運ばれる前に境界で拒否される。 移行前に検証した。v0.9.0rc4 タグ自身の checkout が release/v0.9.0rc4.digest.json を再現し、その署名は release owner の鍵で 検証でき、本リポジトリの全テストが緑で通る。署名されているのはその digest であって git タグではない。タグは unsigned であり信頼境界では ない(Azazel-Fabric#56)。 検証: 基準1 署名 タグ checkout で digest 一致・署名検証 OK 基準2 version 導入 0.9.0rc4 == pin v0.9.0rc4 基準3 互換性 590 passed / 8 skipped / 0 failed 基準4 縮退 azazel-fabric は required 依存であり、Fabric 不在の 縮退経路は設計上存在しない Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01SsboPSj6GyJju6mTXwHHjq --- docs/fabric-pin.md | 26 ++++++++++++++++++++++++-- pyproject.toml | 2 +- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/docs/fabric-pin.md b/docs/fabric-pin.md index 869d00b..5eac121 100644 --- a/docs/fabric-pin.md +++ b/docs/fabric-pin.md @@ -30,7 +30,7 @@ drift structurally impossible rather than merely noticed. AZ-06 pins the Azazel-Fabric release tag: -`v0.9.0rc3` +`v0.9.0rc4` ### Why a release candidate @@ -59,6 +59,27 @@ ref, and `runtime/effect_projection.py` had to refuse them rather than flatten them. Rewriting a producer's identifier is not an option: `surface:http-8080` is a well-formed reference to a surface that does not exist. +`v0.9.0rc4` is the pin now. It narrows `EffectObservation` to the two +authority classes an observation can have observed — `observed_fact` and +`active_materialized` (Azazel-Fabric#52) — and refuses the four others that +`rc3` accepted. **It is the first non-additive candidate in the series**, and +the reason this repository moves to it is not that the grammar changed +somewhere: AZ-06 is a *producer* of `EffectObservation`, so this is the +contract it emits under. + +The move costs nothing here because `runtime/effect_projection.py` already +derives the class from the observation's status and can emit only those two — +`observe_effect` has no parameter for it. What changes is that this became a +guarantee of the contract instead of a habit of one function. A future edit +introducing a third class would now be refused at the boundary rather than +accepted and carried downstream. + +The pin was verified before the move rather than after: the `v0.9.0rc4` tag's +own checkout reproduces `release/v0.9.0rc4.digest.json`, whose signature +verifies under the release owner's key, and this repository's full suite runs +green against it. **What is signed is that digest; the git tag itself is +unsigned** and is not a trust boundary (Azazel-Fabric#56). + That refusal was recorded as a test designed to fail when the pin moved, and it did. The stand-in values are gone from `tests/test_effect_contracts_producer.py`; AZ-06's own references now go into @@ -208,4 +229,5 @@ updates `pyproject.toml`, this document, and the CHANGELOG together. | `c3154de` (2026-08-15) | `v0.5.0` → `v0.6.0` | | `77ad0cd` (2026-08-22) | `v0.6.0` → `v0.8.0` | | Deception#28 AC-7 (2026-09-20) | `v0.8.0` → `v0.9.0rc2` | -| `effect_contracts` producer (2026-09-20) | `v0.9.0rc2` → `v0.9.0rc3` (current) — the reference grammar; see above | +| `effect_contracts` producer (2026-09-20) | `v0.9.0rc2` → `v0.9.0rc3` — the reference grammar; see above | +| `EffectObservation` authority narrowing (2026-09-20) | `v0.9.0rc3` → `v0.9.0rc4` (current) — AZ-06 emits this record, so it moves with the contract it emits under; see above | diff --git a/pyproject.toml b/pyproject.toml index 315b5b5..e0dc1a5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ license = {text = "MIT"} authors = [{name = "01rabbit"}] dependencies = [ "PyYAML>=6.0", - "azazel-fabric @ git+https://github.com/01rabbit/Azazel-Fabric.git@v0.9.0rc3", + "azazel-fabric @ git+https://github.com/01rabbit/Azazel-Fabric.git@v0.9.0rc4", ] [project.optional-dependencies]