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
|
cb57b88866
|
docs(sse): 前端/后端 SSE 契约反向对齐 sse.ts 真实实现
studio src/lib/sse.ts 已是真实实现(connectAIStream/connectEventStream 双函数 +
fetch/ReadableStream + 按 event: 行分发),但三处正式文档仍停留在虚构契约,故反向对齐(反假绿):
- 前端-01 v6→v7:AI 流改两步(POST /ai/tasks 创建→GET /ai/tasks/{taskId}/stream 建流);
事件流路径 /events/stream→/events;明确按 SSE event: 行分发。
- 后端-05 v8→v9:补 GET /ai/tasks/{taskId}/stream 端点 + SSE 事件契约表
(chunk/quality_check/done/error 及各 payload);记 done 的 taskId/suggestionId
后端 Long 序列化为 JSON 数字、与候选 uuid 字符串契约不一致(待后端统一,前端已在解析边界 String 归一)。
- dev-baseline/muse-studio/CLAUDE.md:SSE 章节由虚构 useAIStream/useEventStream hook
改写为真实双函数 + 线格式 + 约束(AI 流不重连、事件流指数退避 1/2/5/10s、AbortController 关闭、无凭证 fail-closed)。
- sse.ts:onDone 注释补 WHY string(Long→JSON number→String 归一)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-16 02:55:24 -07:00 |
|
lili
|
9634842f2f
|
docs(progress): 验收债真实 IT 战役开张 + 批1(content 11 op)证据就绪待批
§五B:校正实际 needs_verification=content37/market28/account21=86;批1 P1rContentWorkLifecycleCompletedApprovalIT(11 content CRUD op,1/1 绿)证据就绪,completed 待人工批(加 APPROVED_COMPLETED_OPERATIONS);剩余 content26(含~15 fail-closed)+market28+account21 按批续推。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-15 23:43:10 -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
|
888217deee
|
docs(p1r): 真实 PG IT 基线 23/23 全绿 + 完整跑法配方(reuseForks=false 等)落档
§四:23/23 P1r*IT 在 mini-infra PG 全量重跑全绿(99 用例 0F/0E,2 例 external-acceptance 跳过);补批量跑要点⑥(-DreuseForks=false 避 Market IT 属性脱敏污染复用 fork)⑦(argLine 传 p1r.flyway.*);旧硬编码版本断言需动态化TODO 已闭(MigrateResult 动态)。§五B:基线落档,指向 §四 完整配方。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-15 20:57:14 -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
|
338b33a406
|
docs(progress): MuseAiEventPublishOutboxMapperTest 真实 PG 实跑 5/5——ai/平台预存红三项全清
该测本就是真 PG focused test(自读 infra.env、隔离 schema 自建自清),原红仅缺真 PG 环境;mini-infra PG(100.64.0.8:5433)+ source infra.env + argLine SOCKS 清下实跑 5/5,零代码改动。连同 MuseAiTaskServiceTest(40/40)、QiniuSmsClientTest(5/5),§五B/§一 三项预存红全部消除。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-15 20:25:45 -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
|
3e3e656424
|
docs(progress): e2e 可入库种子已落地(globalSetup)——20/20 一键可复现
更新 §五C:一次性 /tmp 种子教训已闭环为 e2e/global-setup.ts + playwright globalSetup/workers:1,source infra.env 后 pnpm test:e2e 即 20/20 零手工种子。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-15 18:36:25 -07:00 |
|
lili
|
6fd483ea1d
|
test(studio): e2e globalSetup 直连真实 PG 自动复位每轮 fixture(可入库,替代一次性 /tmp 种子)
新增 e2e/global-setup.ts:用 pg 直连真实 PG(凭据从 infra.env 环境变量读,不入库)幂等复位 graph/confirm-draft/accept(block3→rev1)/security-ack(事件→未确认+清 ack)/appeal(→supplementing)等每轮被消费的 fixture;playwright.config 接 globalSetup + workers:1(共享活体 DB 串行避竞态)。
证:消费态下 source infra.env 后 pnpm 直跑整套→globalSetup 复位→20/20 单次全绿,零手工种子(反假绿可复现)。E2E_SKIP_SEED=1 可跳过;缺 MUSE_POSTGRES_* 报清晰错。tsc -b 干净。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-15 18:35:51 -07:00 |
|
lili
|
fa64280819
|
docs(progress): e2e 全套 20/20 单次全绿(reseed 后,真实后端 MSW-off)
加 knowledge-graph 后共 20 例;reseed 三个每轮种子依赖旅程(accept happy/security-ack/market 申诉补充)后 --workers=1 串行整套 20 passed。记教训:一次性 /tmp 种子脚本每会话丢失需反推,宜落地可入库 e2e 种子/globalSetup。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-15 17:03:09 -07:00 |
|
lili
|
cefdadca6f
|
docs(progress): bindings 活体勘察结论——写路真实绿但读回投影 gap,不建一侧 UI
§五C:precheck→bind 写路 curl 证真实+绿(user_kb→bindingId 写 muse_knowledge_binding);但 local-knowledge.sourceBindings 读事件驱动投影、bind 不同步填充→无诚实读回。判定:bindings 属事件驱动副路径待投影接线,不建一侧写 UI(反一侧设计)。下一前端候选转 publish。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-15 08:45:58 -07:00 |
|
lili
|
63fd977df7
|
docs(progress): 总账同步——知识图谱视图 + confirm 重名 500 修复(知识库工作台收口推进)
§五C 知识库工作台:graph UI ✅(仍剩 bindings/publish);confirm 重名实体 500→干净冲突 1043002004 已修;per-BC tracker(knowledge)+ §四时间线同步。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-15 08:36:23 -07:00 |
|
lili
|
3ed40a3187
|
feat(studio): 知识图谱视图(先审后入"正式轨"成果)rendered-UI 活体证
知识库工作台(/knowledge/:workId)新增「知识图谱」面板:经 GET /works/{id}/graph 读真实 muse_knowledge_entity/relation,渲染已确认入库的 Canonical 实体(节点)与关系(边)——与「待确认草稿面板」构成双轨主权闭环(候选 Shadow → 人工确认 → 正式图谱可见)。新增 useKnowledgeGraph hook;confirm 成功后失活图谱缓存联动刷新。
活体证(MSW off,chromium 直连 48080):knowledge-graph.spec.ts 绿(GET graph code:0、节点 huotituopusuqing/huotituopuqingzhou + huoti_related 边渲染);curl 实证后端真返节点/边。tsc -b 干净、vitest 47/47 无回归。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-15 08:34:36 -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
|
0ec0955779
|
feat(studio): 市场发布上架状态可视化(生产者飞轮进度反馈)
「我的发布记录」新增发布生命周期中文徽标(草稿/已提交/审核中/已通过/
已上架/已驳回/需补充材料/已撤回/已下架/已召回)+ nextAction/appealStatus
副文本。上架=审核通过自动 markListed(非生产者动作),生产者侧通过本徽标
看到 publish→review→list 进度反馈。
活体证(反假绿,MSW off 直连单体 48080):
- market-publish.spec.ts 第 4 例 chromium 绿:断言 listed→「已上架」、
rejected→「已驳回」徽标渲染(种子 /tmp/SetReqStatus.java 置 req#2→listed、#3→rejected;
curl my-publish-records 证状态反映)。
- market-publish 4/4 + vitest 47/47 + tsc 干净。
申诉(appeal)后端经 curl 验证为 real+fail-closed(自有已驳回资产→appealId/pending;
他人资产→1044000024 无权访问;不存在资产→1044000003 资产不存在),但申诉 UI 后置:
真实 gap——my-publish-records 暴露的 assetId 是 publish-record id,非 submitAppeal
所需的物化 muse_market_asset.id(资产仅在 admin 审核通过 markListed 时物化),
UI 入口取不到正确 assetId,收口需后端额外暴露物化 assetId 或经真实审核通过物化流。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-15 05:36:36 -07:00 |
|
lili
|
0cf1ef3462
|
feat(studio): 安全事件「确认」写路(account 深页活体切片)
个人中心「安全事件」区:未确认事件展示「确认」按钮,点击经
useAcknowledgeSecurityEvent(每次发新 commandId,后端按 commandId 幂等)
真打 POST /account/security-events/{id}/acknowledge(action=acknowledged)→
列表失活重取翻「已确认」、按钮消失(构成 acked→无动作 UI 不变量)。
活体证(反假绿,MSW off 直连单体 48080):
- 正路:account-security-ack.spec.ts chromium 绿(点确认→翻已确认);
curl acknowledge 真实事件→code:0 + 列表 acknowledged 翻 true。
- 负路:acknowledge 不存在 eventId→404、非法 action→400,均 fail-closed。
- DB 双证:muse_member_security_event.acknowledged 翻 true +
muse_account_security_event_ack 追加 1 行(action=acknowledged、
commandId 为前端 UUID=权威处理历史,非覆盖)。
- 种子可重置(/tmp/SeedSec.java:事件B写锚点每轮重置未确认,写路 e2e 可重复)。
- 本轮实跑:account-security-ack 1/1 + live-read 6/6 + vitest 47/47 + tsc 干净。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-15 05:20:50 -07:00 |
|
lili
|
b58a704ffa
|
feat(studio): 个人中心渲染真实安全事件(account 深页活体切片)
PersonalCenter 新增「安全事件」区,渲染 GET /account/security-events 真实摘要
(useAccountSecurityEvents→AccountPageResult<SecurityEventSummaryRespVO>),
eventType/severity 徽标 + 已确认/待确认状态。
活体证(反假绿,MSW off 直连单体 48080):
- 正路:live-read.spec.ts 第 6 例 chromium 绿,断言种子事件「活体安全事件·异地登录提醒」渲染;
curl 列表 total=1 含该事件。
- 负路:acknowledge 不存在 eventId→404「安全事件不存在」、非法 action→400 参数校验,
均 fail-closed 非许可桩。
- 种子幂等(/tmp/SeedSec.java,account_user_id=1/tenant=1,DB id=1)。
- 本轮实跑:live-read 6/6 + vitest 47/47 + tsc 干净。
security-events 后端端点本就可用(无 facade gate),本切片接通 UI 消费侧。
exports/downloads/new-api 深页仍为正确 fail-closed 外部依赖,非接线缺口。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-15 04:30:43 -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
|
c7c65a97f2
|
feat(studio): 个人中心渲染真实购买/授权记录(account 深页活体切片)
承 account facade 活体订正(单体内 /account/{purchases,licenses,publish-records} 经 market 跨模块
MarketAccountProjectionProvider 本就可用),把已确认可用的后端接进 UI:
- PersonalCenter 新增「我的购买 / 我的授权」两区,渲染 market→account 投影真实记录;
- useAccount 加 useAccountPurchases / useAccountLicenses(GET /account/{purchases,licenses})。
- live-read.spec.ts 加第 5 例(chromium, MSW off, 真连 48080):/account 渲染真实资产「活体市场资产·测试」。
验证:整套 e2e 12/12、vitest 47/47、tsc 绿。进度总账 §五C 个人中心就地更新。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-15 03:11:20 -07:00 |
|
lili
|
4433c96d7d
|
docs(mvp): account facade 活体订正——单体内三端本就由 market Provider 跨模块提供(反假绿,无净代码改动)
user 据 §五A"account 21 端 UNAVAILABLE"选"account 后端 facade 真实化"。Explore 静态分析判
MarketAccountProjectionFacade 阻塞 purchases/licenses/publish-records;实测推翻——单体内 market
MarketAccountProjectionProvider(@Service)本身 implements MarketAccountProjectionFacade 并对
purchase/license/publish 放行,@ConditionalOnMissingBean 使其压过 member 的 Unavailable 兜底,
故这三端在单体本就可用。curl 真返投影:purchase(completed)/license(installed)/publish-records
(含 market-publish e2e 提交的 5 条 = market→account 端到端)。
曾据 Explore 加 member-local RealMarketAccountProjectionFacade + 改 autoconfig、rebuild+restart 验证;
可逆翻转测试(全局 purchase=0 仍返回空而非 UNAVAILABLE)证实活跃 facade 是 Provider 而非我的 count-gating
facade → 单体 no-op 且违背原设计意图,已回退(member 模块工作树干净)。顺带:restart 时 Flyway 真实应用
V22(market 索引修复)。单体真正 fail-closed 的 account 端=export/download + new-api recheck,均正确
fail-closed(未配置外部服务)。教训:跨 BC facade 判定须以单体实跑为准,静态分析会漏 monolith 跨模块 bean 绑定。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-15 03:06:36 -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 |
|