//go:build integration

package controlplane

import (
	"context"
	"crypto/tls"
	"database/sql"
	"encoding/json"
	"fmt"
	"net"
	"os"
	"path/filepath"
	"runtime"
	"strings"
	"testing"
	"time"

	"github.com/go-sql-driver/mysql"
	"github.com/nexuscrm/db"
	"github.com/nexuscrm/shared/pkg/constants"
	"github.com/nexuscrm/shared/pkg/models"
	"github.com/pingcap-inc/nexuscrm-controlplane/packs"
)

func TestRuntimeRequiredPacksMaterializeCleanL0(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := ApplyRuntimeRequiredPacks(ctx, r); err != nil {
		t.Fatalf("apply runtime-required packs: %v", err)
	}

	assertSomeRows(t, conn.DB(), "runtime-required persisted User.Name field permissions",
		`SELECT COUNT(*)
		   FROM FieldPermissions
		  WHERE SobjectType = 'User'
		    AND Field IN ('Name', 'User.Name')
		    AND COALESCE(IsDeleted, 0) = 0`)
	assertCleanL0NoAppResidue(t, ctx, conn.DB())
	assertCleanL0PermissionsStillSeeded(t, conn.DB())
	assertNoRows(t, conn.DB(), "installed app packs",
		"SELECT COUNT(*) FROM _System_InstalledPack WHERE Category = ? AND COALESCE(IsDeleted, 0) = 0",
		string(packs.AppPack))
	if err := VerifyL0(ctx, conn); err != nil {
		t.Fatalf("controlplane.VerifyL0 clean L0: %v", err)
	}
}

func TestInitializeSchema_ReaddsActionSchemaPrefillSourceFieldColumn(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)

	db := conn.DB()
	if _, err := db.Exec(`
		ALTER TABLE _System_ActionSchema
		DROP COLUMN PrefillSourceFieldAPIName
	`); err != nil {
		t.Fatalf("drop PrefillSourceFieldAPIName: %v", err)
	}
	assertMissingActionSchemaPrefillSourceFieldColumn(t, db)
	_ = conn.Close()

	conn = initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	assertHasActionSchemaPrefillSourceFieldColumn(t, conn.DB())
	rows, err := getActionSchema(conn.DB(), "missing_standard_action_id")
	if err != nil {
		t.Fatalf("read action schema after restart bootstrap: %v", err)
	}
	if len(rows) != 0 {
		t.Fatalf("action schema rows len = %d, want 0 for missing action", len(rows))
	}
}

func TestReapplySchemaReadinessRepairsMissingSystemObjectDisplayNameFieldBeforeRefreshCache(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	db := conn.DB()
	if _, err := db.ExecContext(ctx, "ALTER TABLE `_System_Object` DROP COLUMN `DisplayNameField`"); err != nil {
		t.Fatalf("drop _System_Object.DisplayNameField: %v", err)
	}
	if _, err := db.ExecContext(ctx, `
		INSERT INTO _System_BootstrapState
			(StateKey, RunID, Phase, Status, LastError, CreatedDate, LastModifiedDate)
		VALUES
			('schema_initialize', 'test-failed-late-phase', 'phase2_field_metadata', 'failed', '{}', NOW(), NOW())
		ON DUPLICATE KEY UPDATE
			RunID = VALUES(RunID),
			Phase = VALUES(Phase),
			Status = VALUES(Status),
			LastError = VALUES(LastError),
			LastModifiedDate = NOW()
	`); err != nil {
		t.Fatalf("seed late failed bootstrap state: %v", err)
	}
	assertPhysicalColumnPresence(t, db, constants.TableObject, constants.FieldSysObject_DisplayNameField, 0)

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner before repair: %v", err)
	}
	err = r.RefreshCache(ctx)
	if err == nil {
		t.Fatal("RefreshCache without _System_Object.DisplayNameField = nil, want unknown-column failure")
	}
	if !strings.Contains(strings.ToLower(err.Error()), "displaynamefield") {
		t.Fatalf("RefreshCache error = %v, want DisplayNameField unknown-column failure", err)
	}
	if err := conn.Close(); err != nil {
		t.Fatalf("close pre-repair connection: %v", err)
	}

	conn = openIntegrationConnection(t, cfg)
	conn, err = reconcileSystemObjectColumnsForCacheRefresh(conn)
	if err != nil {
		t.Fatalf("reconcileSystemObjectColumnsForCacheRefresh after missing _System_Object.DisplayNameField: %v", err)
	}
	defer conn.Close()

	assertPhysicalColumnPresence(t, conn.DB(), constants.TableObject, constants.FieldSysObject_DisplayNameField, 1)
	r, err = NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner after repair: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("RefreshCache after L0 schema repair: %v", err)
	}
}

func TestApplyMetadata_RelaxesUserFirstNameNullabilityFromLegacyNotNull(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	db := conn.DB()

	if got := physicalColumnNullable(t, db, constants.TableUser, constants.FieldFirstName); !got {
		t.Fatalf("precondition failed: User.FirstName nullable = %v, want true before forcing legacy drift", got)
	}

	if _, err := db.ExecContext(ctx, "ALTER TABLE `User` MODIFY COLUMN `FirstName` VARCHAR(255) NOT NULL"); err != nil {
		t.Fatalf("force legacy User.FirstName NOT NULL drift: %v", err)
	}
	if got := physicalColumnNullable(t, db, constants.TableUser, constants.FieldFirstName); got {
		t.Fatalf("legacy drift fixture did not stick: User.FirstName nullable = %v, want false", got)
	}

	if err := conn.Close(); err != nil {
		t.Fatalf("close pre-apply connection: %v", err)
	}

	conn = openIntegrationConnection(t, cfg)
	var err error
	conn, err = ApplyMetadata(ctx, conn)
	if err != nil {
		t.Fatalf("ApplyMetadata after legacy User.FirstName drift: %v", err)
	}
	defer conn.Close()

	if got := physicalColumnNullable(t, conn.DB(), constants.TableUser, constants.FieldFirstName); !got {
		t.Fatalf("User.FirstName nullable = %v after ApplyMetadata, want true", got)
	}
}

func TestApplyMetadataPreservesPackOwnedAccessPolicySidecarsDuringInitializeSchema(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	db := conn.DB()

	const packName = "salesforce-crm-standard"
	recordMutationValue := `{"deny":[{"surfaces":["singleCreate"],"message":"closed"}]}`
	liveAccessPolicy := `{"recordMutation":` + recordMutationValue + `}`
	objects := []string{"Flow", "FlowDefinition", "ProcessAction", "ProcessDefinition"}
	for _, objectAPIName := range objects {
		result, err := db.ExecContext(ctx,
			"UPDATE `"+constants.TableObject+"` SET `"+
				constants.FieldSysObject_AccessPolicy+"` = ?, `"+
				constants.FieldSysObject_AccessPolicyRecordMutationPackName+"` = ?, `"+
				constants.FieldSysObject_AccessPolicyRecordMutationPackBusinessKey+"` = ?, `"+
				constants.FieldSysObject_AccessPolicyRecordMutationPackValue+"` = ? WHERE `"+
				constants.FieldSysObject_APIName+"` = ? AND COALESCE(`"+
				constants.FieldIsDeleted+"`, 0) = 0",
			liveAccessPolicy,
			packName,
			objectAPIName,
			recordMutationValue,
			objectAPIName,
		)
		if err != nil {
			t.Fatalf("seed %s pack-owned recordMutation sidecar: %v", objectAPIName, err)
		}
		affected, err := result.RowsAffected()
		if err != nil {
			t.Fatalf("seed %s rows affected: %v", objectAPIName, err)
		}
		if affected != 1 {
			t.Fatalf("seed %s rows affected = %d, want 1", objectAPIName, affected)
		}
	}

	if err := conn.Close(); err != nil {
		t.Fatalf("close pre-apply connection: %v", err)
	}

	conn = openIntegrationConnection(t, cfg)
	var err error
	conn, err = ApplyMetadata(ctx, conn)
	if err != nil {
		t.Fatalf("ApplyMetadata after seeded AccessPolicy sidecars: %v", err)
	}
	defer conn.Close()

	for _, objectAPIName := range objects {
		assertPackOwnedRecordMutationProjection(t, conn.DB(), objectAPIName, packName, "closed")
	}
}

func TestVerifyFailsClosedOnLegacyUserFirstNameNotNullDrift(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	if _, err := conn.DB().ExecContext(ctx, "ALTER TABLE `User` MODIFY COLUMN `FirstName` VARCHAR(255) NOT NULL"); err != nil {
		t.Fatalf("force legacy User.FirstName NOT NULL drift: %v", err)
	}

	err := Verify(ctx, conn)
	if err == nil {
		t.Fatal("Verify with User.FirstName NOT NULL drift = nil, want readiness failure")
	}
	if !strings.Contains(err.Error(), "User.FirstName must be nullable") {
		t.Fatalf("Verify error = %v, want User.FirstName nullable readiness drift", err)
	}
}

func TestInstallPackFromSourceFailsClosedOnLegacyUserFirstNameNullabilityDrift(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)
	t.Setenv(packs.OfficialAppPacksRootEnvVar, officialPackRootFromControlplaneTest(t))

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	if _, err := conn.DB().ExecContext(ctx, "ALTER TABLE `User` MODIFY COLUMN `FirstName` VARCHAR(255) NOT NULL"); err != nil {
		t.Fatalf("force legacy User.FirstName NOT NULL drift: %v", err)
	}
	if got := physicalColumnNullable(t, conn.DB(), constants.TableUser, constants.FieldFirstName); got {
		t.Fatalf("legacy drift fixture did not stick: User.FirstName nullable = %v, want false", got)
	}

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}

	err = InstallPackFromSource(ctx, r, "official_repo:salesforce-crm-standard")
	if err == nil {
		t.Fatal("InstallPackFromSource with legacy User.FirstName NOT NULL drift: want error, got nil")
	}
	if !strings.Contains(err.Error(), "cmd/setup apply") {
		t.Fatalf("InstallPackFromSource with legacy User.FirstName drift: error = %v, want actionable guidance about 'cmd/setup apply'", err)
	}
}

func TestInstallPackFromSourceFailsClosedOnMetadataOnlyUserFirstNameRequiredDrift(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)
	t.Setenv(packs.OfficialAppPacksRootEnvVar, officialPackRootFromControlplaneTest(t))

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	// Verify physical column is already nullable (warm-upgrade state: no physical drift)
	if got := physicalColumnNullable(t, conn.DB(), constants.TableUser, constants.FieldFirstName); !got {
		t.Fatalf("precondition: User.FirstName nullable = %v, want true (no physical drift for this test)", got)
	}

	// Force metadata-only drift: set _System_Field.Required=1 while physical column stays nullable
	_, err := conn.DB().ExecContext(ctx,
		"UPDATE `"+constants.TableField+"` f JOIN `"+constants.TableObject+
			"` o ON o.Id = f.ObjectId SET f.`Required` = 1 WHERE o.ApiName = ? AND f.ApiName = ?",
		constants.TableUser, constants.FieldFirstName,
	)
	if err != nil {
		t.Fatalf("force metadata-only User.FirstName Required=1 drift: %v", err)
	}
	var pre int
	if err := conn.DB().QueryRowContext(ctx,
		"SELECT f.`Required` FROM `"+constants.TableField+"` f JOIN `"+constants.TableObject+
			"` o ON o.Id = f.ObjectId WHERE o.ApiName = ? AND f.ApiName = ?",
		constants.TableUser, constants.FieldFirstName,
	).Scan(&pre); err != nil || pre != 1 {
		t.Fatalf("metadata drift fixture did not stick: _System_Field.Required = %d (err=%v), want 1", pre, err)
	}

	r, runnerErr := NewRunner(conn)
	if runnerErr != nil {
		t.Fatalf("new runner: %v", runnerErr)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}

	err = InstallPackFromSource(ctx, r, "official_repo:salesforce-crm-standard")
	if err == nil {
		t.Fatal("InstallPackFromSource with metadata-only User.FirstName Required=1 drift: want error, got nil")
	}
	if !strings.Contains(err.Error(), "cmd/setup apply") {
		t.Fatalf("InstallPackFromSource with metadata-only User.FirstName drift: error = %v, want actionable guidance about 'cmd/setup apply'", err)
	}
}

