Semantic pre-dispatch:exact Guest、Host qualification 与 final-source identity 独立复核
Current update (
94fab78...): semantic pre-dispatch 现在登记为prefix_overlaysource-bound pass,并由runtime/semantic/pass_outcome.go在既有 observation lifecycle terminal 后投影 body-free outcome。该 adapter 不改变本文描述的 analyzer、Host qualification、physical pre-dispatch 或 exact logical claim owner。统一 pass architecture 见10-source-bound-pass-pipeline.md。Post-review disposition:Closed。 本文在
b94c989...确认的streaming prefix SHA缺口已由b6458b41f0fa32085fdd4cad0a528d98602569d2以最小方式修复:seal复用既有final source SHA并更新ready record;依赖append-only source lineage,不做第二次final AST analysis。本文的Partially confirmed描述现在是历史审查发现,而不是当前实现状态。
0. Scope、状态与结论
- 审查状态:Current / fixed-target read-only review。 只审查
agent-python-runtime精确 commitb94c989785632d98634cdd5c2a6d4a1de6cc13ac,tree6b8bb6a8d8274b8329a2aba444d13eac9fac19e9。 - 固定方式: 以该 commit 解出的隔离 snapshot
/tmp/agent-python-runtime-review-b94c989为源码读取基线;没有跟随 live checkout 漂移。源仓库未修改、未 commit/push,未运行 campaign 或 benchmark。 - 严格范围: exact Guest analyzer、Host verified analysis、candidate/legality/pass registration、qualified call、physical pre-dispatch、prepared-region/staged observation、dynamic exact claim、finalize/orphan/cancel、source/argument/occurrence/replay 负例,以及 EAGER opportunity comparison。
- 核心区分: AST candidate 不是 authority;authority/qualified call 不是 physical result;physical preparation 不是 logical effect;prefix identity 不是 final full-source identity。
- Hypothesis disposition:
Partially confirmed。- Confirmed(streaming prefix lane):
Analysis.SourceSHA256的 prefix digest 经QualifiedCall直接进入 semantic-call staged identity;SealFinalSource只更新父 controller 的sourceSealed/finalSourceSHA256,没有把每个 staged observation promotion/bind 到 final full-source digest。 - Refuted / 不适用于 ordinary one-shot lane: 非 streaming
Analyze接收完整 source;其QualifiedCall.SourceSHA256在该 lane 可是完整 source digest。因此不能把缺口扩大为所有 semantic pre-dispatch。 - 仍然存在的保护: final execution request 必须逐字等于
GeneratedSource.Source(),且 controller 必须先 sealed;这阻止了任意 final source substitution,但不能反向证明已启动的 semantic-call observation 自己携带 final digest。
- Confirmed(streaming prefix lane):
- 影响判断: 当前是 source/claim identity contract gap,而不是本复核已经证明的任意 provider duplicate 或错误结果路径。它削弱“staged semantic result 已被最终完整 source 绑定”的可审计性;在当前 single-call/fresh-final-Guest 路径中,final-source gate 仍限制了可执行组合。最小修复见第 11 节。
1. 固定 target 与证据分层
1.1 Target identity
| 项目 | 值 |
|---|---|
| Repository | /Users/yuzhe/projects/agent-python-runtime |
| Commit | b94c989785632d98634cdd5c2a6d4a1de6cc13ac |
| Tree | 6b8bb6a8d8274b8329a2aba444d13eac9fac19e9 |
| 隔离读取 | /tmp/agent-python-runtime-review-b94c989 |
| live 初始状态 | main,HEAD 等于目标 commit;无未提交状态行 |
| target commit 内容变化 | docs/evidence/prepared-data-phase3-v2.json、docs/plans/2026-08-21-authority-preserving-prepared-data-autonomous-megagoal.md |
目标 commit 的上述 prepared-data 文档属于相邻研究 lane;不能替代 semantic prefix 的 source/claim join 证据。
1.2 证据标签
- Current: 目标 snapshot 中的 Go/C/Python source、测试、接口与验证逻辑。
- Observed: 本次对固定 snapshot 运行的 focused package tests 返回
ok;这是测试执行结果,不是 wall-clock 或 interval-trace 结论。 - Framing:
docs/research/authority-preserving-prepared-data-contract-v1.md与 source/semantic 研究文档给出的设计边界;它们是解释约束,不自动证明实现已满足每一项。 - Historical:
docs/research/semantic-speculation-phase3-campaign-result-v1.md、docs/evidence/semantic-predispatch-experiment.json、docs/evidence/source-prefix-overlap-v1.json、docs/evidence/source-prefix-day-trip-evidence-v2.json中的旧实验/报告。部分 producer/harness identity 不是本 target commit,不能作为 target-bound certification。 - Deferred: 多个相同 capability+arguments 的 streaming occurrence 在 unchanged Broker 接口上如何携带 exact occurrence;semantic-call 的 prefix→final promotion 测试与 adapter。
- Unsupported: 本文不声称自然 workload speedup、wall-clock dominance、observed interval trace、same-Guest analyzer continuation、任意 Python 支持、generic object ABI、cache/coalescing、writes 或 EAGER dominance theorem。
2. 端到端 sequence:两条 Guest lane 与一条 Host claim lane
2.1 Exact Guest analyzer lane
Host Request{Source, Bindings, Capabilities}
-> runtime/semantic.Analyze
-> exact target Guest runner.AnalyzeSemantic
-> guest runtime_analyze_source
-> agent_runtime.semantic.analyze_request_json
-> canonical Analysis JSON
-> strict DecodeAnalysis + request/identity re-check
-> AnalyzeVerified / VerifiedAnalysis
具体锚点:
runtime/semantic/analyzer.go:117的Analyze将 request canonicalize 后调用analyzer.AnalyzeSemantic;analysisMatchesRequest重新计算 source digest,并检查 analyzer/artifact/profile/import-closure/capability-plan 绑定。runtime/engine/wazero/engine.go:750-804的Engine.AnalyzeSemantic每次 instantiate 一个 authority-free analyzer Guest,调用_initialize、runtime_init、runtime_analyze_source,随后 close;它不是最终执行 Guest 的 continuation。guest/src/runtime.c:346-370的runtime_analyze_source只调用 Guest 模块agent_runtime.semantic。guest/bootstrap/agent_runtime/semantic.py:972的analyze_request_json负责 exact target-Guest 的 semantic analysis;Host 不用自己的 Python parser 代替它。runtime/semantic/analyzer.go:24-65的AnalyzeVerified只接受 concrete Wazero engine/verified authority-free properties;VerifiedAnalysis是 Host TCB 内的 opaque qualification,不是对 hostile in-process Host 的独立签名信任根。
2.2 Candidate、legality 与 pass registration
runtime/semantic/contract.go 将 Guest 返回的数据限定为 body-free semantic facts:
CallSite(contract.go:119-128):ID、span、capability、control region、necessarily-reached、canonical arguments、dynamic occurrence。CandidateRegion(contract.go:135-150):control/data predecessor、live-ins/live-outs、effects、capability occurrence、barriers、rejection reasons。Analysis.Validate(contract.go:180-314):schema/digest、call-site coverage、candidate-region coverage、排序唯一性、span containment、occurrence bijection、referent 与 effect coverage。CandidateRegion.LocallyReusable(contract.go:152-158)只代表 analyzer-local shape,不能 issue、transport、cache 或 replace。Plan/Region.Reusable(contract.go:329-400、plan.go:33-96)仍是 Host 侧 plan facts;candidate/whole-run plan 不直接产生 physical operation。
Pass registration 在 runtime/passregistration/registration.go:16-59:
semantic_pre_dispatch版本为pysolate.semantic-pre-dispatch-pass.v0,consumer 是overlay_only。- overlay bindings 包括 source/AST/analysis/analyzer/profile/import/plan/pass-config/occurrence;不包含
FinalSourceSHA256。 prepared_pure_region的 execution-patch bindings 才包含FinalSourceSHA256,这是相邻 patch lane 的区别。runtime/semantic/planner.go:110-208的BuildSourceBoundPlan生成 documents/occurrences/pass decisions,并将CanPreissue结果放入 privatequalifiedmap;public projection 不暴露 handler、Broker pointer 或 executable IR。
因此:AST 出现、candidate region、read_only/idempotent、pass enabled 都不构成 Host authority。
2.3 Host qualified call 与 physical pre-dispatch
runtime/semantic/legality.go 是唯一的 semantic-to-capability join:
CanPreissue/CanPreissueStreamingPrefix(legality.go:243-324)先验证VerifiedAnalysis、Plan identity、exact call site、context/budget、PreDispatch qualification、streaming observation binding、canonical arguments 与 resource identity。QualifiedCall(legality.go:152-175)的 private fields 绑定 source digest、call-site、capability、canonical argument digest、resource、dynamic occurrence、spec/handler/plan/grant、epochs、privacy、lineage、budget 与 span。streamingPrefixSpeculationAllowed(legality.go:326-376)只允许 straight-line、无 data dependency/barrier、无 publish/unknown effect、前驱也是 canonical unique call 且 unclaimed disposition 为 discard-with-disposition 的 look-ahead;conditional/data-dependent/publishing/unknown predecessor fail closed。QualifiedCall.ExpectedObservationClaim(legality.go:229-240)把 source digest 与 claim identity 放进 exact claim;CanClaimStagedObservation(legality.go:400-411)要求 claim 完全 equality 且 Ready。
runtime/capability/predispatch.go:31-108 的 PreparedPreDispatch:
PreparePreDispatch只校验 sealed capability registration、live-only contract 与 canonical arguments,不启动 work。Call是 one-shot physical handler invocation,外部 launcher/scheduler 负责 start;handler/invalid-result/error 被编码成 staged logical outcome;不把结果当作 Guest logical call。PhysicalResultBytes、provider cost、physical start/finish 与 logical claim 分开。
2.4 Staged observation 与 unchanged dynamic claim
runtime/streaming/observation.go:26-91 的 ObservationIdentity 只存 bounded identities,不存 body/path/credential:
ObservationBindingStreamSuite与ObservationBindingSemanticCall是互斥 binding kinds。- 注释与
Validate(sealed)明确规定:sealed identity 必须有 final full-source digest;provisional identity 不能猜 final digest。 - 但 semantic call 分支(
observation.go:82-86)要求!sealed直接无效,因此当前 semantic-call object 只能以 sealed identity 建立。 NewStagedObservation(observation.go:128-135)依据SourceSHA256 != ""判定 sealed;BindSource(observation.go:138-149)只适用于 provisional record。
未改变的 Guest call 通过 runtime/engine/wazero/engine.go:1216-1258 的 hostCall 进入 Broker:
Guest dynamic call
-> hostCall
-> Broker.Call / Broker.CallStreaming
-> normal capability + schema validation
-> configured StagedObservationClaimer.Claim(capability, canonical arguments)
-> exact staged record Consume(identity)
-> logical claim/result/error
runtime/semantic/predispatch.go:222-275 的 child SemanticPreDispatch.Claim:
- mismatch 的 capability/arguments fail closed;不发第二次 live provider call。
CanClaimStagedObservation对 claim identity 做 exact equality。record.Consume(identity)是 one-shot;成功后logical++、disposition=consumed。
对于 ordinary one-shot,NewSemanticPreDispatch 的 exclusive dynamic-call 要求(predispatch.go:121-147)限制为一个 exact call surface;对于 streaming controller,StreamingSemanticPreDispatch.Add 可持有多个 child,但其 Claim(streaming_predispatch.go:132-172)从 Broker 仅收到 capability+arguments,选择第一个未 claim 的相同 capability+arguments entry。后者的多 occurrence exactness 见第 9 节 Deferred。
3. Streaming prefix lifecycle 与 physical/logical ledger
source chunk visible
-> ShouldAnalyzePrefix (skip-only)
false -> RecordSkippedPrefix;不 mint authority
true -> exact Analyze(prefix)
-> AdmitVerifiedPrefix
-> analysis.SourceSHA256 == sha256(exact prefix)
-> CallSite -> CanPreissueStreamingPrefix
-> QualifiedCall
-> StreamingSemanticPreDispatch.Add
-> reserve one budget
-> PreparedPreDispatch.Start/Call
-> child staged physical outcome
-> all chunks consumed; pending analyses joined in schedule order
-> SealFinalSource(full source)
-> controller.sourceSealed=true
-> controller.finalSourceSHA256=sha256(full source)
-> ExecuteGeneratedSource...
-> request.Code == exact generated full source
-> fresh final Guest.Run
-> unchanged Broker dynamic boundary Claim
对应 symbol:
runtime/semantic/prefix_readiness.go:12-58:ShouldAnalyzePrefix是 Host-owned skip-only lexical screen;true 只请求 exact analysis,false 只能省略 analysis。runtime/semantic/prefix_execution.go:45-195:GenerateVerifiedSourceWithPreDispatch累积 append-only chunks,按 scheduled prefix order commit analysis,任何 analysis/admission/seal error 都 deferred finalize false。runtime/semantic/streaming_predispatch.go:290-345:AdmitVerifiedPrefix要求 analysis digest 等于该 prefix,并以 capability+span+arguments digest 去重;RecordSkippedPrefix只推进 visible source。runtime/semantic/streaming_predispatch.go:379-403:SealFinalSource要求 append-only/final suffix/prefix newline,并设置父 controller 的sourceSealed与finalSourceSHA256。runtime/semantic/prefix_execution.go:199-315:ExecuteGeneratedSourceObserved/Outcome要求 final request code 逐字等于 generated source,父 controller sealed 且 digest 相等,然后只允许一次 fresh final execution。
物理/逻辑 ledger:
| 阶段 | owner | 允许的含义 | 不允许升级成 |
|---|---|---|---|
| candidate/AST | exact Guest + Host decoder | syntax/semantic fact | authority 或 logical reach |
| QualifiedCall | Host | exact plan/occurrence/policy/budget proof | 已发生 physical read |
| PreparedPreDispatch | Host capability | one-shot physical attempt/outcome | Python logical call、cache hit |
| StagedObservation | Run-private Host record | bounded result + identity + terminal state | durable/global cache |
| unchanged Broker call | Guest dynamic occurrence + Host Broker | exact logical claim/consume | arbitrary source substitution |
| Finalize | Host lifecycle owner | cancel/orphan/retire unclaimed physical work | retroactive logical success |
4. Final-source identity hypothesis:逐符号独立复核
4.1 Contract expected by the generic observation API
ObservationIdentity.Validate 的 contract 是:
provisional observation: SourceSHA256 == ""
-> exact final SourceSeal / final-source adapter
-> BindSource(final full-source digest)
-> sealed semantic/stream observation
SourceSeal.BindObservation(runtime/streaming/source.go:101-125)确实实现了这类 promotion,但它只接受 stream_suite observation,并要求 suite range/digest 与该 exact source seal 的 admitted suite 相符。它不能自动接受或改写 semantic_call。
4.2 Semantic prefix production path
逐符号追踪结果:
StreamingPrefixAdmission.AdmitVerifiedPrefix(streaming_predispatch.go:290-345)从analysis.SourceSHA256得到当时 prefix 的 digest。CanPreissueStreamingPrefix(legality.go:253-324)在构造QualifiedCall时把analysis.SourceSHA256直接写入call.sourceSHA256(legality.go:307-309)。StreamingSemanticPreDispatch.Add(streaming_predispatch.go:94-129)将该 call 交给newSemanticPreDispatch(call, ..., false);这里没有 final-source 参数,也没有 provisional adapter。newSemanticPreDispatch(predispatch.go:125-178)把 call identity 直接复制到ObservationIdentity,包括SourceSHA256: call.sourceSHA256与基于该 claim 的ClaimIdentitySHA256,并以 sealed identity 启动。- child physical completion(
predispatch.go:185-220)调用streaming.NewStagedObservation(controller.identity, encodedOutcome);因为 sourceSHA 非空,semantic-call observation 以 prefix digest sealed。 SealFinalSource(streaming_predispatch.go:379-403)只写父 controller 的sourceSealed与finalSourceSHA256,没有遍历 entries/child/record,也没有修改ObservationIdentity.SourceSHA256或重算 claim identity。- 父
StreamingSemanticPreDispatch.Claim(streaming_predispatch.go:132-172)只检查 source seal gate、capability+canonical arguments,并转发到 child;child 的CanClaimStagedObservation/record.Consume仍按原始 prefix-bound claim/identity equality。 ExecuteGeneratedSourceObserved的 full-source equality(prefix_execution.go:286-315)只证明 final Guest request 与GeneratedSource相同,不能补写此前已 sealed 的 child observation identity。passregistration.OverlayBindings(registration.go:46-50)没有FinalSourceSHA256,而PatchBindings(registration.go:52-56)有;这与上述 semantic overlay 生产路径一致,是独立的 contract signal。
4.3 Disposition 与边界
判定:Partially confirmed。
- 对“prefix staged observation 没有 promotion 到 final full-source digest”这一具体 streaming hypothesis:Confirmed。
- 对“semantic pre-dispatch 普遍没有 final-source identity”这一泛化:Refuted / 不适用。ordinary one-shot 的 full-source analysis 可直接产生 full-source
QualifiedCall.SourceSHA256;genericstreaming.BindSource也能处理某些 provisional stream-suite records。 - 对 final execution 的防护:Current / confirmed。wrong
request.Code会在ExecuteGeneratedSource...被ErrAnalysisBinding拒绝;source seal 前的 streaming claim 也被 controller 拒绝。因此当前不是“任意 final source 都能拿 prefix result claim”。 - 对 identity contract:Current gap。
semantic_call被当作 sealed prefix identity,违反observation.go对 sealed identity 的 final-source 语义;父 snapshot 的FinalSourceSHA256不是 record-level rebind。
4.4 影响分层
- 直接 safety boundary(当前保留): final generated source 与 final run request 的逐字 equality;source seal gate;one-shot budget;normal Broker/schema gate;mismatch 不 fallback 到第二次 live call。
- 当前缺口: staged record 的 claim identity 无法独立回答“此 physical result 属于哪个 final full source”;父 controller 字段不能替代 child record identity。
- 未证明为当前 defect 的部分: 本次没有通过一个可执行 exploit 证明错误 provider result 被错误 source 消费;当前 narrow path 的 final seal/ordered prefix 约束降低了这一风险。
- 论文/答辩可说: “Host 可以对 source-prefix 产生 bounded staged opportunity,并在 final source seal 后开放 unchanged dynamic claim。”
- 论文/答辩不可说: “每一个 prefix-staged semantic result 已由最终完整 source digest 密码/record-level 绑定。”
5. Candidate、authority、physical preparation、logical effect 的边界
Host-owned
- capability registry、sealed Plan、grant/spec/handler、PreDispatch contract;
- analyzer artifact、execution profile、import closure、source/AST/analysis/plan digests;
- prefix accumulator、append-only/final source check、final digest、budget reservation、privacy/freshness/lineage;
CanPreissue*、CanClaimStagedObservation、PreparedPreDispatch、staged record、Broker lifecycle、workspace publish/discard;- source-bound resolver/receipt identity,以及 semantic overlay 的 opaque private fields。
Guest-owned / exact Guest oracle
- CPython target 的 compile/AST/semantic facts、call-site span、candidate region、barrier/effect facts;
- unchanged final Python 的 actual control flow 与 dynamic Broker occurrence;
- final Guest 的 result/error envelope、异常位置与 ordinary call semantics。
Shared / explicit joins
- Host 发送 bounded source/request,exact Guest 返回 canonical body-free facts;Host strict decode/recompute 后才生成
VerifiedAnalysis。 - Guest candidate 与 Host Plan 必须逐项 join;candidate 不能 mint authority。
- physical read 只能由 Host qualification + budget + capability start;physical completion 不计为 logical call。
- unchanged dynamic occurrence 才能消费 exact staged result;claim 失败不发第二次 physical provider call。
- final source 需要同时约束 execution request 与 staged observation identity;当前第二个 join 在 streaming semantic-call record 上缺失。
6. Lifecycle、失败语义与 terminal disposition
| 事件 | 当前行为 | 证据锚点 |
|---|---|---|
| no Host qualification / no Plan | no physical attempt;ordinary path 或 rejection | legality.go:257-305、legality_test.go:13-61 |
| prefix re-analysis | seen occurrence key 去重,不重复 issue | streaming_predispatch.go:94-129;streaming_predispatch_test.go:78 |
| source/analysis binding mismatch | fail closed | AdmitVerifiedPrefix:302-305;prefix_execution.go error/defer path |
| argument/capability mismatch | claim rejected;不 fallback duplicate live request | predispatch.go:222-275;predispatch_test.go:122-149;broker_test.go staged mismatch case |
| source seal before claim | controller rejects claim | streaming_predispatch.go:132-140 |
| physical handler error | typed handler_error/failed outcome;不等于 logical success | capability/predispatch.go:84-107 |
| invalid result/schema/budget | typed invalid/rejection;不发布 logical result | capability/predispatch.go:99-107、predispatch_test.go:55-120 |
| final Guest/run error | child cancelled/failed;workspace discard;Finalize(false) | predispatch.go:312-376、prefix_execution.go:45-195 |
| success but occurrence not reached | ready unclaimed result becomes orphaned;不变成 cache hit | predispatch.go:312-351;predispatch_test.go:324-397 |
| cancellation while physical read runs | child context cancelled/waited;terminal disposition retained | predispatch.go:278-310、predispatch_test.go:218-291 |
| replay/second consume | StagedObservation one-shot terminal state rejects consume | observation.go:128-203、observation_test.go:55-149 |
| late completion after finalization | parent finalized/source sealed 后不得新增;terminal record 不可再次 claim | streaming_predispatch.go:104-112,174-190;predispatch.go:312-351 |
timed_out、late、fallback_playback 在接口中可表达,但本 lane 没有足够 producer-level path 把它们端到端证明;不要把枚举存在升级为已观察覆盖。
7. Negative controls 与 occurrence/replay 审查
已有且有效的负例
- source mismatch:
integration/e2e/streaming_semantic_predispatch_test.go:175-178以generated.Source()+"# mismatch\n"调用 final execution,期待ErrAnalysisBinding。 - argument/capability mismatch:
runtime/semantic/predispatch_test.go:122-149、runtime/semantic/streaming_predispatch_test.go:103-125;normal Broker schema gate 后 claim fail closed。 - occurrence identity at record level:
runtime/streaming/observation_test.go:38-53的 same arguments/different occurrence 不匹配;observation_test.go:151-176的 semantic-call identity 要求 exact claim 与 budget。 - replay/terminal:
observation_test.go:55-149覆盖 final source binding、consume once、terminal disposition;predispatch_test.go:14-54覆盖 unchanged Broker boundary 一次 claim。 - unreached/orphan/cancel:
streaming_predispatch_test.go:127-153、predispatch_test.go:261-397覆盖 finalize、unclaimed disposition、cancel 与 wrapper/Broker failure。 - candidate/legality:
legality_test.go:13-180覆盖 verified exact call、frozen context、exact claim、unsupported shared questions 与 exclusive dynamic-call gate;pass_registration_test.go:9-78覆盖 unknown/duplicate/consumer drift。
仍然缺失或只能 Deferred 的负例
StreamingSemanticPreDispatch可以保存多个 child;Claim的 public Broker shape 只有 capability+arguments,并按 entries 顺序选第一个匹配者(streaming_predispatch.go:142-171)。虽然 prefix admission 按 source order 加入,当前 tests 没有证明两个不同 span、相同 capability+arguments 在异常/分支/多 occurrence 下仍能与 exact dynamic occurrence 双向 bijection。ObservationIdentity本身有CallSiteID,但 streaming parent claim 不把 dynamic call-site token 带入 Broker;最小的 fail-closed 选项是禁止同一 capability+canonical arguments 的多个 pending occurrence,或扩展 Host-owned claim adapter/multiplexer 明确传递 occurrence。- 没有现有测试断言:prefix digest 与 final digest 必然不同的 append-only suffix 下,每个 semantic-call record 被 promotion 后才可 claim;这正是本次 hypothesis 的独立复核缺口。
8. Test 与 machine-readable evidence
8.1 本次实际运行(固定 snapshot)
命令:
GOCACHE=/tmp/agent-python-runtime-review-gocache \
GOPATH=/tmp/agent-python-runtime-review-gopath \
go test ./runtime/semantic ./runtime/streaming ./runtime/capability
结果:三个 package 均 ok(semantic 0.338s、streaming 0.838s、capability 0.809s)。另运行:
go test ./integration/e2e \
-run '^TestRealGuestStreamingPrefixesPreDispatchThreeReadsBeforeSourceFeedCompletes$' \
-count=1
结果:ok github.com/bkmashiro/agent-python-runtime/integration/e2e 0.319s。这些是 focused correctness test results;没有由此宣称 timing dominance 或 observed interval trace。
8.2 Checked-in evidence 的保守解释
docs/evidence/semantic-predispatch-experiment.json含 artifact/source/Plan digest、baseline/semantic result digest 与 physical/logical counters,但没有足以把 producer、harness、checker 全部绑定到本 target 的 provenance packet;标为 Historical / evidence limitation。docs/research/semantic-speculation-phase3-campaign-result-v1.md明确是 frozen synthetic campaign result,且其 campaign source commit 不是本 target;不重跑、不把它当当前 target 的 runtime certification。docs/evidence/source-prefix-overlap-v1.json与source-prefix-day-trip-evidence-v2.json的 producer/harness commits 也不是本 target;它们最多提供 mechanism framing,不支持 natural speedup、wall-clock dominance 或本 target 的 final-source identity closure。- target commit 内
docs/evidence/prepared-data-phase3-v2.json的 final-source/release/object claim 字段属于 fixed NumPy prepared-data lane;不能证明 semanticObservationBindingSemanticCall的 prefix promotion。
9. EAGER:只做 opportunity-level comparison
当前 research comparator 的 contract 在 research/semanticspeculation/eager_contract_types.go:39-80,prepare builder 在 eager_prepare.go:13-79:
- EAGER-style gate 使用 target Python、complete top-level statement、one-token lookahead、persistent interpreter/dynamic batching;dynamic names/denied modules 触发 suffix seal,previous prefixes 不 replay。
BuildEagerComparator...发送 begin/chunk/finish prepare fragments 给 research-onlyeager_comparatornamespace;不是 production semantic pre-dispatch consumer,也不等于 Host-owned staged typed object。- semantic pre-dispatch 不保留 final Guest Python heap/frame:它使用 exact analyzer Guest(可多次独立 request)、Host physical prepared read、Run-private staged observation,再用 fresh final Guest 执行 unchanged source。
机会层解释: 在某些 source-generation tail 与 early Host read 能重叠的形状中,Pysolate 的 semantic path 可以暴露 EAGER-style “execute while generating” 不同的 opportunity:它移动的是显式授权的 physical work,不把更宽的 interpreter state/authority 留在持续运行的 Guest 中。代价是 exact analysis、qualification、budget、staging、claim、final fresh Guest 与 cleanup overhead;单次运行可能更慢。EAGER 也有 persistent state、suffix policy 与研究限定。故这里只能比较安全边界和可暴露的 opportunity,不能声称谁在 wall-clock 上支配谁。
10. Trade-offs 与拒绝的替代解释
Design trade-offs
- exact Guest analyzer 而非 Host parser: 保持 target CPython semantics 与 artifact provenance;代价是 analyzer instantiate/close 成本和不能复用跨 Run mutable state。
- skip-only lexical readiness: false positive 只增加 exact analysis,false negative 只少 speculation;避免 lexical candidate 直接获得 authority,但不表达任意 Python control flow。
- one-shot Host staged observation: 物理/逻辑/terminal 语义简单且不引入 durable cache;代价是不可用作全局 coalescing,也需要 final-source join。
- fresh final Guest: 不把 analyzer frame、globals、WASM memory 或 native state 当作 continuation;代价是不能宣称 same-Guest continuation。
- opaque Host plan/qualified call: 能保留 authority boundary;代价是 Broker public shape 不携带完整 occurrence token,multi-occurrence 需要额外 adapter 或 fail-closed cardinality。
明确拒绝
- candidate region、AST call、工具 schema、变量名、
read_only或idempotent不是 Host contract。 Prepare或QualifiedCall不是 physical start;physical completion 不是 logical call/cache hit。- prefix digest、monotonic append-only、父 controller
FinalSourceSHA256不能自动等价于每条 staged record 的 full-source identity。 SourceSeal.BindObservation的 stream-suite promotion 不能自动修复 semantic-call record。- test 通过、non-empty
source_commit、artifact SHA 字段或body_safe字段都不是独立 producer/consumer verification。 - authored source schedule、historical campaign 或 comparator report 不能被写成自然 agent latency、wall-clock dominance 或 observed interval trace。
11. 最小修复建议(不在本审查中实施)
- 为 streaming semantic-call 增加 Host-owned final-source promotion seam。prefix 阶段把 prefix digest 作为 provisional provenance 单独保存,不把它作为 sealed
ObservationIdentity.SourceSHA256。 - 在
SealFinalSource(finalSHA)内,先在 controller barrier 下对所有 child entry 做一次原子 promotion:将 final full-source digest 写入每条 observation identity,并以 final source 重建ExpectedObservationClaim/ClaimIdentitySHA256;任一 entry 已 terminal、identity 不匹配或 promotion 失败则整体 fail closed,不开放 claim。 - 由于当前
ObservationBindingSemanticCall.Validate(false)禁止 provisional semantic call,最小实现可以增加一个窄的 Host-owned semantic-call provisional/promotion adapter,或让 child 在 physical completion 前只保存 typed outcome,待 final seal 后以 final identity materialize record;不要简单放宽到“任意 unsealed semantic call 可 claim”。 - 增加 RED tests:
- prefix digest != final digest 且 source 只 append 时,record 必须先 final-bind 才能 exact claim;
- wrong final source、non-prefix replacement、wrong occurrence/call-site、argument drift、late/terminal/replay 均拒绝;
- claim identity 与 record identity 都必须含 final digest;父 snapshot 字段单独变化不得使测试通过。
- 对多 occurrence:若不扩展 Broker/Host adapter,则对同一 capability+canonical arguments 的多个 pending streaming entries 直接拒绝;否则加入 Host-owned occurrence multiplexer 与 bijection/race tests。
- 不把本次修复顺带扩大为 generic cache、coalescing、same-Guest continuation 或 arbitrary Python optimizer。
12. What this implementation does not establish
- 不建立 semantic analysis 与 final execution 的 same-Guest continuation;实际是 analyzer Guest → Host staged physical work → fresh final Guest。
- 不建立 candidate-to-authority 自动升级;所有 authority 来自 Host sealed Plan/contract/context。
- 不建立 semantic-call staged record 的 final-source record-level cryptographic binding(streaming prefix lane 当前缺口)。
- 不建立多 occurrence exact claim 的通用 public Broker ABI;当前 positive path 是 narrow/single exact call,streaming multi-entry 场景仍需 Deferred 负例。
- 不建立 read-only external operation 的无副作用事实;provider cost、workspace/file observability、timing 与 cancellation 仍属于 Host policy。
- 不建立 prepared result 的 durable/global cache、coalescing、replay 或 cross-Run reuse。
- 不建立任意 Python purity、动态 control flow、writes、captured playback、generic typed object ABI、自然 workload prevalence 或生产 readiness。
- 不建立 wall-clock dominance、production latency、或 observed interval trace。
13. 答辩版解释
Pysolate 不是看到 AST call 就提前执行。Exact target Guest 先对实际 source(或可见 prefix)产生 bounded semantic facts;Host 再把这些 facts 与 sealed capability Plan、canonical arguments、handler/spec/grant、freshness/privacy/lineage 和 per-Run budget 做 fail-closed join,才允许一次可丢弃的 physical preparation。原始 unchanged Guest 的 dynamic occurrence 仍是唯一的 logical claim point;没到达、source invalid、argument drift、cancel、run failure 或 finalization 的 work 只能被拒绝、cancel 或 orphan,不能变成 cache hit,也不能通过 mismatch 发起第二次 live request。
对 streaming semantic prefix,必须进一步区分三种 identity:prefix analysis identity、final execution source identity、logical occurrence identity。当前 target 已有 final source seal gate 和 exact final request equality,但
SealFinalSource没有把已创建的 semantic-call staged record 从 prefix digest promotion 到 final full-source digest。因此可以诚实宣称“bounded source-prefix staged opportunity + final-source claim gate”,不能宣称“每一条 prefix-staged semantic result 已完成 final-source record-level binding”。EAGER 只能作为 opportunity-level comparator;本审查不作 wall-clock dominance 判断。