lili
|
410322cbc0
|
fix(studio): AIPanel onDone 改用 ref 读流式正文,消除渲染期跨组件 setState
AIPanel onDone 此前在 setStreamContent 更新函数里调父组件 onCandidateGenerated→AIPanel 渲染期触发 WorkspacePage setState(React warn "Cannot update a component while rendering a different component")。改:streamContentRef 在 onChunk 与 streamContent 同步累计,onDone 直接读 ref 调回调,不再渲染期 setState。ai-generation e2e 再跑 React warning grep=0(消失)、仍 passed(26.2s)。顺带修 AgentPage.contract.test 多余 import React(JSX automatic runtime 不需→TS6133;此前写 test 只跑 vitest 漏跑 tsc、commit 4c069d4 带入)。tsc 全量 0、vitest 102/102。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 18:01:56 -07:00 |
|
lili
|
494c9e9b89
|
test(studio): 补 AIPanel AI 生成真后端 e2e + 修 connectAIStream 漏鉴权头(反假绿暴露真 bug)
补 ai-generation.spec(真后端不 stub,消除 accept-suggestion stub 假绿,进度总账 line176②):真浏览器 WorkspacePage→AIPanel 发送指令→真后端 AI task→SSE→真 New-API LLM→suggestion 落库。**反假绿暴露真 bug**:connectAIStream(src/lib/sse.ts)漏带 Authorization+tenant-id 头→活体 SSE 必 401/400→done 永收不到→候选永不渲染(被 accept-suggestion 的 stub 长期掩盖)。修:补头,与 connectEventStream/client.ts 同源 @/api/auth。SSE 真行为:后端"持久化事件回放+5s 轮询",运行时只落 done 不落 chunk(streamContent 真链路恒空),真 LLM 文本在 suggestion 记录→断言落 suggestion(API+DB 双证)。四断言反假绿:POST 2xx+code0+taskId / suggestion 真 LLM 文本(非空+阈值+主题宽集合不硬编码句子) / CandidatePanel 采纳按钮 / DB muse_ai_suggestion 新行。自验+子代理连跑 4 次绿(suggestionId 12→13→14→15 各不同真 LLM,11-21s 稳定);vitest 102/102(sse.test 16/16);"AI 本机不可用"旧判断已过时(New-API 在线真生成)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 17:59:10 -07:00 |
|
lili
|
e8ca37c9b9
|
docs(ai): 回写槽位绑定 UI e2e 已补(02D 替换路径端到端真验)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 11:20:12 -07:00 |
|
lili
|
1fbe7ae73c
|
test(studio): 补 agent 槽位绑定 UI e2e(AgentPage→真后端替换槽位,反假绿)
承 02D 死锁修复(9115d4f)+ AgentPage 作品选择器(4c069d4),补端到端 UI e2e(进度总账 line176② 缺口)。agent-slot-bind.spec:真浏览器 goto /agents→selectOption work1→点 agent1 卡片→点"绑定选中智能体"→真后端 precheck→bind。三重反假绿:DB 起点 revision=1 + bind 响应 code=0/slotRevision=2 + UI"绑定已更新"提示 + DB 终态 revision 1→2 active agent1。global-setup §15 每轮复位 work1 writing.continuation 槽位(agent1 revision1 active)保证可重复(bind 成功 revision+1 漂移、不复位二次跑红)。MSW off 真连 muse_slice_live;自验 + 子代理各跑均 passed 可重复、tsc 零报错。诚实范围:只覆盖"替换已有槽位",首次创建 UI 仍缺槽位骨架(Override Slot Contract=方案 B,人类架构决策域未做)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 11:19:44 -07:00 |
|
lili
|
2c9fdb513c
|
docs(ai): 回写 AgentPage workId 硬编码解除(02D 前端槽位绑定 UI 打通)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 10:57:17 -07:00 |
|
lili
|
4c069d482d
|
fix(studio): AgentPage 槽位绑定改用作品选择器,消除 workId 硬编码
承 02D 后端槽位首次创建死锁修复(9115d4f),前端 AgentPage 此前 SlotBindingPanel 用硬编码 WORK_ID_FOR_SLOT_PREVIEW=1(盘点 line176② workId 硬编码),槽位绑定无法用于真实作品。修:接入 useWorkList 作品列表 + 作品选择下拉,SlotBindingPanel 按所选作品 workId 查询/绑定槽位,空作品时提示先建作品。SlotBindingPanel 绑定流(precheck→bind)本就完整(盘点"无真正绑定流"过时:实为后端死锁挡着 bind 必失败,后端修复后真后端 curl 已验 precheck→bind→首次建 binding)。补 AgentPage.contract.test(作品选择→正确 workId 下传 + 非硬编码反向验证)。tsc/eslint 绿,vitest 101→102。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 10:56:01 -07:00 |
|
lili
|
260f11426d
|
docs(ai): 回写 02D 槽位死锁修复 + AI 生成命脉真后端端到端打通
02D 槽位首次创建死锁修复(9115d4f)+ 前端 MVP agentSlotKey 接线(df063cb)+ P-A 检索修复(86c6dba)逐条破除进度总账 line176"AI 生成四重阻塞"。真后端 happy-path 真验(muse_slice_live):work1 writing.continuation precheck(不再 forbidden)→bind 首次建 binding(slotRevision1 active)→AI task 用 agentSlotKey→agent1→completed+suggestion7(真 LLM"星环大陆魔法体系"续写 finishReason stop)。最大假绿点(AI 生成 e2e 一律 stub /ai/tasks)消除。仍缺 Override Slot Contract 主数据(方案 B)/SlotBindingPanel UI 深链。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 10:37:03 -07:00 |
|
lili
|
9115d4f95f
|
fix(ai): 修 02D 槽位绑定首次创建死锁,precheck/bind 改 upsert + 补 active 唯一约束
根因:precheck(line102)/bind(line182)都 requireSlotBinding(binding!=null)缺行抛 AI_RESOURCE_FORBIDDEN;但"替换"是设计中唯一创建入口(替换=首次写入,无独立创建端点是设计有意,见后端-04 line748/产品-02D line507),要求被替换行先存在→死锁,首次绑定永不可达。work4 seed binding 是 E2E 绕此 bug 手插非设计常态。修:precheck 缺行放行;bind 抽 persistBinding upsert(有行 updateById 沿用乐观锁 revision+1,无行 insert revision=1 避免首次 expectedSlotRevision null 拆箱 NPE);V29 补 active partial unique index(tenant+work+slot WHERE status=active,并发首次写兜底);前端 mock protected 槽位对齐后端 startsWith(protected:)口径。验证:MuseAgentSlotServiceTest 26/26 + AppMuseAgentSlotControllerAnnotationTest 4/4 + 前端 useAgents/AIPanel.contract 4/4;handoff/幂等/乐观锁不破坏。范围:不建 Override Slot Contract 主数据(B)/不碰默认 agent 来源/不动 runtime 授权。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 10:09:53 -07:00 |
|
lili
|
df063cbacd
|
feat(studio): AI 生成提交补全上下文引用(workId/blockId/agentSlotKey),消除前端假绿
AIPanel 此前只传 commandId/intent/contextScope,残缺上下文被宽松 mock 掩盖(假绿)。补全:Props 接收 + payload 下传 workId(必填)/blockId/chapterId/agentSlotKey,WorkspacePage 透传真实 workId(useParams)+activeBlock.id+activeChapterId,agentSlotKey 续写默认 writing.continuation,接通槽位绑定↔生成断层。防假绿:mock /ai/tasks 收紧 workId 必填(40011);contract test 断言 body 含 workId/blockId/agentSlotKey(反向验证:删 workId 下传则测试变红)。范围:未做 agentOverrideRef UI/AgentPage 硬编码/EditorPage 重构。验证:全量单测 101/101 + tsc -b --noEmit exit 0。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 09:01:52 -07:00 |
|
lili
|
8e6e320cc1
|
docs(ai): 回写 P-A 检索命中打通到模块 .agent,专题-03 P-A/P-B/P-C 完整 e2e 真验
P-A 根因=document_ids null 入 body 被 RAGFlow 拒(code 102),已修 86c6dba;task7 contextAssembly chunkCount=1 retrievedKbIds=[2] authorizationSnapshotIds=[authsnap-e2e-1] + LLM MiniMax-M2.5 grounding 续写。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 07:22:43 -07:00 |
|
lili
|
86c6dbabc2
|
fix(knowledge): RAGFlow 检索 document_ids 为 null 时不入 body,修 P-A 上下文检索永不命中
根因:retrieveChunks 把 document_ids 以 null 放入 body,RAGFlow 要求其为 list,返回 code 102 "documents should be a list" → 检索 fail-closed → chunkCount=0。P-A 检索从未命中(task3/4/5/6 全 0)即此 bug,与 embedding/timeout/数据/授权均无关。修:null 时不传 document_ids(按授权 dataset 全量检索,符合 P-A 检索整个 KB 语义)。补 retrieveChunksShouldOmitDocumentIdsFromBodyWhenNull 回归测试(RagFlowClient 23/0、Retrieval 11/0 全绿)。真验:task7 contextAssembly chunkCount=1 retrievedKbIds=[2] authorizationSnapshotIds=[authsnap-e2e-1],LLM MiniMax-M2.5 基于 grounding 续写,P-A/P-B/P-C 完整 e2e 打通。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 07:20:07 -07:00 |
|
lili
|
96f8052c94
|
docs(ai): 回写 AI runtime 生成 e2e 端到端打通里程碑 + P-A RAGFlow 待办到模块 .agent
方案1(d647f0c)+D(4dadc7b)+agent modelKey+New-API 配置 → task5 MiniMax-M2.5 真 LLM 生成(P-B/P-C ✓);P-A 检索命中仍卡 RAGFlow 数据层(don't own dataset+chunk_count=0,外部依赖)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 06:38:21 -07:00 |
|
lili
|
4dadc7bae3
|
fix(framework): DefaultDBFieldHandler 无登录用户时 creator/updater 兜底 system,根治 scheduled 写 null 违约
问题: AI runtime 异步链(dispatcher/executor/recorder/projection)在 scheduled 线程 insert/update muse_ai_* 时 creator/updater 写 null 触发 NOT NULL 违约 → recordRequested insert 即回滚抛 → job 卡 running/queued、AI 执行恒失败(runtime_call 0 行)。
根因: BaseDO creator/updater 带 @TableField(jdbcType=VARCHAR),fill 字段即使 null 也被 MyBatis 强制入 SQL 列;DefaultDBFieldHandler 仅当登录用户存在才回填,scheduled worker 无登录上下文 → 写 null → 违约。insert+update 同病。上一版 5d0f17a 误判 insert 靠 default 兜底,只补了 updateById,被 e2e(runtime_call 0 行)证伪。
修正: insertFill/updateFill 无登录用户时 creator/updater 兜底 SYSTEM_OPERATOR("system"),一处根治所有模块 scheduled/async 写;回退 5d0f17a 局部 setUpdater(已被统一覆盖)。OAuth2TokenServiceImplTest 的 assertPojoEquals 补 creator/updater 忽略(token 创建无登录,DB 兜底 system 与内存返回对象不一致;auto-fill 字段本不应参与内存 vs DB 对比,与同测试既有忽略一致)。
验证: 框架+AI 回归 92/0;全量 381 测试类中 D 仅触发 OAuth2 2 断言(已修),余 Pay(Redis NOAUTH)/Knowledge(mock NPE)/P1r(meta 文件)为预存/环境失败、与 D 无关;e2e task3 executor 完整跑通——runtime_call 落库(creator/updater=system)、job/generation/call 全写回终态、无违约、P-C contextAssembly 固化进 source_summary。
注: 剩余 AI_NEW_API_UNAVAILABLE(infra.env 未配 MUSE_AI_NEW_API_*,adapter 走 Unavailable 兜底) + P-A 检索 0 chunks(KB 状态 disabled/draft 非 active) 为环境/数据 gap,非代码。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 04:28:33 -07:00 |
|
lili
|
5d0f17a410
|
fix(ai): AI 异步 runtime 链补 updater 回填,修 scheduled 写 muse_ai_* updater null 死锁
问题: 剥离 sourceSnapshotId 后 AI task 首次真正进入 executor 执行,撞上预存 bug——AI 异步 runtime 链(dispatcher failClaimedJob、recorder recordFinished、projection createShadow)在 scheduled 线程用 new DO + updateById,yudao DefaultDBFieldHandler.updateFill 仅当登录用户存在才回填 updater(if userId!=null && updater==null);worker 线程无登录上下文 → updater 保持 null → updater 列(fill=UPDATE)进 SET=null → muse_ai_job/call/generation updater NOT NULL 违约 → 写回失败 → job 永久 running、task 卡 queued。
根因对比: knowledge parse worker 用 selectById DO(updater 保留原值)故不中招;AI 异步链用 new DO(updater=null)中招。该链此前从未在真实 scheduled 环境跑过(长期被 runtime permission 死锁遮蔽),方案 1 修复后首次触达才暴露。
修正(局部): 三处 new-DO updateById 显式 setUpdater(ownerUserId 保持 task 链审计连贯,fallback ai-runtime);insert 路径靠列 default '' 兜底不违约,不改。
验证: dispatcher 5 + projection 5 + permission 15 + MuseAiTaskService 40 全绿;待 e2e 重跑 AI task 坐实 job 推进 + 检索 snapshot。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 01:51:57 -07:00 |
|
lili
|
d647f0c8d9
|
fix(ai): runtime 授权命中剥离 sourceSnapshotId,修 AI 执行恒 fail-closed 死结
问题: ProjectionSecurityRuntimePermissionFacade 的 runtime permission 门要求 grant.scope.sourceSnapshotId 精确匹配(SQL WHERE + Java scope 校验双重),但 sourceSnapshotId 每次 task 随机生成(ContentMuseWorkOwnerFacade:82 = "src-"+UUID)、且 grant 须在 task 提交前置存在 → admin 无法预审批含未来随机值的 grant → P1R-4 下任何 AI 执行(含 agent test)永远 fail-closed 被拒。
根因: 授权链两侧粒度语义错配——校验侧按 per-execution(含随机执行证据)匹配,产出侧仅有 per-registration(admin 预登记)能力;sourceSnapshotId 本是单次执行的事后审计证据,被误当成能力授权命中条件。
修正(最小): 从 grant 命中条件剥离 sourceSnapshotId——删 SQL WHERE 条件 + mapper 参数 + requireMatchingScope 校验;保留为 envelope summary 审计字段 + requireCompleteRequest 非空校验(执行证据仍必填)。授权回归能力粒度(operationId/targetType/targetId·targetKey/agentId/resourceRefs,均为可预登记的稳定标识)。
验证: ProjectionFacade 15(含新增 should_issueWhenScopeOmitsSourceSnapshotId)+ MuseAiTaskService 40 + ToolGrantService 6 + LocalApproval 7 全绿。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-24 00:52:05 -07:00 |
|
lili
|
1cf2ab389a
|
docs(knowledge): 回写 parse worker 里程碑 + AI 授权 fail-closed 边界到模块 .agent
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-23 23:26:28 -07:00 |
|
lili
|
635045cc30
|
feat(knowledge): 补 parse 轮询推进 worker,打通摄入 parsing→searchable 终态
处理链 startParseDocuments 触发 RAGFlow 解析后置 parsing/processing 即返回,RAGFlow 解析+embedding+索引为异步;此前无 worker 轮询其完成态(pollDocumentStatuses 仅 IT 手动调用),文档永久卡 parsing 无法 searchable。
新增 MuseKnowledgeParseStatusPollWorker(@Scheduled,默认关闭开关 muse.knowledge.parse-poll-worker.enabled):
- 跨租户捞 parsing 任务(selectParsingForPoll + executeIgnore),逐个切回任务租户轮询 RAGFlow 文档状态
- museStatus=searchable(RAGFlow run=done)→ markRagflowParseCompleted(task completed + version processingStatus=searchable → 文档 isSearchable=true,可进检索)
- failed → markRagflowParseFailed;processing → markRagflowParsePolling 刷新进度并保持 parsing
- RAGFlow 临时不可达/轮询异常一律保持 parsing 等下轮重试,绝不误判失败
ProcessingTaskService 补 markRagflowParseCompleted/markRagflowParsePolling;Mapper 补 selectParsingForPoll。
验证: worker 接线 7 + 回归(DocumentService 17 + Facade 3 + ScanService 9 + P-B RetrievalApiImpl 11) 全绿。端到端启用开关后真验。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-23 21:14:07 -07:00 |
|
lili
|
ec4a02ded2
|
feat(knowledge): 文本内容安全扫描,打通知识库摄入 scanning 关卡
实现 KnowledgeContentScanService(同步纯文本字符扫描),替换 KnowledgeFileFacade.materialize 恒 scanBlocked 占位:合法文本→scanStatus=passed→放行入 RAG,恶意字符→隔离,扫描异常→fail-closed。
范围:纯文本(txt/md/entry),内容只作检索文本、不渲染,故不做 HTML 消毒。
- L1 硬阻断:非法 UTF-8 / null 字节 / 危险 C0-C1 控制符 / Bidi 覆盖(Trojan Source) / 体量超限
- L2 规整:Unicode NFC + 去零宽 + 统一换行 → 干净内容入库/入 RAG
- L3 软策略:prompt 注入特征仅写 riskSummary 不阻断(误报高,真正防线是 P-A prompt 边界)
- 服务端权威 + fail-closed(对齐 SSOT 契约);特殊字符判定用十六进制码点,避免源码出现字面不可见字符
- MaterializedFile.scanBlocked 加 reasonCode/message;下游 isRagflowAllowed 总开关已就绪,无需改动
设计 spec:docs/agent-specs/2026-06-23-knowledge-content-scan-execution.md
验证:ScanService 9 + Facade 接线 3 + DocumentService 17(无回归) + P-B RetrievalApiImpl 11(无回归) 全绿。端到端真摄入(scan→RAGFlow→检索)验收待 rebuild 重启后补。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-23 10:28:19 -07:00 |
|
lili
|
a5b91da7a5
|
fix(infra): 补 muse_slice_live 缺失的 yudao @KeySequence 命名序列(dev 环境修复工具)
slice 库建表时漏建 yudao 各模块命名序列(@KeySequence 依赖),导致 system_login_log 等表 insert 时 SELECT nextval 报序列不存在(admin login 500)、知识库摄入受阻。
新增 sql/dev/muse-slice-sequences-repair-postgres.sql:
- 序列清单=全仓 @KeySequence 扫描(92 个),与代码一致(已 diff 校验无漏无多)
- DO block:CREATE SEQUENCE IF NOT EXISTS(幂等)+ 按对应表 MAX(id) setval 对齐(避免序列从 1 起与既有数据主键冲突);表不存在或主键非 id 则只建序列、跳过对齐
- 只新增序列对象,不改表结构、不动数据,可重跑
适用命名序列版 slice 库(与 sql/dev/yudao-base-schema 的 IDENTITY 自增版策略不同,后者自洽不需此补丁)。对 muse_slice_live 执行后 public 序列 2→93,配合 muse-file-config-master-seed 打通文件存储链路(FILE_SERVICE_UNAVAILABLE 解除)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-23 07:57:45 -07:00 |
|
lili
|
d07770c701
|
feat(ai-knowledge): P-C 质量门控可追溯,固化 Context Assembly Snapshot 到生成记录
专题-03 AI 检索串联第三期(P-C):AI 生成时把检索上下文组装结果固化为 Context Assembly Snapshot,内联进 generation.sourceSummary(jsonb,复用现有快照机制,无新表/无 DDL),作为质量评测可追溯输入(§8;门控评分本身归专题-04)。
- facade ContextAssembly 补 assemblySnapshot:status/chunkCount/retrievedKbIds/authorizationSnapshotIds/omittedSources(§8 可追溯)
- executor:检索组装提到 runtimeCommand 层,快照放进 command.inputSummary,经 command 流到 projection
- projection applyRuntimeResponse:把 contextAssembly merge 进 generation.sourceSummary 持久化(command/inputSummary null 防御)
- 整改 P-A 测试债:MuseAiTaskServiceTest 补 knowledgeRetrievalFacade mock(executor 自 P-A 起注入但未接桩,致 runtimeCommand 路径 14 例 NPE)
验证:facade 7 单测(含 snapshot 断言)+ projection 5 + task 40 防回归 + impl 11 回归 + ArchUnit 3 全绿。端到端真链路(真生成验 generation.sourceSummary 含 contextAssembly)验收待补。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-23 04:19:27 -07:00 |
|
lili
|
5659eb66c6
|
feat(ai-knowledge): P-B 授权过滤 fail-closed,检索结果补齐 §5.3 合同字段 + omittedSources
专题-03 AI 检索串联第二期(P-B):在 P-A 最小检索链路上叠加按用途授权 + 来源状态门控(fail-closed),检索结果补齐 §5.3 可追溯合同字段,被过滤来源透出 omittedSources 供审计。
- §4.3 用途门:binding.bindingScope 须含 "search" 上下文检索用途(阅读/导出≠检索),否则拒
- §4.3 来源状态门:projection.status ∈ {revoked,recalled,delisted,blocked,owner_missing,unauthorized} 一律拒;active/stale 纳入(stale 非阻断);active binding 无投影则 fail-closed
- §5.3 授权快照门:缺 authorizationSnapshot 的来源不进 Prompt
- §5.3 chunk 补字段:sourceOwner/sourceObjectVersion/authorizationSnapshot/sourceStatus/allowedPurpose
- omittedSources:被授权门过滤的来源(kbId/reason/sourceStatus)透出;executor metadata 透出 omittedSourceCount
- 全部消费已有 binding + source_binding_projection 数据,无新建授权模型/表
验证:knowledge 11 单测 + ai 6 单测 + ArchUnit(BcBoundary/AiGrantRuntime)全绿。端到端真链路(真 RAGFlow 摄入 + 真 New-API 生成 + 授权门生效)验收待补(攒 P-B 后一次做)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-23 03:59:36 -07:00 |
|
lili
|
987a20b5b7
|
feat(ai-knowledge): P-A 最小检索串联,AI 生成接入知识库 RAGFlow 检索填充上下文 L3
专题-03 AI 编排上下文核心链路第一期(P-A):打通 AI 生成链消费 knowledge 知识库 RAGFlow 检索,将授权知识片段填入 provider prompt 的上下文 Layer 3(§4.2 授权资料)。
- knowledge-api:新增 MuseKnowledgeRetrievalApi 对外检索端口(BC 合规,他域只依赖 -api)
- knowledge-server:MuseKnowledgeRetrievalApiImpl 实现 work→active binding→kb→active dataset→RAGFlow retrieveChunks→解析 data.chunks→脱敏;最小授权门(tenant/owner/work 必填 fail-closed)+ 检索失败/无命中一律返回 empty 不抛、不阻断主生成链
- ai-server:KnowledgeRetrievalFacade(@Primary,fail-closed 降级)+ executor executionPrompt 注入 L3 检索上下文(无命中退化为仅 metadata、不臆造)
- chunk 字段解析经 RAGFlow /api/v1/retrieval 官方契约验证(content/kb_id/document_id/similarity)
验证:knowledge 7 单测 + ai 4 单测 + ArchUnit(BcBoundary/AiGrantRuntime)全绿;chunk 解析对齐官方 RAGFlow HTTP API 响应结构。端到端真链路(真 RAGFlow 摄入 + 真 New-API 生成)验收待补。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-23 02:18:40 -07:00 |
|
lili
|
9ad619fcd6
|
docs(ai): AI 生成链↔knowledge RAGFlow 检索串联评审版(专题-03 核心)
2 路调研(反假绿 file:line)裁定 AI 检索消费链路:
- 缺口=中间层非基建:两端齐备(executionPrompt 明文"Source text not included this phase";
knowledge retrieveChunks 已被真实 RAGFlow IT 验收 chunksCount>0、但 0 对外暴露、生产调用方 0),
缺 knowledge-api 检索端口 + AI 侧 Context Assembly 层
- 外部全在线可真验(RAGFlow status:ok + New-API MiniMax-M2.5 实证)
- 专题-03 §4 四层上下文 + §5.3 检索结果合同 + §4.3 按用途授权过滤为硬约束(fail-closed)
- 建议分 3 期:P-A 最小检索串联真验 → P-B 授权过滤 fail-closed → P-C 质量门控快照
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-23 01:22:44 -07:00 |
|
lili
|
b5a6b1b423
|
docs(handoff): market 资产物化架构评审版(裁决伪缺口 + O1 跨租户验证)
2 路调研 + O1 验证(反假绿 file:line)裁决"market 资产物化":
- B(内容副本)与产品-02F:135 禁止项 + Candidate Envelope 已确认决策冲突 → 否
- O1 实证:单租户运行(system_tenant 仅 id=1)+ AI 消费链路(binding→kb 正文)未建成
(ai application 全量 grep 零命中)→ C/B' 解决的跨租户可读问题当前不触发、
服务的消费场景不存在 → 双重假想未来建设(违 YAGNI)
- 结论:整条物化主线暂缓,前置(真多租户 or AI 检索消费链路/RAGFlow)就绪前不投入
- SSOT 内部矛盾(A 不物化 vs B 物化)待人类裁决;V27 物化注释系 P2 自写、证据弱
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-23 00:52:47 -07:00 |
|
lili
|
b9993177eb
|
docs(handoff): 回写 P3 content asset_use 交付(三 owner token 红线全覆盖)
进度总账加 P3 条 + 总览 handoff 行(knowledge P1/agent P2/content P3 三 owner 全覆盖)+
P3 review spec §九实施状态。诚实范围:asset_use=使用授权事实记录非物化、AI 上下文消费另立、
剩 market→kb/agent 资产物化独立主线。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 23:48:40 -07:00 |
|
lili
|
26425b1755
|
test(handoff): P3 content asset_use 真后端 e2e + global-setup #14
handoff-content.spec(48080+真 PG+V28 真表):正路 bind-precheck(content)→
createHandoff(content/asset_use)→asset-use-precheck(后端 verify+consume)→asset-uses
落使用事实(单表转 consumed、assetUseId=precheckId);负路伪造 token 被后端 verify 拒(0 写)。
global-setup #14 每轮清 work4 asset_use precheck(asset_use 不绑实体、无需 seed fixture)。
验证:handoff-content 2 passed、全量 e2e 50→52(1 flaky knowledge-disable-restore 单跑绿、非回归)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 23:48:40 -07:00 |
|
lili
|
7bb15a5cf4
|
feat(handoff): P3 content 兑现侧落地 + 02F 来源侧发起(完整闭环)
ContentHandoffLanding(P3 完整闭环):bind-precheck(targetOwner=content)拿可信 source →
assetUsePrecheck(market+token,后端 verify+consume)→ setPrecheck(token 用完即弃)→
读 work revision → createAssetUse(凭 precheckId)→ 完成。useContentHandoff hooks +
HandoffLandingPage content dispatch + MarketAssetDetailPage「用于作品(进入作品空间)」发起入口
(asset_use 不依赖物化、sourceAssetId 真实,故来源侧发起完整可用、比 P1/P2 更完整)。
验证:tsc OK、eslint 空、vitest 97→101(ContentHandoffLanding 4:就绪/闭环/核验拒绝/会话失效)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 22:52:16 -07:00 |
|
lili
|
d113f4ee15
|
feat(handoff): P3 content asset_use 两段式后端(token 红线 + 单表事实)
content asset_use 从零建(SSOT 后端-04 定义表名/索引、建表 SQL 此前未写、feature disabled):
- V28 建表 muse_content_work_asset_use_precheck(单表,照 knowledge bind_precheck)
- 两段式:asset-use-prechecks(market 来源 verify(content/asset_use)+consume token、明文仅此阶段)
→ asset-uses(凭 precheckId + work 级乐观锁,单表转 consumed 即使用事实,AI archive 引用 precheckId)
- purposes 白名单 reference/ai_context/generate_reference(禁 template 模板化=forbiddenPurpose)
- content-server 依赖 market-api(经端口,不碰 market.dal)+ 错误码 1_041_002_xxx
验证:编译 OK、MuseContentAssetUseServiceTest 8/0(正路 verify+consume/伪造拒/缺 token 拒/禁用 purpose 拒/
越权拒/create 闭环/work revision 冲突/precheck 过期)、BcBoundaryArchTest 0 违例(content→market-api)。
asset_use 只记录使用授权事实、不写正文/参考来源(产品-02F L456),不涉及资产物化。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 22:51:59 -07:00 |
|
lili
|
1a11bbde7a
|
docs(handoff): P3 content asset_use 从零建评审版(基于 2 路真实调研)
handoff 最后一 owner。基于 content 后端代码 + design-docs SSOT 2 路只读调研:
- asset_use=使用凭证记录非物化(后端-04 L135/产品-02F L456),P3 范围无物化分裂
- SSOT 定义 precheck 表+precheck_id 索引但建表 SQL 未写(后端-04a 13 表无 asset_use),
无独立绑定事实表(AI archive 引用 work_asset_use_precheck_id,后端-04 L849)
- 两段式照 knowledge/P2 同款(token verify+consume 在 precheck 阶段、create 凭 precheckId)
- purposes 禁模板化(forbiddenPurpose);revision work 级
拍板点 Q1(落库形态)/Q2(用户价值锚点)/Q4(范围),Q3/Q5 SSOT 已定确认即可。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 22:26:17 -07:00 |
|
lili
|
6616bf1022
|
docs(handoff): 回写 P2 agent 兑现进度(总账 + 总览 + review 实施状态)
- 进度总账:加 2026-06-22 P2 时间线条目(后端放宽+verify/consume+V27、前端落地组件、
真后端 e2e 2/2、单测 25/0、ArchUnit 3/0、vitest 97、全量 e2e 50;诚实标注 market→agent
物化未接、e2e 用 seed fixture 替代、来源侧发起暂不做)
- 总览:handoff 令牌消费端 knowledge(P1)→ +agent(P2)红线闭环已接,剩 content(P3)
- P2 review:加实施状态行(✅ 已按方案 A 实施并真后端验证)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 13:13:00 -07:00 |
|
lili
|
2a7906c74e
|
test(handoff): P2 agent 兑现真后端 e2e + seed market agent fixture
global-setup #13:seed market 类型 agent(固定 agent_key)+ active version + work4 槽位绑定,
每轮幂等复位(子表先删再重建);供 market→agent 跨空间 handoff e2e(market→agent 资产物化未接,
此处为预置 fixture)。
handoff-agent.spec(真后端,反假绿):
- 正路:bind-precheck(targetOwner=agent)→ createHandoff 签一次性 token → agent precheck
(market_agent + token):后端 verify+consume+放宽接纳 market 类型 agent → bind 落槽位(slotRevision=2)
- 负路:伪造 token 调 agent precheck → 后端 verify 拒(code≠0),不放宽、0 写
验证:V27 已应用共享 muse_slice_live(flyway "now at version v27",用户拍板应用);handoff-agent
2/2 passed(真 PG + 真 token + V27 真列);全量 e2e 50 passed(唯一 flaky=knowledge-disable-restore
全量时序、单跑 2/2 绿、用 KB id=1 与 handoff 用 work4 无关,非 P2 回归)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 13:09:47 -07:00 |
|
lili
|
4c3e8bb905
|
feat(handoff): P2 agent 兑现侧前端落地组件(token 红线闭环)
AgentHandoffLanding(P2 兑现侧):从 store 取 token + URL params 取 agent 参数(slotKey/
sourceAgentId/version/revision)→ agentSlotPrecheck(market_agent + handoffToken,后端核验+核销)
→ setPrecheck(token 用完即弃)→ bindAgentSlot(只消费 precheckId)→ 绑定完成。
useAgentHandoff hooks + HandoffLandingPage owner dispatch +agent。
诚实范围:来源侧发起入口(MarketAssetDetailPage agent 按钮)依赖 market→agent 资产物化
(未接、列独立后续),做了会是半成品故暂不做;agent 参数经 URL 透传,e2e 用 seed market
agent + 直接构造落地 URL 验证兑现侧放宽红线。
验证:tsc -b OK、eslint 空、vitest 97/97(含 AgentHandoffLanding 4:就绪/闭环/核验拒绝/会话失效)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 12:38:45 -07:00 |
|
lili
|
65f949c997
|
feat(handoff): P2 agent 放宽接纳 market 来源 + verify/consume(后端)
跨空间 handoff(market→agent)兑现侧:放宽 requireVisibleActiveSourceAgent 的 agentType
校验仅接纳 verify 通过的 market token(precheck+bind 两处);precheck 阶段 verify(targetOwner=
agent)+consume(token 用完即弃)、落 source_owner/handoff_hash;bind 凭 precheck.source_owner=
market 识别放宽路径(不重复核验、凭 precheckId 信任)。保护节点/work 属主/agent-version active/
非 handoff 原校验全不放宽。
- ai-server pom +market-api;V27 加 source_owner/handoff_hash + muse_agent.source_market_asset_id(可空)
- AgentSlotPrecheckReqVO +sourceType/handoffToken/sourceId/sourceVersion/authorizationSummaryId
- ErrorCodeConstants +AI_MARKET_HANDOFF_UNAVAILABLE;precheckAgentSlot 签名 +apiVersion(consume 需要)
验证:MuseAgentSlotServiceTest 25/0(含 5 P2 红线单测:正路放宽接纳/verify 拒/无 token 拒/
非 handoff 维持 system-user 校验/bind 凭 source_owner 放宽);Bc+AiGrantRuntime ArchUnit 3/0
(ai 依赖 market-api 合法、consume 在 application 层不破 runtime 隔离)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 12:30:50 -07:00 |
|
lili
|
d42e2b8be3
|
docs(handoff): 订正 P1 完成度表述 + P2 拍板(方案 A,反假绿)
P2 调研连带发现 handoff "资产物化"维度(market asset→目标 owner 实体)P1–P3 全缺:
knowledge sourceMarketAssetId 字段在却无人写入、binding kb_id=parseLong(sourceId)
直用预存 kb、market install 不建实体(MarketInstallServiceImpl:63);agent 连字段都无。
P1 e2e 绿靠 fixture 巧合(asset1→kb_id1)。订正 P1 表述为"token 红线端到端 + 绑定
落库"(红线真生效属实、物化维度未接,列独立后续)。
P2 拍板方案 A(最小验证放宽红线,与 P1 同口径):加字段 + agent_type=market + seed
fixture + 放宽 + verify/consume + e2e;install 自动物化列独立后续。评审版落 §十 拍板结论。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 12:12:23 -07:00 |
|
lili
|
cd75b0247c
|
docs(handoff): P2 agent 放宽安全评审版(spec §六.3 单独评审)
基于真实代码实证(2 路只读调研)产出 P2 单阶段评审:精确放宽
requireVisibleActiveSourceAgent 的 agentType 校验仅接纳 verify 通过的 market
token;precheck+bind 两处放宽(bind 凭 precheck.source_owner 识别);precheck
DO/表加 source_owner/handoff_hash 列;不破保护节点/work 属主/active/AI 授权
隔离。三拍板点待人类定(头号:market→agent 资产物化模型决定放宽是否必要)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 10:50:58 -07:00 |
|
lili
|
a09bf9cda3
|
fix(handoff): P1 knowledge 落地闭环修复(ready 态 + returnUrl 契约)
KnowledgeHandoffLanding: token 用完即弃后(setPrecheck 清 handoffToken)以 precheckId
维持就绪态,兑现中不误退"会话失效"。
MarketAssetDetailPage: createHandoff 的 returnUrl 用绝对 URL(后端 validateReturnUrl
要求 scheme+host),前端 navigate 仍用相对 path。
均为 handoff-knowledge e2e 正路闭环验证依赖的修复(真后端 2 passed)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 10:35:38 -07:00 |
|
lili
|
610ba7ce6a
|
docs(progress): 回写 handoff P0/P1 knowledge 端到端闭环交付
进度总账加 handoff 跨空间统一接入 P0 基座 + P1 knowledge 流水(真后端 e2e
反假绿:正路完整兑现闭环 + 负路伪造 token 被后端 verify 拒,2 passed + 二次
幂等);总览市场待办行标注 handoff 令牌消费端 knowledge owner 已闭环、剩
agent/content owner(P2/P3)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 10:34:50 -07:00 |
|
lili
|
86bdba7974
|
test(handoff): P1 knowledge 兑现端到端真后端 e2e + fixture 复位
handoff-knowledge.spec(真后端 48080, MSW off):
- 正路:市场资产→获取授权→bind-precheck 就绪→前往绑定(createHandoff token)→落地页(URL token 经 replaceState
清除)→确认→kbBindPrecheck(后端核验+核销 token)→createBinding→绑定完成。证红线兑现闭环真生效。
- 负路:伪造 handoffToken 直打 kbBindPrecheck→后端 verify 拒(code 非 0)。证"不信客户端 token"红线后端真拦截。
- 用 work4(creator=test1、未占 uk);work1+kb1 已被 installed binding 占,避 uk_muse_knowledge_binding_work_kb 冲突。
global-setup #12:每轮清理 handoff 兑现产生的 market_kb 绑定(work4+kb1,按 source_snapshot_id 精准删),供闭环幂等重跑。
验证:handoff-knowledge 2 passed + 二次幂等绿;全量 48 passed。
(knowledge-disable-restore 全量时序 flaky——单跑 2 passed,预存在共享 fixture 时序、与本改动无关:handoff 不碰 KB id=1。)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 10:31:18 -07:00 |
|
lili
|
6a56524679
|
feat(handoff): P1 前端 knowledge 兑现闭环——发起+落地组件+mock+单测
P1 knowledge 端到端前端(纯前端,零后端改动——bind-precheck 已返回全部可信 source):
- 发起(MarketAssetDetailPage):bind-precheck 就绪→createHandoff 创建一次性 token→跳 /handoff/land/knowledge
(token 走 URL query,落地页随即 replaceState 清除,防刷新重复消费)。
- 落地(KnowledgeHandoffLanding):3 步兑现闭环——来源侧 bind-precheck 拿后端可信 source(authorizationSummaryId/
Snapshot/sourceVersion/sourceStatus,不信客户端自造)→目标侧 kbBindPrecheck(后端核验+核销 token,换 precheckId、
token 用完即弃)→createKnowledgeBinding(读 work revision 防乐观锁,落 binding)→clearSession 返回来源。
- owner 分发(HandoffLandingPage):按 targetOwner=knowledge 渲染落地组件,agent/content 留 P2/P3。
- 兑现 hooks(useKnowledgeHandoff)+ 类型收口(MarketBindPrecheckResult.sourceVersion、CreateHandoffInput
.authorizationSummaryId 对齐后端 Long,均 openapi 手写类型此前漏标的 drift)。
- mock handlers(market bind-precheck/handoffs/status + knowledge bindings/prechecks),支撑 dev 模式跑通闭环。
验证:tsc/eslint 绿;vitest 89→93(+KnowledgeHandoffLanding 4:就绪渲染/完整闭环/后端核验拒绝负路/会话失效)。
红线真生效(拒伪造/过期 token + 核销 + DB)待真后端 e2e(handoff-knowledge.spec)端到端覆盖。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 09:42:04 -07:00 |
|
lili
|
e5d2b52f20
|
feat(handoff): P1 后端 knowledge 兑现侧接入 Market token 核验/核销
P1(首条端到端 knowledge):knowledge-server 依赖 market-api,createKnowledgeBindingPrecheck
的 market_kb 来源在 precheck 阶段(token 明文仅此阶段持有、createBinding 的 BindReqVO 无 token)
调 MarketHandoffTokenApi.verify 服务端核验(属主/过期/一次性/owner-action),通过则 consume 核销
(消费换 session),替代此前"只存 hash 不验真"假安全。沿用 precheck @Transactional 事务保
verify/consume/落库原子。
注:执行版原写"createBinding 调 consume",自审修正为 precheck 阶段(token 明文仅此可得)。
验证:knowledge-server 编译(-am 连带刷新 meta-api 等)+ BcBoundaryArchTest 绿(knowledge→
market-api 合规、边界放行 -api)。端到端真实行为(拒伪造/过期 token + 核销 + DB)随 P1 前端 +
handoff-knowledge.spec 真后端 e2e 覆盖。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 09:09:26 -07:00 |
|
lili
|
a3b45ae6b5
|
feat(handoff): P0 统一基座——Market token 核验/核销端口 + 前端 HandoffStore/落地路由
handoff 跨空间统一接入执行版 P0(基座,前后端共享):
- 后端 market-api 新增 MarketHandoffTokenApi(verify 只读核验 + consume CAS 核销)+ market-server
实现:复用现有 selectByTokenHash/effectiveStatus/updateLifecycleByExpectedStatus + cancel 同款
envelope 幂等;consume 沿用调用方事务保原子(绿地:completed 状态此前无生产写入路径)。出参脱敏不回 token。
- 前端:openapi 导出 Handoff 类型;HandoffStore(Zustand,token 一次性用完即弃 + precheck 会话态);
通用 hooks(create/status/cancel);落地路由 /handoff/land/:targetOwner(红线:解析 token→
replaceState 清 URL→存 store,防刷新重复消费)。
验证:market 编译+install+BcBoundaryArchTest 绿;前端 tsc/eslint 绿、vitest 82→89(+handoffStore 5
+HandoffLandingPage 2)。verify/consume 真实行为(拒伪造/过期/跨属主 token + CAS 核销 + DB)随 P1
knowledge 端到端真后端 e2e 覆盖。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 09:02:52 -07:00 |
|
lili
|
5ae48383d6
|
docs(agent-specs): handoff 执行版 + 自审补强 targetPage 透传契约
执行版按拍板(三 owner 全补 + Market consume 端口)给出:统一前端基座(HandoffStore/
hooks/落地路由/类型收口)+ market-api verify/consume 端口 + 三 owner 兑现侧 token 回验
+ 分 P0-P3 按 owner 独立验证 + 边界/失败路径/验收/回滚。
自审补 §四.0:targetPage 是后端意图描述(非前端路由、不带 token)、token 由前端持有
附加进落地路由、authorizationSummaryId/returnUrl 透传链、刷新风险。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 08:43:33 -07:00 |
|
lili
|
9f0d581f38
|
docs(agent-specs): handoff 评审版记录拍板(三 owner 全补 + Market consume 端点)
用户走查拍板:① 范围=一次补全 knowledge+agent+content 三 owner 兑现侧(非 MVP 单条);
② token 核销=Market 新增显式 consume 端点(核销 authority 留签发方)。据此将出执行版。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 08:32:13 -07:00 |
|
lili
|
cb14b40223
|
docs(agent-specs): handoff 跨空间统一接入评审版(B 类头号架构缺口)
三方并行调研(后端契约/design-docs SSOT/studio 现状)证实 handoff 红线五域零落地、
后端兑现侧断链(token 不验真、Market 无 consume、agent/content 无兑现入口)。评审版定性
B+C 混合(前端四环统一层 + 后端兑现侧 token 核验),MVP 纵切市场→知识库,分 P1-P4 演进。
含拍板点表/Mermaid 数据流(标注前端缺/后端断链)/blast radius/验收/Open Items。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 08:25:28 -07:00 |
|
lili
|
f3967da5f3
|
docs(进度总账): A 类第三切片治理影响接入(全量 e2e 47/0,A 类告一段落)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 07:50:30 -07:00 |
|
lili
|
ab83735f6f
|
feat(studio): 资产详情页治理影响接入真后端(A 类:消费者治理 C14 读端)
A 类(后端就绪、前端 0 消费):02F GET /marketplace/assets/{id}/governance-impact 就绪
(curl code:0 + 真实 governanceResult:resultType/reason/操作限制 + affectedAuthorizations/
suggestedActions),但 studio 详情页无展示(盘点 C14 消费者治理缺口)。接入:
- useGovernanceImpact hook + openapi 导出 GovernanceImpactResult
- MarketAssetDetailPage「治理影响」区:结果类型(下架/召回/吊销/可申诉)+ 操作限制(停止获取/安装/绑定/生成)+ 建议动作
- mock handler + vitest 契约 + market-governance-impact.spec.ts 真后端 e2e
- 修 spec 块注释内 affected*/ 的 */ 意外闭合(tsc 不覆盖 e2e、playwright esbuild 暴露)
验证:全量 e2e 46→47/0;vitest 81→82;tsc/eslint 绿。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 07:49:08 -07:00 |
|
lili
|
a2f2ba33fe
|
docs(进度总账): A 类第二切片 New-API 绑定摘要接入(全量 e2e 46/0)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 07:38:12 -07:00 |
|
lili
|
7408615037
|
feat(studio): 个人中心 New-API 绑定摘要接入真后端(A 类:接已就绪后端)
A 类(后端就绪、前端 0 消费):02G GET /account/new-api-binding 后端就绪(curl code:0、
未绑定时 fail-closed 返 bindingStatus=unbound),但 studio 无任何展示(盘点 02G ❌ 缺口)。接入:
- useAccountNewApiBinding hook + openapi 导出 NewApiBindingSummary
- PersonalCenter「New-API 绑定」区:bindingStatus 中文徽标(已绑定/未绑定/同步失败/同步中)+ 上次同步时间
- mock handler + vitest 契约 + account-newapi-binding.spec.ts 真后端 e2e
验证:全量 e2e 45→46/0;vitest 80→81;tsc/eslint 绿。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 07:37:22 -07:00 |
|
lili
|
bcb670ba4d
|
docs(进度总账): A 类首切片市场推荐位接入(后端就绪前端0消费,全量 e2e 45/0)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 07:30:38 -07:00 |
|
lili
|
cac3b8837f
|
feat(studio): 市场推荐位接入真后端 recommendations(A 类:接已就绪后端)
A 类(缺口盘点:后端已就绪、前端 0 消费):02F GET /marketplace/recommendations 后端就绪
(curl code:0 + 真实推荐资产 + recommendationReason),但 studio 从不调用、推荐理由仅 mock
造、UI 未渲染(盘点 C3)。接入:
- useMarketRecommendations hook(返回 MarketAssetCard[],推荐失败不阻断主列表)
- MarketBrowse「为你推荐」区:渲染推荐资产 + recommendationReason,点击进详情
- mock handler + vitest 推荐契约;market-recommendations.spec.ts 真后端 e2e
- 连带修 live-read market 断言加 .first()(推荐位与列表可同时渲染同名资产→strict mode)
验证:全量 e2e 44→45/0;vitest 79→80;tsc/eslint 绿。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-22 07:29:14 -07:00 |
|