oh-my-muse/muse-cloud/sql/muse/V28__create_content_asset_use_precheck.sql
lili d113f4ee15 feat(handoff): P3 content asset_use 两段式后端(token 红线 + 单表事实)
content asset_use 从零建(SSOT 后端-04 定义表名/索引、建表 SQL 此前未写、feature disabled):
- V28 建表 muse_content_work_asset_use_precheck(单表,照 knowledge bind_precheck)
- 两段式:asset-use-prechecks(market 来源 verify(content/asset_use)+consume token、明文仅此阶段)
  → asset-uses(凭 precheckId + work 级乐观锁,单表转 consumed 即使用事实,AI archive 引用 precheckId)
- purposes 白名单 reference/ai_context/generate_reference(禁 template 模板化=forbiddenPurpose)
- content-server 依赖 market-api(经端口,不碰 market.dal)+ 错误码 1_041_002_xxx

验证:编译 OK、MuseContentAssetUseServiceTest 8/0(正路 verify+consume/伪造拒/缺 token 拒/禁用 purpose 拒/
越权拒/create 闭环/work revision 冲突/precheck 过期)、BcBoundaryArchTest 0 违例(content→market-api)。
asset_use 只记录使用授权事实、不写正文/参考来源(产品-02F L456),不涉及资产物化。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 22:51:59 -07:00

46 lines
2.5 KiB
SQL

-- V28:content asset_use 跨空间 handoff 兑现(P3)——作品使用市场资产作参考/AI 上下文的预检凭证(单表两段式)。
-- SSOT 后端-04 L135 定义 muse_content_work_asset_use_precheck(此前 feature disabled、建表 SQL 未写、L1081 仅索引约定);
-- 评审版 Q1=单表:precheck 表即事实载体(active→consumed = 作品可用此市场资产作参考/AI 上下文凭证),
-- AI 接受候选时引用 precheck_id(后端-04 L849 muse_ai_candidate_decision_archive.work_asset_use_precheck_id)。
-- 形态照 muse_knowledge_bind_precheck(V14):kb_id→source_asset_id + source_asset_type;全列向后兼容(全新表)。
CREATE TABLE muse_content_work_asset_use_precheck (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
precheck_id VARCHAR(128) NOT NULL,
command_id VARCHAR(128) NOT NULL,
request_hash CHAR(64) NOT NULL,
work_id BIGINT NOT NULL,
source_asset_id BIGINT NOT NULL,
source_asset_type VARCHAR(32) NOT NULL DEFAULT 'market_asset',
owner_user_id BIGINT NOT NULL,
actor_user_id BIGINT NOT NULL,
expected_work_revision INT,
source_snapshot_id VARCHAR(128) NOT NULL,
authorization_snapshot_id VARCHAR(128) NOT NULL,
handoff_hash CHAR(64),
status VARCHAR(32) NOT NULL DEFAULT 'active',
expires_at TIMESTAMP NOT NULL,
consumed_at TIMESTAMP,
result_summary JSONB NOT NULL DEFAULT '{}'::jsonb,
error_code VARCHAR(64),
error_message TEXT,
creator VARCHAR(64) NOT NULL DEFAULT '',
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updater VARCHAR(64) NOT NULL DEFAULT '',
update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted BOOLEAN NOT NULL DEFAULT FALSE,
tenant_id BIGINT NOT NULL DEFAULT 0,
CONSTRAINT uk_muse_content_asset_use_precheck_id UNIQUE (tenant_id, precheck_id),
CONSTRAINT uk_muse_content_asset_use_precheck_command UNIQUE (tenant_id, command_id)
);
CREATE INDEX idx_muse_content_asset_use_precheck_owner_status
ON muse_content_work_asset_use_precheck(tenant_id, owner_user_id, status, create_time);
CREATE INDEX idx_muse_content_asset_use_precheck_work_asset
ON muse_content_work_asset_use_precheck(tenant_id, work_id, source_asset_id, status);
CREATE INDEX idx_muse_content_asset_use_precheck_active
ON muse_content_work_asset_use_precheck(tenant_id, precheck_id, expires_at)
WHERE consumed_at IS NULL AND deleted = FALSE;
CREATE TRIGGER trg_muse_content_asset_use_precheck_updated_at
BEFORE UPDATE ON muse_content_work_asset_use_precheck
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();