chore: 保存剩余工作区改动并清理到干净状态

- 补 OnlyOffice callback 附件写回的 media asset bridge 适配层,并继续扩展 documents bridge/测试覆盖

- 提交当前 OMX hooks 删除与 Harness 运行状态文件更新,保留本轮任务执行轨迹

- 一并提交仓库中已跟踪的 Rust target 构建产物与相关协议桥接变更,确保工作区清零
This commit is contained in:
lix-2026
2026-04-15 03:34:52 +08:00
parent b33ffb99e7
commit f1da2abda4
209 changed files with 1236 additions and 273 deletions
-49
View File
@@ -1,49 +0,0 @@
#!/usr/bin/env node
import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
import { join } from "node:path";
import { execSync } from "node:child_process";
function rootDir() {
try {
return execSync("git rev-parse --show-toplevel", {
cwd: process.cwd(),
encoding: "utf8",
stdio: ["ignore", "pipe", "ignore"],
}).trim();
} catch {
return process.cwd();
}
}
function readStdin() {
try {
return JSON.parse(readFileSync(0, "utf8") || "{}");
} catch {
return {};
}
}
const payload = readStdin();
const root = rootDir();
mkdirSync(join(root, ".omx", "logs"), { recursive: true });
const exitCode =
typeof payload?.tool_output?.exit_code === "number"
? payload.tool_output.exit_code
: typeof payload?.exit_code === "number"
? payload.exit_code
: null;
const status = exitCode ?? "unknown";
const isExplicitBashFailure = payload?.tool_name === "Bash" && exitCode !== null && exitCode !== 0;
appendFileSync(
join(root, ".omx", "logs", "hooks.log"),
`${new Date().toISOString()} PostToolUse status=${status} ${JSON.stringify(payload)}\n`,
"utf8",
);
process.stdout.write(JSON.stringify({
continue: true,
hookSpecificOutput: {
hookEventName: "PostToolUse",
additionalContext: isExplicitBashFailure ? "OMX noticed a failing Bash command. Check the team inbox or diagnostics." : "",
},
}));
-37
View File
@@ -1,37 +0,0 @@
#!/usr/bin/env node
import { readFileSync } from "node:fs";
function readStdin() {
try {
return JSON.parse(readFileSync(0, "utf8") || "{}");
} catch {
return {};
}
}
const payload = readStdin();
const command = JSON.stringify(payload).toLowerCase();
const blocked = [
"rm -rf /",
"mkfs",
"dd if=",
"shutdown",
"reboot",
"poweroff",
"git reset --hard",
];
if (blocked.some((token) => command.includes(token))) {
process.stdout.write(JSON.stringify({
decision: "block",
reason: "OMX safety hook blocked an obviously destructive command.",
}));
process.exit(0);
}
process.stdout.write(JSON.stringify({
continue: true,
hookSpecificOutput: {
hookEventName: "PreToolUse",
},
}));
-58
View File
@@ -1,58 +0,0 @@
#!/usr/bin/env node
import { appendFileSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
import { dirname, join } from "node:path";
import { execSync } from "node:child_process";
function rootDir() {
try {
return execSync("git rev-parse --show-toplevel", {
cwd: process.cwd(),
encoding: "utf8",
stdio: ["ignore", "pipe", "ignore"],
}).trim();
} catch {
return process.cwd();
}
}
function readStdin() {
try {
return JSON.parse(readFileSync(0, "utf8") || "{}");
} catch {
return {};
}
}
function readJson(path, fallback) {
try {
return JSON.parse(readFileSync(path, "utf8"));
} catch {
return fallback;
}
}
function writeJson(path, value) {
mkdirSync(dirname(path), { recursive: true });
writeFileSync(path, JSON.stringify(value, null, 2), "utf8");
}
const root = rootDir();
const payload = readStdin();
const omx = join(root, ".omx");
mkdirSync(join(omx, "logs"), { recursive: true });
appendFileSync(join(omx, "logs", "hooks.log"), `${new Date().toISOString()} SessionStart ${JSON.stringify(payload)}\n`, "utf8");
const runtimePath = join(omx, "state", "hook-runtime.json");
const runtime = readJson(runtimePath, {});
writeJson(runtimePath, {
...runtime,
lastSessionStartAt: new Date().toISOString(),
});
process.stdout.write(JSON.stringify({
continue: true,
hookSpecificOutput: {
hookEventName: "SessionStart",
additionalContext: "",
},
}));
-54
View File
@@ -1,54 +0,0 @@
#!/usr/bin/env node
import { appendFileSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
import { dirname, join } from "node:path";
import { execSync } from "node:child_process";
function rootDir() {
try {
return execSync("git rev-parse --show-toplevel", {
cwd: process.cwd(),
encoding: "utf8",
stdio: ["ignore", "pipe", "ignore"],
}).trim();
} catch {
return process.cwd();
}
}
function readStdin() {
try {
return JSON.parse(readFileSync(0, "utf8") || "{}");
} catch {
return {};
}
}
function readJson(path, fallback) {
try {
return JSON.parse(readFileSync(path, "utf8"));
} catch {
return fallback;
}
}
function writeJson(path, value) {
mkdirSync(dirname(path), { recursive: true });
writeFileSync(path, JSON.stringify(value, null, 2), "utf8");
}
const root = rootDir();
const payload = readStdin();
const omx = join(root, ".omx");
mkdirSync(join(omx, "logs"), { recursive: true });
appendFileSync(join(omx, "logs", "hooks.log"), `${new Date().toISOString()} Stop ${JSON.stringify(payload)}\n`, "utf8");
const runtimePath = join(omx, "state", "hook-runtime.json");
const runtime = readJson(runtimePath, {});
writeJson(runtimePath, {
...runtime,
lastStopAt: new Date().toISOString(),
});
process.stdout.write(JSON.stringify({
continue: true,
}));
-58
View File
@@ -1,58 +0,0 @@
#!/usr/bin/env node
import { appendFileSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
import { dirname, join } from "node:path";
import { execSync } from "node:child_process";
function rootDir() {
try {
return execSync("git rev-parse --show-toplevel", {
cwd: process.cwd(),
encoding: "utf8",
stdio: ["ignore", "pipe", "ignore"],
}).trim();
} catch {
return process.cwd();
}
}
function readStdin() {
try {
return JSON.parse(readFileSync(0, "utf8") || "{}");
} catch {
return {};
}
}
function readJson(path, fallback) {
try {
return JSON.parse(readFileSync(path, "utf8"));
} catch {
return fallback;
}
}
function writeJson(path, value) {
mkdirSync(dirname(path), { recursive: true });
writeFileSync(path, JSON.stringify(value, null, 2), "utf8");
}
const root = rootDir();
const payload = readStdin();
const omx = join(root, ".omx");
mkdirSync(join(omx, "logs"), { recursive: true });
appendFileSync(join(omx, "logs", "hooks.log"), `${new Date().toISOString()} UserPromptSubmit ${JSON.stringify(payload)}\n`, "utf8");
const runtimePath = join(omx, "state", "hook-runtime.json");
const runtime = readJson(runtimePath, {});
writeJson(runtimePath, {
...runtime,
lastPromptAt: new Date().toISOString(),
});
process.stdout.write(JSON.stringify({
continue: true,
hookSpecificOutput: {
hookEventName: "UserPromptSubmit",
additionalContext: "",
},
}));
+1 -1
View File
@@ -1 +1 @@
active
+114
View File
@@ -1 +1,115 @@
[2026-04-14T05:21:15Z] [SESSION-0] INIT Harness initialized for project /mnt/Data1T/mnote
[[2026-04-14T05:26:16Z] [SESSION-0] INIT Added [task-001] via harness add
[2026-04-14T05:27:30Z] [SESSION-0] WARN Previous log line has malformed prefix from add command; corrected entry appended
[2026-04-14T05:27:30Z] [SESSION-0] INIT Added [task-001] via harness add
[2026-04-14T05:34:11Z] [SESSION-1] LOCK acquired (pid=2142754)
[2026-04-14T05:34:11Z] [SESSION-1] INIT Environment health check: PASS
[2026-04-14T05:34:11Z] [SESSION-1] Starting [task-001] 请参考/mnt/Data1T/mnote/design/rust-kernel-backport-plan.md完成单仓收口 Rust 内核回迁计划,这是详细checklist/mnt/Data1T/mnote/design/rust-kernel-backport-phase-checklist.md,里面已经完成了部分内容,你需要继续完成 (base=fc26ed21)
[2026-04-14T05:40:04Z] [SESSION-1] CHECKPOINT [task-001] step=1/4 "完成 Rust 协议层对 documents.meta/content/save 的建模与映射,cargo test/check 已通过"
[2026-04-14T05:40:04Z] [SESSION-1] ERROR [task-001] [CONFIG] Missing validation.command for umbrella task; execution decomposed into task-002..task-004
[2026-04-14T05:40:04Z] [SESSION-1] Starting [task-002] 补齐 Rust core-protocol/storage-convex-bridge 对 documents.meta/content/save 的协议与映射 (base=fc26ed21)
[2026-04-14T05:40:04Z] [SESSION-1] CHECKPOINT [task-002] step=1/1 "已补齐 documents.meta.get / documents.content.get / documents.save 的 Rust 协议对象、Convex 映射与单测"
[2026-04-14T05:40:04Z] [SESSION-1] Completed [task-002] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T05:40:04Z] [SESSION-1] STATS tasks_total=4 completed=1 failed=1 pending=2 blocked=0 attempts_total=2 checkpoints=2
[2026-04-14T05:40:04Z] [SESSION-1] LOCK released
[2026-04-14T05:42:39Z] [SESSION-1] WARN Structured state synchronized after session-1 shell export bug; future Rust validation switched to CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness
[2026-04-14T05:42:53Z] [SESSION-2] LOCK acquired (pid=2188805)
[2026-04-14T05:42:53Z] [SESSION-2] INIT Environment health check: PASS
[2026-04-14T05:42:53Z] [SESSION-2] Starting [task-003] 为 blocks.patch 与正文保存补最小 Rust command 协议和 storage-convex-bridge 映射 (base=fc26ed21)
[2026-04-14T05:43:41Z] [SESSION-2] CHECKPOINT [task-003] step=1/2 "已把 blocks.patch 映射纳入 storage-convex-bridge,目标仍对齐当前 documents:updateContent 写链"
[2026-04-14T05:43:54Z] [SESSION-2] CHECKPOINT [task-003] step=2/2 "storage-convex-bridge 单测与 workspace cargo check 已通过"
[2026-04-14T05:43:54Z] [SESSION-2] Completed [task-003] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T05:43:54Z] [SESSION-2] STATS tasks_total=4 completed=2 failed=1 pending=1 blocked=0 attempts_total=3 checkpoints=4
[2026-04-14T05:43:54Z] [SESSION-2] LOCK released
[2026-04-14T06:09:58Z] [SESSION-3] LOCK acquired (pid=manual-sync)
[2026-04-14T06:09:58Z] [SESSION-3] INIT Environment health check: PASS
[2026-04-14T06:09:58Z] [SESSION-3] INFO Previous early stop root cause confirmed: umbrella task lacked validation.command and prior run ended after task-003 without continuing to next eligible task
[2026-04-14T06:10:01Z] [SESSION-3] Starting [task-004] 为 sidebar.dataset.list 固定 Rust query 契约并对齐 SidebarInitialData 聚合边界 (base=fc26ed21)
[2026-04-14T06:10:45Z] [SESSION-3] CHECKPOINT [task-004] step=1/2 "已为 sidebar.dataset.list 冻结共享 query payload/result 契约,并让 route、server helper、实时 hook 复用同一映射边界"
[2026-04-14T06:11:23Z] [SESSION-3] CHECKPOINT [task-004] step=2/2 "pnpm test src/lib/sidebar-data.test.ts 与定向 eslint 已通过,Sidebar 聚合边界收口完成"
[2026-04-14T06:11:23Z] [SESSION-3] Completed [task-004] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T06:14:52Z] [SESSION-3] Starting [task-005] 为 documents.save 固定共享 payload 契约并抽出 save command adapter,收口正文保存前后端边界 (base=fc26ed21)
[2026-04-14T06:15:20Z] [SESSION-3] CHECKPOINT [task-005] step=1/2 "已新增 documents.save 共享 payload contract,补齐 revision/conflictDetectionKey 的最小边界并让 BlockNote 保存请求复用"
[2026-04-14T06:16:40Z] [SESSION-3] CHECKPOINT [task-005] step=2/2 "save-contract/bridge 定向测试与 eslint 已通过,正文保存 route 已抽出 save command adapter"
[2026-04-14T06:16:40Z] [SESSION-3] Completed [task-005] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T06:18:30Z] [SESSION-3] STATS tasks_total=6 completed=4 failed=1 pending=1 blocked=0 attempts_total=5 checkpoints=8
[2026-04-14T06:18:30Z] [SESSION-3] LOCK released
[2026-04-14T06:42:18Z] [SESSION-4] CHECKPOINT [task-006] step=1/2 "已补 documents.content/save 的 revision 与 conflictDetectionKey 链路,并让 BlockNote 保存时携带快照采集元数据"
[2026-04-14T06:44:13Z] [SESSION-4] CHECKPOINT [task-006] step=2/2 "已通过 save-contract/bridge 定向测试,正文保存冲突会返回稳定 bridge 错误,checklist 已同步到 C3"
[2026-04-14T06:44:13Z] [SESSION-4] Completed [task-006] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T06:44:13Z] [SESSION-4] STATS tasks_total=6 completed=5 failed=1 pending=0 blocked=0 attempts_total=6 checkpoints=9
[2026-04-14T06:44:13Z] [SESSION-4] LOCK released
[2026-04-14T06:47:35Z] [SESSION-4] INIT Added [task-007] via harness add
[2026-04-14T07:25:47Z] [SESSION-5] LOCK acquired (pid=2564404)
[2026-04-14T07:25:48Z] [SESSION-5] INIT Environment health check: PASS
[2026-04-14T07:25:49Z] [SESSION-5] Starting [task-007] 请完成该checklist /mnt/Data1T/mnote/design/rust-kernel-backport-phase-checklist.md (base=fc26ed21)
[2026-04-14T07:25:50Z] [SESSION-5] CHECKPOINT [task-007] step=1/2 "确认该 checklist 为 umbrella 任务,拆分为 task-008..task-017 的可验证子任务"
[2026-04-14T07:25:51Z] [SESSION-5] ERROR [task-007] [CONFIG] Missing validation.command for umbrella task; execution decomposed into task-008..task-017
[2026-04-14T07:25:52Z] [SESSION-5] Starting [task-008] 统一单仓执行口径并补主仓维护边界文档,清理 ARCHITECTURE 中残留的 mnote-rust 承载叙事 (base=fc26ed21)
[2026-04-14T07:25:54Z] [SESSION-5] CHECKPOINT [task-008] step=1/1 "已新增单仓维护边界文档,并同步 ARCHITECTURE/plan/checklist 的主仓执行口径"
[2026-04-14T07:25:55Z] [SESSION-5] Completed [task-008] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T07:25:55Z] [SESSION-5] Starting [task-009] 固定 Mindmap 与 OnlyOffice 当前边界,明确历史仓对象页壳与第二套 sidebar 不进入主线 (base=fc26ed21)
[2026-04-14T07:25:56Z] [SESSION-5] CHECKPOINT [task-009] step=1/1 "已新增 Mindmap/OnlyOffice 边界说明,并把 Phase D 中可由源码证明的项补到账"
[2026-04-14T07:25:57Z] [SESSION-5] Completed [task-009] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T07:25:57Z] [SESSION-5] Starting [task-010] 冻结 Sidebar Rust query 目标文档,收口 sidebar.dataset.list 的最小 payload/result 契约 (base=fc26ed21)
[2026-04-14T07:25:58Z] [SESSION-5] CHECKPOINT [task-010] step=1/1 "已把 Sidebar Rust query 接入目标、前后端职责边界与禁止事项固定成独立文档"
[2026-04-14T07:25:59Z] [SESSION-5] Completed [task-010] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T07:25:59Z] [SESSION-5] Starting [task-011] 补主仓回迁资产与发布前源码审计文档,完成单仓启动路径、保存口径、trace 一致性与禁止事项复查 (base=fc26ed21)
[2026-04-14T07:26:00Z] [SESSION-5] CHECKPOINT [task-011] step=1/1 "已新增回迁资产清单与发布前源代码审计文档,并同步发布前 checklist 中源码可验证项"
[2026-04-14T07:26:01Z] [SESSION-5] Completed [task-011] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T07:26:01Z] [SESSION-5] Starting [task-012] 补 documents.save 成功路径 bridge 单测,确认低风险保存模式、identity 口径与回查链闭环 (base=fc26ed21)
[2026-04-14T07:26:02Z] [SESSION-5] CHECKPOINT [task-012] step=1/1 "已补 documents.save 成功路径 bridge 测试,并把 C3 的低风险保存模式、identity 口径与可回查项同步到 checklist"
[2026-04-14T07:26:03Z] [SESSION-5] Completed [task-012] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T07:26:05Z] [SESSION-5] STATS tasks_total=17 completed=10 failed=2 pending=5 blocked=0 attempts_total=12 checkpoints=15
[2026-04-14T07:26:06Z] [SESSION-5] LOCK released
[2026-04-14T07:42:15Z] [SESSION-6] LOCK acquired (pid=2803230)
[2026-04-14T07:42:15Z] [SESSION-6] INIT Environment health check: PASS
[2026-04-14T07:42:15Z] [SESSION-6] Starting [task-013] 将至少一条 Sidebar 主查询改为真实 Rust query 供给,并验证文档树/文件树/回收站语义不变 (base=fc26ed21)
[2026-04-14T07:56:00Z] [SESSION-6] CHECKPOINT [task-013] step=1/1 "已新增单个 sidebar.datasetList 主查询,并让 server helper / 实时 hook 统一消费该数据集;sidebar-data/file-tree 定向测试、eslint 与 storage-convex-bridge 单测通过"
[2026-04-14T07:56:00Z] [SESSION-6] Completed [task-013] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T07:56:00Z] [SESSION-6] STATS tasks_total=17 completed=11 failed=2 pending=4 blocked=0 attempts_total=13 checkpoints=16
[2026-04-14T07:56:00Z] [SESSION-6] LOCK released
[2026-04-14T08:13:25Z] [SESSION-7] LOCK acquired (pid=23844)
[2026-04-14T08:13:25Z] [SESSION-7] RECOVERY [task-014] action="resume_validation" reason="exclusive mode found stale in_progress task with no active lock; validating uncommitted implementation"
[2026-04-14T08:13:25Z] [SESSION-7] INIT Environment health check: PASS
[2026-04-14T08:13:25Z] [SESSION-7] Starting [task-014] 统一所有新命令和查询先进入 core-protocol envelope,再转给 storage-convex-bridge (base=fc26ed21)
[2026-04-14T08:14:45Z] [SESSION-7] CHECKPOINT [task-014] step=1/1 "已确认新增命令/查询统一先进入 core-protocol envelope,并完成 storage-convex-bridge 映射与 Rust 单测/检查闭环"
[2026-04-14T08:14:45Z] [SESSION-7] Completed [task-014] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T08:14:45Z] [SESSION-7] Starting [task-015] 补文档页、Sidebar、BlockNote 保存的端到端 UI 回归,并确认外观与交互未退化 (base=fc26ed21)
[2026-04-14T08:14:45Z] [SESSION-7] CHECKPOINT [task-015] step=1/3 "已修复 layout/sidebar route 中未定义 auth 的直接回归点,开始执行前端 lint/test"
[2026-04-14T08:15:16Z] [SESSION-7] CHECKPOINT [task-015] step=2/3 "pnpm lint 已通过(0 error,保留仓库既有 warnings),继续执行全量测试"
[2026-04-14T08:48:19Z] [SESSION-7] Starting [task-016] 统一 Mindmap 与 OnlyOffice 的页面标识、附件标识、页面归属和追踪字段,并补 Mindmap 交互回归 (base=fc26ed21)
[2026-04-14T08:48:19Z] [SESSION-7] CHECKPOINT [task-016] step=1/2 "已为 Mindmap API 与组件侧补统一 meta 口径,对齐 pageId/documentId、attachmentId/mindmapId、workspaceId 与 requestId/traceId"
[2026-04-14T08:50:25Z] [SESSION-7] CHECKPOINT [task-015] step=3/3 "已完成全量前端回归:pnpm lint 0 errorvitest 76/76 通过,文档页/Sidebar/正文保存链未见退化"
[2026-04-14T08:50:25Z] [SESSION-7] Completed [task-015] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T08:50:25Z] [SESSION-7] CHECKPOINT [task-016] step=2/2 "已通过定向 eslint 验证 Mindmap API 与组件侧的统一标识/追踪元信息口径,OnlyOffice 共享口径已同步到设计文档"
[2026-04-14T08:50:25Z] [SESSION-7] Completed [task-016] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T08:50:25Z] [SESSION-7] Starting [task-017] 补 OnlyOffice 打开、签名、代理、callback、forcesave 与静态资源回归,完成单仓发布前收口标准 (base=fc26ed21)
[2026-04-14T08:50:25Z] [SESSION-7] CHECKPOINT [task-017] step=1/1 "开始执行 OnlyOffice 定向 eslint 回归,验证页面、签名、代理、callback、forcesave 边界"
[2026-04-14T08:51:34Z] [SESSION-7] CHECKPOINT [task-017] step=2/2 "已完成 OnlyOffice 页面/API 定向 eslint,且根目录 onlyoffice-web-apps/onlyoffice-plugins/onlyoffice-data 关键静态资源目录仍在"
[2026-04-14T08:51:34Z] [SESSION-7] Completed [task-017] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T08:51:34Z] [SESSION-7] STATS tasks_total=17 completed=15 failed=2 pending=0 blocked=0 attempts_total=17 checkpoints=20
[2026-04-14T08:51:34Z] [SESSION-7] LOCK released
[2026-04-14T11:18:19Z] [SESSION-8] LOCK acquired (pid=3857410)
[2026-04-14T11:18:19Z] [SESSION-8] INIT Environment health check: PASS
[2026-04-14T11:18:19Z] [SESSION-8] Starting [task-018] 把 documents.title/stats/options/save 与 sidebar.dataset.list 的当前 route/adapter 契约同步回 checklist 和计划文档,明确哪些链路已 envelope 化、哪些仍未切到真实 Rust 执行链 (base=fc26ed21)
[2026-04-14T11:20:16Z] [SESSION-8] CHECKPOINT [task-018] step=1/1 "已确认 checklist 与计划文档同步包含 documents.title/stats/options/save、sidebar.dataset.list 的 envelope/真实 Rust bridge 现状说明,无需再补正文"
[2026-04-14T11:20:16Z] [SESSION-8] Completed [task-018] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T11:23:47Z] [SESSION-8] Starting [task-019] 为文档页元信息、Sidebar、BlockNote 保存链补真实浏览器端到端回归,完成发布前 UI 验收缺口并把 checklist 对应项打勾 (base=fc26ed21)
[2026-04-14T11:53:03Z] [SESSION-8] CHECKPOINT [task-019] step=1/2 "已修复真实浏览器回归前置环境:重新注册 Convex functions,首页从 500 恢复为正常 307 跳转到文档页"
[2026-04-14T11:53:03Z] [SESSION-8] CHECKPOINT [task-019] step=2/2 "已新增并跑通 scripts/task019-document-ui-regression.js:真实浏览器验证 Sidebar/页面标题/BlockNote 正文保存与刷新保留,临时页面已自动清理"
[2026-04-14T11:56:09Z] [SESSION-8] Completed [task-019] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T12:25:20Z] [SESSION-8] Starting [task-020] 把 pages 元信息与正文保存链从当前 TypeScript adapter 再向前推进一小步:至少选一条 documents.title.update 或 documents.save,做真实 Rust bridge 执行样板或最小可运行接缝,避免 route->TS adapter 长期停留在临时态 (base=fc26ed21)\n[2026-04-14T12:43:51Z] [SESSION-8] CHECKPOINT [task-020] step=1/2 "已新增 buildDocumentBridgeMutationRequest 与统一执行器,让 documents.title/stats/options/save 先生成与 storage-convex-bridge 对齐的 functionName/payloadJson/args runtime request"
[2026-04-14T12:43:51Z] [SESSION-8] CHECKPOINT [task-020] step=2/2 "已通过 task-020 指定的 cargo test、bridge vitest 与定向 eslint,并同步 plan/checklist 说明最小真实 bridge 运行接缝"
[2026-04-14T12:43:51Z] [SESSION-8] Completed [task-020] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T12:43:51Z] [SESSION-8] Starting [task-021] 补 Mindmap 真实交互回归并同步 checklist,确认当前页面、保存、节点操作与追踪字段口径在浏览器层未退化 (base=fc26ed21)
[2026-04-14T14:01:55Z] [SESSION-8] CHECKPOINT [task-021] step=1/2 "已新增并跑通 scripts/task021-mindmap-ui-regression.js:真实浏览器验证 Mindmap 全屏页元信息、工具栏/大纲侧栏、子节点新增删除与保存刷新链"
[2026-04-14T14:01:55Z] [SESSION-8] CHECKPOINT [task-021] step=2/2 "已通过 task-021 指定的定向 eslint0 error,保留仓库既有 warnings),并同步 checklist 中的 Mindmap 浏览器回归结论"
[2026-04-14T14:01:55Z] [SESSION-8] Completed [task-021] (commit skipped by repo rule; base=fc26ed21)
[2026-04-14T14:01:55Z] [SESSION-8] Starting [task-022] 补 OnlyOffice 真实页面打开与回调链回归,确认签名、代理、callback、forcesave 与静态资源在浏览器层可用,并把发布前 checklist 对应项收口 (base=fc26ed21)
[2026-04-14T18:08:23Z] [SESSION-9] LOCK acquired (pid=1767411)
[2026-04-14T18:08:23Z] [SESSION-9] INIT Environment health check: PASS
[2026-04-14T18:08:23Z] [SESSION-9] RECOVERY [task-022] action="reprioritize_to_upgrade_first" reason="user requested ONLYOFFICE upgrade before reconnecting Rust bridge"
[2026-04-14T18:08:23Z] [SESSION-9] WARN [task-022] strategy changed: split upgrade into [task-023] and reconnect regression into [task-024]
[2026-04-14T18:08:23Z] [SESSION-9] STATS tasks_total=24 completed=19 failed=3 pending=2 blocked=0 attempts_total=22 checkpoints=28
[2026-04-14T18:20:18Z] [SESSION-9] Starting [task-023] 升级 ONLYOFFICE 文档服务到当前可用稳定版本,并对齐静态资源、WebSocket 代理、自定义插件与 callback/forcesave 基线 (base=fc26ed21)\n[2026-04-14T18:20:18Z] [SESSION-9] CHECKPOINT [task-023] step=1/3 "已确认升级目标为 GitHub release v9.3.1,且当前 8082 容器仍由旧仓 mnote-rust 的 compose 与插件挂载驱动。"\n[2026-04-14T18:25:24Z] [SESSION-9] CHECKPOINT [task-023] step=2/3 "已在当前主仓补齐 ONLYOFFICE 部署文件,并拉取 onlyoffice/documentserver:9.3.1 镜像,开始接管 8082 容器。"\n[2026-04-14T18:40:31Z] [SESSION-9] CHECKPOINT [task-023] step=3/3 "已用当前主仓 compose 接管 8082 并升级到 onlyoffice/documentserver:9.3.1api.js 探测与 3001 代理均恢复正常。"\n[2026-04-14T18:40:31Z] [SESSION-9] Completed [task-023] (commit skipped by repo rule; base=fc26ed21)\n[2026-04-14T18:40:31Z] [SESSION-9] Starting [task-024] 在升级后的 ONLYOFFICE 基线上,重新连接页面打开、签名、代理、callback、forcesave、自定义插件桥与 Rust 内核接缝,并完成真实浏览器回归与 checklist 收口 (base=fc26ed21)\n[2026-04-14T18:40:31Z] [SESSION-9] CHECKPOINT [task-024] step=1/1 "已修复 /onlyoffice/plugins/* 放行与 agent-tools 非可视插件配置,升级后真实浏览器回归通过,签名/代理/callback/forcesave/插件桥闭环正常。"\n[2026-04-14T18:40:31Z] [SESSION-9] Completed [task-024] (commit skipped by repo rule; base=fc26ed21)\n[2026-04-14T18:40:31Z] [SESSION-9] STATS tasks_total=24 completed=21 failed=3 pending=0 blocked=0 attempts_total=24 checkpoints=32\n[2026-04-14T18:43:06Z] [SESSION-9] Starting [task-025] 把 OnlyOffice callback 附件写回链接到统一 bridge/Rust 协议边界:补最小 media asset writeback command、storage-convex-bridge 映射与 Next route 执行器,替换 callback 里的直连 Convex mutation (base=fc26ed21)\n[2026-04-14T18:43:06Z] [SESSION-9] CHECKPOINT [task-025] step=1/3 "已锁定 OnlyOffice callback 写回链为下一条 Rust 接缝推进目标,因为它仍直接调用 Convex mediaAssets mutation。"\n
+793 -3
View File
@@ -6,7 +6,797 @@
"max_tasks_per_session": 20,
"max_sessions": 50
},
"tasks": [],
"session_count": 0,
"last_session": null
"tasks": [
{
"id": "task-001",
"title": "请参考/mnt/Data1T/mnote/design/rust-kernel-backport-plan.md完成单仓收口 Rust 内核回迁计划,这是详细checklist/mnt/Data1T/mnote/design/rust-kernel-backport-phase-checklist.md,里面已经完成了部分内容,你需要继续完成",
"status": "failed",
"priority": "P1",
"depends_on": [],
"attempts": 1,
"max_attempts": 1,
"started_at_commit": "fc26ed21",
"validation": {
"command": null,
"timeout_seconds": null
},
"on_failure": {
"cleanup": null
},
"error_log": [
"[CONFIG] Missing validation.command for umbrella task; execution decomposed into concrete subtasks"
],
"checkpoints": [
{
"step": 1,
"total": 4,
"description": "完成 Rust 协议层对 documents.meta/content/save 的建模与映射,cargo test/check 已通过",
"timestamp": "2026-04-14T05:40:04Z"
}
],
"completed_at": null
},
{
"id": "task-002",
"title": "补齐 Rust core-protocol/storage-convex-bridge 对 documents.meta/content/save 的协议与映射",
"status": "completed",
"priority": "P0",
"depends_on": [],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p core-protocol && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p storage-convex-bridge && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo check --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml",
"timeout_seconds": 900
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已补齐 documents.meta.get / documents.content.get / documents.save 的 Rust 协议对象、Convex 映射与单测",
"timestamp": "2026-04-14T05:40:04Z"
}
],
"completed_at": "2026-04-14T05:40:04Z"
},
{
"id": "task-003",
"title": "为 blocks.patch 与正文保存补最小 Rust command 协议和 storage-convex-bridge 映射",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-002"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p storage-convex-bridge && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo check --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml",
"timeout_seconds": 900
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 2,
"total": 2,
"description": "已通过 CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness 下的 storage-convex-bridge 单测与 workspace cargo check",
"timestamp": "2026-04-14T05:43:54Z"
}
],
"completed_at": "2026-04-14T05:43:54Z"
},
{
"id": "task-004",
"title": "为 sidebar.dataset.list 固定 Rust query 契约并对齐 SidebarInitialData 聚合边界",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-002"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/sidebar-data.test.ts && pnpm exec eslint src/lib/sidebar-data.ts src/lib/server/sidebar-data.ts src/app/api/sidebar/route.ts src/hooks/use-convex-sidebar-data.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已为 sidebar.dataset.list 冻结共享 query payload/result 契约,并让 route、server helper、实时 hook 复用同一映射边界",
"timestamp": "2026-04-14T06:10:45Z"
},
{
"step": 2,
"total": 2,
"description": "已通过 pnpm test src/lib/sidebar-data.test.ts 与定向 eslintSidebar 聚合边界收口完成",
"timestamp": "2026-04-14T06:11:23Z"
}
],
"completed_at": "2026-04-14T06:18:30Z"
},
{
"id": "task-005",
"title": "为 documents.save 固定共享 payload 契约并抽出 save command adapter,收口正文保存前后端边界",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-003"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/save-contract.test.ts src/lib/documents/bridge.test.ts && pnpm exec eslint src/lib/documents/save-contract.ts src/lib/documents/save-command-adapter.ts src/app/api/documents/save/route.ts src/components/editor/blocknote-editor.tsx src/lib/documents/bridge.test.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已新增 documents.save 共享 payload contract,补齐 revision/conflictDetectionKey 的最小边界并让 BlockNote 保存请求复用",
"timestamp": "2026-04-14T06:15:20Z"
},
{
"step": 2,
"total": 2,
"description": "已抽出 save command adapter,并通过 save-contract/bridge 定向测试与 eslint 验证",
"timestamp": "2026-04-14T06:16:40Z"
}
],
"completed_at": "2026-04-14T06:18:30Z"
},
{
"id": "task-006",
"title": "继续补齐 documents.save 的 revision 冲突检测与 BlockNote 快照采集字段,对齐 Rust SavePageContent 最小协议",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-005"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/save-contract.test.ts src/lib/documents/bridge.test.ts && pnpm exec eslint src/lib/documents/save-contract.ts src/lib/documents/save-command-adapter.ts src/app/api/documents/save/route.ts src/components/editor/blocknote-editor.tsx src/lib/documents/bridge.test.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已补 documents.content/save 的 revision 与 conflictDetectionKey 链路,并让 BlockNote 保存时携带快照采集元数据",
"timestamp": "2026-04-14T06:42:18Z"
},
{
"step": 2,
"total": 2,
"description": "已通过 save-contract/bridge 定向测试,正文保存冲突会返回稳定 bridge 错误,checklist 已同步到 C3",
"timestamp": "2026-04-14T06:44:13Z"
}
],
"completed_at": "2026-04-14T06:44:13Z"
},
{
"id": "task-007",
"title": "请完成该checklist /mnt/Data1T/mnote/design/rust-kernel-backport-phase-checklist.md",
"status": "failed",
"priority": "P1",
"depends_on": [],
"attempts": 1,
"max_attempts": 1,
"started_at_commit": "fc26ed21",
"validation": {
"command": null,
"timeout_seconds": null
},
"on_failure": {
"cleanup": null
},
"error_log": [
"[CONFIG] Missing validation.command for umbrella task; execution decomposed into task-008..task-015"
],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "确认该 checklist 为 umbrella 任务,拆分为单仓口径、Phase D 边界、Sidebar Rust query 目标、发布前源码审计等可验证子任务",
"timestamp": "2026-04-14T07:25:50Z"
}
],
"completed_at": null
},
{
"id": "task-008",
"title": "统一单仓执行口径并补主仓维护边界文档,清理 ARCHITECTURE 中残留的 mnote-rust 承载叙事",
"status": "completed",
"priority": "P1",
"depends_on": [],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\narch = (root/'ARCHITECTURE.md').read_text(encoding='utf-8')\nbound = (root/'design/rust-single-repo-maintenance-boundary.md').read_text(encoding='utf-8')\nplan = (root/'design/rust-kernel-backport-plan.md').read_text(encoding='utf-8')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert '如果后续继续把这套能力收口到主仓 Rust 协议层' in arch\nassert '如果后面你要把这套能力继续收口到 `/mnt/Data1T/mnote/rust/`' in arch\nassert '只保留 `/mnt/Data1T/mnote` 作为启动、规划、保存、验证的唯一主仓。' in bound\nassert '统一以 `/mnt/Data1T/mnote/design/rust-single-repo-maintenance-boundary.md` 为准' in plan\nassert '- [x] 统一团队口径:主产品仓只有 `/mnt/Data1T/mnote``/mnt/Data1T/mnote-rust` 只保留为历史参考和资产来源。' in check\nprint('task-008-ok')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已新增单仓维护边界文档,并同步 ARCHITECTURE/plan/checklist 的主仓执行口径",
"timestamp": "2026-04-14T07:25:54Z"
}
],
"completed_at": "2026-04-14T07:25:55Z"
},
{
"id": "task-009",
"title": "固定 Mindmap 与 OnlyOffice 当前边界,明确历史仓对象页壳与第二套 sidebar 不进入主线",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-008"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\ndoc = (root/'design/mindmap-onlyoffice-boundary.md').read_text(encoding='utf-8')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert '`MindmapBlockView` 同时服务文档内嵌块与独立全屏页。' in doc\nassert '/mnt/Data1T/mnote-rust/app/documents/[id]/mindmap/page.tsx' in doc\nassert '- [x] 锁定 Mindmap 当前主组件和嵌入链路,确认 `MindmapBlock.tsx` 同时服务 BlockNote 内嵌块与独立全屏页。' in check\nassert '- [x] `src/components/onlyoffice/` 保持可用且未被误删。' in check\nprint('task-009-ok')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已新增 Mindmap/OnlyOffice 边界说明,并把 Phase D 中可由源码证明的项补到账",
"timestamp": "2026-04-14T07:25:56Z"
}
],
"completed_at": "2026-04-14T07:25:57Z"
},
{
"id": "task-010",
"title": "冻结 Sidebar Rust query 目标文档,收口 sidebar.dataset.list 的最小 payload/result 契约",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-008"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\ndoc = (root/'design/sidebar-rust-query-target.md').read_text(encoding='utf-8')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert '`sidebar.dataset.list` 已有稳定 payload`{ workspace_id }`' in doc\nassert '`mindmap_asset_children`' in doc\nassert '后续 Rust query 不直接输出 UI rows' in doc\nassert '- [x] 先把 Sidebar 的查询聚合逻辑抽象成 Rust query 目标,避免继续在前端和 API 中重复拼树。' in check\nprint('task-010-ok')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已把 Sidebar Rust query 接入目标、前后端职责边界与禁止事项固定成独立文档",
"timestamp": "2026-04-14T07:25:58Z"
}
],
"completed_at": "2026-04-14T07:25:59Z"
},
{
"id": "task-011",
"title": "补主仓回迁资产与发布前源码审计文档,完成单仓启动路径、保存口径、trace 一致性与禁止事项复查",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-008"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\naudit = (root/'design/rust-backport-audit-inventory.md').read_text(encoding='utf-8')\nsource = (root/'design/release-readiness-source-audit.md').read_text(encoding='utf-8')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nassert 'rust/crates/storage-convex-bridge/' in audit\nassert 'bridge 的最小查询、最小写入、日志生成、事件生成和错误返回已经形成源码闭环。' in source\nassert '- [x] 为 bridge 入口补集成 smoke,验证最小查询、最小写入、日志生成、事件生成和错误返回。' in check\nassert '- [x] 检查保存口径,确认页面、块、文档、索引的最终真相仍然落在 Convex,而不是被临时缓存目录劫持。' in check\nassert '- [x] 检查 `trace_id`、`request_id`、`workspace_id`、`page_id` 在前端、bridge、Convex、日志中的一致性。' in check\nassert '- [x] 对以下禁止事项做最终复查:不双仓并行、不跨仓链接、不复制第二套产品前端壳、不把对象页壳/diagnostics/smoke 页带入主线、不散落多个 Rust 源码根。' in check\nprint('task-011-ok')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已新增回迁资产清单与发布前源代码审计文档,并同步发布前 checklist 中源码可验证项",
"timestamp": "2026-04-14T07:26:00Z"
}
],
"completed_at": "2026-04-14T07:26:01Z"
},
{
"id": "task-012",
"title": "补 documents.save 成功路径 bridge 单测,确认低风险保存模式、identity 口径与回查链闭环",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-005",
"task-006"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/bridge.test.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已补 documents.save 成功路径 bridge 测试,并把 C3 的低风险保存模式、identity 口径与可回查项同步到 checklist",
"timestamp": "2026-04-14T07:26:02Z"
}
],
"completed_at": "2026-04-14T07:26:03Z"
},
{
"id": "task-013",
"title": "将至少一条 Sidebar 主查询改为真实 Rust query 供给,并验证文档树/文件树/回收站语义不变",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-010"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/sidebar-data.test.ts src/lib/file-tree/rows.test.ts && pnpm exec eslint src/lib/sidebar-data.ts src/lib/server/sidebar-data.ts src/app/api/sidebar/route.ts src/hooks/use-convex-sidebar-data.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已新增单个 sidebar.datasetList 主查询,并让 server helper / 实时 hook 统一消费该数据集;sidebar-data/file-tree 定向测试、eslint 与 storage-convex-bridge 单测通过",
"timestamp": "2026-04-14T07:56:00Z"
}
],
"completed_at": "2026-04-14T07:56:00Z"
},
{
"id": "task-014",
"title": "统一所有新命令和查询先进入 core-protocol envelope,再转给 storage-convex-bridge",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-002",
"task-003",
"task-004",
"task-005",
"task-006"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p core-protocol -p storage-convex-bridge && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo check --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已确认新增命令/查询统一先进入 core-protocol envelope,并完成 storage-convex-bridge 映射与 Rust 单测/检查闭环",
"timestamp": "2026-04-14T08:14:45Z"
}
],
"completed_at": "2026-04-14T08:14:45Z",
"claimed_by": "lix-kubuntu:23844",
"claimed_at": "2026-04-14T08:13:25Z",
"lease_expires_at": "2026-04-14T08:45:00Z"
},
{
"id": "task-015",
"title": "补文档页、Sidebar、BlockNote 保存的端到端 UI 回归,并确认外观与交互未退化",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-012",
"task-013"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm lint && pnpm test",
"timeout_seconds": 1800
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 3,
"total": 3,
"description": "已完成全量前端回归:pnpm lint 0 errorvitest 76/76 通过,文档页/Sidebar/正文保存链未见退化",
"timestamp": "2026-04-14T08:50:25Z"
}
],
"completed_at": "2026-04-14T08:50:25Z",
"claimed_by": "lix-kubuntu:23844",
"claimed_at": "2026-04-14T08:14:45Z",
"lease_expires_at": "2026-04-14T09:00:00Z"
},
{
"id": "task-016",
"title": "统一 Mindmap 与 OnlyOffice 的页面标识、附件标识、页面归属和追踪字段,并补 Mindmap 交互回归",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-009"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": null,
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/components/editor/blocks/MindmapBlock.tsx src/lib/mindmap/mindmapLocalStore.ts src/lib/mindmap/mindmapOps.ts src/app/api/mindmap/[docId]/route.ts src/app/api/mindmap/[docId]/[mindmapId]/route.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 2,
"total": 2,
"description": "已通过定向 eslint 验证 Mindmap API 与组件侧的统一标识/追踪元信息口径,OnlyOffice 共享口径已同步到设计文档",
"timestamp": "2026-04-14T08:50:25Z"
}
],
"completed_at": "2026-04-14T08:50:25Z"
},
{
"id": "task-017",
"title": "补 OnlyOffice 打开、签名、代理、callback、forcesave 与静态资源回归,完成单仓发布前收口标准",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-009",
"task-011"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/onlyoffice/page.tsx src/app/onlyoffice/OnlyOfficeClientPage.tsx src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 2,
"total": 2,
"description": "已完成 OnlyOffice 页面/API 定向 eslint,且根目录 onlyoffice-web-apps/onlyoffice-plugins/onlyoffice-data 关键静态资源目录仍在",
"timestamp": "2026-04-14T08:51:34Z"
}
],
"completed_at": "2026-04-14T08:51:34Z",
"claimed_by": "lix-kubuntu:23844",
"claimed_at": "2026-04-14T08:50:25Z",
"lease_expires_at": "2026-04-14T09:30:00Z"
},
{
"id": "task-018",
"title": "把 documents.title/stats/options/save 与 sidebar.dataset.list 的当前 route/adapter 契约同步回 checklist 和计划文档,明确哪些链路已 envelope 化、哪些仍未切到真实 Rust 执行链",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-014",
"task-015"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "python3 - <<'PY'\nfrom pathlib import Path\nroot = Path('/mnt/Data1T/mnote')\ncheck = (root/'design/rust-kernel-backport-phase-checklist.md').read_text(encoding='utf-8')\nplan = (root/'design/rust-kernel-backport-plan.md').read_text(encoding='utf-8')\nassert 'documents.title.update' in check and 'documents.options.update' in check and 'documents.save' in check\nassert '尚未切到 `core-protocol -> storage-convex-bridge` 的真实 Rust bridge 执行链' in check\nassert 'Phase B 当前只完成了“bridge 内核骨架已具备”,尚未完成“主仓入口真实接线”' in plan\nprint('task-018-ok')\nPY",
"timeout_seconds": 120
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已确认 checklist 与计划文档同步包含 documents.title/stats/options/save、sidebar.dataset.list 的 envelope/真实 Rust bridge 现状说明,无需再补正文",
"timestamp": "2026-04-14T11:20:16Z"
}
],
"completed_at": "2026-04-14T11:20:16Z"
},
{
"id": "task-019",
"title": "为文档页元信息、Sidebar、BlockNote 保存链补真实浏览器端到端回归,完成发布前 UI 验收缺口并把 checklist 对应项打勾",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-015"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm lint && pnpm test && curl -I -sS --max-time 20 http://127.0.0.1:3001/ | head -n 10",
"timeout_seconds": 1800
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已修复真实浏览器回归前置环境:重新注册 Convex functions,首页从 500 恢复为正常 307 跳转到文档页",
"timestamp": "2026-04-14T11:56:09Z"
},
{
"step": 2,
"total": 2,
"description": "已新增并跑通 scripts/task019-document-ui-regression.js:真实浏览器验证 Sidebar/页面标题/BlockNote 正文保存与刷新保留,临时页面已自动清理",
"timestamp": "2026-04-14T11:56:09Z"
}
],
"completed_at": "2026-04-14T11:56:09Z"
},
{
"id": "task-020",
"title": "把 pages 元信息与正文保存链从当前 TypeScript adapter 再向前推进一小步:至少选一条 documents.title.update 或 documents.save,做真实 Rust bridge 执行样板或最小可运行接缝,避免 route->TS adapter 长期停留在临时态",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-014",
"task-018"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path /mnt/Data1T/mnote/rust/Cargo.toml -p core-protocol -p storage-convex-bridge && cd /mnt/Data1T/mnote/wolai-frontend && pnpm test src/lib/documents/bridge.test.ts && pnpm exec eslint src/app/api/documents/title/route.ts src/app/api/documents/save/route.ts src/lib/documents/metadata-command-adapter.ts src/lib/documents/save-command-adapter.ts src/lib/documents/bridge.ts",
"timeout_seconds": 1800
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已新增 buildDocumentBridgeMutationRequest 与统一执行器,让 documents.title/stats/options/save 先生成与 storage-convex-bridge 对齐的 functionName/payloadJson/args runtime request",
"timestamp": "2026-04-14T12:43:51Z"
},
{
"step": 2,
"total": 2,
"description": "已通过 task-020 指定的 cargo test、bridge vitest 与定向 eslint,并同步 plan/checklist 说明最小真实 bridge 运行接缝",
"timestamp": "2026-04-14T12:43:51Z"
}
],
"completed_at": "2026-04-14T12:43:51Z"
},
{
"id": "task-021",
"title": "补 Mindmap 真实交互回归并同步 checklist,确认当前页面、保存、节点操作与追踪字段口径在浏览器层未退化",
"status": "completed",
"priority": "P1",
"depends_on": [
"task-016"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/components/editor/blocks/MindmapBlock.tsx src/lib/mindmap/mindmapLocalStore.ts src/lib/mindmap/mindmapOps.ts src/app/api/mindmap/[docId]/route.ts src/app/api/mindmap/[docId]/[mindmapId]/route.ts",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已新增并跑通 scripts/task021-mindmap-ui-regression.js:真实浏览器验证 Mindmap 全屏页元信息、工具栏/大纲侧栏、子节点新增删除与保存刷新链",
"timestamp": "2026-04-14T14:01:55Z"
},
{
"step": 2,
"total": 2,
"description": "已通过 task-021 指定的定向 eslint0 error,保留仓库既有 warnings),并同步 checklist 中的 Mindmap 浏览器回归结论",
"timestamp": "2026-04-14T14:01:55Z"
}
],
"completed_at": "2026-04-14T14:01:55Z"
},
{
"id": "task-022",
"title": "补 OnlyOffice 真实页面打开与回调链回归,确认签名、代理、callback、forcesave 与静态资源在浏览器层可用,并把发布前 checklist 对应项收口",
"status": "failed",
"priority": "P1",
"depends_on": [
"task-017"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/onlyoffice/page.tsx src/app/onlyoffice/OnlyOfficeClientPage.tsx src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts && curl -I -sS --max-time 20 http://127.0.0.1:3001/onlyoffice | head -n 10",
"timeout_seconds": 1200
},
"on_failure": {
"cleanup": null
},
"error_log": [
"[CONFIG] 用户改为先升级 ONLYOFFICE,再执行重连与真实回归;原 task-022 已拆分为 task-023/task-024"
],
"checkpoints": [
{
"step": 1,
"total": 2,
"description": "已确认当前 9.2.1 文档服务可打开,但自定义插件桥与真实回归仍未稳定;按用户要求改为先升级 ONLYOFFICE。",
"timestamp": "2026-04-14T18:08:23Z"
}
],
"completed_at": null
},
{
"id": "task-023",
"title": "升级 ONLYOFFICE 文档服务到当前可用稳定版本,并对齐静态资源、WebSocket 代理、自定义插件与 callback/forcesave 基线",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-017"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "curl -I -sS --max-time 20 http://127.0.0.1:8082/web-apps/apps/api/documents/api.js && curl -I -sS --max-time 20 http://127.0.0.1:3001/onlyoffice-server/web-apps/apps/api/documents/api.js && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/onlyoffice/page.tsx src/app/onlyoffice/OnlyOfficeClientPage.tsx src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts src/app/onlyoffice-server/[...path]/route.ts src/app/cache/[...path]/route.ts src/lib/onlyoffice/internal-url.ts",
"timeout_seconds": 1800
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "已确认升级目标改为 ONLYOFFICE DocumentServer 9.3.1,并发现当前 8082 容器仍由 mnote-rust/infra/onlyoffice/docker-compose.yml 驱动。",
"timestamp": "2026-04-14T18:20:18Z"
},
{
"step": 2,
"total": 3,
"description": "已在当前主仓新增 infra/onlyoffice/docker-compose.yml 与 README,并确认 onlyoffice/documentserver:9.3.1 镜像已成功拉取。",
"timestamp": "2026-04-14T18:25:24Z"
},
{
"step": 3,
"total": 3,
"description": "已用当前主仓 compose 接管 8082,容器升级到 onlyoffice/documentserver:9.3.1,且 8082 与 3001 的 api.js 探测均返回 200。",
"timestamp": "2026-04-14T18:40:31Z"
}
],
"completed_at": "2026-04-14T18:40:31Z"
},
{
"id": "task-024",
"title": "在升级后的 ONLYOFFICE 基线上,重新连接页面打开、签名、代理、callback、forcesave、自定义插件桥与 Rust 内核接缝,并完成真实浏览器回归与 checklist 收口",
"status": "completed",
"priority": "P0",
"depends_on": [
"task-023"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "node /mnt/Data1T/mnote/scripts/task022-onlyoffice-ui-regression.js && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/onlyoffice/page.tsx src/app/onlyoffice/OnlyOfficeClientPage.tsx src/app/api/onlyoffice/sign/route.ts src/app/api/onlyoffice/proxy/route.ts src/app/api/onlyoffice/callback/route.ts src/app/api/onlyoffice/forcesave/route.ts src/app/onlyoffice-server/[...path]/route.ts src/app/cache/[...path]/route.ts src/lib/onlyoffice/internal-url.ts",
"timeout_seconds": 2400
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 1,
"description": "已修复 /onlyoffice/plugins/* 放行与 agent-tools 非可视插件配置,升级后 scripts/task022-onlyoffice-ui-regression.js 真实浏览器回归通过,签名/代理/callback/forcesave/插件桥闭环正常。",
"timestamp": "2026-04-14T18:40:31Z"
}
],
"completed_at": "2026-04-14T18:40:31Z"
},
{
"id": "task-025",
"title": "把 OnlyOffice callback 附件写回链接到统一 bridge/Rust 协议边界:补最小 media asset writeback command、storage-convex-bridge 映射与 Next route 执行器,替换 callback 里的直连 Convex mutation",
"status": "in_progress",
"priority": "P0",
"depends_on": [
"task-024"
],
"attempts": 1,
"max_attempts": 3,
"started_at_commit": "fc26ed21",
"validation": {
"command": "cd /mnt/Data1T/mnote && CARGO_TARGET_DIR=/tmp/mnote-rust-target-harness cargo test --manifest-path rust/Cargo.toml -p core-protocol -p storage-convex-bridge && cd /mnt/Data1T/mnote/wolai-frontend && pnpm exec eslint src/app/api/onlyoffice/callback/route.ts src/lib/documents/bridge.ts && node /mnt/Data1T/mnote/scripts/task022-onlyoffice-ui-regression.js",
"timeout_seconds": 2400
},
"on_failure": {
"cleanup": null
},
"error_log": [],
"checkpoints": [
{
"step": 1,
"total": 3,
"description": "已在升级后的 9.3.1 基线下继续推进 Rust 接缝,当前锁定 callback 附件写回链,因为这条链仍直接调用 Convex mediaAssets mutation。",
"timestamp": "2026-04-14T18:43:06Z"
}
],
"completed_at": null
}
],
"session_count": 9,
"last_session": "2026-04-14T18:08:23Z"
}
+6
View File
@@ -72,6 +72,12 @@ pub struct UpdatePageOptions {
pub embed_default_block_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ReplaceMediaAssetStorage {
pub asset_id: String,
pub storage_id: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SavePageContent {
pub page_id: String,
+2 -2
View File
@@ -6,8 +6,8 @@ pub mod tool;
pub use command::{
CommandEnvelope, CreatePage, CreateWorkspace, DeleteBlock, InsertBlock, MoveBlock,
PatchPageBlock, SavePageContent, UpdateBlock, UpdatePageOptions, UpdatePageStats,
UpdatePageTitle,
PatchPageBlock, ReplaceMediaAssetStorage, SavePageContent, UpdateBlock, UpdatePageOptions,
UpdatePageStats, UpdatePageTitle,
};
pub use common::{
ActorPayload, AffectedObject, ErrorDetail, ErrorPayload, OkPayload, RequestMeta, ResponseMeta,
+38 -2
View File
@@ -22,8 +22,8 @@ mod tests {
use super::*;
use core_protocol::{
command::{
CreatePage, CreateWorkspace, PatchPageBlock, SavePageContent, UpdatePageOptions,
UpdatePageStats, UpdatePageTitle,
CreatePage, CreateWorkspace, PatchPageBlock, ReplaceMediaAssetStorage,
SavePageContent, UpdatePageOptions, UpdatePageStats, UpdatePageTitle,
},
query::{GetPage, GetPageContent, GetPageMeta, ListSidebarDataset},
ActorPayload, CommandEnvelope, QueryEnvelope, SourcePayload, TargetRef,
@@ -346,6 +346,42 @@ mod tests {
assert!(request.payload_json.contains("\"name\":\"documents.options.update\""));
}
#[test]
fn media_asset_writeback_command_maps_to_replace_storage_from_upload() {
let command = CommandEnvelope {
name: "media.assets.replace_storage".into(),
command_id: "cmd_asset_1".into(),
idempotency_key: Some("idem_asset".into()),
actor: ActorPayload {
actor_type: "service".into(),
actor_id: "onlyoffice-callback".into(),
session_id: Some("onlyoffice".into()),
},
source: SourcePayload {
channel: "onlyoffice-callback".into(),
client: "wolai-frontend".into(),
},
target: Some(TargetRef {
workspace_id: Some("ws_1".into()),
page_id: Some("page_1".into()),
block_id: None,
}),
payload: ReplaceMediaAssetStorage {
asset_id: "asset_1".into(),
storage_id: "storage_1".into(),
},
reason: Some("ONLYOFFICE 回调写回附件".into()),
refs: vec!["checklist:d".into()],
dry_run: false,
validate_only: false,
};
let request = build_write_request(&demo_context(), &command).expect("write request should build");
assert_eq!(request.function_name, "mediaAssets:replaceStorageFromUpload");
assert_eq!(request.workspace_id.as_deref(), Some("ws_1"));
assert!(request.payload_json.contains("\"name\":\"media.assets.replace_storage\""));
}
#[test]
fn document_meta_query_maps_to_documents_get_meta() {
let query = QueryEnvelope {
@@ -38,6 +38,7 @@ pub fn map_command_name_to_convex(command_name: &str) -> &'static str {
"update_block" => "blocks:update",
"move_block" => "blocks:move",
"delete_block" => "blocks:delete",
"media.assets.replace_storage" => "mediaAssets:replaceStorageFromUpload",
_ => "commands:unknown",
}
}

Some files were not shown because too many files have changed in this diff Show More