# 项目级声明式 Shared Content Publisher V1 实现交付 ## 1. 事项与边界 - task:`TASK-AGRICULTURE-PESTICIDE-FERTILIZER-20260818-001` - case / batch / run:`ANA-AGRICULTURE-PESTICIDE-FERTILIZER-20260818-001 / BATCH-004 / RUN-ANA-AGRICULTURE-PESTICIDE-FERTILIZER-20260818-001-BATCH-004-001` - implementation authority:`HANDOFF-INFOADMIN-LAOYANCAI-AGRICULTURE-BATCH004-SHARED-PUBLISHER-CONSOLIDATED-SUCCESSOR-20260821-001` - fixed review request:`HANDOFF-DEV-LAOYAN-LAOSHEN-AGRICULTURE-BATCH004-SHARED-PUBLISHER-CONSOLIDATED-IMPLEMENTATION-REVIEW-20260821-001` - owner / reviewer:`dev.developer.ana.cai / dev.reviewer.ana.cai` 本交付只实现项目级、版本化、声明式共享 publisher 及其生产形态隔离测试;没有生成真实 BATCH-004 config,没有创建 attempt、lock、receipt 或 ledger row,也没有调用生产 publisher。农业内容、candidate、current、promotion ledger、Repair007/Repair008 和失败历史均保持不变。 ## 2. 实现对象 | 对象 | bytes | SHA-256 | |---|---:|---| | `dev/ana-dev/shared_content_publisher/publisher.py` | 44329 | `99C90DC15603DCFA1CB695C3A573EE4AA88D9B2594E4FF46750D6E6503EEEC62` | | `dev/ana-dev/shared_content_publisher/batch_config.schema.json` | 7078 | `73DECA1A7420E139692A2B0C91812C0CC90B78900816DCE36C6DD0B6DBBA0225` | | `dev/ana-dev/shared_content_publisher/README.md` | 1382 | `8B0E525019E712A50CEE0698CA3F5AE371D3EAC1D6517D5E2EBE220300FBE701` | | `dev/ana-dev/shared_content_publisher/__init__.py` | 168 | `9E83FAEF6958A15DE89A35691AEFA0860E881DAAB7E06378AABC0A693956CCFD` | | `dev/ana-dev/shared_content_publisher/__main__.py` | 86 | `DC3EA832B1DE49CBBE2EF61241524DB0751C9AB48FA2D42A49D58E01DB80B773` | | `dev/ana-dev/test/test_shared_content_publisher_v1.py` | 17414 | `3C56F448F22E4E6CB6FA7D22F866B14EB0603F16A6F5AF8BFFC9AA22E5A96E05` | 公共入口: ```text python -m shared_content_publisher --config --validate-only python -m shared_content_publisher --config ``` 生产和测试使用相同 schema、相同 validator 和相同 publisher 入口;没有 batch-specific wrapper、私有 reader 或内存替身。 ## 3. 声明式配置与三项 blocker 闭环 ### 3.1 单一配置来源 严格配置仅有六个顶层字段:`schema_version / identity / roots / expected / commit / test_control`。所有 task、case、batch、run、attempt、release、candidate set、根、卷、路径、ledger、prior、history、current state、candidate rows、link/evidence anchor 和提交目标均来自这一配置。缺失、额外、重复 key、类型错误、路径逃逸、reparse、对象类型或 identity 漂移均在 exclusive lock 之前失败关闭。 ### 3.2 Blocker 1:attempt2 runtime 未冻结 publisher 源码和 schema 不含 `ATTEMPT-B004-000001`、`ATTEMPT-B004-000002`、农业或 BATCH-004 字面量。attempt、reader checks、receipt、lock、snapshot、ledger/ref 和 target identity 都从 config 派生。因此下一真实 attempt 使用新的 config 即可,不再复制 batch-specific runtime。 ### 3.3 Blocker 2:prior ledger 与 attempt sequence 不匹配 publisher 先校验 ledger 精确 bytes/SHA、固定 17 列表头、全局 event sequence 唯一性和 preserved prior terminal;再从真实 ledger 推导 `next_event_seq` 与同 task/case/batch/run 的 `next_attempt_seq`,并与 config 声明交叉验证。旧 `8EED...` ledger、sequence 1、bytes/SHA 漂移或 prior terminal 不一致均在首写前拒绝。 当前生产只读验证:`promotion_ledger.csv=12716/ED2A83E2E6D1A695CF4DD24A79118B4DC99DAD75028B321D289114942F16B8BD`;其 preserved attempt1 terminal 为 `ROLLED_BACK`。实际下一 event 从 16 开始,下一 attempt sequence 为 2;attempt ID 是独立声明字段,不从尾号猜测。 ### 3.4 Blocker 3:AUDIT / HANDOFF binding 歧义 `canonical_audit_id` 和 `review_handoff_id` 是不同的必填字段、不同前缀域且禁止相等。release preimage 固定为 `industry/task_id/case_id/batch_id/run_id/canonical_audit_id` 六行 UTF-8 LF,只允许 canonical AUDIT 进入。review HANDOFF 只进入配置和 receipt 绑定,不进入 release hash。 生产冻结值按此公式独立得到 `357 bytes/f39db200057f733df3d34ebc0387000d6af4a29d2a3e3ed787c20268b5fcace7`;HANDOFF 替换会被 ID 域或 release preimage 门禁拒绝。 ## 4. 发布与恢复合同 1. 首写前完整验证 operation root/resolved root/volume、全部相对路径、普通非 reparse 目录和文件、lock/attempt/target/staging absence、ledger、prior exact-set、history exact-set、current state、candidate exact-set、candidate manifest、current manifest、链接/证据锚和 manifest-self candidate-set。 2. Windows 文件由普通完整读取与独立流式 SHA-256 双实现复核;空文件、不可读、missing/extra/duplicate/reparse 或 hash 漂移失败关闭。Repair008 的 63/63、12 条 `>=260` 路径合同被同一实现复用。 3. 首个正式写是 exclusive lock。随后形成完整 prior snapshot,把 candidate 全量复制并 readback 到同卷 staging release。 4. staging 通过后只执行一次目录 rename,再原子 replace 唯一 current pointer;提交前 prior 始终可读,提交后 target exact-set 与 pointer 全量复算。 5. postcommit 失败时只允许一次 pointer 回退并复核 prior pointer;不逐文件修补。已回滚 terminal 的重复调用失败关闭。 6. 已提交且 terminal、pointer、target exact-set、lock absence 全部一致时,exact repeat 返回 `IDEMPOTENT_COMMITTED` 且 ledger 不变;任何 published drift 都拒绝。 实现没有 maintenance/no-current、lease、逐状态 fault matrix、batch-specific reader 或多审核阶段。 ## 5. 生产形态隔离测试 - Windows CPython compileall:PASS。 - JSON schema strict parse:PASS。 - `unittest`:`9/9 PASS`,约 12 秒;累计 23 次同一 CLI 调用。 - 正向:首写前 validate、完整 commit/readback、exact repeat 幂等。 - rollback:注入 postcommit readback failure,只切回 prior 一次;rolled-back repeat mutation0。 - ledger:bytes/SHA 漂移与 next event sequence 漂移。 - identity:AUDIT/HANDOFF 互换、candidate-set 漂移、release preimage。 - candidate:payload 漂移、current/candidate manifest binding、链接/证据锚缺失、attempt target 已存在。 - history:63 个普通文件、其中 12 条绝对路径 `>=260`;长路径内容漂移被独立读取命中。 - filesystem:root、volume、relative path、target exists、junction/reparse。 - schema:missing、extra、type error。 - terminal:published target 漂移时拒绝假幂等。 ## 6. 正式现场只读证明 - Repair008 R06 evidence:`152316/8736ACD79B53F62CC6CFBC5CFAEBBB7BF0DF94D933A8E515C4482B0DC86E6315`。 - CPython 对真实 failed attempt 独立逐文件流式复算:`file_count=63`、`long_path_count=12`、`mismatch_count=0`、positive bytes `63/63`、uppercase SHA-256 `63/63`。 - failed attempt manifest 仍为 Windows PowerShell 5.1 目标身份:`7480/F66093023D91793AF8C03A72F4CE001F915EA7E986AAD788FDB61F922946E767`。 - canonical reader receipt:`2874/9C4BBC12B5DCC6BB700DE98D4CDD3E91B2170CF4DD6DD1D4B9ACBD0342155202`,仍为 `RECOVERY_REQUIRED/BLOCKED/30`,ledger latest=`ROLLED_BACK`,committed=`0`。 - 正式 current frozen identities仍为:cases `2701/B9B02A...36A4`;core `51587/6EDC2D...EEE7`;manifest `588/CAE3F8...D558`;result current `459/3671D3...594E5`;case result `3051/31CBD0...15B`。 - `ATTEMPT-B004-000002` 与 `ATTEMPT-B004-000003` 均不存在;active BATCH-004 lock 不存在;production publisher invocation=`0`;production mutation=`0`。 ## 7. 审核请求 请既有 `dev.reviewer.ana.cai` 在同一 consolidated review 中只判断: 1. 三个 BLOCKED/3 是否由通用 config/ledger/audit contracts 一次关闭; 2. publisher 是否不含行业/批次/attempt 硬编码; 3. exact-set、manifest/link/evidence、同卷 atomic pointer、readback、一次 rollback 和 idempotence 是否非空; 4. 长路径与生产只读 mutation0 证据是否成立。 请求一个正式 `PASS/0` 或一次列全的 `HOLD/N`。本交付不是 production invocation 或 promotion authority;审核 PASS 后由 project.admin 另行创建唯一真实 config 与新 attempt。 ## 8. HOLD/3 聚焦 successor(2026-08-21) ### 8.1 唯一续派与复审拓扑 - authority:`HANDOFF-INFOADMIN-LAOYANCAI-AGRICULTURE-BATCH004-SHARED-PUBLISHER-HOLD3-FOCUSED-SUCCESSOR-20260821-001` - predecessor audit:`AUDIT-DEV-ANA-SHARED-CONTENT-PUBLISHER-V001-CONSOLIDATED-IMPLEMENTATION-001 / HOLD/3` - fixed focused rereview:`HANDOFF-DEV-LAOYAN-LAOSHEN-AGRICULTURE-BATCH004-SHARED-PUBLISHER-HOLD3-FOCUSED-REREVIEW-20260821-001` - owner/reviewer tasks 保持原值;没有第二个修复事项、第二条 review chain 或新 authority。 ### 8.2 三项 blocker 的单补丁闭环 1. `BLOCK-SHARED-PUBLISHER-IMPL-01`:删除不可执行的 JSON pointer 合同。`SHARED_CONTENT_PUBLISHER_CONFIG_V2` 的唯一用户入口提交点固定为既有 cases Markdown `当前成果索引.md`;候选 release 目录先完成,最后使用同卷原子 replace 切换 cases Markdown。result Markdown 只读校验为指向 cases 的薄入口,不迁移消费者。 2. `BLOCK-SHARED-PUBLISHER-IMPL-02`:从卷根到 operation root 逐组件验证普通、非 reparse、非 alias;managed path graph 除 release-store/target、receipt/snapshot 两个明确父子关系外全部 case-insensitive disjoint。exclusive lock 成功后、任何 ledger append 前完整重读 config、ledger/current、prior manifest+self、candidate manifest/exact-set、link/evidence、history/current-state,并重新推导 event/attempt sequence。新事件使用真实 UTC 和 `PID+UUID` 进程实例身份;prior release-set 固定为 current-manifest bytes + canonical self descriptor 算法。 3. `BLOCK-SHARED-PUBLISHER-IMPL-03`:candidate current manifest 必须精确覆盖全部发布成员和 invariant result entry,manifest self formal path 必须等于实际 release member;link/evidence checks 均非空。首次 postcommit 和 replay 都验证 target exact-set、拒绝 extra。幂等成功绑定 config bytes/hash、root/volume、完整 terminal、完整 event chain、Markdown current/result、prior snapshot、target exact-set 和 lock absence;已切换但闭环漂移时先恢复 prior Markdown,再写独立 recovery terminal,保留原 terminal 不删除。 ### 8.3 successor 精确对象 | 对象 | bytes | SHA-256 | |---|---:|---| | `dev/ana-dev/shared_content_publisher/publisher.py` | 73014 | `EC5C6F547AEEEC8AF4D3B84B831FBDE8E379603AFD1129FBA592937C91B58907` | | `dev/ana-dev/shared_content_publisher/batch_config.schema.json` | 10430 | `9B027ED5AE2BF2B9FC50D491FA4AA3FEFA787DE80C3A6F0236555D3BC3266198` | | `dev/ana-dev/shared_content_publisher/README.md` | 1889 | `CCA9F7B87E369227C7BD6E4624C06E6B1022F94EF6F609B75FC67E3AF201BCAD` | | `dev/ana-dev/shared_content_publisher/__init__.py` | 168 | `CAEAB945F11B8C5DA0520C5132C37F013EA5F9EFB4A20655083B956E340B376B` | | `dev/ana-dev/shared_content_publisher/__main__.py` | 86 | `DC3EA832B1DE49CBBE2EF61241524DB0751C9AB48FA2D42A49D58E01DB80B773` | | `dev/ana-dev/test/test_shared_content_publisher_v1.py` | 28616 | `6ADAADF06E60D20DFA590461EEE73316A85525726A4A898740CAB3EDF6142077` | | `dev-doc/ana-doc/开发方案/SHARED-CONTENT-PUBLISHER-PRODUCTION-GUARD-V001.json` | 2212 | `DEFB9E6987A73AFD918C7F4A40C5FD08920B3478788F7A276BF9DE20F46F17A0` | ### 8.4 最终生产形态矩阵 - bundled CPython compileall=`PASS`;schema/guard strict JSON=`PASS`;UTF-8 no BOM/NUL/CR=`PASS`。 - 同一公共 CLI、同一 V2 config schema 的 unittest=`14/14 PASS`,最终耗时约 17.8 秒。 - 正向覆盖:实际相对目录拓扑、Markdown prior/current、invariant result thin entry、validate、单次 commit、完整 readback、strict idempotent replay。 - 负向覆盖:一次 rollback、junction ancestor、path overlap、持锁 ledger race、duplicate event sequence、prior release-set、manifest member omission、empty link/evidence、首次 extra target、replay extra target、invalid config replay、terminal parse/field drift、candidate/history/long-path/root/schema/AUDIT-HANDOFF 漂移。 - reviewer 复现的四个攻击全部成为固定回归:manifest omission、empty checks、extra target file、invalid config replay;均不能返回假 `COMMITTED/IDEMPOTENT_COMMITTED`。 ### 8.5 正式现场 mutation0 守卫 测试 `test_00_production_guard_precedes_isolated_mutation` 在任何临时 fixture 创建之前核对 7 个冻结正式对象和 3 个 absent path。最终复核:`file_mismatch=0`、`unexpected_present=0`、production publisher invocation=`0`、formal mutation=`0`。 - cases current=`2701/B9B02AF2F8899A3670CF4C6A463374A7A556E7FA26E3E953468B2129B20636A4` - core=`51587/6EDC2D5FF6140C9CAC572D249C5CDFDCBD3C7C2FBED91BAB459DD27A406EEEE7` - current manifest=`588/CAE3F83F1591F4D8D0ECD7E452DFDE1977958C1B1C4633E4225396615DD7D558` - ledger=`12716/ED2A83E2E6D1A695CF4DD24A79118B4DC99DAD75028B321D289114942F16B8BD` - result current=`459/3671D3BD13D1AD84E046895E5C3DAE2D43D491472B747A16FD24A9E2270594E5` - case result=`3051/31CBD04BAB1AF28020E836347342FE3281EBE8C24CB8E7C362F12E70772B015B` - canonical current state=`2874/9C4BBC12B5DCC6BB700DE98D4CDD3E91B2170CF4DD6DD1D4B9ACBD0342155202`,仍为 `RECOVERY_REQUIRED/BLOCKED/30` - active lock、`ATTEMPT-B004-000002`、`ATTEMPT-B004-000003` 均 absent。 ### 8.6 聚焦复审请求 请原 `dev.reviewer.ana.cai` 只复审上述 HOLD/3 successor,并返回唯一 `PASS/0` 或完整 `HOLD/N`。本 successor 没有生成真实 batch config,没有调用 production publisher,不是 promotion authority。只有正式 reviewer `PASS/0` 后,project.admin 才可机械生成全新的 `ATTEMPT-B004-000003` config 并另行执行。 ## 9. 事件链治理 successor(2026-08-21) ### 9.1 授权与唯一范围 - authority:`HANDOFF-INFOADMIN-LAOYANCAI-AGRICULTURE-BATCH004-SHARED-PUBLISHER-EVENT-CHAIN-GOVERNANCE-SUCCESSOR-20260821-001` - predecessor:`AUDIT-DEV-ANA-SHARED-CONTENT-PUBLISHER-V001-HOLD3-FOCUSED-REREVIEW-001 / HOLD/1` - fixed consolidated review:`HANDOFF-DEV-LAOYAN-LAOSHEN-AGRICULTURE-BATCH004-SHARED-PUBLISHER-EVENT-CHAIN-CONSOLIDATED-IMPLEMENTATION-REVIEW-20260821-001` - 本 successor 只关闭 `BLOCK-SHARED-PUBLISHER-IMPL-03` 剩余的事件链真值缺口;不重开已关闭的 Markdown consumer、prewrite root/path/lock/snapshot、manifest/link/evidence/postcommit 或 Repair008 长路径范围。 ### 9.2 单一完整验证器 1. 新增唯一 `_validate_attempt_event_chain`,按 ledger 原始追加后缀顺序逐行绑定全部 17 列,而非按 attempt 过滤后遗漏被篡改行。 2. 每一状态的 receipt 是确定函数:`PREPARED/VERIFIED -> prior_snapshot.json`,`COMMITTING/COMMITTED -> terminal.json`,`ROLLING_BACK/ROLLED_BACK -> 当前 rollback/recovery terminal`。 3. `event_time` 只接受 canonical UTC microseconds+`Z`,并严格递增;写入端在时钟分辨率不足时单调推进 1 微秒。 4. `SHARED_CONTENT_PUBLISHER_ATTEMPT_EVENT_CHAIN_V1` 对 `columns + 逐行17列` 的 canonical JSON 计算 SHA-256。终态 V3 持久化 digest、row count、起止 UTC 和逐状态 process identity。 5. 正常 COMMITTED、正常 rollback、replay/idempotent 与 invalid-replay recovery 均调用同一个完整验证器。恢复链允许原提交进程与恢复进程不同,但逐状态进程身份精确持久化;无法验证完整链时 exit 27 fail closed,不返回幂等成功或猜测回滚。 ### 9.3 生产形态篡改矩阵 - 最终 unittest=`16/16 PASS`;其中 17 个 ledger 字段逐列篡改=`17/17` 全部失败关闭,`IDEMPOTENT_COMMITTED=0`。 - 四个成功状态的 receipt 逐状态篡改=`4/4` 失败关闭;四个成功状态的 UTC 逐状态篡改=`4/4` 失败关闭。 - 正常提交的 event-chain digest 由测试独立 canonical 实现复算一致;普通 rollback 5 行、recovery rollback 6 行的 digest、row count 与逐阶段 process identity 均独立复算一致。 - 原 14 项生产形态矩阵全部保留:Markdown commit/replay、一次 rollback、锁后 ledger race、junction/path overlap、manifest/link/evidence/target、terminal、config、history 63/63 与 long-path 12/12、AUDIT/HANDOFF 域无回退。 ### 9.4 精确实现对象 | 对象 | bytes | SHA-256 | |---|---:|---| | `dev/ana-dev/shared_content_publisher/publisher.py` | 81140 | `4027788031136F94D6D2E3B8FEE53D6A65E0C362BEF8CCC713C175FA615CCF2C` | | `dev/ana-dev/shared_content_publisher/batch_config.schema.json` | 10430 | `9B027ED5AE2BF2B9FC50D491FA4AA3FEFA787DE80C3A6F0236555D3BC3266198` | | `dev/ana-dev/shared_content_publisher/README.md` | 2252 | `F101EB043C566A0B76757543D4F96FE16E7E67834EDCFA636827223C6C3A32BF` | | `dev/ana-dev/shared_content_publisher/__init__.py` | 168 | `FBA9552CBA028AD9B9212C7EFB701FE4E6CB5E31EBAA68AE23CF9E3156C4E7AC` | | `dev/ana-dev/shared_content_publisher/__main__.py` | 86 | `DC3EA832B1DE49CBBE2EF61241524DB0751C9AB48FA2D42A49D58E01DB80B773` | | `dev/ana-dev/test/test_shared_content_publisher_v1.py` | 33766 | `AC196135306F8AC67AF25CBF58D5D7E49AF2BE13269FE627F470E30D71842329` | | `dev-doc/ana-doc/开发方案/SHARED-CONTENT-PUBLISHER-PRODUCTION-GUARD-V001.json` | 2212 | `DEFB9E6987A73AFD918C7F4A40C5FD08920B3478788F7A276BF9DE20F46F17A0` | 配置 schema 保持 V2 且无字段漂移;终态 schema 升级为 `SHARED_CONTENT_PUBLISHER_TERMINAL_V3`。管理员机械生成配方见 `SHARED-CONTENT-PUBLISHER-ATTEMPT-B004-000003-CONFIG-RECIPE-V001.md`;该文档不是生产 config。 ### 9.5 生产零状态 production guard 最终仍要求 7 个冻结文件 exact、active lock/ATTEMPT-000002/ATTEMPT-000003 三路径 absent;实现和测试期间 production publisher invocation/mutation/config=`0/0/0`,canonical current 保持 `RECOVERY_REQUIRED/BLOCKED/30`。 ## 10. DIRECT_STABLE_PATH_SET_V1 生产拓扑 successor(2026-08-21) ### 10.1 授权与兼容边界 - authority:`HANDOFF-INFOADMIN-LAOYANCAI-AGRICULTURE-BATCH004-SHARED-PUBLISHER-DIRECT-STABLE-PATH-SET-GOVERNANCE-SUCCESSOR-20260821-001`。 - fixed consolidated review:`HANDOFF-DEV-LAOYAN-LAOSHEN-AGRICULTURE-BATCH004-SHARED-PUBLISHER-DIRECT-STABLE-PATH-SET-CONSOLIDATED-IMPLEMENTATION-REVIEW-20260821-001`。 - 新增 `SHARED_CONTENT_PUBLISHER_CONFIG_V3 / DIRECT_STABLE_PATH_SET_V1`,与既有 V2 release-directory strategy 并列;`publisher.run_config` 仅按 schema+strategy 严格分派,V2 的 16 项回归不变。 - 不迁移或重写已接受 candidate manifest、10 个 `formal_relative_path`、current manifest、release-set、正文、证据或结论;新策略把 10 行 formal path 直接解释为稳定目的地。 ### 10.2 事务实现 1. 只允许目的地位于 `ana-data/cases//核心文档/`、`ana-data/cases//manifest/` 或 `ana-data/result//`;cases `当前成果索引.md` 是唯一 activation 例外且必须恰好一行。路径逃逸、duplicate/overlap/alias、reparse ancestor/target、卷漂移、受保护路径重叠与未声明目标均在首写前失败关闭。 2. candidate 10 行 exact-set、candidate/current manifests、manifest self、release-set、非空 link/evidence、prior current manifest、自包含 prior release-set、history/current state、ledger 及 destination prior present/absent 逐项绑定。 3. exclusive lock 后、首个 ledger append 前再次读取 config/candidate/prior/history/ledger/root/volume/完整 destination set,并重新推导唯一 event/attempt sequence。 4. 在同卷 fresh staging root 复制完整 candidate set并 readback;对全部 10 个目的地冻结 present/absent prior snapshot。提交顺序为 core payload,随后 manifests/thin results,最后 `CASES-CURRENT-INDEX`,从不撤下既有 current。 5. 任一提交边界失败最多一次逆序 rollback:恢复原有成员、删除本 attempt 新建成员、最后完整复核 prior set;未知真值返回 `RECOVERY_REQUIRED`。postcommit/replay/recovery 共用 accepted 17-column event-chain validator,并拒绝 destination extra 或终态/config/chain 漂移。 6. release 六行规范预像沿用正式历史标签 `accepted_audit_id=`;正式 B004 预像独立复算为 `357 bytes/f39db200057f733df3d34ebc0387000d6af4a29d2a3e3ed787c20268b5fcace7`。`review_handoff_id` 仍是独立 HANDOFF 域且不进入 release hash。 ### 10.3 生产形态矩阵 - direct strategy unittest=`12/12 PASS / 35.917s`;legacy V2 regression=`16/16 PASS / 52.622s`;compileall=`PASS`。 - exact accepted B004 topology=`10/10 rows`:core、manifest、result 分布于既有稳定根,5 present + 5 absent,单次提交、activation position 10 与 exact replay 全部通过。 - failure injection=`17/17`:通用 mixed fixture 7 个边界 + exact accepted topology 10 个边界;含 activation 前后,全部恢复 exact prior。 - 负例覆盖 traversal、duplicate/overlap、protected overlap、undeclared root、volume drift、junction ancestor、candidate/target/ledger race、staging extra、replay target/extra/terminal drift;均不能产生假 `COMMITTED/IDEMPOTENT_COMMITTED`。 - strict schema/guard JSON=`PASS`;`mbx validate --project project-info --governance=OK/projects1/warnings0`。 ### 10.4 精确交付对象 | 对象 | bytes | SHA-256 | |---|---:|---| | `dev/ana-dev/shared_content_publisher/publisher.py` | 81967 | `8FD893395F37541BD5342AF8775009044AC69C34DD50EA66F3020BA836DF8899` | | `dev/ana-dev/shared_content_publisher/direct_stable_path.py` | 64394 | `D6C6B25026F4F7352F002B79E5E6D575A9B2BDF5BF75388FADF375D702EBCED5` | | `dev/ana-dev/shared_content_publisher/batch_config.direct_stable_path_set.schema.json` | 11484 | `36453344CEC226DCD2BF2A196CC8F053E01FF40E416B7CB25F9FE2FF1F86EFD0` | | `dev/ana-dev/shared_content_publisher/README.md` | 3808 | `EB171255EC4E28967B5F42305EE4047F93477FC9467B20DD0072376704494F81` | | `dev/ana-dev/test/test_shared_content_publisher_direct_stable_path_v1.py` | 41861 | `BEA0258F5B14203B8FF3F97DABAFCB88C7D8E9C78830F9E76969F6DAE7BB008B` | | `dev-doc/ana-doc/开发方案/SHARED-CONTENT-PUBLISHER-ATTEMPT-B004-000003-DIRECT-STABLE-PATH-CONFIG-RECIPE-V002.md` | 9911 | `FC0B2EE3C0847F4A19ADA3778B4366C7497E731E8D37FC207F0BAA5A87C029B3` | | `dev-doc/ana-doc/开发方案/SHARED-CONTENT-PUBLISHER-DIRECT-STABLE-PATH-PRODUCTION-GUARD-V001.json` | 2953 | `E42D377FF31AF146B248612DEFD24C4E9BDA1711D0200FBBF614323B0E6B7306` | | `dev-doc/ana-doc/开发方案/SHARED-CONTENT-PUBLISHER-DIRECT-STABLE-PATH-TEST-EVIDENCE-V001.json` | 2755 | `7624D9CAB83571D74A712C3877CA3CB9B8E5274BD89F8B5E5D8D92E699964AB6` | ### 10.5 production-zero 与审核边界 最终 readback:正式 7 个冻结文件 `7/7 exact`;accepted candidate manifests `2/2 exact`;active lock 与 `ATTEMPT-B004-000003` `2/2 absent`;production config/publisher invocation/formal mutation=`0/0/0`;canonical current 保持 `RECOVERY_REQUIRED/BLOCKED/30`。本交付不创建真实 config、不执行 publisher 或 promotion。只有固定 reviewer 返回正式 `PASS/0` 后,project.admin 才可按 V002 配方机械生成唯一真实 config 并另行调用。 ## 11. DIRECT stable HOLD/2 合并闭环 successor(2026-08-21) ### 11.1 唯一范围 - authority:`HANDOFF-INFOADMIN-LAOYANCAI-AGRICULTURE-BATCH004-DIRECT-STABLE-PATH-SET-HOLD2-CONSOLIDATED-CLOSURE-20260821-001`。 - fixed focused rereview:`HANDOFF-DEV-LAOYAN-LAOSHEN-AGRICULTURE-BATCH004-DIRECT-STABLE-PATH-SET-HOLD2-CONSOLIDATED-CLOSURE-FOCUSED-REREVIEW-20260821-001`。 - 一次关闭 `DIRECT-01` 混合 current 可见性与 `DIRECT-02` 前目的地失败/同 config 重跑两个 blocker;保留 V3 strategy、既有 candidate/formal path/release-set、事件链与 Repair008 合同。 ### 11.2 Cooperative authoritative reader 1. 新增公共 `read_direct_current_snapshot()` 和 CLI `--read-direct-current`。读前要求 publisher lock absent,并冻结 cases current index/current manifest 两个身份;在同一观察窗口内读取并校验全部 10 个 stable target;读后再次要求 lock absent 且双身份不变。 2. lock present(包括 10 个逐文件提交边界)只返回 `RETRY_PUBLISH_IN_PROGRESS`;身份、exact-set 或 receipt 闭环漂移只返回 `STOP_NOT_CURRENT`。失败结果不携带 payload,也不设置 current announced/cache 标记。 3. Python helper 只在完整双读闭环成功后返回同一窗口内冻结的完整 bytes snapshot;CLI 只返回身份摘要。raw manual filesystem read 不具 authoritative current 语义。 ### 11.3 Durable-prefix 恢复状态机 1. 完整 prior snapshot+receipt 后的空事件前缀、`PREPARED`、`VERIFIED`、`COMMITTING` 后首个目的地前,以及 10 个提交边界均进入同一恢复验证器。 2. 同 config 新进程先重验 config、commit plan、snapshot receipt、prior-state exact-set、staging subset/identity、全部目的地 prior/candidate truth 和已有 17 列 event chain;只有完整可判真前缀才执行一次逆序 prior 恢复。 3. 恢复终态严格保存完整事件链、进程身份和被取代 terminal 身份;下一次相同调用返回 `IDEMPOTENT_ROLLED_BACK`,不再因已有 receipt 返回 `TERMINAL_REPEAT_BLOCKED`。 4. snapshot、receipt、staging、ledger 或任一目的地被篡改时均 exit nonzero fail closed,既不返回 candidate current,也不猜测回滚。 ### 11.4 最终矩阵与生产零状态 - direct suite=`16/16 PASS`;legacy V2=`16/16 PASS`;compileall=`PASS`。 - authoritative observer=`10/10` 提交边界只见 retry,mixed-current return=`0`;闭合后 full snapshot=`10/10 members`。 - process restart recovery=`14/14`(snapshot、PREPARED、VERIFIED、首写前、10 个 commit boundaries);same-config recovery=`14/14`,strict idempotent rollback=`14/14`。 - boundary tamper=`14/14 fail closed`;原 root/path/reparse/volume/manifest/event-chain/Repair008 回归无退化。 - production guard=`7/7 formal exact + 2/2 candidate exact + 2/2 absent`;config/invocation/formal mutation=`0/0/0`;canonical current 仍为 `RECOVERY_REQUIRED/BLOCKED/30`。 - machine evidence:`SHARED-CONTENT-PUBLISHER-DIRECT-STABLE-PATH-HOLD2-CLOSURE-TEST-EVIDENCE-V002.json`。本节不创建真实 config、ATTEMPT-B004-000003 或 production invocation。 ### 11.5 冻结实现身份 | 对象 | bytes | SHA-256 | |---|---:|---| | `dev/ana-dev/shared_content_publisher/publisher.py` | 82381 | `3E77BAB80424BC97787F43BD78F61A53DE9EAB1435D730AC4D3F9FCB866F219D` | | `dev/ana-dev/shared_content_publisher/direct_stable_path.py` | 76097 | `170159962816EA012FA3913240A48B9ED759A0B7E5926DEE1D334434A08DFDF1` | | `dev/ana-dev/shared_content_publisher/authoritative_reader.py` | 7021 | `98288BABB7F91832156BB8B2805D574E275C7C88A196398878D619D1BB7A9620` | | `dev/ana-dev/shared_content_publisher/batch_config.direct_stable_path_set.schema.json` | 11696 | `6AD035F81F2F38FB2E818E72C48F51185842A030EEA841B5754A2002D98CBD80` | | `dev/ana-dev/shared_content_publisher/README.md` | 4741 | `1DED1BDA09A2FC55E0E9816AC48DBF8FAB4F65DF354CB9A908DA3B912E0D06E0` | | `dev/ana-dev/shared_content_publisher/__init__.py` | 307 | `A14DF6A6AEFAF65FDEC164888C513E5410C4550652F8104372089FEDAA81C39C` | | `dev/ana-dev/shared_content_publisher/__main__.py` | 86 | `DC3EA832B1DE49CBBE2EF61241524DB0751C9AB48FA2D42A49D58E01DB80B773` | | `dev/ana-dev/test/test_shared_content_publisher_direct_stable_path_v1.py` | 51117 | `8794F7AC4D048429A75FF4C8D144F2970E6D40EEF8DAE9C1F7F7412C6CDD9F8D` | | `dev/ana-dev/test/test_shared_content_publisher_v1.py` | 33766 | `AC196135306F8AC67AF25CBF58D5D7E49AF2BE13269FE627F470E30D71842329` | | `ana-doc/案例分析规范.md` | 78369 | `877A91F9E1B372E9058CAA3D67A1E9CD548BC3519F285061BF1C1D2A1BEEB78B` | | `ana-doc/案例存储体系.md` | 40808 | `9A29ACB2867925D4938C6923E7EDEF3441B09349B06236B5976448B414651D1C` | | `dev-doc/ana-doc/开发方案/SHARED-CONTENT-PUBLISHER-DIRECT-STABLE-PATH-HOLD2-CLOSURE-TEST-EVIDENCE-V002.json` | 1085 | `C5FFC2C2625CBC8FDB92AE104584E73D86DA8B9F44B04BA91023F49E6B98FF12` | ## 12. Pre-anchor recovery 单 blocker successor(2026-08-21) ### 12.1 范围与实现 - authority:`HANDOFF-INFOADMIN-LAOYANCAI-AGRICULTURE-BATCH004-PREANCHOR-RECOVERY-SINGLE-BLOCKER-SUCCESSOR-20260821-001`;只关闭 `BLOCK-SHARED-PUBLISHER-DIRECT-02_PREDESTINATION_FAILURE_AND_RERUN_NOT_CLOSED`,不重开 cooperative reader、10/10 observer、已完成 14/14 recovery/idempotence/tamper、17 列事件链或 Repair008。 - `attempt_receipt_root` 不再作为逐文件构造目录。完整 prior snapshot、commit plan、确定性 attempt contract 与 canonical recovery-anchor manifest 先写入由 task/case/batch/run/config 身份唯一推导的同卷私有 preparation root。 - 每个 preparation member 使用私有临时文件 CreateNew,完成写入、`fsync`、close、完整回读后,再以 no-overwrite 原子改名成为 private member;全部成员和 manifest 复验成功后,紧邻原子发布再次重校验完整 locked preimage,整目录再以一次 no-overwrite 原子 rename 发布为 official recovery anchor。 - 原子目录发布前,ledger/event/formal destination 均不允许写入。相同 config 重启只在 official anchor 缺失、formal exact prior、scope/ledger/root 仍精确且 preparation 文件集可证明属于本 attempt 时退役残片并重建;finalized member、unexpected member、official+preparation 双重存在或 official anchor 漂移统一返回显式 `RECOVERY_REQUIRED`,不盲删。 - official anchor 成功发布后立即成为恢复所有权边界;其后的 interrupt/I/O 失败沿既有 durable state machine 精确 rollback 或同配置恢复。生产 fault 仍必须为 `NONE`。 ### 12.2 生产形态验收 - pre-anchor 成员数=`9`,每成员覆盖写前、写中、flush/close 后、回读后、member rename 后五个边界;anchor publish 另覆盖 rename 前、系统调用中与成功后三个边界,合计每种 fault=`48`。 - `DIRECT_INTERRUPT_PREANCHOR` 与 `DIRECT_IO_ERROR_PREANCHOR` 两类故障共 `96/96`:原子发布前均保持 official anchor absent、formal mutation0,并由同配置重启确定性重建/提交;原子发布后则消费 exact official anchor 并精确 rollback/幂等。 - preparation finalized-member tamper、unexpected member 与 official anchor manifest tamper=`3/3 RECOVERY_REQUIRED`,formal destination 保持 prior、lock absent。 - 完整回归:direct=`18/18 PASS`、legacy V2=`16/16 PASS`,总计=`34/34 PASS / 364.337s`;compileall=`PASS`。旧 observer、event-chain、manifest/postcommit、root/path/reparse/volume、rollback 与 Repair008 无回退。 - production guard 仍为正式文件 exact、active lock/ATTEMPT-B004-000003 absent;生产 config/publisher/formal mutation=`0/0/0`;canonical current=`RECOVERY_REQUIRED/BLOCKED/30`。 ### 12.3 冻结对象 | 对象 | bytes | SHA-256 | |---|---:|---| | `dev/ana-dev/shared_content_publisher/publisher.py` | 82381 | `3E77BAB80424BC97787F43BD78F61A53DE9EAB1435D730AC4D3F9FCB866F219D` | | `dev/ana-dev/shared_content_publisher/direct_stable_path.py` | 91610 | `173760DDE8C5ABF8623014B5942A03293FAAD5F11CA8E00A7D2BA560BDEC0F14` | | `dev/ana-dev/shared_content_publisher/authoritative_reader.py` | 7021 | `98288BABB7F91832156BB8B2805D574E275C7C88A196398878D619D1BB7A9620` | | `dev/ana-dev/shared_content_publisher/batch_config.direct_stable_path_set.schema.json` | 11755 | `4BDAC4B5EE4D4777FC47DC9A386899B4AD6F73D1C52185AEB4CDBA48EF6FD739` | | `dev/ana-dev/shared_content_publisher/README.md` | 5290 | `06C8C2FD676A1C979F47ABC7D686CFFDACCDBFFC8AB9BC1C84DF4317B55622AC` | | `dev/ana-dev/test/test_shared_content_publisher_direct_stable_path_v1.py` | 56293 | `45B1F0CF76C169169900DC02167F95F653F7E8B0DF9276D72B955F7C6FD015C0` | | `dev/ana-dev/test/test_shared_content_publisher_v1.py` | 33766 | `AC196135306F8AC67AF25CBF58D5D7E49AF2BE13269FE627F470E30D71842329` | | `dev-doc/ana-doc/开发方案/SHARED-CONTENT-PUBLISHER-PREANCHOR-RECOVERY-TEST-EVIDENCE-V003.json` | 902 | `48629E9817831EC7E4D86BC812797DB30DAEB7492023B2C3262FBAFDFE733AAA` | 本实现未创建 production config、未调用 production publisher、未创建 `ATTEMPT-B004-000003`,也未修改农业 candidate、正文、结论、正式 current 或 ledger。只有固定 focused reviewer 的 `PASS/0` 才允许 project.admin 进入后续机械生产步骤。