func TestRuntimeRequiredPacksDoNotShareExtraPublicFolders(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := ApplyRuntimeRequiredPacks(ctx, r); err != nil {
		t.Fatalf("apply runtime-required packs: %v", err)
	}

	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO ReportFolder
			(Id, Name, DeveloperName, Type, AccessType, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('folder_issue_reports', 'Issue Reports', 'Issue_Reports', 'Report', 'Public', 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed extra public folder residue: %v", err)
	}

	if err := ApplyRuntimeRequiredPacks(ctx, r); err != nil {
		t.Fatalf("re-apply runtime-required packs: %v", err)
	}
	assertNoRows(t, conn.DB(), "organization share for extra public folder",
		"SELECT COUNT(*) FROM FolderShare WHERE Id = 'FS_ORG_folder_issue_reports'")

	err = verifyNoL0Contamination(ctx, conn.DB())
	if err == nil {
		t.Fatal("verifyNoL0Contamination with extra public folder = nil, want error")
	}
	if !strings.Contains(err.Error(), "ReportFolder rows outside the runtime component manifest") {
		t.Fatalf("verifyNoL0Contamination error = %v, want report folder manifest failure", err)
	}
}

func TestPlatformUXPackVerifyChecksOwnComponentsOnly(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := ApplyRuntimeRequiredPacks(ctx, r); err != nil {
		t.Fatalf("apply runtime-required packs: %v", err)
	}

	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_UIComponent
			(Id, Name, Type, IsEmbeddable, Description, ComponentPath, CreatedDate, LastModifiedDate)
		VALUES
			('uic_issue_board', 'IssueBoard', 'page', 0, 'Issue board', '/apps/issue/Board', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed extra UI component: %v", err)
	}

	ux := &packs.PlatformUXPack{}
	if err := ux.Verify(ctx, packs.VerifyDeps{DB: conn.DB()}); err != nil {
		t.Fatalf("PlatformUXPack.Verify with extra non-owned row = %v, want own-component-only pass", err)
	}

	if _, err := conn.DB().ExecContext(ctx, `
		UPDATE _System_UIComponent
		SET IsEmbeddable = 0,
		    LastModifiedDate = NOW()
		WHERE Name = 'LayoutEditor'
	`); err != nil {
		t.Fatalf("drift LayoutEditor component: %v", err)
	}

	err = ux.Verify(ctx, packs.VerifyDeps{DB: conn.DB()})
	if err == nil || !strings.Contains(err.Error(), "ui_component LayoutEditor payload drifted") {
		t.Fatalf("PlatformUXPack.Verify drift error = %v, want LayoutEditor payload drift", err)
	}
}

func TestVerifyChecksInstalledSourceBackedCRMPack(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("apply packs: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify with installed CRM: %v", err)
	}
	assertSomeRows(t, conn.DB(), "active installed CRM pack",
		"SELECT COUNT(*) FROM _System_InstalledPack WHERE Name = ? AND Status = ? AND COALESCE(IsDeleted, 0) = 0",
		"salesforce-crm-standard", installedPackStatusActive)
	assertInstalledSourceBackedCRMPackMetadata(t, conn.DB())
	if err := VerifyL0(ctx, conn); err == nil {
		t.Fatal("controlplane.VerifyL0 with installed CRM = nil, want contamination error")
	} else if !strings.Contains(err.Error(), "installed app-pack rows present") {
		t.Fatalf("VerifyL0 error = %v, want installed app-pack contamination", err)
	}

	if _, err := conn.DB().ExecContext(ctx, "DELETE FROM _System_Action WHERE Name = ?", "CreateQuote"); err != nil {
		t.Fatalf("delete CRM action drift fixture: %v", err)
	}
	err = Verify(ctx, conn)
	if err == nil {
		t.Fatal("controlplane.Verify after CRM drift = nil, want error")
	}
	if !strings.Contains(err.Error(), "installed app pack salesforce-crm-standard verify") {
		t.Fatalf("Verify error = %v, want installed CRM pack verify failure", err)
	}
}

func TestVerifyProfilePermissionCoverageIncludesReadOnlyBusinessFields(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	t.Setenv(packs.OfficialAppPacksRootEnvVar, officialPackRootFromControlplaneTest(t))

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}

	assertSomeRows(t, conn.DB(), "CRM read-only field permissions for Quote.Name",
		`SELECT COUNT(*)
		   FROM FieldPermissions fp
		   JOIN PermissionSet ps ON ps.Id = fp.ParentId
		  WHERE fp.SobjectType = 'Quote'
		    AND fp.Field IN ('Name', 'Quote.Name')
		    AND COALESCE(fp.IsDeleted, 0) = 0
		    AND COALESCE(ps.ProfileId, '') <> ''`)
	if err := VerifyProfilePermissionCoverage(conn.DB()); err != nil {
		t.Fatalf("VerifyProfilePermissionCoverage with read-only CRM business fields: %v", err)
	}
}

func TestInstallSourceBackedCRMPackMaterializesProductPricebookObjectIdentities(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}

	for _, tc := range []struct {
		apiName   string
		keyPrefix string
	}{
		{apiName: "Pricebook2", keyPrefix: "01s"},
		{apiName: "Product2", keyPrefix: "01t"},
		{apiName: "PricebookEntry", keyPrefix: "01u"},
		{apiName: "OpportunityContactRole", keyPrefix: "00K"},
		{apiName: "CaseComment", keyPrefix: "00a"},
		{apiName: "CampaignMemberStatus", keyPrefix: "01Y"},
		{apiName: "CampaignMember", keyPrefix: "00v"},
		{apiName: "OpportunityLineItem", keyPrefix: "00k"},
		{apiName: "QuoteLineItem", keyPrefix: "0QL"},
		{apiName: "OrderItem", keyPrefix: "802"},
	} {
		var got sql.NullString
		if err := conn.DB().QueryRowContext(ctx, `
			SELECT KeyPrefix
			FROM _System_Object
			WHERE ApiName = ?
			  AND COALESCE(IsDeleted, 0) = 0
			LIMIT 1`, tc.apiName).Scan(&got); err != nil {
			t.Fatalf("query _System_Object.KeyPrefix for %s: %v", tc.apiName, err)
		}
		if !got.Valid || got.String != tc.keyPrefix {
			t.Fatalf("%s KeyPrefix = %q valid=%v, want %q", tc.apiName, got.String, got.Valid, tc.keyPrefix)
		}
	}
}

func TestVerifyChecksInstalledSourceBackedCRMPackObjectKeyPrefixDrift(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}
	if err := VerifyInstalledPackByName(ctx, conn.DB(), "salesforce-crm-standard", false); err != nil {
		t.Fatalf("verify installed CRM pack before drift: %v", err)
	}

	if _, err := conn.DB().ExecContext(ctx, `
		UPDATE _System_Object
		SET KeyPrefix = NULL,
		    LastModifiedDate = NOW()
		WHERE ApiName = 'OpportunityContactRole'
		  AND COALESCE(IsDeleted, 0) = 0
	`); err != nil {
		t.Fatalf("drift OpportunityContactRole KeyPrefix: %v", err)
	}

	err = VerifyInstalledPackByName(ctx, conn.DB(), "salesforce-crm-standard", false)
	if err == nil {
		t.Fatal("VerifyInstalledPackByName after KeyPrefix drift = nil, want error")
	}
	if !strings.Contains(err.Error(), "pack object physical schema drift") {
		t.Fatalf("VerifyInstalledPackByName error = %v, want pack object physical schema drift", err)
	}
	if !strings.Contains(err.Error(), "_System_Object row for OpportunityContactRole KeyPrefix = <null>, want \"00K\"") {
		t.Fatalf("VerifyInstalledPackByName error = %v, want exact KeyPrefix drift detail", err)
	}
}

func TestInstallSourceBackedCRMPackRepairsInstalledObjectKeyPrefixDrift(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}

	driftInstalledObjectKeyPrefix(t, ctx, conn.DB(), "OpportunityContactRole")

	t.Setenv(packs.OfficialAppPacksRootEnvVar, officialPackRootFromControlplaneTest(t))
	if err := InstallPackFromSource(ctx, r, "official_repo:salesforce-crm-standard"); err != nil {
		t.Fatalf("reinstall CRM pack after keyPrefix drift: %v", err)
	}
	if err := VerifyInstalledPackByName(ctx, conn.DB(), "salesforce-crm-standard", false); err != nil {
		t.Fatalf("verify CRM pack after keyPrefix repair: %v", err)
	}
	assertInstalledObjectKeyPrefix(t, ctx, conn.DB(), "OpportunityContactRole", "00K")
}

func TestApplyAllRepairsInstalledCRMPackObjectKeyPrefixDrift(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}

	driftInstalledObjectKeyPrefix(t, ctx, conn.DB(), "OpportunityContactRole")

	err = Verify(ctx, conn)
	if err == nil {
		t.Fatal("controlplane.Verify after CRM keyPrefix drift = nil, want error")
	}
	if !strings.Contains(err.Error(), "_System_Object row for OpportunityContactRole KeyPrefix = <null>, want \"00K\"") {
		t.Fatalf("Verify error = %v, want keyPrefix drift detail", err)
	}
	if !isRepairableInstalledPackApplyAllError(err) {
		t.Fatalf("Verify error = %v, want repairable installed-pack verify classification", err)
	}

	if err := ApplyAll(ctx, conn); err != nil {
		t.Fatalf("apply all after CRM keyPrefix drift: %v", err)
	}

	checkConn := openIntegrationConnection(t, cfg)
	defer checkConn.Close()
	if err := Verify(ctx, checkConn); err != nil {
		t.Fatalf("controlplane.Verify after ApplyAll keyPrefix repair = %v", err)
	}
	assertInstalledObjectKeyPrefix(t, ctx, checkConn.DB(), "OpportunityContactRole", "00K")
}

func TestInstallSourceBackedCRMPackMaterializesFirstWaveBackfilledFields(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}

	for _, tc := range []struct {
		object      string
		field       string
		typ         string
		formulaMode string
	}{
		{object: "Account", field: "AccountNumber", typ: "string"},
		{object: "Account", field: "Sic", typ: "string"},
		{object: "Account", field: "TickerSymbol", typ: "string"},
		{object: "Account", field: "Site", typ: "string"},
		{object: "Account", field: "DunsNumber", typ: "string"},
		{object: "Account", field: "Tradestyle", typ: "string"},
		{object: "Account", field: "NaicsDesc", typ: "string"},
		{object: "Account", field: "YearStarted", typ: "string"},
		{object: "Account", field: "SicDesc", typ: "string"},
		{object: "Case", field: "SuppliedName", typ: "string"},
		{object: "Case", field: "SuppliedEmail", typ: "email"},
		{object: "Case", field: "SuppliedPhone", typ: "string"},
		{object: "Case", field: "SuppliedCompany", typ: "string"},
		{object: "Contact", field: "Fax", typ: "phone"},
		{object: "Contact", field: "HomePhone", typ: "phone"},
		{object: "Contact", field: "OtherPhone", typ: "phone"},
		{object: "Lead", field: "Fax", typ: "phone"},
		{object: "Lead", field: "CompanyDunsNumber", typ: "string"},
		{object: "CampaignMember", field: "Title", typ: "string", formulaMode: "active"},
		{object: "CampaignMember", field: "Street", typ: "string", formulaMode: "active"},
		{object: "CampaignMember", field: "City", typ: "string", formulaMode: "active"},
		{object: "CampaignMember", field: "State", typ: "string", formulaMode: "active"},
		{object: "CampaignMember", field: "PostalCode", typ: "string", formulaMode: "active"},
		{object: "CampaignMember", field: "Country", typ: "string", formulaMode: "active"},
		{object: "CampaignMember", field: "Fax", typ: "phone", formulaMode: "active"},
		{object: "CampaignMember", field: "MobilePhone", typ: "phone", formulaMode: "active"},
		{object: "CampaignMember", field: "Description", typ: "textarea", formulaMode: "active"},
		{object: "CampaignMember", field: "DoNotCall", typ: "boolean", formulaMode: "active"},
		{object: "CampaignMember", field: "HasOptedOutOfEmail", typ: "boolean", formulaMode: "active"},
		{object: "Product2", field: "ExternalId", typ: "string"},
		{object: "Product2", field: "DisplayUrl", typ: "url"},
		{object: "Product2", field: "StockKeepingUnit", typ: "string"},
	} {
		var gotType, gotFormulaMode sql.NullString
		if err := conn.DB().QueryRowContext(ctx, `
			SELECT f.Type, f.FormulaMode
			  FROM _System_Field f
			  JOIN _System_Object o ON o.Id = f.ObjectId
			 WHERE o.ApiName = ?
			   AND f.ApiName = ?
			   AND COALESCE(o.IsDeleted, 0) = 0
			   AND COALESCE(f.IsDeleted, 0) = 0
			 LIMIT 1
		`, tc.object, tc.field).Scan(&gotType, &gotFormulaMode); err != nil {
			t.Fatalf("query _System_Field for %s.%s: %v", tc.object, tc.field, err)
		}
		if !gotType.Valid || gotType.String != tc.typ {
			t.Fatalf("%s.%s Type = %q valid=%v, want %q", tc.object, tc.field, gotType.String, gotType.Valid, tc.typ)
		}
		if tc.formulaMode == "" {
			if gotFormulaMode.Valid && gotFormulaMode.String != "" {
				t.Fatalf("%s.%s FormulaMode = %q valid=%v, want empty", tc.object, tc.field, gotFormulaMode.String, gotFormulaMode.Valid)
			}
			continue
		}
		if !gotFormulaMode.Valid || gotFormulaMode.String != tc.formulaMode {
			t.Fatalf("%s.%s FormulaMode = %q valid=%v, want %q", tc.object, tc.field, gotFormulaMode.String, gotFormulaMode.Valid, tc.formulaMode)
		}
	}
}

// TestInstallSourceBackedCRMPackModelsOpportunityLastStageChangeDateForFormulaCompile
// is the NexusCRM-side verification sync for the paired official CRM pack
// change that adds Opportunity.LastStageChangeDate. The field itself ships
// from the external official-pack repo; this test proves control-plane
// install/reconcile and formula-view compilation can consume it end to end.
func TestInstallSourceBackedCRMPackModelsOpportunityLastStageChangeDateForFormulaCompile(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}

	var gotType sql.NullString
	if err := conn.DB().QueryRowContext(ctx, `
		SELECT f.Type
		  FROM _System_Field f
		  JOIN _System_Object o ON o.Id = f.ObjectId
		 WHERE o.ApiName = 'Opportunity'
		   AND f.ApiName = 'LastStageChangeDate'
		   AND COALESCE(o.IsDeleted, 0) = 0
		   AND COALESCE(f.IsDeleted, 0) = 0
		 LIMIT 1
	`).Scan(&gotType); err != nil {
		t.Fatalf("query _System_Field for Opportunity.LastStageChangeDate: %v", err)
	}
	if !gotType.Valid || gotType.String != "datetime" {
		t.Fatalf("Opportunity.LastStageChangeDate Type = %q valid=%v, want datetime", gotType.String, gotType.Valid)
	}
	if got := physicalColumnType(t, conn.DB(), "Opportunity", "LastStageChangeDate"); got != "datetime" {
		t.Fatalf("Opportunity.LastStageChangeDate physical type = %q, want datetime", got)
	}

	formula := "IF(ISBLANK(LastStageChangeDate), CreatedDate, LastStageChangeDate)"
	mode := "active"
	returnType := constants.FieldTypeDatetime
	if err := r.SvcMgr.Metadata().CreateField(ctx, "Opportunity", &models.FieldMetadata{
		APIName:     "LastStageCompileProof__c",
		Label:       "Last Stage Compile Proof",
		Type:        constants.FieldTypeFormula,
		Createable:  false,
		Updateable:  false,
		Formula:     &formula,
		FormulaMode: &mode,
		ReturnType:  &returnType,
	}); err != nil {
		t.Fatalf("create Opportunity.LastStageCompileProof__c: %v", err)
	}

	if _, err := r.SvcMgr.FormulaView().PreviewDDL(ctx, "Opportunity"); err != nil {
		t.Fatalf("preview opportunity formula view after LastStageChangeDate modeling: %v", err)
	}
	if err := r.SvcMgr.FormulaView().RebuildView(ctx, "Opportunity"); err != nil {
		t.Fatalf("rebuild opportunity formula view after LastStageChangeDate modeling: %v", err)
	}
}

