141 Commits

Author SHA1 Message Date
lili
0cf6a6659e test(p1r): approve remaining api coverage completions 2026-06-17 10:49:58 -07:00
lili
4c16235e09 docs(p1r): sync account verification debt status 2026-06-17 07:59:46 -07:00
lili
467d7184c7 test(p1r): clear remaining content verification debt 2026-06-17 07:58:07 -07:00
lili
94155e6b03 test(p1r): verify content admin task reads 2026-06-17 07:39:01 -07:00
lili
6802dcf115 test(p1r): verify content export task cluster 2026-06-17 05:03:42 -07:00
lili
4e5be1f029 test(p1r): 验收债批25 真实 PG IT(content import-task 簇 2 op:真实只读 + fail-closed) + 台账/.agent 同步
P1rContentImportTaskCompletedApprovalIT(真实 PG muse_p1r_content_import_task_test,
3/3 绿,独立复跑两次均绿)覆盖 getImportTask/createImportTask,经真实
/app-api/muse/import-tasks/{taskId} 与 /works/{id}/import-tasks 入口。

getImportTask 是 Content 自有事实 muse_content_import_task 的真实持久化只读:种真实任务行
后经 HTTP 读回库内字段(id/workId/status/fileName/fileSize/format/scanStatus/progress
全部断言、纯读 no-write),并验缺任务→CONTENT_NOT_FOUND、跨属主→CONTENT_FORBIDDEN
(owner 隔离不泄露)。createImportTask 依赖 FileService owner;单体内 ContentFileFacade
仅有 fail-closed 默认实现,故 FileService 不可用时 fail-closed→
CONTENT_EXTERNAL_OWNER_UNAVAILABLE 不伪造已可用导入任务、不新增任务行、预占命令随
@Transactional 回滚;非法格式→CONTENT_INVALID_STATUS_TRANSITION(先于命令预占)、
非法 API version→CONTENT_API_VERSION_UNSUPPORTED 守卫,失败路径 0 写。

content needs_verification 验收债 10→8(余导出 4 + 管理端列表 2 + createParseJob +
mergeBlockSuggestion;含真实只读 getExportTask/管理端列表)。台账 completed flip +
覆盖门禁 APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:59:59 -07:00
lili
c8990fd2d2 test(p1r): 验收债批24 真实 PG IT(content parse-job 生命周期 4 op fail-closed) + 台账/.agent 同步
P1rContentParseJobLifecycleCompletedApprovalIT(真实 PG
muse_p1r_content_parse_job_test,3/3 绿,独立复跑两次均绿)覆盖
getParseJob/listParseJobChapters/retryParseJob/batchConfirmChapters,经真实
/app-api/muse/parse-jobs/{jobId}{,/chapters,/retry,/chapters/batch-confirm} 入口。

AI 解析任务与章节结果投影归 AI owner;单体内 ContentParseJobFacade/
ContentKnowledgeDraftFacade/ContentFileFacade 仅有 fail-closed 默认实现
(全 default = unavailable,@ConditionalOnMissingBean 兜底)。断言:AI owner 不可用时
四 op 全部 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE(解析任务投影在
requireParseJobProjection 处即不可用,故不伪造任务/章节/重试/批量确认结果);
两写 op(retry/batchConfirm)已预占命令随 @Transactional 回滚 0 残留,四 op 全程 0 写;
非法 API version→CONTENT_API_VERSION_UNSUPPORTED 守卫先于服务体且 0 写。

content needs_verification 验收债 14→10(余 10 全为 FileService/New-API/SSE
外部 owner fail-closed:导入/导出/管理端任务/createParseJob/合并建议)。
台账 completed flip + 覆盖门禁 APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:53:20 -07:00
lili
517abbdb2a test(p1r): 验收债批23 真实 PG IT(content chapter-parse-result 决策 2 op fail-closed) + 台账/.agent 同步
P1rContentChapterParseResultDecisionCompletedApprovalIT(真实 PG
muse_p1r_content_import_parse_test,3/3 绿,独立复跑两次均绿)覆盖
confirmChapterParseResult/rejectChapterParseResult,经真实
/app-api/muse/chapter-parse-results/{resultId}/confirm|reject 入口。

AI 解析任务/章节结果投影/知识草稿生成均归 AI owner;单体内 ContentParseJobFacade、
ContentKnowledgeDraftFacade、ContentFileFacade 仅有 fail-closed 默认实现
(全 default = unavailable,@ConditionalOnMissingBean 兜底)。断言:AI owner 不可用时
两 op 全部 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE(章节结果投影在
requireChapterResultProjection 处即不可用,故不生成知识草稿、不记录确认/拒绝决策);
两 op 均写路,已预占命令随 @Transactional 回滚 0 残留,全程 0 写;非法 API version→
CONTENT_API_VERSION_UNSUPPORTED 守卫先于服务体且 0 写。

content needs_verification 验收债 16→14(余 14 全为 FileService/New-API/SSE
外部 owner fail-closed:导入/导出/管理端任务/解析任务/合并建议)。台账 completed flip +
覆盖门禁 APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:46:56 -07:00
lili
22ba9e84c6 test(p1r): 验收债批22 真实 PG IT(content style-check 簇 2 op fail-closed) + 台账/.agent 同步
P1rContentStyleCheckClusterCompletedApprovalIT(真实 PG
muse_p1r_content_style_check_test,3/3 绿,独立复跑两次均绿)覆盖
createStyleCheck/getStyleCheckResult,经真实
/app-api/muse/works/{id}/planning/style-checks* 入口。

风格检查任务生成与结果归 AI owner;单体内 ContentStyleCheckFacade 仅有
fail-closed 默认实现(全 default = unavailable,@ConditionalOnMissingBean 兜底)。
断言:AI owner 不可用时两 op 全部 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE,
绝不伪造 queued 任务或结果;createStyleCheck 写 op 已预占命令随 @Transactional 回滚
0 残留,两 op 全程 0 写;owner/存在性守卫先于外部调用——跨属主→CONTENT_FORBIDDEN、
缺作品→CONTENT_NOT_FOUND 且 0 写。

content needs_verification 验收债 18→16(余 parse-result confirm/reject 2 +
14 FileService/New-API/SSE 外部 owner fail-closed)。台账 completed flip + 覆盖门禁
APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:39:23 -07:00
lili
a7d6a95824 test(p1r): 验收债批21 真实 PG IT(content meta-projection 簇 3 op fail-closed) + 台账/.agent 同步
P1rContentMetaProjectionClusterCompletedApprovalIT(真实 PG
muse_p1r_content_meta_projection_test,3/3 绿,独立复跑两次均绿)覆盖
listMetaProjections/getMetaProjection/validateDynamicFields,经真实
/app-api/muse/works/{id}/meta-projections* 与 /dynamic-fields/validate 入口。

MetaSchema 解释/Meta 投影/动态字段校验规则均归 Meta owner;单体内 ContentMetaFacade
仅有 fail-closed 默认实现(全 default = unavailable,@ConditionalOnMissingBean 兜底)。
断言:Meta owner 不可用时三 op 全部 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE,
绝不在 Content 侧伪造投影或复制 MetaSchema 规则,三 op 纯读全程 0 写;守卫先于外部调用——
非法 API version→CONTENT_API_VERSION_UNSUPPORTED、跨属主→CONTENT_FORBIDDEN、
缺作品→CONTENT_NOT_FOUND 且 0 写。

