Files
aios/docs/V2R2C2-P0-convergence-20260909.md
T

22 KiB
Raw Blame History

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.py
    • TrustedBuilderEvidenceMaterializer = 验证并投影 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 Producer operation:
    • 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 — operation governed.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_HEAD b519aa0 的 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-closed TrustedProviderReceiptResolver(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;无 resolver PROVIDER_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-2 producer_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 认证 v2 provider_receipt provenance 作为第二层输入(schema aios.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_receipt root-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.getuid absent、symlink 特权 WinError 1314、Python 3.13 stat_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 逐文件一致)。三修复:

  1. 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。
  2. Receipt append-only 不可变——每次 run 独立 namespace round3-gate-w/<source[:12]>/<run-id>/<kind>.json,旧 receipt 永不删除/覆盖;相同 ref 已存在则 GITEA_PROVIDER_RECEIPT_EXISTS fail-closed(O_EXCL+O_NOFOLLOW root-owned 写入)。
  3. 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(新增)——mock GitRunner: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。仓库权威 runner tools/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。