func TestAccountSelfRefActiveComputedFormulaViewRebuildsAndQueries(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}

	mode := "active"
	returnType := constants.FieldTypeString
	selfFormula := "Name & ' computed'"
	if err := r.SvcMgr.Metadata().CreateField(ctx, "Account", &models.FieldMetadata{
		APIName:     "SelfComputedName__c",
		Label:       "Self Computed Name",
		Type:        constants.FieldTypeFormula,
		Createable:  false,
		Updateable:  false,
		Formula:     &selfFormula,
		FormulaMode: &mode,
		ReturnType:  &returnType,
	}); err != nil {
		t.Fatalf("create Account.SelfComputedName__c: %v", err)
	}

	parentFormula := "Parent.SelfComputedName__c"
	if err := r.SvcMgr.Metadata().CreateField(ctx, "Account", &models.FieldMetadata{
		APIName:     "ParentSelfComputedName__c",
		Label:       "Parent Self Computed Name",
		Type:        constants.FieldTypeFormula,
		Createable:  false,
		Updateable:  false,
		Formula:     &parentFormula,
		FormulaMode: &mode,
		ReturnType:  &returnType,
	}); err != nil {
		t.Fatalf("create Account.ParentSelfComputedName__c: %v", err)
	}

	if _, err := r.SvcMgr.FormulaView().PreviewDDL(ctx, "Account"); err != nil {
		t.Fatalf("preview account formula view after self-ref active-computed modeling: %v", err)
	}
	if err := r.SvcMgr.FormulaView().RebuildView(ctx, "Account"); err != nil {
		t.Fatalf("rebuild account formula view after self-ref active-computed modeling: %v", err)
	}

	now := time.Now().UTC()
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO Account (Id, Name, ParentId, IsDeleted, CreatedDate, LastModifiedDate, SystemModstamp)
		VALUES (?, ?, NULL, 0, ?, ?, ?),
		       (?, ?, ?, 0, ?, ?, ?)
	`, "acct-parent-886", "Parent Account", now, now, now, "acct-child-886", "Child Account", "acct-parent-886", now, now, now); err != nil {
		t.Fatalf("insert account self-ref fixture rows: %v", err)
	}

	var got sql.NullString
	if err := conn.DB().QueryRowContext(ctx, `
		SELECT ParentSelfComputedName__c
		  FROM v_account
		 WHERE Id = ?
	`, "acct-child-886").Scan(&got); err != nil {
		t.Fatalf("query v_account parent computed formula: %v", err)
	}
	if !got.Valid || got.String != "Parent Account computed" {
		t.Fatalf("Account.ParentSelfComputedName__c = %q valid=%v, want %q", got.String, got.Valid, "Parent Account computed")
	}
}

func TestVerifyChecksInstalledSourceBackedCRMPackBackfilledFieldDrift(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}
	if err := VerifyInstalledPackByName(ctx, conn.DB(), "salesforce-crm-standard", false); err != nil {
		t.Fatalf("verify installed CRM pack before drift: %v", err)
	}

	if _, err := conn.DB().ExecContext(ctx, `
		UPDATE _System_Field f
		JOIN _System_Object o ON o.Id = f.ObjectId
		   SET f.IsDeleted = 1,
		       f.LastModifiedDate = NOW()
		 WHERE o.ApiName = 'CampaignMember'
		   AND f.ApiName = 'Title'
		   AND COALESCE(o.IsDeleted, 0) = 0
		   AND COALESCE(f.IsDeleted, 0) = 0
	`); err != nil {
		t.Fatalf("drift CampaignMember.Title field row: %v", err)
	}

	err = VerifyInstalledPackByName(ctx, conn.DB(), "salesforce-crm-standard", false)
	if err == nil {
		t.Fatal("VerifyInstalledPackByName after backfilled field drift = nil, want error")
	}
	if !strings.Contains(err.Error(), "structural drift") {
		t.Fatalf("VerifyInstalledPackByName error = %v, want structural drift", err)
	}
	if !strings.Contains(err.Error(), "CampaignMember.Title (no live _System_Field row)") {
		t.Fatalf("VerifyInstalledPackByName error = %v, want missing CampaignMember.Title detail", err)
	}
}

func TestInstallExternalLocalPathCRMPack(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	externalRoot := filepath.Join(t.TempDir(), "salesforce-crm-standard")
	copyIntegrationTestDirectory(t,
		filepath.Join(officialPackRootFromControlplaneTest(t), "salesforce-crm-standard"),
		externalRoot,
	)

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := ApplyRuntimeRequiredPacks(ctx, r); err != nil {
		t.Fatalf("apply runtime-required packs: %v", err)
	}
	if err := InstallPackFromSource(ctx, r, "local_path:"+externalRoot); err != nil {
		t.Fatalf("install external CRM pack: %v", err)
	}
	if err := VerifyInstalledPackByName(ctx, conn.DB(), "salesforce-crm-standard", false); err != nil {
		t.Fatalf("verify external CRM pack: %v", err)
	}
	assertSomeRows(t, conn.DB(), "CRM profile object permissions",
		`SELECT COUNT(*)
		   FROM ObjectPermissions op
		   JOIN PermissionSet ps ON ps.Id = op.ParentId
		  WHERE op.SobjectType IN ('Account', 'Lead', 'Task')
		    AND COALESCE(op.IsDeleted, 0) = 0
		    AND COALESCE(ps.ProfileId, '') <> ''`)
	assertSomeRows(t, conn.DB(), "CRM profile field permissions",
		`SELECT COUNT(*)
		   FROM FieldPermissions fp
		   JOIN PermissionSet ps ON ps.Id = fp.ParentId
		  WHERE fp.SobjectType IN ('Account', 'Lead', 'Task')
		    AND COALESCE(fp.IsDeleted, 0) = 0
		    AND COALESCE(ps.ProfileId, '') <> ''`)
	assertSomeRows(t, conn.DB(), "CRM record-triggered flow trigger info",
		`SELECT COUNT(*)
		   FROM FlowDefinition
		  WHERE DeveloperName = 'Std_OrderActivateStamp'
		    AND OwnerPack = 'salesforce-crm-standard'
		    AND COALESCE(TriggerType, '') <> ''
		    AND TriggerObjectOrEvent = 'Order'
		    AND COALESCE(IsDeleted, 0) = 0`)
	assertNoRows(t, conn.DB(), "CRM compound parent write capability",
		`SELECT COUNT(*)
		   FROM _System_Field f
		   JOIN _System_Object o ON o.Id = f.ObjectId
		  WHERE o.ApiName = 'Quote'
		    AND f.ApiName = 'Name'
		    AND (f.Createable = 1 OR f.Updateable = 1)
		    AND COALESCE(f.IsDeleted, 0) = 0
		    AND COALESCE(o.IsDeleted, 0) = 0`)

	pack, err := packs.ResolveInstalledSourceBackedPack(
		"salesforce-crm-standard",
		packs.AppPack,
		string(packs.PackSourceKindLocalPath),
		externalRoot,
	)
	if err != nil {
		t.Fatalf("resolve external CRM pack: %v", err)
	}
	wantHash, err := packs.PackPayloadHash(pack)
	if err != nil {
		t.Fatalf("compute external CRM pack payload hash: %v", err)
	}
	wantURI, err := filepath.EvalSymlinks(externalRoot)
	if err != nil {
		t.Fatalf("eval external CRM pack root: %v", err)
	}

	var sourceKind, sourceURI, appliedHash sql.NullString
	if err := conn.DB().QueryRowContext(ctx, `
		SELECT SourceKind, SourceURI, AppliedPayloadHash
		FROM _System_InstalledPack
		WHERE Name = 'salesforce-crm-standard' AND COALESCE(IsDeleted, 0) = 0
	`).Scan(&sourceKind, &sourceURI, &appliedHash); err != nil {
		t.Fatalf("query external CRM installed pack row: %v", err)
	}
	if !sourceKind.Valid || sourceKind.String != string(packs.PackSourceKindLocalPath) {
		t.Fatalf("SourceKind = %q valid=%v, want local_path", sourceKind.String, sourceKind.Valid)
	}
	if !sourceURI.Valid || sourceURI.String != wantURI {
		t.Fatalf("SourceURI = %q valid=%v, want canonical %q", sourceURI.String, sourceURI.Valid, wantURI)
	}
	if !appliedHash.Valid || appliedHash.String != wantHash {
		t.Fatalf("AppliedPayloadHash = %q valid=%v, want %q", appliedHash.String, appliedHash.Valid, wantHash)
	}

	legacyHash := packs.PackPayloadHashV1Prefix + "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
	if _, err := conn.DB().ExecContext(ctx, `
		UPDATE _System_InstalledPack
		   SET SourceKind = NULL,
		       SourceURI = NULL,
		       SourceRevision = NULL,
		       DesiredPayloadHash = ?,
		       AppliedPayloadHash = ?,
		       LastModifiedDate = NOW()
		 WHERE Name = 'salesforce-crm-standard'
	`, legacyHash, legacyHash); err != nil {
		t.Fatalf("seed legacy missing source identity: %v", err)
	}
	err = VerifyInstalledPackByName(ctx, conn.DB(), "salesforce-crm-standard", false)
	if err == nil || !strings.Contains(err.Error(), "has no source identity") {
		t.Fatalf("verify legacy missing source identity = %v, want missing source identity", err)
	}
	if err := InstallPackFromSource(ctx, r, "local_path:"+externalRoot); err != nil {
		t.Fatalf("repair legacy CRM pack source identity: %v", err)
	}
	if err := VerifyInstalledPackByName(ctx, conn.DB(), "salesforce-crm-standard", false); err != nil {
		t.Fatalf("verify repaired CRM pack source identity: %v", err)
	}
}

func TestInstallSourceBackedCRMPackBackfillsAllLegacyFlowSources(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	wantStd := liveStandardFlowSeedCount(t)
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}
	assertFlowSourceCount(t, conn.DB(), flowSourceStandard, wantStd)

	if _, err := conn.DB().ExecContext(ctx, `
		UPDATE Flow
		   SET Source = ?, LastModifiedDate = NOW()
		 WHERE Id LIKE 'flowver_std_%'`,
		flowSourceCustom,
	); err != nil {
		t.Fatalf("simulate legacy Flow.Source default: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		DELETE FROM _System_BootstrapState
		 WHERE StateKey = 'flow_source_backfill_v1'`,
	); err != nil {
		t.Fatalf("reset flow source backfill gate: %v", err)
	}
	assertFlowSourceCount(t, conn.DB(), flowSourceCustom, wantStd)

	t.Setenv(packs.OfficialAppPacksRootEnvVar, officialPackRootFromControlplaneTest(t))
	if err := InstallPackFromSource(ctx, r, "official_repo:salesforce-crm-standard"); err != nil {
		t.Fatalf("reinstall CRM pack after legacy Flow.Source simulation: %v", err)
	}
	if err := VerifyInstalledPackByName(ctx, conn.DB(), "salesforce-crm-standard", false); err != nil {
		t.Fatalf("verify CRM pack after flow source backfill: %v", err)
	}
	assertFlowSourceCount(t, conn.DB(), flowSourceStandard, wantStd)
	assertFlowSourceCount(t, conn.DB(), flowSourceCustom, 0)
}

func TestApplyAllAdoptsLegacyInstalledCRMPackSourceIdentity(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}

	if _, err := conn.DB().ExecContext(ctx, `
		UPDATE _System_InstalledPack
		   SET SourceKind = NULL,
		       SourceURI = NULL,
		       SourceRevision = NULL,
		       LastModifiedDate = NOW()
		 WHERE Name = 'salesforce-crm-standard'`,
	); err != nil {
		t.Fatalf("simulate legacy installed pack source identity: %v", err)
	}

	if err := ApplyAll(ctx, conn); err != nil {
		t.Fatalf("apply all with legacy installed CRM pack row: %v", err)
	}

	checkConn := openIntegrationConnection(t, cfg)
	defer checkConn.Close()
	if err := VerifyInstalledPackByName(ctx, checkConn.DB(), "salesforce-crm-standard", false); err != nil {
		t.Fatalf("verify adopted CRM pack: %v", err)
	}
	assertInstalledSourceBackedCRMPackMetadata(t, checkConn.DB())
}

func TestInstallOfficialCRMPackVerifyConvergesSinglePass(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}

	if err := VerifyInstalledPackByName(ctx, conn.DB(), "salesforce-crm-standard", false); err != nil {
		t.Fatalf("verify installed CRM pack after one install pass: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify after one CRM install pass: %v", err)
	}
	assertInstalledSourceBackedCRMPackMetadata(t, conn.DB())
}