content needs_verification 验收债 21→18(余 createStyleCheck + parse-result
confirm/reject 2 + 约 15 FileService/New-API/SSE 外部 owner fail-closed)。
台账 completed flip + 覆盖门禁 APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:33:57 -07:00
lili
7d3a69ca4d test(p1r): 验收债批20 真实 PG IT(content planning candidate 簇 5 op fail-closed) + 台账/.agent 同步
P1rContentPlanningCandidateClusterCompletedApprovalIT(真实 PG
muse_p1r_content_planning_candidate_test,3/3 绿,独立复跑两次均绿)覆盖
createPlanningCandidate/listPlanningCandidates/getPlanningCandidate/
confirmPlanningCandidate/discardPlanningCandidate,经真实
/app-api/muse/works/{id}/planning/candidates* 入口。

规划候选生成/运行事实/状态投影归 AI owner;单体内 ContentPlanningCandidateFacade
仅有 fail-closed 默认实现(全 default = unavailable,等价生产
UnavailableContentPlanningCandidateFacade 的 @ConditionalOnMissingBean 兜底)。
断言:AI owner 不可用时五 op 全部 fail-closed→CONTENT_EXTERNAL_OWNER_UNAVAILABLE,
绝不伪造 queued/processing 任务、绝不在 Content 侧伪造 discarded;尤其
confirmPlanningCandidate(候选进正文唯一合法入口)拒绝写正式 planning section
(无候选投影即不落 canonical),create/confirm/discard 写 op 已预占命令随
@Transactional 回滚 0 残留,五 op 全程 0 写。owner/存在性守卫先于外部调用——
跨属主→CONTENT_FORBIDDEN、缺作品→CONTENT_NOT_FOUND 且 0 写。

content needs_verification 验收债 26→21(余约 15 FileService/New-API/SSE
外部 owner fail-closed + parse-result/dynamic-fields/meta-projection 真实持久化 op)。
台账 completed flip + 覆盖门禁 APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:25:20 -07:00
lili
5d34b3d853 test(p1r): 验收债批19 真实 PG IT(market handoff 簇 4 op,market 验收债清零) + 台账/.agent 同步
P1rMarketHandoffClusterCompletedApprovalIT(真实 PG muse_p1r_market_handoff_test,
3/3 绿,独立复跑两次均绿)覆盖 createBindPrecheck/createMarketplaceHandoff/
getHandoffStatus/cancelHandoff,经真实 /app-api/muse/marketplace handoff 入口端到端:
已购 active 授权快照→来源授权摘要(handoffReady)→一次性 handoff token(明文不入库、
只存 sha256 hash,事件快照不含明文)→只读回显 pending→expectedStatus CAS 取消
(pending→cancelled + completed_at)。bind/handoff 回放幂等返回与首呼一致结果不双写;
cancel 终态后再取消被取消性守卫拒绝(MARKET_HANDOFF_NOT_CANCELLABLE,守卫先于 replay
短路)且 0 写。fail-closed:非法 API version、缺资产、无活跃授权(授权≠可达)、目标
owner 白名单外(LocalMarketTargetOwnerFacade 本地目标页 fail-closed)、跨属主 token
读取/取消(属主隔离 RESOURCE_FORBIDDEN)、取消 CAS 期望态不匹配(reserveCommand 为
Propagation.MANDATORY,预占命令随 @Transactional 回滚 0 残留),失败路径全程 0 写。

至此本战役 market 批15-19 补 14 op,叠加战役前 14 op = market needs_verification
28 op 全有 dedicated 真实 PG 证据,market 验收债清零。台账 completed flip + 覆盖门禁
APPROVED_COMPLETED_OPERATIONS 仍须人工批准,agent 不自批。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 02:08:23 -07:00
lili
cb6e5955ba test(p1r): 批18 market 采纳链真实 PG IT(purchaseAsset → installMarketplaceAsset)
P1rMarketLicenseInstallCompletedApprovalIT 经真实 /app-api/muse/marketplace/assets/{id}/
purchase|install 覆盖 purchaseAsset/installMarketplaceAsset(MarketLicenseServiceImpl +
MarketInstallServiceImpl + MarketCommandServiceImpl + MarketAccountProjectionProvider/Outbox,
base-package=cn.iocoder.muse.module)。断言:购买写授权快照 + 购买事实 + completed 命令并把
purchase + license 两条 Account 投影经写端口跨 BC 同步(RecordingAccountProjectionApi 真实捕获、
读端绝不反写反假绿);安装要求已购 active 授权(无授权→MARKET_LICENSE_NOT_EXISTS)、仅 agent/kb
可安装(作品已购仍→MARKET_INSTALL_NOT_BINDABLE 且安装路径 0 写)、写 installed 安装记录 + completed
命令 + license 投影;purchase/install 命令幂等回放命中 completed 不写第二份事实;未上架(属主可见非
listed)→MARKET_ASSET_NOT_LISTED、缺资产→MARKET_ASSET_NOT_EXISTS、授权类型不符→
MARKET_LICENSE_NOT_PURCHASABLE、API version→MARKET_API_VERSION_UNSUPPORTED,失败路径全程 0 写。
真实 PG muse_p1r_market_license_install_test 3/3 绿,独立复跑两次均绿。

market 验收债 6→4(下一簇=createBindPrecheck + handoff 三件套)。同步 docs/mvp/进度总账.md §五B
与 market/.agent。completed 仍由人工批台账。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 01:45:43 -07:00
lili
63ad0c85e6 test(p1r): 批17 marketplace 发现读真实 PG IT(listAssets/recommendations/governanceImpact)
P1rMarketplaceDiscoveryReadsCompletedApprovalIT 经真实 /app-api/muse/marketplace/assets|
recommendations|assets/{id}/governance-impact 覆盖 listMarketplaceAssets/
listMarketplaceRecommendations/getGovernanceImpact(MarketAssetQueryServiceImpl + 收藏/命令依赖,
base-package=cn.iocoder.muse.module)。断言:列表按 App 可见性(listed 公开;draft 等非公开仅 publisher
自见)+ assetType 过滤分页 + 卡片字段回填(publisherName/version=unknown/isFavorite/isAcquired/
isInstalled=false);fallback 推荐返回可见资产卡片 + 推荐理由;治理影响读按 publisher/受影响者门禁
(publisher 自见返回治理结果摘要 + 空受影响列表;非属主且无关联授权/安装/绑定→fail-closed
MARKET_RESOURCE_FORBIDDEN,杜绝借治理接口探测非公开资产);缺资产→MARKET_ASSET_NOT_EXISTS、非法
API version→MARKET_API_VERSION_UNSUPPORTED,三 op 全程纯读 no-write(资产/收藏/命令/治理表
row_to_json 快照零变更)。真实 PG muse_p1r_marketplace_discovery_test 4/4 绿,独立复跑两次均绿。

