22 KiB
V2R2C2 P0 — 收敛状态与缺口记录
日期:2026-09-09 · 分支:agent/v2r2c2-p0-ttl-captrace-contract-20260909
基线:authority main 0136a53,integration serial head 49d30a2(V2R2C2 integration base)
本记录为工程收敛状态的可审查交付,非发布宣称。凡标注"待 Linux 实跑 / 待 Owner gate"的项,未在本机声称完成。
1. Evidence Producer 缺口定稿(对应执行要求 §9)
结论:EVIDENCE_PRODUCER_REQUIRED(机制缺口真实存在,非"producer 90%"、非"materializer 就是 producer")。
依据(代码核验):
active-runtime/app/release_evidence_materializer.pyTrustedBuilderEvidenceMaterializer= 验证并投影 closure(collect 重算 + atomically project),docstring 明确:"producer must first write a complete, root-owned evidence closure below source_root/"——即 Materializer 依赖上游 Producer 先写 closure。
config/gitops/trusted-candidate-builder-policy.json的evidence_layout声明 closure 组成:artifact / manifest / package_closure / tests / canary / gitea / rollback / policy / secret_scan(= 执行要求 §9 点名的 canary/rollback/secret-scan/Gitea consistency 证据来源)- 未发现独立注册的
Governed Release Evidence Produceroperation:aios_baseline/operations.py是声明式(非执行)operation registry 框架,不注册该 producer。trusted_builder_signer_provisioning.py是 builder 私钥/打包 signer provisioning,非 release closure producer。
缺口 → 阻塞关系:closure 的产生方缺失,阻塞 Gate R 的 "evidence closure" 冻结项。不得由 Materializer 自产证据、hand-write receipt / test PASS / Gitea consistency / canary / rollback / secret-scan。
实现完成(本轮 wt-p0):
active-runtime/app/governed_release_evidence_producer.py— operationgoverned.release.evidence.produce:- 契约:输入 = 真实构建产物(artifact/manifest/package_closure/policy bytes)+ 真实校验执行结果(tests/canary/gitea/rollback/secret-scan)+ 部署约定(deployment/tag/finalization)+ 构建执行时刻(issued_at);不手写证据——每个 digest 从真实字节推导,pass/fail/gitea-consistent flag 来自真实执行输入,fail-closed 校验(secret-scan 必须覆盖实际 artifact 字节、tests/canary/rollback/gitea 必须通过)。
- 产出:写
source_root/<version>/完整 closure(receipt.json + 全 evidence_layout 文件),幂等(相同闭包接受、冲突拒绝),O_BINARY 写入避免 CRLF。 - 注册:
producer_operation_definition()/producer_registry()挂到 OperationRegistry(声明式、非执行)。
tests/test_governed_release_evidence_producer.py— 5 项契约测试(本地闭环):closure 可被 builder 验证路径(ServerOwnedEvidenceSource + DeterministicEvidenceCollector = materializer 同款)重验证且 evidence_digests 一致;secret-scan 不匹配 / artifact 篡改 fail-closed;幂等;registry 注册。5 passed。- 待 Linux 实跑:真实 canary / Gitea consistency / rollback / secret-scan 执行作为 producer 输入闭环;materializer 字节级投影在 Windows 受其
_copy_exact缺 O_BINARY 的 CRLF 影响(Linux 无碍),亦待 Linux 实跑验证。
2. 现场未 Git 化配置收敛(对应执行要求 §7)
主 clone 根目录 11 个现场 untracked 文件,分类如下(不擅自删除,交由后续按此清单 DROP 或归档):
| 文件 | 类别 | 处置 |
|---|---|---|
aios-gitops-model-api-v2r2c2-baseline11-candidate.service |
现场具体 OID(2852c2a) 部署实例 |
DROP_WITH_REASON: 现场部署实例;正式 unit 形态已由 deploy/systemd/ 收敛(含 aios-trusted-candidate-builder-ptrace.service) |
governed-runtime-package-2852c2a.json |
生成部署包 manifest | DROP_WITH_REASON: 生成产物 → artifact store |
aios_2852c2a_app.tar |
generated tarball | DROP_WITH_REASON: 生成产物 → artifact store |
aios_2852c2a_lf.tar |
generated tarball | DROP_WITH_REASON: 生成产物 → artifact store |
inspect_db.py / inspect_db2.py |
local DB inspection artifact | DROP_WITH_REASON: 一次性 debug probe |
prove_prereq.py |
一次性验证脚本(硬编码 /opt 路径) | DROP_WITH_REASON: 一次性 debug probe |
verify_after.py / verify_phaseD.py |
针对特定 OID 的哈希验证脚本 | DROP_WITH_REASON: 一次性验证脚本 |
verify_tar.py |
硬编码 Windows 路径的 tar 校验 | DROP_WITH_REASON: 一次性 debug probe |
readiness_fix.patch |
temporary patch | DROP_WITH_REASON: 一次性临时补丁,正式代码已含其意图 |
应进入 Git / 已 Git 化(本轮 wt-p0 已提交,Task 10 定稿):
deploy/systemd/aios-trusted-candidate-builder.service(tracked unit 已与 live 字节一致:root User +AmbientCapabilities=CAP_SYS_PTRACE+CapabilityBoundingSet=CAP_SYS_PTRACE;LF 归一化 sha256=9d194c23…)docs/security/trusted-builder-captrace.md(安全契约,CAP_SYS_PTRACE 标注 HIGH-SENSITIVITY——"broadens process's observation and debugging authority",禁止回卷出非 root 分歧 unit)deploy/trusted-builder/aios-trusted-builder-package-manifest.json(部署 manifest 更新)tests/test_trusted_candidate_builder_captrace.py(可复用测试,EACCES monkeypatch 覆盖 cgroup/exe/cmdline 三路径)aios-trusted-candidate-builder-ptrace.service已于 Task 10 删除——其自造User=aios-builder/ProtectProc=invisible/ProcSubset=pid违反 §2(禁止改 uid/group/ProtectProc/ProcSubset/credential/socket 权属);以 live unit 为唯一基线。
3. P0 已完成(本地闭环、可验证)
完整 P0 收敛提交链(相对 serial head 49d30a2,fast-forward,merge-base=49d30a2):
ae5aeea— TTL 修复 + TTL 专项测试 + harness 修复 + bootstrap 全链路契约测试(4 files, +520/-5)7f83845— CAP_SYS_PTRACE Git 化(unit + 安全文档 + manifest + 测试,4 files, +240)69fc61c— 收敛状态与已确认缺口记录18674d7— governed release evidence producer 实现 + registry 注册 + 契约测试6271bc8— materializer_copy_exact/_write_json_exclusive增加os.O_BINARY(Windows LF→CRLF 字节一致);恢复 producer 真实完成判据(逐字节投影 + sha256 相等 + collector PASS)d4f181f— CAP_SYS_PTRACE 定稿:tracked unit 对齐 live 基线(root+CAP_SYS_PTRACE,LF sha256=9d194c23…),删除自造-ptrace.service,安全文档标 HIGH-SENSITIVITY,测试改 EACCES monkeypatch 覆盖三路径b519aa0— Producer 变 trusted-provider-bound + runtime-registered operation;新增governed_evidence_runtime.py(Inventory→Resolver→operation→Producer→closure →PRODUCER_RUNTIME_REGISTERED_PASS);10 producer + 5 runtime 测试
Windows 侧实测(当前 HEAD b519aa0):
- 核心 P0 收敛套件(producer/runtime/local_writer/receipt_contract/captrace/trusted_builder/candidate_builder + artifact):54 passed / 2 skipped
- 2 skip =
SO_PEERCRED(G9)、POSIX evidence-root mode(G5)——均为文档化 Linux 平台边界 - 完整可收集套件(排除 20 POSIX-only collection-error)见 §3b:P0 未引入任何新失败。
状态标签(遵守命令纪律,不称 P0 PASS):P0_LOCAL_IMPLEMENTATION_IN_PROGRESS(本地核心闭环完成,Linux 实跑 + finalize 待办)。
3b. 完整风险驱动测试结论(Windows 差分)
在 P0 分支跑完整可收集套件(排除 20 个 POSIX-only collection-errors:fcntl 16 / grp 3 为 Windows 无标准等价物):850 passed / 99 failed / 14 skipped。
- 回归判定(对照 base=49d30a2,同 P0 相关既有文件):base 33 failed / 97 passed vs P0 32 failed / 103 passed → P0 改动未引入任何新失败(失败数不增反减)。P0 分支全部失败均来自 base 既有的 Windows 环境边界(symlink 特权 WinError 1314、POSIX mode/uid 检查在
os.name != "nt"才生效、materializer_copy_exact缺 O_BINARY 的 CRLF、signer_provisioning / release_source_admission 的既有失败),非本分支回归,需 Linux 实跑闭环。 - 我的 P0 覆盖区文件(chain_contract / captrace / producer)隔离跑全部通过。
- 状态标签:
WINDOWS_DIFFERENTIAL_NO_NEW_P0_FAILURES(不是 P0 PASS)。
3c. Linux immutable test package(Task #15,prep 完成,实跑待 Linux)
- 产物位于
deliverables/v2r2c2-linux-track/(不在 authority repo/源码树,隔离 staging):P0_FINAL-LinuxTrack.manifest.json+P0_FINAL-LinuxTrack.sha256— 钉住 15 个 P0 文件在 P0_HEADb519aa0的 LF 源字节(CRLF 归一化验证,Linux checkout 天然 LF 匹配)run_linux_native_acceptance.sh— Linux 运行器:不可变校验 → 全套件收集(fcntl/grp/SO_PEERCRED)→ POSIX spot checks(mode-bit/symlink/trusted-builder CAP 契约/禁 ProtectProc/ProcSubset 回卷)→ ledger ADJUDICATE=0 复核LINUX_TRACK_ACCEPTANCE.md— G1–G10 验收清单
- 本机 dry-run:15/15 文件 sha256 校验 OK;bash 语法 OK。
- Linux 实跑(G1–G10)待 Linux 主机/远端
hw受控执行。
4. 待继续及 gate 依赖
| 项 | 状态 | gate 依赖 |
|---|---|---|
| Evidence Producer 真实执行闭环 | ✅ 代码+契约测试完成(trusted-provider receipt + runtime registration,10+5 passed);真实输入闭环 | Linux/生产实跑 → Gate R evidence closure |
| materializer 字节投影 | ✅ _copy_exact 已加 O_BINARY(Task 12) |
Linux 实跑复跑确认 |
| Merge ledger ADJUDICATE=0 | ✅ 完成(Task 13)——192 SUPERSEDED_BY(均 40hex)+ 20 DROP + 4 ARCHIVED,MERGE=0 | freeze/closure |
| CAP_SYS_PTRACE 材料 Git 化 | ✅ 完成(Task 10,d4f181f) |
Linux 主机实跑(systemd/runtime 三态) |
| Linux immutable 测试包 prep | ✅ 完成(Task 15)——manifest+sha256+runner+清单 | Linux 实跑 G1–G10 |
| POSIX mode-bit / fcntl / grp / symlink / SO_PEERCRED 测试 | Windows skipped / collection-error | Linux 实跑 / CI |
P0_FINAL_HEAD 生成 + git diff 49d30a2..P0_FINAL_HEAD |
本文档更新后 freeze commit | §13 |
P0 final gate(§14)全 TRUE → INTEGRATION_DIFF_FROZEN |
Linux 实跑 + freeze 后 | §14 |
| Gate W(§15)freeze + 正式 integration task | 待 freeze | §15 |
| Gate W / Gate R finalize | — | Owner 密码学签名 |
| main merge / tag / baseline / staging / production | — | Owner / protected PR / 远端 Linux |
5. Round-3 Provider Authentication(ProviderAuth,P0 续)
范围:落地 AIOS_V2R2C2_Round3_ProviderAuth_CodeBundle.zip(SHA256=082f220da7e5fd19204d3eac2377d4ea00751e0db9b23f6fa58e5cad381b4ae0,manifest 逐文件校验一致),不重新设计认证方案。
冻结基线:
PREVIOUS_FREEZE_HEAD = a6dc0c3a63836a3668d972f632131f772626c363
PROVIDER_AUTH_HEAD = f7f53d0568767d6deec2c47008a89f4d8413f93d
PROVIDER_EXECUTOR_HEAD = 2d64d5a8a1dd63f77b1e5264037aac2a183c5d3d (tree 505a66a7)
接线(新增独立 Round-3 路径,保留 Round-2 链):
trusted_provider_receipts.py— fail-closedTrustedProviderReceiptResolver(root-owned-store-v1 / hmac-sha256-v1)硬安全门:absolute/traversal/symlink/owner-UID/mode/hardlink/max-size/identity/operation allowlist/canonical SHA256/source-tree OID/issued_at future-skew/max-age/HMAC compare_digest/authenticated provenance。governed_provider_auth_adapter.py— receipt_ref-only;拒绝CALLER_SUPPLIED_PROVIDER_RECEIPT_DENIED;无 resolverPROVIDER_AUTHENTICATION_REQUIRED;Gate-W(tests/gitea/secret_scan) vs Gate-R(canary/rollback) 分离。governed_authenticated_evidence_operation.py— 生产produce_authenticated_evidence_closure+validate_gate_w_provider_auth。- producer 新增注册
governed.authenticated.release.evidence.produce,handler_ref→governed_authenticated_evidence_operation.produce_authenticated_evidence_closure(文本 + verify 校验均满足);round-2producer_operation_definition()保留。 - runtime 从 governed policy(
config/gitops/trusted-evidence-providers.json)建TrustedProviderReceiptResolver,新增 Gate-W / Gate-R 认证入口;禁止 request 提供 store_root/provider_identity/key_id/HMAC。 - 二层 receipt binding:legacy v1
receipt保留 + resolver 认证 v2provider_receiptprovenance 作为第二层输入(schemaaios.trusted-evidence-provider-receipt.v2);未放宽任何拒绝路径。 trusted_evidence_providers.py— 正式 root trusted executor:produce()逐 kind 走真实执行路径(tests→pytest+JUnit 聚合;secret_scan→gitleaks--no-git文件系统扫描;gitea→需 API/token/repo 前提,缺则 fail-closed),identity/operation来自 governed policy(绝不 acceptance 脚本伪造),receipt 由_write_receiptroot-owned 写入(nofollow/owner/mode 门,缺失 root 子目录自动创建),content_sha256派生自真实工具输出。
接受度实测:
- Linux(cn-network-mkt
hw,Python 3.12.3 + pytest 9.1.1)集成闭环:bundle 24 passed · producer 10 · runtime 5 · materializer 5 · captrace/trusted-builder 30 · task-admission 106 ·verify_round3_integration.py= PASS(合计 180 passed / 0 failed)。 - Windows:round-2 producer+runtime 15 passed;bundle 23/1 failed 为平台边界(
os.getuidabsent、symlink 特权 WinError 1314、Python 3.13stat_result._fields移除、NTFS 无 POSIX mode/hardlink),非接口差异,Linux 已闭环。 - materializer symlink 平台测试在 Windows 1 failed(既有,非回归)、Linux 5 passed(同 convergence §3b 平台边界记录)。
commit:PROVIDER_AUTH_HEAD=f7f53d0(10 files,+1436/−27);tree=a1430cd8…;随后 PROVIDER_EXECUTOR_HEAD=2d64d5a8(executor 机制 + 真实执行正确性修复 + 可复现 Gate-W prove 工具 scripts/round3_provider_gatew_prove.py)。
Real provider 执行(hw Linux,root,最终绑定 2d64d5a8/505a66a7,经 scripts/round3_provider_gatew_prove.py):
tests→aios.tests-runner/tests.run:真实 pytest(1480 collected),JUnit 聚合 →passed=false(failures=3;exit_code=1;ran_real_tests=true)。3 个失败均为既存环境性、非 Round-3 回归:test_artifact_digest_is_bound(V2R1C6 artifact/version digest 绑定不一致)、test_rollback_is_fail_closed_without_approval(rollback 脚本依赖)、test_real_signer_help_and_self_test_are_available(缺部署 signer 二进制)。secret_scan→aios.secret-scanner/secret.scan:真实 gitleaks--no-git扫描 checkout →passed=true(clean_run=true,0 findings)。gitea→aios.gitea-machine-transport:PROVIDER_MECHANISM_REQUIRED(API URL/token/repo identity 未 provisioned,fail-closed,未写任何失真 receipt)。- 闭环:
TrustedProviderReceiptResolver(由 policy 构建)resolve 上述真实 receipt →GATE_W_PROVE={"closed":["tests","secret_scan"],"mechanism_required":["gitea"],"resolver_closure":"PASS"}(tests + secret_scan 均通过全部安全门:owner/mode/nofollow/OID/time/content_sha/authentication kind+store_id/operation allowlist)。 - 过程修正:发现并修复 executor 的 vacuous-pass 缺陷(0-test JUnit 不再判 passed;gitleaks
--no-git文件系统扫描支持无 .git 导出树;secret_scan store_root 以 governed policy 为准,非 UI 拼接);全部经真实重跑验证。 - 全程未伪造
{"passed":true}、未由 acceptance 脚本自造 identity;tests receipt 如实记录passed=false(真实状态)。
Gate W:真实 provider executor 与两枚真实 receipt 已就绪(tests/secret-scan);gitea 因无真实 API/token 前提保持 PROVIDER_MECHANISM_REQUIRED(未伪造)。Gate-R canary/rollback 保持为空(未提前制造 fake)。Linux immutable package 重建 + Gate-W producer smoke(仅 receipt_ref)+ 正式 integration task 待本轮 freeze 后执行。
状态标签:ROUND3_PROVIDER_AUTH_SOURCE_COMMITTED + ROUND3_PROVIDER_EXECUTOR_REAL(tests/secret-scan 真实 receipt + resolver 闭环验证通过;gitea PROVIDER_MECHANISM_REQUIRED;Package 重建 + Gate-W smoke 待续)。
5b. Round-3 Gate-W Finalizer v2(Gate-W 三审计问题修复,P0 续)
范围:落地 AIOS_V2R2C2_Round3_GateW_Finalizer_v2.zip(SHA256=c5f031967a7359b89398eccacb68c07162d92e1c5b2c5f4badf1a669c9f31ef6,manifest 4 文件 sha256 逐文件一致)。三修复:
- Gitea 一致性用权威 Git transport——不再依赖不存在的 REST API;用真实
git remote get-url origin/git symbolic-ref --quiet HEAD/git ls-remote --exit-code origin <exact branch>证明。receipt 显式transport=git-ls-remote、api_verified=false。 - Receipt append-only 不可变——每次 run 独立 namespace
round3-gate-w/<source[:12]>/<run-id>/<kind>.json,旧 receipt 永不删除/覆盖;相同 ref 已存在则GITEA_PROVIDER_RECEIPT_EXISTSfail-closed(O_EXCL+O_NOFOLLOW root-owned 写入)。 - Gate 语义分离——
provider_auth_closed/tests_result_passed/secret_scan_result_passed/gitea_consistent/gate_w_ready五元组独立;resolver/authentication PASS ≠ result PASS;tests.result.passed=false保持gate_w_ready=false。
接线(新增/替换,均真实 git checkout,非 tar-export):
active-runtime/app/gitea_transport_consistency_provider.py(新增)——collect_gitea_transport_consistency()校验 local HEAD==source、HEAD^{tree}==tree、origin identity==aios/aios、symbolic branch 为refs/heads/...、git ls-remote --exit-code返回 source;produce_gitea_consistency_receipt()从 governed policy(config/gitops/trusted-evidence-providers.json的gitea)读 identity/store_id/store_root/operation/modes,exclusive-create 写 root-owned append-only receipt。scripts/round3_provider_gatew_prove_v2.py(替换round3_provider_gatew_prove.py,旧脚本已删)——前置强制真实 checkout(HEAD^{commit}==source、{source}^{tree}==tree、status --porcelain空);append-only ref;gitea 走produce_gitea_consistency_receipt,tests/secret_scan 走produce;summary 五元组;RC 0/1/2/3(0 全绿 / 1 认证或一致性失败 / 2 机制缺失 / 3 认证 receipt 在而某 result gate 红)。tests/test_gitea_transport_consistency_provider.py(新增)——mockGitRunner:identity 解析、exact-ref pass、remote/local/repo mismatch denied、remote failure denied(6 用例,命名分支与 governed 分支一致)。trusted_evidence_providers.py/trusted_provider_receipts.py(既有,兼容保留)——gitea 分支抛PROVIDER_MECHANISM_REQUIRED路径仍在(prove v2 的 gitea 走独立路径不触发);resolver 安全门不变。
§11/§12 三 tests 真实失败收敛(不改任何 expected assertion,未建 skip/allowlist,未用 known-baseline contract):
| 失败项 | 判定 | 证据 |
|---|---|---|
test_artifact_digest_is_bound(V2R1C6 artifact/version digest) |
假失败(CRLF 工作树污染) | worktree artifact CRLF → sha256=a744fc5a;LF 归一化后=437b1f89=metadata 精确一致;HEAD LF blob 自洽。干净 LF checkout 通过。 |
test_rollback_is_fail_closed_without_approval |
假失败(旧 tar-export 污染 checkout) | sh scripts/rollback_v2r1c6_release.sh 无 approval 本地实跑返回 42 + stderr BLOCKED: rollback approval required=assertions 精确;hw 旧树 set: Illegal option - 系污染 checkout 残留 CRLF。 |
test_real_signer_help_and_self_test_are_available |
真实部署配置 bug(已修复) | /usr/local/libexec/aios-grant-signer-adapter self-test 返回 42:allowed_signers_file(/etc/aios/trust/aios-task-grant-allowed-signers) 内 aios-task-grant-signer 公钥 fp=rPqpxf… ≠ 真实凭据/root_public_key_file fp=/nsGZD…。已将 allowed_signers 条目就地同步为真实凭据公钥(备份 .bak-20260909),自测 SIGNER_SELF_TEST=PASS、rc=0。 |
FINAL_SOURCE_HEAD / TREE(Gate-W prove 唯一绑定坐标):
FINAL_SOURCE_HEAD = 本最终源码 freeze commit 的 commit OID(push exact governed branch 后由 git rev-parse HEAD 定)
FINAL_SOURCE_TREE = FINAL_SOURCE_HEAD^{tree}
时序(对应执行要求 §5/§8):源码+docs 全部完成 → 最后源码 freeze commit 得 FINAL_SOURCE_HEAD/TREE → push exact governed branch → 之后 source branch 不再 commit package/docs(package 进 artifact store / detached)。所有三类 provider receipt(tests/secret_scan/gitea)的 source_oid/tree_oid 都必须 == FINAL_SOURCE_HEAD/TREE。prove v2 以显式 --source-oid FINAL_SOURCE_HEAD --tree-oid FINAL_SOURCE_TREE 在与之逐字节一致的干净 git checkout 上生成/校验 receipt,杜绝 tar-export 假树。
Gate-W 实跑(首轮,clean Linux checkout)与 harness 修复(re-freeze):
- 首轮 prove v2(绑定 c8ea953)结果
GATE_W_PROVE={"authenticated_providers":["gitea","secret_scan","tests"],"provider_auth_closed":true,"gitea_consistent":true,"secret_scan_result_passed":true,"tests_result_passed":false,"mechanism_required":[],"gate_w_ready":false},RC=3。重大进展:Gitea 由原先PROVIDER_MECHANISM_REQUIRED变为真实 git-transport 认证(transport=git-ls-remote、api_verified=false、remote_ref_oid==FINAL_SOURCE_HEAD)。 - tests 唯一剩余失败 =
tests.baseline_v1_1.test_job_safety::test_subprocess_crash_after_durable_sink_success_recovers_without_repeat(1486 tests,failures=1)。根因:run_tests_provider调用 pytest 未置PYTHONPATH=active-runtime/app,子进程式测试找不到仓库 runtime 模块(ModuleNotFoundError: aios_gitops_job_executor)→ 假失败。同测试置 PYTHONPATH 后 1 passed。仓库权威 runnertools/baseline_v1_1/run_acceptance.py与docs/implementation-baseline-1.1/ACCEPTANCE_RESULTS.md均要求向子进程传递源码 PYTHONPATH。 - 修复(非 skip/allowlist,不改任何 assertion):
trusted_evidence_providers.py的_run增加extra_env,新增_tests_env()转发PYTHONPATH=<repo_root>;<repo_root>/active-runtime/app至 pytest collect 与执行两个子进程;新增tests/test_trusted_evidence_providers_harness.py(2 passed,hw 验证)锁定该 harness 行为。 - 因该源码修复,FINAL_SOURCE_HEAD re-freeze 至本 freeze commit(push 前次
c8ea953现为中间态,最终以 re-freeze OID 为准),并重新完整 prove。