feat(db): add workflow schema v2 and catalog governance migrations

Introduce catalog governance tables and extend workflow schema v2 so only the three official workflows are selectable at runtime.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
weichen
2026-09-13 02:50:23 +00:00
committed by weichen
co-authored by Cursor
parent 90f77eac93
commit 543ca310da
2 changed files with 98 additions and 2 deletions
@@ -1,10 +1,10 @@
-- +goose Up
-- Schema v2: executor registry metadata on workflow_versions (JSONB 已存 definition)
-- Schema v2: executor registry metadata on workflow_versions (JSONB 已存 definition_json)
ALTER TABLE workflow_versions
ADD COLUMN IF NOT EXISTS schema_version INT NOT NULL DEFAULT 1;
UPDATE workflow_versions SET schema_version = COALESCE((definition->>'schema_version')::int, 1)
UPDATE workflow_versions SET schema_version = COALESCE((definition_json->>'schema_version')::int, 1)
WHERE schema_version = 1;
CREATE TABLE IF NOT EXISTS workflow_executor_registry (
@@ -0,0 +1,96 @@
-- +goose Up
-- 三工作流目录治理 + 上下文快照 + 实例终止元数据
ALTER TABLE workflow_definitions
ADD COLUMN IF NOT EXISTS project_selectable BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE workflow_definitions
ADD COLUMN IF NOT EXISTS catalog_order INT NOT NULL DEFAULT 0;
UPDATE workflow_definitions
SET project_selectable = true,
catalog_order = CASE def_key
WHEN 'main' THEN 10
WHEN 'product_manager' THEN 20
WHEN 'test_manager' THEN 30
ELSE catalog_order
END,
name = CASE def_key
WHEN 'main' THEN '商务对接流程'
WHEN 'product_manager' THEN '智能产品经理流程'
WHEN 'test_manager' THEN '智能测试工程师流程'
ELSE name
END
WHERE def_key IN ('main', 'product_manager', 'test_manager');
UPDATE workflow_definitions
SET project_selectable = false,
status = CASE WHEN def_key IN ('main', 'product_manager', 'test_manager') THEN status ELSE 'retired' END
WHERE def_key NOT IN ('main', 'product_manager', 'test_manager');
INSERT INTO workflow_executor_registry (executor_key, description) VALUES
('bizdev.feasibility_dev.v1', '设计开发可行性评估'),
('bizdev.user_requirements.v1', '用户需求表编制')
ON CONFLICT (executor_key) DO NOTHING;
ALTER TABLE project_workflow_instances
ADD COLUMN IF NOT EXISTS completed_at TIMESTAMPTZ,
ADD COLUMN IF NOT EXISTS completed_by BIGINT REFERENCES users(id) ON DELETE SET NULL,
ADD COLUMN IF NOT EXISTS terminated_at TIMESTAMPTZ,
ADD COLUMN IF NOT EXISTS terminated_by BIGINT REFERENCES users(id) ON DELETE SET NULL,
ADD COLUMN IF NOT EXISTS termination_reason TEXT NOT NULL DEFAULT '',
ADD COLUMN IF NOT EXISTS previous_instance_id BIGINT REFERENCES project_workflow_instances(id) ON DELETE SET NULL;
CREATE TABLE IF NOT EXISTS project_context_snapshots (
id BIGSERIAL PRIMARY KEY,
project_id BIGINT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
task_key TEXT NOT NULL DEFAULT '',
cutoff_at TIMESTAMPTZ NOT NULL DEFAULT now(),
aggregate_hash TEXT NOT NULL DEFAULT '',
source_count INT NOT NULL DEFAULT 0,
created_by BIGINT REFERENCES users(id) ON DELETE SET NULL,
frozen BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_project_context_snapshots_project
ON project_context_snapshots(project_id, created_at DESC);
CREATE TABLE IF NOT EXISTS project_context_snapshot_sources (
id BIGSERIAL PRIMARY KEY,
snapshot_id BIGINT NOT NULL REFERENCES project_context_snapshots(id) ON DELETE CASCADE,
source_type TEXT NOT NULL,
source_id TEXT NOT NULL DEFAULT '',
source_version TEXT NOT NULL DEFAULT '',
content_hash TEXT NOT NULL DEFAULT '',
authority_level TEXT NOT NULL DEFAULT '',
permission_scope TEXT NOT NULL DEFAULT 'project',
referenced BOOLEAN NOT NULL DEFAULT false,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
CONSTRAINT uq_snapshot_source UNIQUE (snapshot_id, source_type, source_id, source_version)
);
CREATE INDEX IF NOT EXISTS idx_context_snapshot_sources_snapshot
ON project_context_snapshot_sources(snapshot_id);
ALTER TABLE project_doc_task_instances DROP CONSTRAINT IF EXISTS chk_pdti_status;
ALTER TABLE project_doc_task_instances
ADD CONSTRAINT chk_pdti_status CHECK (status IN (
'pending', 'in_progress', 'reviewing', 'approved', 'skipped', 'skipped_disabled'
));
ALTER TABLE project_doc_task_instances
ADD COLUMN IF NOT EXISTS output_doc_title TEXT NOT NULL DEFAULT '';
-- +goose Down
DROP TABLE IF EXISTS project_context_snapshot_sources;
DROP TABLE IF EXISTS project_context_snapshots;
ALTER TABLE project_workflow_instances
DROP COLUMN IF EXISTS previous_instance_id,
DROP COLUMN IF EXISTS termination_reason,
DROP COLUMN IF EXISTS terminated_by,
DROP COLUMN IF EXISTS terminated_at,
DROP COLUMN IF EXISTS completed_by,
DROP COLUMN IF EXISTS completed_at;
ALTER TABLE workflow_definitions DROP COLUMN IF EXISTS catalog_order;
ALTER TABLE workflow_definitions DROP COLUMN IF EXISTS project_selectable;