market 验收债 9→6(下一簇=采纳链 createBindPrecheck/purchaseAsset/installMarketplaceAsset)。
同步 docs/mvp/进度总账.md §五B 与 market/.agent。completed 仍由人工批台账。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 01:30:56 -07:00
lili
482fb31e14 test(p1r): 批16 market 管理端资产治理写真实 PG IT(preview→delist/recall)
P1rMarketGovernanceWriteCompletedApprovalIT 经真实 /admin-api/muse/market/assets/{id}/
governance-impact|delist|recall 覆盖 adminPreviewGovernanceImpact/adminDelistAsset/adminRecallAsset
(同 批15 配置 + 治理 @PreAuthorize method security)。断言治理写生命周期:影响预览写 ready 预览 +
预览影响 + completed 命令并返回影响计数/通知范围(关联表空→计数全 0)→ 凭预览下架(listed→delisted 的
expectedStatus CAS + applied 治理动作 + 治理影响 + 事件发布 outbox + completed 命令)→ 凭预览召回
(listed→recalled + 目标 owner 传播 fail-closed:如实记录 source_status_event
recalled/recorded/TARGET_OWNER_UNAVAILABLE 而非伪造成功)。命令幂等回放命中 completed 不写第二条 fact;
fail-closed 全覆盖:合同枚举 VO @Pattern→BAD_REQUEST(service requireAllowed 为防御纵深)、缺/非 ready
预览→MARKET_GOVERNANCE_PREVIEW_REQUIRED、CAS 阻断→MARKET_ASSET_GOVERNANCE_BLOCKED(命令预占随
@Transactional 回滚、0 残留)、缺资产→MARKET_ASSET_NOT_EXISTS、API version、RBAC deny→FORBIDDEN,
失败路径全程 0 写。真实 PG muse_p1r_market_governance_test 4/4 绿,独立复跑两次均绿。

market 验收债 12→9(下一簇=marketplace 发现读)。同步 docs/mvp/进度总账.md §五B 与 market/.agent。
completed 仍由人工批台账。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 01:19:30 -07:00
lili
ca50d5a162 test(p1r): 批15 market 管理端资产治理读真实 PG IT(adminList/GetMarketAssets)
P1rMarketAdminAssetReadsCompletedApprovalIT 经真实 /admin-api/muse/market/assets 覆盖
adminListMarketAssets/adminGetMarketAsset(market 模块整组治理 mapper + MarketCommandServiceImpl +
MarketEventPublishOutboxServiceImpl,base-package=cn.iocoder.muse.module,admin @PreAuthorize
method security)。断言:列表按 tenant 隔离 + assetType/listingStatus/publisherId 过滤
(listingStatus 的 not_listed↔draft 由服务端 toInternalListingStatus/normalizeListingStatus 双向归一)、
publisherName/version(无当前版本→unknown)回填、关联计数(安装/绑定/申诉=0,关联表空);详情按 tenant
隔离返回资产快照 + 授权/安装/绑定/受影响任务计数全 0 + 版本/治理历史/申诉空集合;缺资产/跨租户→
MARKET_ASSET_NOT_EXISTS、非法 API version→MARKET_API_VERSION_UNSUPPORTED、RBAC
(muse:market:asset:query)deny→FORBIDDEN,两 op 全程纯读 no-write(资产/命令/治理/来源状态/事件
outbox 表 row_to_json 快照零变更)。真实 PG muse_p1r_market_admin_asset_test 2/2 绿,独立复跑两次均绿。

market 验收债 14→12(下一簇=治理写 previewGovernanceImpact/delist/recall)。同步
docs/mvp/进度总账.md §五B 与 market/.agent。completed 仍由人工批台账。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 00:57:35 -07:00
lili
26e1dd145f test(p1r): 批14 account 管理端购买记录读真实 PG IT(adminListPurchaseRecords)+ account 验收债清零
P1rAccountAdminPurchaseRecordsCompletedApprovalIT 经真实 /admin-api/muse/account/purchase-records
覆盖 adminListPurchaseRecords:跨模块(base-package=cn.iocoder.muse.module)由单体内 market 的
MarketAccountProjectionProvider 真实判定 purchase 投影可用,读端只读 Account 自有投影表
muse_account_record_projection。断言无 userId→跨用户全量、userId 过滤→owner 限定 +
source_status→admin status 归一 + 资产信息从 title/snapshot 回填、userId+status=completed 命中、
status=refunded 该用户空、非法 status→BAD_REQUEST、API version 守卫、RBAC(muse:account:query)
deny→FORBIDDEN,全程纯读 no-write(member_user + 投影表 row_to_json 快照零变更);Account 投影
写端口用抛错 stub 越界反假绿。真实 PG muse_p1r_account_admin_purchase_test 2/2 绿,独立复跑两次均绿。

至此 account needs_verification 验收债清零(批3 + 批7-14 全部补真实 PG 证据、证据就绪待人工批,
completed 仍由人工批台账)。同步 docs/mvp/进度总账.md §五B(account 1→0)与 member/.agent。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 00:35:11 -07:00
lili
77ab684baa test(p1r): 验收债批13 account 安全事件确认真实 PG IT(1 op,2/2 绿)
新增 P1rAccountSecurityEventAckCompletedApprovalIT,经真实 HTTP 入口 + 真实
PostgreSQL(muse_p1r_account_security_ack_test,独立复跑两次 2/2 绿)覆盖
appAcknowledgeSecurityEvent:

- 属主确认:按 owner 校验事件归属,向追加表 muse_account_security_event_ack
  追加处理轨迹 + 把基础事件 acknowledged 置真 + 命令 + 成功审计;
- 相同 commandId 幂等回放(不追加第二条轨迹);
- 非法 action→BAD_REQUEST、跨 owner→NOT_FOUND(owner 隔离不泄露)、非数字
  eventId→NOT_FOUND、缺用户→ACCOUNT_USER_NOT_EXISTS、API version 守卫,
  全程 fail-closed 且 0 写;
- 命令/审计走真实实现,无外部依赖;仅对专属 _test 库缺库自动创建,保留
  _test/密码仅 env/凭据 query 守卫。

同步 §五B(剩余 account 2→1)+ muse-module-member/.agent。
证据就绪,completed 待人工批(不自批台账=反假绿)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 00:19:45 -07:00
lili
0521ac2602 test(p1r): 验收债批12 account 管理端写路收尾真实 PG IT(2 op,3/3 绿)
新增 P1rAccountAdminWritesCompletedApprovalIT,经真实 HTTP 入口 + 真实
PostgreSQL(muse_p1r_account_admin_writes_test,独立复跑两次 3/3 绿)覆盖
adminCreateNewApiBinding / adminCreateCallAttributionJob:

- adminCreateNewApiBinding:单体 New-API facade(UnavailableNewApiAccountFacade)
  不可用时正确 fail-closed —— 业务 @Transactional 回滚命令预占(0 残留)+ 不写
  binding,失败外部调用经 REQUIRES_NEW 独立落库一条 unavailable,客户端收
  ACCOUNT_NEW_API_UNAVAILABLE;目标用户不存在/RBAC(muse:account:new-api:manage)/
  API version 守卫全程 0 写;
- adminCreateCallAttributionJob:基于已存在 correlationId 外部调用建立 queued
  归因 job + 命令(items 暂空),命令幂等回放(idempotent_hit 不写第二条),
  callIds 白名单未命中 BAD_REQUEST、expectedCallRevision 版本冲突
  ACCOUNT_VERSION_CONFLICT、缺调用记录 ACCOUNT_INTEGRATION_CALL_NOT_EXISTS、
  RBAC(muse:account:attribution:manage)/API version fail-closed,失败路径 0 写;
- 命令走真实实现,归因来源/审计/配额/用量附带依赖用抛错 mock 反假绿越界;
- 仅对专属 _test 库缺库自动创建,保留 _test/密码仅 env/凭据 query 守卫。

