BLOGE
0.9.8-RC1在线版 · 事实校验 2026-09-15 · English
第 32 章 —— 变化归因、Maven 与发布决策
本章承诺: 固定一个变化轴,运行与问题相称的最小 Maven 阶梯,并判断现有 evidence 只支持本地诊断、团队门禁、治理审批,还是发布决策。
学习目标
- 分开 DSL graph 变更、BLOGE toolchain 升级和业务代码变更。
- 区分“观察到差异”和“BLOGE 能归因差异”。
- 按需要支持的 claim 选择 Maven 命令,而不是按控制台有多绿来选择。
- 保存发布决策所需的 receipt 和 external attestation。
升级改变了结果,但原因是什么?
贷款团队升级到 BLOGE 0.9.8-RC1 后,边界申请从自动批准变为人工复核。同一分支里还有人修改了 risk Operator。前后测试能显示差异,却不能把差异归给其中一项变更。
归因需要受控实验:只改变一个声明轴,冻结所有重要的非目标事实。Operator 和 runtime 同时变化时,先停在诊断层,把实验拆成两次 comparison。
把一次升级拆成两张 receipt
“升级分支”不是有效 change axis,它混合 source edit、graph edit、dependency resolution 和 runtime bytes。贷款团队从同一 common baseline 建立两个实验:
| 实验 | 唯一变化事实 | 必须冻结的事实 | 诚实结果 |
|---|---|---|---|
A — DSL_GRAPH | baseline graph → candidate graph | BLOGE runtime、Scenario、Policy、Fixture、bootstrap、registry、profile | graph 差异可归因,或 COMPARISON_INPUT_DRIFT |
B — BLOGE_TOOLCHAIN | baseline BLOGE class inventory → RC1 inventory | business classpath、graph、声明输入、Java launcher/protocol | 只有 BLOGE_VERIFIED observation 才能归因 |
实验 A 对应 attributesAnObservedBusinessRegressionToTheDslGraphAxis:只改变 candidate graph 的 decision input。两侧各执行一次;candidate report 为 FAIL,change code 包含 OUTPUT_DIGEST_CHANGED:approve-low-risk/decision,comparison 可归因但不 equivalent。
控制实验 attributesOnlyDslGraphChangeWhenEveryFrozenExecutionFactMatches 改变 graph bytes,却保持 observed contract 不变;结果同时 attributable 和 equivalent。因此 attributable 与 equivalent 是两个独立问题。
实验 B 对应 blogeOwnedChildExecutesTheFrozenScenarioBeforeAttributingTheToolchainAxis:固定 business classes 与声明输入,改变 runtime inventory,由两个终止式 child JVM 返回 BLOGE_VERIFIED observations。结果 attributable、observationally equivalent、equivalent,并发布为 SOURCE_BOUND。把 artifact 复制到 bound project location 之外,会得到 COMPARISON_SOURCE_BINDING_DRIFT。
再攻击一个冻结事实:businessClasspathMutationIsReportedAsInputDrift 在 toolchain 实验中改变 business classpath marker。结果变成 COMPARISON_INPUT_DRIFT 与 attributable=false