Appearance
云文档 doc-as-chat from-scratch E2E 示例
这个示例验证云文档评论入口的真实端到端路径。它不是“先在 IM 里跑 /new”的替代写法;合格报告必须从一份新建云文档开始,经过 Drive 评论事件进入 bridge,再落到新群里的后续对话。
验收链路
- E2E harness 以用户身份创建一份测试云文档,正文包含本轮唯一 marker。
- E2E harness 给文档添加全局评论,评论内容包含结构化
mention_user指向 bot;不需要手写/new、群名或工作目录。 - 等待 bridge 收到
drive.notice.comment_add_v1,从云文档评论自动创建飞书群聊,并在CODELARK_HOME/data/channel-chats.json写入文档级cloudDocumentChat绑定。 - 在新群聊里发一条普通消息,不再通过云文档评论继续对话。
- 验证 bot 回复符合预期上下文:至少证明它知道本群绑定的
file_type、file_token,并能读取或引用文档里的本轮 marker。只检查“群里有回复”不算通过。 - 清理阶段删除测试群聊和测试云文档;失败时可以保留资源用于诊断,但报告必须标记 retained 资源。
前置条件
真实运行必须满足:
CODELARK_REAL_FEISHU_E2E=1,避免误向真实飞书发消息。- 测试身份具备创建测试文档、创建评论、发送测试群消息、读取测试群消息、删除测试资源所需权限。生产 bridge 的云文档建群路径不依赖用户身份 CLI。
- 被测 bridge 使用同一个 Feishu/Lark App,并已订阅
drive.notice.comment_add_v1、im.message.receive_v1、im.chat.disbanded_v1。 - 已知 bot 的 open_id,传给评论里的
mention_user。如果不知道,先用测试群成员接口或应用后台查出,不要用普通文本@bot代替结构化 mention。
自动化入口
这个场景已经接入真实飞书 E2E harness:
bash
CODELARK_REAL_FEISHU_E2E=1 npm run real:feishu:e2e -- \
--test-env-file ~/.codelark/test/real-feishu-e2e.test.env \
--launch-bridge \
--scenario doc-as-chat-from-scratch \
--runtime codex \
--provider tmux \
--run-id doc-chat-$(date +%Y%m%d%H%M%S) \
--timeout-ms 240000如果 harness 不能从测试 App 查询 bot open_id,可以额外传 --test-bot-open-id ou_xxx,或在测试 env 文件中写 CODELARK_REAL_FEISHU_TEST_BOT_OPEN_ID=ou_xxx。
通过 gate 包括:
doc_as_chat_context_assertion:群聊后续 bot 回复必须包含docx、测试文档file_token和正文 marker。doc_as_chat_user_group_read:必须以用户视角成功读取新群信息,证明当前用户在群里。doc_as_chat_document_binding:cloudDocumentChat绑定必须匹配file_token和触发建群的comment_id,同一云文档后续评论复用同一个群聊。scenario_created_chat_cleanup_completed和created_document_cleanup_completed:成功运行必须删除测试群和测试云文档。
失败诊断
如果自动化 gate 没有命中,本轮必须失败。失败报告需要附上:
DOC_URL、DOC_TOKEN、GROUP_CHAT_ID。CODELARK_HOME/logs/bridge.log中drive.notice.comment_add_v1附近的结构化 JSONL 日志,优先保留time、level、event、msg、chat、message字段。CODELARK_HOME/data/channel-chats.json中对应cloudDocumentChat绑定。- 群消息 transcript,尤其是用户消息和 bot
reply_to。
清理
harness 负责清理测试群聊和测试云文档。如果清理失败,报告不能标为完全通过;应把 retained 群聊和文档 token 写入报告,并给出后续清理 owner。
通过报告最小字段
报告中至少保留:
run_iddocument.urldocument.tokencomment.comment_idcomment.reply_idcreated_group.chat_idcreated_group.nameuser_message.message_idcontext_assertion.expected_file_typecontext_assertion.expected_file_tokencontext_assertion.expected_markercontext_assertion.passedcleanup.group_deletedcleanup.document_deleted
只有 context_assertion.passed=true 且两个清理字段都为 true,才算这条 from-scratch 云文档 E2E 通过。