99.9% 置信的判断被拒之门外,76% 的判断带着两个独立佐证进了场。决定一个判断能不能改权限状态的,不是分数的嗓门。
下面这张表来自我维护的公开仓,Evidence Admission v0.1 刚落地------它是第 4 篇那场 3/5 输给 5/5 的对照实验之后,"admission semantics"四个字第一次有了可执行、可测试的形状。
先钉对账表(我在本机实跑公开代码所得,cargo run --bin admission):
| 案例 | 置信度 | 来源可靠性 | 独立佐证 | 虚拟时间 | 准入结果 |
|---|---|---|---|---|---|
| B | 970k ppm | 400k ppm | 0 | 有效 | Reject(SourceBelowTrustFloor) |
| E | 990k ppm | 990k ppm | 3 | 已过期 | Reject(Expired) |
| D | 760k ppm | 800k ppm | 0 | 有效 | Hold(NeedsCorroborationOrReview) |
| C | 760k ppm | 800k ppm | 2 | 有效 | Accept(Corroborated) |
表里置信度一律整数 ppm(0.94 → 940000),浮点在 adapter 就止步;时间用虚拟 tick 而非墙上时钟,过期就是两个整数的比较。
B 和 C 放一起看:97 万 ppm 的置信救不了 40 万 ppm 的来源,76 万 ppm 的中置信加上两个独立佐证反而够格。"分数够高就改状态"这条接线,在准入层被显式拆掉了。
本篇讲三件事:这条规则为什么长这样;Hold 这个第三态怎么对付误报的时间爆炸半径;以及最重要的一句------它没解决什么。
一、第 4 篇的账单,这一层是来还的
先复述输局。第 4 篇场景二里,stateful 臂 3/5 输给 stateless 臂 5/5:一次 0.93 的越权误报被直接接纳为持久证据、挂起授权,后面两次良性调用连续错杀,直到人工修复。
这笔 0.93 记在实验数据里【公开仓库 Thneoly/r2r-jev·experiments/stateless-vs-stateful/false-positive.csv】。
输因写在 compare.rs 的注释里,逐字【公开仓库 Thneoly/r2r-jev·src/bin/compare.rs】:
rust
// Minimal admission semantics for this public experiment:
// a threshold-crossing judgment is admitted as persistent evidence
// and suspends authorization until an explicit repair.
越线即挂起:没有佐证、没有分级、没有过期。而实验 README 给出的正确链路是四段,逐字【公开仓库 Thneoly/r2r-jev·experiments/stateless-vs-stateful/README.md】:
text
Jev score -> evidence -> admission semantics -> relation transition
v0.1 做的事,就是把中间两段从一句话变成规范文档加代码加实验。整条管线,逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
text
Judgment
↓
EvidenceObserved
↓
Admission
├── Reject
├── Hold
└── Accept
↓
EvidenceAdmitted
↓
typed R→R rules
↓
Relation state transition
中心判据逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
"A judgment may produce evidence. Only admitted evidence may become an input to deterministic relation transitions."
注意这条判据的措辞:连 Accept 都不能直接改 Trust、Delegation、Authorization------它只发出类型化的 EvidenceAdmitted 事件,关系转移另归 R2R runtime 管。
规范开头就把要拆的接线画了出来,不安全的捷径长这样,逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
text
Jev score >= threshold
↓
Authorization = Suspended
接着是一句判词:"That makes a model output behave like a permission mutation."------模型输出直接变成了权限变更。第 4 篇场景二输掉的姿势,和这条捷径一字不差。
二、五维信封:判断先降格为证据候选
判断到达后,准入层做的第一件事不是评估,是打包。观察到的判断被封进一个 evidence envelope【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
text
e = <id, kind, subject, scope, source, c, r, k, t_o, t_x>
策略只评估其中五个维度,主 README 的清单逐字【公开仓库 Thneoly/r2r-jev·README@3c04a05】:
text
typed evidence kind
confidence in integer ppm
caller-bound source reliability
independent corroborator count
virtual-time expiry
五维里藏着一个关键的权力分配:置信度 c 是模型报的;可靠性 r、佐证数 k、两个时间戳,模型一个都报不了。规范的 trust rule 逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
"
source_reliability_ppm, corroboration identity/count, observation tick, and expiry are not self-asserted by the probabilistic model. They are assigned or verified by the adapter/runtime boundary."
翻译一下:模型可以喊 99.9%,但"你说话有几分准"这一栏不由你本人填写。这是整个准入层的地基,不变量 A4 一句话钉死:"The model MUST NOT choose its own source_reliability_ppm."
三、七步判定:顺序即规范
v0.1 的完整策略,逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
text
1. if kind is unsupported
→ Reject(UnsupportedKind)
2. if now_vtick > expires_vtick
→ Reject(Expired)
3. if source_reliability < 600_000
→ Reject(SourceBelowTrustFloor)
4. if confidence >= 900_000
and source_reliability >= 800_000
→ Accept(Strong)
5. if confidence >= 700_000
and source_reliability >= 700_000
and independent_corroborators >= 2
→ Accept(Corroborated)
6. if confidence >= 600_000
→ Hold(NeedsCorroborationOrReview)
7. otherwise
→ Reject(InsufficientSupport)
七个阈值全是代码常量,src/admission.rs 里与规范一字不差。三个设计决定值得停下来看。
第一,顺序是规范的一部分。原话:"The ordering is normative for v0.1."【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】
kind 检查排在一切分数逻辑之前------案例 G,99.9% 置信、99.9% 可靠性、9 个佐证,但 kind 未知,Reject(UnsupportedKind)。
实验 README 的注解逐字【公开仓库 Thneoly/r2r-jev·experiments/evidence-admission-v0.1/README.md】:
"unknown semantics cannot be smuggled in through a high score"
未知语义没法借高分走私进门。
第二,置信度和可靠性不乘起来。规范原话【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
"There is deliberately no multiplication of
confidence × reliabilityand no claim that the inputs form a Bayesian posterior. They are separate policy dimensions."
【从业者判断】乘积的诱惑在于优雅:两个 0.7 压成一个 0.49,一道阈值搞定。代价是把两种不同性质的失败混进一个数------高置信乘低可靠性会得到一个"中等"的数,看似不够高所以没事,但真正的问题是那个低可靠性根本不该有发言权。v0.1 让它们各守各的门:可靠性先过地板线,置信度再分级。
第三,每个决定都带版本号。A7 规定(SHOULD 级)每条记录应带 admission_policy_version = "0.1",政策将来变了,旧记录的重放语义不丢。
四、故意的反例:99.9% 拒收,76% 放行
这套策略最有说服力的部分,是它给自己预埋的反例。主 README 逐字【公开仓库 Thneoly/r2r-jev·README@3c04a05】:
text
99.9% confidence + low-reliability source -> Reject
99.0% confidence + expired evidence -> Reject
76.0% confidence + no corroboration -> Hold
76.0% confidence + 2 corroborators -> Accept(Corroborated)
第三行和第四行是同一枚硬币的两面:76 万 ppm 单源,差一口佐证;凑齐两个独立佐证,进场。规范第八节的案例表后面跟着一句定位,逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
"The second and fifth rows are intentional counterexamples to
confidence alone ⇒ authority."
第一行的底气来自单测。测试函数名本身就是立场------high_confidence_does_not_override_low_source_reliability。
999000 ppm 置信配 400000 ppm 可靠性,断言结果是 Reject(SourceBelowTrustFloor)【公开仓库 Thneoly/r2r-jev·src/admission.rs】。我本机实跑,7 个测试全过。
"独立佐证"四个字也有定义,A5 逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
"
independent_corroboratorsMUST count distinct trusted provenance identities, not repeated samples from the same source."
同一个模型问八遍,佐证数还是零。
【从业者判断】这两组反例的分量要放在行业现状里看:多数 guardrail 的准入口径是"过线就进",分数是唯一货币。v0.1 把货币换了------高置信买不到低可靠源的入场券,独立佐证能买到中置信的。这不是调阈值,是换了准入的语法。
五、Hold:判断和权限之间的第三态
三个结果里最陌生的是 Hold。为什么需要它,规范讲得很直白,逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
"Without
Hold, the system is forced into a binary choice:"
text
ignore evidence
or
change governance state
"That makes false positives expensive."
二选一的世界里,误报很贵:要么装没看见,要么改状态。改了状态,误报就不是一次拒绝,而是一段时间里的持续拒绝------第 4 篇场景二的两笔 false_deny 就是这么来的。
Hold 是第三态:证据可信但不够格,先搁着。它有四个出口,逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
text
Hold
├── corroborated later → Accept
├── human confirms → Accept
├── contradicted → Reject
└── expires → Reject
注意四条出口没有一条通向"直接改关系"。
A2 钉死:"Hold MUST NOT cause a governance Relation transition by itself."【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】
规范给 Hold 的判词,直接点名第 4 篇的术语,逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
"This is the main v0.1 mechanism for limiting the temporal blast radius of a single uncertain judgment."
temporal blast radius,时间爆炸半径------就是 stateful 臂在场景二里输掉的那个东西。
Hold 的覆盖范围有明确边界,它治的是"中等置信 + 单源"这一带;这条边界之外发生什么,第七节的反方一会直面。
这一带的疗效也没被宣布为事实,它被写成可证伪假设 EA-H1,逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
"Compared with
score >= threshold → persistent suspension, an admission layer withHoldshould reduce the number/duration of persistent false-deny states under uncertain single-source judgments."
顺带一条容易漏的:A3 管的是进门前的新鲜度------"Evidence with now_vtick > expires_vtick MUST NOT be admitted." 过期证据是 inert 的,99 万 ppm 也不行(案例 E)。
但进了门、已经触发关系转移的证据会不会随时间失去效力?v0.1 没有答案,规范把"explicit expiry 之外的 decay 函数"列进了不做清单。这条线留给第八节。
六、Accept 也不是权限:准入不裁决关系效果
最反直觉的一点在 Accept 之后:什么都不发生------除了发出一个类型化事件。逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
"
EvidenceAdmittedis an input event, not a direct state mutation."
Accept 的含义只是"这份证据够格进治理",不是"该挂起谁"。规范里的不等式一句话说清:Admission(e) != AuthorizationDecision(e)。
同一份 Accept(Strong) 的 BeyondScope 证据,当前 demo 的规则包映射成三级降级(Trust 降 Warning、Delegation 降 Degraded、Authorization 挂起)。
另一个规则包可以合法地改成完全不同的反应,规范 §5 给了这个反例,逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
text
EvidenceAdmitted(BeyondScope, Strong)
↓
create Supervision
↓
keep Authorization Active but constrained
同样一条强证据,一个规则包选择挂起,另一个选择留人在监督下干活------这个分叉不归准入管。架构文档的判词逐字【公开仓库 Thneoly/r2r-jev·docs/architecture.md@3c04a05】:
"That mapping belongs to R2R semantics, not to Jev and not to Admission."
实跑 fixture demo,第一幕的输出(本机实跑):
text
Act 1: admission separates evidence from authority
JudgmentObserved event=ev-0001 provider=fixture:jev-style
judgment beyond_scope=0.940000 destructive=0.720000 tool=merge_pull_request
Evidence evidence-0001 kind=BeyondScope confidence=0.940000
Admission policy=0.1 Accept(Strong)
Evidence evidence-0002 kind=DestructiveAction confidence=0.720000
Admission policy=0.1 Hold(NeedsCorroborationOrReview)
Trust Active -> Warning trust-0001 (caused by evidence-0001)
Delegation Active -> Degraded delegation-0001 (caused by evidence-0001)
Authorization Active -> Suspended authorization-0001 (caused by evidence-0001)
Decision DENY merge_pull_request (accepted evidence changed persistent governance state)
看 caused by 那三行:三级降级全部由 evidence-0001 引起------只有过了准入的那条证据摸得到关系。0.72 的 DestructiveAction 停在 Hold,不发治理活性证据。
而它没有消失:provenance 链里挂着 ev-0001 -> evidence-0002[DestructiveAction:Hold(...)],事后审计照样查得到。
后两幕接着补完闭环:Act 2 里 0.18/0.12 两条良性判断全部 Reject(InsufficientSupport),关系原样不动,早先的挂起继续管住调用。
Act 3 里 human_override 修复授权并创建 Supervision【公开仓库 Thneoly/r2r-jev·README@3c04a05】。
架构文档一句话总结 Hold/Reject 证据的状态,逐字【公开仓库 Thneoly/r2r-jev·docs/architecture.md@3c04a05】:
"A held or rejected evidence record remains explainable without becoming authoritative."
可解释,但无权威------这就是第三态在 provenance 里的样子。
重放确定性也是不变量。A6 逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
"Given the same evidence envelope, admission policy version, and virtual tick, the admission result MUST be identical."
同一个信封、同一版政策、同一个虚拟 tick,结果必然相同。加上 A1("A Jev/model result MUST NOT directly set Relation phase or fields."),七条不变量 A1--A7 构成这层的全部骨架。
七、预埋反方:三条一定会来的质疑
反方一:场景二在 v0.1 下照样输,Hold 救的是谁?
算一笔账:误报是 930k ppm【公开仓库 Thneoly/r2r-jev·experiments/stateless-vs-stateful/false-positive.csv】、demo 的来源可靠性 850k【公开仓库 Thneoly/r2r-jev·src/admission.rs】。
套 v0.1 策略:过地板线,930k ≥ 900k 且 850k ≥ 800k------Accept(Strong)。挂起照样发生,爆炸半径照样在。
这是真的,v0.1 不假装修好了场景二。Hold 治的是 60 万到 90 万之间的单源带。
对"高置信 + 高可靠"的组合,v0.1 的赌注押在可靠性外部绑定上------源如果持续误报,配置层面可以把它调低,但"自动调"不存在,规范把"learning source reliability automatically"明确列为不做。
实验 README 也把丑话写在了前头,逐字【公开仓库 Thneoly/r2r-jev·experiments/evidence-admission-v0.1/README.md】:
"The expected result is not assumed. A policy that overuses
Holdmay delay necessary enforcement; a policy that overusesAcceptmay retain the false-positive blast radius of the direct-threshold baseline."
三条可证伪假设 EA-H1/H2/H3 摆在规范里,后面跟着一句,逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
"None of these are considered established by this specification alone."
v0.1 交出的是假设和度量方案,不是结论。真正压掉高置信误报的半径,要等第八节里那几个还没答案的问题。
反方二:阈值全是拍的,凭什么信?
对,600/700/800/900k 没有任何实证推导。规范自己认账:不做清单里有 "optimal thresholds",定位声明是 "It is not claimed to be a universal trust model."
demo 里那个 850k,代码注释逐字【公开仓库 Thneoly/r2r-jev·src/admission.rs】:
rust
/// Reproducible demo configuration only. 850k is a configured trust weight,
/// not a measured claim about Jev accuracy.
阈值的价值不在数值在结构:常量、有序、版本化、可证伪。主 README 的定位是 "intentionally small and falsifiable"。
实验 protocol 已经备好打脸的尺子------同一份判断流,直接阈值基线对准入 v0.1,量六项【公开仓库 Thneoly/r2r-jev·experiments/evidence-admission-v0.1/README.md】:
- persistent false-deny duration
- violation duration after independently corroborated true violations
- manual repair count
- held-evidence resolution rate
- explanation/provenance depth
- replay determinism
反方三:七行 if 配叫"语义"?
算术上确实七行。A1 禁止判断直接改关系字段,A4 禁止模型自报可靠性,A6 保证重放一致,Accept 只发事件不动状态。
同样的七行写在应用胶水里,以上保证一条都没有;写成带版本号的确定性内核,每一步都能进 provenance。【从业者判断】guardrail 的可信度来自它拒绝做什么,而不是它算了什么。
八、v0.2 的八个开放问题
v0.1 的不做清单有八条,逐字【公开仓库 Thneoly/r2r-jev·docs/evidence-admission-semantics-v0.1.md】:
text
calibration of Jev probabilities
learning source reliability automatically
Bayesian evidence fusion
adversarial collusion between corroborators
evidence decay functions beyond explicit expiry
organization-level reconciliation
optimal thresholds
automatic human-override policy
这份清单不是免责声明,是路线图。v0.2 的问题单如下------只列问题,不给机制答案,因为答案还没挣到【从业者判断】:
| # | 问题 | 一句话展开 |
|---|---|---|
| 1 | Source Identity | source 到底指什么------模型、部署、端点还是调用方?可靠性挂错一层,A4 就是摆设 |
| 2 | Reliability Relation | 可靠性该永远是配置常数,还是该有历史、随表现变化?由谁记、谁能改? |
| 3 | Independence | A5 排除了同源多采样,但同一上游的两个实例算独立吗?合谋怎么排除? |
| 4 | Correlation | 独立不等于不相关:同一场外部事件触发的两个信源,算两份佐证还是一份? |
| 5 | Contradictory | 两条都过了准入的证据互相矛盾,准入层裁决,还是留给下游? |
| 6 | Accumulation | 五条 60 万 ppm 攒起来,该不该等效一条 90 万?不融合,累计逻辑放在哪层? |
| 7 | Decay | 过期管进门前的新鲜度;进了门、已改了关系的证据,要不要随时间失去效力? |
| 8 | Scope | 信封里有 scope 字段:同一个源在 repo-alpha 可靠、在 repo-beta 不可靠,算一个源还是两个? |
八个问题里一半能在上面的不做清单里找到原型。它们共同指向一个更大的没答案的问题:准入该不该只有"配置常数"一种记忆形态。这题我不答------答案挣到之前,说了就是编的。
九、系列收官:现在就能做的事
六篇到此。第 2 篇立的边界------"A probabilistic judgment is evidence, not permission."【公开仓库 Thneoly/r2r-jev·docs/why-r2r-after-jev.md】------当时只是一句话。
第 4 篇证明这句话缺一段链路就会输掉一场对照;本篇给缺的那段起了名字、定了七步规范、写了七个测试。第 5 篇说生态里"判断之后"那块地没人种,这篇是往地里放的第一块砖。
系列以一张问题清单收尾,而不是胜利宣言------因为这个项目的真实状态就是:边界立住了,答案还没挣到。
两分钟复现(需要 Rust 工具链):
bash
git clone https://github.com/Thneoly/r2r-jev.git
cd r2r-jev
cargo run --bin admission
cargo test --bin admission
代码确定性:改 src/bin/admission.rs 里任一案例的 ppm 或佐证数再跑,同输入同输出。把案例 B 的可靠性从 400000 改到 800000,看着同一条 97 万 ppm 的判断从 Reject 变 Accept(Strong)------那一次重跑,比这篇全文都直观。
30 秒自检,三问自己的系统:
- 从模型分数到状态变更,中间有几段?答"一段",你在运行第 4 篇的场景二。
- 来源可靠性这一栏,谁能填?答案是"模型自己"或"没人",A4 已破。
- "先记着,等佐证"这个状态在你的系统里叫什么?没有名字,说明你只有两态:忽略,或直接改状态。
第三问答不上来的,把第五节的四个出口抄走,够用来立项了。
声明与标注约定
- 本系列与 TypeSafe AI 无隶属、无赞助关系;Jev、TypeSafe、System One 仅用于描述其公开 API,权利归各自所有者。
- 作者即公开仓库 Thneoly/r2r-jev 的维护者,文中引用该仓库处为作者自己的公开项目------正因为是自己的项目,反例和没解决的问题才必须一起亮出来,否则这个系列与软文无异。
- 实跑数字与日期:本文全部实跑数字(A--G 案例输出、fixture 三幕输出、7 个测试通过)为 2026-09-22 本机实跑公开代码所得,代码确定性,任何人可复现。
- commit 锚定:主分支 commit 3c04a05(Evidence Admission 演进后的 HEAD)。README 与 docs/architecture.md 的引文锚定该 commit。
- 新增资产与未改动:规范文档、src/admission.rs、src/bin/admission.rs、实验 protocol 为本次演进新增;experiments/stateless-vs-stateful/ 与 src/bin/compare.rs 未随演进改动,引文照常。
- 引文保真:引用规范文档与代码的判据均逐字保真并标注来源档;无来源支撑的个人观点一律标注【从业者判断】。