func TestApplyAllRebuildsTriggerSubscriptionsAfterFinalFlowOrphanReconcile(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}

	var flowDefinitionID, flowVersionID string
	if err := conn.DB().QueryRowContext(ctx, `
		SELECT fd.Id, fd.ActiveVersionId
		  FROM FlowDefinition fd
		  JOIN _System_TriggerSubscription ts
		    ON ts.FlowDefinitionId = fd.Id
		   AND ts.IsActive = 1
		 WHERE fd.OwnerPack = 'salesforce-crm-standard'
		   AND fd.ActiveVersionId IS NOT NULL
		   AND COALESCE(fd.IsDeleted, 0) = 0
		 ORDER BY fd.Id
		 LIMIT 1`,
	).Scan(&flowDefinitionID, &flowVersionID); err != nil {
		t.Fatalf("query CRM flow with active trigger subscription: %v", err)
	}

	origVerifyResolved := verifyResolvedSourceBackedPackForReconcile
	t.Cleanup(func() {
		verifyResolvedSourceBackedPackForReconcile = origVerifyResolved
	})
	injected := false
	verifyResolvedSourceBackedPackForReconcile = func(ctx context.Context, row installedPackRow, db *sql.DB, pack *packs.SourceBackedPack) error {
		if err := origVerifyResolved(ctx, row, db, pack); err != nil {
			return err
		}
		if injected || strings.TrimSpace(row.Name) != "salesforce-crm-standard" {
			return nil
		}
		injected = true
		if _, err := db.ExecContext(ctx, `
			UPDATE Flow
			   SET Status = 'Draft',
			       LastModifiedDate = NOW()
			 WHERE Id = ?`,
			flowVersionID,
		); err != nil {
			return fmt.Errorf("seed post-reconcile orphan flow version %s: %w", flowVersionID, err)
		}
		return nil
	}

	if err := ApplyAll(ctx, conn); err != nil {
		t.Fatalf("ApplyAll should repair flow orphan and rebuild trigger subscriptions in one pass: %v", err)
	}
	if !injected {
		t.Fatal("test hook did not inject post-reconcile flow orphan")
	}

	checkConn := openIntegrationConnection(t, cfg)
	defer checkConn.Close()

	var activeVersion sql.NullString
	if err := checkConn.DB().QueryRowContext(ctx, `
		SELECT ActiveVersionId
		  FROM FlowDefinition
		 WHERE Id = ?`,
		flowDefinitionID,
	).Scan(&activeVersion); err != nil {
		t.Fatalf("query repaired FlowDefinition ActiveVersionId: %v", err)
	}
	if activeVersion.Valid && strings.TrimSpace(activeVersion.String) != "" {
		t.Fatalf("FlowDefinition %s ActiveVersionId = %q, want NULL after repair", flowDefinitionID, activeVersion.String)
	}
	assertNoRows(t, checkConn.DB(), "active trigger subscriptions for orphaned flow definition",
		`SELECT COUNT(*)
		   FROM _System_TriggerSubscription
		  WHERE FlowDefinitionId = ?
		    AND IsActive = 1`,
		flowDefinitionID)
	if err := VerifyTriggerSubscriptionConsistency(ctx, checkConn); err != nil {
		t.Fatalf("trigger subscription verify after one ApplyAll pass: %v", err)
	}
}

func TestApplyAllRepairsInstalledCRMPackPageLayoutDrift(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}

	res, err := conn.DB().ExecContext(ctx, `
UPDATE _System_PageLayout
SET Config = JSON_SET(Config, '$.sections[0].label', ?)
WHERE Id = ?`,
		"Drifted Account Information",
		"curated_Account_default")
	if err != nil {
		t.Fatalf("update CRM page layout drift fixture: %v", err)
	}
	if n, _ := res.RowsAffected(); n == 0 {
		t.Fatal("CRM page layout drift fixture did not update any rows")
	}

	err = Verify(ctx, conn)
	if err == nil {
		t.Fatal("controlplane.Verify after CRM page-layout drift = nil, want error")
	}
	if !strings.Contains(err.Error(), "curated Account layout config drifted") {
		t.Fatalf("Verify error = %v, want curated Account layout drift failure", err)
	}
	if !isRepairableInstalledPackApplyAllError(err) {
		t.Fatalf("Verify error = %v, want repairable installed-pack verify classification", err)
	}

	if err := ApplyAll(ctx, conn); err != nil {
		t.Fatalf("apply all after CRM page-layout drift: %v", err)
	}

	checkConn := openIntegrationConnection(t, cfg)
	defer checkConn.Close()
	if err := Verify(ctx, checkConn); err != nil {
		t.Fatalf("controlplane.Verify after ApplyAll repair = %v", err)
	}
}

func TestApplyAllRepairsMissingInstalledCRMPackPageLayout(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("install CRM pack: %v", err)
	}

	res, err := conn.DB().ExecContext(ctx, `DELETE FROM _System_PageLayout WHERE Id = ?`, "curated_Account_default")
	if err != nil {
		t.Fatalf("delete CRM page layout fixture: %v", err)
	}
	if n, _ := res.RowsAffected(); n == 0 {
		t.Fatal("CRM page layout delete fixture did not remove any rows")
	}

	err = Verify(ctx, conn)
	if err == nil {
		t.Fatal("controlplane.Verify after missing CRM page-layout = nil, want error")
	}
	if !strings.Contains(err.Error(), "curated Account layout missing") {
		t.Fatalf("Verify error = %v, want curated Account layout missing failure", err)
	}
	if !isRepairableInstalledPackApplyAllError(err) {
		t.Fatalf("Verify error = %v, want repairable installed-pack verify classification", err)
	}

	if err := ApplyAll(ctx, conn); err != nil {
		t.Fatalf("apply all after missing CRM page-layout: %v", err)
	}

	checkConn := openIntegrationConnection(t, cfg)
	defer checkConn.Close()
	if err := Verify(ctx, checkConn); err != nil {
		t.Fatalf("controlplane.Verify after ApplyAll missing-layout repair = %v", err)
	}
}

