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
lili
1686843e71
docs(进度总账): admin+studio 缺口盘点 + D 类正文保存 e2e 闭环 + AI 四重阻塞定位
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 07:05:40 -07:00
lili
a581fec913
fix(studio): 正文保存补真后端 e2e + 修 block/work revision 字段漂移(D 类反假绿)
...
D 类(缺口盘点最高优先):正文自动保存是写作台心脏却零 e2e、仅 MSW 掩盖。补
block-autosave.spec.ts 真打 PUT /works/{id}/blocks/{id} 暴露并修真 bug:
- block revision 漂移:WorkspacePage 裸读 activeBlock.version(真后端返 revision、无 version)
→ expectedRevision 恒为 1 → 真后端乐观锁必冲突(1041000002,curl 实证)。提 blockRevision()
到 useBlockStructure 共享、WorkspacePage 复用。
- work revision 漂移(tsc -b 增量重检暴露):WorkVO 类型无 revision、真后端 detail 返 revision,
chapter create/work delete 裸读致 TS 报错。加 workRevision() helper。
- MuseEditor saveBlock 返回 { revision }(非 openapi 标的 newVersion),L110 改 revision 优先兜底。
- market 申诉 deadline fixture 老化(纯时间推进、非代码):reviewedAt+7天过期致提交被拒
1044000027,globalSetup 刷新被驳回 request.reviewed_at 到近期。
验证:block-autosave + block-structure/chapter/work 回归 4/4 绿;全量 e2e 44/0;tsc/eslint/vitest 79/79。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 07:02:13 -07:00
lili
d59fdab9b2
docs(进度总账): V27 验证结论——13 业务键 uk 当前无删除入口、不触发,V27 不做 + 潜伏 checklist
...
Explore 全量 + 抽验确认 meta/ai/knowledge 这 13 表当前无删除 service/controller 入口,
软删 uk 漏 deleted 仅在"删除→重建同 key"时触发,无删除即不触发。区别于 content
chapter/block(有软删、必触发、已 V26 修)。记潜伏 checklist:未来加删除功能须配套修 uk。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 01:19:13 -07:00
lili
2620d90b8f
docs(进度总账): V26 已应用 + chapter e2e 转正(全量 43/0 全绿,软删 uk 修复闭环)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 00:33:48 -07:00
lili
a752626286
test(content): V26 应用后 chapter-create-delete e2e 转正(全量 43/0 全绿)
...
V26(章节/Block order_no uk 改 partial index WHERE deleted=false)已 flyway 应用(now at v26),
curl 实证建 order=2 章节(之前撞软删行 → 500)→ code:0。chapter-create-delete.spec.ts 由 test.fixme
转回 test(),建→删配对通过;全量 e2e 43/0(原 +1 fixme 现转正、0 skipped)。
content 写路 + 软删 uk 修复完整闭环:chapter create/work delete 前端契约 + chapter/block order_no
后端 schema 双修验证通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 00:32:48 -07:00
lili
5c6409ea7a
docs(进度总账): 写命令契约盘点收口(agent/kb/market 健康,content 写路是唯一 gap 区)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 19:12:47 -07:00
lili
172261f540
fix(content): V26 修章节/Block 软删后 order_no uk 碰撞(partial index,待人类应用 flyway)+ 软删 uk 全仓审计
...
审计(用户授权):Explore 扫 177 uk,22 高危/137 中危/18 安全(yudao 软删 + ~99% uk 漏 WHERE deleted=false)。
精炼剔假阳(幂等/递增键不复用),真可复用业务键 uk = content order_no×2(确证)+ meta/ai/knowledge *_key×13。
全仓 ON CONFLICT 仅引用 command_id/id/asset/kb/validation/source,22 高危均不被引用→改 partial 安全。
V26 修 chapter+block order_no 改 partial index WHERE deleted=false(block create L294 确证同 selectCount+1 bug)。
应用需重启 48080 跑 flyway(DDL 改真 PG,auto-mode 归人类执行,未绕过)。chapter-create-delete e2e 保持
test.fixme、注释指向 V26,人类应用后转正。其余 13 业务键 uk 建议 V27 按模块逐步修(账本有清单)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 19:09:59 -07:00
lili
a30a9686ff
docs(进度总账): 删除作品契约字段修复 + content 写路系统性 gap 小结(59d1396,全量 42/0)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 14:09:27 -07:00
lili
59d139637a
fix(editor): 修删除作品缺契约字段致真后端 400(反假绿挖出,纯前端修复)
...
前端 useWorkDelete 此前 api.delete 不传 body,而后端 deleteWork 要 @Valid RevisionCommandReqVO
(commandId 幂等 + expectedRevision 作品乐观锁)→ 真后端删作品必 400(dev mock 不校验长期掩盖)。
又因列表 VO(GET /works)不含 revision 字段(仅 detail 有),无法直接取乐观锁版本;故 useWorkDelete
改为删除前先读 work 详情拿 revision,再带 commandId 提交删除(删除低频、额外一次 GET 可接受)。
补 work-create-delete.spec.ts(配对自清理 e2e:建作品→删作品,验 DELETE 200/code:0 + 列表无残留)。
curl 实证后端 work create→delete code:0(无 chapter 那类 order_no schema bug)。
tsc/eslint 0,vitest 79/79,全量 e2e 42/0(+1 chapter fixme)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 14:08:08 -07:00
lili
c4d3041268
docs(进度总账): 章节新建前端契约修复 + 后端 order_no 软删 schema bug 发现(ca33c8e,待人类定 DDL)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:56:21 -07:00
lili
ca33c8e006
fix(editor): 修新建章节缺契约字段致真后端 400(反假绿挖出)+ 标注暴露的后端 order_no 软删 bug
...
前端 useChapterCreate 此前只传 {title},而后端 ChapterCreateReqVO 强制 commandId(幂等)+
expectedWorkRevision(作品乐观锁),缺失被 @Valid 拦成 400——dev mock 不校验、长期掩盖,真后端建章必败。
修:useChapterCreate 补 commandId + expectedWorkRevision;ChapterPanel 经 props 接 work.revision、
WorkspacePage 传入;建章后失效 workDetail 缓存避免后续写命令复用旧 revision。
补 chapter-create-delete.spec.ts(配对自清理 e2e),暂 test.fixme:前端修复后请求合法到达后端,
又暴露独立后端 bug——createChapter orderNo=selectCountByWorkId(active)+1,章节软删后行仍在、
uk_muse_content_chapter_work_order 不含 deleted(同文件 command uk 是 partial index 却此处遗漏)
→ 删章节后再建 order_no 冲突 500。属 schema/软删语义,需人类定 DDL 修法,fixme 待修。
tsc/eslint 0,studio vitest 79/79,全量 e2e 41/0(+1 fixme)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:54:34 -07:00
lili
901f8e8aec
docs(进度总账): 个人中心 account 面真后端 e2e 全闭环(全量 41/0)
...
补权益配额/用量归属 e2e(1dbbfc7);account 面 profile 读写/权益配额/用量归属/
购买授权发布三件套/安全事件 ack 全覆盖。本会话 35/1→41/0。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:31:47 -07:00
lili
1dbbfc78b5
test(account): 补权益配额/用量归属真后端 e2e(UsageStats,account 面收口)
...
GET /account/entitlements(套餐/配额/发布能力)+ /account/usage(Token 用量/归属分布)
此前无专门 e2e(live-read 仅断言 nickname、未覆盖 UsageStats);curl 证两端 code:0 就绪。
补 account-usage.spec.ts(验 200/code:0 + 「权益与配额」/「归属分布」区块渲染)。
全量 e2e 41/0。至此个人中心 account 面真后端 e2e 全闭环(profile 读写 + 权益配额 +
用量归属 + 购买/授权/发布三件套 + 安全事件 ack)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:31:00 -07:00
lili
fd52b4660a
docs(进度总账): profile 写路 e2e + jsonb update 500 修复 + agent 污染清理(全量 39/0)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:20:38 -07:00
lili
3ffee3599a
test(e2e): global-setup 清理 agent-create 累积污染(修 live-read ai 稳定红)
...
agent-create.spec uniqueName=`活体智能体-e2e-${Date.now()}` 不幂等,每跑新建一个自建 agent,
累积 22 条后按 updatedAt 倒序把种子「活体测试智能体」挤出后端默认分页第一页,致 live-read
「智能体列表渲染真实 Agent」断言 timeout(随历史跑次增多从绿变稳定红)。global-setup 加第 11 节
删 e2e 前缀 agent、保留种子。全量 e2e 39/0。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:19:34 -07:00
lili
f3ea06c154
fix(account): 修个人中心资料更新 jsonb 类型错致 update 500(反假绿挖出)
...
AccountProfileMapper.updateByAccountUserIdAndVersion 用 LambdaUpdateWrapper.set
写 profile_snapshot(PG jsonb 列),默认不走 DO 上 @TableField 的 JsonbStringTypeHandler,
按 varchar 绑定 →「column is jsonb but expression is character varying」→ update 500
(insert 走 typeHandler 故首次 create 侥幸 OK、对已存在 profile 的 update 必 500)。
set 显式指定 JsonbStringTypeHandler 与 insert 路径对齐。
新增 account-profile-update.spec.ts(真后端写路 e2e:改公开署名→PATCH /profile→
code:0+version 乐观锁自增+UI 回显;只改署名不动昵称以不破坏 live-read 的 nickname 断言)
正是它暴露此 bug——curl 实证旧 jar PATCH 500、rebuild 后 code:0。全量 e2e 39/0。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 13:19:16 -07:00
lili
366ed63544
docs(进度总账): 个人中心市场记录三件套 e2e 全闭环(全量 38/0)
...
补购买/授权真后端 e2e(db63b2d),与已有「我的发布」同 service
(AccountMarketRecordService 读 muse_account_record_projection)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 12:56:56 -07:00
lili
db63b2d57e
test(account): 补个人中心购买/授权记录真后端 e2e(市场记录三件套补完)
...
purchases(GET /account/purchases)/licenses(/account/licenses)与已有「我的发布」同源
(AccountMarketRecordService 读 muse_account_record_projection 投影表),此前有 UI+hook
但缺真后端 e2e 验证(假绿风险)。补两 test:验 200/code:0 + 「我的购买」/「我的授权」区
真后端读通渲染。全量 e2e 38/0(原 36/0)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 12:55:50 -07:00
lili
38d4631f06
docs(进度总账): market-publish 列表慢一拍已修,全量 e2e 转 36/0
...
真根因=React Query refetch 被 dedup 到 save 的 in-flight 请求(返回提交前快照)
+ vite dev proxy 未透传 no-store 致浏览器误缓存,非此前记的"无排序"/"写后读延迟"。
修复 cancelQueries+refetchQueries+no-store(commit 23953fb)。studio 全量 e2e 现 0 红。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 12:49:02 -07:00
lili
23953fb701
fix(market): 修提交审核后「我的发布记录」列表慢一拍(全量 e2e 转 36/0)
...
根因(深度诊断,逐层排除):
1. React Query dedup: save→submit 链上 save 的 invalidate 已触发一次 refetch,
提交时它仍 in-flight,submit 的 invalidate 被 dedup 到该旧请求(返回提交前快照),
致「我的发布记录」刷不到刚提交申请(列表慢一拍);
2. 浏览器缓存: vite dev proxy 未透传后端 Cache-Control: no-store,浏览器按默认
启发式缓存 GET,refetch 命中旧缓存。
修复:
- submit onSuccess 改 cancelQueries 取消 in-flight + refetchQueries 强制发新请求;
- api client fetch 加 cache: no-store,数据新鲜度统一由 React Query 应用层管理。
验证: market-publish 提交审核全链 e2e 真后端转绿,全量 e2e 36/0(原 35/1)、
market vitest 4/4、tsc/eslint 0。决定性诊断: browserFetch(no-store page.evaluate
直查)拿 fresh 而 React Query refetch 返回 stale,证 refetch 被 dedup 未发新请求;
cancelQueries 后 refetch 转 fresh。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 12:47:44 -07:00
lili
99a118b45a
docs(进度总账): 订正 market-publish e2e fail 真根因为前端写后读慢一拍
...
深度诊断推翻此前"无排序"误判:page.request 证后端提交后立即可见且已倒序,
真根因是前端 React Query refetch 拿提交前快照;系统排除浏览器缓存/SW/后端延迟。
后端排序作为附带真 UX 改进已修(d8ed40d),前端慢一拍属 market 工作线专项。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 11:46:15 -07:00
lili
d8ed40dc4d
feat(market): 我的发布记录按发生时间统一倒序
...
PublishRecordItem 加 occurredAt(草稿=createTime/申请=submittedAt),
listMyPublishRecords 合并 draft+request 后按 occurredAt 倒序(nullsLast),
对齐 market 其它列表 orderByDesc;前端 MyPublishRecord 同步 occurredAt 契约。
验证:market 模块 test 绿(mock 时间 null,nullsLast 稳定保序不破坏断言)、
前端 tsc+vitest 绿、page.request 真后端直查证列表倒序生效(最新在首页)。
注:market-publish:65 e2e 仍 fail,真根因是前端提交后列表写后读慢一拍
(非排序,详见进度总账),属 market 工作线专项。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 11:44:21 -07:00
lili
a1a7cd8379
docs(进度总账): #30 盘点收口 - D/E/F/G 为可验证缺口全集
...
Explore 发现的 style-check/export/import/job-cancel 经后端核实均
外部依赖 fail-closed(*Facade UNAVAILABLE)或无自然 UI 落点,非可端到端验证缺口。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:55:38 -07:00
lili
be392157cb
docs(进度总账): 回写 studio G 已安装 KB 停用/恢复 + 全量 e2e 35/1
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:46:01 -07:00
lili
d4c530524e
feat(studio): 已安装知识库停用/恢复 UI(G)
...
- useInstalledKnowledgeDisable/Restore hook(POST installed-knowledge-bases/{installId}/disable|restore,CommandReqVO 仅 commandId)
- KnowledgePage「从市场安装的」卡片:按 binding_status 切换停用/恢复按钮,保留卸载
- mock + vitest(installed disable/restore status 翻转)
- e2e 真后端(muse_knowledge_binding.binding_status 切换;global-setup section10 复位 binding id=1)
#30 第4缺口。验证:vitest 6/6+全套79/79、tsc/eslint 0、e2e 1 passed(真后端)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:42:27 -07:00
lili
50353b3717
docs(进度总账): 补充 market-publish 倒序修法(PublishRecordItem 缺时间字段)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:29:42 -07:00
lili
fb86588265
docs(进度总账): work-schema-binding flaky 已修 + market-publish 列表倒序 known issue
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:26:25 -07:00
lili
fa651682b4
test(studio): work-schema-binding e2e 修 flaky(waitForResponse 前置)
...
schema-options 由 CreateWorkModal(首页即挂载、staleTime 60s)预取,全量跑(后端热)请求常
早于 waitForResponse 注册→race→30s timeout;注册移到 goto 前,覆盖请求早发/晚发两种时机。
全量 e2e 复跑该 spec 转绿(单跑本就绿、仅全量 flaky)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:20:28 -07:00
lili
6173889bd3
docs(进度总账): 回写 studio D/E/F 三缺口 + planning 二次保存 500 修复
...
D Block 分割合并 / E 正文来源归因 / F 知识库停用恢复(均真后端 e2e 真跑);
planning-edit save 500 根因(逻辑删除+uk 不含 deleted→二次保存撞键)与物理删除修复;
全量 e2e 34 passed/1 flaky(work-schema-binding)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 10:12:55 -07:00