同步 §五B(剩余 account 4→2)+ muse-module-member/.agent。
证据就绪,completed 待人工批(不自批台账=反假绿)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 00:11:51 -07:00
lili
500860208e test(p1r): 验收债批11 account 管理端只读补全真实 PG IT(2 op,3/3 绿)
新增 P1rAccountAdminReadsCompletedApprovalIT,经真实 HTTP 入口 + 真实
PostgreSQL(muse_p1r_account_admin_reads_test,独立复跑两次 3/3 绿)覆盖
adminListUsageRecords / adminGetCallAttributionJob:

- adminListUsageRecords:以账户用户为分页主表在库内聚合(token 输入 150/
  输出 230/合计 380 求和、pending 计数 1/failed 0、attributionStatus=pending),
  非法 period→BAD_REQUEST;
- adminGetCallAttributionJob:按 jobId 读 job+items 并归一状态(completed)+
  分桶计数(attributed 1/failed 1/pending 0),not-found→
  ACCOUNT_INTEGRATION_CALL_NOT_EXISTS;
- 两 op 均 RBAC(muse:account:query)fail-closed、API version 守卫、纯读
  no-write(命令/审计/外部调用表保持为空);归因写路外部来源 facade 用抛错
  mock 反假绿越界;
- 仅对专属 _test 库缺库自动创建,保留 _test/密码仅 env/凭据 query 守卫。

同步 §五B(剩余 account 6→4)+ muse-module-member/.agent。
证据就绪,completed 待人工批(不自批台账=反假绿)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 00:02:30 -07:00
lili
14d7884a1f test(p1r): 验收债批10 account 导出/下载簇真实 PG IT(3 op,4/4 绿)
新增 P1rAccountExportDownloadClusterCompletedApprovalIT,经真实 HTTP 入口 +
真实 PostgreSQL(muse_p1r_account_export_test,独立复跑两次 4/4 绿)覆盖
appCreateExportTask / appGetExportTask / appDownloadExport:

- appCreateExportTask:FileService(UnavailableAccountFileServiceFacade,单体
  默认)未接入时,按合同把非敏感导出(profile)落库为 queued 任务 + 命令 +
  成功审计,绝不伪造 completed/fileRef/下载凭证,不写安全事件;相同 commandId
  幂等回放(idempotent_hit 不写第二条);敏感类型(usage)缺 step-up→BAD_REQUEST
  回滚;非法 exportType/缺用户/API version 均 fail-closed;
- appGetExportTask:按 owner 读任务状态归一、跨 owner not found、纯读 no-write;
- appDownloadExport:校验下载凭证(无效→ACCOUNT_DOWNLOAD_CREDENTIAL_INVALID),
  凭证可用但 FileService 不可用时正确 fail-closed —— @Transactional 回滚
  一次性消费(凭证 consumed_at 仍空可重试)+ 不写下载审计,客户端收
  ACCOUNT_FILE_SERVICE_UNAVAILABLE;
- 命令/审计走真实实现,仅对专属 _test 库缺库自动创建,保留 _test/密码仅 env/
  凭据 query 守卫。

同步 §五B(剩余 account 9→6)+ muse-module-member/.agent。
证据就绪,completed 待人工批(不自批台账=反假绿)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 23:52:51 -07:00
lili
91f223acd8 test(p1r): 验收债批9 account New-API 绑定簇真实 PG IT(3 op,4/4 绿)
新增 P1rAccountNewApiBindingClusterCompletedApprovalIT,经真实 HTTP 入口 +
真实 PostgreSQL(muse_p1r_account_newapi_binding_test,独立复跑两次 4/4 绿)
覆盖 getAppNewApiBinding / adminListNewApiBindings / appRecheckNewApiBinding:

- getAppNewApiBinding:按 owner 读绑定摘要 + 存储态归一(active→bound、
  无绑定→unbound 且不可重验),纯读 no-write;
- adminListNewApiBindings:以账户用户为分页主表(无筛选按 id 倒序返
  bound/unbound/sync_failed 三态 + syncErrorMessage)、bindingStatus 走
  EXISTS/NOT EXISTS 筛选、非法状态 BAD_REQUEST、RBAC(muse:account:query)
  fail-closed,纯读 no-write;
- appRecheckNewApiBinding:单体 New-API facade(UnavailableNewApiAccountFacade)
  不可用时正确 fail-closed —— 业务 @Transactional 回滚命令预占(0 残留),
  失败外部调用经 REQUIRES_NEW 独立落库一条 unavailable(error_code 可排障),
  binding 不被改写,客户端收 ACCOUNT_NEW_API_UNAVAILABLE;binding 不存在/
  缺用户/API version 三守卫全程 0 写;
- 控制器/服务附带依赖(quota/usage/audit service)用抛错 mock 反假绿越界;
- 仅对专属 _test 库缺库自动创建,保留 _test/密码仅 env/凭据 query 守卫。

同步 §五B(剩余 account 12→9)+ muse-module-member/.agent。
证据就绪,completed 待人工批(不自批台账=反假绿)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 23:42:09 -07:00
lili
fa9dae84ce test(p1r): 验收债批8 account 用量/外部调用可观测读端真实 PG IT(3 op,4/4 绿)
新增 P1rAccountUsageObservabilityCompletedApprovalIT,经真实 HTTP 入口 +
真实 PostgreSQL(muse_p1r_account_usage_observability_test,独立复跑两次 4/4 绿)
覆盖 getAppUsage / appGetIntegrationCallByCorrelation /
adminGetIntegrationCallByCorrelation 三个只读 operation:

- getAppUsage:按 owner 聚合(token 输入/输出求和、pending/anomaly 计数、
  byModel、byAttribution)+ 跨用户隔离(他人用量不计入)+ period 规范化/白名单;
- 外部调用读:app 侧 owner 守卫(越权 ACCOUNT_RESOURCE_FORBIDDEN)、
  admin 侧无 owner 限制可跨用户读 + RBAC(muse:account:query),status/
  requestType/attributionStatus/retryGroup 归一化;
- 三 op 纯读全程 no-write(member_user/usage_record/integration_call/
  command/audit 快照前后一致);fail-closed:缺用户/not-found/API version/
  RBAC deny 全部经真实 GlobalExceptionHandler 命中;
- 控制器附带依赖(权益/绑定/配额/归因 service)用抛错 mock 反假绿越界;
- 仅对专属 _test 库缺库自动创建,保留 _test/密码仅 env/凭据 query 守卫。