func TestVerifyL0RejectsNeutralAppOwnedRows(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := ApplyRuntimeRequiredPacks(ctx, r); err != nil {
		t.Fatalf("apply runtime-required packs: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_Action
			(Id, ObjectApiName, Name, Label, Type, Config, OwnerPack, CreatedDate, LastModifiedDate, IsDeleted)
		VALUES
			('act_issue_sample_neutral', 'User', 'NeutralAppAction', 'Neutral App Action', 'Standard', '{}', 'jira-like-sample', NOW(), NOW(), 0)
	`); err != nil {
		t.Fatalf("seed neutral app-owned action row: %v", err)
	}

	err = VerifyL0(ctx, conn)
	if err == nil {
		t.Fatal("VerifyL0 with neutral app-owned action = nil, want contamination error")
	}
	if !strings.Contains(err.Error(), "jira-like-sample") {
		t.Fatalf("VerifyL0 error = %v, want neutral owner pack in report", err)
	}
}

func TestVerifyL0IgnoresDefaultChildRowsLiveSchemaValidation(t *testing.T) {
	ctx := context.Background()
	conn, _, _ := setupDefaultChildRowsRuntime(t, ctx)
	defer conn.Close()

	seedDefaultChildRowsRuntimeMetadata(t, ctx, conn)
	if _, err := conn.DB().ExecContext(ctx, `
		UPDATE _System_Object
		SET AppId = 'app_issue',
		    LastModifiedDate = NOW()
		WHERE ApiName = 'User'
	`); err != nil {
		t.Fatalf("seed L0 AppId contamination: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		DELETE FROM _System_Object
		WHERE ApiName = 'ChildRecord'
	`); err != nil {
		t.Fatalf("delete ChildRecord live schema: %v", err)
	}

	err := VerifyL0(ctx, conn)
	if err == nil {
		t.Fatal("VerifyL0 with invalid app DefaultChildRows + L0 contamination = nil, want contamination error")
	}
	if strings.Contains(err.Error(), "insert-rules verify-l0") {
		t.Fatalf("VerifyL0 error = %v, want VerifyL0 to ignore live DefaultChildRows validation", err)
	}
	for _, want := range []string{
		"clean L0 verification failed:",
		"ownership_gap:",
		"_System_Object rows with AppId on L0 objects without declared component ownership",
	} {
		if !strings.Contains(err.Error(), want) {
			t.Fatalf("VerifyL0 error = %v, want %q", err, want)
		}
	}
}

func TestInitL0RejectsActivityResidueBeforeIndexBackfill(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)

	conn := openIntegrationConnection(t, cfg)
	if _, err := conn.DB().ExecContext(ctx, "CREATE TABLE `task` (Id VARCHAR(255) PRIMARY KEY, WhoId VARCHAR(255) NULL, WhatId VARCHAR(255) NULL)"); err != nil {
		t.Fatalf("seed task residue table: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, "CREATE TABLE `event` (Id VARCHAR(255) PRIMARY KEY, WhoId VARCHAR(255) NULL, WhatId VARCHAR(255) NULL)"); err != nil {
		t.Fatalf("seed event residue table: %v", err)
	}

	err := InitL0(ctx, conn)
	if err == nil {
		t.Fatal("InitL0 with task/event residue = nil, want precheck failure")
	}
	if !strings.Contains(err.Error(), "precheck-l0-contamination") ||
		!strings.Contains(err.Error(), "physical tables outside the L0 table set") {
		t.Fatalf("InitL0 error = %v, want physical-table precheck failure", err)
	}

	checkConn := openIntegrationConnection(t, cfg)
	defer checkConn.Close()
	assertNoRows(t, checkConn.DB(), "activity lookup indexes created before L0 precheck",
		`SELECT COUNT(*)
		   FROM INFORMATION_SCHEMA.STATISTICS
		  WHERE TABLE_SCHEMA = DATABASE()
		    AND TABLE_NAME IN ('task', 'event')
		    AND INDEX_NAME IN ('idx_task_whatid', 'idx_task_whoid', 'idx_event_whatid', 'idx_event_whoid')`)
}

func TestVerifyL0RejectsAppMetadataSurfaces(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := ApplyRuntimeRequiredPacks(ctx, r); err != nil {
		t.Fatalf("apply runtime-required packs: %v", err)
	}

	var systemAdminPermissionSetID string
	if err := conn.DB().QueryRowContext(ctx, `
		SELECT Id
		FROM PermissionSet
		WHERE ProfileId = ?
		  AND COALESCE(IsOwnedByProfile, 0) = 1
		  AND COALESCE(IsDeleted, 0) = 0
		LIMIT 1`, constants.ProfileSystemAdmin).Scan(&systemAdminPermissionSetID); err != nil {
		t.Fatalf("query L0 profile-owned permission set: %v", err)
	}

	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_ListView
			(Id, ObjectApiName, Label, Fields, CreatedDate, LastModifiedDate)
		VALUES
			('lv_issue_all', 'Issue', 'All Issues', JSON_ARRAY('Id'), NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed app list view residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_Relationship
			(Id, ChildObjectApiName, ParentObjectApiName, FieldApiName, RelationshipName, CreatedDate, LastModifiedDate)
		VALUES
			('rel_issue_owner', 'Issue', 'User', 'OwnerId', 'Owner', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed app relationship residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_StandardAction
			(Id, Name, Label, FlowDeveloperName, OwnerPack, TargetObjects, RequiredPermissions, IsActive, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('std_issue_triage', 'triageIssue', 'Triage Issue', 'Std_TriageIssue', 'platform-ux', JSON_ARRAY('Issue'), JSON_ARRAY('ActivateOrder'), 1, 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed platform-owned app standard action residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_ActionSchema
			(Id, StandardActionId, Direction, APIName, DataType, ReferenceTo, TargetObject, MappingSourceObject, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('as_issue_target', 'missing_action', 'input', 'issueId', 'reference', 'Issue', 'Issue', 'Issue', 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed app action schema residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_ActionFieldDefault
			(Id, StandardActionId, TargetObject, FieldAPIName, ValueFormula, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('afd_issue_status', 'missing_action', 'Issue', 'Status', '"Open"', 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed app action field default residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_ActionInputGuard
			(Id, StandardActionId, Condition, GuardKey, RequiredObject, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('aig_issue_update', 'missing_action', 'true', 'object:Issue:Update', 'Issue', 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed app action input guard residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_StandardActionInternalAccessScope
			(Id, StandardActionId, ObjectApiName, Operation, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('saias_issue_update', 'missing_action', 'Issue', 'Update', 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed app action internal access scope residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_Permission
			(Id, ApiName, Label, Category, OwnerPack, CreatedDate, LastModifiedDate)
		VALUES
			('perm_activate_order_platform_owner', 'ActivateOrder', 'Activate Orders', 'Orders', 'platform-policy', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed platform-owned app permission residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_Theme
			(Id, Name, IsActive, Colors, Density, LogoUrl, CreatedDate, LastModifiedDate)
		VALUES
			('theme_issue', 'IssueTheme', 0, JSON_OBJECT('brand', '#0052CC'), 'comfortable', '/issue-logo.png', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 theme residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_UIComponent
			(Id, Name, Type, IsEmbeddable, Description, ComponentPath, CreatedDate, LastModifiedDate)
		VALUES
			('uic_issue_board', 'IssueBoard', 'page', 0, 'Issue board', '/apps/issue/Board', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 UI component residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_SetupPage
			(Id, Label, Icon, ComponentName, Category, PageOrder, PermissionRequired, IsEnabled, Description, Path, CreatedDate, LastModifiedDate)
		VALUES
			('setup_issue_admin', 'Issue Admin', 'Bug', 'IssueAdmin', 'Apps', 90, 'ViewSetup', 1, 'Manage issue settings', '/setup/issues', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 setup page residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO ReportFolder
			(Id, Name, DeveloperName, Type, AccessType, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('folder_issue_reports', 'Issue Reports', 'Issue_Reports', 'Report', 'Public', 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 report folder residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO FolderShare
			(Id, FolderId, SharedToId, SharedToType, AccessLevel, CreatedById, CreatedDate, LastModifiedDate)
		VALUES
			('fs_issue_reports_org', 'folder_issue_reports', 'ALL_INTERNAL', 'Organization', 'View', 'SYSTEM', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 folder share residue: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_PageLayout
			(Id, ObjectApiName, LayoutName, Type, IsDefault, IsDeleted, Config, Source, CreatedDate, LastModifiedDate)
		VALUES
			('layout_user_sales', 'User', 'User Sales Layout', 'record', 0, 0, JSON_OBJECT('sections', JSON_ARRAY()), 'auto_generated', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 page layout under L0 object: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_Field
			(Id, ObjectId, ApiName, Label, Type, IsDeleted, CreatedDate, LastModifiedDate)
		SELECT
			'fld_user_crm_region', Id, 'CRMRegion__c', 'CRM Region', 'string', 0, NOW(), NOW()
		FROM _System_Object
		WHERE ApiName = 'User'
		LIMIT 1
	`); err != nil {
		t.Fatalf("seed L1 field extension under L0 object: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		UPDATE _System_Field
		SET ControllingField = 'CRMRegion__c',
		    LastModifiedDate = NOW()
		WHERE Id = 'fld_user_crm_region'
	`); err != nil {
		t.Fatalf("seed L1 controlling field reference under L0 object: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO FieldPermissions
			(Id, ParentId, SobjectType, Field, PermissionsRead, PermissionsEdit, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('fp_user_crm_region', ?, 'User', 'User.CRMRegion__c', 1, 1, 0, NOW(), NOW())
	`, systemAdminPermissionSetID); err != nil {
		t.Fatalf("seed L1 field permission under L0 object: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_ListView
			(Id, ObjectApiName, Label, Fields, CreatedDate, LastModifiedDate)
		VALUES
			('lv_user_sales', 'User', 'Sales Users', JSON_ARRAY('Id', 'CRMRegion__c'), NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 list view under L0 object: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_Relationship
			(Id, ChildObjectApiName, ParentObjectApiName, FieldApiName, RelationshipName, RelatedListFields, CreatedDate, LastModifiedDate)
		VALUES
			('rel_user_crm_region', 'User', 'Profile', 'CRMRegion__c', 'CRMRegion', JSON_ARRAY('CRMRegion__c'), NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 relationship under L0 objects: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_FieldDependency
			(Id, ControllingFieldId, DependentFieldId, ControllingValue, DependentValues, CreatedDate, LastModifiedDate)
		SELECT
			'fd_user_profile_role', cf.Id, df.Id, 'standard_user', JSON_ARRAY('default_role'), NOW(), NOW()
		FROM _System_Field cf
		JOIN _System_Object co ON co.Id = cf.ObjectId
		JOIN _System_Field df ON 1 = 1
		JOIN _System_Object dep_o ON dep_o.Id = df.ObjectId
		WHERE co.ApiName = 'User'
		  AND cf.ApiName = 'ProfileId'
		  AND dep_o.ApiName = 'User'
		  AND df.ApiName = 'UserRoleId'
		LIMIT 1
	`); err != nil {
		t.Fatalf("seed L1 field dependency under L0 fields: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO SharingRule
			(Id, ObjectApiName, Name, AccessLevel, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('sr_user_sales', 'User', 'Sales_User_Sharing', 'Read', 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 sharing rule under L0 object: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO ProfileLayout
			(Id, ProfileId, ObjectApiName, LayoutId, CreatedDate, LastModifiedDate)
		VALUES
			('pl_user_sales', ?, 'User', 'layout_user_sales', NOW(), NOW())
	`, constants.ProfileSystemAdmin); err != nil {
		t.Fatalf("seed L1 profile layout under L0 object: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_ApprovalProcess
			(Id, Name, ObjectApiName, Description, IsActive, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('ap_user_sales', 'UserSalesApproval', 'User', 'Sales approval extension', 1, 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 approval process under L0 object: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO ProcessDefinition
			(Id, Name, DeveloperName, State, TableEnumOrId, IsActive, CreatedDate, LastModifiedDate)
		VALUES
			('pd_user_sales', 'User Sales Approval', 'User_Sales_Approval', 'Active', 'User', 1, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 process definition under L0 object: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_LayoutAssignment
			(Id, ObjectApiName, LayoutId, ProfileId, Specificity, RouteSource, CreatedDate, LastModifiedDate)
		VALUES
			('la_user_sales', 'User', 'layout_user_sales', ?, 1, 'managed_seed', NOW(), NOW())
	`, constants.ProfileSystemAdmin); err != nil {
		t.Fatalf("seed L1 layout assignment under L0 object: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_ObjectFieldMapping
			(Id, SourceObject, TargetObject, ActionType, SourceField, TargetField, SortOrder, IsCustomized, Source, IsActive, CreatedDate, LastModifiedDate)
		VALUES
			('ofm_user_profile', 'User', 'Profile', 'sync', 'ProfileId', 'Id', 0, 0, 'standard', 1, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 object field mapping under L0 objects: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_WorkflowAlert
			(Id, ObjectApiName, Name, Description, CreatedDate, LastModifiedDate)
		VALUES
			('wa_user_sales', 'User', 'UserSalesAlert', 'Sales alert extension', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 workflow alert under L0 object: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO `+"`Group`"+`
			(Id, Name, DeveloperName, Label, Type, CreatedDate, LastModifiedDate, IsDeleted)
		VALUES
			('queue_user_sales', 'User Sales Queue', 'UserSalesQueue', 'User Sales Queue', 'Queue', NOW(), NOW(), 0)
	`); err != nil {
		t.Fatalf("seed L1 queue under clean L0: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO QueueSobject
			(Id, QueueId, SobjectType, CreatedDate, LastModifiedDate)
		VALUES
			('qs_issue', 'missing_issue_queue', 'Issue', NOW(), NOW()),
			('qs_user_sales', 'queue_user_sales', 'User', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 queue sobject bindings: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO PermissionSetAssignment
			(Id, PermissionSetId, AssigneeId, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('psa_profile_owned', ?, '10000000-0000-0000-0000-000000000001', 0, NOW(), NOW())
	`, systemAdminPermissionSetID); err != nil {
		t.Fatalf("seed direct profile-owned permission set assignment: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO PermissionSetGroup
			(Id, ApiName, Label, IsActive, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('psg_sales_ops', 'SalesOps', 'Sales Ops', 1, 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 permission set group: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO PermissionSetGroupComponent
			(Id, GroupId, PermissionSetId, CreatedDate, LastModifiedDate)
		VALUES
			('psgc_sales_ops_admin', 'psg_sales_ops', ?, NOW(), NOW())
	`, systemAdminPermissionSetID); err != nil {
		t.Fatalf("seed L1 permission set group component: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO PermissionSetGroupAssignment
			(Id, GroupId, AssigneeId, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('psga_sales_ops_admin', 'psg_sales_ops', '10000000-0000-0000-0000-000000000001', 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 permission set group assignment: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO MutingPermissionSet
			(Id, ApiName, Label, GroupId, CreatedDate, LastModifiedDate)
		VALUES
			('mps_sales_ops', 'SalesOpsMuted', 'Sales Ops Muted', 'psg_sales_ops', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 muting permission set: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_MutingPermissionSetPermission
			(Id, MutingPermissionSetId, PermissionApiName, CreatedDate, LastModifiedDate)
		VALUES
			('mpp_sales_ops_activate_order', 'mps_sales_ops', 'ActivateOrder', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 muting permission set permission: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_ConnectedApp
			(Id, Name, ConsumerKey, ConsumerSecret, CreatedDate, LastModifiedDate)
		VALUES
			('ca_issue_app', 'Issue App', 'issue-app', 'secret', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 connected app: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_ConnectedAppAccess
			(Id, ConnectedAppId, ProfileId, CreatedDate, LastModifiedDate)
		VALUES
			('caa_issue_profile', 'ca_issue_app', ?, NOW(), NOW())
	`, constants.ProfileSystemAdmin); err != nil {
		t.Fatalf("seed L1 connected app access: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_CustomPermission
			(Id, ApiName, Label, IsActive, ConnectedAppId, OwnerPack, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('cp_issue_triage', 'IssueTriage', 'Issue Triage', 1, 'ca_issue_app', 'jira-like-sample', 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 custom permission: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO ProfileCustomPermission
			(Id, ProfileId, CustomPermissionId, CreatedDate, LastModifiedDate)
		VALUES
			('pcp_issue_triage', ?, 'cp_issue_triage', NOW(), NOW())
	`, constants.ProfileSystemAdmin); err != nil {
		t.Fatalf("seed L1 profile custom permission: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO PermissionSetCustomPermission
			(Id, PermissionSetId, CustomPermissionId, CreatedDate, LastModifiedDate)
		VALUES
			('pscp_issue_triage', ?, 'cp_issue_triage', NOW(), NOW())
	`, systemAdminPermissionSetID); err != nil {
		t.Fatalf("seed L1 permission-set custom permission: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO ProfileTabSetting
			(Id, ProfileId, TabName, Visibility, CreatedDate, LastModifiedDate)
		VALUES
			('pts_issue', ?, 'Issue', 'DefaultOn', NOW(), NOW())
	`, constants.ProfileSystemAdmin); err != nil {
		t.Fatalf("seed L1 profile tab setting: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO PermissionSetTabSetting
			(Id, PermissionSetId, TabName, Visibility, CreatedDate, LastModifiedDate)
		VALUES
			('psts_user', ?, 'User', 'Available', NOW(), NOW())
	`, systemAdminPermissionSetID); err != nil {
		t.Fatalf("seed L1 permission-set tab setting: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_App
			(Id, Name, Label, NavigationItems, UtilityItems, AssignedProfiles, CreatedDate, LastModifiedDate)
		VALUES
			('app_issue', 'IssueApp', 'Issue App', JSON_ARRAY('Issue'), JSON_ARRAY(), JSON_ARRAY(), NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 app: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		UPDATE _System_Object
		SET AppId = 'app_issue',
		    ListFieldsCustomized = 1,
		    LastModifiedDate = NOW()
		WHERE ApiName = 'User'
	`); err != nil {
		t.Fatalf("seed L1 object payload flags under L0 object: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO ProfileAppVisibility
			(Id, ProfileId, AppId, IsVisible, IsDefault, CreatedDate, LastModifiedDate)
		VALUES
			('pav_issue', ?, 'app_issue', 1, 0, NOW(), NOW())
	`, constants.ProfileSystemAdmin); err != nil {
		t.Fatalf("seed L1 profile app visibility: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO PermissionSetAppVisibility
			(Id, PermissionSetId, AppId, IsVisible, CreatedDate, LastModifiedDate)
		VALUES
			('psav_issue', ?, 'app_issue', 1, NOW(), NOW())
	`, systemAdminPermissionSetID); err != nil {
		t.Fatalf("seed L1 permission-set app visibility: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO AppMenuItem
			(Id, Label, Type, AppId, IsVisible, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('ami_issue', 'Issue', 'Object', 'app_issue', 1, 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 app menu item: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO AppMenuItem
			(Id, Label, Description, StartUrl, Type, IsVisible, SortOrder, AppId, Icon, Color, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('ami_orphan_issue', 'Issue Orphan', 'Issue orphan nav', '/issue-orphan', 'App', 1, 0, NULL, 'Bug', '#0052CC', 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed orphan L1 app menu item: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO ProcessNode
			(Id, Name, DeveloperName, ProcessDefinitionId, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('pn_user_sales_step', 'User Sales Step', 'User_Sales_Step', 'pd_user_sales', 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 process node: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO ProcessAction
			(Id, Name, ProcessDefinitionId, ProcessNodeId, ActionType, ActionEvent, FieldApiName, IsDeleted, CreatedDate, LastModifiedDate)
		VALUES
			('pa_user_sales_region', 'Set CRM Region', 'pd_user_sales', 'pn_user_sales_step', 'FieldUpdate', 'StepApproval', 'CRMRegion__c', 0, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 process action: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_PageLayoutHistory
			(Id, LayoutId, VersionNumber, Config, ChangeReason, CreatedDate, LastModifiedDate)
		VALUES
			('plh_user_sales_v1', 'layout_user_sales', 1, JSON_OBJECT('sections', JSON_ARRAY()), 'auto_generate', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 page layout history: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_AutoNumberCounter
			(Id, FieldId, ScopeKey, NextValue, CreatedDate, LastModifiedDate)
		VALUES
			('anc_user_crm_region', 'fld_user_crm_region', '', 1, NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed L1 auto number counter: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_RecordType
			(Id, ObjectId, Name, IsActive, IsMaster, IsDeleted, OwnerPack, CreatedDate, LastModifiedDate)
		VALUES
			('rt_missing_parent', 'missing_object_id', 'MissingParentType', 1, 0, 0, 'platform-policy', NOW(), NOW())
	`); err != nil {
		t.Fatalf("seed record type with missing parent object: %v", err)
	}

	err = verifyNoL0Contamination(ctx, conn.DB())
	if err == nil {
		t.Fatal("verifyNoL0Contamination with app metadata surfaces = nil, want error")
	}
	for _, want := range []string{
		"_System_ListView",
		"_System_Relationship",
		"_System_Field rows under L0 objects outside the canonical L0 field set",
		"_System_Field rows whose ControllingField is outside the canonical L0 field set",
		"_System_Object rows with AppId on L0 objects without declared component ownership",
		"_System_Object rows with customized ListFields on L0 objects without declared component ownership",
		"FieldPermissions rows under L0 objects outside the canonical L0 field set",
		"_System_ListView rows on L0 objects without L0 component ownership",
		"_System_Relationship rows outside the canonical L0 relationship set",
		"_System_Relationship rows whose RelatedListFields are outside the canonical L0 field set",
		"_System_PageLayout rows on L0 objects without declared L0 component ownership",
		"_System_FieldDependency rows on canonical L0 fields without L0 component ownership",
		"SharingRule rows on L0 objects without L0 component ownership",
		"ProfileLayout rows on L0 objects without L0 component ownership",
		"_System_ApprovalProcess rows on L0 objects without L0 component ownership",
		"ProcessDefinition rows on L0 objects without L0 component ownership",
		"_System_LayoutAssignment rows on L0 objects without declared L0 component ownership",
		"_System_ObjectFieldMapping rows on L0 objects without L0 component ownership",
		"_System_WorkflowAlert rows on L0 objects without L0 component ownership",
		"_System_StandardAction rows stamped with runtime OwnerPack but missing declared component manifest entry",
		"_System_StandardAction TargetObjects",
		"_System_StandardAction RequiredPermissions",
		"_System_Theme rows outside the runtime component manifest",
		"_System_UIComponent rows outside the runtime component manifest",
		"_System_SetupPage rows outside the runtime component manifest",
		"ReportFolder rows outside the runtime component manifest",
		"FolderShare rows outside the runtime component manifest",
		"_System_ActionSchema",
		"_System_ActionFieldDefault",
		"_System_ActionInputGuard",
		"_System_StandardActionInternalAccessScope",
		"_System_Permission rows stamped with runtime OwnerPack but missing declared component manifest entry",
		"_System_Permission rows outside the platform permission catalog",
		"QueueSobject rows where SobjectType is outside the L0 object set",
		"QueueSobject rows on L0 objects without L0 component ownership",
		"QueueSobject rows missing parent Queue group",
		"Queue groups present in clean L0",
		"PermissionSetAssignment rows present in clean L0",
		"PermissionSetGroup rows present in clean L0",
		"PermissionSetGroupComponent rows present in clean L0",
		"PermissionSetGroupAssignment rows present in clean L0",
		"MutingPermissionSet rows present in clean L0",
		"_System_MutingPermissionSetPermission rows whose PermissionApiName is outside the platform permission catalog",
		"_System_MutingPermissionSetPermission rows present in clean L0",
		"_System_ConnectedAppAccess rows for non-platform connected apps",
		"ProfileCustomPermission rows whose custom permission is owned by non-L0 packs",
		"PermissionSetCustomPermission rows whose custom permission is owned by non-L0 packs",
		"ProfileTabSetting rows where TabName is outside the L0 object set",
		"PermissionSetTabSetting rows on L0 objects without L0 component ownership",
		"ProfileAppVisibility rows with app visibility/menu metadata in clean L0",
		"PermissionSetAppVisibility rows with app visibility/menu metadata in clean L0",
		"AppMenuItem rows outside the runtime component manifest",
		"AppMenuItem rows with app visibility/menu metadata in clean L0",
		"_System_App rows present in clean L0",
		"ProcessNode rows under L0 ProcessDefinition without L0 component ownership",
		"ProcessAction rows under L0 ProcessDefinition without L0 component ownership",
		"ProcessAction rows whose FieldApiName is outside the canonical L0 field set",
		"_System_PageLayoutHistory rows under L0 layouts without L0 component ownership",
		"_System_AutoNumberCounter rows under L0 fields without L0 component ownership",
		"_System_RecordType rows missing parent _System_Object",
	} {
		if !strings.Contains(err.Error(), want) {
			t.Fatalf("verifyNoL0Contamination error = %v, want %q", err, want)
		}
	}
}

func TestVerifyL0ReportsCustomizedDefaultChildRowsOnL0Objects(t *testing.T) {
	ctx := context.Background()
	conn, _, _ := setupDefaultChildRowsRuntime(t, ctx)
	defer conn.Close()

	if _, err := conn.DB().ExecContext(ctx, `
		UPDATE _System_Object
		SET DefaultChildRowsCustomized = 1,
		    LastModifiedDate = NOW()
		WHERE ApiName = 'User'
	`); err != nil {
		t.Fatalf("seed L0 DefaultChildRowsCustomized contamination: %v", err)
	}

	err := VerifyL0(ctx, conn)
	if err == nil {
		t.Fatal("VerifyL0 with customized DefaultChildRows on L0 object = nil, want ownership-gap error")
	}
	for _, want := range []string{
		"clean L0 verification failed:",
		"ownership_gap:",
		"_System_Object rows with customized DefaultChildRows on L0 objects without declared component ownership",
	} {
		if !strings.Contains(err.Error(), want) {
			t.Fatalf("VerifyL0 error = %v, want %q", err, want)
		}
	}
}

func TestVerifyL0RejectsDefaultChildRowsPayloadOnL0Objects(t *testing.T) {
	ctx := context.Background()
	conn, _, _ := setupDefaultChildRowsRuntime(t, ctx)
	defer conn.Close()

	if _, err := conn.DB().ExecContext(ctx, `
		UPDATE _System_Object
		SET DefaultChildRows = '[{"targetObject":"ChildRecord","targetLookupField":"ParentRecordId","fieldValues":{"Name":"Seeded child","SortOrder":1}}]',
		    DefaultChildRowsCustomized = 0,
		    LastModifiedDate = NOW()
		WHERE ApiName = 'User'
	`); err != nil {
		t.Fatalf("seed L0 DefaultChildRows payload contamination: %v", err)
	}

	err := VerifyL0(ctx, conn)
	if err == nil {
		t.Fatal("VerifyL0 with DefaultChildRows payload on L0 object = nil, want ownership-gap error")
	}
	for _, want := range []string{
		"clean L0 verification failed:",
		"ownership_gap:",
		"_System_Object DefaultChildRows payload on L0 objects without declared component ownership",
	} {
		if !strings.Contains(err.Error(), want) {
			t.Fatalf("VerifyL0 error = %v, want %q", err, want)
		}
	}
}

func TestVerifyChecksInstalledSourceBackedCRMPackPageLayoutDrift(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("apply packs: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify with installed CRM: %v", err)
	}

	res, err := conn.DB().ExecContext(ctx, `
UPDATE _System_PageLayout
SET Config = JSON_SET(Config, '$.sections[0].label', ?)
WHERE Id = ?`,
		"Drifted Account Information",
		"curated_Account_default")
	if err != nil {
		t.Fatalf("update CRM page layout drift fixture: %v", err)
	}
	if n, _ := res.RowsAffected(); n == 0 {
		t.Fatal("CRM page layout drift fixture did not update any rows")
	}

	err = Verify(ctx, conn)
	if err == nil {
		t.Fatal("controlplane.Verify after CRM page-layout drift = nil, want error")
	}
	if !strings.Contains(err.Error(), "curated Account layout config drifted") {
		t.Fatalf("Verify error = %v, want curated Account layout drift failure", err)
	}
}

func TestVerifyChecksInstalledSourceBackedCRMPackStandardActionSatellites(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("apply packs: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify with installed CRM: %v", err)
	}

	res, err := conn.DB().ExecContext(ctx, `
UPDATE _System_ActionSchema s
JOIN _System_StandardAction a ON a.Id = s.StandardActionId
SET s.DataType = ?
WHERE a.Name = ? AND s.Direction = ? AND s.APIName = ?`,
		"string", "convertLead", "input", "leadId")
	if err != nil {
		t.Fatalf("update standard action schema drift fixture: %v", err)
	}
	if n, _ := res.RowsAffected(); n == 0 {
		t.Fatal("standard action schema drift fixture did not update any rows")
	}

	err = Verify(ctx, conn)
	if err == nil {
		t.Fatal("controlplane.Verify after standard action schema drift = nil, want error")
	}
	if !strings.Contains(err.Error(), "schema input/leadId DataType") {
		t.Fatalf("Verify error = %v, want standard action satellite drift failure", err)
	}
}

func TestVerifyChecksInstalledSourceBackedCRMPackInternalAccessScopeDrift(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("apply packs: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify with installed CRM: %v", err)
	}

	var actionID string
	if err := conn.DB().QueryRowContext(ctx, `
SELECT Id
FROM _System_StandardAction
WHERE Name = ? AND IsDeleted = 0
LIMIT 1`, "convertLead").Scan(&actionID); err != nil {
		t.Fatalf("query convertLead standard action: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
INSERT INTO _System_StandardActionInternalAccessScope
	(Id, StandardActionId, ObjectApiName, Operation, Reason, IsActive, IsDeleted, CreatedDate, LastModifiedDate)
VALUES
	(?, ?, ?, ?, ?, 1, 0, NOW(), NOW())`,
		"test_rogue_convertlead_internal_scope", actionID, "User", "Delete", "rogue drift fixture"); err != nil {
		t.Fatalf("insert rogue internal access scope drift fixture: %v", err)
	}

	err = Verify(ctx, conn)
	if err == nil {
		t.Fatal("controlplane.Verify after internal access scope drift = nil, want error")
	}
	if !strings.Contains(err.Error(), "internal access scope User/Delete is active but not declared") {
		t.Fatalf("Verify error = %v, want internal access scope drift failure", err)
	}
}

func TestVerifyChecksInstalledSourceBackedCRMPackPermissions(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("apply packs: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify with installed CRM: %v", err)
	}

	if _, err := conn.DB().ExecContext(ctx, "UPDATE _System_Permission SET Label = ? WHERE ApiName = ?", "Drifted Activate Orders", "ActivateOrder"); err != nil {
		t.Fatalf("update CRM permission drift fixture: %v", err)
	}
	err = Verify(ctx, conn)
	if err == nil {
		t.Fatal("controlplane.Verify after CRM permission drift = nil, want error")
	}
	if !strings.Contains(err.Error(), "system permission catalog salesforce-crm-standard drift") {
		t.Fatalf("Verify error = %v, want CRM permission catalog drift failure", err)
	}
}

func TestSourceBackedCRMPackActionApplyClaimsLegacyBusinessKey(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_Action
			(Id, ObjectApiName, Name, Label, Type, Icon, TargetObject, Config, CreatedDate, LastModifiedDate, IsDeleted)
		VALUES
			('legacy-createquote-action', 'Opportunity', 'CreateQuote', 'Legacy Create Quote', 'Standard', 'OldIcon', 'Quote', '{}', NOW(), NOW(), 0)
	`); err != nil {
		t.Fatalf("seed legacy CRM action row: %v", err)
	}

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("apply packs: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify after legacy action claim: %v", err)
	}

	var id, ownerPack, label string
	var isDeleted int
	if err := conn.DB().QueryRowContext(ctx, `
		SELECT Id, COALESCE(OwnerPack, ''), Label, IsDeleted
		FROM _System_Action
		WHERE ObjectApiName = 'Opportunity' AND Name = 'CreateQuote'
	`).Scan(&id, &ownerPack, &label, &isDeleted); err != nil {
		t.Fatalf("query claimed legacy action: %v", err)
	}
	if id != "legacy-createquote-action" {
		t.Fatalf("claimed action Id = %q, want legacy-createquote-action", id)
	}
	if ownerPack != "salesforce-crm-standard" {
		t.Fatalf("claimed action OwnerPack = %q, want salesforce-crm-standard", ownerPack)
	}
	if label != "Create Quote" {
		t.Fatalf("claimed action Label = %q, want Create Quote", label)
	}
	if isDeleted != 0 {
		t.Fatalf("claimed action IsDeleted = %d, want 0", isDeleted)
	}
}

func TestSourceBackedCRMPackActionApplyIgnoresOwnerlessTenantAction(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("apply packs: %v", err)
	}
	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_Action
			(Id, ObjectApiName, Name, Label, Type, Icon, Config, CreatedDate, LastModifiedDate, IsDeleted)
		VALUES
			('act_account_tenantcustom', 'Account', 'TenantCustom', 'Tenant Custom', 'Standard', 'Bolt', '{}', NOW(), NOW(), 0)
	`); err != nil {
		t.Fatalf("seed ownerless tenant action row: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify with ownerless tenant action: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("re-apply packs with ownerless tenant action: %v", err)
	}

	var ownerPack string
	var isDeleted int
	if err := conn.DB().QueryRowContext(ctx, `
		SELECT COALESCE(OwnerPack, ''), IsDeleted
		FROM _System_Action
		WHERE Id = 'act_account_tenantcustom'
	`).Scan(&ownerPack, &isDeleted); err != nil {
		t.Fatalf("query ownerless tenant action: %v", err)
	}
	if ownerPack != "" {
		t.Fatalf("tenant action OwnerPack = %q, want empty", ownerPack)
	}
	if isDeleted != 0 {
		t.Fatalf("tenant action IsDeleted = %d, want 0", isDeleted)
	}
}

func TestVerifyChecksInstalledSourceBackedCRMPackPhysicalSchema(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("apply packs: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify with installed CRM: %v", err)
	}

	indexName := campaignMemberStatusCampaignIndex(t, conn.DB())
	if _, err := conn.DB().ExecContext(ctx, fmt.Sprintf("ALTER TABLE `CampaignMemberStatus` DROP INDEX `%s`", indexName)); err != nil {
		t.Fatalf("drop CampaignMemberStatus CampaignId index drift fixture: %v", err)
	}
	err = Verify(ctx, conn)
	if err == nil {
		t.Fatal("controlplane.Verify after CRM physical schema drift = nil, want error")
	}
	if !strings.Contains(err.Error(), "pack object physical schema drift") {
		t.Fatalf("Verify error = %v, want physical schema drift failure", err)
	}

	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("re-apply packs after index drift: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify after re-apply repaired index: %v", err)
	}
}

func TestSourceBackedCRMPackApplyReconcilesLegacyTableRegistryClassification(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	if _, err := conn.DB().ExecContext(ctx, `
		INSERT INTO _System_Table
			(Id, TableName, TableType, Category, Description, IsManaged, SchemaVersion, CreatedBy, CreatedDate, IsDeleted, LastModifiedDate)
		VALUES
			('legacy-campaignmemberstatus-table', 'CampaignMemberStatus', 'system_core', 'registry', 'legacy stale registry row', 1, 'legacy', 'bootstrap', NOW(), 1, NOW())
	`); err != nil {
		t.Fatalf("seed legacy CampaignMemberStatus table registry row: %v", err)
	}

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("apply packs with legacy CampaignMemberStatus table registry row: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify after legacy table registry reconcile: %v", err)
	}

	var tableType, category, description, schemaVersion string
	var isManaged, isDeleted int
	if err := conn.DB().QueryRowContext(ctx, `
		SELECT TableType, Category, COALESCE(Description, ''), IsManaged, COALESCE(SchemaVersion, ''), IsDeleted
		FROM _System_Table
		WHERE TableName = 'CampaignMemberStatus'
	`).Scan(&tableType, &category, &description, &isManaged, &schemaVersion, &isDeleted); err != nil {
		t.Fatalf("query reconciled CampaignMemberStatus table registry row: %v", err)
	}
	if tableType != string(constants.TableTypeStandardObject) {
		t.Fatalf("CampaignMemberStatus TableType = %q, want %q", tableType, constants.TableTypeStandardObject)
	}
	if category != "crm" {
		t.Fatalf("CampaignMemberStatus Category = %q, want crm", category)
	}
	if description != "Defines available status values for campaign members per campaign" {
		t.Fatalf("CampaignMemberStatus Description = %q", description)
	}
	if isManaged != 1 {
		t.Fatalf("CampaignMemberStatus IsManaged = %d, want 1", isManaged)
	}
	if schemaVersion != "" {
		t.Fatalf("CampaignMemberStatus SchemaVersion = %q, want empty pack definition value", schemaVersion)
	}
	if isDeleted != 0 {
		t.Fatalf("CampaignMemberStatus IsDeleted = %d, want 0", isDeleted)
	}
}

func TestSourceBackedCRMPackApplyReconcilesLegacyNumericColumnShape(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	if _, err := conn.DB().ExecContext(ctx, `
		CREATE TABLE CampaignMemberStatus (
			Id VARCHAR(255) PRIMARY KEY,
			SortOrder INT NULL
		)
	`); err != nil {
		t.Fatalf("seed legacy CampaignMemberStatus physical table: %v", err)
	}

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("apply packs with legacy CampaignMemberStatus.SortOrder INT column: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify after legacy numeric column reconcile: %v", err)
	}
	if got := physicalColumnType(t, conn.DB(), "CampaignMemberStatus", "SortOrder"); got != "decimal(65,30)" {
		t.Fatalf("CampaignMemberStatus.SortOrder physical type = %q, want decimal(65,30)", got)
	}
}

func TestVerifyChecksInstalledSourceBackedCRMPackPhysicalColumnShape(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()

	conn := initializeControlPlaneMetadata(t, ctx, cfg)
	defer conn.Close()

	r, err := NewRunner(conn)
	if err != nil {
		t.Fatalf("new runner: %v", err)
	}
	if err := r.RefreshCache(ctx); err != nil {
		t.Fatalf("initial cache refresh: %v", err)
	}
	if err := installSourceBackedCRMPack(t, ctx, r); err != nil {
		t.Fatalf("apply packs: %v", err)
	}
	if err := Verify(ctx, conn); err != nil {
		t.Fatalf("controlplane.Verify with installed CRM: %v", err)
	}

	if _, err := conn.DB().ExecContext(ctx, "ALTER TABLE `CampaignMemberStatus` MODIFY COLUMN `SortOrder` INT NULL"); err != nil {
		t.Fatalf("drift CampaignMemberStatus.SortOrder physical type: %v", err)
	}
	err = Verify(ctx, conn)
	if err == nil {
		t.Fatal("controlplane.Verify after CRM physical column type drift = nil, want error")
	}
	if !strings.Contains(err.Error(), "physical column CampaignMemberStatus.SortOrder shape") {
		t.Fatalf("Verify error = %v, want physical column shape drift failure", err)
	}
}

func initializeControlPlaneMetadata(t *testing.T, ctx context.Context, cfg *mysql.Config) *database.TiDBConnection {
	t.Helper()

	conn := openIntegrationConnection(t, cfg)
	if err := fieldProvenanceInitializer.InitFieldProvenance(fieldProvenanceInitializer.DefaultPlatformStandardFields()); err != nil {
		t.Fatalf("initialize field provenance: %v", err)
	}
	if err := schemaProvisioner.InitializeSchema(conn); err != nil {
		t.Fatalf("initialize schema: %v", err)
	}
	_ = conn.Close()

	conn = openIntegrationConnection(t, cfg)
	if err := ReconcileManagedStandardObjectAccessPolicies(conn.DB()); err != nil {
		t.Fatalf("reconcile managed standard object access policies: %v", err)
	}
	schemaProvisioner.ReconcileSystemObjectTableTypes(ctx, conn.DB())
	if err := ReconcileManagedSystemObjectVisibility(conn.DB(), managedTableDefinitions()); err != nil {
		t.Fatalf("reconcile managed system object visibility: %v", err)
	}
	schemaProvisioner.EnsureFolderSharingModels(ctx, conn.DB())
	return conn
}

func assertHasActionSchemaPrefillSourceFieldColumn(t *testing.T, db *sql.DB) {
	t.Helper()
	assertActionSchemaPrefillSourceFieldColumnPresence(t, db, 1)
}

func assertMissingActionSchemaPrefillSourceFieldColumn(t *testing.T, db *sql.DB) {
	t.Helper()
	assertActionSchemaPrefillSourceFieldColumnPresence(t, db, 0)
}

func assertActionSchemaPrefillSourceFieldColumnPresence(t *testing.T, db *sql.DB, want int) {
	t.Helper()
	assertPhysicalColumnPresence(t, db, "_System_ActionSchema", "PrefillSourceFieldAPIName", want)
}

func assertPhysicalColumnPresence(t *testing.T, db *sql.DB, tableName, columnName string, want int) {
	t.Helper()
	var got int
	err := db.QueryRow(`
		SELECT COUNT(*)
		FROM INFORMATION_SCHEMA.COLUMNS
		WHERE TABLE_SCHEMA = DATABASE()
		  AND TABLE_NAME = ?
		  AND COLUMN_NAME = ?
	`, tableName, columnName).Scan(&got)
	if err != nil {
		t.Fatalf("query %s.%s column presence: %v", tableName, columnName, err)
	}
	if got != want {
		t.Fatalf("%s.%s column count = %d, want %d", tableName, columnName, got, want)
	}
}

func installSourceBackedCRMPack(t *testing.T, ctx context.Context, r *Runner) error {
	t.Helper()
	if err := ApplyRuntimeRequiredPacks(ctx, r); err != nil {
		return err
	}
	t.Setenv(packs.OfficialAppPacksRootEnvVar, officialPackRootFromControlplaneTest(t))
	return InstallPackFromSource(ctx, r, "official_repo:salesforce-crm-standard")
}

func driftInstalledObjectKeyPrefix(t *testing.T, ctx context.Context, db *sql.DB, objectAPIName string) {
	t.Helper()

	if _, err := db.ExecContext(ctx, `
		UPDATE _System_Object
		SET KeyPrefix = NULL,
		    LastModifiedDate = NOW()
		WHERE ApiName = ?
		  AND COALESCE(IsDeleted, 0) = 0
	`, objectAPIName); err != nil {
		t.Fatalf("drift %s KeyPrefix: %v", objectAPIName, err)
	}
}

func assertInstalledObjectKeyPrefix(t *testing.T, ctx context.Context, db *sql.DB, objectAPIName string, want string) {
	t.Helper()

	var got sql.NullString
	if err := db.QueryRowContext(ctx, `
		SELECT KeyPrefix
		  FROM _System_Object
		 WHERE ApiName = ?
		   AND COALESCE(IsDeleted, 0) = 0
		 LIMIT 1`, objectAPIName,
	).Scan(&got); err != nil {
		t.Fatalf("query _System_Object.KeyPrefix for %s: %v", objectAPIName, err)
	}
	if !got.Valid || got.String != want {
		t.Fatalf("%s KeyPrefix = %q valid=%v, want %q", objectAPIName, got.String, got.Valid, want)
	}
}

func assertFlowSourceCount(t *testing.T, db *sql.DB, source string, want int) {
	t.Helper()

	var got int
	if err := db.QueryRow(`
		SELECT COUNT(*)
		  FROM Flow
		 WHERE Id LIKE 'flowver_std_%'
		   AND Source = ?`,
		source,
	).Scan(&got); err != nil {
		t.Fatalf("count standard Flow rows with Source=%q: %v", source, err)
	}
	if got != want {
		t.Fatalf("Flow Source=%q count = %d, want %d", source, got, want)
	}
}

// liveStandardFlowSeedCount returns the number of standard flows declared in
// the CRM pack manifest, resolved via packs.SourceBackedPack — the strict
// manifest decoder that the source-backed install path also drives. The
// install seed-write loop and this helper both iterate the standardFlowPayloads
// map populated by collectSourceBackedRuntimePayloads, so the backfill proof's
// expected count stays bound to a single manifest oracle.
func liveStandardFlowSeedCount(t *testing.T) int {
	t.Helper()
	opts := packs.DefaultPackSourceOptions()
	opts.OfficialRepoRoot = officialPackRootFromControlplaneTest(t)
	source, diagnostics := packs.ResolvePackSourceWithOptions("official_repo:salesforce-crm-standard", opts)
	if len(diagnostics) > 0 {
		t.Fatalf("resolve CRM pack source: %v", diagnostics)
	}
	pack, err := packs.NewSourceBackedPack(source)
	if err != nil {
		t.Fatalf("construct CRM source-backed pack: %v", err)
	}
	names := pack.StandardFlowDeveloperNames()
	if len(names) == 0 {
		t.Fatalf("no standard flows in CRM pack (empty manifest would silently pass the backfill proof)")
	}
	return len(names)
}

func campaignMemberStatusCampaignIndex(t *testing.T, db *sql.DB) string {
	t.Helper()

	var indexName string
	err := db.QueryRow(
		`SELECT INDEX_NAME
		 FROM INFORMATION_SCHEMA.STATISTICS
		 WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'CampaignMemberStatus'
		 GROUP BY INDEX_NAME, NON_UNIQUE
		 HAVING GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) = 'CampaignId'
		 LIMIT 1`,
	).Scan(&indexName)
	if err != nil {
		t.Fatalf("find CampaignMemberStatus CampaignId index: %v", err)
	}
	return indexName
}

func physicalColumnType(t *testing.T, db *sql.DB, tableName, columnName string) string {
	t.Helper()

	var columnType string
	err := db.QueryRow(
		`SELECT LOWER(COLUMN_TYPE)
		 FROM INFORMATION_SCHEMA.COLUMNS
		 WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,
		tableName,
		columnName,
	).Scan(&columnType)
	if err != nil {
		t.Fatalf("find physical column %s.%s: %v", tableName, columnName, err)
	}
	return columnType
}

func physicalColumnNullable(t *testing.T, db *sql.DB, tableName, columnName string) bool {
	t.Helper()

	var nullable string
	err := db.QueryRow(
		`SELECT IS_NULLABLE
		 FROM INFORMATION_SCHEMA.COLUMNS
		 WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?`,
		tableName,
		columnName,
	).Scan(&nullable)
	if err != nil {
		t.Fatalf("find physical column nullability %s.%s: %v", tableName, columnName, err)
	}
	return strings.EqualFold(nullable, "YES")
}

func assertCleanL0NoAppResidue(t *testing.T, ctx context.Context, db *sql.DB) {
	t.Helper()
	if err := verifyNoL0Contamination(ctx, db); err != nil {
		t.Fatalf("clean L0 contamination scan failed: %v", err)
	}
}

func assertCleanL0PermissionsStillSeeded(t *testing.T, db *sql.DB) {
	t.Helper()
	assertSomeRows(t, db, "platform system permissions",
		"SELECT COUNT(*) FROM _System_Permission WHERE ApiName IN ('ModifyAllData', 'ViewSetup') AND IsActive = 1")
	assertSomeRows(t, db, "platform object permissions",
		"SELECT COUNT(*) FROM ObjectPermissions WHERE SobjectType IN ('User', 'Profile') AND IsDeleted = 0")
}

func newTemporaryIntegrationDatabase(t *testing.T) (*mysql.Config, func()) {
	t.Helper()

	host := os.Getenv("TIDB_HOST")
	if host == "" {
		host = "127.0.0.1"
	}
	port := os.Getenv("TIDB_PORT")
	if port == "" {
		port = "4000"
	}
	user := os.Getenv("TIDB_USER")
	if user == "" {
		user = "root"
	}

	cfg := &mysql.Config{
		User:                 user,
		Passwd:               os.Getenv("TIDB_PASSWORD"),
		Net:                  "tcp",
		Addr:                 host + ":" + port,
		Params:               map[string]string{"charset": "utf8mb4", "collation": "utf8mb4_unicode_ci"},
		ParseTime:            true,
		Loc:                  time.Local,
		AllowNativePasswords: true,
	}
	if host != "127.0.0.1" && host != "localhost" {
		tlsName := fmt.Sprintf("tidb_clean_l0_%d", time.Now().UnixNano())
		if err := mysql.RegisterTLSConfig(tlsName, &tls.Config{
			MinVersion: tls.VersionTLS12,
			ServerName: host,
		}); err == nil {
			cfg.TLSConfig = tlsName
		}
	}

	adminDB, err := sql.Open("mysql", cfg.FormatDSN())
	if err != nil {
		t.Fatalf("open admin TiDB connection: %v", err)
	}
	if err := adminDB.Ping(); err != nil {
		_ = adminDB.Close()
		t.Skipf("skipping integration test: TiDB is not reachable at %s:%s: %v", host, port, err)
	}

	dbName := fmt.Sprintf("nexuscrm_clean_l0_%d", time.Now().UnixNano())
	if _, err := adminDB.Exec("CREATE DATABASE `" + dbName + "` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); err != nil {
		_ = adminDB.Close()
		t.Skipf("skipping integration test: cannot create temporary database %s: %v", dbName, err)
	}

	testCfg := *cfg
	testCfg.DBName = dbName
	cleanup := func() {
		_, _ = adminDB.Exec("DROP DATABASE IF EXISTS `" + dbName + "`")
		_ = adminDB.Close()
	}
	return &testCfg, cleanup
}

func openIntegrationConnection(t *testing.T, cfg *mysql.Config) *database.TiDBConnection {
	t.Helper()
	rawDB, err := sql.Open("mysql", cfg.FormatDSN())
	if err != nil {
		t.Fatalf("open TiDB test connection: %v", err)
	}
	rawDB.SetMaxOpenConns(20)
	rawDB.SetMaxIdleConns(20)
	rawDB.SetConnMaxLifetime(5 * time.Minute)
	if err := rawDB.Ping(); err != nil {
		_ = rawDB.Close()
		t.Fatalf("ping TiDB test connection: %v", err)
	}
	return database.NewConnectionFromDB(rawDB)
}

func setDatabaseEnvFromConfig(t *testing.T, cfg *mysql.Config) {
	t.Helper()
	host, port, err := net.SplitHostPort(cfg.Addr)
	if err != nil {
		t.Fatalf("split TiDB address %q: %v", cfg.Addr, err)
	}
	t.Setenv("TIDB_HOST", host)
	t.Setenv("TIDB_PORT", port)
	t.Setenv("TIDB_USER", cfg.User)
	t.Setenv("TIDB_PASSWORD", cfg.Passwd)
	t.Setenv("TIDB_DATABASE", cfg.DBName)
}

func assertPackOwnedRecordMutationProjection(t *testing.T, db *sql.DB, objectAPIName, packName, wantMessage string) {
	t.Helper()
	var rawAccessPolicy, rawPackName, rawPackValue sql.NullString
	if err := db.QueryRow(
		"SELECT `"+constants.FieldSysObject_AccessPolicy+"`, `"+
			constants.FieldSysObject_AccessPolicyRecordMutationPackName+"`, `"+
			constants.FieldSysObject_AccessPolicyRecordMutationPackValue+"` FROM `"+
			constants.TableObject+"` WHERE `"+
			constants.FieldSysObject_APIName+"` = ? AND COALESCE(`"+
			constants.FieldIsDeleted+"`, 0) = 0 LIMIT 1",
		objectAPIName,
	).Scan(&rawAccessPolicy, &rawPackName, &rawPackValue); err != nil {
		t.Fatalf("query %s AccessPolicy sidecar projection: %v", objectAPIName, err)
	}
	if !rawAccessPolicy.Valid || strings.TrimSpace(rawAccessPolicy.String) == "" || strings.TrimSpace(rawAccessPolicy.String) == "null" {
		t.Fatalf("%s AccessPolicy = %#v, want live recordMutation projection", objectAPIName, rawAccessPolicy)
	}
	var policy models.ObjectAccessPolicy
	if err := json.Unmarshal([]byte(rawAccessPolicy.String), &policy); err != nil {
		t.Fatalf("%s AccessPolicy is not valid JSON after ApplyMetadata: %v; raw=%s", objectAPIName, err, rawAccessPolicy.String)
	}
	if policy.RecordMutation == nil || len(policy.RecordMutation.Deny) == 0 {
		t.Fatalf("%s AccessPolicy.recordMutation missing after ApplyMetadata; raw=%s", objectAPIName, rawAccessPolicy.String)
	}
	if got := policy.RecordMutation.Deny[0].Message; got != "closed" {
		t.Fatalf("%s AccessPolicy.recordMutation message = %q, want closed", objectAPIName, got)
	}
	if !rawPackName.Valid || rawPackName.String != packName {
		t.Fatalf("%s AccessPolicyRecordMutationPackName = %#v, want %s", objectAPIName, rawPackName, packName)
	}
	if !rawPackValue.Valid || strings.TrimSpace(rawPackValue.String) == "" || strings.TrimSpace(rawPackValue.String) == "null" {
		t.Fatalf("%s AccessPolicyRecordMutationPackValue = %#v, want sidecar JSON", objectAPIName, rawPackValue)
	}
	var sidecar models.RecordMutationAccessPolicy
	if err := json.Unmarshal([]byte(rawPackValue.String), &sidecar); err != nil {
		t.Fatalf("%s AccessPolicyRecordMutationPackValue is not valid JSON after ApplyMetadata: %v; raw=%s", objectAPIName, err, rawPackValue.String)
	}
	if len(sidecar.Deny) == 0 || sidecar.Deny[0].Message != wantMessage {
		t.Fatalf("%s AccessPolicyRecordMutationPackValue deny = %#v, want first message %q", objectAPIName, sidecar.Deny, wantMessage)
	}
}

func assertNoRows(t *testing.T, db *sql.DB, label, query string, args ...any) {
	t.Helper()
	if count := queryCount(t, db, query, args...); count != 0 {
		t.Fatalf("%s count = %d, want 0", label, count)
	}
}

func assertSomeRows(t *testing.T, db *sql.DB, label, query string, args ...any) {
	t.Helper()
	if count := queryCount(t, db, query, args...); count == 0 {
		t.Fatalf("%s count = 0, want > 0", label)
	}
}

func assertInstalledSourceBackedCRMPackMetadata(t *testing.T, db *sql.DB) {
	t.Helper()
	var desired, applied, algorithm, packVersion, manifestFormatVersion, platformCompatibility, sourceKind, sourceURI sql.NullString
	if err := db.QueryRow(`
		SELECT DesiredPayloadHash, AppliedPayloadHash, PayloadHashAlgorithm, PackVersion, ManifestFormatVersion, PlatformCompatibility, SourceKind, SourceURI
		FROM _System_InstalledPack
		WHERE Name = 'salesforce-crm-standard' AND COALESCE(IsDeleted, 0) = 0
	`).Scan(&desired, &applied, &algorithm, &packVersion, &manifestFormatVersion, &platformCompatibility, &sourceKind, &sourceURI); err != nil {
		t.Fatalf("query installed CRM pack hash metadata: %v", err)
	}
	pack, err := packs.ResolveInstalledSourceBackedPack(
		"salesforce-crm-standard",
		packs.AppPack,
		string(packs.PackSourceKindOfficialRepo),
		"salesforce-crm-standard",
	)
	if err != nil {
		t.Fatalf("resolve source-backed CRM pack: %v", err)
	}
	wantHash, err := packs.PackPayloadHash(pack)
	if err != nil {
		t.Fatalf("compute CRM pack payload hash: %v", err)
	}
	for label, got := range map[string]sql.NullString{
		"DesiredPayloadHash": desired,
		"AppliedPayloadHash": applied,
	} {
		if !got.Valid || got.String != wantHash {
			t.Fatalf("%s = %q valid=%v, want %q", label, got.String, got.Valid, wantHash)
		}
	}
	wantMetadata := packs.PackHashMetadataForPack(pack)
	if !algorithm.Valid || algorithm.String != wantMetadata.PayloadHashAlgorithm {
		t.Fatalf("PayloadHashAlgorithm = %q valid=%v, want %q", algorithm.String, algorithm.Valid, wantMetadata.PayloadHashAlgorithm)
	}
	if !packVersion.Valid || packVersion.String != wantMetadata.PackVersion {
		t.Fatalf("PackVersion = %q valid=%v, want %q", packVersion.String, packVersion.Valid, wantMetadata.PackVersion)
	}
	if !manifestFormatVersion.Valid || manifestFormatVersion.String != wantMetadata.ManifestFormatVersion {
		t.Fatalf("ManifestFormatVersion = %q valid=%v, want %q", manifestFormatVersion.String, manifestFormatVersion.Valid, wantMetadata.ManifestFormatVersion)
	}
	if !platformCompatibility.Valid || platformCompatibility.String != wantMetadata.PlatformCompatibility {
		t.Fatalf("PlatformCompatibility = %q valid=%v, want %q", platformCompatibility.String, platformCompatibility.Valid, wantMetadata.PlatformCompatibility)
	}
	if !sourceKind.Valid || sourceKind.String != wantMetadata.SourceKind {
		t.Fatalf("SourceKind = %q valid=%v, want %q", sourceKind.String, sourceKind.Valid, wantMetadata.SourceKind)
	}
	if !sourceURI.Valid || sourceURI.String != wantMetadata.SourceURI {
		t.Fatalf("SourceURI = %q valid=%v, want %q", sourceURI.String, sourceURI.Valid, wantMetadata.SourceURI)
	}
}

func queryCount(t *testing.T, db *sql.DB, query string, args ...any) int {
	t.Helper()
	var count int
	if err := db.QueryRow(query, args...).Scan(&count); err != nil {
		t.Fatalf("query count failed: %v\nquery: %s\nargs: %#v", err, query, args)
	}
	return count
}

func repoRootFromControlplaneTest(t *testing.T) string {
	t.Helper()
	_, file, _, ok := runtime.Caller(0)
	if !ok {
		t.Fatal("runtime.Caller failed")
	}
	return filepath.Clean(filepath.Join(filepath.Dir(file), "..", "..", ".."))
}

func officialPackRootFromControlplaneTest(t *testing.T) string {
	t.Helper()
	if root := strings.TrimSpace(os.Getenv(packs.OfficialAppPacksRootEnvVar)); root != "" {
		return root
	}
	repoRoot := repoRootFromControlplaneTest(t)
	sibling := filepath.Join(filepath.Dir(repoRoot), "nexuscrm-app-packs")
	if info, err := os.Stat(sibling); err == nil && info.IsDir() {
		return sibling
	}
	t.Fatalf("official app packs root is required: set %s or provide sibling checkout %s", packs.OfficialAppPacksRootEnvVar, sibling)
	return ""
}

func copyIntegrationTestDirectory(t *testing.T, src, dst string) {
	t.Helper()
	if err := filepath.WalkDir(src, func(path string, d os.DirEntry, err error) error {
		if err != nil {
			return err
		}
		rel, err := filepath.Rel(src, path)
		if err != nil {
			return err
		}
		target := filepath.Join(dst, rel)
		if d.IsDir() {
			return os.MkdirAll(target, 0o755)
		}
		data, err := os.ReadFile(path)
		if err != nil {
			return err
		}
		return os.WriteFile(target, data, 0o644)
	}); err != nil {
		t.Fatalf("copy %s to %s: %v", src, dst, err)
	}
}

// TestRunL0RepairDropsLegacyGroupMemberUserFK guards Ian's gate-merge finding
// on PR #479: the GroupMember.UserOrGroupId → User(Id) FK migration must run
// in the init-l0 lifecycle, not just in broad RunRepair. A warm-upgrade L0
// database arrives with the old physical FK still in place; init-l0 must drop
// it so polymorphic CRUD, import, and repair paths can populate Group-target
// GroupMember rows.
//
// The test seeds a warm-upgrade scenario (existing GroupMember table with the
// old `user(Id)` FK), runs InitL0 end-to-end, then verifies the FK is gone,
// the migration stamp landed, and no app-pack metadata was installed.
func TestRunL0RepairDropsLegacyGroupMemberUserFK(t *testing.T) {
	ctx := context.Background()
	cfg, cleanup := newTemporaryIntegrationDatabase(t)
	defer cleanup()
	setDatabaseEnvFromConfig(t, cfg)

	// Seed the pre-migration physical schema: GroupMember with the old
	// `UserOrGroupId → user(Id)` FK in place, plus a minimal `user` table
	// to satisfy the FK target. Mimics a warm-upgrade L0 DB that predates
	// the migration. _System_Migration is created later by bootstrap; the
	// stamp row is inserted by DropGroupMemberUserFK during RunL0Repair.
	preSeedConn := openIntegrationConnection(t, cfg)
	if _, err := preSeedConn.DB().ExecContext(ctx, `CREATE TABLE user (Id VARCHAR(255) PRIMARY KEY)`); err != nil {
		t.Fatalf("seed user table: %v", err)
	}
	if _, err := preSeedConn.DB().ExecContext(ctx, `CREATE TABLE GroupMember (
		Id VARCHAR(255) PRIMARY KEY,
		GroupId VARCHAR(255) NOT NULL,
		UserOrGroupId VARCHAR(255) NOT NULL,
		CONSTRAINT fk_groupmember_userid FOREIGN KEY (UserOrGroupId) REFERENCES user(Id)
	)`); err != nil {
		t.Fatalf("seed GroupMember table with legacy FK: %v", err)
	}
	// Sanity: the FK actually exists pre-migration.
	var preCount int
	if err := preSeedConn.DB().QueryRowContext(ctx, `
		SELECT COUNT(*)
		FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
		WHERE TABLE_SCHEMA = DATABASE()
		  AND TABLE_NAME = 'GroupMember'
		  AND COLUMN_NAME = 'UserOrGroupId'
		  AND REFERENCED_TABLE_NAME = 'user'`).Scan(&preCount); err != nil {
		t.Fatalf("pre-migration FK probe: %v", err)
	}
	if preCount == 0 {
		t.Fatal("expected legacy GroupMember.UserOrGroupId → user(Id) FK to be present before InitL0; test seed did not land")
	}
	preSeedConn.Close()

	// Run the lifecycle: InitL0 invokes RunL0Repair internally, which now
	// runs DropGroupMemberUserFK before CleanupExpiredUploadOperations.
	conn := openIntegrationConnection(t, cfg)
	defer conn.Close()
	if err := InitL0(ctx, conn); err != nil {
		t.Fatalf("InitL0 with legacy GroupMember FK present: %v", err)
	}

	// Verify the FK is gone.
	checkConn := openIntegrationConnection(t, cfg)
	defer checkConn.Close()
	var postCount int
	if err := checkConn.DB().QueryRowContext(ctx, `
		SELECT COUNT(*)
		FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
		WHERE TABLE_SCHEMA = DATABASE()
		  AND TABLE_NAME = 'GroupMember'
		  AND COLUMN_NAME = 'UserOrGroupId'
		  AND REFERENCED_TABLE_NAME IS NOT NULL`).Scan(&postCount); err != nil {
		t.Fatalf("post-migration FK probe: %v", err)
	}
	if postCount != 0 {
		t.Fatalf("after InitL0, GroupMember.UserOrGroupId still has %d FK constraint(s); expected 0", postCount)
	}

	// Verify the migration stamp landed (idempotence on re-run).
	var stampCount int
	if err := checkConn.DB().QueryRowContext(ctx, `
		SELECT COUNT(*) FROM _System_Migration WHERE Id = ?`,
		"20260510_drop_groupmember_user_fk").Scan(&stampCount); err != nil {
		t.Fatalf("migration stamp probe: %v", err)
	}
	if stampCount != 1 {
		t.Fatalf("expected exactly 1 _System_Migration stamp row, got %d", stampCount)
	}

	// Clean-L0 contract: no app-pack metadata was installed by init-l0.
	// The FK migration is platform-substrate repair, not app provisioning.
	assertNoRows(t, checkConn.DB(), "installed app packs after init-l0",
		"SELECT COUNT(*) FROM _System_InstalledPack WHERE Category = ? AND COALESCE(IsDeleted, 0) = 0",
		string(packs.AppPack))
}
