fix(memory): unify host paths under real-day current

This commit is contained in:
冰朔 2026-09-04 15:30:08 +08:00
commit 0c21f4e4af
18 changed files with 184 additions and 42 deletions

View file

@ -6,6 +6,8 @@
同一天跨任意宿主窗口或 compaction 都写入同一日页。北京时间换日时,上一日页进入 `CLOSED_REAL_BEIJING_DAY_ELAPSED`,新日页继续同一人格时间线。月份按 0110、1120、2131 三个自然日期组折叠;年份按季度折叠。原始事件保持不可变,日/月/年页面是可重建投影。
`CURRENT` 只允许时间单调前进。较早事件的精确重复返回幂等成功但不得移动指针;新的乱序旧事件失败关闭,必须以当前时间追加纠正事件,不能回改过去。
```bash
node server-tools/persona-daily-fractal-memory/persona-daily-memory.mjs append \
--allowed-root /Volumes/JZAO/HoloLake/persona-runtime/continuity-memory \

View file

@ -335,12 +335,31 @@ export function appendEvent({ allowedRoot, storeRoot, event }) {
const date = beijingDate(event.occurred_at);
const immutablePath = eventFile(store, date, event.event_id);
const immutableBody = stableJson({ ...event, beijing_date: date });
const currentFile = path.join(store, "CURRENT.json");
const previousCurrent = fs.existsSync(currentFile) ? readJson(currentFile) : null;
if (
previousCurrent?.updated_at &&
new Date(event.occurred_at).valueOf() < new Date(previousCurrent.updated_at).valueOf()
) {
if (fs.existsSync(immutablePath) && fs.readFileSync(immutablePath, "utf8") === immutableBody) {
return {
outcome: "PASS",
state: "IDEMPOTENT_OLDER_EVENT_NO_POINTER_MOVEMENT",
date,
event_id: event.event_id,
current: currentFile,
current_sha256: sha256(fs.readFileSync(currentFile, "utf8"))
};
}
fail("OUT_OF_ORDER_EVENT_REQUIRES_CURRENT_CORRECTION_EVENT", {
event_time: event.occurred_at,
current_time: previousCurrent.updated_at
});
}
if (fs.existsSync(immutablePath)) {
if (fs.readFileSync(immutablePath, "utf8") !== immutableBody) fail("EVENT_ID_COLLISION", { event_id: event.event_id });
} else atomicWrite(immutablePath, immutableBody);
const currentFile = path.join(store, "CURRENT.json");
const previousCurrent = fs.existsSync(currentFile) ? readJson(currentFile) : null;
closePreviousDay(store, previousCurrent, date, event.occurred_at);
const day = loadOrCreateDay(store, event, date, immutablePath);

View file

@ -117,6 +117,21 @@ test("event writes are immutable and an id collision fails closed", (t) => {
assert.throws(() => appendEvent({ ...root, event: { ...original, why: "changed" } }), /EVENT_ID_COLLISION/u);
});
test("an older idempotent event cannot move CURRENT backward", (t) => {
const root = roots(t);
const first = event(1, "2026-09-04T08:00:00+08:00");
const second = event(2, "2026-09-04T09:00:00+08:00");
appendEvent({ ...root, event: first });
appendEvent({ ...root, event: second });
const before = readCurrent(root);
const repeated = appendEvent({ ...root, event: first });
const after = readCurrent(root);
assert.equal(repeated.state, "IDEMPOTENT_OLDER_EVENT_NO_POINTER_MOVEMENT");
assert.equal(after.last_event_id, second.event_id);
assert.equal(after.current_pointer_sha256, before.current_pointer_sha256);
assert.throws(() => appendEvent({ ...root, event: { ...event(3, "2026-09-04T08:30:00+08:00"), event_id: "NEW-OLDER-EVENT" } }), /OUT_OF_ORDER_EVENT_REQUIRES_CURRENT_CORRECTION_EVENT/u);
});
test("store scope and symlink components fail closed", (t) => {
const root = roots(t);
assert.throws(() => appendEvent({ allowedRoot: root.allowedRoot, storeRoot: path.join(root.allowedRoot, "..", "escape"), event: event(1) }), /STORE_OUTSIDE_ALLOWED_ROOT/u);

View file

@ -2,7 +2,7 @@
"compiled_from": {
"compiler_id": "TCS-COMPILER-STAGE1-0001",
"compiler_state": "TCS_COMPILER_GIR_EXECUTED",
"source_sha256": "ed8e413de3f9317982b737d7ea58a1e5a037a25256a82616010e0aa2d3d06c74"
"source_sha256": "f1897688e7e0b1400f9f81a796ba6b5a78a6467897215253b10bbda1311e0785"
},
"declaration": {
"boundaries": {
@ -70,11 +70,11 @@
"live_day_sha256": "3ff3cf7e8036ab342d4f5a05dda61c010c573ae574c76ccd97b2ada6436460ec",
"live_month_sha256": "f10ab9d19c37e41706733db91944aed3d7c54dd96e5e813b63bde576d9ee4c75",
"live_year_sha256": "cbfedded309cab10dc3d2633dcaa21623513d57b60337b01748f8fec98f297c9",
"program_gir_sha256": "d832ba47dd6cbc89997e0bcebb164255817031baf956f30c1f5776d87138dce4",
"program_sha256": "81f015a72341eed51546a8f1a8c50dacfe177ee1b7968da899a1fad3869c3fcb",
"route_map_sha256": "09bf4373b5207130941ec17f96cdd31b34e473fa8672b0d175037486aaae9e96",
"runtime_sha256": "142d444b12d8e9aceca030416039ee693ddc8c8aa7852aba8db6118da6ec2ee8",
"tests_sha256": "bc9e1c12a81edaf1ea55375c4f1fbddda45435458e2b7223b0e2dc75b5ccc38a"
"program_gir_sha256": "5a686b59a1ee2f87cb10bab4dd4693dd2ca69b2f0a430da49e5dbea208340d59",
"program_sha256": "af16c13bc15f2f2eafab585ec25d924e6eb3461b9ea1d9a38ad2cdc354ccb26c",
"route_map_sha256": "1951e5cf167cdce2e44be2ed041c9b7d38dd6e34b10562fc4b7c3e68f14ae821",
"runtime_sha256": "efe723e5b24cce31002476bb31d2495908d818a25e91907068082e2e4305d95e",
"tests_sha256": "31833ac09b6cc5c43ec7b988fcfaec3e7be4ce54d8abb9ee737f1ea0ebe60388"
},
"request": {
"channel_id": "ICE-CH-ZC001",
@ -85,12 +85,12 @@
},
"result": {
"brain_runtime_tests": 19,
"daily_memory_tests": 8,
"daily_memory_tests": 9,
"failures": 0,
"generic_hldp_tests": 9,
"live_store_verify": "PASS",
"state": "LOCAL_ACCEPTANCE_PASS",
"total_tests": 36,
"total_tests": 37,
"zc001_memory_binding": "BOUND_ON_DEMAND",
"zc001_route_readback": "persona-context-memory"
},

View file

@ -38,7 +38,7 @@ The native source does not provide this field; the projector does not guess.
- **Native declaration identifier**: `TCS-RECEIPT-ZY001-REAL-DAY-FRACTAL-MEMORY-LOCAL-ACCEPTANCE-20260904`
- **Native declaration kind**: `RECEIPT`
- **TCS source SHA-256**: `ed8e413de3f9317982b737d7ea58a1e5a037a25256a82616010e0aa2d3d06c74`
- **TCS source SHA-256**: `f1897688e7e0b1400f9f81a796ba6b5a78a6467897215253b10bbda1311e0785`
- **Validation compiler**: `TCS-COMPILER-STAGE1-0001`
- **Projection protocol**: `GLS-HLDP-HUMAN-ENGINEERING-PROJECTION-0001`
@ -101,11 +101,11 @@ All top-level structures and field paths are retained below so a reader can audi
- **live_day_sha256**3ff3cf7e8036ab342d4f5a05dda61c010c573ae574c76ccd97b2ada6436460ec `proof.live_day_sha256`
- **live_month_sha256**f10ab9d19c37e41706733db91944aed3d7c54dd96e5e813b63bde576d9ee4c75 `proof.live_month_sha256`
- **live_year_sha256**cbfedded309cab10dc3d2633dcaa21623513d57b60337b01748f8fec98f297c9 `proof.live_year_sha256`
- **program_gir_sha256**d832ba47dd6cbc89997e0bcebb164255817031baf956f30c1f5776d87138dce4 `proof.program_gir_sha256`
- **program_sha256**81f015a72341eed51546a8f1a8c50dacfe177ee1b7968da899a1fad3869c3fcb `proof.program_sha256`
- **route_map_sha256**09bf4373b5207130941ec17f96cdd31b34e473fa8672b0d175037486aaae9e96 `proof.route_map_sha256`
- **runtime_sha256**142d444b12d8e9aceca030416039ee693ddc8c8aa7852aba8db6118da6ec2ee8 `proof.runtime_sha256`
- **tests_sha256**bc9e1c12a81edaf1ea55375c4f1fbddda45435458e2b7223b0e2dc75b5ccc38a `proof.tests_sha256`
- **program_gir_sha256**5a686b59a1ee2f87cb10bab4dd4693dd2ca69b2f0a430da49e5dbea208340d59 `proof.program_gir_sha256`
- **program_sha256**af16c13bc15f2f2eafab585ec25d924e6eb3461b9ea1d9a38ad2cdc354ccb26c `proof.program_sha256`
- **route_map_sha256**1951e5cf167cdce2e44be2ed041c9b7d38dd6e34b10562fc4b7c3e68f14ae821 `proof.route_map_sha256`
- **runtime_sha256**efe723e5b24cce31002476bb31d2495908d818a25e91907068082e2e4305d95e `proof.runtime_sha256`
- **tests_sha256**31833ac09b6cc5c43ec7b988fcfaec3e7be4ce54d8abb9ee737f1ea0ebe60388 `proof.tests_sha256`
- **request** `request`
- **channel_id**ICE-CH-ZC001 `request.channel_id`
- **human_anchor**ICE-GL∞ `request.human_anchor`
@ -114,12 +114,12 @@ All top-level structures and field paths are retained below so a reader can audi
- **source identifier**TCS-EVENT-ZY001-ZC001-REAL-DAY-MEMORY-UPGRADE-20260904 `request.source_id`
- **result** `result`
- **brain_runtime_tests**19 `result.brain_runtime_tests`
- **daily_memory_tests**8 `result.daily_memory_tests`
- **daily_memory_tests**9 `result.daily_memory_tests`
- **failures**0 `result.failures`
- **generic_hldp_tests**9 `result.generic_hldp_tests`
- **live_store_verify**PASS `result.live_store_verify`
- **state**LOCAL_ACCEPTANCE_PASS `result.state`
- **total_tests**36 `result.total_tests`
- **total_tests**37 `result.total_tests`
- **zc001_memory_binding**BOUND_ON_DEMAND `result.zc001_memory_binding`
- **zc001_route_readback**persona-context-memory `result.zc001_route_readback`
- **verification** `verification`

View file

@ -38,7 +38,7 @@
- **原生声明编号**`TCS-RECEIPT-ZY001-REAL-DAY-FRACTAL-MEMORY-LOCAL-ACCEPTANCE-20260904`
- **原生声明类型**`RECEIPT`
- **TCS 源码 SHA-256**`ed8e413de3f9317982b737d7ea58a1e5a037a25256a82616010e0aa2d3d06c74`
- **TCS 源码 SHA-256**`f1897688e7e0b1400f9f81a796ba6b5a78a6467897215253b10bbda1311e0785`
- **校验编译器**`TCS-COMPILER-STAGE1-0001`
- **投影协议**`GLS-HLDP-HUMAN-ENGINEERING-PROJECTION-0001`
@ -101,11 +101,11 @@
- **live_day_sha256**3ff3cf7e8036ab342d4f5a05dda61c010c573ae574c76ccd97b2ada6436460ec `proof.live_day_sha256`
- **live_month_sha256**f10ab9d19c37e41706733db91944aed3d7c54dd96e5e813b63bde576d9ee4c75 `proof.live_month_sha256`
- **live_year_sha256**cbfedded309cab10dc3d2633dcaa21623513d57b60337b01748f8fec98f297c9 `proof.live_year_sha256`
- **program_gir_sha256**d832ba47dd6cbc89997e0bcebb164255817031baf956f30c1f5776d87138dce4 `proof.program_gir_sha256`
- **program_sha256**81f015a72341eed51546a8f1a8c50dacfe177ee1b7968da899a1fad3869c3fcb `proof.program_sha256`
- **route_map_sha256**09bf4373b5207130941ec17f96cdd31b34e473fa8672b0d175037486aaae9e96 `proof.route_map_sha256`
- **runtime_sha256**142d444b12d8e9aceca030416039ee693ddc8c8aa7852aba8db6118da6ec2ee8 `proof.runtime_sha256`
- **tests_sha256**bc9e1c12a81edaf1ea55375c4f1fbddda45435458e2b7223b0e2dc75b5ccc38a `proof.tests_sha256`
- **program_gir_sha256**5a686b59a1ee2f87cb10bab4dd4693dd2ca69b2f0a430da49e5dbea208340d59 `proof.program_gir_sha256`
- **program_sha256**af16c13bc15f2f2eafab585ec25d924e6eb3461b9ea1d9a38ad2cdc354ccb26c `proof.program_sha256`
- **route_map_sha256**1951e5cf167cdce2e44be2ed041c9b7d38dd6e34b10562fc4b7c3e68f14ae821 `proof.route_map_sha256`
- **runtime_sha256**efe723e5b24cce31002476bb31d2495908d818a25e91907068082e2e4305d95e `proof.runtime_sha256`
- **tests_sha256**31833ac09b6cc5c43ec7b988fcfaec3e7be4ce54d8abb9ee737f1ea0ebe60388 `proof.tests_sha256`
- **request** `request`
- **channel_id**ICE-CH-ZC001 `request.channel_id`
- **human_anchor**ICE-GL∞ `request.human_anchor`
@ -114,12 +114,12 @@
- **来源编号**TCS-EVENT-ZY001-ZC001-REAL-DAY-MEMORY-UPGRADE-20260904 `request.source_id`
- **result** `result`
- **brain_runtime_tests**19 `result.brain_runtime_tests`
- **daily_memory_tests**8 `result.daily_memory_tests`
- **daily_memory_tests**9 `result.daily_memory_tests`
- **failures**0 `result.failures`
- **generic_hldp_tests**9 `result.generic_hldp_tests`
- **live_store_verify**PASS `result.live_store_verify`
- **state**LOCAL_ACCEPTANCE_PASS `result.state`
- **total_tests**36 `result.total_tests`
- **total_tests**37 `result.total_tests`
- **zc001_memory_binding**BOUND_ON_DEMAND `result.zc001_memory_binding`
- **zc001_route_readback**persona-context-memory `result.zc001_route_readback`
- **verification** `verification`

View file

@ -4,9 +4,9 @@ RECEIPT TCS-RECEIPT-ZY001-REAL-DAY-FRACTAL-MEMORY-LOCAL-ACCEPTANCE-20260904 {
header { schema = "tcs.receipt/v1"; name_zh = "铸渊真实日分形记忆本机验收回执"; name_en = "Zhuyuan Real-Day Fractal Memory Local Acceptance Receipt"; version = "0.1.0"; language = "TCS/0.1"; profile = "HLDP-HUMAN-ENGINEERING/0.1"; protocols = ["GLS-0200", "GLS-0400", "GLS-0411", "GLS-0827"]; lifecycle = "CANDIDATE"; canonical_uri = "server-tools/persona-daily-fractal-memory/receipts/TCS-RECEIPT-ZY001-REAL-DAY-FRACTAL-MEMORY-LOCAL-ACCEPTANCE-20260904.tcs"; compatibility = ["TCS-PROGRAM-ZY001-REAL-DAY-FRACTAL-MEMORY-0001", "HLDP-SPEC-v1.0-OPENSOURCE-D112"]; }
request { source_id = "TCS-EVENT-ZY001-ZC001-REAL-DAY-MEMORY-UPGRADE-20260904"; human_anchor = "ICE-GL∞"; persona_id = "ICE-P-ZY001"; channel_id = "ICE-CH-ZC001"; scope = "LOCAL_JZAO_IMPLEMENTATION_AND_ACCEPTANCE"; }
operation { values = ["编译TCS程序并生成中英投影", "实现不可变事件与日月年HLDP分形投影", "同日多窗口追加与十节点折叠", "北京时间跨日封页", "CURRENT哈希链与内部链接验证", "按需路由和单节点读取", "越界符号链接冲突和篡改反向测试", "人格脑enter绑定新日树并由perceive读回语义分支"]; }
result { state = "LOCAL_ACCEPTANCE_PASS"; generic_hldp_tests = 9; daily_memory_tests = 8; brain_runtime_tests = 19; total_tests = 36; failures = 0; live_store_verify = "PASS"; zc001_memory_binding = "BOUND_ON_DEMAND"; zc001_route_readback = "persona-context-memory"; }
result { state = "LOCAL_ACCEPTANCE_PASS"; generic_hldp_tests = 9; daily_memory_tests = 9; brain_runtime_tests = 19; total_tests = 37; failures = 0; live_store_verify = "PASS"; zc001_memory_binding = "BOUND_ON_DEMAND"; zc001_route_readback = "persona-context-memory"; }
verification { program_compile = "PASS"; unresolved_natural_language = false; native_self_hosted = true; node_syntax = "PASS"; json_maps = "PASS"; git_diff_check = "PASS"; live_day = "2026-09-04"; live_day_state = "OPEN"; }
proof { program_sha256 = "81f015a72341eed51546a8f1a8c50dacfe177ee1b7968da899a1fad3869c3fcb"; program_gir_sha256 = "d832ba47dd6cbc89997e0bcebb164255817031baf956f30c1f5776d87138dce4"; runtime_sha256 = "142d444b12d8e9aceca030416039ee693ddc8c8aa7852aba8db6118da6ec2ee8"; tests_sha256 = "bc9e1c12a81edaf1ea55375c4f1fbddda45435458e2b7223b0e2dc75b5ccc38a"; route_map_sha256 = "09bf4373b5207130941ec17f96cdd31b34e473fa8672b0d175037486aaae9e96"; live_current_sha256 = "a64bd4cb0ea27352dea08c27f5f2d0ded4fed70cf8cc3fb087e05fcdf07dab8f"; live_day_sha256 = "3ff3cf7e8036ab342d4f5a05dda61c010c573ae574c76ccd97b2ada6436460ec"; live_month_sha256 = "f10ab9d19c37e41706733db91944aed3d7c54dd96e5e813b63bde576d9ee4c75"; live_year_sha256 = "cbfedded309cab10dc3d2633dcaa21623513d57b60337b01748f8fec98f297c9"; brain_receipt = "ZY-BRAIN-RUNTIME-62d61503004585c9"; }
proof { program_sha256 = "af16c13bc15f2f2eafab585ec25d924e6eb3461b9ea1d9a38ad2cdc354ccb26c"; program_gir_sha256 = "5a686b59a1ee2f87cb10bab4dd4693dd2ca69b2f0a430da49e5dbea208340d59"; runtime_sha256 = "efe723e5b24cce31002476bb31d2495908d818a25e91907068082e2e4305d95e"; tests_sha256 = "31833ac09b6cc5c43ec7b988fcfaec3e7be4ce54d8abb9ee737f1ea0ebe60388"; route_map_sha256 = "1951e5cf167cdce2e44be2ed041c9b7d38dd6e34b10562fc4b7c3e68f14ae821"; live_current_sha256 = "a64bd4cb0ea27352dea08c27f5f2d0ded4fed70cf8cc3fb087e05fcdf07dab8f"; live_day_sha256 = "3ff3cf7e8036ab342d4f5a05dda61c010c573ae574c76ccd97b2ada6436460ec"; live_month_sha256 = "f10ab9d19c37e41706733db91944aed3d7c54dd96e5e813b63bde576d9ee4c75"; live_year_sha256 = "cbfedded309cab10dc3d2633dcaa21623513d57b60337b01748f8fec98f297c9"; brain_receipt = "ZY-BRAIN-RUNTIME-62d61503004585c9"; }
integrity { algorithm = "SHA256"; immutable_event_collision = "REJECTED"; immutable_event_tamper = "DETECTED"; out_of_scope_store = "REJECTED"; symlink_component = "REJECTED"; source_event_bodies_in_repository = false; }
boundaries { values = ["本机验收不等于REPO-012已发布", "运行器源码可发布但JZAO私人记忆正文不得进入仓库", "豆包和ZCode宿主线仍须完成路径重定向审计", "服务器部署只在登记消费者存在且现场读回需要时执行", "学习候选尚未冒充cortex正式晋升"]; }
next { state = "ENTER_MULTI_HOST_META_AUDIT"; actions = ["审计并重定向豆包与ZCode宿主记忆路径", "更新共享人格系统当前指针与运行合同", "检查JD-FD-PRIMARY是否存在登记消费者", "通过当前发布路径推送REPO-012并远端读回", "追加最终真实日事件并全链复验"]; }