同步 §五B(剩余 account 15→12)+ muse-module-member/.agent。
证据就绪,completed 待人工批(不自批台账=反假绿)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 23:26:24 -07:00
lili
e10a547b04 test(p1r): 验收债批7 真实 PG IT(account 配额请求 3 op,5/5 绿)
P1rAccountQuotaRequestCompletedApprovalIT 覆盖 appCreateQuotaRequest/
appGetQuotaRequest/adminCreateQuotaRequest,经真实 /app-api/muse/account/
quota-requests 与 /admin-api/muse/account/users/{userId}/quota-requests
(member 租户行拦截器 + member_user fixture + admin @PreAuthorize method security):
create 入队写 quota_request(queued)+pending_attribution 外部调用占位+completed
command(app:actor=owner=登录用户/amount=0;admin:actor=操作者、owner=目标用户、
amount=targetQuota.limit);命令幂等回放(idempotent_hit 不写第二条);相同 commandId
不同请求 hash→ACCOUNT_COMMAND_ID_CONFLICT 事务回滚;get 按 owner+tenant 隔离归一化
状态、纯读 no-write;fail-closed(类型白名单/API version/缺用户/越权 owner/not-found/
RBAC deny)全程 0 写、0 command 预占;配额请求链路不写 Account 审计(audit/outbox 桩
抛错反假绿)。10 条负路经真实 GlobalExceptionHandler 实测命中(9 serviceException+
1 accessDenied)。真实 PG muse_p1r_account_quota_request_test 5/5 绿(0F/0E,
独立复跑两次)。总账 §五B 记批7 证据就绪待人工批,剩余 account 18→15;member .agent 同步。
agent 不自批台账/coverage gate=反假绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 23:07:54 -07:00
lili
4848743ed9 test(p1r): 验收债批6 真实 PG IT(market 生产者申诉写路 3 op,7/7 绿)
P1rMarketProducerAppealCompletedApprovalIT 覆盖 submitAppeal/supplementAppeal/
withdrawAppeal,经真实 /app-api/muse/marketplace/appeals/**(app 侧无 method
security,owner 隔离在服务层):submit 走 review_rejection 关联(自有资产+7 天内被拒
发布申请)写 appeal(pending)+submitted event(含 originalResult/source)+completed
command;supplement 脱敏只存摘要(sk-*/token=*→[REDACTED])+supplementing→reviewing
状态 CAS(rev→2)+材料落库;withdraw →closed(rev→2)+resolution 记录;三写命令回放
幂等;fail-closed(非属主/无关联/超期/资产不存在/越权他人/未确认隐私)全程 0 写;状态
冲突 + expectedStatus 冲突均事务回滚(reserveCommand 预占=0)。

真实 PG muse_p1r_market_producer_appeal_test 7/7 绿(0F/0E,独立复跑两次均绿);
专属 _test 库缺库自动创建,保留 _test/密码 env/凭据 query 守卫,迁移到 V23+ latest。
总账 §五B 记批6 证据就绪待人工批,剩余 market 17→14;market .agent 同步。
agent 不自批台账/coverage gate=反假绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 22:11:17 -07:00
lili
9be03d5078 docs(p1r): record market admin review evidence 2026-06-16 18:31:39 -07:00
lili
2e68b05368 test(p1r): verify market admin publish review 2026-06-16 18:31:32 -07:00
lili
9f6faacf9c docs(progress): 验收债批2/3/4 证据就绪待批 + market/member .agent 同步
总账 §五B 记入批2/3/4(market发布5 + account记录3 + market申诉3,真实 PG 12/12 绿),
剩余口径更新为 content 26 + market 20 + account 18;market/member .agent 补真实 PG
验收证据指针。三批均「证据就绪,completed 待人工批」——agent 不自批台账=反假绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 17:32:23 -07:00
lili
25db3fb4c2 test(p1r): 验收债批2/3/4 真实 PG IT(market发布5 + account记录3 + market申诉3,12/12绿)
承批1(content 11 op),续推三批 needs_verification 真实 PG completed-approval IT:
- 批2 P1rMarketPublishProducerCompletedApprovalIT(3/3):savePublishDraft/runPublishCheck/
  submitPublishRequest/withdrawPublishRequest/listMyPublishRecords;断言 HTTP +
  publish_draft/check/request/review_event/market_command/market_account_projection
  落库 + Account 投影端口调用 + 失败检查不可提交。
