-- +goose Up -- SWBOOT-01: additive project domain / type / compliance / governance fields. -- Does NOT backfill product_domain or project_type for legacy rows (avoid misclassification). ALTER TABLE projects ADD COLUMN IF NOT EXISTS product_domain TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS project_type_key TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS compliance_profile_key TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS governance_profile TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS team_mode TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS execution_mode TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS data_sensitivity TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS network_policy TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS budget_class TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS problem_statement TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS target_users TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS target_outcome TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS product_shape TEXT NOT NULL DEFAULT ''; CREATE TABLE IF NOT EXISTS project_types ( id BIGSERIAL PRIMARY KEY, type_key TEXT NOT NULL UNIQUE, name TEXT NOT NULL, product_domain TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', default_governance TEXT NOT NULL DEFAULT 'standard', default_workflow_key TEXT NOT NULL DEFAULT '', status TEXT NOT NULL DEFAULT 'active', created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE IF NOT EXISTS compliance_profiles ( id BIGSERIAL PRIMARY KEY, profile_key TEXT NOT NULL UNIQUE, name TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', ruleset_version TEXT NOT NULL DEFAULT 'v1', requires_independent_review BOOLEAN NOT NULL DEFAULT false, status TEXT NOT NULL DEFAULT 'active', created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE TABLE IF NOT EXISTS project_type_workflows ( id BIGSERIAL PRIMARY KEY, project_type_key TEXT NOT NULL REFERENCES project_types(type_key) ON DELETE CASCADE, workflow_key TEXT NOT NULL, compliance_profile_key TEXT NOT NULL DEFAULT '', recommended BOOLEAN NOT NULL DEFAULT false, allowed BOOLEAN NOT NULL DEFAULT true, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), CONSTRAINT uq_project_type_workflow UNIQUE (project_type_key, workflow_key, compliance_profile_key) ); CREATE TABLE IF NOT EXISTS project_source_bindings ( id BIGSERIAL PRIMARY KEY, project_id BIGINT NOT NULL REFERENCES projects(id) ON DELETE CASCADE, source_type TEXT NOT NULL, source_ref TEXT NOT NULL DEFAULT '', revision TEXT NOT NULL DEFAULT '', content_hash TEXT NOT NULL DEFAULT '', permission_scope TEXT NOT NULL DEFAULT 'read_only', secret_ref TEXT NOT NULL DEFAULT '', exclude_globs TEXT NOT NULL DEFAULT '', ingested_at TIMESTAMPTZ, created_by BIGINT REFERENCES users(id) ON DELETE SET NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_project_source_bindings_project ON project_source_bindings(project_id, created_at DESC); CREATE TABLE IF NOT EXISTS repo_path_allowlist ( id BIGSERIAL PRIMARY KEY, path_prefix TEXT NOT NULL UNIQUE, description TEXT NOT NULL DEFAULT '', enabled BOOLEAN NOT NULL DEFAULT true, created_by BIGINT REFERENCES users(id) ON DELETE SET NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); INSERT INTO project_types (type_key, name, product_domain, description, default_governance, default_workflow_key) VALUES ('greenfield', '绿地立项', 'non_medical_software', '从零规划新软件', 'standard', 'software_bootstrap'), ('existing_product', '既有产品梳理', 'non_medical_software', '梳理已有产品与仓库', 'standard', 'software_bootstrap'), ('legacy_modernization', '遗留现代化', 'non_medical_software', '遗留系统改造与迁移', 'standard', 'software_bootstrap'), ('existing_self_bootstrap', '系统自举', 'non_medical_software', '用 Agent-System 梳理并建设自身', 'standard', 'software_bootstrap') ON CONFLICT (type_key) DO NOTHING; INSERT INTO compliance_profiles (profile_key, name, description, ruleset_version, requires_independent_review) VALUES ('none', '无外部合规预设', '不预设外部法规步骤;鉴权/审计/安全基线仍生效', 'v1', false), ('internal_control', '内部控制', '内部流程、权限与审计约束', 'v1', false), ('security_baseline', '安全基线', '威胁建模、依赖与 secret 边界', 'v1', false), ('privacy', '隐私保护', '数据分类与最小权限', 'v1', true), ('custom', '自定义合规', '项目自定义合规包', 'v1', true) ON CONFLICT (profile_key) DO NOTHING; INSERT INTO project_type_workflows (project_type_key, workflow_key, compliance_profile_key, recommended, allowed) VALUES ('greenfield', 'software_bootstrap', '', true, true), ('greenfield', 'software_delivery', '', false, true), ('existing_product', 'software_bootstrap', '', true, true), ('existing_product', 'software_delivery', '', false, true), ('legacy_modernization', 'software_bootstrap', '', true, true), ('legacy_modernization', 'software_delivery', '', false, true), ('existing_self_bootstrap', 'software_bootstrap', '', true, true), ('existing_self_bootstrap', 'software_delivery', '', false, true) ON CONFLICT (project_type_key, workflow_key, compliance_profile_key) DO NOTHING; INSERT INTO workflow_executor_registry (executor_key, description) VALUES ('software.doc.v1', '软件领域通用文档执行器(bootstrap/delivery)') ON CONFLICT (executor_key) DO NOTHING; -- +goose Down DROP TABLE IF EXISTS repo_path_allowlist; DROP TABLE IF EXISTS project_source_bindings; DROP TABLE IF EXISTS project_type_workflows; DROP TABLE IF EXISTS compliance_profiles; DROP TABLE IF EXISTS project_types; ALTER TABLE projects DROP COLUMN IF EXISTS product_shape, DROP COLUMN IF EXISTS target_outcome, DROP COLUMN IF EXISTS target_users, DROP COLUMN IF EXISTS problem_statement, DROP COLUMN IF EXISTS budget_class, DROP COLUMN IF EXISTS network_policy, DROP COLUMN IF EXISTS data_sensitivity, DROP COLUMN IF EXISTS execution_mode, DROP COLUMN IF EXISTS team_mode, DROP COLUMN IF EXISTS governance_profile, DROP COLUMN IF EXISTS compliance_profile_key, DROP COLUMN IF EXISTS project_type_key, DROP COLUMN IF EXISTS product_domain; DELETE FROM workflow_executor_registry WHERE executor_key = 'software.doc.v1';