- 批3 P1rAccountMarketRecordsCompletedApprovalIT(3/3):appListPurchases/appListLicenses/
  appListPublishRecords;种真实 muse_account_record_projection + member_user,经
  /app-api/muse/account/* 真实读取,断言租户/owner 隔离、状态归一、外部订单脱敏、
  非法输入 fail-closed、读端 no-write。
- 批4 P1rMarketAdminAppealCompletedApprovalIT(6/6):adminListAppeals/adminGetAppeal/
  adminResolveAppeal;经 /admin-api/muse/market/appeals/** + Spring method security,
  断言列表/详情 no-write、租户隔离、RBAC/API version fail-closed、resolve 写状态 +
  resolved event + completed command、幂等回放、expectedStatus 冲突事务回滚。

真实 PG 实跑(muse_p1r_acceptance_verify_test,共享 _test 库,reuseForks=false 顺序 fork):
Tests run 12, Failures 0, Errors 0, Skipped 0,BUILD SUCCESS。
各 IT 保留 _test 库守卫 / 密码仅 env / 拒凭据 query 守卫,缺库自动创建。
证据就绪,completed 仍待人工批(加入 APPROVED_COMPLETED_OPERATIONS 由人工=反假绿)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 17:32:23 -07:00
lili
2499c24272 test(p1r): content work/chapter/block 生命周期 11 op 专属真实 PG IT(验收债批1)
新增 P1rContentWorkLifecycleCompletedApprovalIT(@SpringBootTest + 真实 PG _test 库 + MockMvc 打真实 content app 控制器),链式覆盖 11 个 needs_verification 写 op:createWork/updateWork/deleteWork、createChapter/updateChapter/deleteChapter/reorderChapters、createBlock/deleteBlock/mergeBlocks/splitBlock。每 op 断言 HTTP 200+code:0 + 真实 muse_content_* 持久化事实(revision/内容/逻辑删/合并拆分活块数 delta/来源归因)+ muse_content_command_log 命令行。1/1 绿(mini-infra PG,独立复跑确认)。

产出方式:Codex 起草(读真实控制器/DTO/Mapper)+ Opus fork 落地纠偏(乐观锁 revision 改为运行时实读、merge/split 改为活块数 delta 真实结构效果、auth 对齐基准类、@Import 补 StructureController)+ 父独立复跑 + 逐 assert 反假绿复核(无弱化)。遵守边界:仅新增该测试文件、零产代码改动、未改 coverage 台账/APPROVED 列表(completed 仍待人工批)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 23:42:08 -07:00
lili
4d46d7ac8a test(p1r): KnowledgeFlywayMigrationIT 版本断言动态化——消除 V→V 硬编码复发(Codex+Opus 合并方案)
原硬编码 TARGET_VERSION/TARGET_MIGRATION_COUNT=21,V22/V23(market 索引修复)加入后断言失败(第 2 次复发 V14→V21→V23)。改用本次 Flyway MigrateResult 的 targetSchemaVersion/migrationsExecuted 动态校验(随 sql/muse 增长自适应,无需再维护常量),并加 result.success/migrationsExecuted>0 守护;反假绿:仍校验迁移成功 + schema_history 计数与本次执行数一致 + Knowledge 表/索引/列存在(未改)。

方案来源:Codex(MigrateResult 字段,javap 验证 Flyway 11.7.2,避开 fork 指出的 info().all()/pending() 弃用)+ Opus fork(同样判定动态优于硬编码、count==executed 反假绿)双代理并行提案合并。验证:真实 PG(mini-infra)单测 1/1,target_schema_version=23 动态命中。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 20:53:06 -07:00
lili
043ba0814f test(system): 整改 QiniuSmsClientTest 时区硬编码——断言改用生产同款换算,机器无关 5/5
原断言硬编码 delivrd_at(epoch 1724591666)的 +8 结果 21:14:26,在非 +8 机器(本机 -07:00)必红。改用与生产 QiniuSmsClient 同款 LocalDateTimeUtil.of(epoch*1000)(系统默认时区)换算期望值→任意机器时区下稳定一致,零产代码改动,5/5 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 19:41:00 -07:00
lili
4a5e1e479d test(ai): 整改 MuseAiTaskServiceTest 预存红——11 例 NPE→40/40(补 outbox/审 服务桩)
「审」字段补齐(2026-06-14)后 runtimeProjectionService 新增 eventPublishOutboxService/candidateReviewService 依赖,旧测未补桩→@InjectMocks 注 null→投影路径 11 例 NPE。整改:补两 @Mock + 显式 ReflectionTestUtils 接桩 + candidateReviewService.review lenient 返回通过审(镜像 MuseAiRuntimeProjectionServiceTest)。零产代码改动,40/40 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 19:37:43 -07:00
lili
b3922ebca7 test(knowledge): confirm 重名干净冲突单测回归守护 + publish 勘察定论(fail-closed)
MuseKnowledgeDraftServiceTest 新增 should_failClosedWithDuplicateCodeWhenCanonicalEntityIdentityExists:预检命中既有同身份实体→KNOWLEDGE_ENTITY_DUPLICATE+markConflicted+绝不 insert(守住重名冒泡 500 的回归,task_497da70f),18/0 绿。

§五C:knowledge publish 活体勘察=正确 fail-closed(EXTERNAL_RIGHTS_PRIVACY_VALIDATOR_NOT_CONFIGURED 无条件 block);至此 knowledge 前端可建旅程已尽(confirm+graph),bindings/publish 均受阻于事件驱动投影/外部校验器→后置。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 19:31:05 -07:00
lili
2b42883404 fix(knowledge): 确认入库唯一身份预检——重名实体返回干净冲突而非 500
确认草稿物化为 Canonical 实体时,若 (work+类型+规范名+范围) 命中既有实体,原 entityMapper.insert 触发 uk_muse_knowledge_entity 唯一冲突 → 未捕获的 DuplicateKeyException 冒泡成 HTTP 500(潜伏 bug,task_497da70f)。

修复:writeCanonicalEntity 前置 selectByIdentity 预检(镜像唯一约束列,不滤 deleted/status),命中则 markConflicted(REQUIRES_NEW 独立提交)+ 抛 KNOWLEDGE_ENTITY_DUPLICATE(1043002004)。必须前置预检而非 catch:PG 下唯一约束冲突会使当前事务进入 aborted 态,catch 后任何写(含 markConflicted)都会失败。

活体证(48080 真实 PG,反假绿):colliding 草稿 confirm → code 1043002004(HTTP 200,非 500);DB:草稿转 conflicted、实体数不变(无伪造重复)。正路径回归:knowledge-confirm e2e 绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 08:34:21 -07:00
lili
0bcb825290 docs(market): .agent 同步生产者飞轮端到端收口(推翻"生产侧无 UI"过时 TODO)
CLAUDE.md「changes land 时保持 .agent 当前」:原 TODO「生产侧发布/上架/申诉无 UI、
飞轮在 UI 层断裂」已被本会话推翻——记录飞轮端到端打通(发布→上架可视化→申诉全生命周期
+申诉态回显)、本会话新增的 3 处 app-api 契约,并留痕真实剩余 gap(资产仅 admin markListed
物化、申诉附件上传、下架/召回自助入口、验收债 IT 关台账需人工批准)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 07:18:03 -07:00
lili
90daa3088b feat(market): 我的发布记录回显 appealStatus(生产者飞轮端到端收口)
my-publish-records 经 MuseMarketAppealMapper.selectLatestByAssetIdAndUser +
resolveAppealStatus 回填该物化资产被当前发布者发起的最新申诉态到记录 appealStatus
(无物化资产/无申诉则 null;marketAssetId 与 appealStatus 两路共用各只查一次)。
前端 MarketPublish 发布记录副文本以中文徽标渲染「申诉:<待处理/审核中/已关闭…>」。

活体证(反假绿,MSW off 直连重建后单体 48080):
- market-publish.spec.ts 第 8 例 chromium 绿(recId=5/marketAssetId=2 回显 appealStatus=closed→「申诉:已关闭」)。
- 后端 MarketPublishServiceTest 14/14 回归通过(appealMapper 注入无 NPE);前端 tsc 干净 + vitest 47/47 + market-publish 8/8。

至此市场生产者飞轮端到端完整:发布(草稿→检查→提交)→上架状态可视化→
申诉(提交/补充材料/撤回)全生命周期 + 申诉态回显。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 07:08:09 -07:00
lili
ce6bbd8625 feat(market): 申诉补充材料/撤回 UI——补 app-api 我的申诉列表端点
同类 gap:生产者本无「自己申诉」的 app-api 列表端点(只有 admin 列表),
故 supplement/withdraw 无从取 appealId+状态。

后端(muse-module-market):新增 GET /marketplace/appeals(appListMyAppeals +
MuseMarketAppealMapper.selectListByUser + MarketMyAppealItemRespVO),
返回当前发布者全部申诉,并派生 canSupplement(supplementing 态)/canWithdraw(非终态)。

前端(muse-studio):MarketPublish「我的申诉」区列申诉 + 中文状态徽标;
- canWithdraw 放开「撤回」→ useWithdrawAppeal → POST .../withdraw(expectedStatus 乐观锁)→ closed;
- canSupplement 放开「补充材料」→ useSupplementAppeal → POST .../supplements(privacyConfirmed)→ reviewing。

活体证(反假绿,MSW off 直连重建后单体 48080):
- market-publish.spec.ts 第 6/7 例 chromium 绿(撤回→已撤回、补充→材料已补充)。
- DB 证:withdraw→muse_market_appeal status=closed;supplement→muse_market_appeal_material 追加行(e2e 点击产 material#2)。
- 后端 MarketAppealServiceTest 15/15 + AppMuseMarketAppealControllerTest 6/6 回归通过;前端 tsc 干净 + vitest 47/47 + market-publish 7/7。
- 种子 /tmp/SetAppealSup.java(置 supplementing;提交后→reviewing 故每轮重置)。

仍 ⬜:发布记录上 appealStatus 回显(my-publish-records 未 join 申诉表)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 06:53:55 -07:00
lili
a00c7581c9 feat(market): 申诉(appeal)写路 UI 打通——后端暴露物化 assetId 解 gap
根因:my-publish-records 的 assetId 是 publish-record id(草稿/申请占位),
非 submitAppeal.requireAsset 所需的物化 muse_market_asset.id(资产仅在 admin
审核通过 markListed 时物化),生产者侧 UI 取不到正确 assetId。

后端最小契约改动(muse-module-market):
- PublishRecordItem / MarketPublishRecordItemRespVO 加 marketAssetId 字段;
- MarketPublishServiceImpl.resolveMarketAssetId:request.asset_id 命中真实
  muse_market_asset 且归属当前发布者才返回其 id,否则 null(fail-closed,不放开入口)。

前端(muse-studio):
- useSubmitAppeal hook(POST /marketplace/appeals,新 commandId 幂等);
- MarketPublish「我的发布记录」:仅 marketAssetId 非空 + 状态可申诉
  (rejected/compliance_blocked→review_rejection、delisted→delist、recalled→recall)
  的记录放开「发起申诉」→ 面板填理由 → 提交 → 申诉已提交(pending)。

活体证(反假绿,MSW off 直连重建后单体 48080):
- market-publish.spec.ts 第 5 例 chromium 绿(点发起申诉→填→提交→pending)。
- DB 证:muse_market_appeal 追加行 status=pending、commandId 为前端 UUID(e2e 点击产 appealId=3)。
- curl 正负路:自有已驳回→appealId/pending;他人资产→1044000024 无权访问;不存在→1044000003 资产不存在。
- 后端 MarketPublishServiceTest 14/14 回归通过;前端 tsc 干净 + vitest 47/47 + market-publish 5/5。
- 种子 /tmp/SeedAppeal.java(asset(pub=1)+rejected request,asset_id=物化资产)。

仍 ⬜:补充材料(supplements)/撤回(withdraw)申诉 UI、记录上 appealStatus 回显。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 06:33:44 -07:00
lili
2f64397719 fix(market): 系统性修 market 残余 (tenant_id,command_id) partial-index ON CONFLICT bug + 真实 PG IT
续 V22。handoff_event/appeal_material/authorization_summary/appeal_event/appeal 5 表的 (tenant_id,command_id)
在 V15 被建为部分唯一索引(WHERE command_id IS NOT NULL),而对应 mapper insertIgnore 发无谓词
ON CONFLICT (tenant_id,command_id)→PostgreSQL 无法用部分索引作仲裁器→这些链路(handoff/申诉/授权摘要)
活体时 500(潜伏,流程尚无活体触达)。grep 实证仅这 5 表 mapper 确发无谓词 ON CONFLICT;其余 market 部分
command 索引未被当 arbiter,不动。

- V23__fix_market_remaining_command_unique_index.sql:5 表 部分→完整唯一索引(对齐 command/purchase 约定)。
- P1rMarketCommandIndexFlywayMigrationIT(真实 PG):clean→迁移 V1→V23→断言 V22/V23 修复的 9 个命令索引
  均为完整唯一索引(可作 ON CONFLICT 仲裁器),Tests run 1/0F。与 target=V15 的 P1rMarketFlywayMigrationIT 互补。
- V23 已应用 muse_slice_live;全新 muse_p1r_cmdidx_test 库迁移验证。

进度总账 §五C/§四 就地更新。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 03:30:11 -07:00
lili
288fce955f feat(studio+market): 市场发布提交审核全链(草稿→检查→提交)活体绿 + V22 补 review_event 索引
承上一提交(草稿切片),完成创作者发布全链到「提交审核」:
- MarketPublish 加 licenseType / 权利声明字段 + 「提交审核」按钮(save→运行检查→检查通过则提交申请);
  useMarketPublish 加 useRunPublishCheck / useSubmitPublishRequest。
- market-publish.spec.ts 3/3 绿(草稿正 / 缺标题负 / 提交全链),DB 证 muse_market_publish_request=submitted
  + muse_market_review_event=submitted 落库;全链测用唯一名→可重复跑。
  整套 e2e 11/11、vitest 47/47 无回归、tsc 绿。

修复:submitPublishRequest 的 writeSubmittedReviewEvent 命中 muse_market_review_event 同款部分索引
ON CONFLICT 不匹配 bug(submit 500);V22 迁移 + muse_slice_live 增补 review_event 索引(部分→完整,共 4 表)。
遗留:handoff/appeal/authorization_summary 等 market 表同类部分索引待对应流程活体时收口。

进度总账 §五C 已就地更新(市场生产侧:发布草稿 + 提交审核全链 ✅)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 02:10:12 -07:00
lili
0b6b1e8887 feat(studio+market): 市场生产侧发布草稿活体纵切 + 修 publish 部分索引 ON CONFLICT 潜伏 bug
studio 生产侧首切片(创作者飞轮起点):新增 /market/publish 发布表单(MarketPublish + useMarketPublish hook),
保存发布草稿经唯一合法入口 POST /marketplace/publish-drafts → my-publish-records 真实回读;
MarketBrowse 加「我要发布资产」入口。market-publish.spec.ts(chromium, MSW off, 真连 48080)正+负绿,
DB 证 muse_market_publish_draft 落库(status=draft);命令幂等键按材料 hash 派生→自包含可重复跑、无需预种。

附带修真实潜伏后端 bug(链路从未活体跑过):publish draft/check/request 的 (tenant_id,command_id)
被 V15 建为部分唯一索引(WHERE command_id IS NOT NULL),而各 mapper insertIgnore 发无谓词
ON CONFLICT (tenant_id,command_id)→PostgreSQL 无法用部分索引作仲裁器→savePublishDraft 500
(BadSqlGrammarException: no unique or exclusion constraint matching the ON CONFLICT specification)。
修=部分→完整唯一索引,对齐 muse_market_command/purchase 既有约定(V22 迁移 + muse_slice_live 已应用,
零 Java 改动/零重启)。遗留:handoff/appeal 等 market 表同类部分索引待对应流程活体时收口。

验证:整套 e2e 10/10 绿、vitest 47/47 无回归、tsc 绿。进度总账 §五C/§四/per-BC 已就地更新。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 02:01:18 -07:00
lili
749c5b2471 feat(knowledge): 知识库工作台前端先审后入(确认草稿→Canonical)rendered-UI 活体证
后端:SummaryRespVO 暴露 confirm 所需并发/源令牌(sourceSnapshotId/authorizationSnapshotId/revision),
否则前端无法构造合法 confirm 请求(非破坏性新增,不改 confirm 语义);转换器填充。
前端:useKnowledgeDrafts/useConfirmKnowledgeDraft hooks(回显令牌)+ KnowledgeDraftPanel(待确认草稿+确认入库)
+ KnowledgePage(/knowledge/:workId)接入。e2e knowledge-confirm:chromium MSW-off 点确认入库→真 confirm
→ draft confirmed+entityId(DB 证 draft5 confirmed/entity_id=3)。tsc 0。
遗留:confirm 对已存在同名 Canonical 实体抛未处理 DuplicateKeyException(500),应改干净 conflict(另 flag)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 00:41:58 -07:00
lili
6897fc2ac4 fix(base-schema): 补 member_user.register_terminal + infra_api_error_log_seq(解 account 读 500)
account/profile 等读 member_user 引用 register_terminal,原基座翻译遗漏→500;补列后转干净业务码。
infra_api_error_log 走 @KeySequence 但原用 IDENTITY 无序列→错误日志写入再抛。两处补入基座文件。
活体证(48080):account BC 个人中心读旅程全通,且 market 购买/安装经投影流入 account purchases/licenses
=market→account 跨 BC 端到端。§五:account BC ✅(已 4 个 BC 活体证)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 23:35:32 -07:00
lili
517e2b8197 fix(p1r): 修复陈旧红测试 P1rKnowledgeFlywayMigrationIT(V14→V21)+ 建 master plan 收口 backlog
唯一红测试硬编码 TARGET_VERSION=14/count=14,而 schema 已演进 V21(V15-V21 各域 outbox 迁移)。
Flyway 全量执行 sql/muse 所有迁移,断言应随 schema 增长;V14 知识表/索引检查保留。
真实 PG 验证绿(muse_knowledge_flyway_test,exit 0,migration_count=21/version=21)。
进度总账新增 §五:P1R-7 收口活 backlog(校正 facade 缺口清单,B2 勘察多处误判已纠)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 23:03:17 -07:00
lili
d09d529d11 fix(p1-monolith): facade 条件装配可靠化 + 跨模块 bean 名冲突修复(单体启动收口·进行中)
让 muse-server 单进程单体可启动(从未装配过的单体逐层暴露问题,本提交修 facade 装配 + 名冲突两类):
- muse-server 新增 MonolithFacadeFallbackAutoConfiguration(@AutoConfiguration 末位 + @Bean
  @ConditionalOnMissingBean):为 6 个全 default 的 content facade(File/KnowledgeDraft/Meta/ParseJob/
  PlanningCandidate/StyleCheck)提供可靠 fail-closed 兜底(真实 impl 仍优先,非 stub)。
- 4 个真实 impl facade 去掉 @Component 上不可靠的 @ConditionalOnBean(单体内依赖恒在,@Primary 总注册):
  AiSuggestionMergeProjectionFacade(ContentAiSuggestionFacade,slice 关键)、ContentMuseWorkOwnerFacade、
  ProjectionSecurityRuntimePermissionFacade、ContentKnowledgeWorkOwnerFacade。
- 4 个 source-owner + SecurityToolGrant + MetaImpact 的 Unavailable 去掉 @Component/@Service 上不可靠的
  @ConditionalOnMissingBean(全仓单实现,直接总注册;fail-closed 不变)。
- 跨模块 bean 名冲突:AccountExportServiceImpl 的 @Resource 字段 exportTaskMapper(类型 AccountExportTaskMapper)
  按名撞 content 的 ExportTaskMapper bean → 改名 accountExportTaskMapper。

背景:Spring 对 @Component/@Service 上的 @ConditionalOnBean/@ConditionalOnMissingBean 不保证可靠(官方仅
@Bean 方法),"从未以单体装配过"的本仓在单进程下顺序混乱致漏注册。build 验证编译通过;启动仍在逐层推进中。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 17:37:52 -07:00
lili
eea10b736f fix(build): system/infra/ai-server repackage 配 classifier=exec(单体可加载)
延续 member-server 同款修复(1f89007):被 muse-server 装配的 yudao 系 -server 模块若 repackage 无
classifier,主 jar 是 fat jar,嵌入 muse-server fat jar 的 BOOT-INF/lib 后其类不可加载,运行期模块 bean
全失踪(实测:boot 报 PermissionCommonApi/PermissionApiImpl 无法装配)。给 system/infra/ai-server 的
repackage 配 classifier=exec → 主 jar 为可嵌套加载的瘦库。

验证:clean package BUILD SUCCESS,主 jar 由 ~180MB fat 变 0.5-1.3MB 瘦库;muse-server 启动已越过
datasource(清 SOCKS 代理 system property 后 PG 连通)+ Flyway V1-V21 + security/permission 装配,
推进到 facade 条件装配阶段。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 16:53:45 -07:00
lili
038d2cf387 chore(p1-fullstack): 补 postgres 基座 schema(dev)+ 记录全栈启动 2 墙拆除与第 3 墙诊断
为活体 e2e 起全栈 muse-server,实测拆两墙、定位第三墙:
- 墙1(已修, commit 1f89007):member-server repackage classifier → mvn package 全项目 BUILD SUCCESS。
- 墙2(已解):本仓原无 postgres 基座 dump。新增 muse-cloud/sql/dev/yudao-base-schema-postgres.sql
  (system/infra/member 测试 schema 忠实翻 PostgreSQL,49 表)+ yudao-base-seed-postgres.sql
  (system_tenant id=1 等最小启动种子);实测灌库 0 失败,app Flyway(baseline-on-migrate)成功补
  Muse V1-V21、Tomcat 起、Spring 初始化。
- 墙3(定位,开 chip):muse-server 卡 bean 装配——5 个 biz.system CommonApi 是 @FeignClient
  (yudao-cloud RPC),单进程单体下未注册本地 bean。即项目从未以单体真正启动过(基线"未实跑"根因),
  需阶段7「cloud→monolith RPC 桥接」(真实接 system 本地 impl,非 permissive stub=假绿)。

knowledge §六 记全栈启动配方 + 三墙状态;进度总账加时间线。MVP #1 纵切仍以 4 个真实 PG IT 为正确性证据。
未推送(等用户)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 11:18:35 -07:00
lili
1f89007d41 fix(build): member-server repackage 配 classifier=exec,修复全项目 mvn package 失败
根因:member-server 用 spring-boot repackage 无 classifier,主 artifact 变 fat jar(class 进
BOOT-INF/classes),clean package 阶段 member 先 repackage 后 market-server 编译,致
MarketAccountProjectionProvider 引 member-server 内部接口报 "package does not exist"。
仅 test 阶段不触发(member 未到 package),故此前 CI test/-am test 全绿、是 d38260f 未做
clean-package 验证的假绿。

修法:给 member-server 的 repackage 配 <classifier>exec</classifier>——主 jar 保持可被下游
编译消费的瘦库,fat 可执行 jar 挪到 muse-module-member-server-exec.jar(微服务单独运行仍可用)。
验证:mvn -pl muse-server -am -Dmaven.test.skip=true clean package → BUILD SUCCESS,
产出 muse-server.jar + member 主 jar 810KB 瘦库 + -exec fat jar。

遗留:market-server→member-server 的 pom 依赖(BC 越界)仍在,属更深的 BC 收口(见 chip),本次只
解 package 破损。建议 CI 增加 package 阶段以防此类 repackage 依赖破损再被 test 阶段漏过。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 11:03:47 -07:00
lili
e8f616d5a5 feat(p1-ai): AI 生成候选补齐「审」字段+active+授权快照,打通生成→采纳
消除「经真实 AI 生成流产出的候选永远无法被采纳入正文」缺口(chip task_092cfc32):

- 新增 MuseAiCandidateReviewService:对生成正文做真实(轻量)审——输出合规扫描(空/凭据痕迹)
  + 静态检查(空白/超长)+ 许可限制快照透传;三项全过才给可追溯审结果 ID(绑定 generation+内容指纹),
  任一不过则不给 → 调用方不写审字段 → Content 合并门禁如实拒绝(反假绿)。
- MuseAiRuntimeProjectionService.createRuntimeSuggestion:
  · 顶层 content 写入候选 contentSnapshot(脱敏 summary,供 mergeBlockSuggestion facade 可用性检查;
    完整 provider 原文按数据主权不持久化,采纳走 merge_after_edit 由用户回传所审正文)
  · diff_summary 写齐三「审」字段(审查通过时)
  · source_status 'verified'→'active'(原值既非来源状态机取值,又会被合并门禁拒绝)
  · 数值授权快照:envelope id 为数值时落 authorization_snapshot_id(沿用 MuseSuggestionServiceImpl 的
    envelope=authz 既有约定);非数值受 BIGINT 列限制,待授权快照建模收口(遗留)

验证(真实 PG,16/16 绿):
- MuseAiCandidateReviewServiceTest 5/0(真实审逻辑:通过/空/凭据泄露/许可透传/空值)
- MuseAiRuntimeProjectionServiceTest 5/0(回归:补 @Mock+stub 防 NPE)
- P1rContentMergeGeneratedSuggestionIT 1/0(机械门禁:真实 createShadowSuggestionCandidate 产候选
  → active/审/authz/content 由真实代码产出 → mergeBlockSuggestion 写入 Canonical)
- P1rContentMergeSuggestionIT 5/0(回归,未受影响)

至此 MVP #1「生成→采纳」活体闭环仅剩 1 个范围外阻塞:远端 dev 库缺 yudao 基座 schema(全栈 app 启动)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 09:58:49 -07:00